fix(view): the 끊음 marks are short "//" breaks, and the pile label sits clear below them

The break lines ran across the members at a slant. They are now two short slanted strokes on the column stub and across the
pile group, and the pile label is moved below the break.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-23 16:11:21 +09:00
1 parent a2e4648f7b
commit c0a4ce57ad
1 file changed
+11 -4
+11 -4
View File
@@ -13,6 +13,12 @@ const PILE_STUB = 4;
const mm = (v: number) => Math.round(v * 1000);
/** A break mark (끊음): two short slanted strokes "//" centred on (x, y), so the member is shown as cut. */
function breakMark(x: number, y: number, halfWidth: number): string {
const d = 0.12;
return `<g stroke="#55606e" stroke-width="0.03" fill="none"><line x1="${x - halfWidth - d / 2}" y1="${y - 0.15}" x2="${x - halfWidth + d / 2}" y2="${y + 0.15}"/><line x1="${x + halfWidth - d / 2}" y1="${y - 0.15}" x2="${x + halfWidth + d / 2}" y2="${y + 0.15}"/></g>`;
}
function svgOf(x0: number, y0: number, w: number, h: number, label: string, body: string): string {
const pw = Math.round(w * FOOTING_PX_PER_M);
const ph = Math.round(h * FOOTING_PX_PER_M);
@@ -68,15 +74,16 @@ export function footingSideSvg(model: PierModel): string {
const col = model.columns[0];
if (col) {
parts.push(`<rect x="${col.s - col.diameter / 2}" y="${-f.top - COLUMN_STUB}" width="${col.diameter}" height="${COLUMN_STUB}" fill="#c9d4df" stroke="#0f5c66" stroke-width="0.02"/>`);
// Break marks on the column stub and at the pile bottom.
parts.push(`<line x1="${col.s - col.diameter}" y1="${-f.top - COLUMN_STUB * 0.6}" x2="${col.s + col.diameter}" y2="${-f.top - COLUMN_STUB * 0.6 - 0.2}" stroke="#55606e" stroke-width="0.03"/>`);
// Break mark on the column stub, at its middle.
parts.push(breakMark(col.s, -f.top - COLUMN_STUB / 2, col.diameter / 2 + 0.15));
}
if (piles.length) {
parts.push(`<line x1="${f.s - f.length / 2}" y1="${-(botEl + 0.3)}" x2="${f.s + f.length / 2}" y2="${-(botEl + 0.3) - 0.2}" stroke="#55606e" stroke-width="0.03"/>`);
// Break mark across the pile group, in the lower stub (the pile label sits below it).
parts.push(breakMark(f.s, -(botEl + 0.6), f.length / 2));
}
parts.push(`<text x="${f.s + f.length / 2 + 0.35}" y="${-(f.top + f.bottom) / 2}" font-size="0.28" text-anchor="start">h1 ${mm(f.top - f.bottom)}</text>`);
if (piles.length) {
parts.push(`<text x="${f.s}" y="${-(botEl + 0.9)}" font-size="0.28" text-anchor="middle">말뚝 ${mm(pileLen)} (끊음)</text>`);
parts.push(`<text x="${f.s}" y="${-(botEl + 1.3)}" font-size="0.28" text-anchor="middle">말뚝 ${mm(pileLen)} (끊음)</text>`);
}
void pileTop;
return svgOf(x0, y0, w, h, '확대기초·말뚝 측면', parts.join(''));