18d6d98e07
- 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
44 lines
1.6 KiB
Python
44 lines
1.6 KiB
Python
#! python3
|
|
# -*- coding: utf-8 -*-
|
|
# Geschoss hoch (zum naechstoberen Eintrag in der Zeichnungsebenen-Liste)
|
|
import json
|
|
import scriptcontext as sc
|
|
import Rhino
|
|
|
|
|
|
def _go(delta):
|
|
doc = Rhino.RhinoDoc.ActiveDoc
|
|
if doc is None:
|
|
print("[GESCHOSS-NAV] kein Doc"); return
|
|
bridge = sc.sticky.get("ebenen_bridge_ref")
|
|
if bridge is None:
|
|
print("[GESCHOSS-NAV] Ebenen-Bridge nicht aktiv (Panel oeffnen)"); return
|
|
try:
|
|
zraw = doc.Strings.GetValue("dossier_zeichnungsebenen") or ""
|
|
zs = json.loads(zraw) if zraw else []
|
|
if not isinstance(zs, list) or not zs:
|
|
print("[GESCHOSS-NAV] keine Zeichnungsebenen"); return
|
|
cur_id = doc.Strings.GetValue("dossier_active_id") or ""
|
|
idx = -1
|
|
for i, z in enumerate(zs):
|
|
if isinstance(z, dict) and z.get("id") == cur_id:
|
|
idx = i; break
|
|
if idx < 0:
|
|
idx = 0 # nichts aktiv → starten oben
|
|
new_idx = max(0, min(len(zs) - 1, idx + delta))
|
|
if new_idx == idx:
|
|
print("[GESCHOSS-NAV] schon am {}".format(
|
|
"obersten" if delta < 0 else "untersten")); return
|
|
target = zs[new_idx]
|
|
if not isinstance(target, dict) or not target.get("id"):
|
|
print("[GESCHOSS-NAV] Zielebene ungueltig"); return
|
|
print("[GESCHOSS-NAV] wechsle zu '{}'".format(target.get("name") or target["id"]))
|
|
bridge._set_active_zeichnungsebene(target)
|
|
except Exception as ex:
|
|
print("[GESCHOSS-NAV]", ex)
|
|
|
|
|
|
# delta=-1 = nach oben (vorheriger Eintrag in der Liste, weil Listen
|
|
# typischerweise oberste Ebene oben sind)
|
|
_go(-1)
|