10 KiB
10 KiB
Tectum — configurator Van Emous Mantelzorgwoningen (intern)
Configurator voor mantelzorgwoningen: wand, vloer en woning (gekoppelde units) met 2D, 3D, specificaties en PDF-tekenbladen.
Copyright © 2026 Machiel Heinen. Alle rechten voorbehouden; gebruik uitsluitend met schriftelijke toestemming. Zie LICENTIE.md. Elk bronbestand begint met deze copyright-kop.
Draaien
./start.sh # of: python3 -m http.server 8000
Open http://localhost:8000. Elke statische webserver volstaat; geen
build-stap. Direct openen via file:// werkt niet (texturen/lucht).
Structuur
index.html app-shell: ribbon, splashscreen
css/app.css alle stijl
js/vendor/ three.js r128, eigen OrbitControls, jsPDF
js/core/ gedeelde helpers: geometrie, bouwfasen, ribbon, UI-kit, PDF-bladen,
labels, camerageheugen, weergavefilter, skybox, licentie, logo
js/wall/ WallModel (logica) + wand-PDF + wand-editor
js/floor/ FloorModel (logica) + vloer-PDF + vloer-editor
js/roof/ RoofModel: dak (plat/lessenaar/zadel) + dakrand (boeidelen/daktrim)
js/lighting/ LightingModel: gevellampen, boeideel-spots, binnenspots
js/elektra/ ElektraModel + ElektraPdf: meterkast, schakelaars (letters), wcd, groepen, leidingen
js/sandwich/ SandwichModel: sandwichpanelen rondom
js/unit/ UnitModel: 1 vloer + 4 wanden, naden, wandstukken
js/house/ HouseModel (woning) + woning-PDF + woning-editor
js/app.js menubalk, versienummer, actieve editor
json/defaults/ referentie-JSON's (niet runtime ingeladen)
assets/ logo, texturen, skybox
Uitgangspunten
- Eén bron per logica. Rekenwerk en 3D-opbouw zitten alleen in de
*Model/*Pdf-modules; editors en woning hergebruiken die. - Geen ES-modules, geen CDN. Gewone
<script>-tags in vaste volgorde (zieindex.html), alle libraries lokaal. - Assen/zijden. Bovenaanzicht boven = noord: voor = noord, achter = zuid, links = west, rechts = oost (interne sleutels blijven voor/achter/…).
- Hoogtes gelden vanaf bovenkant vloer (loopvlak).
- Bouwfasen (
BuildStages): regelwerk → elektra (buizen, dozen, meterkast) → beplating → vochtdoek → latwerk → gevel & dak → afgewerkt, de volgorde in de hal. De 3D toont de gekozen fase; lagen die daarin aan beide zijden zijn ingesloten worden niet gebouwd (stijlen tussen spaanplaat en doek, latten en doek achter de rabat, sporen tussen plafond en dakbedekking). Specificaties en totalen rekenen altijd met alle lagen. - Invoer volgt de logica: de dakvorm is een eigenschap van de unit (plat/lessenaar/zadel, richting, goot- en nokhoogte of helling); de wanden volgen.
Functionaliteit
- Wand: openingen (raam/deur/voordeur) met ankers, ook boven elkaar (raam boven een deur; stijlen ertussen van dorpel tot dorpel), regelwerk 38x235 met dubbele hoekstijlen en een dubbele stijl naast deuren, zaagplan op handelslengtes, spaanplaat binnen, vochtdoek (met kruislat en trasraam) of cementplaat buiten.
- Elektra (
elektra/): meterkast (3×25 A) bij de voordeur, schakelaars met letter (A binnen, B buiten, per unit een eigen; dezelfde letter bij de lampen erop), dubbele wcd's per unit, apparaten met eigen groep (kookgroep perilex, wasmachine, droger, warmtepomp, optioneel oven/vaatwasser). Groepenverklaring met fasen en aardlekschakelaars, leidingen via stijlen en plafond naar de meterkast (strekkende meters per type, draad, buis, steekverbinders op module-naden), materiaallijst en eigen PDF-blad. Buizen minstens 50 mm uit elkaar (gebundeld alleen het laatste stuk naar de meterkast). Vloer-wcd's met leiding door de vloer. Elektra ook op de PDF-bladen per wand, vloer en dakvlak (plafond). Alles verplaatsbaar door te slepen in de plattegrond. Kosten (groep Elektra): buis + draad per meter, boorgaten (geteld op stijlen, regels en balken), dozen, afmonteren, groepenkast en keuring. - Kozijnen (
wall/kozijn-model.js): per opening een vulling (geen, raam met vast glas en optioneel ventilatierooster, of deur met dorpel en optionele glasstrook; zij- en bovenlicht vullen de rest van een grote opening), kleur buiten en binnen (wit, grijs, antraciet, zwart). Volgt de maat van de opening, ook een schuine bovenzijde. - Dakvorm/wandhoogte: per unit een dakvorm (Unit › Dakvorm: plat,
lessenaar, zadel, mansarde of wolfsdak, met schuiven en hellingshoek).
Daaruit volgen de wanden: de kopgevels krijgen de daklijn (bij mansarde
met twee knikken, bij een wolfsdak afgeknot op het wolfseind, met
daarboven driehoekige wolfseinden met de dakhelling tot de nok, met een
rechte nok ertussen), de haakse wanden staan vlak op de goothoogte. Het
bovenste deel van een wolfsdak is gewoon houtwerk: sporen, hoekkepers,
nokbalk en kopbalken (ook in zaaglijst, specificaties en kosten).
Goot en nok gelden over de volle vloermaat (goot boven de buitenkant van
de gevel); staat de kopgevel tussen de haakse wanden, dan loopt zijn
daklijn daar precies op aan. Knik en wolfseind schalen mee met goot en
nok (verhouding). Bij een knik (mansarde) sluiten de dakvlakken in
verstek aan. De PDF heeft voor een wolfsdak een eigen blad met het
bovenste deel (bovenaanzicht houtwerk + stuklijst).
Grenzen (
UnitModel.LIMITS): nok max 5 m, goot / plat dak max 3 m (vanaf bovenkant vloer tot onderkant dak), unit max 4,3 x 14 m. Platte daken van verschillende hoogte krijgen elk hun eigen boeideel (versprongen, het lage loopt door tot onder het hoge). Wijzig je een wandhoogte in de wand-editor, dan geldt dezelfde regel vanuit die wand. - Vloer: balken, cirkelvormige doorvoeren, OSB, optioneel chassis; in de woning een vloerafwerking (textuur, bijv. visgraat).
- Woning: units koppelen aan een zijde (uitlijning + verschuiving); op naden vervallen de buitenwanden en komt een naadwand met deur: midden op de naad in twee delen (één per unit), of als één binnenwand geheel in unit A of B. De hoogte volgt per deel de daklijn van zijn unit. Staat een unit met een hogere daklijn tegen een lager dak, dan krijgt zijn buitenwand aan de naadzijde een opbouw vanaf de bovenkant van het lage dak (ramen daar teken je op die buitenwand) en stopt de naadwand op die hoogte. Loopt het lage dak langs de naad schuin, dan loopt de naadwand door en krijgt het uitstekende stuk buitenafwerking (vochtdoek + latwerk). Binnenwanden teken je in de plattegrond.
- Dak: per unit opgebouwd als gespiegelde vloer + dakleer, in de vorm die de wanden aangeven: plat, lessenaar (schuine kopgevels) of zadel (nok). Elk dakvlak is een eigen dek met de balken als sporen en een eigen PDF-blad; doorvoeren gaan naar het vlak waarin ze vallen. Opbouw: plafondplaat (OSB) binnen, sporen, dakbeschot (OSB 18 mm) bovenop en daarop de bedekking per unit: dakleer, of bij een hellend dak riet (180 mm, 3,8 kg/m²) of felsplaten (staande naad, zink/antraciet/zwart); de dakrand schuift dan mee omhoog. De dakrand (boeidelen/daktrim, spots) loopt als één rand door en volgt de helling. Is een dak langs de naad minstens een boeideelhoogte hoger dan het aangrenzende, dan krijgt het een eigen rand rondom (boven het lage dak zonder spots). De rand van het lage dak loopt dan door tot de gevel van het hoge, of langs een zijgevel tot de volle overstek (onder de hoge rand). Boeideel en daktrim steken 80 mm boven het dakleer uit.
- Gevel: gevelbekleding per woning, met override per wand: rabat
(vochtdoek + kruislat + rabat 12 mm, kleur per woning, getekend als
plankentextuur die over naden doorloopt) of steen (181 texturen). Steen is overal een
steenstrip op een wit isolatieblok, samen 110 mm (
WallModel.STONE). Het trasraam (cementplaat of een eigen steen) komt onder beide, dus twee stenen kan. Latwerk, doek en metselwerk lopen per gevel door over unit-naden. Sandwichpanelen rondom, 600 mm de grond in. - Verlichting: boeideel-spots of gevellampen (per gevel verdeeld, override per wand) en binnenspots in een raster per unit.
- Ribbon (
core/ribbon.js, vervangt de menubalk): Bestand · Start · Gevel · Dak · Binnen · Constructie · Verlichting · Rapport · Beeld · Extra, plus een gekleurd tabblad voor de selectie (unit, wandstuk, binnenwand of naadwand) dat vanzelf opent. Velden staan in groepen naast elkaar, met schuiven voor maten met een logisch bereik. Dubbelklik op een tabblad klapt de ribbon in. Plattegrond en 3D gebruiken de volle breedte; tabblad Rapport toont het rapport (transport per unit, gewicht, afmetingen, kosten, hout, plaatwerk, met staafdiagrammen) in plaats van de plattegrond. - 3D: schuif Bouwfase linksonder; Beeld › Tonen: Dak/Lampen; Beeld › Doorsnede (wanden afgesneden op een instelbare hoogte, schuif in de ribbon en onder de 3D, snede wit afgedekt), binnenzijde in een verfkleur (afgewerkte fase), omgeving Ontwerp/Dag/Nacht, Render met lampen als echte lichtbronnen.
- Transport: per unit buitenmaat (incl. gevelafwerking), hoogte en gewicht (vloer/wanden/dak) met een indicatieve breedteklasse.
- Uitvoer: JSON opslaan/openen en een samenhangende PDF (aanzichten noord/oost/zuid/west als vlakke render met legenda afwerking, plattegrond, vloeren, wandstukken, binnenwanden, totalen).
Bekende beperkingen
- Tijdelijk (verwijderen voor productie): zaagmachine-overzicht (zaagmeters bij
2400 m/u, zaagsneden, hoeken) in de app en op het totalenblad (
SAW_M_PER_H). - Tijdelijk: een nieuwe woning is het voorbeeldontwerp "Vlinderwoning"
(92 m², drie units, vlinderdak met riet + platte tuinkamer, ook als
json/premade/vlinderwoning.json); uit te zetten metTEST_DEFAULTinjs/house/house-model.js. - Units kunnen niet gedraaid worden.
- Getekende binnenwanden volgen de dakvorm (nog) niet.
- De dak-editor toont het dek in de plattegrond (niet per schuin dakvlak).
- Geen schaduw per lamp in de render (browserlimiet).
- Eigen OrbitControls: roteren/zoomen/pannen, geen damping.
Versie
APP_VERSION in js/app.js: laatste cijfer per iteratie, middelste per
mijlpaal (met git-tag), eerste bij live-gang. De changelog staat in git.