29 KiB
PENDENZEN — Aufgaben-Queue (Single Source of Truth)
Diese Datei ist die einzige verbindliche Aufgabenliste. HANDOVER.md enthält nur noch Kontext/Konventionen/Environment/Zielmodelle — keinen Backlog mehr.
Arbeitsprotokoll (ZWINGEND)
Bearbeiter:
- Zuerst diese Datei lesen, dann
CONVENTIONS.md+ verlinkte Detailquellen des Items. - Oberstes nicht-blockiertes Item aus 🔧 In Arbeit bzw. sonst ⏭️ Als Nächstes nehmen, fertig machen, verifizieren (
npx tsc --noEmit+npx vitest run+ trace-scan), abhaken, eine Ergebniszeile nach ✅ Erledigt schreiben (mit Commit-Hash, sobald committet). - Rückfrage-Recht: Bei Unklarheit/Design-Entscheid NICHT raten — Item mit
❓markieren, kurze Frage darunter notieren, nächstes freies Item nehmen. Fragen sammeln sich unter ❓ Offene Rückfragen. - Kein Arbeitsschritt endet ohne aktualisierte Liste. Status hier ist immer aktuell, sonst driftet es wieder.
- Bearbeiter committet nicht selbst und delegiert Unteraufgaben nicht weiter.
Planer (mit dem Nutzer, kuratiert):
- Nimmt Nutzer-Feedback, pflegt daraus die Liste (rein/umpriorisieren/aufspalten). Führt selbst keine Queue-Items aus.
- Prüft ❓-Zeilen mit dem Nutzer, wandelt sie in konkrete Items.
⛔ Blocker (zuerst klären)
Toolchain prüfen— ERLEDIGT 2026-07-04 (macOS-Gerät):node/npm/cargo(1.96.0)/wasm-pack(0.15.0) alle vorhanden.npm install+npm approve-scripts esbuild wasm-pack …(npm gated Install-Scripts →allowScripts-Block inpackage.json, ungetrackt gelassen),rustup target add wasm32-unknown-unknown, beide WASM-Engines gebaut, Frontend gebaut,npm run tauri:build→ Mac-App (cad.app+cad_0.1.0_aarch64.dmg, arm64) läuft. Verifikations-Baseline grün:tsc --noEmitsauber,vitest run230/230,cargo test render3d56/56. Kein Blocker mehr für Engine-Slices auf diesem Gerät.
🔧 In Arbeit
- kernel2d-Port nach Rust/WASM (Plan: PORT_PLAN.md, Crate
src-tauri/kernel2d, TS-Referenz bleibtkernel2d.ts, Differential-Harnesssrc/geometry/kernel2d.parity.test.ts). Fortschritt:- Phase 1: Crate-Skelett + WASM-Fassade +
build:kernel2d—a78e7c7 - Phase 2: Primitive/Schnitt/Fläche/Kreis + Batch-Fassaden + Diff-Harness (Zufall+Golden) —
9e2c521 - Phase 3: Offset (Miter + 1e-9-Fallback) + Fillet —
c8ea2bf - Phase 4: Trim/Split/Join (
trimPolyline,splitAtIntersections,joinChains— Löwenanteil) —28471c1 - Phase 5:
roomArea-Flächen/ceiling/stair/roomBoundaryportiert (vitest 263, 33 Parity) —a608a59. Offen in Phase 5:opening(mit Aufrufstellen-Änderung) — noch nicht portiert. - Phase 6: TS-Fassade umstellen (alt →
kernel2d.legacy.ts), Suite grün,npm run build+ WASM sauber. Achtung Laufzeit-Entscheid: macht die Live-App synchron WASM-abhängig (Init + Per-Call-Marshalling) — heute nutzt die App KEINE WASM-Geometrie zur Laufzeit; vor Umstellung mit Nutzer klären.- Join-Durchstich verworfen (2026-07-05, gemessen):
computeJoinslive auf WASM zu legen lohnt NICHT. Benchmark TS vs. WASM inkl. JSON-Marshalling (Median ms/Aufruf, 200 Iter): 6 W → TS 0.018/WASM 0.022 · 20 → 0.027/0.043 · 50 → 0.082/0.102 · 120 → 0.331/0.246 · 300 → 1.68/0.67. Crossover erst ~100+ Wände; realistische Plan-/Geschossmengen liegen darunter → TS schneller, und selbst 300 Wände sind mit TS 1,7 ms (nicht wahrnehmbar). Marshalling frisst den Rust-Vorteil, plus dauerhafte Rust↔TS-Paritätspflicht. Fazit: reines TS behalten; WASM für Joins nicht weiterverfolgen. WASM lohnt erst bei echten Rechen-Hotspots (Booleans/Tessellierung).
- Join-Durchstich verworfen (2026-07-05, gemessen):
- Phase 1: Crate-Skelett + WASM-Fassade +
⚠️ Zu prüfen (evtl. schon erledigt / Status unklar)
Snap an Wand-Schichttrennlinien— gelandet339202b(wallLayerBoundarySegmentsinsrc/tools/snapping.ts), verifiziert vorhanden.
⏭️ Als Nächstes
-
Ribbon-UI + modulare Bars (Nutzer-Vision 2026-07-05, bestätigt: Tab-Schema 2D·3D·BIM·Ansichten). Voller Plan + datengetriebene Architektur: docs/design/ribbon-ui-plan.md. Ribbon-Oberleiste mit Tabs ersetzt die Werkzeug-Sidebar; datengetriebene Registry (RibbonItem = tool|command|action) ermöglicht auch eine modulare Custom-Bar (gleiche Items, vom Nutzer gewählt). Attribute bekommen volle Höhe, Objektinfo darunter gemergt; XYZ-Box oben rechts bleibt. Phasen:
(1) Gerüst + 2D/BIM-Tab✅ (9d6e86d),(2) TopBar → Ansichten-Tab mergen✅ (85011cb),(2b) Tabs in die TopBar-Zeile✅ (456ebc8),(2c) OCS-Chrome (kleine Wortmarke + Quick-Access-Icons statt Burger, Zeile 26px)✅ (4e3b074),(2d) Text + Ansichten auf eine Leiste, „Ansichten" als Standard-Tab zuerst✅ (fe22cbf), (3) Sidebar raus + Panel-Merge (Attribute volle Höhe, Objektinfo drunter), (4) modulare Custom-Bar. Offen: 3D-Tab füllen (aktuell leer; ggf. 3D-spezifisch statt Doppelung mit Ansichten), Band-Höhe/Abstände + 26px-Zeile visuell im Tauri abnehmen, Dauer-Zoom-Anzeige (Statusleiste?) klären. ✅ Vorarbeit: Eigenschaften-Grid im OCS-Stil (00733d8), Kreis+Bogen-Werkzeuge (e454eab/bd2b12b). Nächster Schritt: im Tauri visuell prüfen (Band-Höhe, Icons, Aktiv-Highlight), dann Phase 2/3. -
SPIKE — Bild-Texturen in— erledigtrender3d0ca3b1d(verifiziert 2026-07-05):RenderStyle::Texturedreal, prozedurales 256×256-Schachbrett (kein Asset/image-Crate), UVs planar in Metern, Textur-Bind-Group group 1,MESH_TEXTURED_WGSL(gleiche Beleuchtung, Albedo austextureSample),spike3dperTumschaltbar. Alt-Vertexpfad[pos,normal,color]bitgleich (Regressionstest).cargo test58 grün (59 mit--features render, inkl. naga-Test);spike3d-Build sauber; keine neuen Deps, Default-Build unverändert. Auftrag: SPIKE_TEXTUR_render3d.md. Lücken bis „richtig gutes" Texturing → siehe 3D-REST unten.
📋 Backlog (Priorität grob absteigend)
-
Zeichenwerkzeuge ergänzen: Kreis + Bogen.
Drawing2DGeomhatcircleundarcbereits als Typen; per DXF-Import können beide entstehen, aber es gibt kein Toolbar-Werkzeug zum manuellen Zeichnen. Zwei getrennte Aufgaben:Kreis-Toolbar (trivial)— erledigte454eab(2026-07-05):ToolId+"circle", PlatzhaltercircleTool(nicht floorOnly),TOOL_COMMAND+TOOL_ORDER, Kreis-Icon inToolsPanel, i18ntool.circle/tool.circle.hint. tsc + Suite 331 grün. (Kreise rendern seit4ac99d3glatt als<circle>.)Bogen-Werkzeug (mittel)— erledigt (2026-07-05):arcCommandinsrc/commands/cmds/arc.ts(3-Klick: Mittelpunkt → Start/Radius → Endwinkel, CCW; Vorschau viaarcPts/circlePts), registriert inregistry.ts(Aliasa/bogen),"arc"als ToolId + Toolbar-Eintrag (Bogen-Icon) + i18n. tsc + Suite 331 grün. ✅ Center-/Quadrant-Snaps ergänzt (2026-07-05):collectCircles+ Snap-Block insnapping.ts— Mittelpunkt + Quadranten (Kreis: alle 4; Bogen: nur im Spannbereich) unter dercenter-Einstellung, Bogen-Endpunkte unterendpoint; +3 Tests (Suite 334).
-
BAUTEILE aufs Rhino-Niveau heben (Treppe/Fenster/Tür). Vergleich Rhino-Plugin ↔ TS + priorisierte Ansätze: RESEARCH_BAUTEILE_RHINO.md. Gruppe A (2D, sofort, kernel2d): (1) Treppe Aussenlinie/Outline (gerade/L/Wendel), (2) Fenster Brüstungslinie im Plan, (3) Tür Sturzlinien (gestrichelt, SIA), (4) Treppe Referenz links/mitte/rechts, (5) Fenster Flügel-Mittelpfosten, (6) Tür
wandoeffnung-Typ. Gruppe B (2D mittel), Gruppe C (3D, nach Mesh-Pipeline/truck). A-Items 1–3 fallen mit „Schnitt- vs. Ansichts-Darstellung" zusammen (Sturz = Bauteil unter Schnittebene → gestrichelte Überkopf-Projektion). -
DWG/DXF-Import via
acadrust(weiterbauen). ✅ Spike763a558:acadrust0.4 (MPL-2.0, pure Rust) baut zu wasm32 (Cratesrc-tauri/dwgimport, 839 KB), parst DXF aus Byte-Buffer (DxfReader::from_reader+Cursor), headless getestet. Offen: (1) Entity→DOSSIER-Modell-Mapping (LINE/ARC/… → Wand/Öffnung — die eigentliche Domainarbeit, Wochen), (2) Datei-Upload-Glue im Browser (<input type=file>→Uint8Array→parse_dxf_summary_json, trivial), (3) DWG-binär (DwgReader::from_readeranalog, aber R13–R2018-Korrektheit unverifiziert), (4) WASM-Größe (nalgebra Haupttreiber). Klarstellung: der TS-DXF/DWG-Import (parseDxf/parseDwg/dxfToDrawings) + Upload-UI (App.tsx,ImportDialog.tsx) existieren längst und funktionieren — der acadrust-Weg wäre eine Rust-Neuimplementierung des Lesens (nur DWG-Schreiben ist eine echte Lücke). ✅ 2887794 (2026-07-05): Kurven-Abdeckungslücke geschlossen —parseDxfdeckt jetzt ARC/CIRCLE/ELLIPSE (tesselliert zu Konturen, Winkel Radiant, voller Umlauf geschlossen) zusätzlich zu LINE/LWPOLYLINE/POLYLINE/MESH ab; 5 Tests, volle Suite 307 grün. ✅ c481373 (2026-07-05): SPLINE + INSERT ergänzt —parseDxfwertet SPLINE als echte B-Spline (De Boor, Grad/Knoten; Fallback fitPoints/Kontrollpolygon) aus und expandiert INSERT-Block-Referenzen (2D-Transform Scale/Rotation/Basispunkt + MINSERT-Array + verschachtelte Blöcke, Tiefe ≤8) zu transformierten Konturen; Kontur-Dispatch in gemeinsamencollectContoursrefaktoriert; +7 Tests, volle Suite 314 grün. Bekannte Grenzen: rationale SPLINE-Gewichte ignoriert (dxf-parser liefert sie nicht); Block-interne MESH/3DFACE-Entities werden im 2D-Import nicht expandiert. ✅ c29f27e (2026-07-05): HATCH ergänzt — dxf-parser hat KEINEN HATCH-Handler (verwarf HATCH stumm); Lösung viaregisterEntityHandler+ eigenemHatchHandler(sammelt rohe Gruppencodes) + testbarerhatchContours-Auswertung: Randpfade (Polyline-Pfade + Linien-/Bogen-Kanten, Bögen über vorhandene Tessellierung) → geschlossene Konturen mitContour.filled;contoursToDrawingsmacht daraus gefülltepolyline-Drawing2D (fillColor-Default, restylebar). +6 Tests, Suite 320 grün. ✅05bc5aa(2026-07-05): HATCH-Ellipse/Spline-Kanten ergänzt (Kantentyp 3/4 tesselliert; B-Spline-Sampling insampleBSplineextrahiert). ✅4b93ac9(2026-07-05): TEXT/MTEXT —parseDxfliefertDxfImportResult.texts(ImportedText: Position/Höhe-in-Metern/Winkel-Radiant; MTEXT-Formatcodes grob gesäubert);textsToDrawings→{shape:"text"}-Drawing2D; Darstellung neu:addDrawing2Demittiert ein schlankeskind:"drawingText"-Primitiv, PlanView rendert es rein per SVG (modellverankert, Rotation; GPU-Guard so, dass es in ALLEN Renderer-Modi im SVG bleibt);toRenderSceneüberspringt es; ImportDialog zählt/importiert Texte. +5 Tests, Suite 327 grün. Bekannte Grenzen HATCH: Bulges an Polyline-Rändern als Sehne; Insel-Loops = eigene Ringe (keine echten Löcher). Bekannte Grenzen TEXT: importierte Texte (pointerEvents:none) noch nicht per Canvas-Klick selektierbar; MTEXT-Feinformatierung flachgeklopft; Block-interne TEXT/MTEXT nicht expandiert. Text im Tauri visuell abgenommen (Nutzer 2026-07-05) — auch gedreht korrekt. ✅4ac99d3: CIRCLE/ARC als echte glatte Formen —Contour.curveträgt die wahre Kreis-/Bogen-Geometrie (pts bleiben für Kontext/3D);contoursToDrawingsbaut{shape:"circle"|"arc"}; neue PrimitivedrawingCircle(SVG<circle>) +drawingArc(SVG-Bogenpfad),toRenderScenetesselliert sie für den nativen Pfad; +4 Tests, Suite 331. Ellipse bleibt tesselliert (kein Ellipsen-Primitiv). Weiter offen: Entity→Wand-Semantik (die dicke Domainarbeit); DWG-Schreiben (einzige echte Export-Lücke). -
STRATEGIE — „von BIM-Tool zu echtem CAD". Direkt am Quellcode studierte Referenzen (OpenCADStudio/truck/acadrust) + Web-Import-Landkarte → konkrete, priorisierte Ansätze in RESEARCH_CAD_APPROACHES.md. Kern: (1) generisches Entity-Modell + Trait-Dispatch, (2) modeless Command-System (
StepInput-Funnel + Kommandozeile), (3) DWG/DXF-Round-Trip viaacadrust(MPL-2.0, pure Rust, WASM-tauglich), (4) volle Object-Snap-Schicht, (5) 3D-B-Rep später selektiv viatruck(Apache-2.0, Geometrie-Crates WASM-fähig, Booleans/Fillets noch instabil). Derkernel2d-Rust/WASM-Kurs ist damit bestätigt. Mit Nutzer priorisieren, welcher Ansatz zuerst. -
Schnitt- vs. Ansichts-Darstellung nach Schnitthöhe (BIM-Standard). Kern-Idee (Nutzer): jedes Bauteil bekommt getrennt eine Schnittlinie (kräftig, z. B. 0.25–0.35 mm, + Schnitt-Poché) und eine Ansichtslinie (Haarlinie); WELCHE gilt, entscheidet die z-Ausdehnung des Bauteils vs. die Schnitthöhe des Grundrisses (Default ~1 m):
- Bauteil wird von der Schnittebene GESCHNITTEN → Schnittlinie + Schnitt-Poché (heutiges Wandverhalten).
- Bauteil liegt ganz UNTER der Ebene (z. B. 30-cm-Wand bei 1 m Schnitthöhe, Brüstung, Podest) → nur „von oben gesehen" = Ansichtslinie/Haarlinie, KEINE Schnitt-Poché. ← genau der vom Nutzer genannte Fall.
- Bauteil liegt ganz ÜBER der Ebene (Decke/Slab, Unterzug) → Ansicht, üblicherweise gestrichelte Überkopf-Haarlinie.
- Passt konsistent zum bereits existierenden
viewHatchId(Ansichts-Schraffur) vs. Schnitt-Schraffur — die Linienstärke-Dualität (View-/Cut-Weight je Component) ist die natürliche Erweiterung derselben Logik. - Nicht nur cut/view, sondern cut / AUFSICHT / UNTERSICHT (Nutzer): ein Bauteil sieht von oben anders aus als von unten. Der Grundriss (Blick nach unten) zeigt Bauteile UNTER der Ebene in Aufsicht (Oberseite); ein Deckenspiegel/Reflected Ceiling Plan (Blick nach oben) zeigt Bauteile ÜBER der Ebene in Untersicht (Unterseite — z. B. Kassettendecke, Leuchten). Also je Component potenziell drei Darstellungs-Slots (Schnitt / Aufsicht / Untersicht) × {Schraffur + Linienstärke}. Das heutige
viewHatchIdist faktisch EIN View-Slot und vermischt Auf-/Untersicht; sauber wäre die Trennung. WELCHER Slot gilt, entscheidet die Blickrichtung der Sicht (Grundriss ↓ / Deckenspiegel ↑) UND die z-Lage relativ zur Schnittebene. - Verallgemeinert den Decken-Footprint-Clip (
a2f6923): „Decke unter Wand verdeckt" ist ein Spezialfall von „Ansichtsbauteil vs. schneidende/überdeckende Bauteile". - Aufwand: mittel–groß, phasenweise machbar (1: z-Extent-vs-Schnitthöhe-Klassifikation cut/above/below; 2: Ansichtslinie-Weight je Component + Haarlinie/gestrichelt; 3: 30-cm-Wände & Slabs verdrahten). Nicht zu komplex im Konzept — es ist der reguläre CAD/BIM-Weg (ArchiCAD/Vectorworks/Revit). Mit Nutzer Detailgrade/Defaults festlegen.
-
Ebene-Schraffur editierbar— gelandetdcb6ed5: Kategorie-Dialog (App.tsx,editor.hatch-Feld) hat<select>aufcat.hatch+HatchSwatch-Vorschau. Verifiziert vorhanden. -
GEO-BLOCK (gemeinsame Dateien io/geoContext/swissTopo/terrain/ContextImportDialog/Viewport3D/siteSlice):
- Reale Höhen + Projekt-MüM (EG-Referenzhöhe): Terrain georeferenziert bei realem z relativ dazu, Gebäude auf Terrain drapiert (heute alles z=0).
- Luftbild/SWISSIMAGE-Orthofoto als Textur aufs Terrain-Mesh.
- Importierte Geo-Elemente auf aktives Geschoss (
viewSlice.activeLevelId) + Gelände-Ebene. - Nordstern-Geo-Rendering: importierte Meshes (heute nur three.js
importedMesh/terrainMesh) auch inprojectToModel3deinspeisen. - 3D-Mesh-DXF/DWG-Import (heute DXF nur 2D); Building-Draping; höhere DTM-Auflösung.
-
ResourceManager Bauteile-Tab auf Master-Detail— bereits Master-Detail (ComponentsTab/ComponentDetailinsrc/ui/ResourceManager.tsx, Liste linksres-md-list/ Detail rechts). Verifiziert vorhanden. -
Einstellungs-Fenster (Rest): Verdrahtung ist da (
viewSlice.snapColor/marqueeColor→ PlanViewSnapMarker/Marquee, Defaults austheme/accents.ts, Projekt-MüM-FeldreferenceElevationMasl). Offen bleibt nur: Snap/Endpunkt-Default = ❓„aki" (s.u., derzeit Sora #5FA1C9) — reine Farbentscheidung des Nutzers. -
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— erledigt (2026-07-05): die drei funktional identischen 0.13-Volllinien (thin/hatch-line/joint-massive— alle weight 0.13,dash:null, gleiche Farbe) auf EINE kanonische „Volllinie 0.13" (thin) zusammengeführt; alle weight-only-Stile klar als „Volllinie X.XX" benannt; Schraffur-Referenzen (hatch-line→thin, inkl.ResourceManager.patToHatches) + Schichtfugen (joint-massive→thin) remappt;hatch-dash(einzige gestrichelte) bleibt. Ids stabil gelassen (geladene Projekte + interne Refs bleiben heil; Rendering-Gewichte unverändert). 7→5 Stile. tsc + Suite 331 grün. -
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 erledigt.) Belege in
/tmp/dossier-ref/rhino/*.py. -
Elemente im Schnitt anwählbar; render3d 2D-Schraffur auf 3D-Flächen.
-
TEAMWORK — kollaboratives Bearbeiten (Supabase self-hosted). Projekte auf einem self-hosted Supabase-Stack speichern; mehrere Nutzer bearbeiten dasselbe Projekt gleichzeitig. Kernkonzept: pessimistisches Object-Locking (wie Revit Worksharing / ArchiCAD Teamwork) — alle Objekte sind zunächst gesperrt; ein Nutzer reserviert die Elemente, die er bearbeiten möchte (exklusiver Schreibzugriff), und gibt sie frei, sobald er fertig ist. Freigabe → sofort für alle anderen sichtbar via Supabase Realtime (WebSocket-Kanal). Kein Merge-Konflikt nötig, weil niemals zwei Nutzer dasselbe Objekt gleichzeitig schreiben. Grobe Schichten:
- Auth + Projekt-Liste: Supabase Auth (Email/Magic-Link), Projektübersicht, Öffnen/Schliessen.
- Lock-Service: Tabelle
object_locks (project_id, object_id, user_id, locked_at)mit Row-Level Security;reserveObjects(ids[])/releaseObjects(ids[])als Supabase-RPC; Optimistisches Check-in via DB-Constraint (doppelte Reserve → Fehler → UI-Feedback). - Realtime-Sync: Supabase Realtime-Channel pro Projekt; bei Freigabe werden die veränderten Objekte (JSON-Patch oder ganzes Objekt-Payload, TBD) gepusht; lokaler Store merged incoming changes sofort.
- Presence: Wer ist online, wer hat welche Objekte reserviert (farbige User-Badges an reservierten Elementen im Plan).
- Offline-Guard: Beim Verbindungsabbruch Locks automatisch nach Timeout freigeben (DB-seitig:
locked_at + intervalprüfen). - Umfang/Granularität TBD mit Nutzer: Object = Wand/Raum/Drawing2D-Element? Geschoss? Layer? Feinere Granularität = mehr Parallelarbeit, aber komplexeres UI.
- Aufwand: gross (2–4 Wochen echte Arbeit). Erst sinnvoll, wenn Kern-CAD-Features stabil. Mit Nutzer Granularität + Hosting-Setup klären bevor Implementierung startet.
3D-REST (engine-schwer, bewusst NICHT blind — mit Nutzer angehen)
- Textur-/PBR-Pipeline (Sampler/Bindings/UV in wgpu; dann
textured-Style +Component.texture3d/Material echt rendern). ✅ Erster Durchstich erledigt (0ca3b1d, Schachbrett-Textur auf Wänden, group-1-Bind-Group,MESH_TEXTURED_WGSL, planare Meter-UVs). Verbleibende Lücken bis „richtig gut" (Grobschätzung ~18–29 PT): Bild-Datei-Laden (image-Crate, PNG/JPG→GPU) ~1–2 · Material→Textur-Zuordnung (Wandtyp/Layer→Material→Textur-Set, Cache/Atlas oder Bind-Group je Material) ~3–5 · Normal-/Roughness-/Metallic-Maps + Cook-Torrance-BRDF + Tangentenraum ~5–8 · Mipmaps (Blit-Pass) + anisotropes Filtern ~1–2 · Web-Pfad (web.rs/WebGPU, Bild-Upload via ImageBitmap) ~3–4 · UI zum Zuweisen + Persistenz im Dokumentmodell ~5–8. Wand-Schicht-Bänder in 3D Option B— bereits umgesetzt inresolveWallBands(layered=true)(src/plan/toWalls3d.ts:236-241): 3D-Viewer-Pfad liefert je Materiallage ein eigenesWallBand(Dicke + Component-Albedo + Normalen-Versatz),pushSegmentemittiert jede Lage als eigene Voll-Box.dominantLayerColorist nur noch Fallback für den Schnitt-Einkörper-Pfad (layered=false). Verifiziert per Code-Lesung.- Ortho-Ray-Picking (aktuell perspektivischer Pick-Strahl; Front/Top/Side-Presets vor erster Navigation leicht ungenau).
- 3D-Griffe/Editieren (Wand-Endpunkte im 3D ziehen etc. — bisher nur Auswahl + Panel-Edit).
❓ Offene Rückfragen (an den Nutzer)
„aki" Snap/Endpunkt-Farbe— entschieden 2026-07-04: Sora #5FA1C9 als endgültiger Default festgeschrieben (src/theme/accents.tsDEFAULT_SNAP_COLOR, Doc aktualisiert). Frage geschlossen.- Floating-ResourceManager „headless" = ganz ohne Titelleiste? (aktuell MIT)
- Geo-Block: Projekt-MüM zuerst oder Nordstern-Geo-Rendering?
- Verifizieren/klären: Isometrie „echte" orthographische Iso (teilw. durch Locked-Iso
cb8fae5adressiert)? · TopBar-Detailgrad (zoom% ganz aus Footer)? · DOSSIER-Audit welche Features konkret übernommen?
✅ Erledigt (Verlauf, neueste oben)
Nur jüngste Session; ältere Historie siehe git log und HANDOVER-Narrative.
-
2026-07-05 Fix: gezeichnete/importierte Kreise+Bögen im WebGL unsichtbar — der WebGL-Compiler (
glPlan/glPlanCompile.ts, Default-Renderer) dispatchtepolygon/line/arc, aber NICHTdrawingCircle/drawingArc→ seit4ac99d3(Kreise als echtesdrawingCircle-Primitiv statt 64-Eck-Polygon) fielen sie im GL still raus (SVG-/WASM-Pfad hatten sie, GL nicht). Zweig ergänzt: bildschirm-adaptive Tessellierung wie beimarc-Primitiv (Kreis geschlossen + optionale Vollton-Füllung, Bogen a0..a1 offen). tsc + Suite 334 grün. Nutzer-Report („zeichne Kreis, bleibt nicht sichtbar"). -
2026-07-05 Textur-Spike verifiziert erledigt (
0ca3b1d) — bei der Backlog-Abarbeitung festgestellt, dass die render3d-Textur-Spike (RenderStyle::Textured, Schachbrett, planare Meter-UVs,MESH_TEXTURED_WGSLgroup 1,spike3d-T-Toggle) bereits vollständig umgesetzt + committet war;cargo test58/59 grün, keine neuen Deps, Alt-Pfad bitgleich. „Als Nächstes"-Eintrag war veraltet → abgehakt; PBR-Restlückenliste (~18–29 PT) in 3D-REST übernommen. -
2026-07-05 Ribbon-Feinschliff (OCS-Zeile) — Tabs in die TopBar-Zeile verlegt (
456ebc8, eine Leiste Chrome+Tabs, Inhalt darunter; Tab-State in App); OCS-Chrome: kleine Wortmarke „dossier." + Quick-Access-Icons für ALLE Datei-/Export-Aktionen statt Burger-Menü, Zeile auf 26px (4e3b074); Text-/Font-Formatierung mit der Ansichts-/Zoom-Steuerung auf EINE Leiste gelegt, „Ansichten" als Standard-Tab zuerst + initial aktiv (fe22cbf). Alle tsc + 331 Tests grün. Visuelle Abnahme (26px, Icon-Sitz) noch offen. -
2026-07-05 Ribbon Phase 2: TopBar → „Ansichten"-Tab gemergt (
85011cb, Nutzer-Entscheid „voll mergen") — die Ansichts-/Zoom-/Darstellungs-Cluster der TopBar (View-Grid+Kamera, Ebenen-/Zeichnungs-Kombis, Detailgrad, Massstab/Zoom, Darstellungsart) alsViewRibbonTab(inTopBar.tsx) in den Ansichten-Tab verschoben; App reicht sie alsviewsContent-Node anRibbonBar(analog Layout-Menü). TopBar ist jetzt schmale globale Leiste (Marke/Ressourcen · Text · Datei/Export/Einstellungen · Fensterknöpfe).TopBarPropsentsprechend verschlankt. Visuelle Feinabstimmung offen. -
2026-07-05 Ribbon-UI Phase 1 (
9d6e86d) — datengetriebene Tab-Leiste (src/ui/ribbon/:ribbonItems.tsRegistry,RibbonBar.tsx,CommandIcon.tsx) unter der TopBar, additiv (Sidebar bleibt). Tabs 2D·3D·BIM·Ansichten; 2D=Zeichnen(select/line/polyline/rect/circle/arc)+Ändern(move/copy/mirror/offset/trim/join), BIM=Bauteile(wall/window/door/stair/ceiling/room); 3D/Ansichten noch leer. Ein Aktivierungs-Pfad: tool→onSelectTool, command→onRunCommand(engine.start); Aktiv-Highlight überactiveTool/engineView.commandName.ToolIconaus ToolsPanel exportiert (wiederverwendet). -
2026-07-05 Attribut-Panel: ein Grid, volle Breite (
ace0dc6) — drei getrennte Grids zu EINEM durchgehenden Zwei-Spalten-Grid gemerged (Wertspalte über alle Sektionen bündig), Dropdown-Pills füllen die Wertspalte (fixe Breiten raus), doppeltes Eigen-Padding + zweiter „Attribute"-Titel entfernt. Nutzer-Report. -
2026-07-05 Eigenschaften-Grid OCS-Stil (
00733d8) —.attr-*als klares Grid: Sektion-Balken, Zeilentrenner, füllende linksbündige Wertfelder (Texte/Zahlen/Dropdowns einheitlich). Erste Stufe der Ribbon-UI-Vision. -
2026-07-05 Zoom-Scroll-Fix (
077e774) — Dokument-Overscroll/Rubberband gesperrt (html,body,#root { overflow:hidden; overscroll-behavior:none }); Viewport-Zoom zieht die UI nicht mehr mit (macOS). Nutzer-Report. -
2026-07-05 Kreis- + Bogen-Werkzeug (
e454eab,bd2b12b) — Kreis-Toolbar (circleCommand gekoppelt) + neuesarcCommand(3-Klick CCW), beide mit Toolbar-Icon/i18n; rendern glatt viadrawingCircle/drawingArc. -
2026-07-05 DXF-Import: Platzierungsoption (
dd76ec8) — ImportDialog fragt „relativ zum Nullpunkt" ODER „in die Mitte der aktuellen Ansicht";PlanViewHandle.viewCenterModel()neu;runImportverschiebt den Gesamt-Umriss (bbox-Mitte → Ansichtsmitte). tsc + Suite 331 grün. -
2026-07-05 Zeichnungen Copy/Paste über Geschosse (
376aa67) — Ctrl/Cmd+C kopiert gewählte Drawing2D tief; Ctrl/Cmd+V fügt Klone (neue IDs) auf dem AKTIVEN Geschoss ein und wählt sie. Für z. B. importiertes Mobiliar. Textfeld-Fokus bleibt natives Copy/Paste. -
2026-07-05 Tauri Drag&Drop + Import-Dialog-Fix (
c5b5ca6,45e19b7) —import-Befehl alsautoRun(Datei-Dialog öffnet synchron in der Geste, HMR-Falle via Config-Relaunch behoben);dragDropEnabled:false(Tauris natives Drag-Drop fing HTML-Drops ab). Nutzer-bestätigt: Dialog + Text gehen. -
2026-07-05 Layout: Befehlszeile in Mitte-Spalte (
c794fee) — nur Viewport-breit, Docks gewinnen Höhe. Nutzer-bestätigt „sieht clean aus". -
2026-07-05 Textur-Spike render3d (
RenderStyle::Texturedreal) — zweiter Vertex-Pfad[pos,normal,uv]aus dem Mesh abgeleitet (Alt-Pfad bitgleich, per Test belegt), prozedurales 256×256-Schachbrett (kein Asset/image-Crate), Textur-Bind-Group group 1,MESH_TEXTURED_WGSL(gleiche Beleuchtung, Albedo aus Sampler), Pipeline bitidentisch zur Haupt-Pipeline,spike3dperTumschaltbar. Verifiziert: cargo test 58/59 (inkl. naga-Test) grün, alle 4 Builds sauber. Visuelle Fenster-Abnahme durch Nutzer bestanden 2026-07-05 (Schachbrett korrekt,T-Umschaltung ok). Erster Durchstich der Textur-/PBR-Pipeline; ehrliche Lückenliste im Bericht —8556037 -
2026-07-04 Grundriss: Decke drückt nicht mehr durch die Wände — Decken-Umriss an Wand-Footprints (OBB) geclippt; Füllfläche strokelos, Umriss nur über unverdeckte Teilstücke (Überstände). Deckungsgleiche Decke ⇒ Umriss entfällt. vitest 230, tsc sauber —
a2f6923 -
2026-07-04 T-Stoss-Putznaht entfernt — L-Seitenlinie nur noch bei materialFREMDEM Nah-Putz; materialgleicher Putz verschmilzt nahtlos (Nutzer-Direktive „Naht entfernen"). TS+Rust synchron, 3 Tests gezogen, cargo 8/8 —
a5ebfa7 -
2026-07-04 Snap-Farbe entschieden: Sora #5FA1C9 als endgültiger Default festgeschrieben (
DEFAULT_SNAP_COLOR, Doc), „aki"-❓ geschlossen. -
2026-07-04 Mac-Build via Tauri + Queue-Abgleich — Toolchain auf macOS-Gerät verifiziert,
cad.app/cad_0.1.0_aarch64.dmggebaut & gestartet. Verifikations-Baseline grün (tsc/vitest 230/cargo 56). Queue-Reconciliation: Toolchain-Blocker, Snap-Slice (339202b), Ebene-Schraffur (dcb6ed5), Bauteile-Tab-Master-Detail, Einstellungs-Verdrahtung UND Wand-Schicht-Bänder 3D (Option B,toWalls3d.ts) waren allesamt bereits gelandet, aber in PENDENZEN noch als offen gelistet → abgehakt. (kein Code-Commit) -
2026-07-04 Öffnungen als echte Boolean-Löcher (+ Deckentrim-nur-3D) — Fenster/Türen = 1 Wandkörper mit rechteckigen
holes(Rechteck-Gitter-Zerlegung + Laibungsquads), Segment-Boxen weg; Deckentrim nur noch im 3D-Pfad, Schnitt volle Höhe. Pflicht-Testfall versetzt-überlappende Fenster grün. cargo test 56, vitest 230, build:engine3d + tsc sauber —1407c68 -
2026-07-04 Joins Phase 1c Durchgangswand am T-Stoss echt aufbrechen (spanCutouts) —
c5a344d -
2026-07-04 Locked-Iso-Fix freie Kamera bleibt nach Ortho-Preset orthografisch —
cb8fae5 -
2026-07-04 3D-Live-Schnittebene mit schraffierten Schnittflächen —
03f0c40 -
2026-07-04 Joins Phase 2 Merge-Regel im Schnitt (gleiche Komponente verschmilzt) —
82d354f