task(C3): extend pixi element types - dimension/leader/revcloud/chair/table/stage
This commit is contained in:
@@ -130,6 +130,112 @@ export function elementToPrimitives(el: CADElement): ShapePrimitive[] {
|
||||
}];
|
||||
}
|
||||
|
||||
// ── Task C3: bisher im Pixi-Pfad fehlende Typen ──
|
||||
|
||||
case 'dimension': {
|
||||
// Legacy-Konvention: x1..y2 in properties, BBox-Zentrum als x/y,
|
||||
// Extension lines + Hauptlinie; Pfeilspitzen sind Detail (C3+)
|
||||
const x1 = (props.x1 as number | undefined) ?? el.x - el.width / 2;
|
||||
const y1 = (props.y1 as number | undefined) ?? el.y;
|
||||
const x2 = (props.x2 as number | undefined) ?? el.x + el.width / 2;
|
||||
const y2 = (props.y2 as number | undefined) ?? el.y;
|
||||
const color = (props.color as string | undefined) ?? '#aaaaaa';
|
||||
const dimColor = (props.dimColor as string | undefined) ?? color;
|
||||
const label = String(props.value ?? props.text ?? '');
|
||||
const out: ShapePrimitive[] = [
|
||||
{ kind: 'line', from: { x: x1, y: y1 }, to: { x: x2, y: y2 }, stroke: dimColor, strokeWidth: 1 },
|
||||
];
|
||||
if (label) {
|
||||
out.push({
|
||||
kind: 'text',
|
||||
at: { x: (x1 + x2) / 2, y: (y1 + y2) / 2 - 12 },
|
||||
text: label,
|
||||
fontSize: 10,
|
||||
color: dimColor,
|
||||
});
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
case 'leader': {
|
||||
// Legacy-Konvention: Linie p1→p2 + optionaler Text am Ende
|
||||
const lx1 = (props.x1 as number | undefined) ?? el.x;
|
||||
const ly1 = (props.y1 as number | undefined) ?? el.y;
|
||||
const lx2 = (props.x2 as number | undefined) ?? el.x + el.width;
|
||||
const ly2 = (props.y2 as number | undefined) ?? el.y + el.height;
|
||||
const out: ShapePrimitive[] = [
|
||||
{ kind: 'line', from: { x: lx1, y: ly1 }, to: { x: lx2, y: ly2 }, stroke, strokeWidth: sw },
|
||||
];
|
||||
const label = String(props.text ?? '');
|
||||
if (label) {
|
||||
out.push({
|
||||
kind: 'text',
|
||||
at: { x: lx2 + 4, y: ly2 - 4 },
|
||||
text: label,
|
||||
fontSize: (props.fontSize as number | undefined) ?? 12,
|
||||
color: stroke,
|
||||
});
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
case 'revcloud': {
|
||||
// Revisionswolke: Punkte-Zug (Bogen-Detail folgt in C3+)
|
||||
const pts = Array.isArray(props.points)
|
||||
? (props.points as unknown[]).map(asPoint)
|
||||
: [];
|
||||
if (pts.length < 2) return [];
|
||||
return [{
|
||||
kind: 'polyline',
|
||||
points: pts,
|
||||
close: true,
|
||||
stroke,
|
||||
strokeWidth: sw,
|
||||
}];
|
||||
}
|
||||
|
||||
case 'chair': {
|
||||
// Stuhl: gefülltes Quadrat in Element-Farbe + Umrandung
|
||||
const fill = (props.fill as string | undefined) ?? '#4a90d9';
|
||||
return [{
|
||||
kind: 'rect',
|
||||
x: el.x - el.width / 2,
|
||||
y: el.y - el.height / 2,
|
||||
w: el.width,
|
||||
h: el.height,
|
||||
fill,
|
||||
stroke: (props.outlineColor as string | undefined) ?? '#2a5a99',
|
||||
strokeWidth: 1,
|
||||
}];
|
||||
}
|
||||
|
||||
case 'table': {
|
||||
// Tisch: Kreis in Element-Größe mit Füllung
|
||||
const fill = (props.fill as string | undefined) ?? '#8b7355';
|
||||
return [{
|
||||
kind: 'circle',
|
||||
center: { x: el.x, y: el.y },
|
||||
radius: Math.max(el.width, el.height) / 2,
|
||||
fill,
|
||||
stroke: '#5a4a35',
|
||||
strokeWidth: 1,
|
||||
}];
|
||||
}
|
||||
|
||||
case 'stage': {
|
||||
// Bühne: Rechteck mit dunkler Füllung
|
||||
return [{
|
||||
kind: 'rect',
|
||||
x: el.x - el.width / 2,
|
||||
y: el.y - el.height / 2,
|
||||
w: el.width,
|
||||
h: el.height,
|
||||
fill: (props.fill as string | undefined) ?? '#3a3a4a',
|
||||
stroke,
|
||||
strokeWidth: 1.5,
|
||||
}];
|
||||
}
|
||||
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user