14 KiB
HANDOVER — Stand 2026-07-04 (Schraffur/Linien-Epic + Folgethemen)
Übergabe an eine frische Instanz. Alles unten Gelistete ist committet, sofern nicht anders vermerkt. Ältere Handover-Stände (< 2026-07-04) siehe git-Historie. Zuerst CONVENTIONS.md lesen.
NACHTRAG Session 3 (2026-07-04 mittags) — Prioritaets-Joins + Schnitt-Sanierung
Prioritäts-Join-Epic (Kern-Direktive, siehe unten „Verschneidungs-Zielmodell"): Joins werden nach Component.joinPriority materialbewusst aufgelöst — konsistent in Grundriss, Schnitt UND 3D. Gelandet:
e1698b7Wand-T-Verbindungen (T-Knoten 3 Enden + Mittelspannen-Stoss) incomputeJoins; generatePlan wendet die Cuts unverändert an.0ddf99dRust-Parität (geometry-Crate).d74dda1Sample: Querwand W9 (neuer WandtypiwInnenputz/Backstein/Innenputz) als T-Demo, Tür/Fenster beiseite gerückt.fc0a76fPhase 1 materialbewusst:resolveJoinPriority(merge/coexist/trim),WallCuts.layerCuts(per-Schicht-Cuts + L-Seitenlinien), Backstein-Kern verschmilzt, Putz bricht als L.bf97d50Phase 1b: Kern sticht nur durch den Nah-Putz und stoppt an der Rückgrat-Nahfläche (mergeCut beioffT + sign*(tT/2 − nearPlaster)), KEINE Achs-Überlappung; Naht entfällt über stroke:none/noStrokeEdges/Zeichenreihenfolge. Rust jeweils synchron.e4b8df6Phase 3 (3D): Wand wird an der Deckenunterkante getrimmt, wenn eine Decke höherer joinPriority bündig aufliegt (trimWallTopForCeilingsin toWalls3d, BBox-Footprint-Näherung dokumentiert) → kein Z-Fighting Wand/Decke.
Schnitt-Sanierung (Regressionen aus der 3D-Schicht-Umstellung de7a26b behoben):
da39f0cper-Schicht-3D-Bänder nutzten die RECHTE Normale stattleftNormal→ Schichten in 3D+Schnitt gespiegelt (Backstein aussen). Eine Zeile inpushSegmentgedreht.6c47355Schnitt bekam durch die per-Schicht-Boxen segments×layers Cut-Polygone → Owner-Index-Versatz → einheitliches Diagonal-Muster. Fix:projectToModel3d(project, { layeredWalls:false })fürcomputeSection(Voll-Box pro Wand); 3D-Viewer behält Default true.5ed3549Alle Schraffuren monochrom: HATCH_INK#0f0f0f/ HATCH_PAPER#f0f0f0(resolveHatch erzwingt Ink; Albedo-Fallback im Schnitt entfernt). Print-Mono separat/unangetastet.c36a7e0Wandrelative Muster drehen im Schnitt mit der Wand (SECTION_WALL_AXIS_ANGLE_DEG=90an resolveHatch) → Dämmung horizontal quer zur Dicke.
Sonstiges: 1855717 Renderer-Umschalter aus der Statusleiste in die Settings, Default Nordstern (WebGL2 nur explizit/Fallback). 32497bc TopBar: Zoom-Cluster von Grid auf Flex (Phantom-Zeile +6px weg, jetzt bündig mit Zweizeilern), Bar 56→60px.
IN FLIGHT bei Checkpoint: (1) 3D-Live-Schnitt (Opus-Agent): Clip-Plane-Uniform + discard in MESH/GRID_WGSL, section_fill.rs Cut-Caps aus cut_section mit prozeduraler 45°-Schraffur (CAP_WGSL), set_section_plane (web.rs cached walls/slabs), Viewport-Toggle; WASM-Rebuild nötig. (2) Joins Phase 2 (Opus-Agent): Merge-Regel (gleiche Prio+Komponente) in der Schnitt-Dominanz subtractDominantBands. — git status prüfen, verifizieren, committen.
NÄCHSTER Engine-Slice (Nutzer-Direktive, queued): Öffnungen als echte Boolean-Löcher — Fenster/Türen sind heute Pfeiler/Brüstung/Sturz-Ersatzkörper (keine CSG, Triangulator lochfrei) → sichtbare Segment-Nähte. Ziel: EIN Wandkörper, Löcher via earcut-with-holes + Laibungsflächen; behebt auch die dokumentierte mesh↔cut_section-Öffnungs-Inkonsistenz. Läuft im selben Crate wie der 3D-Schnitt → erst danach starten.
Verschneidungs-Zielmodell (Nutzer, verbindlich): gleiche Komponente+Priorität = verschmelzen (Naht weg); schwächere Schicht bricht auf und schliesst als L; höhere Priorität schneidet bauteilübergreifend (Decke>Wand); Joins IMMER in allen drei Sichten identisch. Schraffur-Modell: Schnitt-Schraffur vs. Oberflächen-Schraffur, aktuell ALLE monochrom fg #0f0f0f auf bg #f0f0f0.
NACHTRAG Session 2 (2026-07-04 nachmittags/abends) — TopBar-Redesign + 3D-Editierbarkeit
TopBar/UI gelandet: DOSSIER-Wortmarke + Ressourcen-Icon links (Rhino-Stil), Massstab/Zoom-Cluster bereinigt (Duplikat weg, Zoom-Aktionen unter Massstab-Dropdown gestapelt, gleiche Breite, Ring bei „am Massstab" statt Flächen-Aufhellung), PDF/DXF raus → Datei-Burger-Menü rechts (Speichern/Öffnen als echter Projekt-JSON-Download/-Upload, Import, Export). Einstellungs-Fenster (SettingsDialog.tsx): Accent-Palette (src/theme/accents.ts), Auswahlrahmen-Farbe (Default Yuyake #CEB188) + Snap-Farbe (vorläufig Sora #5FA1C9 gewählt — „aki"-Rückfrage bleibt offen, per Picker änderbar), Projekt-MüM-Feld (project.referenceElevationMasl, nur gespeichert, Draping folgt). Custom Fenstersteuerung (_/□/X) für Electron (electron-preload.cjs + IPC, WindowControls.tsx, TopBar = Drag-Region). Dark-Theme ist jetzt fester Standard (vorher an OS-prefers-color-scheme gekoppelt → zeigte fälschlich Light; Light bleibt Opt-in via :root[data-theme="light"]). Alle TopBar-Pillen auf dieselbe stets-dunkle Kontextmenü-Fläche vereinheitlicht; Panel-Köpfe flach (kein hellerer Balken) + feste 40px-Höhe. Undo/Redo (historySlice.ts, Ctrl+Z/Y, Coalescing für Drags). 15 gebündelte OFL-Schriften (public/fonts/, src/text/fonts.css) statt Systemfonts. Farbfelder: Hex separat editierbar (ColorHexField.tsx). Text-Zeilenhöhe-Regler ersetzt „+ Text" (Text wird eigenes Werkzeug, AUDIT B1). Linienstil im Attribute-Panel editierbar. 2D-Zoom-Grenzen stark erweitert (20000×/0.005×).
3D-Editierbarkeit gelandet (Nordstern/render3d, NICHT three.js — Free=three.js-Viewer, Premium=editierbarer Nordstern, siehe Memory):
- R1
85a721fBoden-Referenzraster auf y=baseElevation des aktiven Geschosses, ein-/ausschaltbar (Overlay-Button,viewSlice.grid3dVisible; eigene LineList-Pipelinegrid.rs,set_ground_grid). Kamera: Links=Orbit, Mitte/Rechts=Pan (vorher Pan nur auf Shift+Mitte versteckt), Rad=Zoom-to-Cursor. - R2
6ef57b6View-Styles wireframe + hidden-line + Fill-Light (set_render_style,edges.rs= Feature-Edge-Extraktion mit Crease-Dedup, Hidden-Line via Depth-Bias-Flächen + Kanten obenauf).textured→ vorerst wie shaded (keine Textur-Pipeline). - R3
ac0d9efKlick-Auswahl im 3D (raycast3d.ts: OBB-Wand-/Prisma-Slab-Schnitt → Store-Selektion → Attribute+Objekt-Info-Panel).toWalls3d.pickGeometry()mit wallId/ceilingId. - R4
fabf97aAuswahl-Highlight: orange Outline, immer sichtbar (No-Depth-Linien-Pipelineset_highlight_lines,selectionHighlightLines()). - R5
02bd261Materialfarben im 3D: Wände/Decken in Farbe der dicksten Schicht statt Einheitsgrau. - weiter:
8bc472a2D z-Anordnen (Kontextmenü nach vorn/hinten,reorderDrawings);de7a26bper-Schicht Wand-Bänder (jede Materiallage als eigener farbiger Quader, wallId bleibt → Pick/Highlight ganze Wand);e42c336AUDIT A6 Bauteil-Schedule-CSV (Datei-Menü,exportSchedule.ts);7dd324dGlasscheiben in Fenstern (A5-Teil, RMesh in jeder Fensteröffnung). - Alle Runden visuell im Browser verifiziert (Playwright + WebGPU-Flags:
--enable-unsafe-webgpu --enable-features=Vulkan --use-gl=angle --use-angle=vulkan --no-sandbox, URL?engine=wasm, Iso-View klicken).
3D-REST (engine-schwer, bewusst NICHT blind gemacht — mit Nutzer angehen):
- Schnitt-Schraffuren (2D-Poché/Schraffur auf 3D-Schnittflächen;
section.rs, ~66KB, komplex). - Textur-/PBR-Pipeline (Sampler/Bindings/UV in wgpu; dann
textured-Style +Component.texture3d/Material echt rendern). - Wand-Schicht-Bänder in 3D (Option B aus R5: jede Materiallage als eigener extrudierter Teilquader statt nur repräsentativer Farbe — pro-Schicht-Farben liegen in
RWall.layersschon vor). - Ortho-Ray-Picking (aktuell perspektivischer Pick-Strahl; für Front/Top/Side-Presets vor der ersten Navigation leicht ungenau).
- 3D-Griffe/Editieren (Wand-Endpunkte im 3D ziehen etc. — bisher nur Auswahl + Panel-Edit).
WASM-Workflow: src/engine/pkg3d/ ist gitignore't → nach Rust-Änderung npm run build:engine3d, nur die .rs committen. DOSSIER-Audit-Details jetzt in docs/design/dossier-feature-audit.md (A1–A6/B1–B4/C/D/E) + ROADMAP.md §11.
Konventionen (ZWINGEND — zuerst lesen)
- Keine KI-/Assistant-Spuren im Repo: vor jedem Commit
git diff | grep -iE "claude|anthropic|opus|sonnet|generated with|co-authored|gpt|openai|assistant"→ muss leer sein. Commits deutsch, sachlich, KEINE Co-Authored-By-Trailer. - NICHT ANFASSEN (fremde WIP):
.gitignore,public/assets/materials/manifest.json,src/materials/library.ts,scripts/fetch-materials.mjs— bleiben dauerhaft dirty, nie stagen. - Agenten-Regeln: Subagenten default Sonnet (Nutzer-Wunsch 2026-07-04); Opus nur bei intricater Geometrie. Agenten dürfen NICHT weiterdelegieren (Agent/Task-Tool verbieten — sonst Spawn-Schleifen), NICHT committen, keine Memory. Hauptinstanz verifiziert (
tsc --noEmitclean +vitest run) + trace-scan, committet dann selbst, staged nur die Task-Dateien (Kollisionen: parallelen Agenten disjunkte Datei-Lanes geben; i18n exklusiv einem Agenten). - Budget: Session-Ende bei 98% — Sparflamme.
- Engine = „Nordstern" (render2d/render3d/WASM). Referenz DOSSIER-Rhino:
https://git.openbureau.ch/karim/dossier(Alias git.kgva.ch), geklont/tmp/dossier-ref.
In dieser Session gelandet (Auswahl Commits)
Schraffur/Linien-Epic komplett: Typmodell (vector/image Hatch, dash/zigzag/custom Line, Component Vordergrund/Hintergrund), ResourceManager Master-Detail (Schraffuren/Linien/Wandstile/Deckenstile, 9695748), Rendering neuer Typen (Bild-<pattern>, random modellraum-verankert, Zickzack, Custom-Motiv-Editor src/ui/MotifEditor.tsx), modulares Linien-Segment-System (Strich/Punkt/Lücke), Attribut Vordergrund/Hintergrund + By-Layer/By-Object-Quellen (Nach Ebene/Bauteil/eigener Wert für Vordergrund/Hintergrund/Strichstärke/Schraffur, d02781e).
Weiter: Gehrung spitze Winkel (2D+Schnitt+Rust), TopBar/Footer-Reorg, Zoom-% am Massstab, Tool-Shortcuts 1..0, Verschiebe-Dreieck flacher + Snap, Statusleiste „Nordstern", ResourceManager als floating nicht-modales Fenster, swisstopo Gebäude(extrudiert)+Terrain-Mesh in 3D (f22970f), Schnitt-Wandschicht-Orientierung (7569524), Schnitt-Boolean-Dominanz nach joinPriority (23d81be).
IN FLIGHT bei Session-Ende (PRÜFEN!)
- Snap an Wand-Schichttrennlinien (Agent Sonnet): sollte
src/tools/snapping.ts(+ ggf.src/model/geometry.ts+ Test) geändert haben.git statusprüfen — falls dirty:tsc+vitest+trace, committen. Falls nicht gelandet: neu beauftragen (Schicht-Offsetlinien ausaddWallPoche-Logik in generatePlan spiegeln [nur LESEN], als Snap-Targets in snapping.ts einspeisen).
Offener Backlog (Priorität grob absteigend)
- Zu verifizieren/klären:
- Isometrie — „echte" orthographische Isometrie? (nicht perspektivisch; alle Längen gleich dargestellt?) — Status unklar.
- TopBar Detailgrad — zoom% + zoom/scale komplett aus Footer? Details der Reorg prüfen.
- DOSSIER Audit — welche Features konkret übernommen (über AUDIT Punkt 9 hinaus)?
- Ebene-Schraffur editierbar: „Nach Ebene"-Schraffur ist in der Resolve fertig, aber
LayerCategory.hatchist im Kategorie-Dialog (App.tsx ~3350, editiert nur name/color/lw) noch nicht editierbar. Kleine Folge-Arbeit. - GEO-BLOCK (gemeinsame Dateien io/geoContext/swissTopo/terrain/ContextImportDialog/Viewport3D/siteSlice):
- Reale Höhen + Projekt-MüM: Gebäude/Terrain sind auf z=0 (Terrain zentriert, Gebäude-Basis z=0). Nutzer will Projekt-Setting für MüM (EG-Referenzhöhe), Terrain georeferenziert bei realem z relativ dazu, Gebäude auf Terrain drapiert.
- Luftbild/SWISSIMAGE-Orthofoto als Textur aufs Terrain-Mesh.
- Importierte Geo-Elemente auf aktives Geschoss (
viewSlice.activeLevelId) + eine Gelände-Ebene; Kontext liegt inproject.context(siteSlice) ohne floorId/categoryCode. - Nordstern-Geo-Rendering: importierte Meshes (heute nur three.js
importedMesh/terrainMeshin Viewport3D) auch inprojectToModel3deinspeisen — Nordstern zeigt sie sonst nicht. - 3D-Mesh-DXF/DWG-Import für präzise Gebäude (heute DXF nur 2D); Building-Draping; höhere DTM-Auflösung.
- ResourceManager Bauteile-Tab auf Master-Detail (wie Wandstile) — BEVOR Bauteil-Logik angefasst wird.
- Einstellungs-Fenster: Auswahlrahmen Default Yuyake #CEB188; Snap/Endpunkt Default = RÜCKFRAGE „aki" (nicht in Accents: Ajisai/Sakura/Suna/Ichigo/Yuyake/Sora/Kusa/Kori/Amagumo/Yuki); freier Picker + Accents-Presets; verdrahten in PlanView (Selektionsrahmen + Snap-Marker). Dazu Projekt-MüM-Feld.
- Bildschraffur: ambientCG/CGI-Colorfiles als Quelle (Material-Lib WIP — erst nach Freigabe); Bild-Filter Sättigung/Helligkeit/Kontrast/SW (
image.filters). - E2b Schraffur-Kachel-Motiv (MotifEditor für HatchStyle-Tile wiederverwenden).
- Linienstile aufräumen (Weight-only-Stile → „Volllinie", lineStyleId-Referenzen remappen).
- 2D-Plan z-Anordnen (Kombo-Schraffuren); Bild-Schraffur GL/DXF (heute Fallback).
- AUDIT (DOSSIER-Studie): A1 Override-Regel-Engine; A2→A3 View-Snapshots → Print-Layout-Blätter (PDF pro Blatt); A5 reichere Öffnungen; B1 Text-Werkzeug (+ Kreis-Tool → Shortcuts 1&3); A4 Tragwerk; B2 Object-Info numerisch; A6 Bauteil-Schedule-CSV. Belege in
/tmp/dossier-ref/rhino/*.py. - Elemente im Schnitt anwählbar; render3d 2D-Schraffur auf 3D-Flächen.
Offene Rückfragen
- „aki" = welcher Accent für Snap/Endpunkt-Farbe.
- Floating-ResourceManager „headless" = ganz ohne Titelleiste? (aktuell MIT).
- Geo-Block: Projekt-MüM zuerst oder Nordstern-Geo-Rendering.
Verifikation
npx tsc --noEmit + npx vitest run (zuletzt 152 grün) + trace-scan vor jedem Commit.