Files
SPA-landing/symbols/js/app/path-parser.js
architeur d707c5001d Refactor symbols app: split large files (max 300 lines)
- Split styles.css (1319 lines) into 6 CSS modules:
  - base.css, layout.css, modal.css, text-generator.css, components.css, legend.css
- Split app.js (1219 lines) into 8 JS modules:
  - core.js, custom.js, dxf.js, export.js, legend.js, legend-export.js, path-parser.js, utils.js
- Split symbols.js (870 lines) into 10 JS modules:
  - index.js, schaeden.js, werkzeuge.js, bauteile.js, moebel.js, sanitaer.js, vermessung.js, vermessung-infra.js, vermessung-topo.js, init.js
- Updated index.html to load new modular files

All files now comply with 300-line maximum rule.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 21:34:03 +01:00

131 lines
6.1 KiB
JavaScript

// ============================================
// PATH PARSER - SVG Path zu DXF
// ============================================
function parseSvgPath(d, scaleX, flipY) {
let entities = "";
let currentX = 0, currentY = 0;
let startX = 0, startY = 0;
const commands = d.match(/[MmLlHhVvCcSsQqTtAaZz][^MmLlHhVvCcSsQqTtAaZz]*/g) || [];
commands.forEach(cmd => {
const type = cmd[0];
const args = cmd.slice(1).trim().split(/[\s,]+/).filter(s => s).map(Number);
switch(type) {
case "M":
currentX = args[0]; currentY = args[1];
startX = currentX; startY = currentY;
for(let i = 2; i < args.length; i += 2) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(args[i]), flipY(args[i+1]));
currentX = args[i]; currentY = args[i+1];
}
break;
case "m":
currentX += args[0]; currentY += args[1];
startX = currentX; startY = currentY;
for(let i = 2; i < args.length; i += 2) {
const nx = currentX + args[i], ny = currentY + args[i+1];
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(nx), flipY(ny));
currentX = nx; currentY = ny;
}
break;
case "L":
for(let i = 0; i < args.length; i += 2) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(args[i]), flipY(args[i+1]));
currentX = args[i]; currentY = args[i+1];
}
break;
case "l":
for(let i = 0; i < args.length; i += 2) {
const nx = currentX + args[i], ny = currentY + args[i+1];
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(nx), flipY(ny));
currentX = nx; currentY = ny;
}
break;
case "H":
for(let i = 0; i < args.length; i++) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(args[i]), flipY(currentY));
currentX = args[i];
}
break;
case "h":
for(let i = 0; i < args.length; i++) {
const nx = currentX + args[i];
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(nx), flipY(currentY));
currentX = nx;
}
break;
case "V":
for(let i = 0; i < args.length; i++) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(currentX), flipY(args[i]));
currentY = args[i];
}
break;
case "v":
for(let i = 0; i < args.length; i++) {
const ny = currentY + args[i];
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(currentX), flipY(ny));
currentY = ny;
}
break;
case "Q":
case "q":
for(let i = 0; i < args.length; i += 4) {
let ex, ey;
if(type === "Q") {
ex = args[i+2]; ey = args[i+3];
} else {
ex = currentX + args[i+2]; ey = currentY + args[i+3];
}
const cx = type === "Q" ? args[i] : currentX + args[i];
const cy = type === "Q" ? args[i+1] : currentY + args[i+1];
for(let t = 0; t <= 1; t += 0.25) {
const t2 = Math.min(t + 0.25, 1);
const x1 = (1-t)*(1-t)*currentX + 2*(1-t)*t*cx + t*t*ex;
const y1 = (1-t)*(1-t)*currentY + 2*(1-t)*t*cy + t*t*ey;
const x2 = (1-t2)*(1-t2)*currentX + 2*(1-t2)*t2*cx + t2*t2*ex;
const y2 = (1-t2)*(1-t2)*currentY + 2*(1-t2)*t2*cy + t2*t2*ey;
entities += createDxfLine(scaleX(x1), flipY(y1), scaleX(x2), flipY(y2));
}
currentX = ex; currentY = ey;
}
break;
case "C":
case "c":
for(let i = 0; i < args.length; i += 6) {
let c1x, c1y, c2x, c2y, ex, ey;
if(type === "C") {
c1x = args[i]; c1y = args[i+1];
c2x = args[i+2]; c2y = args[i+3];
ex = args[i+4]; ey = args[i+5];
} else {
c1x = currentX + args[i]; c1y = currentY + args[i+1];
c2x = currentX + args[i+2]; c2y = currentY + args[i+3];
ex = currentX + args[i+4]; ey = currentY + args[i+5];
}
for(let t = 0; t <= 1; t += 0.2) {
const t2 = Math.min(t + 0.2, 1);
const x1 = Math.pow(1-t,3)*currentX + 3*Math.pow(1-t,2)*t*c1x + 3*(1-t)*t*t*c2x + t*t*t*ex;
const y1 = Math.pow(1-t,3)*currentY + 3*Math.pow(1-t,2)*t*c1y + 3*(1-t)*t*t*c2y + t*t*t*ey;
const x2 = Math.pow(1-t2,3)*currentX + 3*Math.pow(1-t2,2)*t2*c1x + 3*(1-t2)*t2*t2*c2x + t2*t2*t2*ex;
const y2 = Math.pow(1-t2,3)*currentY + 3*Math.pow(1-t2,2)*t2*c1y + 3*(1-t2)*t2*t2*c2y + t2*t2*t2*ey;
entities += createDxfLine(scaleX(x1), flipY(y1), scaleX(x2), flipY(y2));
}
currentX = ex; currentY = ey;
}
break;
case "Z":
case "z":
if(currentX !== startX || currentY !== startY) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(startX), flipY(startY));
}
currentX = startX; currentY = startY;
break;
}
});
return entities;
}