Files
DOSSIER/csharp/DOSSIER/build.sh
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

145 lines
5.4 KiB
Bash
Executable File

#!/bin/bash
# DOSSIER — Build-Skript
# Baut das C#-Plugin (.rhp) das beim Rhino-Start die Python-Module
# bootstrappt (Panels, Aliases, Welcome) und Native-Commands registriert
# (dWall, dDoor, dStair, dSlab, ...).
#
# === Voraussetzungen ===
# 1. .NET 7 SDK installiert. Auf Mac:
# brew install dotnet@7
# Oder direkt von Microsoft:
# https://dotnet.microsoft.com/download/dotnet/7.0
#
# 2. RhinoCommon NuGet-Package wird beim ersten Build automatisch geladen.
#
# === Build ===
# ./build.sh — Release-Build, output in bin/Release/net7.0/
# ./build.sh debug — Debug-Build mit Symbols
# ./build.sh clean — bin/obj loeschen
# ./build.sh install — Build + ins Rhino Plug-In-Verzeichnis kopieren
#
# === Installation in Rhino (einmalig, auf Mac) ===
# WICHTIG: Mac Rhino 8 unterstuetzt KEIN Drag-Drop fuer .rhp-Plugins
# (der Drag landet im Datei-Oeffnen-Handler, nicht im Plugin-Loader).
#
# Richtiger Weg:
# 1. Rhino 8 oeffnen
# 2. Command-Prompt: PluginManager
# (oder Tools-Menue → Options → Plug-Ins)
# 3. Button "Install..." → browse zur .rhp
# bin/Release/net7.0/DOSSIER.rhp
# 4. Open → Rhino registriert das Plugin
# 5. Rhino restart — DOSSIER bootstrappt (Panels/Aliases/Welcome) +
# Commands dWall/dDoor/... sind verfuegbar
#
# Pfad bleibt in Rhinos settings-XML registriert. Bei spaeteren Builds
# einfach in den gleichen Output-Pfad bauen — Rhino laedt den neuen Stand
# automatisch beim naechsten Start.
set -e
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"
# --- Param-Parsing ---
MODE="${1:-release}"
case "$MODE" in
debug|Debug)
CONFIG="Debug"
;;
release|Release|"")
CONFIG="Release"
;;
clean)
echo "==> Loesche bin/ + obj/"
rm -rf bin obj
exit 0
;;
install)
CONFIG="Release"
DO_INSTALL=1
;;
*)
echo "Usage: $0 [release|debug|clean|install]"
exit 1
;;
esac
# --- dotnet-Check ---
if ! command -v dotnet &>/dev/null; then
echo "FEHLER: dotnet nicht installiert."
echo "Install: brew install dotnet@7"
echo " oder https://dotnet.microsoft.com/download/dotnet/7.0"
exit 1
fi
# --- Build ---
echo "==> Build: $CONFIG"
dotnet build -c "$CONFIG"
OUTPUT="$SCRIPT_DIR/bin/$CONFIG/net7.0/DOSSIER.rhp"
if [ ! -f "$OUTPUT" ]; then
echo "FEHLER: Build-Output nicht gefunden: $OUTPUT"
exit 1
fi
echo "==> .rhp Output: $OUTPUT"
# --- Yak-Paket bauen ---
# yak (Rhinos Package Manager) ist im Rhino-App-Bundle dabei. Wir packen .rhp +
# manifest.yml in ein .yak-Archiv das der Launcher bundlet + via "yak install"
# in den User-Plugin-Pfad legt. Dort wird's von Rhino aus dem trusted Yak-
# Verzeichnis geladen.
YAK="/Applications/Rhino 8.app/Contents/Resources/bin/yak"
DIST_DIR="$SCRIPT_DIR/dist"
mkdir -p "$DIST_DIR"
if [ -x "$YAK" ]; then
BUILD_DIR="$SCRIPT_DIR/bin/$CONFIG/net7.0"
pushd "$BUILD_DIR" >/dev/null
# yak spec failed mit Exit-1 wenn manifest.yml schon existiert — kein Fehler
"$YAK" spec --input DOSSIER.rhp >/dev/null 2>&1 || true
rm -f dossier-*.yak
YAK_OUT=$("$YAK" build 2>&1 | grep -oE '/.*\.yak$' | head -1)
popd >/dev/null
if [ -n "$YAK_OUT" ] && [ -f "$YAK_OUT" ]; then
# Versionierter Filename rein damit Launcher die Version vom Filename ablesen kann
YAK_NAME=$(basename "$YAK_OUT")
# Alte .yak im dist/ wegraeumen
rm -f "$DIST_DIR"/dossier-*.yak
cp -v "$YAK_OUT" "$DIST_DIR/$YAK_NAME"
# Stabilen Symlink fuer Launcher (immer 'dossier.yak') zusaetzlich
ln -sf "$YAK_NAME" "$DIST_DIR/dossier.yak"
# Version separat als Textdatei (extrahiert aus manifest.yml im .yak)
VERSION=$(grep '^version:' "$BUILD_DIR/manifest.yml" | awk '{print $2}')
echo -n "$VERSION" > "$DIST_DIR/dossier-version.txt"
echo "==> .yak Output: $DIST_DIR/$YAK_NAME (version=$VERSION)"
else
echo "WARN: yak build hat keinen Output produziert"
fi
else
echo "WARN: yak CLI nicht gefunden ($YAK) — kein .yak-Paket gebaut"
fi
# --- Install: lokales Test-Install via yak ---
# Fuer Dev-Iteration: installiert das frische .yak direkt in den Rhino-User-
# Plugin-Pfad (~/Library/Application Support/McNeel/Rhinoceros/packages/8.0/).
# In Production macht der Launcher das automatisch beim ersten Rhino-Start.
if [ -n "$DO_INSTALL" ]; then
# Alte Manuell-Install-Standorte aufraeumen
OLD_MANUAL="$HOME/Library/Application Support/Dossier/Plugin"
for old in "/Applications/Rhino 8.app/Contents/PlugIns/DOSSIER.rhp" \
"/Applications/Rhino 8.app/Contents/PlugIns/DossierCommands.rhp" \
"$OLD_MANUAL/DOSSIER.rhp"; do
if [ -f "$old" ]; then rm -v "$old"; fi
done
if [ -x "$YAK" ] && [ -f "$DIST_DIR/dossier.yak" ]; then
# yak install nimmt Quelle als Verzeichnis (treats local dir as source server)
"$YAK" install dossier --source "$DIST_DIR" 2>&1 | sed 's/^/ /'
echo "==> Yak-Install fertig. Rhino restart noetig (Plugin laedt on-demand beim ersten Command)."
echo "==> StartupCommands-XML-Eintrag wird vom Launcher gesetzt — fuer Dev manuell pruefen:"
echo " Options → General → Run these commands every time a model is opened"
echo " soll enthalten: _-RunPythonScript \"$SCRIPT_DIR/../../rhino/startup.py\""
fi
fi
echo "OK."