15 Commits
Author SHA1 Message Date
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
755 changed files with 3081 additions and 1240 deletions
+94 -222
View File
@@ -1,237 +1,109 @@
# 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 (plattegrond,
(bijv. A-W2a/b), haakse wanden lopen dan door tot de vloerrand. Binnen- vloeren, wandstukken, binnenwanden, totalen).
wanden teken je in de plattegrond (standaard 100 mm, spaanplaat beide
zijden) en bewerk je met de gewone wand-editor. Een wandstuk dat aan een ## Bekende beperkingen
naad eindigt loopt de naad in door met de dikte van de haakse buurwand,
zodat binnenhoeken (L-vorm) dicht zijn. Zijden heten naar windrichting - Tijdelijk: een nieuwe woning is het testontwerp (L-vorm, lessenaar met
t.o.v. het bovenaanzicht (boven = noord): voor = noord, achter = zuid, riet); uit te zetten met `TEST_DEFAULT` in `js/house/house-model.js`.
links = west, rechts = oost (intern blijven de oude sleutels). Oude unit-JSON's kunnen in - Units kunnen niet gedraaid worden.
een woning worden geïmporteerd. Units kunnen (nog) niet gedraaid worden. - Getekende binnenwanden volgen de dakvorm (nog) niet.
- **Mijlpaal v0.4 — gevelopbouw.** Samenvatting van de v0.3.11–0.3.19-iteraties: - De dak-editor toont het dek in de plattegrond (niet per schuin dakvlak).
kruislat-latwerk op vochtdoek (richting gevelbekleding globaal), lampen op de - Geen schaduw per lamp in de render (browserlimiet).
afgewerkte gevel (+52 mm), logo-watermerk op het doek, trasraam (cement- - Eigen OrbitControls: roteren/zoomen/pannen, geen damping.
gebonden plaat, 350 mm vanaf het loopvlak), sandwichpanelen rondom (600 mm de
grond in), hoekdoorloop van de buitenlagen over de hoekstijlen, en latwerk/ ## Versie
doek per doorlopende gevel over unit-naden heen. Details per onderdeel hieronder.
- **Plat dak (v0.3).** Elke unit heeft een dak (tweede laag) dat standaard `APP_VERSION` in `js/app.js`: laatste cijfer per iteratie, middelste per
de vloermaat volgt, maar een eigen maat/verschuiving mag krijgen. Opbouw = mijlpaal (met git-tag), eerste bij live-gang. De changelog staat in git.
vloer 180° gespiegeld (OSB als plafond onder, balken, dakleer bovenop); het
dak wordt bewerkt met de vloer-editor in dakmodus. De dakrand is woning-
breed: boeidelen (overstek 200–400 mm vanaf de dakrand = standaard de
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)
- textures/dak/ dakbedekking: riet_<nr>.jpg (1024x1024, tegel 1 m); nummers in RoofModel RIET.nrs
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