feat(abut): 날개벽 측면 삽도에 흉벽 · 브라켓 단차 · 저판을 함께 그리고 교대 삽도 EL 표기를 EL.xx.xxx로 통일
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
886347471e
commit
41b3165543
7 files changed
+83
-36
No files matched your search
+12
-10
@@ -35,6 +35,8 @@ const CONC = '#d9c9a8';
|
||||
const CONC_DARK = '#c7b48d';
|
||||
const FOOT = '#b9c3ce';
|
||||
const t3 = (v: number) => v.toFixed(3);
|
||||
/** EL 표기 (2026-11-04): "EL.41.995". */
|
||||
const el = (v: number) => `EL.${v.toFixed(3)}`;
|
||||
const label = (x: number, y: number, s: string, anchor = 'middle', fill = INK) =>
|
||||
`<text x="${x.toFixed(1)}" y="${y.toFixed(1)}" text-anchor="${anchor}" font-size="11" fill="${fill}" font-family="JetBrains Mono, monospace">${s}</text>`;
|
||||
const poly = (pts: [number, number][], style: string) => `<polygon points="${pts.map(([x, y]) => `${x.toFixed(1)},${y.toFixed(1)}`).join(' ')}" ${style}/>`;
|
||||
@@ -75,12 +77,12 @@ export function abutWallSectionSvg(d: AbutWallDrawing): string {
|
||||
`<line x1="${X(0).toFixed(1)}" y1="4" x2="${X(0).toFixed(1)}" y2="${(H - 30).toFixed(1)}" stroke="#c0392b" stroke-dasharray="6 3"/>`,
|
||||
label(X(0), 14, '교대축', 'middle', '#c0392b'),
|
||||
label((X(d.wallBackM) + X(d.wallFrontM)) / 2, Y(top) - 18, `${d.bracketWidthMm} + ${d.parapetThicknessMm} + ${d.seatWidthMm} = ${d.bracketWidthMm + d.parapetThicknessMm + d.seatWidthMm}`),
|
||||
label(X(0) + 6, Y(top) - 4, `흉벽 상단 ${t3(top)}`, 'start'),
|
||||
label(X(d.wallBackM) - 6, Y(bracket) + 4, `브라켓 상면 ${t3(bracket)}`, 'end'),
|
||||
label(X(d.wallFrontM) + 6, Y(seg.seatEl) + 4, `교좌면 ${t3(seg.seatEl)}`, 'start'),
|
||||
label(X(0) + 6, Y(top) - 4, `흉벽 상단 ${el(top)}`, 'start'),
|
||||
label(X(d.wallBackM) - 6, Y(bracket) + 4, `브라켓 상면 ${el(bracket)}`, 'end'),
|
||||
label(X(d.wallFrontM) + 6, Y(seg.seatEl) + 4, `교좌면 ${el(seg.seatEl)}`, 'start'),
|
||||
label(X(d.wallFrontM) + 6, Y((seg.seatEl + d.footingTopEl) / 2) + 4, `벽체 ${(seg.seatEl - d.footingTopEl).toFixed(3)}`, 'start'),
|
||||
label(X(d.footingFrontM) + 6, Y(d.footingTopEl) + 4, `상면 ${t3(d.footingTopEl)}`, 'start'),
|
||||
label(X(d.footingFrontM) + 6, Y(d.footingBottomEl) + 4, `기초 하단 ${t3(d.footingBottomEl)}`, 'start'),
|
||||
label(X(d.footingFrontM) + 6, Y(d.footingTopEl) + 4, `상면 ${el(d.footingTopEl)}`, 'start'),
|
||||
label(X(d.footingFrontM) + 6, Y(d.footingBottomEl) + 4, `기초 하단 ${el(d.footingBottomEl)}`, 'start'),
|
||||
label(X(d.footingBackM), H - 8, '← 배면', 'start', MUTED),
|
||||
label(X(d.footingFrontM), H - 8, '전면 →', 'end', MUTED),
|
||||
'</svg>',
|
||||
@@ -118,11 +120,11 @@ export function abutWallElevationSvg(d: AbutWallDrawing): string {
|
||||
}
|
||||
const first = d.segments.find((g) => d.lengthM >= g.sFrom && d.lengthM <= g.sTo) ?? d.segments[d.segments.length - 1];
|
||||
const last = d.segments.find((g) => g.sFrom <= 0 && g.sTo >= 0) ?? d.segments[0];
|
||||
parts.push(label(X(d.lengthM), Y(d.parapetTopEndEl) - 6, t3(d.parapetTopEndEl), 'start'));
|
||||
parts.push(label(X(0), Y(d.parapetTopStartEl) - 6, t3(d.parapetTopStartEl), 'end'));
|
||||
parts.push(label(X(d.lengthM) - 4, Y(first.seatEl) + 4, t3(first.seatEl), 'end'));
|
||||
parts.push(label(X(0) + 4, Y(last.seatEl) + 4, t3(last.seatEl), 'start'));
|
||||
parts.push(label(X(d.lengthM) - 4, Y(d.footingBottomEl) + 4, t3(d.footingBottomEl), 'end'));
|
||||
parts.push(label(X(d.lengthM), Y(d.parapetTopEndEl) - 6, el(d.parapetTopEndEl), 'start'));
|
||||
parts.push(label(X(0), Y(d.parapetTopStartEl) - 6, el(d.parapetTopStartEl), 'end'));
|
||||
parts.push(label(X(d.lengthM) - 4, Y(first.seatEl) + 4, el(first.seatEl), 'end'));
|
||||
parts.push(label(X(0) + 4, Y(last.seatEl) + 4, el(last.seatEl), 'start'));
|
||||
parts.push(label(X(d.lengthM) - 4, Y(d.footingBottomEl) + 4, el(d.footingBottomEl), 'end'));
|
||||
parts.push(label(X(d.lengthM), H - 8, 'IP3', 'middle', MUTED));
|
||||
parts.push(label(X(0), H - 8, 'IP1', 'middle', MUTED));
|
||||
parts.push(label((X(0) + X(d.lengthM)) / 2, H - 8, `${d.lengthM.toFixed(3)} m`));
|
||||
|
||||
Reference in new issue
Block a user