From 20d8546b6f78c2dff37b64b9237d2e62da0cfd19 Mon Sep 17 00:00:00 2001 From: ypshim Date: Mon, 26 Oct 2026 17:43:53 +0900 Subject: [PATCH] =?UTF-8?q?fix(rebar):=20=ED=99=95=EB=8C=80=EA=B8=B0?= =?UTF-8?q?=EC=B4=88=20=EB=8B=A8=EB=A9=B4=20=ED=92=8D=EC=84=A0=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=EB=A5=BC=20=EC=99=B8=EA=B3=BD=20=EB=B0=96=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=8E=BC=EC=B9=98=EA=B3=A0=20=EC=A7=80=EC=8B=9C?= =?UTF-8?q?=EC=84=A0=20=EC=B6=94=EA=B0=80,=20=EC=BA=A1=EC=85=98=EC=9D=84?= =?UTF-8?q?=20=EC=95=84=EB=9E=98=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 풍선을 외곽 위·아래에 넓게 배치하고, 각 철근 표시까지 지시선을 그림 (지시선도 같은 data-bar로 강조) - B2·B4·B3가 겹치던 문제 해결 (풍선 간격 70 px) - 뷰박스 높이 300, 캡션을 맨 아래로 Co-Authored-By: Claude Haiku 5.5 --- src/view/footing-section-svg.ts | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/view/footing-section-svg.ts b/src/view/footing-section-svg.ts index a50078f..e372bd8 100644 --- a/src/view/footing-section-svg.ts +++ b/src/view/footing-section-svg.ts @@ -99,13 +99,23 @@ export function footingSectionSvg(model: PierModel): string { parts.push(text(xr, y(H) + 10, `${fs.cTop}`, 'start', COLOR.dim)); parts.push(text(xr, (y(H) + y(0)) / 2, `${levels - 1}@${fs.sV}=${(levels - 1) * fs.sV}`, 'start', COLOR.dim)); parts.push(text(xr, y(0) - 4, `${fs.cBottom}`, 'start', COLOR.dim)); - parts.push(text(X0, y(0) + 36, `높이 방향 축소 (×${SCALE_Y}) · 다리 생략 · 기준: 확대기초 하면 0`, 'start', COLOR.outline)); + parts.push(text(X0, 292, `높이 방향 축소 (×${SCALE_Y}) · 다리 생략 · 기준: 확대기초 하면 0`, 'start', COLOR.outline)); - // Bubbles: one per bar family, linked to its marks through data-bar (click to highlight, in the panel). - const bubbles: [string, number, number][] = [['B5', xa + 6, 24], ['B1', x(xs[1]), 40], ['B11', xb - 6, 56], ['B2', x(xs[1]), y(0) + 40], ['B4', x(xs[2]), y(0) + 40], ['B3', x(xs[3]), y(0) + 40], ['B10-1', X0 - 16, y(fs.cBottom) - 6]]; - for (const [name, bx, by] of bubbles) { - parts.push(`${name}`); - } + // Bubbles outside the outline, spread apart, each with a leader to its bar (the leader carries the same data-bar, so it highlights too). + const bubble = (name: string, bx: number, by: number, tx: number, ty: number) => { + const edgeY = by < ty ? by + 11 : by - 11; + return `${name}`; + }; + const yTop = 52; + const yBot = y(0) + 50; + parts.push(bubble('B5', xa + 40, yTop, xa + 40, y(z.B5))); + parts.push(bubble('B1', x(xs[1]) + 30, yTop, x(xs[1]), y(z.B1))); + const zB11 = js.length > 0 ? fs.cBottom + js[0] * fs.sV : fs.cBottom; + parts.push(bubble('B11', xb - 30, yTop, xb, y(zB11))); + parts.push(bubble('B10-1', X0 - 18, y(fs.cBottom + (levels - 1) * fs.sV / 2), X0 + 2, y(fs.cBottom + (levels - 1) * fs.sV / 2))); + parts.push(bubble('B2', cx - 70, yBot, x(xs[1]), y(z.B24))); + parts.push(bubble('B4', cx, yBot, x(xs[2]), y(z.B24))); + parts.push(bubble('B3', cx + 70, yBot, x(xs[3]), y(z.B3))); - return `${parts.join('')}`; + return `${parts.join('')}`; }