Text-Erstellung mit Floating-Input-Box (Variante B)

Neuer Workflow: Klick "+ Text" in Topbar → Punkt im Viewport picken →
Floating Eto-Dialog erscheint neben dem Mauszeiger → User tippt → Enter
fuegt TextEntity mit Topbar-Settings ein. Esc bricht ab.

Backend (rhino/text_create.py):
- load_settings/save_settings — persistiert font/size/bold/italic in
  doc.Strings["dossier_text_settings"] (JSON)
- available_fonts() — System-Font-Namen via
  Rhino.DocObjects.Font.AvailableFontFaceNames
- _floating_input() — Eto.Dialog mit TextBox, ShowModal mit Rhino-
  MainWindow als Parent, positioniert bei Mouse.Position
- create_text() — RhinoGet.GetPoint → _floating_input → TextEntity
  mit Font/Size/Bold/Italic erstellen + AddText
- _apply_font() mit 2 Fallback-Pfaden (FontTable.FindOrCreate +
  Font.FromQuartetProperties) fuer RhinoCommon-Kompatibilitaet

Backend (oberleiste.py):
- CREATE_TEXT handler → text_create.create_text()
- SET_TEXT_SETTINGS handler → text_create.save_settings (merge partial)
- State payload: textSettings (immer) + textFonts (einmalig initial,
  via _fonts_sent Flag — Liste aendert sich nicht zur Laufzeit)

Frontend (OberleisteApp + rhinoBridge):
- createText() + setTextSettings() Bridge-Funktionen
- Text-Block 2x2 Grid analog Massstab:
  R1: Font-Dropdown (BarCombo mit text_fields icon) | Size-Input mit "m" suffix
  R2: B/I-Toggles (segmented pill mit accent-Fill bei active) | "+ Text" Button
- Hover-Logik analog View-Toggle (bg → bg-item-hover, color → accent-light)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 23:52:00 +02:00
parent 817455bbba
commit 2252ffd2f9
4 changed files with 361 additions and 1 deletions
+25
View File
@@ -906,6 +906,22 @@ class OberleisteBridge(panel_base.BaseBridge):
except Exception as ex:
print("[OBERLEISTE] open about:", ex)
# --- Text-Erstellung (Floating-Input) ---------------------------
elif t == "CREATE_TEXT":
try:
import text_create
text_create.create_text()
except Exception as ex:
print("[OBERLEISTE] create text:", ex)
elif t == "SET_TEXT_SETTINGS":
try:
import text_create
text_create.save_settings(
Rhino.RhinoDoc.ActiveDoc, p.get("settings") or {})
except Exception as ex:
print("[OBERLEISTE] text settings:", ex)
self._send_state(force=True)
# --- Masse (Mass-Style) -----------------------------------------
elif t == "SET_MASSE_ACTIVE":
try:
@@ -1152,6 +1168,15 @@ class OberleisteBridge(panel_base.BaseBridge):
except Exception:
info["massePresets"] = []
info["masseActiveId"] = None
# Text-Settings + verfuegbare Fonts (Fonts nur einmal initial)
try:
import text_create
info["textSettings"] = text_create.load_settings(doc)
if not getattr(self, "_fonts_sent", False):
info["textFonts"] = text_create.available_fonts()
self._fonts_sent = True
except Exception:
info["textSettings"] = {}
# Command-Line State
prompt = _get_command_prompt()
info["cmdPrompt"] = prompt