Files
DOSSIER/rhino/aliases/dossier_dispatch.py
T
karim 18d6d98e07 DOSSIER Multi-Phase: C#-Plugin + Yak + Wandstile + UX-Polish
- C#-Plugin "DOSSIER" mit 23 nativen Commands (dWall, dDoor, ..., dSection)
  - Native Command-Namen + Autocomplete + saubere History
  - Idle-Defer + RhinoCode-API → kein _-RunPythonScript-Echo
  - Yak-Paket via build.sh, Install in ~/Library/.../packages/8.0/
- Launcher (Tauri):
  - dossier_init Tauri-Command + Setup-Tab in Settings
  - Yak-Install + StartupCommands-XML + Window-Layout in einem Schritt
  - clean-rhino.sh fuer reproduzierbare Resets
  - check_dossier_initialized triggert Auto-Open-Setup beim ersten Start
- Wand-Architektur:
  - Chain-Logik DEAKTIVIERT → jede Wand baut eigenes Volume (individuell
    anwaehlbar, einzeln loeschbar)
  - Polyline-Wand: jedes Segment = eigene Wand
  - Smart-Split fuer wand_axis/decke/dach/raum/aussparung/traeger
  - Auto-Group axis+volume → kein ChooseOne-Dialog, Delete loescht beides
  - Stale-Mitre-Fix: Joint-Cache wird vor jedem Wand-Regen invalidiert
  - T-Junction-Tolerance auf 1mm (war 1cm, lieferte falsche T-Mitres)
- Wand-Stile:
  - Schema in dossier_project_settings.wand_styles (Material + Prio +
    Default-Dicke + Referenz, oder Layered mit Schichten)
  - dWall-Command Stil-Picker
  - ProjectSettingsDialog: Sidebar-Layout (Pill-Selection) +
    Wandstile-Tab mit Liste/Editor
  - _wand_chain_compat benutzt style_id
  - Prio-Dominanz: hoehere Prio gewinnt Eckverbindung, niedrigere wird
    T-mitered (siehe _resolve_corner_miter)
- Cmd+G fuer Group (Geschoss-Up auf Alias 'gu')
- Welcome + Cheatsheet borderless mit X/Back-Buttons
- BeginCommand-Hook fuer Gestaltung-Panel-Auto-Open
- panel_base: Python.NET-Enum-Fix fuer Material-Render
2026-05-30 12:46:53 +02:00

98 lines
3.0 KiB
Python

#! python3
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: AGPL-3.0-or-later
# Copyright (C) 2026 Karim Gabriele Varano
"""
dossier_dispatch.py
Universal-Wrapper fuer DOSSIER-Bridge-Commands via Rhino-Alias.
Aufruf vom Alias:
_-RunPythonScript "/.../dossier_dispatch.py" <action>
oder via Rhino.Input.RhinoGet — wir lesen den letzten String-Parameter
aus der Command-Line.
Aktionen mappen auf ElementeBridge._cmd_create_* via einer kleinen
Dispatch-Tabelle. Bridge-Referenz wird in sc.sticky vom panel_factory
abgelegt (siehe elemente.py _bridge_factory).
"""
import sys
import scriptcontext as sc
_ACTIONS = {
"wand": ("_cmd_create_wall", ()),
"tuer": ("_cmd_create_oeffnung", ("tuer",)),
"fenster": ("_cmd_create_oeffnung", ("fenster",)),
"decke": ("_cmd_create_decke", ()),
"aussparung":("_cmd_create_aussparung",()),
"dach": ("_cmd_create_dach", ()),
"treppe": ("_cmd_create_treppe", ()),
"stuetze": ("_cmd_create_stuetze", ()),
"traeger": ("_cmd_create_traeger", ()),
"raum": ("_cmd_create_raum", ()),
"stempel": ("_cmd_create_stempel", ()),
"symbol": ("_cmd_create_symbol", ()),
}
_PRETTY = {
"wand": "DOSSIER Wand",
"tuer": "DOSSIER Tuer",
"fenster": "DOSSIER Fenster",
"decke": "DOSSIER Decke",
"aussparung": "DOSSIER Aussparung",
"dach": "DOSSIER Dach",
"treppe": "DOSSIER Treppe",
"stuetze": "DOSSIER Stuetze",
"traeger": "DOSSIER Traeger",
"raum": "DOSSIER Raum",
"stempel": "DOSSIER Stempel",
"symbol": "DOSSIER Symbol",
}
def dispatch(action):
"""Public entry — von per-action Wrapper-Scripts aufgerufen."""
try:
import Rhino
Rhino.RhinoApp.SetCommandPrompt(_PRETTY.get(action, "DOSSIER " + action.capitalize()))
except Exception: pass
bridge = sc.sticky.get("dossier_bridge_elemente")
if bridge is None:
print("[DOSSIER-ALIAS] Elemente-Bridge nicht aktiv (Panel oeffnen)")
return
spec = _ACTIONS.get(action)
if spec is None:
print("[DOSSIER-ALIAS] Unbekannte Aktion:", action)
return
method_name, args = spec
method = getattr(bridge, method_name, None)
if method is None:
print("[DOSSIER-ALIAS] Bridge-Method fehlt:", method_name)
return
try:
method({}, *args)
except Exception as ex:
print("[DOSSIER-ALIAS]", action, "->", method_name, ":", ex)
# Backwards-Compat (alter Name).
_dispatch = dispatch
def _read_action_from_argv():
# sys.argv enthaelt bei _-RunPythonScript "path" arg1 arg2 ... die
# Args nach dem Skript-Pfad. argv[0] = Skript-Pfad.
if len(sys.argv) >= 2:
return str(sys.argv[1]).strip().lower()
return None
if __name__ == "__main__":
a = _read_action_from_argv()
if a:
_dispatch(a)
else:
print("[DOSSIER-ALIAS] Keine Aktion uebergeben. Erwartet:",
", ".join(sorted(_ACTIONS.keys())))