From 23bfe153a28b326d00de936571a9f4ea8603fb43 Mon Sep 17 00:00:00 2001 From: Machiel Date: Wed, 30 Sep 2026 22:29:57 +0200 Subject: [PATCH] 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 --- README.md | 5 +- assets/README.txt | 4 +- assets/textures/dak/thumb/128/riet_001.png | Bin 0 -> 36544 bytes assets/textures/dak/thumb/128/riet_002.png | Bin 0 -> 36491 bytes assets/textures/dak/thumb/128/riet_003.png | Bin 0 -> 35550 bytes assets/textures/dak/thumb/32/riet_001.png | Bin 0 -> 2049 bytes assets/textures/dak/thumb/32/riet_002.png | Bin 0 -> 2013 bytes assets/textures/dak/thumb/32/riet_003.png | Bin 0 -> 1964 bytes assets/textures/dak/thumb/64/riet_001.png | Bin 0 -> 8764 bytes assets/textures/dak/thumb/64/riet_002.png | Bin 0 -> 8695 bytes assets/textures/dak/thumb/64/riet_003.png | Bin 0 -> 8471 bytes .../textures/vloer/thumb/128/visgraat_001.png | Bin 0 -> 26284 bytes .../textures/vloer/thumb/32/visgraat_001.png | Bin 0 -> 1815 bytes .../textures/vloer/thumb/64/visgraat_001.png | Bin 0 -> 7121 bytes css/app.css | 10 + index.html | 18 ++ js/app.js | 10 +- js/core/pdf-sheet.js | 23 +- js/core/walk-controls.js | 102 ++++++ js/floor/floor-model.js | 11 +- js/house/house-model.js | 152 +++++++-- js/house/house-pdf.js | 304 +++++++++++++++++- js/house/house.js | 138 +++++++- js/lighting/lighting-model.js | 19 +- js/roof/roof-model.js | 42 ++- js/wall/wall-model.js | 57 +++- 26 files changed, 818 insertions(+), 77 deletions(-) create mode 100644 assets/textures/dak/thumb/128/riet_001.png create mode 100644 assets/textures/dak/thumb/128/riet_002.png create mode 100644 assets/textures/dak/thumb/128/riet_003.png create mode 100644 assets/textures/dak/thumb/32/riet_001.png create mode 100644 assets/textures/dak/thumb/32/riet_002.png create mode 100644 assets/textures/dak/thumb/32/riet_003.png create mode 100644 assets/textures/dak/thumb/64/riet_001.png create mode 100644 assets/textures/dak/thumb/64/riet_002.png create mode 100644 assets/textures/dak/thumb/64/riet_003.png create mode 100644 assets/textures/vloer/thumb/128/visgraat_001.png create mode 100644 assets/textures/vloer/thumb/32/visgraat_001.png create mode 100644 assets/textures/vloer/thumb/64/visgraat_001.png create mode 100644 js/core/walk-controls.js diff --git a/README.md b/README.md index 8999318..e9e4374 100644 --- a/README.md +++ b/README.md @@ -90,11 +90,14 @@ assets/ logo, texturen, skybox - **3D:** weergavefilters (o.a. Vloerplan: wanden afgesneden op 500 mm, snede wit afgedekt), binnenzijde van de wanden in een verfkleur (globaal), omgeving Ontwerp/Dag/Nacht, Render met lampen als echte lichtbronnen. -- **Uitvoer:** JSON opslaan/openen en een samenhangende PDF (plattegrond, +- **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 testontwerp (L-vorm, lessenaar met riet); uit te zetten met `TEST_DEFAULT` in `js/house/house-model.js`. - Units kunnen niet gedraaid worden. diff --git a/assets/README.txt b/assets/README.txt index 527d19f..0adc399 100644 --- a/assets/README.txt +++ b/assets/README.txt @@ -5,5 +5,5 @@ Assets voor de 3D-weergave en de PDF: - tiles.jpg tegeltextuur (1024x1024) voor de ronde vloer onder het object - textures/buitenmuur/ steen voor het trasraam: " - 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_.jpg (1024x1024, tegel 1 m); nummers in RoofModel RIET.nrs +- textures/vloer/ vloerafwerking (FloorModel.FINISHES), bijv. visgraat_001.jpg (1500x1500, tegel 3 m); thumb/32|64|128/*.png +- textures/dak/ dakbedekking: riet_.jpg (1024x1024, tegel 1 m); nummers in RoofModel RIET.nrs; thumb/32|64|128/*.png diff --git a/assets/textures/dak/thumb/128/riet_001.png b/assets/textures/dak/thumb/128/riet_001.png new file mode 100644 index 0000000000000000000000000000000000000000..ee14e3ac7763afc5d4e70d2f49490d7eee25a9bf GIT binary patch literal 36544 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

`Yd>DnpI3hseD5Vq~s|GWM5wTj% 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 DO_7U$ literal 0 HcmV?d00001 diff --git a/assets/textures/dak/thumb/128/riet_003.png b/assets/textures/dak/thumb/128/riet_003.png new file mode 100644 index 0000000000000000000000000000000000000000..2892ee603a1af765fdf1d0412b1356003da64edc GIT binary patch literal 35550 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

NZ)WyYH;AUUs=QF-zI$)({gd)^3@4{v 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 Ytr*Z7e}C}aLIbe1ya{Qxxclh;01vu6B>(^b literal 0 HcmV?d00001 diff --git a/assets/textures/vloer/thumb/32/visgraat_001.png b/assets/textures/vloer/thumb/32/visgraat_001.png new file mode 100644 index 0000000000000000000000000000000000000000..a99180bc7d9d35e31d05f3f4428d4f2903e2f791 GIT binary patch literal 1815 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 aS+#yS^wjHIqt$Z42Lk;LKs?`5SN{(?Hlb+% literal 0 HcmV?d00001 diff --git a/css/app.css b/css/app.css index ae97cdd..9740b0a 100644 --- a/css/app.css +++ b/css/app.css @@ -644,3 +644,13 @@ h1 { display: flex; align-items: center; gap: 7px; font-size: 12px; font-weight: /* Voorvertoning steen trasraam (woning > Gevel) */ .hs-stone-preview { display: block; width: 128px; height: auto; margin: 4px 0 8px; border: 1px solid var(--border, #ccc); border-radius: 3px; } + +/* Lopen (first person, derde weergavestand): uitleg onderin de 3D. */ +.walk-hint { display: none; position: absolute; left: 50%; bottom: 14px; transform: translateX(-50%); padding: 6px 12px; border-radius: 4px; + background: rgba(0, 0, 0, 0.6); color: #fff; font-size: 12px; pointer-events: none; white-space: nowrap; z-index: 5; } +.walk-hint.show { display: block; } + +/* Beeld > Camera: uitleg (geen actie) */ +#app-bar .submenu .menu-info { padding: 6px 12px 2px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: .04em; color: var(--text-muted, #8a8f96); } +#app-bar .submenu .menu-help { cursor: default; opacity: .85; } +#app-bar .submenu .menu-help:hover { background: transparent; color: var(--nav-link-color); } diff --git a/index.html b/index.html index 4be8d40..f5fe54f 100644 --- a/index.html +++ b/index.html @@ -55,6 +55,23 @@

+ @@ -116,6 +133,7 @@ + diff --git a/js/app.js b/js/app.js index 48c417a..84a9bd8 100644 --- a/js/app.js +++ b/js/app.js @@ -4,7 +4,7 @@ * Alle rechten voorbehouden. Gebruik uitsluitend met schriftelijke toestemming. * Zie LICENTIE.md. */ -const APP_VERSION = '0.4.15'; +const APP_VERSION = '0.4.16'; // 0.0.X per kleine iteratie, 0.X.0 per mijlpaal, X.0.0 bij live-gang. let tabs = []; @@ -39,6 +39,7 @@ function updateEditMenuState() { document.getElementById('menu-mirror-h').classList.toggle('disabled', !has('mirrorHorizontal')); document.getElementById('menu-3d-fullscreen').classList.toggle('disabled', !has('toggleFullscreen3D')); document.getElementById('menu-2d-fullscreen').classList.toggle('disabled', !has('toggleFullscreen2D')); + document.getElementById('menu-walk').classList.toggle('disabled', !has('toggleWalk')); document.getElementById('menu-project-props').classList.toggle('disabled', !has('openProjectProperties')); } @@ -199,6 +200,11 @@ function wireMenu() { if (currentEditor && typeof currentEditor.toggleFullscreen3D === 'function') currentEditor.toggleFullscreen3D(); closeAllMenus(); }); + document.getElementById('menu-camera-item').addEventListener('click', (e) => e.stopPropagation()); + document.getElementById('menu-walk').addEventListener('click', () => { + if (currentEditor && typeof currentEditor.toggleWalk === 'function') currentEditor.toggleWalk(); + closeAllMenus(); + }); document.getElementById('menu-2d-fullscreen').addEventListener('click', () => { if (currentEditor && typeof currentEditor.toggleFullscreen2D === 'function') currentEditor.toggleFullscreen2D(); closeAllMenus(); @@ -274,6 +280,8 @@ function wireHotkeys() { toggleBrowserFullscreen(); } else if (e.key.toLowerCase() === 'h') { if (currentEditor && typeof currentEditor.mirrorHorizontal === 'function') currentEditor.mirrorHorizontal(); + } else if (e.key.toLowerCase() === 't' && e.shiftKey) { + if (currentEditor && typeof currentEditor.toggleWalk === 'function') currentEditor.toggleWalk(); } else if (e.key.toLowerCase() === 't') { if (currentEditor && typeof currentEditor.toggleFullscreen3D === 'function') currentEditor.toggleFullscreen3D(); } else if (e.key.toLowerCase() === 'r') { diff --git a/js/core/pdf-sheet.js b/js/core/pdf-sheet.js index cd53417..cc91681 100644 --- a/js/core/pdf-sheet.js +++ b/js/core/pdf-sheet.js @@ -22,6 +22,27 @@ window.PdfSheet = (() => { tekenaar: 'inp-proj-tekenaar', titel: 'inp-proj-titel', element: 'inp-proj-element', opmerking: 'inp-proj-opmerking' }; + // Afbeeldingen (bijv. textuur-voorvertoningen) voor in de PDF. generate() + // is synchroon, dus vooraf laden (preloadImage, bijv. zodra een materiaal + // gekozen is); imageData geeft de data-URL, of null als hij (nog) niet + // geladen is (dan tekent de aanroeper een kleurvlak). + const imageCache = {}; + function preloadImage(url) { + if (!url || url in imageCache || typeof Image === 'undefined' || typeof document === 'undefined') return; + imageCache[url] = null; + const img = new Image(); + img.onload = () => { + try { + const c = document.createElement('canvas'); + c.width = img.naturalWidth; c.height = img.naturalHeight; + c.getContext('2d').drawImage(img, 0, 0); + imageCache[url] = c.toDataURL('image/png'); + } catch (e) { /* laat null: kleurvlak */ } + }; + img.src = url; + } + const imageData = (url) => (url && imageCache[url]) || null; + function createDoc() { const { jsPDF } = window.jspdf; return new jsPDF({ orientation: 'landscape', unit: 'mm', format: 'a3' }); @@ -130,5 +151,5 @@ window.PdfSheet = (() => { return y; } - return { COLORS, createDoc, readProjectFromDom, dimLine, titleBlock, table }; + return { COLORS, preloadImage, imageData, createDoc, readProjectFromDom, dimLine, titleBlock, table }; })(); diff --git a/js/core/walk-controls.js b/js/core/walk-controls.js new file mode 100644 index 0000000..e6ca121 --- /dev/null +++ b/js/core/walk-controls.js @@ -0,0 +1,102 @@ +/*! + * Tectum + * Copyright © 2026 Machiel Heinen. + * Alle rechten voorbehouden. Gebruik uitsluitend met schriftelijke toestemming. + * Zie LICENTIE.md. + */ +// ============================================================ +// core/walk-controls.js — lopen in de 3D-weergave (first person). +// W/S of pijl omhoog/omlaag vooruit/achteruit +// A/D opzij stappen +// pijl links/rechts draaien +// Shift rennen +// slepen met de muis rondkijken +// Botsen (optioneel) en vloerhoogte komen van de aanroeper: +// opts.blocked(x, z) -> true als je daar niet kunt staan (m); standaard nooit +// opts.floorAt(x, z) -> hoogte van de ondergrond (m) +// opts.eye -> ooghoogte boven de ondergrond (m, standaard 1,65) +// Plain script (geen ES-module); gebruikt THREE. +// +// const walk = createWalkControls(camera, domElement, opts); +// walk.start({ x, z, yaw }); walk.update(dt); walk.stop(); +// ============================================================ + +function createWalkControls(camera, domElement, opts) { + const o = Object.assign({ eye: 1.65, speed: 1.68, run: 3.84, turn: Math.PI / 2, blocked: () => false, floorAt: () => 0 }, opts || {}); + const keys = new Set(); + let active = false; + let x = 0, z = 0, yaw = 0, pitch = 0; + let drag = null; + + const inField = () => ['INPUT', 'SELECT', 'TEXTAREA'].includes(document.activeElement && document.activeElement.tagName); + const MOVE_KEYS = ['w', 'a', 's', 'd', 'arrowup', 'arrowdown', 'arrowleft', 'arrowright', 'shift']; + function onKeyDown(e) { + if (!active || inField() || e.ctrlKey || e.metaKey || e.altKey) return; + const k = e.key.toLowerCase(); + if (!MOVE_KEYS.includes(k)) return; + keys.add(k); + e.preventDefault(); + } + function onKeyUp(e) { keys.delete(e.key.toLowerCase()); } + function onDown(e) { if (active && e.button === 0) drag = { x: e.clientX, y: e.clientY }; } + function onMove(e) { + if (!active || !drag) return; + const w = domElement.clientWidth || 1; + yaw -= (e.clientX - drag.x) / w * Math.PI; + pitch = Math.max(-1.2, Math.min(1.2, pitch - (e.clientY - drag.y) / w * Math.PI)); + drag = { x: e.clientX, y: e.clientY }; + } + function onUp() { drag = null; } + window.addEventListener('keydown', onKeyDown); + window.addEventListener('keyup', onKeyUp); + domElement.addEventListener('pointerdown', onDown); + window.addEventListener('pointermove', onMove); + window.addEventListener('pointerup', onUp); + + function apply() { + camera.position.set(x, o.floorAt(x, z) + o.eye, z); + // yaw 0 = kijkrichting +Z; pitch > 0 = omhoog. + const dir = new THREE.Vector3(Math.sin(yaw) * Math.cos(pitch), Math.sin(pitch), Math.cos(yaw) * Math.cos(pitch)); + camera.lookAt(camera.position.clone().add(dir)); + } + + // Stap met botsen: eerst de hele stap, anders per as (langs een muur glijden). + function step(dx, dz) { + if (!o.blocked(x + dx, z + dz)) { x += dx; z += dz; return; } + if (!o.blocked(x + dx, z)) x += dx; + else if (!o.blocked(x, z + dz)) z += dz; + } + + return { + get active() { return active; }, + start(pose) { + x = pose.x; z = pose.z; yaw = pose.yaw || 0; pitch = 0; + keys.clear(); + active = true; + apply(); + }, + stop() { active = false; keys.clear(); drag = null; }, + update(dt) { + if (!active) return; + const t = Math.min(dt, 0.1); + if (keys.has('arrowleft')) yaw += o.turn * t; + if (keys.has('arrowright')) yaw -= o.turn * t; + const f = (keys.has('w') || keys.has('arrowup') ? 1 : 0) - (keys.has('s') || keys.has('arrowdown') ? 1 : 0); + const r = (keys.has('d') ? 1 : 0) - (keys.has('a') ? 1 : 0); + if (f || r) { + const v = (keys.has('shift') ? o.run : o.speed) * t / Math.hypot(f, r); + const fx = Math.sin(yaw), fz = Math.cos(yaw); // vooruit + const rx = -fz, rz = fx; // rechts (kijkend langs +Z is rechts -X) + step((fx * f + rx * r) * v, (fz * f + rz * r) * v); + } + apply(); + }, + dispose() { + window.removeEventListener('keydown', onKeyDown); + window.removeEventListener('keyup', onKeyUp); + domElement.removeEventListener('pointerdown', onDown); + window.removeEventListener('pointermove', onMove); + window.removeEventListener('pointerup', onUp); + } + }; +} diff --git a/js/floor/floor-model.js b/js/floor/floor-model.js index b4494dd..5a5bc38 100644 --- a/js/floor/floor-model.js +++ b/js/floor/floor-model.js @@ -216,9 +216,14 @@ window.FloorModel = (() => { // Vloerafwerking (bovenop de OSB). Texturen in assets/textures/vloer/, // naadloos herhalend; tileMM = maat van één tegel van de textuur. const FINISHES = { - geen: { label: 'Geen (OSB)' }, - visgraat_001: { label: 'Visgraat (Hongaarse punt)', file: 'assets/textures/vloer/visgraat_001.jpg', tileMM: 3000 } + geen: { label: 'Geen (OSB)', color: '#cda86a' }, + visgraat_001: { label: 'Visgraat (Hongaarse punt)', color: '#a28670', file: 'assets/textures/vloer/visgraat_001.jpg', tileMM: 3000 } }; + // Voorvertoning (assets/textures/vloer/thumb//.png) of null. + function finishThumbUrl(key, px) { + const f = FINISHES[key]; + return f && f.file ? f.file.replace(/[^/]+$/, (n) => `thumb/${px || 64}/` + n.replace(/\.jpg$/, '.png')) : null; + } const finishMaterials = {}; function finishMaterial(key) { const f = FINISHES[key]; @@ -393,7 +398,7 @@ window.FloorModel = (() => { } return { - FINISHES, finishMaterial, validateState, computeFrame, topHeight, resolveOpenings: resolveFloorOpenings, computeChassisWheels, + FINISHES, finishMaterial, finishThumbUrl, validateState, computeFrame, topHeight, resolveOpenings: resolveFloorOpenings, computeChassisWheels, computeSpecs, computeFromState, createMaterials, build3D }; })(); diff --git a/js/house/house-model.js b/js/house/house-model.js index 20e4afc..a5237fe 100644 --- a/js/house/house-model.js +++ b/js/house/house-model.js @@ -296,6 +296,21 @@ window.HouseModel = (() => { }); } + // Naadwanden van één unit bijwerken na een gewijzigde koppeling: naadwanden + // van die unit waarvan de naad niet meer bestaat vervallen, ontbrekende + // naden krijgen er een. + function syncSeamWalls(state, unitId) { + const { seams } = computeSeams(unitRects(state)); + state.interiorWalls = state.interiorWalls.filter(iw => !iw.seam || (iw.seam.a !== unitId && iw.seam.b !== unitId) || + seams.some(sm => sameSeam(iw.seam, sm.a, sm.b))); + ensureSeamWalls(state, unitId); + } + // Naden van een unit zonder naadwand (bijv. verwijderd): [{ a, b }]. + function missingSeamWalls(state, unitId) { + const { seams } = computeSeams(unitRects(state)); + return seams.filter(sm => (sm.a === unitId || sm.b === unitId) && !state.interiorWalls.some(iw => iw.seam && sameSeam(iw.seam, sm.a, sm.b))); + } + function interiorLayout(iw) { const dx = iw.x2 - iw.x1, dz = iw.z2 - iw.z1; const alongX = Math.abs(dx) >= Math.abs(dz); @@ -465,7 +480,7 @@ window.HouseModel = (() => { pl.label = `Unit ${u.id} dak${multi ? ' deel ' + (i + 1) : ''} (${shapeLabel}${deg ? ', ' + String(deg).replace('.', ',') + '°' : ''})`; }); const roof = { - element: `${u.id}-D1`, shape, planes: ur.planes, specs: ur.specs, + element: `${u.id}-D1`, shape, covering: ur.covering, planes: ur.planes, specs: ur.specs, rect: { x0: roofCx - roofW / 2, x1: roofCx + roofW / 2, z0: roofCz - roofD / 2, z1: roofCz + roofD / 2, cx: roofCx, cz: roofCz, W: roofW, D: roofD }, base: layout.floorTop, // 3D: group-Y = 0 op het loopvlak // Onderkant plafond resp. bovenkant dakleer op (x, z) (woning-mm, absoluut). @@ -693,20 +708,15 @@ window.HouseModel = (() => { // over het blootliggende deel van een naadwand. Daarna pas bouwen. const extPieces = []; units.forEach(u => u.walls.forEach(w => w.pieces.forEach(p => extPieces.push(p)))); - // Gevel tot onder de dakrand: tussen wandbovenkant en onderkant boeideel - // resp. daktrim zit het dakpakket (dek + bedekking, verschilt per dak). - // De buitenlagen van de wand lopen daar door (skinAbove, mm), zodat er - // geen dakrand bloot ligt, bij elke daksoort. - const roofSt = RoofModel.normalizeSettings(state.settings.roof); - const flatTopsPre = units.filter(u => u.roof.shape.type === 'plat').map(u => u.roof.top); - const flatTopPre = flatTopsPre.length ? Math.max(...flatTopsPre) : 0; + // Gevel tot de bovenkant van het dak: tussen wandbovenkant en bovenkant + // dak zit het dakpakket (dek + bedekking, verschilt per dak). De + // buitenlagen van de wand lopen daar door (skinAbove, mm). Boeideel en + // daktrim komen daar bovenop (computeEdge, facadeDepth); de houtconstructie + // en de gevel zijn gelijk met of zonder boeideel. units.forEach(u => { - const su = state.units.find(x => x.id === u.id); - const below = su.roof.fascia !== false ? roofSt.fasciaHeight - RoofModel.EDGE_ABOVE_MM : roofSt.trimHeight; u.walls.forEach(w => w.pieces.forEach(p => { const m = UnitModel.localToWorld(p.place, 0, p.place.thickness / 2); - const top = u.roof.shape.type === 'plat' ? flatTopPre : u.roof.topAt(m.x, m.z); - p.skinAbove = Math.max(0, Math.round(top - u.roof.ceilingAt(m.x, m.z) - below)); + p.skinAbove = Math.max(0, Math.round(u.roof.topAt(m.x, m.z) - u.roof.ceilingAt(m.x, m.z))); // Binnenhoek-doorloop (negatieve skinExt): tot de bovenkant van het // dak van de buur-unit die daar staat geen buitenlagen (trimTop). const e = p.skinExt || {}, W = p.place.width; @@ -736,11 +746,31 @@ window.HouseModel = (() => { // de ribbe bij hoort; platte daken delen één randhoogte (de hoogste). const flatTops = units.filter(u => u.roof.shape.type === 'plat').map(u => u.roof.top); const flatTop = flatTops.length ? Math.max(...flatTops) : 0; + // Dikte van de gevelafwerking langs een dakrand-ribbe (boeideel komt + // erbovenop): gevelstuk op die lijn met dezelfde buitenrichting (+), of + // een gevel van een ander deel die naar dit dak toe kijkt (-). + const facadeDepth = (a, b, nrm) => { + const horiz = Math.abs(nrm.z) > 0.5; + const line = horiz ? a.z : a.x, s0 = Math.min(horiz ? a.x : a.z, horiz ? b.x : b.z), s1 = Math.max(horiz ? a.x : a.z, horiz ? b.x : b.z); + let best = 0, bestOv = 1; + extPieces.forEach(p => { + const pn = { x: p.place.normal.x, z: p.place.normal.y }; + const dot = pn.x * nrm.x + pn.z * nrm.z; + if (Math.abs(dot) < 0.5) return; + const q0 = UnitModel.localToWorld(p.place, -p.place.width / 2, p.place.thickness / 2), q1 = UnitModel.localToWorld(p.place, p.place.width / 2, p.place.thickness / 2); + if (Math.abs((horiz ? q0.z : q0.x) - line) > 2) return; + const ov = Math.min(s1, Math.max(horiz ? q0.x : q0.z, horiz ? q1.x : q1.z)) - Math.max(s0, Math.min(horiz ? q0.x : q0.z, horiz ? q1.x : q1.z)); + if (ov <= bestOv) return; + bestOv = ov; + best = Math.sign(dot) * WallModel.claddingOffset(p.buitenMateriaal, p.stone); + }); + return best; + }; const roofEdge = units.length ? RoofModel.computeEdge(state.settings.roof, units.map(u => ({ unitId: u.id, rect: u.roof.rect, fascia: state.units.find(su => su.id === u.id).roof.fascia !== false, topAt: u.roof.shape.type === 'plat' ? () => flatTop : u.roof.topAt, ridges: u.roof.ridges - }))) : null; + })), facadeDepth) : null; // Buitenverlichting: gevellampen per wandstuk + boeideel-spots (vult roofEdge.spots). const lighting = LightingModel.compute(state.settings.lighting, state.settings.roof, units, state.units, roofEdge); // Zichtbaarheid: boeideel/daktrim volgt "Beplating", spots en lampen volgen "Lampen". @@ -772,11 +802,88 @@ window.HouseModel = (() => { // ------------------------------------------------------------ // Totalen over de hele woning (overzicht + laatste PDF-blad). // ------------------------------------------------------------ + // ------------------------------------------------------------ + // Afmetingen (infopaneel 3D + blad 1 PDF). Oppervlakken in m2, maten in mm. + // bruto vloer = vloer-rechthoeken (tot buitenkant constructie) + // leefbaar = bruto vloer min de voetafdruk van alle wanden + // gevel = buitenvlak van alle gevelstukken (incl. doorloop tot + // onder de dakrand), bruto en netto (min openingen) + // binnenwanden = geplaatst oppervlak aan de kamerzijde (alle wanden) + // dak = hellend dakoppervlak (bedekking) en in plattegrond + // groundLevel: maaiveld onder het loopvlak (mm), voor de bouwhoogte. + // ------------------------------------------------------------ + function computeDimensions(parts, groundLevel) { + const m2 = (mm2) => mm2 / 1e6; + const rects = parts.rects; + const bx0 = Math.min(...rects.map(r => r.x0)), bx1 = Math.max(...rects.map(r => r.x1)); + const bz0 = Math.min(...rects.map(r => r.z0)), bz1 = Math.max(...rects.map(r => r.z1)); + const floorMM2 = rects.reduce((a, r) => a + r.W * r.D, 0); + const ext = [], all = allWallPieces(parts); + parts.units.forEach(u => u.walls.forEach(w => w.pieces.forEach(p => ext.push(p)))); + // Voetafdruk: gewone wanden (geen opbouw boven een lager dak). + const footprintMM2 = all.filter(p => !p.place.baseY).reduce((a, p) => a + p.place.width * p.place.thickness, 0); + const wallArea = (p, y0) => { + const tl = WallModel.topLine(p.config), W = p.config.wallWidth; + const poly = [{ x: -W / 2, y: y0 }, { x: W / 2, y: y0 }, ...tl.pts.slice().reverse()]; + return Math.max(0, polygonArea(poly)) + (p.skinAbove || 0) * W; + }; + const openingsMM2 = (p) => (p.config.openings || []).reduce((a, op) => a + op.w * op.h, 0); + const facadePieces = ext.concat(parts.interior.filter(p => p.skinFrom !== undefined)); + const gevelBruto = facadePieces.reduce((a, p) => a + wallArea(p, p.skinFrom || 0), 0); + const gevelOpen = ext.reduce((a, p) => a + openingsMM2(p), 0); + const glas = ext.reduce((a, p) => a + (p.config.openings || []).filter(op => op.type === 'raam').reduce((b, op) => b + op.w * op.h, 0), 0); + const binnen = all.reduce((a, p) => a + ((p.stats && p.stats.spaanplaatAreaM2) || 0) + ((p.stats && p.stats.spaanplaatBuitenAreaM2) || 0), 0); + const dakM2 = parts.units.reduce((a, u) => a + (u.roof.specs.dakleerM2 || 0) + (u.roof.specs.rietM2 || 0), 0); + const dakPlanMM2 = parts.units.reduce((a, u) => a + u.roof.rect.W * u.roof.rect.D, 0); + // Inhoud (bruto): per unit gemiddelde hoogte bovenkant dak boven de + // onderkant vloer, bemonsterd op een raster. + const inhoudMM3 = parts.units.reduce((a, u) => { + const r = u.rect, n = 8; + let sum = 0; + for (let i = 0; i < n; i++) for (let j = 0; j < n; j++) sum += u.roof.topAt(r.x0 + (i + 0.5) * r.W / n, r.z0 + (j + 0.5) * r.D / n); + return a + r.W * r.D * (sum / (n * n)); + }, 0); + const floorTop = Math.max(...parts.units.map(u => u.layout.floorTop)); + const top = parts.roofEdge ? parts.roofEdge.top : Math.max(...parts.units.map(u => u.roof.top)); + return { + lengthX: bx1 - bx0, lengthZ: bz1 - bz0, height: top - (floorTop - (groundLevel || 0)), + brutoM2: m2(floorMM2), leefbaarM2: m2(floorMM2 - footprintMM2), + gevelBrutoM2: m2(gevelBruto), gevelOpeningM2: m2(gevelOpen), gevelNettoM2: m2(gevelBruto - gevelOpen), glasM2: m2(glas), + binnenwandM2: binnen, dakM2, dakPlanM2: m2(dakPlanMM2), inhoudM3: inhoudMM3 / 1e9 + }; + } + // Als rijen [label, waarde, eenheid] (UI-kaart en PDF-tabel). + function dimensionRows(d, fmt) { + return [ + ['Buitenmaten (b × d)', `${Math.round(d.lengthX)} × ${Math.round(d.lengthZ)}`, 'mm'], + ['Bouwhoogte (vanaf maaiveld)', Math.round(d.height), 'mm'], + ['Bruto vloeroppervlak (buitenwerks)', fmt(d.brutoM2, 2), 'm²'], + ['Leefbare ruimte (netto vloer)', fmt(d.leefbaarM2, 2), 'm²'], + ['Gevel buitenkant (bruto)', fmt(d.gevelBrutoM2, 2), 'm²'], + ['Openingen in gevel', fmt(d.gevelOpeningM2, 2), 'm²'], + ['Gevel buitenkant (netto)', fmt(d.gevelNettoM2, 2), 'm²'], + ['Glas (ramen)', fmt(d.glasM2, 2), 'm²'], + ['Wanden binnenkant (alle)', fmt(d.binnenwandM2, 2), 'm²'], + ['Dak (dakoppervlak)', fmt(d.dakM2, 2), 'm²'], + ['Dak (plattegrond)', fmt(d.dakPlanM2, 2), 'm²'], + ['Inhoud (bruto)', fmt(d.inhoudM3, 1), 'm³'] + ]; + } + + // TIJDELIJK (verwijderen voor productie): capaciteit zaagmachine. + const SAW_M_PER_H = 2400; + function computeTotals(parts) { const pieces = allWallPieces(parts); const kinds = new Map(); const sawList = new Map(); - function addPiece(kind, width, depth, length) { + // TIJDELIJK (verwijderen voor productie): zaagmachine-overzicht. + const saw = { lengthMM: 0, cuts: 0, angles: new Map() }; + function addPiece(kind, width, depth, length, cutAngles) { + const ca = cutAngles || [0, 0]; + saw.lengthMM += length; + saw.cuts += ca.length; + ca.forEach(a => saw.angles.set(a, (saw.angles.get(a) || 0) + 1)); const k = kinds.get(kind) || { kind, count: 0, lengthMM: 0 }; k.count++; k.lengthMM += length; kinds.set(kind, k); @@ -792,12 +899,14 @@ window.HouseModel = (() => { ['front', 'back'].filter(k => fc.rims[k]).forEach(() => addPiece('vloerbalk', fc.joistW, fc.joistH, fc.width)); u.roof.planes.forEach(pl => { const rc = pl.data.calcData; - rc.joists.forEach(() => addPiece('dakbalk', rc.joistW, rc.joistH, rc.joistLen)); + // Sporen in een hellend dakvlak: loodrechte snede aan beide koppen. + const ang = Math.round(Math.abs(pl.theta || 0) * 180 / Math.PI * 10) / 10; + rc.joists.forEach(() => addPiece('dakbalk', rc.joistW, rc.joistH, rc.joistLen, [ang, ang])); ['front', 'back'].filter(k => rc.rims[k]).forEach(() => addPiece('dakbalk', rc.joistW, rc.joistH, rc.width)); }); }); const wallBom = []; - pieces.forEach(p => WallModel.computeBOM(p.config, p.frame).forEach(b => { wallBom.push(b); addPiece(b.kind, b.width, b.depth, b.length); })); + pieces.forEach(p => WallModel.computeBOM(p.config, p.frame).forEach(b => { wallBom.push(b); addPiece(b.kind, b.width, b.depth, b.length, b.cutAngles); })); const purchase = WallModel.planPurchase(wallBom); const sumP = (fn) => pieces.reduce((acc, p) => acc + fn(p), 0); @@ -823,6 +932,11 @@ window.HouseModel = (() => { return { kinds: kindList, sawList: Array.from(sawList.values()).sort((a, b) => b.length - a.length || a.width - b.width), + // TIJDELIJK (verwijderen voor productie): zaagmachine, SAW_M_PER_H meter per uur. + saw: { + meters: saw.lengthMM / 1000, hours: saw.lengthMM / 1000 / SAW_M_PER_H, cuts: saw.cuts, + angles: Array.from(saw.angles.entries()).map(([deg, count]) => ({ deg, count })).sort((a, b) => a.deg - b.deg) + }, beamCount: kindList.reduce((a, k) => a + k.count, 0), purchase, purchaseWasteMM: purchase.reduce((a, s) => a + s.wasteMM, 0), @@ -970,9 +1084,9 @@ window.HouseModel = (() => { } return { - ALIGN_LABELS, SIDE_LABELS, DEFAULT_INTERIOR_THICKNESS, FACADE_TYPES, facadeFor, + ALIGN_LABELS, SIDE_LABELS, DEFAULT_INTERIOR_THICKNESS, FACADE_TYPES, facadeFor, SAW_M_PER_H, // SAW_M_PER_H: tijdelijk clone, createEmptyProject, createDefaultSettings, createUnitEntry, applyGlobalSettings, nextUnitId, createDefaultState, unitRects, computeSeams, overlappingPairs, - interiorWallDefaults, setThickness, thicknessOf, interiorLayout, ensureSeamWalls, - computeParts, allWallPieces, computeTotals, validateState, fromUnitDesign, normalize + interiorWallDefaults, setThickness, thicknessOf, interiorLayout, ensureSeamWalls, syncSeamWalls, missingSeamWalls, + computeParts, allWallPieces, computeTotals, computeDimensions, dimensionRows, validateState, fromUnitDesign, normalize }; })(); diff --git a/js/house/house-pdf.js b/js/house/house-pdf.js index abe0dec..83369bf 100644 --- a/js/house/house-pdf.js +++ b/js/house/house-pdf.js @@ -6,10 +6,12 @@ */ // ============================================================ // house/house-pdf.js — HousePdf: de samenhangende woning-PDF. -// Blad 1 plattegrond woning (units, wandstukken, naden, binnenwanden) +// Blad 1 aanzichten noord/oost/zuid/west (vlakke "render", vectorvormen) +// Blad 2 plattegrond woning (units, wandstukken, naden, binnenwanden) // daarna per unit: vloer (FloorPdf) + elk wandstuk (WallPdf) // daarna elke binnenwand (WallPdf) -// laatste totalen (balken, inkoop, zaaglijst, glaswol, plaatwerk, gewicht) +// daarna totalen (balken, inkoop, glaswol, plaatwerk, gewicht, dakrand) +// laatste zaaglijst vuren + zaagmachine-overzicht (tijdelijk) // De losse bladen komen uit de gedeelde WallPdf/FloorPdf. // Plain script, geladen na house-model.js. // ============================================================ @@ -21,6 +23,7 @@ window.HousePdf = (() => { 'bovendorpel': 'Bovendorpel', 'onderdorpel': 'Onderdorpel' }; const PLAN_ELEMENT = 'PL-1'; + const VIEWS_ELEMENT = 'AZ-1'; function fmt(n, decimals = 1) { return n.toLocaleString('nl-NL', { minimumFractionDigits: decimals, maximumFractionDigits: decimals }); @@ -35,7 +38,10 @@ window.HousePdf = (() => { // Bladvolgorde + elementnummers; gedeeld door generate() en de // onderdelenlijst op blad 1. function sheetList(parts) { - const list = [{ kind: 'plan', element: PLAN_ELEMENT, label: 'Plattegrond woning' }]; + const list = [ + { kind: 'views', element: VIEWS_ELEMENT, label: 'Aanzichten woning' }, + { kind: 'plan', element: PLAN_ELEMENT, label: 'Plattegrond woning' } + ]; parts.units.forEach(u => { list.push({ kind: 'floor', element: u.floorElement, label: `Unit ${u.id} vloer`, unit: u }); u.walls.forEach(w => w.pieces.forEach(p => list.push({ kind: 'wall', element: p.element, label: p.label, piece: p }))); @@ -43,6 +49,7 @@ window.HousePdf = (() => { }); parts.interior.forEach(p => list.push({ kind: 'wall', element: p.element, label: p.label, piece: p })); list.push({ kind: 'totals', element: 'TOT', label: 'Totalen' }); + list.push({ kind: 'saw', element: 'ZAAG', label: 'Zaaglijst & zaagmachine' }); return list; } @@ -51,7 +58,7 @@ window.HousePdf = (() => { doc.setFont('helvetica', 'normal'); PdfSheet.table(doc, 8, 14, [0, 16, 60], ['Element', 'Onderdeel', 'Blad'], - sheets.slice(1).map((s, i) => [s.element, s.label, String(i + 2)]), + sheets.map((s, i) => [s.element, s.label, String(i + 1)]).filter(r => r[0] !== PLAN_ELEMENT), { title: 'Onderdelen', lastColW: 8, maxY: 285, rowH: 3.9, fontSize: 6 }); PdfSheet.titleBlock(doc, sheetOpts.project, sheetOpts); @@ -172,6 +179,245 @@ window.HousePdf = (() => { 'boeideel (o = spot), grijs = daktrim, geel blokje = gevellamp', drawX0, drawY1 + 4); } + // ------------------------------------------------------------ + // Aanzichten: per windrichting een vlakke "render" van de gevels. Alle + // zichtbare vlakken (gevels incl. trasraam en openingen, boeideel/daktrim, + // hellende dakvlakken) als polygonen in het aanzicht, van achter naar voren + // getekend (schildersalgoritme), in egale kleuren uit het model. + // ------------------------------------------------------------ + const hexRgb = (h) => { const n = parseInt(String(h).replace('#', ''), 16); return [(n >> 16) & 255, (n >> 8) & 255, n & 255]; }; + const numRgb = (n) => [(n >> 16) & 255, (n >> 8) & 255, n & 255]; + const VIEW_COLORS = { + rabat: '#a0805f', cementplaat: '#808285', glas: '#a9c9dc', deur: '#5b4a3b', lijn: [60, 60, 60], grond: [120, 120, 120] + }; + // d = richting van woning naar kijker (x, z); u = horizontale schermas. + const VIEWS = [ + { key: 'noord', title: 'Noordgevel', d: { x: 0, z: -1 }, u: (p) => -p.x }, + { key: 'oost', title: 'Oostgevel', d: { x: 1, z: 0 }, u: (p) => -p.z }, + { key: 'zuid', title: 'Zuidgevel', d: { x: 0, z: 1 }, u: (p) => p.x }, + { key: 'west', title: 'Westgevel', d: { x: -1, z: 0 }, u: (p) => p.z } + ]; + + // Alle vlakken in wereldcoördinaten: { pts: [{x, y, z}], n: {x, z} | null (dakvlak: nH), color, bias }. + function viewFaces(parts, state) { + const faces = []; + const wallFace = (p, y0, color, depthBias) => { + const W = p.place.width, T = p.place.thickness; + const c = WallModel.claddingOffset(p.buitenMateriaal, p.stone), e = p.skinExt || {}; + const xl = -W / 2 - (e.left > 0 ? e.left + c : 0), xr = W / 2 + (e.right > 0 ? e.right + c : 0); + const tl = WallModel.topLine(p.config), up = p.skinAbove || 0; + const top = (x) => tl.at(Math.max(-W / 2, Math.min(W / 2, x))) + up; + const loc = [{ x: xl, y: y0 }, { x: xr, y: y0 }, { x: xr, y: top(xr) }] + .concat(tl.pts.slice().reverse().filter(q => q.x > xl + 1 && q.x < xr - 1).map(q => ({ x: q.x, y: q.y + up }))) + .concat([{ x: xl, y: top(xl) }]); + return loc; + }; + const toWorld = (p, lx, y, lz) => { const w = UnitModel.localToWorld(p.place, lx, lz); return { x: w.x, y: p.place.floorTop + y, z: w.z }; }; + const addWall = (p, y0) => { + const n = { x: p.place.normal.x, z: p.place.normal.y }; + const zOut = p.place.thickness / 2 + WallModel.claddingOffset(p.buitenMateriaal, p.stone); + const color = p.stone ? (WallModel.STONE_COLORS[p.stone] || '#a0724f') : VIEW_COLORS.rabat; + faces.push({ pts: wallFace(p, y0).map(q => toWorld(p, q.x, q.y, zOut)), n, color, bias: 0 }); + // Trasraam (strook onderaan, iets naar voren) + const tr = p.trasraam; + if (tr && tr.top > y0) { + const W = p.place.width; + const band = wallFace(p, y0).map(q => ({ x: q.x, y: Math.min(q.y, tr.top) })); + const trColor = WallModel.isStoneFinish(tr.finish) ? (WallModel.STONE_COLORS[tr.finish] || '#a0724f') : VIEW_COLORS.cementplaat; + const zT = p.place.thickness / 2 + (WallModel.isStoneFinish(tr.finish) ? WallModel.STONE.THICK_MM : 12); + faces.push({ pts: band.map(q => toWorld(p, q.x, q.y, zT)), n, color: trColor, bias: 1 }); + } + // Openingen (glas / deur), vóór de gevel + (p.config.openings || []).forEach(op => { + if (op.y + op.h <= y0) return; + const x0 = -p.place.width / 2 + op.x, x1 = x0 + op.w, ya = Math.max(y0, op.y), yb = op.y + op.h; + const color = op.type === 'raam' ? VIEW_COLORS.glas : VIEW_COLORS.deur; + faces.push({ pts: [[x0, ya], [x1, ya], [x1, yb], [x0, yb]].map(([lx, ly]) => toWorld(p, lx, ly, zOut)), n, color, bias: 2, window: true }); + }); + }; + parts.units.forEach(u => u.walls.forEach(w => w.pieces.forEach(p => addWall(p, 0)))); + parts.interior.filter(p => p.skinFrom !== undefined && p.place.normal).forEach(p => addWall(p, p.skinFrom)); + + // Hellende dakvlakken (bovenkant, egaal in de kleur van de bedekking). + parts.units.forEach(u => { + const r = u.roof, sh = r.shape; + if (sh.type === 'plat') return; + const cov = RoofModel.COVERINGS[r.covering] || RoofModel.COVERINGS.dakleer; + const ctr = sh.axis === 'x' ? u.rect.cx : u.rect.cz; + r.planes.forEach(pl => { + const a0 = ctr + pl.p0, a1 = ctr + pl.p1, mid = (a0 + a1) / 2; + // Hoogte net binnen het vlak (op de nok geeft topAt het hoogste vlak). + const inward = (t) => t + Math.sign(mid - t) * 0.5; + const corners = sh.axis === 'x' + ? [[a0, r.rect.z0], [a1, r.rect.z0], [a1, r.rect.z1], [a0, r.rect.z1]] + : [[r.rect.x0, a0], [r.rect.x1, a0], [r.rect.x1, a1], [r.rect.x0, a1]]; + const pts = corners.map(([x, z]) => ({ x, y: sh.axis === 'x' ? r.topAt(inward(x), z) : r.topAt(x, inward(z)), z })); + // Normaal (omhoog) uit het vlak. + const [A, B, C] = pts; + const ux = B.x - A.x, uy = B.y - A.y, uz = B.z - A.z, vx = C.x - A.x, vy = C.y - A.y, vz = C.z - A.z; + let nx = uy * vz - uz * vy, ny = uz * vx - ux * vz, nz = ux * vy - uy * vx; + if (ny < 0) { nx = -nx; ny = -ny; nz = -nz; } + const len = Math.hypot(nx, ny, nz) || 1; + faces.push({ pts, n: { x: nx / len, z: nz / len }, roof: true, color: cov.color || '#2a2a2a', bias: 0 }); + }); + }); + + // Dakrand: buitenvlak van elk boeideel / elke daktrim. + const edge = parts.roofEdge; + if (edge) { + const fc = (RoofModel.FASCIA_COLORS[edge.fasciaColor] || RoofModel.FASCIA_COLORS.antraciet).hex; + edge.segments.forEach(sg => { + const h = sg.fascia ? edge.fasciaHeight : edge.trimHeight + edge.edgeAbove; + const A = sg.outerA, B = sg.outerB, tA = sg.topAt(A), tB = sg.topAt(B); + const pts = [{ x: A.x, y: tA, z: A.z }, { x: B.x, y: tB, z: B.z }, { x: B.x, y: tB - h, z: B.z }, { x: A.x, y: tA - h, z: A.z }]; + faces.push({ pts, n: { x: sg.normal.x, z: sg.normal.z }, color: sg.fascia ? fc : 0xb8bcc0, bias: 3 }); + }); + } + return faces; + } + + // Legenda "Afwerking": gevel(s) (incl. overrides), trasraam, dak per unit, + // vloer, boeideel/daktrim en binnenwanden. Per item een voorvertoning + // (thumb, via PdfSheet.preloadImage vooraf geladen) of een kleurvlak. + function materialLegend(state, parts) { + const items = []; + const st = state.settings; + const seen = new Set(); + state.units.forEach(u => Object.keys(u.unit.walls).forEach(side => { + const fc = HouseModel.facadeFor(state, u, side); + const key = fc.type === 'steen' ? 'steen:' + fc.stone : 'rabat'; + if (seen.has(key)) return; + seen.add(key); + items.push(fc.type === 'steen' + ? { label: 'Gevel', value: `Steen ${fc.stone}`, thumb: WallModel.stoneThumbUrl(fc.stone, 64), color: WallModel.STONE_COLORS[fc.stone] } + : { label: 'Gevel', value: `Rabat (${(WallModel.CLADDING_DIRECTIONS[st.cladding] || st.cladding).toLowerCase()})`, color: VIEW_COLORS.rabat }); + })); + if (st.trasraam.enabled) { + const tf = st.trasraam.finish; + items.push(WallModel.isStoneFinish(tf) + ? { label: `Trasraam (${st.trasraam.height} mm)`, value: `Steen ${tf}`, thumb: WallModel.stoneThumbUrl(tf, 64), color: WallModel.STONE_COLORS[tf] } + : { label: `Trasraam (${st.trasraam.height} mm)`, value: 'Cementplaat', color: VIEW_COLORS.cementplaat }); + } + (parts ? parts.units : state.units).forEach(u => { + const cov = parts ? u.roof.covering : (u.roof.covering || 'dakleer'); + const c = RoofModel.COVERINGS[cov] || RoofModel.COVERINGS.dakleer; + items.push({ label: `Dak unit ${u.id}`, value: c.label, thumb: RoofModel.coveringThumbUrl(cov, 64), color: c.color }); + }); + const ff = FloorModel.FINISHES[st.floorFinish] || FloorModel.FINISHES.geen; + items.push({ label: 'Vloer', value: ff.label, thumb: FloorModel.finishThumbUrl(st.floorFinish, 64), color: ff.color }); + const fascia = state.units.some(u => u.roof.fascia !== false), trim = state.units.some(u => u.roof.fascia === false); + if (fascia) { + const fcol = RoofModel.FASCIA_COLORS[st.roof.fasciaColor] || RoofModel.FASCIA_COLORS.antraciet; + items.push({ label: 'Boeideel', value: fcol.label, color: fcol.hex }); + } + if (trim) items.push({ label: 'Daktrim', value: 'Aluminium', color: 0xb8bcc0 }); + items.push(st.interiorPaint + ? { label: 'Binnenwanden', value: `Geschilderd ${st.interiorColor}`, color: st.interiorColor } + : { label: 'Binnenwanden', value: 'Spaanplaat', color: '#1e4620' }); + return items; + } + // Voorvertoningen die de legenda gebruikt (om vooraf te laden). + function materialThumbUrls(state) { + return materialLegend(state, null).map(i => i.thumb).filter(Boolean); + } + + function drawMaterialLegend(doc, items, x0, y0, x1, y1) { + const { BLACK, GREY } = PdfSheet.COLORS; + doc.setFont('helvetica', 'bold'); + doc.setFontSize(8); + doc.setTextColor(...BLACK); + doc.text('Afwerking', x0, y0 + 3); + doc.setFont('helvetica', 'normal'); + const cellW = 45, cellH = 11, sw = 9, top = y0 + 6; + const cols = Math.max(1, Math.floor((x1 - x0) / cellW)), rows = Math.max(1, Math.floor((y1 - top) / cellH)); + items.slice(0, cols * rows).forEach((it, i) => { + const cx = x0 + Math.floor(i / rows) * cellW, cy = top + (i % rows) * cellH; + const data = PdfSheet.imageData(it.thumb); + if (data) doc.addImage(data, 'PNG', cx, cy, sw, sw); + else { + doc.setFillColor(...(typeof it.color === 'number' ? numRgb(it.color) : hexRgb(it.color || '#cccccc'))); + doc.rect(cx, cy, sw, sw, 'F'); + } + doc.setDrawColor(...GREY); + doc.setLineWidth(0.1); + doc.rect(cx, cy, sw, sw, 'S'); + doc.setFontSize(6); + doc.setTextColor(...GREY); + doc.text(it.label, cx + sw + 1.5, cy + 3.2); + doc.setFontSize(7); + doc.setTextColor(...BLACK); + doc.text(doc.splitTextToSize(it.value, cellW - sw - 3)[0], cx + sw + 1.5, cy + 7.2); + }); + } + + // Afmetingen (zelfde rijen als het infopaneel in de app), in twee kolommen. + function drawDimensions(doc, rows, x0, y0, x1) { + const { BLACK, GREY } = PdfSheet.COLORS; + doc.setFont('helvetica', 'bold'); + doc.setFontSize(8); + doc.setTextColor(...BLACK); + doc.text('Afmetingen', x0, y0 + 3); + doc.setFont('helvetica', 'normal'); + const half = Math.ceil(rows.length / 2), colW = (x1 - x0) / 2, rowH = 4.6; + rows.forEach(([label, value, unit], i) => { + const cx = x0 + Math.floor(i / half) * colW, cy = y0 + 8 + (i % half) * rowH; + doc.setFontSize(5.5); + doc.setTextColor(...GREY); + doc.text(label, cx, cy - 1.7); + doc.setFontSize(7); + doc.setTextColor(...BLACK); + doc.text(`${value}${unit ? ' ' + unit : ''}`, cx, cy + 0.9); + }); + } + + function drawViewsSheet(doc, parts, state, sheetOpts) { + const { BLACK } = PdfSheet.COLORS; + const faces = viewFaces(parts, state); + const groundY = Math.max(...parts.units.map(u => u.layout.floorTop)) - (state.settings.groundLevel || 0); + // Per aanzicht de zichtbare vlakken in (u, v) mm, met diepte. + const views = VIEWS.map(v => { + const dot = (p) => p.x * v.d.x + p.z * v.d.z; + const list = faces.filter(f => f.roof ? (f.n.x * v.d.x + f.n.z * v.d.z) > 0.01 : (f.n.x * v.d.x + f.n.z * v.d.z) > 0.5) + .map(f => ({ f, depth: f.pts.reduce((a, p) => a + dot(p), 0) / f.pts.length + f.bias, pts: f.pts.map(p => ({ u: v.u(p), v: p.y })) })) + .sort((a, b) => a.depth - b.depth); + const us = list.flatMap(l => l.pts.map(p => p.u)), vs = list.flatMap(l => l.pts.map(p => p.v)).concat([groundY]); + return { v, list, u0: Math.min(...us), u1: Math.max(...us), v0: Math.min(...vs), v1: Math.max(...vs) }; + }).filter(x => x.list.length); + + // Raster 2 x 2 boven het titelblok; één schaal voor alle aanzichten. + const X0 = 12, X1 = 408, Y0 = 14, Y1 = 248, gap = 10, titleH = 7; + const cellW = (X1 - X0 - gap) / 2, cellH = (Y1 - Y0 - gap) / 2; + const scale = Math.min(...views.map(w => Math.min((cellW - 16) / (w.u1 - w.u0), (cellH - titleH - 10) / (w.v1 - w.v0)))); + doc.setFont('helvetica', 'normal'); + views.forEach((w, i) => { + const cx = X0 + (i % 2) * (cellW + gap), cy = Y0 + Math.floor(i / 2) * (cellH + gap); + const ox = cx + cellW / 2 - (w.u0 + w.u1) / 2 * scale; + const base = cy + cellH - 6; // grondlijn + const P = (p) => [ox + p.u * scale, base - (p.v - groundY) * scale]; + doc.setTextColor(...BLACK); + doc.setFontSize(11); + doc.text(w.v.title, cx, cy + 5); + doc.setLineWidth(0.1); + doc.setDrawColor(...VIEW_COLORS.lijn); + w.list.forEach(l => { + const pts = l.pts.map(P); + const col = typeof l.f.color === 'number' ? numRgb(l.f.color) : hexRgb(l.f.color); + doc.setFillColor(...col); + doc.lines(pts.slice(1).map((q, k) => [q[0] - pts[k][0], q[1] - pts[k][1]]), pts[0][0], pts[0][1], [1, 1], 'FD', true); + }); + // Grondlijn + doc.setDrawColor(...VIEW_COLORS.grond); + doc.setLineWidth(0.4); + doc.line(ox + w.u0 * scale - 6, base, ox + w.u1 * scale + 6, base); + }); + doc.setFontSize(7); + doc.setTextColor(...BLACK); + doc.text(`Aanzichten (vlakke weergave, schaal ca. 1:${Math.round(1 / scale)}); kleuren: gemiddelde kleur van de gekozen steen / bedekking.`, X0, Y1 + 5); + drawMaterialLegend(doc, materialLegend(state, parts), X0, Y1 + 7, 192, 289); + drawDimensions(doc, HouseModel.dimensionRows(HouseModel.computeDimensions(parts, state.settings.groundLevel), fmt), 197, Y1 + 7, 285); + PdfSheet.titleBlock(doc, sheetOpts.project, sheetOpts); + } + function drawTotalsSheet(doc, totals, sheetOpts) { const { BLACK } = PdfSheet.COLORS; doc.setFont('helvetica', 'normal'); @@ -197,22 +443,18 @@ window.HousePdf = (() => { fmt(totals.purchaseStockMM ? totals.purchaseWasteMM / totals.purchaseStockMM * 100 : 0) + '%']); PdfSheet.table(doc, 15, y, [0, 30, 55], ['Doorsnede', 'Lengte', 'Aantal'], purchaseRows, tableOpts('Inkoop wandbalken (alle wanden)')); - PdfSheet.table(doc, 120, 30, [0, 20, 40, 62], ['Dikte', 'Hoogte', 'Lengte', 'Aantal'], - totals.sawList.map(g => [String(g.width), String(g.depth), String(g.length), String(g.count)]), - Object.assign(tableOpts('Zaaglijst vuren (totaal)'), { maxY: 285 })); - y = 30; const isoRows = totals.isolatie.map(r => [r.label, fmt(r.m3, 3) + ' m3']); isoRows.push(['Totaal glaswol', fmt(totals.isolatieM3, 3) + ' m3']); - y = PdfSheet.table(doc, 215, y, [0, 50], ['Onderdeel', 'Inhoud'], isoRows, tableOpts('Isolatie (glaswol, spouwvullend)')); + y = PdfSheet.table(doc, 120, y, [0, 50], ['Onderdeel', 'Inhoud'], isoRows, tableOpts('Isolatie (glaswol, spouwvullend)')); y += 4; - y = PdfSheet.table(doc, 215, y, [0, 58, 80, 102], ['Materiaal', 'Opp. (m2)', 'Vol. (m3)', 'Gewicht'], + y = PdfSheet.table(doc, 120, y, [0, 58, 80, 102], ['Materiaal', 'Opp. (m2)', 'Vol. (m3)', 'Gewicht'], totals.plaatwerk.map(p => [p.naam, fmt(p.m2, 2), p.m3 === null ? 'n.v.t.' : fmt(p.m3, 3), fmt(p.kg) + ' kg']), tableOpts('Plaatwerk')); y += 4; const wRows = totals.weights.map(r => [r.label, fmt(r.kg) + ' kg']); wRows.push(['Totaal woning', fmt(totals.totalKg) + ' kg']); - y = PdfSheet.table(doc, 215, y, [0, 50], ['Onderdeel', 'Gewicht'], wRows, tableOpts('Gewicht')); + y = PdfSheet.table(doc, 120, y, [0, 50], ['Onderdeel', 'Gewicht'], wRows, tableOpts('Gewicht')); if (totals.roofEdge) { y += 4; const e = totals.roofEdge, L = totals.lamps; @@ -225,12 +467,44 @@ window.HousePdf = (() => { rows.push(['Boeideel-spots', e.spots + ' stuks']); rows.push(['Gevellampen', `${L.total} stuks (boven+onder ${L.both}, onder ${L.down}, boven ${L.up})`]); rows.push(['Binnenspots', `${L.indoor} stuks (plafond)`]); - PdfSheet.table(doc, 215, y, [0, 40], ['Onderdeel', 'Hoeveelheid'], rows, tableOpts('Dakrand & verlichting')); + PdfSheet.table(doc, 120, y, [0, 40], ['Onderdeel', 'Hoeveelheid'], rows, tableOpts('Dakrand & verlichting')); } PdfSheet.titleBlock(doc, sheetOpts.project, sheetOpts); } + // Eigen blad na de totalen: zaaglijst vuren (in kolommen) + zaagmachine. + function drawSawSheet(doc, totals, sheetOpts) { + const { BLACK } = PdfSheet.COLORS; + doc.setFont('helvetica', 'normal'); + doc.setTextColor(...BLACK); + doc.setFontSize(14); + doc.text('Zaaglijst', 15, 18); + const tableOpts = (title) => ({ title, fontSize: 7, rowH: 4.6, lastColW: 16 }); + const rows = totals.sawList.map(g => [String(g.width), String(g.depth), String(g.length), String(g.count)]); + const perCol = 52, cols = [15, 100, 185]; + for (let c = 0; c < cols.length && c * perCol < rows.length; c++) { + PdfSheet.table(doc, cols[c], 30, [0, 20, 40, 62], ['Dikte', 'Hoogte', 'Lengte', 'Aantal'], rows.slice(c * perCol, (c + 1) * perCol), + tableOpts(c === 0 ? 'Zaaglijst vuren (totaal)' : 'Zaaglijst (vervolg)')); + } + if (rows.length > perCol * cols.length) { + doc.setFontSize(7); + doc.text(`+ ${rows.length - perCol * cols.length} regels (niet getoond)`, 15, 285); + } + + // TIJDELIJK (verwijderen voor productie): zaagmachine-overzicht. + const sw = totals.saw; + const hm = (h) => `${Math.floor(h)}:${String(Math.round((h % 1) * 60)).padStart(2, '0')}`; + PdfSheet.table(doc, 290, 30, [0, 55], ['Onderdeel', 'Waarde'], [ + ['Zaagmeters', fmt(sw.meters, 1) + ' m'], + [`Zaagtijd (${HouseModel.SAW_M_PER_H} m/u)`, hm(sw.hours) + ' u:mm'], + ['Zaagsneden', sw.cuts + ' st.'], + ['Verschillende hoeken', String(sw.angles.length)] + ].concat(sw.angles.map(a => [a.deg === 0 ? 'Haaks (0\u00b0)' : `Schuin ${fmt(a.deg, 1)}\u00b0`, a.count + ' sneden'])), tableOpts('Zaagmachine (tijdelijk)')); + + PdfSheet.titleBlock(doc, sheetOpts.project, sheetOpts); + } + function generate(state) { const parts = HouseModel.computeParts(state, { wallMaterials: WallModel.createMaterials(), floorMaterials: FloorModel.createMaterials(), roofMaterials: RoofModel.createMaterials() @@ -243,14 +517,16 @@ window.HousePdf = (() => { sheets.forEach((sheet, i) => { if (i > 0) doc.addPage('a3', 'landscape'); const opts = { project, titel: sheet.label, element: sheet.element, blad: `${i + 1} / ${sheets.length}` }; - if (sheet.kind === 'plan') drawPlanSheet(doc, parts, sheets, opts); + if (sheet.kind === 'views') drawViewsSheet(doc, parts, state, opts); + else if (sheet.kind === 'plan') drawPlanSheet(doc, parts, sheets, opts); else if (sheet.kind === 'floor') FloorPdf.drawSheet(doc, sheet.unit.floorData.calcData, sheet.unit.floorData.resolvedOpenings, opts); else if (sheet.kind === 'roof') FloorPdf.drawSheet(doc, sheet.plane.data.calcData, sheet.plane.data.resolvedOpenings, Object.assign({ roof: true }, opts)); else if (sheet.kind === 'wall') WallPdf.drawSheet(doc, sheet.piece.config, sheet.piece.frame, Object.assign({ buitenMateriaal: sheet.piece.buitenMateriaal, cladding: sheet.piece.cladding, trasraam: sheet.piece.trasraam, skinExt: sheet.piece.skinExt, facade: sheet.piece.facade, skinFrom: sheet.piece.skinFrom, lamps: sheet.piece.lamps || [] }, opts)); + else if (sheet.kind === 'saw') drawSawSheet(doc, totals, opts); else drawTotalsSheet(doc, totals, opts); }); return doc; } - return { generate, sheetList }; + return { generate, sheetList, materialThumbUrls }; })(); diff --git a/js/house/house.js b/js/house/house.js index 1da1ee5..92f4477 100644 --- a/js/house/house.js +++ b/js/house/house.js @@ -738,9 +738,9 @@ function mountHouseEditor(container, callbacks) { const covOpts = Object.fromEntries(Object.entries(RoofModel.COVERINGS) .filter(([, c]) => !c.sloped || shapeType !== 'plat').map(([k, c]) => [k, c.label])); const covInfo = (k) => { const c = RoofModel.COVERINGS[k]; return `${c.thickMM} mm, ${String(c.kgM2).replace('.', ',')} kg/m²`; }; - const bedekking = sel('hp-roof-cover', 'Bedekking', covOpts, RoofModel.coveringFor(u.roof.covering, shapeType), { - hint: shapeType === 'plat' ? 'Riet kan alleen bij een hellend dak (lessenaar/zadel)' : covInfo(RoofModel.coveringFor(u.roof.covering, shapeType)) + '; boeideel schuift mee omhoog' - }); + const covNow = RoofModel.coveringFor(u.roof.covering, shapeType); + const bedekking = thumbPicker('hp-roof-cover', 'Bedekking', covOpts, covNow, RoofModel.coveringThumbUrl(covNow, 128), + shapeType === 'plat' ? 'Riet kan alleen bij een hellend dak (lessenaar/zadel)' : covInfo(covNow) + '; boeideel schuift mee omhoog'); const dak = toggle('hp-roof-follow', 'Maat volgt vloer', u.roof.followFloor) + (u.roof.followFloor ? '' : num('hp-roof-w', 'Breedte', u.roof.deck.floor.width, { hint: 'West–oost' }) + @@ -750,12 +750,16 @@ function mountHouseEditor(container, callbacks) { toggle('hp-fascia', 'Boeidelen', u.roof.fascia !== false, { hint: 'Uit = daktrim van 80 mm' }) + bedekking; + const missing = HouseModel.missingSeamWalls(state, u.id); propsEl.innerHTML = warn + head('box', `Unit ${u.id}`, `${f.width} × ${f.depth} mm`) + UI.tabs('unit', [ { key: 'maat', label: 'Afmetingen', icon: 'rulers', html: cols( num('hp-width', 'Breedte', f.width, { hint: 'West–oost' }) + num('hp-depth', 'Diepte', f.depth, { hint: 'Noord–zuid' }), sel('hp-corners', 'Hoekaansluiting', UnitModel.CORNER_MODES, u.unit.layout.corners)) }, - { key: 'koppeling', label: 'Koppeling', icon: 'link-45deg', html: cols(koppeling, '') }, + { key: 'koppeling', label: 'Koppeling', icon: 'link-45deg', html: cols(koppeling, missing.length + ? UI.warn(`Zonder naadwand: ${missing.map(m => `unit ${m.a} | ${m.b}`).join(', ')}. De naad staat daar open.`) + + actions(button('Naadwand toevoegen', 'plus-lg', `data-action="add-seams" data-unit="${u.id}"`)) + : '') }, { key: 'dak', label: 'Dak', icon: 'house', html: cols(dak, u.roof.followFloor ? info('Het dak heeft de maat van de vloer. Zet "Maat volgt vloer" uit voor een eigen maat of verschuiving.') : '') } ]) + actions( @@ -767,9 +771,11 @@ function mountHouseEditor(container, callbacks) { UI.onNum('hp-depth', v => { if (v >= 1000) f.depth = v; }, after); UI.onNum('hp-att-offset', v => { u.attach.offset = v; }, after); UI.onSel('hp-corners', v => { u.unit.layout.corners = v; }, rerender); - UI.onSel('hp-att-to', v => { u.attach.to = v; }, rerender); - UI.onSel('hp-att-side', v => { u.attach.side = v; }, rerender); - UI.onSel('hp-att-align', v => { u.attach.align = v; }, rerender); + // Andere koppeling: naadwanden van deze unit gaan mee (oude vervallen, + // nieuwe naden krijgen er een). + UI.onSel('hp-att-to', v => { u.attach.to = v; HouseModel.syncSeamWalls(state, u.id); }, rerender); + UI.onSel('hp-att-side', v => { u.attach.side = v; HouseModel.syncSeamWalls(state, u.id); }, rerender); + UI.onSel('hp-att-align', v => { u.attach.align = v; HouseModel.syncSeamWalls(state, u.id); }, rerender); UI.onToggle('hp-roof-follow', v => { u.roof.followFloor = v; }, rerender); UI.onToggle('hp-fascia', v => { u.roof.fascia = v; }, rerender); UI.onSel('hp-roof-cover', v => { u.roof.covering = v; }, rerender); @@ -869,9 +875,10 @@ function mountHouseEditor(container, callbacks) { // Keuzes voor de vormgeving van het trasraam: plaat of een steen. const stoneOptions = Object.assign({}, ...WallModel.TRASRAAM_STONES.map(c => ({ [c]: `Steen ${c}` }))); const trasraamFinishes = Object.assign({ cementplaat: 'Cementplaat' }, stoneOptions); - // Steenkeuze met voorvertoning. - const stonePicker = (id, label, value, hint) => sel(id, label, stoneOptions, value, { hint }) + - `${value}`; + // Keuzelijst met voorvertoning (textuur-thumbnail), als die er is. + const thumbPicker = (id, label, options, value, thumbUrl, hint) => sel(id, label, options, value, { hint }) + + (thumbUrl ? `${value}` : ''); + const stonePicker = (id, label, value, hint) => thumbPicker(id, label, stoneOptions, value, WallModel.stoneThumbUrl(value, 128), hint); function renderHouseProps(warn) { const st = state.settings, sp = st.spacing, r = st.roof, lt = st.lighting; @@ -916,7 +923,8 @@ function mountHouseEditor(container, callbacks) { { key: 'binnen', label: 'Binnen', icon: 'palette', html: cols( section('Wanden', 'palette', toggle('hs-int-paint', 'Geschilderd', st.interiorPaint, { hint: 'Alle wanden aan de kamerzijde; egaal, zonder plaatnaden' }) + (st.interiorPaint ? UI.color('hs-int-color', 'Verfkleur', st.interiorColor, { hint: 'Voorlopig één kleur voor de hele woning' }) : '')), - section('Vloer', 'grid-3x3', sel('hs-floor-finish', 'Afwerking', Object.fromEntries(Object.entries(FloorModel.FINISHES).map(([k, f]) => [k, f.label])), st.floorFinish, { hint: 'Alle vloeren (voorlopig één keuze)' }) + + section('Vloer', 'grid-3x3', thumbPicker('hs-floor-finish', 'Afwerking', Object.fromEntries(Object.entries(FloorModel.FINISHES).map(([k, f]) => [k, f.label])), st.floorFinish, + FloorModel.finishThumbUrl(st.floorFinish, 128), 'Alle vloeren (voorlopig één keuze)') + info('Wanden uit: kale spaanplaat met plaatnaden.'))) }, { key: 'constructie', label: 'Regelwerk', icon: 'columns-gap', html: cols( section('Buitenwanden', 'bricks', num('hs-ext-min', 'Afstand min.', sp.exterior.min, { step: 10, hint: 'Hart-op-hart stijlen' }) + num('hs-ext-max', 'Afstand max.', sp.exterior.max, { step: 10, hint: 'Hart-op-hart stijlen' })), @@ -986,12 +994,15 @@ function mountHouseEditor(container, callbacks) { if (act.dataset.action === 'add-unit') addUnit(); else if (act.dataset.action === 'draw-iw') setTool('iw'); else if (act.dataset.action === 'project') openProjectProperties(); + else if (act.dataset.action === 'add-seams') { HouseModel.ensureSeamWalls(state, act.dataset.unit); refresh(); } }); // --- Specificaties/totalen (onder de 3D) --- function renderSpecs(totals) { const f = houseFmt; + const dims = HouseModel.computeDimensions(parts, state.settings.groundLevel); const cards = [ + UI.specCard('Afmetingen', 'rulers', HouseModel.dimensionRows(dims, f)), UI.specCard('Gewicht', 'speedometer2', totals.weights.map(r => [r.label, f(r.kg), 'kg']), ['Totaal woning', f(totals.totalKg), 'kg']), UI.specCard('Hout & isolatie', 'tree', [ ['Balken', totals.beamCount, 'st.'], @@ -1010,11 +1021,22 @@ function mountHouseEditor(container, callbacks) { rows.push(['Boeideel-spots', e.spots, 'st.'], ['Gevellampen', totals.lamps.total, 'st.'], ['Binnenspots', totals.lamps.indoor, 'st.']); cards.push(UI.specCard('Dakrand & verlichting', 'lightbulb', rows)); } + // TIJDELIJK (verwijderen voor productie): zaagmachine-overzicht. + const sw = totals.saw, hm = (h) => `${Math.floor(h)}:${String(Math.round((h % 1) * 60)).padStart(2, '0')}`; + cards.push(UI.specCard('Zaagmachine (tijdelijk)', 'scissors', [ + ['Zaagmeters', f(sw.meters, 1), 'm'], + [`Zaagtijd (${HouseModel.SAW_M_PER_H} m/u)`, hm(sw.hours), 'u:mm'], + ['Zaagsneden', sw.cuts, 'st.'], + ['Verschillende hoeken', sw.angles.length, ''] + ].concat(sw.angles.map(a => [a.deg === 0 ? 'Haaks (0°)' : `Schuin ${f(a.deg, 1)}°`, a.count, 'sneden'])))); document.getElementById('ho-specs').innerHTML = `
${cards.join('')}
`; } // --- Alles opnieuw doorrekenen --- function refresh(opts) { + // Voorvertoningen van de gekozen materialen alvast laden voor de PDF + // (legenda op het aanzichtenblad; HousePdf.materialThumbs). + HousePdf.materialThumbUrls(state).forEach(PdfSheet.preloadImage); // Binnenzijde geschilderd: de (gedeelde) spaanplaat krijgt de verfkleur. wallMaterials.spaanplaatMaterial.color.set(state.settings.interiorPaint ? state.settings.interiorColor : SPAANPLAAT_COLOR); parts = HouseModel.computeParts(state, { wallMaterials, floorMaterials, roofMaterials, lightingMaterials, sandwichMaterials, beplatingVisible, lampenVisible }); @@ -1080,9 +1102,93 @@ function mountHouseEditor(container, callbacks) { renderNav(); } - let rafId = null; + // --- Lopen (first person), eigen sneltoets Shift+T --- + // Start 3 m voor de voordeur, buiten; botsen tegen wanden (deuren zijn + // doorgangen), ondergrond = vloer binnen een unit, anders het maaiveld. + const WALK_RADIUS = 250; // mm, "lichaam" + function wallBlocked(xm, zm) { + if (!parts) return false; + const x = xm * 1000, z = zm * 1000; + return HouseModel.allWallPieces(parts).some(p => { + if (p.place.baseY) return false; // opbouw boven een lager dak + const c = Math.cos(p.place.rotY), s = Math.sin(p.place.rotY); + const dx = x - p.place.cx, dz = z - p.place.cz; + const lx = dx * c - dz * s, lz = dx * s + dz * c; + const W = p.place.width, T = p.place.thickness; + const out = p.place.normal ? WallModel.claddingOffset(p.buitenMateriaal, p.stone) : 0; + if (lz < -T / 2 - WALK_RADIUS || lz > T / 2 + out + WALK_RADIUS || Math.abs(lx) > W / 2 + WALK_RADIUS) return false; + // Door een deur(opening) mag je lopen. + return !(p.config.openings || []).some(op => op.y < 100 && op.y + op.h > 1800 && + lx > -W / 2 + op.x + WALK_RADIUS * 0.6 && lx < -W / 2 + op.x + op.w - WALK_RADIUS * 0.6); + }); + } + function groundAt(xm, zm) { + const x = xm * 1000, z = zm * 1000; + const u = parts && parts.units.find(q => x >= q.rect.x0 && x <= q.rect.x1 && z >= q.rect.z0 && z <= q.rect.z1); + const top = parts ? Math.max(...parts.units.map(q => q.layout.floorTop)) : 0; + return (u ? u.layout.floorTop : top - (state.settings.groundLevel || 0)) / 1000; + } + const walk = createWalkControls(camera, renderer.domElement, { blocked: wallBlocked, floorAt: groundAt }); + let orbitSaved = null; + // Startpositie: 3 m voor de voordeur (anders een buitendeur, anders midden + // voor de noordgevel), kijkend naar de deur. + function walkStartPose() { + const ext = []; + parts.units.forEach(u => u.walls.forEach(w => w.pieces.forEach(p => ext.push(p)))); + let best = null; + ['voordeur', 'deur'].some(type => ext.some(p => (p.config.openings || []).some(op => { + if (op.type !== type) return false; + best = { p, lx: -p.place.width / 2 + op.x + op.w / 2 }; + return true; + }))); + if (!best) { + const p = ext.find(q => q.place.normal && q.place.normal.y < -0.5) || ext[0]; + best = { p, lx: 0 }; + } + const d = UnitModel.localToWorld(best.p.place, best.lx, best.p.place.thickness / 2); + const n = { x: best.p.place.normal.x, z: best.p.place.normal.y }; + const x = (d.x + n.x * 3000) / 1000, z = (d.z + n.z * 3000) / 1000; + return { x, z, yaw: Math.atan2(-n.x, -n.z) }; + } + const walkHint = document.createElement('div'); + walkHint.className = 'walk-hint'; + walkHint.textContent = 'Lopen: W/S of pijltjes = vooruit/achteruit · A/D = opzij · pijl links/rechts = draaien · Shift = rennen · slepen = rondkijken · Shift+T = terug'; + pane3D.appendChild(walkHint); + function setWalk(on) { + if (on === walk.active || !parts) return; + const view = document.getElementById('house-overview'); + if (on) { + // Lopen gebeurt in de volle 3D (alleen render); vorige stand onthouden. + orbitSaved = { pos: camera.position.clone(), target: controls.target.clone(), fov: camera.fov, cls: view.className }; + view.classList.remove('fullscreen-2d'); + view.classList.add('fullscreen-3d', 'render-only'); + requestAnimationFrame(onResize); + controls.enableRotate = controls.enablePan = controls.enableZoom = false; + camera.fov = 65; + camera.updateProjectionMatrix(); + walk.start(walkStartPose()); + } else { + walk.stop(); + controls.enableRotate = controls.enablePan = controls.enableZoom = true; + if (orbitSaved) { + view.className = orbitSaved.cls; + requestAnimationFrame(onResize); + camera.fov = orbitSaved.fov; + camera.updateProjectionMatrix(); + camera.position.copy(orbitSaved.pos); + controls.target.copy(orbitSaved.target); + controls.update(); + } + } + walkHint.classList.toggle('show', on); + } + + let rafId = null, lastT = performance.now(); function animate() { rafId = requestAnimationFrame(animate); + const now = performance.now(); + walk.update((now - lastT) / 1000); + lastT = now; renderer.render(scene, camera); } function onResize() { @@ -1094,7 +1200,9 @@ function mountHouseEditor(container, callbacks) { window.addEventListener('resize', onResize); function toggleView(fn) { - fn(document.getElementById('house-overview')); + const el = document.getElementById('house-overview'); + setWalk(false); // weergave wisselen beëindigt het lopen + fn(el); requestAnimationFrame(onResize); } @@ -1108,12 +1216,15 @@ function mountHouseEditor(container, callbacks) { window.removeEventListener('resize', onResize); window.removeEventListener('keydown', onKey); if (rafId !== null) cancelAnimationFrame(rafId); + setWalk(false); // orbitcamera terug vóór het opslaan + walk.dispose(); CameraMemory.save(overviewCamKey, camera, controls); renderer.dispose(); }, refresh, setTool, toggleFullscreen3D: () => toggleView(UI.cycle3D), + toggleWalk: () => setWalk(!walk.active), toggleFullscreen2D: () => toggleView(UI.toggle2D) }; } @@ -1229,6 +1340,7 @@ function mountHouseEditor(container, callbacks) { triggerImport, mirrorHorizontal: forward('mirrorHorizontal'), toggleFullscreen3D: forward('toggleFullscreen3D'), + toggleWalk: forward('toggleWalk'), toggleFullscreen2D: forward('toggleFullscreen2D'), openProjectProperties, getStateJson, diff --git a/js/lighting/lighting-model.js b/js/lighting/lighting-model.js index 34bf067..d3c530c 100644 --- a/js/lighting/lighting-model.js +++ b/js/lighting/lighting-model.js @@ -339,16 +339,19 @@ window.LightingModel = (() => { // spots = [{ x, z, y }] (mm, boeideel; y = onderkant boeideel, anders spotY), // indoor = [{ x, z, y, floorY }] (mm). o.outdoorFactor schaalt de buiten- // lampen (overdag lager: dan vallen ze nauwelijks op). - const OUTDOOR = { lamp: 2.0, spot: 1.6, angle: 0.5 }; - const INDOOR = { intensity: 4.0, angle: 1.0, reach: 1.12, decay: 0.6 }; + // Zacht en breed i.p.v. fel en smal: lagere intensiteit, grotere bundel + // en een brede zachte rand (penumbra), zodat naast elkaar liggende spots + // niet optellen tot felle vlekken. + const OUTDOOR = { lamp: 1.1, spot: 0.9, angle: 0.62, penumbra: 0.85 }; + const INDOOR = { intensity: 1.4, angle: 1.3, penumbra: 0.9, reach: 1.12, decay: 1.0 }; const DAY_OUTDOOR_FACTOR = 0.35; function buildLights3D(lamps, spots, spotY, indoor, o) { const toM = 0.001; const fo = (o && o.outdoorFactor !== undefined) ? o.outdoorFactor : 1; const group = new THREE.Group(); // Spot op (x, y, z) die naar (x + tx, y + ty, z + tz) schijnt. - const add = (x, y, z, tx, ty, tz, intensity, angle, distance, decay) => { - const light = new THREE.SpotLight(0xffd9a0, intensity, distance, angle, 0.6, decay); + const add = (x, y, z, tx, ty, tz, intensity, angle, distance, decay, penumbra) => { + const light = new THREE.SpotLight(0xffd9a0, intensity, distance, angle, penumbra, decay); light.position.set(x, y, z); light.target.position.set(x + tx, y + ty, z + tz); group.add(light); @@ -358,18 +361,18 @@ window.LightingModel = (() => { lamps.forEach(l => { const x = l.x * toM + l.normal.x * 0.12, z = l.z * toM + l.normal.z * 0.12, y = l.y * toM; const nx = l.normal.x * tilt, nz = l.normal.z * tilt; - if (l.direction !== 'up') add(x, y - 0.09, z, nx, -1, nz, OUTDOOR.lamp * fo, OUTDOOR.angle, 4.5, 1.5); - if (l.direction !== 'down') add(x, y + 0.09, z, nx, 1, nz, OUTDOOR.lamp * fo, OUTDOOR.angle, 4.5, 1.5); + if (l.direction !== 'up') add(x, y - 0.09, z, nx, -1, nz, OUTDOOR.lamp * fo, OUTDOOR.angle, 4.5, 1.5, OUTDOOR.penumbra); + if (l.direction !== 'down') add(x, y + 0.09, z, nx, 1, nz, OUTDOOR.lamp * fo, OUTDOOR.angle, 4.5, 1.5, OUTDOOR.penumbra); }); // Boeideel-spots: naar buiten gekanteld (normaal van de dakrand; op een // hoek diagonaal). (spots || []).forEach(p => { const n = p.normal || { x: 0, z: 0 }, len = Math.hypot(n.x, n.z) || 1; - add(p.x * toM, (p.y !== undefined ? p.y : spotY) * toM - 0.02, p.z * toM, n.x / len * tilt, -1, n.z / len * tilt, OUTDOOR.spot * fo, OUTDOOR.angle, 5.5, 1.5); + add(p.x * toM, (p.y !== undefined ? p.y : spotY) * toM - 0.02, p.z * toM, n.x / len * tilt, -1, n.z / len * tilt, OUTDOOR.spot * fo, OUTDOOR.angle, 5.5, 1.5, OUTDOOR.penumbra); }); (indoor || []).forEach(p => { const drop = (p.y - p.floorY) * toM; // plafond -> loopvlak - add(p.x * toM, p.y * toM - 0.02, p.z * toM, 0, -1, 0, INDOOR.intensity, INDOOR.angle, drop * INDOOR.reach, INDOOR.decay); + add(p.x * toM, p.y * toM - 0.02, p.z * toM, 0, -1, 0, INDOOR.intensity, INDOOR.angle, drop * INDOOR.reach, INDOOR.decay, INDOOR.penumbra); }); return group; } diff --git a/js/roof/roof-model.js b/js/roof/roof-model.js index 8011174..9882d02 100644 --- a/js/roof/roof-model.js +++ b/js/roof/roof-model.js @@ -69,12 +69,18 @@ window.RoofModel = (() => { // de stengels lopen langs de helling. // Riet: één keuze per textuur assets/textures/dak/riet_.jpg (nummer // hier toevoegen); zelfde opbouw (180 mm, 3,8 kg/m2). - const RIET = { thickMM: 180, kgM2: 3.8, tileMM: 1000, nrs: ['001', '002', '003'] }; + // colors: gemiddelde kleur per textuur (vlakke weergave, PDF-aanzichten). + const RIET = { thickMM: 180, kgM2: 3.8, tileMM: 1000, nrs: ['001', '002', '003'], colors: { '001': '#947d69', '002': '#7c4c3f', '003': '#735e43' } }; const COVERINGS = Object.assign({ - dakleer: { label: 'Dakleer (EPDM)', thickMM: DAKLEER_MM, kgM2: DENSITY_DAKLEER_KGM2 } + dakleer: { label: 'Dakleer (EPDM)', color: '#2a2a2a', thickMM: DAKLEER_MM, kgM2: DENSITY_DAKLEER_KGM2 } }, ...RIET.nrs.map(nr => ({ - ['riet_' + nr]: { label: 'Riet ' + nr, thickMM: RIET.thickMM, kgM2: RIET.kgM2, file: `assets/textures/dak/riet_${nr}.jpg`, tileMM: RIET.tileMM, sloped: true } + ['riet_' + nr]: { label: 'Riet ' + nr, color: RIET.colors[nr] || '#8a7560', thickMM: RIET.thickMM, kgM2: RIET.kgM2, file: `assets/textures/dak/riet_${nr}.jpg`, tileMM: RIET.tileMM, sloped: true } }))); + // Voorvertoning (assets/textures/dak/thumb//.png) of null. + function coveringThumbUrl(key, px) { + const c = COVERINGS[key]; + return c && c.file ? c.file.replace(/[^/]+$/, (f) => `thumb/${px || 64}/` + f.replace(/\.jpg$/, '.png')) : null; + } // Werkelijke bedekking voor een dakvorm (riet niet op een plat dak). function coveringFor(key, shapeType) { const c = COVERINGS[key]; @@ -379,7 +385,14 @@ window.RoofModel = (() => { // dakleer (absoluut, loopt buiten het dak door met de helling). Geeft per // ribbe (segments) de geometrie terug; edge.spots wordt door LightingModel // gevuld (met y = onderkant boeideel ter plaatse). - function computeEdge(settings, roofs) { + // facadeDepth(a, b, normal) (optioneel, mm): dikte van de gevelafwerking + // (doek + latwerk, steen) buiten het wandvlak langs die ribbe. De gevel + // loopt achter het boeideel door tot de bovenkant van het dak; het + // boeideel / de daktrim valt er overheen en sluit aan de dakkant aan op + // het dak (binnenrand = dakrand, van boven dicht). De spots komen in de + // onderplaat vóór de gevel. Negatief = gevel van een ander (hoger) deel + // die naar dit dak toe kijkt: de rand stopt tegen die afgewerkte gevel. + function computeEdge(settings, roofs, facadeDepth) { const s = normalizeSettings(settings); const rects = roofs.map(r => r.rect); if (!roofs.length) return null; @@ -441,6 +454,25 @@ window.RoofModel = (() => { overRoof: !!nb && !dropped, dropped }; }); + // Binnenrand: alleen tegen de gevel van een hoger deel (negatieve + // diepte) inkorten; spotlijn vóór de gevel. Op een hoek van twee haakse + // ribben het snijpunt van beide verschoven lijnen, anders loodrecht. + const depRaw = segs.map(sg => (facadeDepth ? facadeDepth(sg.a, sg.b, sg.normal) || 0 : 0)); + const dep = depRaw.map(d => Math.min(0, d)); + const spotD = depRaw.map(d => Math.max(0, d) + (s.overhang - Math.max(0, d)) * SPOT_RATIO); + const perp = (m1, m2) => Math.abs(m1.x * m2.x + m1.z * m2.z) < 0.5; + const shifted = segs.map((sg, i) => { + const pi = (i - 1 + n) % n, ni = (i + 1) % n, pv = segs[pi], nx = segs[ni]; + const at = (v, own, ownD, other, otherD) => perp(own, other) + ? { x: v.x + own.x * ownD + other.x * otherD, z: v.z + own.z * ownD + other.z * otherD } + : { x: v.x + own.x * ownD, z: v.z + own.z * ownD }; + return { + a: at(sg.a, sg.normal, dep[i], pv.normal, dep[pi]), b: at(sg.b, sg.normal, dep[i], nx.normal, dep[ni]), + spotA: at(sg.a, sg.normal, spotD[i], pv.normal, spotD[pi]), spotB: at(sg.b, sg.normal, spotD[i], nx.normal, spotD[ni]) + }; + }); + segs.forEach((sg, i) => Object.assign(sg, shifted[i], { facadeDepth: depRaw[i] })); + // Naast een vervallen ribbe (tegen een hoger dak): // - ligt het verlengde van de rand in het hoge deel, dan loopt hij // recht door tot die gevel (spot op spotafstand van de gevel); @@ -559,7 +591,7 @@ window.RoofModel = (() => { } return { - DAKLEER_MM, EDGE_ABOVE_MM, RIET, OVERHANG_MIN, OVERHANG_MAX, DEFAULT_SETTINGS, SPOT_RATIO, FASCIA_COLORS, COVERINGS, coveringFor, + DAKLEER_MM, EDGE_ABOVE_MM, RIET, OVERHANG_MIN, OVERHANG_MAX, DEFAULT_SETTINGS, SPOT_RATIO, FASCIA_COLORS, COVERINGS, coveringFor, coveringThumbUrl, createDefaultRoof, thickness, createMaterials, build3D, computeSpecs, computeShape, wallProfile, profileHeight, computeUnitRoof, buildUnit3D, computeEdge, buildEdge3D, normalizeSettings diff --git a/js/wall/wall-model.js b/js/wall/wall-model.js index 89dbf9c..4ecef58 100644 --- a/js/wall/wall-model.js +++ b/js/wall/wall-model.js @@ -94,6 +94,33 @@ window.WallModel = (() => { 'R746 R747 R748 R748X764X749 R749 R750 R751 R751X759 R752 R754 R756 R757 R758 R759 R760 R761 R762 R763 R764 R764X756 R766 R767 R768 ' + 'R769 R770 R771 R772 R773 R775 R777 R788 R800 R835 R840 R911P R911 R913 R916 R917 R918 R921 R923P R931 R932 R941P R941 R942 R943 R944 ' + 'R960DF14_70 R960DF R961 R970 R980 R985 R991').split(' '); + // Gemiddelde kleur per steen (uit de textuur berekend), voor vlakke + // weergaven zoals de aanzichten in de PDF. + const STONE_COLORS = { + 'K490': '#b67d60', 'K518': '#666562', 'K560': '#937464', 'K662': '#877770', 'K706': '#615d58', 'K739': '#796f65', 'K752': '#8e6d5f', 'K764': '#a1927d', + 'K773': '#9f8c76', 'K911': '#e7ddc9', 'K911P': '#d6c8b6', 'K914': '#d4c0a5', 'K915': '#c5a37b', 'K919': '#cbb498', 'K923': '#c6b3a4', 'K923P': '#beaea1', + 'K941': '#d2c5b2', 'K941P': '#dcd2c0', 'K947': '#c9bca8', 'K948': '#b9a896', 'K960': '#b4a495', 'K991': '#9e7b69', 'R-693': '#675e5a', 'R100': '#eee4c7', + 'R116': '#e5ddc5', 'R140': '#eae3cc', 'R200': '#edc484', 'R206': '#e0b48b', 'R214': '#b88e74', 'R216': '#e0bc8c', 'R220': '#e29a72', 'R227': '#d49069', + 'R228': '#c48869', 'R240': '#e5c587', 'R268': '#ca956e', 'R286': '#b98d66', 'R287': '#d1a477', 'R303': '#a47562', 'R307': '#966b59', 'R332': '#ae8171', + 'R335': '#a97968', 'R343': '#a07662', 'R356': '#a47f77', 'R381': '#9c7c6f', 'R382': '#8e7769', 'R384': '#706260', 'R385': '#8a7972', 'R386': '#897f7e', + 'R391': '#8b6a64', 'R400': '#b67c63', 'R401': '#a97360', 'R435': '#ad7463', 'R436': '#9f7565', 'R440': '#b57860', 'R480': '#d58a65', 'R483': '#c08973', + 'R484': '#a78d7d', 'R487': '#c47f61', 'R488': '#bd8267', 'R489': '#a87967', 'R500': '#7d6c5e', 'R510': '#5b5855', 'R518': '#655d5a', 'R535': '#977365', + 'R540': '#7e685a', 'R550': '#8b796d', 'R555': '#9a7668', 'R560': '#8c6f63', 'R561': '#7c6762', 'R563': '#876965', 'R564': '#7c7168', 'R565': '#736a66', + 'R572DF': '#8b6657', 'R572DF14_64': '#886355', 'R580': '#907265', 'R581': '#837571', 'R582': '#96705e', 'R658': '#a47e65', 'R659': '#8a6d5a', 'R663': '#8b7163', + 'R664': '#8a6a5c', 'R665': '#ca996c', 'R669': '#716257', 'R680': '#b7a28d', 'R682': '#c3af99', 'R684': '#c29263', 'R685': '#926e5d', 'R686': '#b57f5e', + 'R687': '#b37f60', 'R688': '#d4ae82', 'R689': '#a67961', 'R690': '#b69477', 'R691': '#e1d3b6', 'R692': '#e1cda3', 'R694': '#aa6c56', 'R695': '#cfa77e', + 'R696': '#dbb897', 'R697': '#75685e', 'R698': '#a47760', 'R700': '#66615d', 'R714': '#90695b', 'R715': '#a16f5b', 'R717': '#706e6e', 'R719': '#a58272', + 'R720': '#998d8d', 'R721': '#a6948b', 'R725': '#a77963', 'R726': '#987c67', 'R727': '#8e6f5c', 'R729': '#a97260', 'R730': '#e7d3b5', 'R731': '#c68b66', + 'R732': '#e4cca6', 'R733': '#eee9ce', 'R734': '#c39c7e', 'R735': '#8c8982', 'R736': '#5f5b54', 'R737': '#7c7973', 'R738': '#7d7771', 'R739': '#81756c', + 'R740': '#5e595a', 'R742': '#e7d0ac', 'R743': '#a47f6e', 'R744': '#b38672', 'R745X737': '#9e8d78', 'R746': '#9a7d6f', 'R747': '#88776b', 'R748': '#8b7667', + 'R748X764X749': '#a08a77', 'R749': '#92826f', 'R750': '#a88374', 'R751': '#b87a63', 'R751X759': '#766b63', 'R752': '#946c58', 'R754': '#a97e6f', 'R756': '#d2b48c', + 'R757': '#eee8cc', 'R758': '#cb9978', 'R759': '#c78365', 'R760': '#baa595', 'R761': '#746f6b', 'R762': '#e9cfa9', 'R763': '#ebe1c6', 'R764': '#bea994', + 'R764X756': '#cfb695', 'R766': '#ddb991', 'R767': '#b38469', 'R768': '#b58774', 'R769': '#966e5d', 'R770': '#836e60', 'R771': '#c1b2a3', 'R772': '#d7c8b5', + 'R773': '#9d8b77', 'R775': '#917e6e', 'R777': '#6e6b6a', 'R788': '#a27c6c', 'R800': '#aba394', 'R835': '#c2b4a2', 'R840': '#c3b9a7', 'R911': '#e7deca', + 'R911P': '#d6c8b6', 'R913': '#d3c0a7', 'R916': '#dfc9a6', 'R917': '#dcaf7e', 'R918': '#caa174', 'R921': '#cbad9a', 'R923P': '#beaea1', 'R931': '#9f8773', + 'R932': '#a8917e', 'R941': '#c0b3a1', 'R941P': '#c2b6aa', 'R942': '#d3ccc1', 'R943': '#beb2a4', 'R944': '#afa295', 'R960DF': '#bab1a4', 'R960DF14_70': '#bbb2a5', + 'R961': '#c7b8a2', 'R970': '#ecdeb1', 'R980': '#ae9c88', 'R985': '#cd8b6d', 'R991': '#aa8274' + }; const isStoneFinish = (finish) => TRASRAAM_STONES.includes(finish); const stoneTextureUrl = (code) => STONE.DIR + encodeURIComponent(code + ' - Witte voeg.jpg'); const stoneThumbUrl = (code, px) => STONE.DIR + 'thumb/' + (px || 64) + '/' + encodeURIComponent(code + ' - Witte voeg.png'); @@ -933,9 +960,13 @@ window.WallModel = (() => { const trimR = skinExt && skinExt.right < 0 ? -skinExt.right * toM : 0; const trimTop = opts.trimTop || {}; const topOf = (v) => (v > 0 ? v : 1e7) * toM; + // Nooit tot in de bovenrand (dan geeft columnMinusRects geen vorm en + // valt de hele laag weg): hooguit 1 mm eronder; dat restje zit in het + // dak van de buur. + const underTop = (x0, x1) => Math.min(tlOut.at(x0), tlOut.at(x1), ...tlOut.kinks.filter(k => k > x0 && k < x1).map(tlOut.at)) - 0.001; const trimHoles = []; - if (trimL > 0) trimHoles.push({ hx0: -halfW - 1, hx1: -halfW + trimL, hy0: -1, hy1: topOf(trimTop.left) }); - if (trimR > 0) trimHoles.push({ hx0: halfW - trimR, hx1: halfW + 1, hy0: -1, hy1: topOf(trimTop.right) }); + if (trimL > 0) trimHoles.push({ hx0: -halfW - 1, hx1: -halfW + trimL, hy0: -1, hy1: Math.min(topOf(trimTop.left), underTop(-halfW, -halfW + trimL)) }); + if (trimR > 0) trimHoles.push({ hx0: halfW - trimR, hx1: halfW + 1, hy0: -1, hy1: Math.min(topOf(trimTop.right), underTop(halfW - trimR, halfW)) }); const outerHoles = holeExtents.concat(trimHoles); const trimHolesMM = trimHoles.map(h => ({ hx0: h.hx0 / toM, hx1: h.hx1 / toM, hy0: h.hy0 / toM, hy1: h.hy1 / toM })); @@ -1393,6 +1424,10 @@ window.WallModel = (() => { // Materiaallijst (BOM): elk los stuk hout met zijn maat, soort en // positie (voor de PDF-tekening en de unit-totalen). + // Elk stuk krijgt ook cutAngles: per zaagsnede de hoek t.o.v. haaks (graden; + // 0 = haaks). Schuine kop onder de daklijn, bovenregel langs de helling + // (loodrechte snede), keep onder een nok = twee sneden bovenaan. + const cutDeg = (dy, dx) => Math.round(Math.atan2(Math.abs(dy), Math.abs(dx)) * 180 / Math.PI * 10) / 10; function computeBOM(CONFIG, calcData) { const wallWidth = CONFIG.wallWidth, hLeft = CONFIG.wallHeightLeft, hRight = CONFIG.wallHeightRight; const halfW = wallWidth / 2; @@ -1407,12 +1442,12 @@ window.WallModel = (() => { let cursor = -halfW; floorCuts.forEach(cut => { if (cut.min > cursor) { - pieces.push({ length: cut.min - cursor, width: CONFIG.plateThick, depth: CONFIG.plateDepth, kind: 'onderregel', x: (cursor + cut.min) / 2, y: CONFIG.plateThick / 2 }); + pieces.push({ length: cut.min - cursor, width: CONFIG.plateThick, depth: CONFIG.plateDepth, kind: 'onderregel', x: (cursor + cut.min) / 2, y: CONFIG.plateThick / 2, cutAngles: [0, 0] }); } cursor = Math.max(cursor, cut.max); }); if (cursor < halfW) { - pieces.push({ length: halfW - cursor, width: CONFIG.plateThick, depth: CONFIG.plateDepth, kind: 'onderregel', x: (cursor + halfW) / 2, y: CONFIG.plateThick / 2 }); + pieces.push({ length: halfW - cursor, width: CONFIG.plateThick, depth: CONFIG.plateDepth, kind: 'onderregel', x: (cursor + halfW) / 2, y: CONFIG.plateThick / 2, cutAngles: [0, 0] }); } // Bovenregel(s): met nok twee stukken (verstek). outline = werkelijke @@ -1421,7 +1456,8 @@ window.WallModel = (() => { const sg = tl.segs[i]; pieces.push({ length: Math.hypot(sg.b.x - sg.a.x, sg.b.y - sg.a.y), width: CONFIG.plateThick, depth: CONFIG.plateDepth, kind: 'bovenregel', - x: (sg.a.x + sg.b.x) / 2, y: (sg.a.y + sg.b.y) / 2 - CONFIG.plateThick / 2, outline + x: (sg.a.x + sg.b.x) / 2, y: (sg.a.y + sg.b.y) / 2 - CONFIG.plateThick / 2, outline, + cutAngles: [cutDeg(sg.b.y - sg.a.y, sg.b.x - sg.a.x), cutDeg(sg.b.y - sg.a.y, sg.b.x - sg.a.x)] }); }); @@ -1442,7 +1478,7 @@ window.WallModel = (() => { pieces.push({ length: st.y1 - yBottom, width: CONFIG.studWidth, depth: CONFIG.studDepth, kind, x, y: (yBottom + st.y1) / 2, - yBottomLeft: yBottom, yBottomRight: yBottom, yTopLeft: st.y1, yTopRight: st.y1 + yBottomLeft: yBottom, yBottomRight: yBottom, yTopLeft: st.y1, yTopRight: st.y1, cutAngles: [0, 0] }); return; } @@ -1452,15 +1488,16 @@ window.WallModel = (() => { length: Math.max(...topPts.map(p => p.y)) - yBottom, width: CONFIG.studWidth, depth: CONFIG.studDepth, kind, x, y: (yBottom + yBottom + yTopLeft + yTopRight) / 4, yBottomLeft: yBottom, yBottomRight: yBottom, yTopLeft, yTopRight, - outline: [{ x: xLeft, y: yBottom }, { x: xRight, y: yBottom }, ...topPts.slice().reverse()] + outline: [{ x: xLeft, y: yBottom }, { x: xRight, y: yBottom }, ...topPts.slice().reverse()], + cutAngles: [0].concat(topPts.slice(1).map((q, k) => cutDeg(q.y - topPts[k].y, q.x - topPts[k].x))) }); }); CONFIG.openings.forEach(op => { const opXWorld = startX + op.x; - pieces.push({ length: op.w, width: CONFIG.studWidth, depth: CONFIG.studDepth, kind: 'bovendorpel', x: opXWorld + op.w / 2, y: op.y + op.h + CONFIG.studWidth / 2 }); + pieces.push({ length: op.w, width: CONFIG.studWidth, depth: CONFIG.studDepth, kind: 'bovendorpel', x: opXWorld + op.w / 2, y: op.y + op.h + CONFIG.studWidth / 2, cutAngles: [0, 0] }); if (op.y > CONFIG.plateThick) { - pieces.push({ length: op.w, width: CONFIG.studWidth, depth: CONFIG.studDepth, kind: 'onderdorpel', x: opXWorld + op.w / 2, y: op.y - CONFIG.studWidth / 2 }); + pieces.push({ length: op.w, width: CONFIG.studWidth, depth: CONFIG.studDepth, kind: 'onderdorpel', x: opXWorld + op.w / 2, y: op.y - CONFIG.studWidth / 2, cutAngles: [0, 0] }); } }); @@ -1546,7 +1583,7 @@ window.WallModel = (() => { } return { - STANDARD_BEAM, STOCK_LENGTHS_MM, CORNER_STUDS, EXTERIOR_MATERIALS, OPENING_TYPES, BATTEN, CLADDING_DIRECTIONS, CLADDING_THICK_MM, claddingOffset, cornerExt, TRASRAAM_DEFAULT_MM, STONE, TRASRAAM_STONES, isStoneFinish, stoneThumbUrl, trasraamFor, skinStartY, computeBattens, planPurchase, purchaseText, + STANDARD_BEAM, STOCK_LENGTHS_MM, CORNER_STUDS, EXTERIOR_MATERIALS, OPENING_TYPES, BATTEN, CLADDING_DIRECTIONS, CLADDING_THICK_MM, claddingOffset, cornerExt, TRASRAAM_DEFAULT_MM, STONE, STONE_COLORS, TRASRAAM_STONES, isStoneFinish, stoneThumbUrl, trasraamFor, skinStartY, computeBattens, planPurchase, purchaseText, sheathingHoles, skinSegmentsAtY, topLine, topPlateOutlines, validateState, resolveOpenings, computeBOM, groupBOM, buildConfig, configFromState, thicknessOf, computeFrame, createMaterials, build3D, computeSpecs