Skip to content

chore/push local work 2026 07 30 - #1

Open
DutchSailor wants to merge 20 commits into
masterfrom
chore/push-local-work-2026-07-30
Open

chore/push local work 2026 07 30#1
DutchSailor wants to merge 20 commits into
masterfrom
chore/push-local-work-2026-07-30

Conversation

@DutchSailor

Copy link
Copy Markdown
  • chore(gitignore): installer build-artefacten negeren + pyc-caches untracken
  • perf(viewer): property-extractie naar dedicated web worker
  • refactor(viewer): manifest-selector uit OpenDialog verwijderd
  • feat(desktop): Tauri-shell met OpenAEC-accounts en embedded server
  • feat(installer): Inno Setup-pipeline + PyInstaller-bundles en frozen-build-fixes
  • docs(readme): sectie Praktische CLI Voorbeelden uitgebreid
  • fix(viewer): isolatie rendert element opaque + section planes clippen per materiaal
  • feat(validator): not-checkable status voor niet-evalueerbare specificaties
  • feat(mcp): zero-dependency MCP-server op de validatie-engine
  • feat(web): llms.txt en robots.txt voor AI/zoekmachine-vindbaarheid
  • docs(optimizer): design-spec IFC-optimizer fase 1 + ifcpatch/ifcclash deps
  • feat(quality): data-quality checks op het model (8 controles)
  • feat(optimizer): IFC-optimizer engine met selecteerbare passes (fase 1)
  • feat(server): async optimize/clash-endpoints + /status-probe
  • feat(viewer): Clashes- en Kwaliteit-tabs + Optimaliseer-dialoog
  • fix(viewer): TransformControls-gizmo zichtbaar maken op three r180
  • refactor(viewer): dode manifest-lijst-code verwijderd
  • feat(livelink): open streaming-protocol + IfcOpenShell-referentiefeeder (fase 1)
  • feat(viewer): volledige adoptie OpenAEC design system

DutchSailor and others added 19 commits July 10, 2026 03:12
…racken

installer/build, dist, dist_tauri, output en *.log zijn PyInstaller/Inno
Setup-output en horen niet in git. Getrackte __pycache__/*.pyc verwijderd
uit de index (stonden al in .gitignore maar waren eerder gecommit).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PropertyExtractor draaide synchroon op de main thread en bevroor de UI
bij de eerste element-selectie op grote modellen. PropertyClient is een
main-thread proxy met dezelfde async-interface; de web-ifc extractie
draait nu in propertyWorker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Projecten openen IFC-bestanden nu direct; de .wefc-manifest-keuzelijst
in de Open-dialog verviel. Het .wefc-concept zelf (Backstage/SaveAs)
blijft ongewijzigd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Windows desktop-app rond de bestaande viewer:
- Rust-shell spawnt in release-builds de gebundelde headless Python-
  server (server/bim-validator-server.exe, PyInstaller) op 127.0.0.1:8000
  en beeindigt die bij afsluiten; in dev draait uvicorn los
- frameless venster met eigen WindowChrome-titelbalk (drag-region,
  minimize/maximize/close) en file-associations voor .ifc/.ifcx
- WebView2: embedBootstrapper (silent) + WebView2Loader.dll gebundeld
  als resource en gecommit conform Windows desktop-policy
- Sign in with OpenAEC: OIDC Authorization Code + PKCE volledig in Rust
  (systeembrowser -> loopback-callback -> tokens in Windows Credential
  Manager); frontend praat alleen via invoke, achter VITE_OPENAEC_ENABLED
- apiBase.ts detecteert Tauri en schakelt API-calls naar de embedded
  server; CORS voor tauri://localhost-origins in server/main.py
- VIEWER_DIST_PATH env-override voor het frontend-dist-pad

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…build-fixes

- installer/build.ps1: frontend-build -> PyInstaller (tray-app, CLI,
  headless server) -> Inno Setup -> setup.exe
- bim_validator.iss: componenten server/CLI, NL+EN, desktop-icon,
  autostart, CLI naar systeem-PATH, 3BM-branding
- tray_app.py: pystray system-tray die uvicorn start en de browser
  opent; server_headless.py als tegenhanger voor de Tauri-shell
- pyproject: optionele desktop-extra (pystray, Pillow)
- cli.py: stdout/stderr naar UTF-8 geforceerd (cp1252-crash op
  unicode-glyphs in frozen builds)
- resolver.py: gebundelde IDS-standaarden vindbaar via sys._MEIPASS
  in PyInstaller-builds

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… per materiaal

Ghost mode (4 eerdere mislukte pogingen, zie TODO.md): fragments batchen
elementen in shared meshes, dus geen materiaal- of instance-truc kan een
element opaque houden. Oplossing is het split-out patroon: de geometrie
van het geselecteerde element wordt via getItemsGeometry() uit de batch
gesplitst en als losse opaque mesh gerenderd, met bounding-box als
fallback. Nagestreamde tiles worden geghost via model.tiles.onItemSet.

Section planes: clipping verplaatst van renderer.clippingPlanes (globaal,
clipte ook gizmo en plane-visuals weg) naar per-materiaal clipping op
alleen modelgeometrie. Nieuwe tiles krijgen actieve planes bij streaming.

Traversals gebruiken isMesh duck-typing i.p.v. instanceof zodat meshes
van andere module-instanties niet gemist worden.

Geverifieerd end-to-end in de draaiende viewer met 2786_CLT_model.ifc:
element opaque (#44b6a8, 48 verts) bij 7 geghoste materialen; 15/15
modelmaterialen geclipt bij actief vlak, gizmo en plane-visual ongeclipt;
restore/remove herstelt alles.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…aties

Honesty-rule: een specificatie die de engine niet kan evalueren wordt
expliciet gerapporteerd als 'not checkable' — nooit stil geslaagd of
gefaald. Concreet: ifctester draait nu met should_filter_version=True,
zodat specs waarvan de ifcVersion het modelschema niet dekt (bv. een
IFC4-spec tegen een IFC2X3-model) worden overgeslagen en als
not_checkable met reden in het resultaat komen.

- SpecificationResult: status (passed/failed/not_checkable) +
  not_checkable_reason; status wordt afgeleid uit passed voor bestaande
  constructors (backward compatible)
- ValidationResult: not_checkable_specifications teller (default 0);
  pass rate telt alleen over controleerbare specs
- Console/HTML-formatters tonen de derde status incl. reden

8 nieuwe tests in test/test_not_checkable.py; volledige suite 809 groen
(16 pre-existing failures in server-tests staan los van deze wijziging,
geverifieerd via baseline op schone HEAD).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Stdio MCP-server (newline-delimited JSON-RPC 2.0, geen dependencies)
waarmee AI-assistenten lokaal IFC-modellen valideren. Validatie draait
volledig op de eigen machine via IfcOpenShell/ifctester — modeldata
verlaat de machine niet, geen API-key nodig.

Tools: validate_ifc (IDS-pad of bundled standaard, compacte JSON-summary
met per-spec status incl. not_checkable), list_standards, export_report
(html/json). Tool-fouten gaan in-band terug (isError) zodat het model
erop kan reageren; stdout bevat uitsluitend JSON-RPC, logging naar
stderr. Entry point: ifc-validator-mcp / python -m ifc_validator.mcp_server.

9 subprocess-tests die de server als echte MCP-client aansturen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
llms.txt beschrijft capabilities, interfaces (web, CLI, MCP, REST,
desktop) en workflows in LLM-vriendelijk formaat; robots.txt sluit
/api/ uit. Geserveerd vanuit viewer/public zodat ze in dist meekomen
en door de SPA-fallback op / worden geserveerd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… deps

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Naar het voorbeeld van browser-based BIM-datakwaliteitstools: dubbele/
ontbrekende GlobalIds, IfcBuildingElementProxy zonder classificatie,
generieke namen, geen materiaal/verdieping/psets, en niet-gehoste
deuren/ramen. Engine-standalone module (quality/) met Pydantic-rapport
(findings gecapt op 50 met omitted-teller, zelfde honesty-principe als
de validatie) + synchroon endpoint POST /api/v1/quality.

16 unit-tests op synthetische IFC4-fixtures.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Conform de design-spec (docs/superpowers/specs/2026-07-10): altijd een
nieuw bestand, passes individueel selecteerbaar, volledig wijzigings-
rapport met GlobalIds. Fase-1 passes: dubbele GlobalIds herstellen,
kapotte relaties verwijderen, ongebruikte psets/quantities verwijderen,
compact herschrijven (ifcpatch Optimise, dedupliceert identieke
instanties). Gemeten op het CLT-testmodel: 7,2 MB -> 6,5 MB (-10%),
8654 entiteiten gededupliceerd.

9 unit/integratietests (TDD).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- /api/v1/optimize: upload -> 202 job -> poll -> rapport + download van
  het geoptimaliseerde bestand (per-job tempdir, TTL-cleanup)
- /api/v1/clash: ifcclash-detectie binnen 1 model of tussen 2 modellen
  (intersection/collision/clearance), resultaten gecapt op 2000 met
  omitted-teller; modelbestanden direct na afloop opgeruimd
- server/routers/jobstore.py: thread-safe TTL-jobstore met expiry-
  callback voor router-eigen artefacten
- GET /status: lichte probe voor lokale-engine-detectie (versie +
  capabilities) + Private-Network-Access-middleware zodat Chrome de
  localhost-probe vanaf een publieke pagina toestaat

12 endpoint-tests via TestClient.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- ClashPanel (Clashes-tab was placeholder): detectie binnen 1 model of
  tussen 2 geladen modellen via het async clash-endpoint; klik op een
  element selecteert/isoleert het in 3D. Geverifieerd: 75 clashes op
  het CLT-testmodel, weergave + selectie werkend
- QualityPanel (nieuwe Kwaliteit-tab): 8 datakwaliteitschecks met
  uitklapbare findings, klik selecteert het element. Geverifieerd:
  echte bevindingen op het CLT-model (7 proxies, 63 zonder materiaal)
- OptimizeDialog + Optimaliseer-knop in ribbon-groep Modellen:
  pass-checkboxes (van GET /optimize/passes), rapport met groottewinst
  per pass en download van het geoptimaliseerde bestand
- toolsApi.ts: gedeelde job-poll/upload-client voor de drie tools
- Verwijder- en Reset-knoppen in de ribbon aangesloten (waren nooit
  doorgegeven vanuit AppShell -> deden niets)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sinds three r169 is TransformControls geen Object3D meer; de visual
moet via getHelper() aan de scene worden toegevoegd. De gizmo van de
section planes was stilletjes onzichtbaar geworden toen de npm-audit-
fix three naar 0.183 bumpte (THREE.Object3D.add-error in console).
Gevonden met de volledige knoppentest in de dev-build; na de fix zijn
Snijvlak X/Y/Z en Wis snijvlakken foutvrij geverifieerd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
cloudManifests/cloudLoadManifests (cloudSlice) en cloudListManifests +
ManifestInfo (cloudApi) hadden geen gebruikers meer sinds de manifest-
selector uit OpenDialog verdween. cloudSaveManifest/cloudReadManifest
en de overige .wefc-code blijven ongewijzigd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…er (fase 1)

docs/LIVE_LINK_PROTOCOL.md: generiek WebSocket-protocol voor live
model-streaming naar de viewer — localhost-only binding, health-probe,
ping/pong-handshake met gescheiden protocol- en app-versie, origin-
allowlist, export/element-batch-flow, incrementele element-updates en
content-hash delta-cache; mesh-formaat base64 Float32/Uint32, meters/
Y-up, per-materiaal draw-groups.

tools/livelink/feeder.py: referentie-implementatie die een IFC-bestand
streamt (ifcopenshell.geom, poort 19790) en bij bestandswijziging
alleen gewijzigde elementen herstuurt. Optionele extra: pip install
.[livelink]. 40 unit-tests op de pure functies; end-to-end gesmoke-test
met het CLT-model (143 elementen, delta-run 0 opnieuw gestreamd).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
UI bijgewerkt naar de laatste stand van OpenAEC-style-book:

- themes.css 1-op-1 overgenomen uit de Tauri+React-referentietemplate:
  5 thema's (light/forge/openaec/blueprint/contrast) i.p.v. 2, met
  'light' nu als echt licht thema conform DESIGN-SYSTEM.md; viewer-
  specifieke --domain-* (BIM) tokens per thema toegevoegd
- huisstijl-fonts lokaal gebundeld (geen CDN): Inter (body/UI),
  Space Grotesk (headings), JetBrains Mono (code/GlobalIds) met
  @font-face + form-element font-inherit
- alle 20+ component-CSS-bestanden op --theme-*/--domain-* tokens:
  phantom-variabelen (--text/--bg-input/--border) vervangen, volledig
  hardcoded WindowChrome getokeniseerd, en alle oude 3BM-merkkleuren
  (verdigris/magic-violet/friendly-yellow/flaming-peach) en stale
  hex-fallbacks vervangen; rgba-tints via color-mix op tokens
- 3D-accenten (highlight/isolatie) van verdigris naar amber #D97706;
  brand.css opgeschoond (aliassen -> tokens, neutrale schaduwen,
  --shadow-focus amber-ring); meta theme-color -> #D97706
- SettingsDialog: 5 thema-opties met token-swatches + NL/EN-labels

Geverifieerd in de draaiende preview: alle 5 thema's schakelen met de
juiste tokenwaarden, 3 fonts laden, ribbon/statusbar/headings volgen de
tokens, thema-dropdown toont alle opties; productie-build groen met
fonts in dist.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@DutchSailor
DutchSailor requested a review from jochem25 as a code owner July 30, 2026 15:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant