v0.5.3: elektra-buizen min. 50 mm uit elkaar (gebundeld alleen naar de meterkast), vloer-wcd met leiding door de vloer, elektra op de PDF-bladen per wand/vloer/dakvlak, kosten elektra (buis + draad per meter, boorgaten 90 s geteld op stijlen/regels/balken, dozen, groepenkast, keuring), dakbeschot OSB 18 mm bovenop de sporen, felsplaten als dakbedekking
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
e1a688728c
commit
b5510d56c7
+125
-2
@@ -94,6 +94,17 @@ window.ElektraPdf = (() => {
|
||||
doc.text(String(a.group), px(q.x + a.face.n.x * 330), py(q.z + a.face.n.z * 330) + 0.5, { align: 'center' });
|
||||
});
|
||||
|
||||
// Vloer-wcd: vierkantje met V + groepnummer.
|
||||
el.floorWcds.forEach(w => {
|
||||
doc.setDrawColor(...RUN_COLORS.wcd);
|
||||
doc.setFillColor(255, 255, 255);
|
||||
doc.setLineWidth(0.2);
|
||||
doc.rect(px(w.x) - 1.1, py(w.z) - 1.1, 2.2, 2.2, 'FD');
|
||||
doc.setTextColor(...RUN_COLORS.wcd);
|
||||
doc.setFontSize(3.6);
|
||||
doc.text('V' + w.group, px(w.x), py(w.z) + 0.5, { align: 'center' });
|
||||
});
|
||||
|
||||
// Lampletters (zelfde letter als de schakelaar).
|
||||
doc.setFontSize(3.6);
|
||||
doc.setTextColor(...BLACK);
|
||||
@@ -102,7 +113,7 @@ window.ElektraPdf = (() => {
|
||||
// Twee regels (doc.text met een array).
|
||||
const PLAN_LEGEND = [
|
||||
'Elektra: MK = meterkast, kadertje = schakelaar(s) met letter (dezelfde letter staat bij de lampen erop), rood rondje = dubbele wcd (groepnummer), vierkantje = verdeeldoos in plafond;',
|
||||
'rood kadertje = apparaat (KK kookgroep, WM wasmachine, DR droger, WP warmtepomp, OV oven, VW vaatwasser) met groepnummer; gestippeld = leidingen (geel licht, bruin schakeldraad, rood wcd/apparaat, groen buiten).'
|
||||
'rood kadertje = apparaat (KK kookgroep, WM wasmachine, DR droger, WP warmtepomp, OV oven, VW vaatwasser) met groepnummer, V = vloer-wcd; gestippeld = leidingen (geel licht, bruin schakeldraad, rood wcd/apparaat, groen buiten).'
|
||||
];
|
||||
|
||||
function drawSheet(doc, el, sheetOpts) {
|
||||
@@ -150,5 +161,117 @@ window.ElektraPdf = (() => {
|
||||
PdfSheet.titleBlock(doc, sheetOpts.project, sheetOpts);
|
||||
}
|
||||
|
||||
return { RUN_COLORS, drawPlan, drawSheet, PLAN_LEGEND };
|
||||
// ------------------------------------------------------------
|
||||
// Elektra op de bladen per onderdeel. Elk geeft een overlay-functie voor
|
||||
// WallPdf/FloorPdf (opts.overlay) of null als er niets te tekenen is.
|
||||
// ------------------------------------------------------------
|
||||
const lineCol = (doc, type) => doc.setDrawColor(...runColor(type));
|
||||
const clip = (p, q, b) => ElektraModel.clipPlan(p, q, b);
|
||||
// Leidingstukken van alle buizen waarvoor test(p, q) geldt.
|
||||
const conduitSegs = (el, test) => {
|
||||
const out = [];
|
||||
el.runs.forEach(r => {
|
||||
if (!ElektraModel.cableInfo(r.type).conduit) return;
|
||||
r.path.slice(1).forEach((q, i) => { const p = r.path[i]; if (test(p, q)) out.push({ type: r.type, p, q }); });
|
||||
});
|
||||
return out;
|
||||
};
|
||||
const labelBox = (doc, x, y, text, color) => {
|
||||
const w = 1.6 + text.length * 1.05;
|
||||
doc.setDrawColor(...color);
|
||||
doc.setFillColor(255, 255, 255);
|
||||
doc.setLineWidth(0.2);
|
||||
doc.rect(x - w / 2, y - 1.2, w, 2.4, 'FD');
|
||||
doc.setTextColor(...color);
|
||||
doc.setFontSize(5);
|
||||
doc.text(text, x, y + 0.7, { align: 'center' });
|
||||
};
|
||||
|
||||
// Wand (vooraanzicht, wand-x zoals de openingen): buizen in de wand,
|
||||
// schakelaars, wcd's, apparaten en de meterkast op dit wandstuk.
|
||||
function wallOverlay(el, piece) {
|
||||
if (!el || !el.enabled) return null;
|
||||
const on = (p) => p.wall && p.wall.piece === piece;
|
||||
const segs = conduitSegs(el, (p, q) => on(p) && on(q));
|
||||
const combos = el.combos.filter(c => c.face.piece === piece), wcds = el.wcds.filter(w => w.face.piece === piece);
|
||||
const apps = el.apps.filter(a => a.face.piece === piece), mk = el.meterkast && el.meterkast.face.piece === piece ? el.meterkast : null;
|
||||
if (!segs.length && !combos.length && !wcds.length && !apps.length && !mk) return null;
|
||||
const BLACK = PdfSheet.COLORS.BLACK;
|
||||
return (doc, pu, py) => {
|
||||
doc.setLineWidth(0.35);
|
||||
segs.forEach(sg => {
|
||||
const a = ElektraModel.wallCoords(sg.p.wall, sg.p), b = ElektraModel.wallCoords(sg.q.wall, sg.q);
|
||||
lineCol(doc, sg.type);
|
||||
doc.line(pu(a.u), py(a.y), pu(b.u), py(b.y));
|
||||
});
|
||||
if (mk) {
|
||||
doc.setDrawColor(...BLACK);
|
||||
doc.setFillColor(110, 110, 110);
|
||||
doc.setLineWidth(0.25);
|
||||
doc.rect(pu(mk.u - mk.w / 2), py(mk.y + mk.h), (pu(mk.u + mk.w / 2) - pu(mk.u - mk.w / 2)), py(mk.y) - py(mk.y + mk.h), 'FD');
|
||||
doc.setTextColor(255, 255, 255);
|
||||
doc.setFontSize(6);
|
||||
doc.text('MK', pu(mk.u), py(mk.y + mk.h / 2) + 1, { align: 'center' });
|
||||
}
|
||||
combos.forEach(c => labelBox(doc, pu(c.u), py(c.y), c.switches.map(x => x.letter).join(' '), BLACK));
|
||||
wcds.forEach(w => labelBox(doc, pu(w.u), py(w.y), `wcd ${w.group}`, RUN_COLORS.wcd));
|
||||
apps.forEach(a => labelBox(doc, pu(a.u), py(a.y), `${a.code} ${a.group}`, RUN_COLORS.wcd));
|
||||
};
|
||||
}
|
||||
|
||||
// Vloer van een unit (bovenaanzicht vanaf linksvoor): buizen in de vloer + vloer-wcd's.
|
||||
function floorOverlay(el, unit) {
|
||||
if (!el || !el.enabled) return null;
|
||||
const r = unit.rect, b = { x0: r.x0, x1: r.x1, z0: r.z0, z1: r.z1 };
|
||||
const segs = conduitSegs(el, (p, q) => p.floor && q.floor).map(sg => Object.assign(sg, { c: clip(sg.p, sg.q, b) })).filter(sg => sg.c);
|
||||
const vw = el.floorWcds.filter(w => w.unitId === unit.id);
|
||||
if (!segs.length && !vw.length) return null;
|
||||
return (doc, px, py) => {
|
||||
doc.setLineWidth(0.35);
|
||||
segs.forEach(sg => {
|
||||
const [a, c] = sg.c;
|
||||
if (Math.hypot(c.x - a.x, c.z - a.z) < 1) return;
|
||||
lineCol(doc, sg.type);
|
||||
doc.line(px(a.x - r.x0), py(a.z - r.z0), px(c.x - r.x0), py(c.z - r.z0));
|
||||
});
|
||||
vw.forEach(w => labelBox(doc, px(w.x - r.x0), py(w.z - r.z0), `vloer-wcd ${w.group}`, RUN_COLORS.wcd));
|
||||
};
|
||||
}
|
||||
|
||||
// Dakvlak (dek zoals de dakbladen, zelfde omrekening als de doorvoeren in
|
||||
// RoofModel.computeUnitRoof): buizen boven het plafond, verdeeldozen en
|
||||
// binnenspots (met letter) in dit vlak.
|
||||
function roofOverlay(el, unit, pl) {
|
||||
if (!el || !el.enabled) return null;
|
||||
const dm = ElektraModel.roofDeckMap(unit, pl), map = dm.map, b = dm.bounds;
|
||||
const inside = (p) => p.x >= b.x0 - 0.5 && p.x <= b.x1 + 0.5 && p.z >= b.z0 - 0.5 && p.z <= b.z1 + 0.5;
|
||||
const segs = conduitSegs(el, (p, q) => p.ceil && q.ceil).map(sg => Object.assign(sg, { c: clip(sg.p, sg.q, b) })).filter(sg => sg.c);
|
||||
const boxes = el.boxes.filter(bx => inside(bx));
|
||||
const lamps = [];
|
||||
el.switches.forEach(sw => sw.lamps.forEach(l => { if (l.kind === 'binnenspot' && inside(l)) lamps.push({ l, letter: sw.letter }); }));
|
||||
if (!segs.length && !boxes.length && !lamps.length) return null;
|
||||
const BLACK = PdfSheet.COLORS.BLACK;
|
||||
return (doc, px, py) => {
|
||||
doc.setLineWidth(0.35);
|
||||
segs.forEach(sg => {
|
||||
const a = map(sg.c[0]), c = map(sg.c[1]);
|
||||
if (Math.hypot(c.sx - a.sx, c.sy - a.sy) < 1) return;
|
||||
lineCol(doc, sg.type);
|
||||
doc.line(px(a.sx), py(a.sy), px(c.sx), py(c.sy));
|
||||
});
|
||||
doc.setLineWidth(0.2);
|
||||
boxes.forEach(bx => { const m = map(bx); lineCol(doc, 'schakel'); doc.rect(px(m.sx) - 0.9, py(m.sy) - 0.9, 1.8, 1.8, 'S'); });
|
||||
doc.setFontSize(4);
|
||||
lamps.forEach(({ l, letter }) => {
|
||||
const m = map(l);
|
||||
doc.setDrawColor(...BLACK);
|
||||
doc.setFillColor(255, 233, 168);
|
||||
doc.circle(px(m.sx), py(m.sy), 0.8, 'FD');
|
||||
doc.setTextColor(...BLACK);
|
||||
doc.text(letter, px(m.sx) + 1.1, py(m.sy) - 0.8);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
return { RUN_COLORS, drawPlan, drawSheet, PLAN_LEGEND, wallOverlay, floorOverlay, roofOverlay };
|
||||
})();
|
||||
|
||||
Reference in New Issue
Block a user