diff --git a/svelte-app/src/lib/export.ts b/svelte-app/src/lib/export.ts
index aa6a6bf..f778ef8 100644
--- a/svelte-app/src/lib/export.ts
+++ b/svelte-app/src/lib/export.ts
@@ -20,16 +20,52 @@ function parseConveyanceLabel(label: string): { lines: string[]; stripped: strin
/** Emit conveyance label text element inside the shape */
function emitConveyanceLabel(lines: string[], sym: PlacedSymbol, outerTransform: string) {
if (!sym.label) return;
- const { lines: textLines } = parseConveyanceLabel(sym.label);
- const cx = sym.x + sym.w / 2;
- const cy = sym.y + sym.h / 2;
- const fontSize = Math.min(14, (sym.h - 4) / textLines.length);
+ const { lines: textLines, stripped } = parseConveyanceLabel(sym.label);
+ const tAttr = outerTransform ? ` transform="${outerTransform}"` : '';
+
+ // Curved symbols: place along arc midpoint
+ if (isCurvedType(sym.symbolId)) {
+ const angle = sym.curveAngle || 90;
+ const { arcCx, arcCy, outerR, innerR, bandW } = getCurveGeometry(sym.symbolId, sym.x, sym.y, sym.w, sym.h);
+ const midR = (outerR + innerR) / 2;
+ const midAngleRad = ((angle / 2) * Math.PI) / 180;
+ const textX = arcCx + midR * Math.cos(midAngleRad);
+ const textY = arcCy - midR * Math.sin(midAngleRad);
+ const rotDeg = -angle / 2 + 90;
+ const fontSize = Math.min(14, (bandW - 4) / textLines.length);
+ if (fontSize < 4) return;
+ const lineH = fontSize;
+ const curveTransform = `translate(${textX},${textY}) rotate(${rotDeg})${outerTransform ? ' ' + outerTransform : ''}`;
+ for (let i = 0; i < textLines.length; i++) {
+ const dy = -(textLines.length - 1) * lineH / 2 + i * lineH;
+ lines.push(` ${textLines[i]}`);
+ }
+ return;
+ }
+
+ // Spur: center in trapezoid
+ let labelCx: number, labelCy: number, availW: number, availH: number;
+ if (isSpurType(sym.symbolId)) {
+ const w2 = sym.w2 ?? sym.w;
+ const midW = (w2 + sym.w) / 2;
+ labelCx = sym.x + midW / 2;
+ labelCy = sym.y + sym.h / 2;
+ availW = midW - 4;
+ availH = sym.h - 4;
+ } else {
+ labelCx = sym.x + sym.w / 2;
+ labelCy = sym.y + sym.h / 2;
+ availW = sym.w - 4;
+ availH = sym.h - 4;
+ }
+
+ const useLines = textLines;
+ const fontSize = Math.min(14, availH / useLines.length);
if (fontSize < 4) return;
const lineH = fontSize;
- const startY = cy - (textLines.length - 1) * lineH / 2;
- const tAttr = outerTransform ? ` transform="${outerTransform}"` : '';
- for (let i = 0; i < textLines.length; i++) {
- lines.push(` ${textLines[i]}`);
+ for (let i = 0; i < useLines.length; i++) {
+ const dy = -(useLines.length - 1) * lineH / 2 + i * lineH;
+ lines.push(` ${useLines[i]}`);
}
}