17 Commits
Author SHA1 Message Date
MachielandClaude Opus 5.5 8cdfa21f46 v0.4.17: openingen met schuine bovenzijde (hoogte links/rechts, volg dakhelling), 9 sleeppunten in het vooraanzicht; regelwerk, beplating, doek, steen en latwerk volgen de schuinte (columnMinusRects met schuine uitsparingen)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 20:01:54 +02:00
MachielandClaude Opus 5.5 23bfe153a2 v0.4.16: PDF-aanzichten (vlakke render) met legenda afwerking en afmetingen, zaaglijst/zaagmachine eigen blad, infopaneel afmetingen, lopen (Shift+T) met camera-menu, zachter licht, naadwanden volgen koppeling, boeideel over de gevel (gevel tot bovenkant dak), thumbnails riet/vloer
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 22:29:57 +02:00
MachielandClaude Opus 5.5 12c2579471 v0.4.15: gevelbekleding per woning (rabat/steen, override per wand), stenen trasraam (110 mm, 181 texturen), riet per unit, vloerafwerking, verfkleur binnen, boeideelkleur, gevel tot onder dakrand, binnenhoek-fixes; testontwerp als standaard
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 19:47:49 +02:00
MachielandClaude Opus 5.5 7d91416004 v0.4.14: schuin dak met loodrechte kopse kanten, import met naadwanden, weergave Vloerplan
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 17:24:38 +02:00
MachielandClaude Opus 5.5 94a5215f82 v0.4.13: opbouw buitenwand boven lager dak, latwerk-raster per gevel, dakrand 80 mm boven dakleer, lage rand loopt door
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 15:33:47 +02:00
MachielandClaude Opus 5.5 373c2c2fb7 v0.4.12: dak volgt wandvorm (plat/lessenaar/zadel), dakrand per hoogte, naadwand midden of geheel in unit A/B
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 14:43:42 +02:00
MachielandClaude Opus 5.5 001206a108 README opgeschoond: korte opzet met bulletpoints, geen changelog meer
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 13:41:01 +02:00
MachielandClaude Opus 5.5 9126588df7 v0.4.10: wandhoogtes gekoppeld, middenpunt (nok), binnenspots langs naadwanden
- WallModel: optioneel middenpunt (heightMid, topLine), bovenregels in verstek;
  stijlen, openingen, beplating, doek, latwerk, BOM, 2D en PDF volgen de knik
- wand-editor: schakelaar "Middenpunt (nok)" + nokhoogte, links/rechts = goothoogte
- UnitModel.syncWallHeights: tegenoverliggende wand gespiegeld, haakse wanden
  vlak op de hoekhoogtes; wallPieces met nok per stuk
- LightingModel.computeIndoor: raster vanaf binnenzijde eigen naadwanddeel

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 13:35:21 +02:00
MachielandClaude Opus 5.5 9bd7faeaa6 v0.4.9: naadwanden (2 delen, deur), kopbalken op naden, isolatie niet meer getekend
- HouseModel: naadwand per naad (ensureSeamWalls bij nieuwe woning en unit toevoegen),
  twee delen met beplating alleen aan de kamerzijde, openingen gespiegeld
- WallModel: buitenzijde 'geen', thicknessOf eenzijdig
- FloorModel: kopbalken (rims) voor vloer en dak op naden, ook in PDF en totalen
- isolatie: 3D-lagen en filter verwijderd, berekening blijft

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 13:13:07 +02:00
MachielandClaude Opus 5.5 f163f4deb1 v0.4.8: gevellampen tellen vanaf de zichtbare afgewerkte hoek
- bedekte gevelstukken (wandstuk in de naad, binnenhoek L) afgetrokken via voetafdruk
- uiteinden verlengd met afwerking (+ skinExt bij tussenpassende wanden)
- groupFacadeRuns accepteert overlap

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:54:41 +02:00
MachielandClaude Opus 5.5 448c2b1289 v0.4.7: lampen niet meer door muren, buiten overdag gedimd, binnenspots feller
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:47:08 +02:00
MachielandClaude Opus 5.5 5ecf3e0c2a v0.4.6: binnenspots per unit, omgeving als keuzemenu (Ontwerp/Dag/Nacht), lampen 15% zachter
- LightingModel.computeIndoor: plafondraster per unit (800-1500 h.o.h., 600 van wand/naad)
- 3D, plattegrond, render, totalen en PDF
- tegelvloer 20% groter; gras volledig verwijderd

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:44:06 +02:00
MachielandClaude Opus 5.5 7ae76fe390 v0.4.5: tegelvloer met witte rand i.p.v. gras, Lucht geen/dag/nacht, Render met daglicht + lampen
- core/skybox.js: tegelvloer (tiles.jpg) passend om het object, rand 100x25 mm wit
- nacht-panorama; nacht = 15% omgevingslicht + lampen 100%
- Render-knop met camera-icoon: echte lampen in het gekozen licht
- gras verwijderd (bestanden lokaal bewaard, uit git)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:34:19 +02:00
MachielandClaude Opus 5.5 9ed9cee2e0 v0.4.4: gras kleurgecorrigeerd naar panorama-grasgroen, belichting gecompenseerd
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:13:41 +02:00
MachielandClaude Opus 5.5 f8da490640 v0.4.3: lucht op de grond (grounded skybox) met gras en schaduw; webserver verplicht
- core/skybox.js: panorama op de grond geprojecteerd (port GroundedSkybox),
  grastextuur in cirkel rond het object met overvloeiing, zon met schaduw,
  camera niet onder de grond
- woning: maaiveld als instelling (standaard 350 mm onder bovenkant vloer)
- assets opgeschoond (alleen grass.jpg + skybox.webp), skybox-data.js weg
- start.sh + melding bij file://

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:07:35 +02:00
MachielandClaude Opus 5.5 3a4b9608c0 v0.4.2: iconen gerepareerd, lucht-achtergrond (skybox) met toggle
- bootstrap-icons: @font-face correct ingebed (selector .bi::before was stuk)
- core/skybox.js + assets/skybox-data.js (lazy), knop Lucht in alle 3D-weergaven
- woning: met lucht aan raster en sandwichpanelen onzichtbaar

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 11:58:07 +02:00
MachielandClaude Opus 5.5 3591fad220 v0.4.1: UI opgeschoond — tabbladen, iconen, uniforme labels, T-cyclus
- core/ui-kit.js: gedeelde velden/schakelaars/tabs/specificatiekaarten
- Bootstrap Icons lokaal (css/vendor, font ingebed)
- Woning- en unit-instellingen in tabbladen, labels gestandaardiseerd
- Specificaties onder 3D als kaarten
- T: standaard -> 3D groot -> alleen render -> standaard

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 11:51:18 +02:00
769 changed files with 4176 additions and 1462 deletions
+97 -222
View File
@@ -1,237 +1,112 @@
# Tectum — configurator Van Emous Mantelzorgwoningen (intern) # Tectum — configurator Van Emous Mantelzorgwoningen (intern)
Losse, meerdere-bestanden-opzet van de eerdere single-file wand-tool, nu met Configurator voor mantelzorgwoningen: wand, vloer en woning (gekoppelde units)
een menubalk om tussen objecttypen (muur/vloer) te schakelen. met 2D, 3D, specificaties en PDF-tekenbladen.
Copyright © 2026 Machiel Heinen. Alle rechten Copyright © 2026 Machiel Heinen. Alle rechten voorbehouden; gebruik
voorbehouden; gebruik uitsluitend met schriftelijke toestemming. Zie uitsluitend met schriftelijke toestemming. Zie [LICENTIE.md](LICENTIE.md).
[LICENTIE.md](LICENTIE.md). Elk bronbestand begint met deze copyright-kop. Elk bronbestand begint met deze copyright-kop.
## Draaien ## Draaien
**Optie 1 — direct openen (geen server nodig):**
Dubbelklik `index.html`. Alles werkt met gewone `<script src="...">`-tags
(geen ES-modules), dus dit werkt ook via `file://`.
**Optie 2 — lokale server (optioneel):**
``` ```
cd project ./start.sh # of: python3 -m http.server 8000
python3 -m http.server 8000
``` ```
en open `http://localhost:8000`. Open `http://localhost:8000`. Elke statische webserver volstaat; geen
build-stap. Direct openen via `file://` werkt niet (texturen/lucht).
## Structuur ## Structuur
``` ```
index.html app-shell: menubalk, splashscreen, over-deze-software index.html app-shell: menubalk, splashscreen
css/ css/app.css alle stijl
app.css alle stijl, in één bestand js/vendor/ three.js r128, eigen OrbitControls, jsPDF
js/ js/core/ gedeelde helpers: geometrie, UI-kit, PDF-bladen, labels,
vendor/ camerageheugen, weergavefilter, skybox, licentie, logo
three.min.js three.js r128, lokaal gevendord (geen CDN meer) js/wall/ WallModel (logica) + wand-PDF + wand-editor
OrbitControls.js eigen, compacte OrbitControls-vervanging (zie js/floor/ FloorModel (logica) + vloer-PDF + vloer-editor
"Bewuste keuzes" hieronder) — leunt op three.min.js js/roof/ RoofModel: dak (plat/lessenaar/zadel) + dakrand (boeidelen/daktrim)
core/ js/lighting/ LightingModel: gevellampen, boeideel-spots, binnenspots
geometry.js gedeelde, pure functies (regelwerk-verdeling, js/sandwich/ SandwichModel: sandwichpanelen rondom
polygon-oppervlaktes, clip-functies) — gebruikt js/unit/ UnitModel: 1 vloer + 4 wanden, naden, wandstukken
door zowel wall.js als floor.js, niet gedupliceerd js/house/ HouseModel (woning) + woning-PDF + woning-editor
canvas-labels.js gedeelde stijl voor maatlabels ("X: 6000mm") in de js/app.js menubalk, versienummer, actieve editor
2D-canvassen van wand, vloer en unit json/defaults/ referentie-JSON's (niet runtime ingeladen)
pdf-sheet.js gedeelde PDF-bouwstenen: titelblok, maatlijn, tabel assets/ logo, texturen, skybox
camera-memory.js onthoudt de 3D-camerastand per tabblad + onderdeel
view-filter.js "Weergave"-dropdown met vinkjes voor de 3D-weergaven
license.js licentietekst voor "Over deze software" (kopie van
LICENTIE.md, dat bestand is leidend)
logo-data.js logo als PNG-data voor de PDF-titelblokken
(opnieuw genereren uit assets/logo.svg, zie kop)
wall/
wall-model.js WallModel: ENIGE bron van de wand-logica (anker-
resolutie openingen, regelwerk, 3D-opbouw, specs,
validatie) — geen DOM
wall-pdf.js WallPdf: het wand-tekenblad (aanzicht, boven- en
zijaanzicht, materiaallijst) — losse wand én unit
wall.js wand-editor (UI: invoer, 2D, interactie, JSON/PDF)
floor/
floor-model.js FloorModel: ENIGE bron van de vloer-logica (balken,
doorvoeren, chassis, 3D-opbouw, specs, validatie)
floor-pdf.js FloorPdf: het vloer-tekenblad — losse vloer én unit
floor.js vloer-editor (UI, uitsluitend cirkelvormige
openingen/doorvoeren)
roof/
roof-model.js RoofModel: plat dak = vloer (FloorModel) 180°
gespiegeld + dakleer; dakrand (boeidelen met spots
of daktrim) als één doorlopende rand om de woning
lighting/
lighting-model.js LightingModel: buitenverlichting per unit (geen /
boeideel-spots / gevellampen), gevellampen per
wandstuk met terugval naar spots, override per wand
unit/
unit-model.js UnitModel: 1 vloer + 4 wanden, hoekaansluiting,
naden (wand vervalt deels/geheel) en wandstukken
house/
house-model.js HouseModel: woning = gekoppelde units + binnenwanden;
posities (koppelen aan zijde + uitlijning), naden,
totalen
house-pdf.js HousePdf: samenhangende PDF (plattegrond, per unit
vloer + wandstukken, binnenwanden, totalen)
house.js woning-editor (UI): navigatieboom, plattegrond met
selecteren/binnenwand tekenen, eigenschappen, 3D;
mount de echte wand-/vloer-editor per onderdeel
app.js menubalk-logica, versienummer, mount/unmount van
de actieve editor
json/
defaults/ referentie-JSON's die tonen wat "Nieuw" oplevert
(worden NIET ingeladen via fetch(), zie hieronder)
premade/ bestemmingsmap voor opgeslagen/geëxporteerde designs
assets/ logo (preloader) + bestemmingsmap voor toekomstige
GLB's/texturen
``` ```
## Bewuste keuzes / bekende beperkingen ## Uitgangspunten
- **Volledig CDN-vrij.** three.js (r128) staat lokaal in `js/vendor/three.min.js`. - **Eén bron per logica.** Rekenwerk en 3D-opbouw zitten alleen in de
OrbitControls is een eigen, compacte implementatie (`js/vendor/OrbitControls.js`) `*Model`/`*Pdf`-modules; editors en woning hergebruiken die.
— het originele addon-bestand was niet beschikbaar om te vendoren, dus is de - **Geen ES-modules, geen CDN.** Gewone `<script>`-tags in vaste volgorde
gebruikte subset (roteren via slepen, zoomen via scrollwiel, pannen via (zie `index.html`), alle libraries lokaal.
rechts-slepen, `target`/`update()`) opnieuw geschreven en losstaand getest - **Assen/zijden.** Bovenaanzicht boven = noord: voor = noord, achter = zuid,
(rotatie/zoom-richting/grenzen/pannen/dispose). Functioneel gelijkwaardig links = west, rechts = oost (interne sleutels blijven voor/achter/…).
voor wat deze tool nodig heeft, maar geen 1-op-1 kopie van alle opties van - **Hoogtes** gelden vanaf bovenkant vloer (loopvlak).
de officiële addon (bijv. geen damping/inertia).
- **Geen ES-modules.** Alle JS-bestanden zijn gewone `<script>`-tags, geladen ## Functionaliteit
in een vaste volgorde (`geometry.js` → `canvas-labels.js` → jsPDF →
`pdf-sheet.js` → `wall-model.js` → `wall-pdf.js` → `floor-model.js` → - **Wand:** openingen (raam/deur/voordeur) met ankers, ook boven elkaar
`floor-pdf.js` → `roof-model.js` → `lighting-model.js` → `wall.js` → `floor.js` → `unit-model.js` → `house-model.js` (raam boven een deur; stijlen ertussen van dorpel tot dorpel), regelwerk
→ `house-pdf.js` → `house.js` → `app.js`). 38x235 met dubbele hoekstijlen en een dubbele stijl naast deuren, zaagplan
Reden: ES-module-imports (`import ... from`) breken bij rechtstreeks openen op handelslengtes, spaanplaat binnen, vochtdoek (met kruislat en trasraam)
via `file://` door browser-CORS-beleid. Dit was expliciet een vereiste of cementplaat buiten.
("gewoon via een index file"), dus is hier bewust voor gekozen. - **Wandhoogte:** schuine bovenrand of middenpunt (nok) met goothoogtes. In
- **`json/defaults/*.json` worden niet gefetcht.** Om dezelfde reden (fetch() een unit bepaalt de laatst gewijzigde wand de dakvorm: de tegenoverliggende
van lokale bestanden werkt ook niet betrouwbaar via `file://`): de wand spiegelt mee, de haakse wanden worden vlak op de hoekhoogtes.
standaardwaarden van "Nieuw" staan hardcoded in `wall.js`/`floor.js` zelf, - **Vloer:** balken, cirkelvormige doorvoeren, OSB, optioneel chassis;
en komen overeen met deze JSON-bestanden. De JSON's zijn dus referentie/ in de woning een vloerafwerking (textuur, bijv. visgraat).
documentatie, en (voor wanden) een bestand dat je via "Importeer JSON" kan - **Woning:** units koppelen aan een zijde (uitlijning + verschuiving); op
inladen — geen runtime-configuratiebron. naden vervallen de buitenwanden en komt een naadwand met deur: midden op
- **Alleen wall.js heeft Exporteer/Importeer JSON.** floor.js nog niet. de naad in twee delen (één per unit), of als één binnenwand geheel in unit
- **Floor.js heeft nu dezelfde soorten logica als wall.js.** 2D-bovenaanzicht A of B. De hoogte volgt per deel de daklijn van zijn unit. Staat een unit
+ doorsnede, regelwerk (vloerbalken), cirkelvormige doorvoeren, een met een hogere daklijn tegen een lager dak, dan krijgt zijn buitenwand aan
onderlaag van OSB-plaat (standaard 22mm, dikte + oppervlak + volume + de naadzijde een opbouw vanaf de bovenkant van het lage dak (ramen daar
gewicht), een isolatielaag (leegte tussen de balken, analytisch bepaald — teken je op die buitenwand) en stopt de naadwand op die hoogte. Loopt het
net als bij de wand krijgt isolatie zelf bewust geen dichtheid/gewicht), lage dak langs de naad schuin, dan loopt de naadwand door en krijgt het
een volwaardig 3D-perspectief (balken/isolatie/OSB met doorvoer-gaten/ uitstekende stuk buitenafwerking (vochtdoek + latwerk).
chassis-wielen, met aan/uit-toggles voor OSB en isolatie, plus fullscreen- Binnenwanden teken je in de plattegrond.
2D/3D) en een specificaties-paneel met een gewichtstotaal. Losse, - **Dak:** per unit opgebouwd als gespiegelde vloer + dakleer, in de vorm
optionele chassis-laag (4 transportwielen in een "dobbelsteen 4"-indeling, die de wanden aangeven: plat, lessenaar (schuine kopgevels) of zadel
exact gecentreerd op de vloer — spoorbreedte/wielbasis/wieldiameter (nok). Elk dakvlak is een eigen dek met de balken als sporen en een eigen
instelbaar, geen interactie met de balkposities). PDF-blad; doorvoeren gaan naar het vlak waarin ze vallen. Bedekking per
- **Single point of truth wand/vloer/unit.** Alle reken- en 3D-logica zit in unit: dakleer, of bij een hellend dak riet (180 mm, 3,8 kg/m²); de
`WallModel`/`FloorModel`. De losse editors én de unit roepen die aan, dus dakrand schuift dan mee omhoog. De dakrand
een wijziging in de wand- of vloerlogica geldt automatisch overal. De unit (boeidelen/daktrim, spots) loopt als één rand door en volgt de helling.
bewaart per onderdeel een gewone wand-/vloer-state; wandbreedtes worden Is een dak langs de naad minstens een boeideelhoogte hoger dan het
afgeleid uit vloermaat + wanddiktes + hoekaansluiting, openingen houden aangrenzende, dan krijgt het een eigen rand rondom (boven het lage dak
hun anker (links/midden/rechts). "Opslaan als" bij een unit geeft JSON + zonder spots). De rand van het lage dak loopt dan door tot de gevel van
één samenhangende PDF: bovenaanzicht unit (U-1), vloer (V-1), elke wand het hoge, of langs een zijgevel tot de volle overstek (onder de hoge
(W-1…W-4, via WallPdf/FloorPdf) en een totalenblad (balken, zaaglijst, rand). Boeideel en daktrim steken 80 mm boven het dakleer uit.
glaswol, plaatwerk, gewichten). Projectgegevens van de unit staan in - **Gevel:** gevelbekleding per woning, met override per wand: rabat
`state.project` en gelden voor alle bladen. (vochtdoek + kruislat) of steen (181 texturen). Steen is overal een
- **Standaarden (WallModel).** Muurbalk 38 x 235 mm (stijlen én regels), steenstrip op een wit isolatieblok, samen 110 mm (`WallModel.STONE`).
ingekocht in 3600/4200/4800/5400 mm; een zaagplan (`planStockCutting` in Het trasraam (cementplaat of een eigen steen) komt onder beide, dus
geometry.js) kiest per staaf de lengte met het minste snijverlies — bij een twee stenen kan. Latwerk, doek en metselwerk lopen per gevel door over
unit over alle wanden samen. Stukken langer dan 5400 worden opgeknipt. unit-naden. Sandwichpanelen rondom, 600 mm de grond in.
Elke wandkop heeft een dubbele hoekstijl (2 x 38 mm). De app start met een - **Verlichting:** boeideel-spots of gevellampen (per gevel verdeeld,
unit. override per wand) en binnenspots in een raster per unit.
- **Woning (v0.2).** Bestand → Nieuw → Woning (1 unit) of Woning L-vorm. Een - **3D:** weergavefilters (o.a. Vloerplan: wanden afgesneden op 500 mm,
unit koppel je aan een zijde van een andere unit (uitlijning start/midden/ snede wit afgedekt), binnenzijde van de wanden in een verfkleur (globaal),
eind + verschuiving). Op de naad vervalt de wand van beide units over het omgeving Ontwerp/Dag/Nacht, Render met lampen als echte lichtbronnen.
gedeelde stuk; een wand kan daardoor in meerdere stukken uiteenvallen - **Uitvoer:** JSON opslaan/openen en een samenhangende PDF (aanzichten
(bijv. A-W2a/b), haakse wanden lopen dan door tot de vloerrand. Binnen- noord/oost/zuid/west als vlakke render met legenda afwerking, plattegrond,
wanden teken je in de plattegrond (standaard 100 mm, spaanplaat beide vloeren, wandstukken, binnenwanden, totalen).
zijden) en bewerk je met de gewone wand-editor. Een wandstuk dat aan een
naad eindigt loopt de naad in door met de dikte van de haakse buurwand, ## Bekende beperkingen
zodat binnenhoeken (L-vorm) dicht zijn. Zijden heten naar windrichting
t.o.v. het bovenaanzicht (boven = noord): voor = noord, achter = zuid, - Tijdelijk (verwijderen voor productie): zaagmachine-overzicht (zaagmeters bij
links = west, rechts = oost (intern blijven de oude sleutels). Oude unit-JSON's kunnen in 2400 m/u, zaagsneden, hoeken) in de app en op het totalenblad (`SAW_M_PER_H`).
een woning worden geïmporteerd. Units kunnen (nog) niet gedraaid worden. - Tijdelijk: een nieuwe woning is het testontwerp (L-vorm, lessenaar met
- **Mijlpaal v0.4 — gevelopbouw.** Samenvatting van de v0.3.11–0.3.19-iteraties: riet); uit te zetten met `TEST_DEFAULT` in `js/house/house-model.js`.
kruislat-latwerk op vochtdoek (richting gevelbekleding globaal), lampen op de - Units kunnen niet gedraaid worden.
afgewerkte gevel (+52 mm), logo-watermerk op het doek, trasraam (cement- - Getekende binnenwanden volgen de dakvorm (nog) niet.
gebonden plaat, 350 mm vanaf het loopvlak), sandwichpanelen rondom (600 mm de - De dak-editor toont het dek in de plattegrond (niet per schuin dakvlak).
grond in), hoekdoorloop van de buitenlagen over de hoekstijlen, en latwerk/ - Geen schaduw per lamp in de render (browserlimiet).
doek per doorlopende gevel over unit-naden heen. Details per onderdeel hieronder. - Eigen OrbitControls: roteren/zoomen/pannen, geen damping.
- **Plat dak (v0.3).** Elke unit heeft een dak (tweede laag) dat standaard
de vloermaat volgt, maar een eigen maat/verschuiving mag krijgen. Opbouw = ## Versie
vloer 180° gespiegeld (OSB als plafond onder, balken, dakleer bovenop); het
dak wordt bewerkt met de vloer-editor in dakmodus. De dakrand is woning- `APP_VERSION` in `js/app.js`: laatste cijfer per iteratie, middelste per
breed: boeidelen (overstek 200–400 mm vanaf de dakrand = standaard de mijlpaal (met git-tag), eerste bij live-gang. De changelog staat in git.
gevel, 300 mm hoog, spots op 40% van de overstek, op elke (unit-)hoek en
daartussen verdeeld met min/max h.o.h.) of een daktrim van 80 mm. De rand
loopt als één geheel over de naden tussen units. Het dak ligt op de hoogste
wandbovenkant van de unit; bij units met verschillende hoogtes ligt de
dakrand op het hoogste dak.
- **Dakrand & buitenverlichting (v0.3.3).** Boeidelen aan/uit per unit
(anders daktrim); de rand wordt per ribbe opgebouwd (in verstek, geen
zichtbare naad). Verlichting is woning-breed: type (geen / boeideel-spots /
gevellampen), lichtrichting en alle afstanden. Gevellampen worden per
GEVEL verdeeld (aansluitende wandstukken in hetzelfde vlak, ook over een
naad tussen units), niet per wand: op lamphoogte (standaard 1950) alleen op
vrije stukken >= 2000 mm (openingen incl. raamwerk eraf), eerste/laatste
300 mm van hoek/opening, daartussen min/max h.o.h.; smallere stukken krijgen
geen lampen. Gevellampen en boeideel-spots sluiten elkaar uit. De min.
h.o.h. geldt over alle lampen van een gevel samen (ook bij afstand hoek/
opening en overrides): te dicht bij elkaar = samengevoegd tot één lamp in
het midden. Per wandzijde blijft een override: automatisch / 500 mm
naast elke opening / geen. Standaard unithoogte 2600 mm.
- **3D-weergave (v0.3.5).** Filters als dropdown met vinkjes. Woning:
Beplating (wandplaten, vloer- en plafondplaten, dakleer, boeideel/daktrim),
Isolatie, Dak, Lampen. "Volle render": avondscène met maaiveld, elke
gevellamp (per lichtrichting) en boeideel-spot is een echte SpotLight
(zonder schaduwen, om het licht te houden); de nep-lichtkegels zijn dan
verborgen.
- **Latwerk gevelbekleding (v0.3.11).** Bij vochtdoek komt er een kruislat
op (WallModel.computeBattens): latten 20x30 mm, handelslengte 4000, 400 mm
h.o.h. in beide richtingen, uitgespaard rond openingen en afgekapt op de
(schuine) bovenrand. De bovenste laag staat haaks op de gevelbekleding
(WEO/Novalit, 12 mm; richting per losse wand, in een woning voorlopig
globaal als woning-instelling). Gevellampen hangen op de afgewerkte gevel:
wandvlak + kruislat (40) + bekleding (12) = 52 mm naar buiten. Cement-gebonden
platen (steenstrips) krijgen geen latwerk. Latten tellen mee in gewicht,
specificaties, wand-PDF en woningtotalen; zichtbaar met "Beplating".
- **Vochtdoek-bedrukking (v0.3.13).** Net als op de echte doeken staat het logo
als medium-grijs watermerk (geen kleur) onder 45° op het vochtdoek, 1,5 m
breed, herhaald per tegel van 2 m (WallModel.createMaterials, CanvasTexture).
- **Trasraam (v0.3.14).** Woning-instelling (aan/uit + hoogte, standaard 350 mm
vanaf Y=0 van de vloer = het beloopbare vlak / bovenkant vloer). Onderaan
elke vochtdoek-gevel komt een strook cement-gebonden plaat (montage-
achterkant), vóór het doek; het doek loopt er ongewijzigd achter door en
het latwerk begint erboven. Zelfde plaat- en uitsparingslogica als de
buitenplaten, dus openingen blijven gerespecteerd (WallModel.trasraamFor,
build3D opts.trasraam, computeBattens). Telt mee in gewicht, wand-PDF en de
woningtotalen ("Cementplaat (trasraam)").
- **Hoekdoorloop buitenlagen (v0.3.18).** Een wand die tussen twee doorlopende
wanden past, bedekt met zijn buitenlagen ook de kopse kant (hoekstijlen) van
die wanden: UnitModel geeft per wand(stuk) skinExt { left, right } (= dikte
van de doorlopende wand, 0 bij naden/vrije einden), WallModel.cornerExt telt
per laag de eigen diepte erbij. Latwerk en trasraam lopen door; vochtdoek
en cementplaat (liggen in de beplatingsruimte) krijgen een strook net vóór
het wandvlak.
- **Latwerk en doek per gevel (v0.3.19).** HouseModel.assignFacades groepeert
collineaire, aansluitende buitenwandstukken over alle units tot gevels
(groupFacadeRuns in core/geometry.js, ook gebruikt door de buitenverlichting)
en geeft elk stuk p.facade { u0, extStart, isEnd }. Het verticale
latten-raster (400 h.o.h.) en het watermerk op het doek lopen daardoor over
unit-naden door; een eindlat komt alleen aan het einde van de gevel.
- **Sandwichpanelen (v0.3.16).** Woning-instelling aan/uit. SandwichModel
(js/sandwich/sandwich-model.js) legt één doorlopende rand (in verstek) om de
vereniging van alle unit-vloeren: 40 mm dik, van het loopvlak (bovenkant
vloer) 600 mm naar beneden, de grond in. Plaat 495 x 1000 x 40 (9 kg),
verticaal: één plaat per 495 mm gevel, 1000 afgezaagd op 600. Naden per
495 mm; zichtbaar met "Beplating"; m2, aantal platen en gewicht (hele
platen) in de woningtotalen.
- **Openingtypes.** Raam (500x1900), deur (900x2150) en voordeur (1150x2150);
type kiezen zet de standaardmaat, daarna vrij aan te passen. De app start
met een L-woning met een voordeur (noord, unit A) en 3 ramen (zuid, unit B).
- **Woning-instellingen.** Regelwerk-h.o.h. (min/max) geldt globaal voor alle
buitenwanden resp. alle binnenwanden; in de wand-editor zijn die velden
binnen een woning vergrendeld.
- **Versienummer** staat als enkele constante (`APP_VERSION`) in `app.js`.
Conventie: laatste cijfer per kleine iteratie, middelste per mijlpaal
(aangegeven in chat), eerste bij live-gang.
+9 -2
View File
@@ -1,2 +1,9 @@
Bestemmingsmap voor toekomstige assets: GLB-modellen (ramen/deuren), Assets voor de 3D-weergave en de PDF:
texturen/bumpmaps, e.d. Nog leeg. - logo.svg / logo-animated.svg logo (splash, about); PDF-logo staat als data in js/core/logo-data.js
- skybox.webp equirectangulair panorama dag (4096x2048), "Lucht: Dag" (core/skybox.js)
- skybox-night.webp equirectangulair panorama nacht (4096x2048), "Lucht: Nacht"
- tiles.jpg tegeltextuur (1024x1024) voor de ronde vloer onder het object
- textures/buitenmuur/ steen voor het trasraam: "<code> - Witte voeg.jpg" (2062x1125, 2 mm/px,
naadloos), voorvertoning in thumb/32|64|128/*.png (WallModel.TRASRAAM_STONES)
- textures/vloer/ vloerafwerking (FloorModel.FINISHES), bijv. visgraat_001.jpg (1500x1500, tegel 3 m); thumb/32|64|128/*.png
- textures/dak/ dakbedekking: riet_<nr>.jpg (1024x1024, tegel 1 m); nummers in RoofModel RIET.nrs; thumb/32|64|128/*.png
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 698 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 753 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 909 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 711 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 936 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 723 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 743 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 709 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 708 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 831 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 548 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 759 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 645 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 462 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 925 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 860 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 865 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 924 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 835 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 787 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 538 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 772 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 957 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 846 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 853 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 642 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 637 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 941 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 767 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 801 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 924 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 630 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 633 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 746 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 871 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 830 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 883 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 914 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 958 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 976 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 979 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 907 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 990 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 935 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 920 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 771 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 960 KiB

Some files were not shown because too many files have changed in this diff Show More