feat(rebar): 확대기초 단면 풍선 지시선의 끝을 점철근 표시로 변경

- 각 풍선의 지시선 끝에 철근 계열 색의 점(점철근)을 찍어, 선 위가 아니라 점에 닿도록 함
- B1–B4 선 철근, B11 선 철근도 같은 방식으로 점 표시

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-27 09:59:18 +09:00
1 parent 71fdb75c71
commit 61a8db916d
1 file changed
+10 -9
+10 -9
View File
@@ -153,21 +153,22 @@ export function footingSectionSvg(model: PierModel): string {
parts.push(text(xr + 6, yNote + 12, `높이 ${(z.B5 - z.B68).toFixed(0)}`, 'start', COLOR.b5));
// 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) => {
// A leader ends on a point rebar (점철근) of its family: a small dot in the family colour at the leader end (승인 2026-10-26).
const bubble = (name: string, bx: number, by: number, tx: number, ty: number, dotColor: string) => {
const edgeY = by < ty ? by + 11 : by - 11;
return `<g class="bubble" data-bubble="${name}"><line class="leader" data-bar="${name}" x1="${bx.toFixed(1)}" x2="${tx.toFixed(1)}" y1="${edgeY.toFixed(1)}" y2="${ty.toFixed(1)}" stroke="${COLOR.outline}" stroke-width="0.7"/><circle cx="${bx.toFixed(1)}" cy="${by.toFixed(1)}" r="11" fill="#fff" stroke="${COLOR.outline}"/><text x="${bx.toFixed(1)}" y="${(by + 3).toFixed(1)}" font-size="9" text-anchor="middle" fill="${COLOR.outline}">${name}</text></g>`;
return `<g class="bubble" data-bubble="${name}"><line class="leader" data-bar="${name}" x1="${bx.toFixed(1)}" x2="${tx.toFixed(1)}" y1="${edgeY.toFixed(1)}" y2="${ty.toFixed(1)}" stroke="${COLOR.outline}" stroke-width="0.7"/><circle class="leader-point" data-bar="${name}" cx="${tx.toFixed(1)}" cy="${ty.toFixed(1)}" r="2.6" fill="${dotColor}"/><circle cx="${bx.toFixed(1)}" cy="${by.toFixed(1)}" r="11" fill="#fff" stroke="${COLOR.outline}"/><text x="${bx.toFixed(1)}" y="${(by + 3).toFixed(1)}" font-size="9" text-anchor="middle" fill="${COLOR.outline}">${name}</text></g>`;
};
const zB11 = js.length > 0 ? fs.cBottom + js[0] * fs.sV : fs.cBottom;
const yTop = 40;
const yBot = Y0 + 100;
// Each bottom bubble sits straight below its own bar (B2 left of centre, B4 at centre, B3 right of centre) on a bar of the right parity.
parts.push(bubble('B5', xa + 12, yTop, x(xsW[1]), y(z.B5)));
parts.push(bubble('B1', cx - 60, yTop, cx - 60, y(z.B1)));
parts.push(bubble('B11', xb - 20, 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, cx - 70, y(z.B24)));
parts.push(bubble('B4', cx, yBot, cx, y(z.B24)));
parts.push(bubble('B3', cx + 70, yBot, cx + 70, y(z.B3)));
parts.push(bubble('B5', xa + 12, yTop, x(xsW[1]), y(z.B5), COLOR.b5));
parts.push(bubble('B1', cx - 60, yTop, cx - 60, y(z.B1), COLOR.b14));
parts.push(bubble('B11', xb - 20, yTop, xb, y(zB11), COLOR.b11));
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), COLOR.b10));
parts.push(bubble('B2', cx - 70, yBot, cx - 70, y(z.B24), COLOR.b14));
parts.push(bubble('B4', cx, yBot, cx, y(z.B24), COLOR.b14));
parts.push(bubble('B3', cx + 70, yBot, cx + 70, y(z.B3), COLOR.b14));
// Legend (선 모양별, 삽도 기준) and the units note.
const yLeg = 352;