v0.4.13: opbouw buitenwand boven lager dak, latwerk-raster per gevel, dakrand 80 mm boven dakleer, lage rand loopt door

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Machiel
2026-09-30 15:33:47 +02:00
co-authored by Claude Opus 5.5
parent 373c2c2fb7
commit 94a5215f82
8 changed files with 207 additions and 46 deletions
+15 -4
View File
@@ -508,6 +508,9 @@ window.WallModel = (() => {
// linkerrand van dit stuk. Het verticale latten-raster volgt dan de
// hele gevel i.p.v. per stuk opnieuw te beginnen; een eindlat komt
// alleen aan het einde van de gevel.
// facade.gridY0 (optioneel, mm, wand-coördinaten): hoogte waarop het
// horizontale latten-raster van de hele gevel begint. Een wandstuk dat
// hoger begint (opbouw, blootliggende naadwand) volgt zo hetzelfde raster.
// skinFrom (optioneel, mm): buitenafwerking pas vanaf deze hoogte (het
// blootliggende deel van een naadwand boven het dak van de andere unit).
function computeBattens(CONFIG, cladding, trasraam, skinExt, facade, skinFrom) {
@@ -524,7 +527,12 @@ window.WallModel = (() => {
// Horizontale latten: vanaf de onderkant elke 400 mm (hartmaat).
const horizontaal = [];
for (let y = y0 + w / 2; y < tl.maxY - w / 2; y += sp) {
let yStart = y0 + w / 2;
if (facade && facade.gridY0 !== undefined) {
const g = facade.gridY0 + w / 2;
yStart = g + Math.max(0, Math.ceil((yStart - g) / sp - 1e-9)) * sp;
}
for (let y = yStart; y < tl.maxY - w / 2; y += sp) {
skinSegmentsAtY(CONFIG, y).forEach(([x0, x1]) => {
if (x0 <= -halfW + 0.5) x0 = xL;
if (x1 >= halfW - 0.5) x1 = xR;
@@ -646,10 +654,13 @@ window.WallModel = (() => {
// Watermerk-UV's (doek) in gevel-coördinaten, zodat het patroon over
// naden/wandstukken doorloopt (UV = vormcoördinaat in m + verschuiving).
const uvShiftM = facade ? (CONFIG.wallWidth / 2 + facade.u0) * 0.001 : 0;
// Verticaal: een hoger beginnend stuk (facade.yOff, mm boven het
// loopvlak van de gevel) schuift het watermerk mee omhoog.
const uvShiftYM = facade && facade.yOff ? facade.yOff * 0.001 : 0;
const shiftUV = (geo) => {
if (!uvShiftM) return geo;
if (!uvShiftM && !uvShiftYM) return geo;
const uv = geo.attributes.uv;
for (let k = 0; k < uv.count; k++) uv.setX(k, uv.getX(k) + uvShiftM);
for (let k = 0; k < uv.count; k++) { uv.setX(k, uv.getX(k) + uvShiftM); uv.setY(k, uv.getY(k) + uvShiftYM); }
return geo;
};
@@ -1335,7 +1346,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, trasraamFor, 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, trasraamFor, skinStartY, computeBattens, planPurchase, purchaseText,
sheathingHoles, skinSegmentsAtY, topLine, topPlateOutlines,
validateState, resolveOpenings, computeBOM, groupBOM, buildConfig, configFromState, thicknessOf, computeFrame,
createMaterials, build3D, computeSpecs
+3 -2
View File
@@ -1028,10 +1028,11 @@ function mountWallEditor(container, callbacks) {
}
// Naad-zones (wand vervalt daar, zie woning) als gearceerde overlay.
// Met upTo (mm): opbouw boven het lagere dak, alleen gearceerd tot daar.
function drawSeamOverlay(toCanvasX, toCanvasY, halfWMM, maxRoofMM) {
seamCuts.forEach(([u0, u1]) => {
seamCuts.forEach(([u0, u1, upTo]) => {
const x0 = toCanvasX(-halfWMM + u0), x1 = toCanvasX(-halfWMM + u1);
const yTop = toCanvasY(maxRoofMM), yBot = toCanvasY(0);
const yTop = toCanvasY(upTo > 0 ? Math.min(upTo, maxRoofMM) : maxRoofMM), yBot = toCanvasY(0);
ctxFront.save();
ctxFront.fillStyle = 'rgba(17, 17, 17, 0.8)';
ctxFront.fillRect(x0, yTop, x1 - x0, yBot - yTop);