woodml-parser 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +181 -0
  2. package/dist/cli.d.ts +7 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +554 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/cost.d.ts +94 -0
  7. package/dist/cost.d.ts.map +1 -0
  8. package/dist/cost.js +340 -0
  9. package/dist/cost.js.map +1 -0
  10. package/dist/cost.test.d.ts +2 -0
  11. package/dist/cost.test.d.ts.map +1 -0
  12. package/dist/cost.test.js +241 -0
  13. package/dist/cost.test.js.map +1 -0
  14. package/dist/example.d.ts +6 -0
  15. package/dist/example.d.ts.map +1 -0
  16. package/dist/example.js +136 -0
  17. package/dist/example.js.map +1 -0
  18. package/dist/formulas.d.ts +23 -0
  19. package/dist/formulas.d.ts.map +1 -0
  20. package/dist/formulas.js +442 -0
  21. package/dist/formulas.js.map +1 -0
  22. package/dist/formulas.test.d.ts +5 -0
  23. package/dist/formulas.test.d.ts.map +1 -0
  24. package/dist/formulas.test.js +360 -0
  25. package/dist/formulas.test.js.map +1 -0
  26. package/dist/index.d.ts +23 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +93 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/integration.test.d.ts +6 -0
  31. package/dist/integration.test.d.ts.map +1 -0
  32. package/dist/integration.test.js +271 -0
  33. package/dist/integration.test.js.map +1 -0
  34. package/dist/optimizer.d.ts +119 -0
  35. package/dist/optimizer.d.ts.map +1 -0
  36. package/dist/optimizer.js +423 -0
  37. package/dist/optimizer.js.map +1 -0
  38. package/dist/optimizer.test.d.ts +2 -0
  39. package/dist/optimizer.test.d.ts.map +1 -0
  40. package/dist/optimizer.test.js +225 -0
  41. package/dist/optimizer.test.js.map +1 -0
  42. package/dist/parser.d.ts +59 -0
  43. package/dist/parser.d.ts.map +1 -0
  44. package/dist/parser.js +305 -0
  45. package/dist/parser.js.map +1 -0
  46. package/dist/parser.test.d.ts +5 -0
  47. package/dist/parser.test.d.ts.map +1 -0
  48. package/dist/parser.test.js +486 -0
  49. package/dist/parser.test.js.map +1 -0
  50. package/dist/pdf.d.ts +36 -0
  51. package/dist/pdf.d.ts.map +1 -0
  52. package/dist/pdf.js +316 -0
  53. package/dist/pdf.js.map +1 -0
  54. package/dist/svg.d.ts +73 -0
  55. package/dist/svg.d.ts.map +1 -0
  56. package/dist/svg.js +613 -0
  57. package/dist/svg.js.map +1 -0
  58. package/dist/svg.test.d.ts +5 -0
  59. package/dist/svg.test.d.ts.map +1 -0
  60. package/dist/svg.test.js +333 -0
  61. package/dist/svg.test.js.map +1 -0
  62. package/dist/templates.d.ts +126 -0
  63. package/dist/templates.d.ts.map +1 -0
  64. package/dist/templates.js +448 -0
  65. package/dist/templates.js.map +1 -0
  66. package/dist/templates.test.d.ts +5 -0
  67. package/dist/templates.test.d.ts.map +1 -0
  68. package/dist/templates.test.js +630 -0
  69. package/dist/templates.test.js.map +1 -0
  70. package/dist/types.d.ts +250 -0
  71. package/dist/types.d.ts.map +1 -0
  72. package/dist/types.js +7 -0
  73. package/dist/types.js.map +1 -0
  74. package/dist/units.d.ts +53 -0
  75. package/dist/units.d.ts.map +1 -0
  76. package/dist/units.js +359 -0
  77. package/dist/units.js.map +1 -0
  78. package/dist/units.test.d.ts +5 -0
  79. package/dist/units.test.d.ts.map +1 -0
  80. package/dist/units.test.js +364 -0
  81. package/dist/units.test.js.map +1 -0
  82. package/package.json +46 -0
package/dist/svg.js ADDED
@@ -0,0 +1,613 @@
1
+ "use strict";
2
+ /**
3
+ * WoodML SVG Diagram Generator
4
+ * Generates visual diagrams of woodworking parts and assemblies
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.SVGGenerator = void 0;
8
+ exports.generateSVG = generateSVG;
9
+ exports.generatePartSVG = generatePartSVG;
10
+ // ============================================
11
+ // COLOR SCHEMES
12
+ // ============================================
13
+ const COLOR_SCHEMES = {
14
+ default: {
15
+ background: '#ffffff',
16
+ partFill: '#f5deb3', // Wheat - wood-like color
17
+ partStroke: '#8b4513', // Saddle brown
18
+ dimensionLine: '#666666',
19
+ dimensionText: '#333333',
20
+ nameText: '#000000',
21
+ grainLine: '#d2b48c',
22
+ jointHighlight: '#ff6b6b',
23
+ },
24
+ blueprint: {
25
+ background: '#1a365d',
26
+ partFill: 'none',
27
+ partStroke: '#ffffff',
28
+ dimensionLine: '#90cdf4',
29
+ dimensionText: '#e2e8f0',
30
+ nameText: '#ffffff',
31
+ grainLine: '#4299e1',
32
+ jointHighlight: '#fc8181',
33
+ },
34
+ monochrome: {
35
+ background: '#ffffff',
36
+ partFill: '#f0f0f0',
37
+ partStroke: '#333333',
38
+ dimensionLine: '#666666',
39
+ dimensionText: '#333333',
40
+ nameText: '#000000',
41
+ grainLine: '#999999',
42
+ jointHighlight: '#666666',
43
+ },
44
+ };
45
+ // ============================================
46
+ // SVG GENERATOR CLASS
47
+ // ============================================
48
+ class SVGGenerator {
49
+ options;
50
+ colors;
51
+ constructor(options = {}) {
52
+ this.options = {
53
+ width: options.width ?? 800,
54
+ height: options.height ?? 600,
55
+ padding: options.padding ?? 40,
56
+ showDimensions: options.showDimensions ?? true,
57
+ showNames: options.showNames ?? true,
58
+ showGrain: options.showGrain ?? true,
59
+ colorScheme: options.colorScheme ?? 'default',
60
+ scale: options.scale ?? 10, // 10 pixels per inch
61
+ fontSize: options.fontSize ?? 12,
62
+ };
63
+ this.colors = COLOR_SCHEMES[this.options.colorScheme];
64
+ }
65
+ /**
66
+ * Generate SVG for all parts in a document
67
+ */
68
+ generatePartsDiagram(doc) {
69
+ const parts = doc.resolvedParts;
70
+ if (parts.length === 0) {
71
+ return this.emptyDiagram('No parts to display');
72
+ }
73
+ // Calculate layout
74
+ const layout = this.calculatePartsLayout(parts);
75
+ const elements = [];
76
+ // Generate each part
77
+ for (const { part, rect } of layout) {
78
+ elements.push(this.renderPart(part, rect));
79
+ }
80
+ return this.wrapSVG(elements.join('\n'), layout);
81
+ }
82
+ /**
83
+ * Generate SVG for a single part
84
+ */
85
+ generateSinglePart(part) {
86
+ const lengthIn = part.dimensions.length.value;
87
+ const widthIn = part.dimensions.width.value;
88
+ const scaledWidth = lengthIn * this.options.scale;
89
+ const scaledHeight = widthIn * this.options.scale;
90
+ const rect = {
91
+ x: this.options.padding,
92
+ y: this.options.padding,
93
+ width: scaledWidth,
94
+ height: scaledHeight,
95
+ };
96
+ const totalWidth = scaledWidth + this.options.padding * 2 + 60; // Extra for dimensions
97
+ const totalHeight = scaledHeight + this.options.padding * 2 + 60;
98
+ const elements = [this.renderPart(part, rect)];
99
+ return this.wrapSVG(elements.join('\n'), null, totalWidth, totalHeight);
100
+ }
101
+ /**
102
+ * Generate a cut list diagram showing part layout on stock
103
+ */
104
+ generateCutListDiagram(doc, stockWidth = 48, stockHeight = 96) {
105
+ const parts = doc.resolvedParts;
106
+ if (parts.length === 0) {
107
+ return this.emptyDiagram('No parts to display');
108
+ }
109
+ // Simple bin packing - sort by area descending
110
+ const sortedParts = [...parts].sort((a, b) => {
111
+ const areaA = a.dimensions.length.value * a.dimensions.width.value * a.resolvedQuantity;
112
+ const areaB = b.dimensions.length.value * b.dimensions.width.value * b.resolvedQuantity;
113
+ return areaB - areaA;
114
+ });
115
+ const placements = [];
116
+ const scale = Math.min((this.options.width - this.options.padding * 2) / stockWidth, (this.options.height - this.options.padding * 2) / stockHeight);
117
+ // Simple first-fit decreasing algorithm
118
+ const occupied = [];
119
+ for (const part of sortedParts) {
120
+ const partLength = part.dimensions.length.value;
121
+ const partWidth = part.dimensions.width.value;
122
+ const quantity = part.resolvedQuantity;
123
+ for (let q = 0; q < quantity; q++) {
124
+ // Try to place the part
125
+ const placement = this.findPlacement(partLength * scale, partWidth * scale, stockWidth * scale, stockHeight * scale, occupied);
126
+ if (placement) {
127
+ placements.push({
128
+ part,
129
+ rect: {
130
+ x: this.options.padding + placement.x,
131
+ y: this.options.padding + placement.y,
132
+ width: partLength * scale,
133
+ height: partWidth * scale,
134
+ },
135
+ });
136
+ occupied.push(placement);
137
+ }
138
+ }
139
+ }
140
+ const elements = [];
141
+ // Draw stock outline
142
+ elements.push(`
143
+ <rect
144
+ x="${this.options.padding}"
145
+ y="${this.options.padding}"
146
+ width="${stockWidth * scale}"
147
+ height="${stockHeight * scale}"
148
+ fill="none"
149
+ stroke="${this.colors.partStroke}"
150
+ stroke-width="2"
151
+ stroke-dasharray="5,5"
152
+ />
153
+ `);
154
+ // Draw parts
155
+ for (const { part, rect } of placements) {
156
+ elements.push(this.renderCutPart(part, rect));
157
+ }
158
+ // Stock dimensions
159
+ if (this.options.showDimensions) {
160
+ elements.push(this.renderDimensionH(this.options.padding, this.options.padding + stockHeight * scale + 20, stockWidth * scale, `${stockWidth}"`));
161
+ elements.push(this.renderDimensionV(this.options.padding + stockWidth * scale + 20, this.options.padding, stockHeight * scale, `${stockHeight}"`));
162
+ }
163
+ return this.wrapSVG(elements.join('\n'), null, stockWidth * scale + this.options.padding * 2 + 60, stockHeight * scale + this.options.padding * 2 + 60);
164
+ }
165
+ /**
166
+ * Generate exploded view diagram
167
+ */
168
+ generateExplodedView(doc) {
169
+ const parts = doc.resolvedParts;
170
+ if (parts.length === 0) {
171
+ return this.emptyDiagram('No parts to display');
172
+ }
173
+ // Create an exploded 3D-ish view
174
+ const elements = [];
175
+ const offsetStep = 30; // Offset between parts
176
+ let currentOffset = 0;
177
+ for (const part of parts) {
178
+ const lengthIn = part.dimensions.length.value;
179
+ const widthIn = part.dimensions.width.value;
180
+ const thicknessIn = part.dimensions.thickness.value;
181
+ const scale = this.options.scale * 0.8;
182
+ const scaledLength = lengthIn * scale;
183
+ const scaledWidth = widthIn * scale;
184
+ const scaledThickness = thicknessIn * scale;
185
+ const x = this.options.padding + currentOffset * 0.5;
186
+ const y = this.options.padding + currentOffset;
187
+ elements.push(this.render3DPart(part, x, y, scaledLength, scaledWidth, scaledThickness));
188
+ currentOffset += offsetStep + scaledWidth * 0.3;
189
+ }
190
+ return this.wrapSVG(elements.join('\n'));
191
+ }
192
+ // ============================================
193
+ // PRIVATE RENDERING METHODS
194
+ // ============================================
195
+ renderPart(part, rect) {
196
+ const elements = [];
197
+ // Main rectangle
198
+ elements.push(`
199
+ <rect
200
+ x="${rect.x}"
201
+ y="${rect.y}"
202
+ width="${rect.width}"
203
+ height="${rect.height}"
204
+ fill="${this.colors.partFill}"
205
+ stroke="${this.colors.partStroke}"
206
+ stroke-width="2"
207
+ rx="2"
208
+ />
209
+ `);
210
+ // Grain direction
211
+ if (this.options.showGrain && part.grain !== 'any') {
212
+ elements.push(this.renderGrain(rect, part.grain || 'long'));
213
+ }
214
+ // Part name
215
+ if (this.options.showNames) {
216
+ const name = part.name || part.id;
217
+ elements.push(`
218
+ <text
219
+ x="${rect.x + rect.width / 2}"
220
+ y="${rect.y + rect.height / 2}"
221
+ font-family="Arial, sans-serif"
222
+ font-size="${this.options.fontSize}"
223
+ fill="${this.colors.nameText}"
224
+ text-anchor="middle"
225
+ dominant-baseline="middle"
226
+ >${this.escapeXml(name)}</text>
227
+ `);
228
+ // Quantity badge if > 1
229
+ if (part.resolvedQuantity > 1) {
230
+ elements.push(`
231
+ <circle
232
+ cx="${rect.x + rect.width - 10}"
233
+ cy="${rect.y + 10}"
234
+ r="10"
235
+ fill="${this.colors.jointHighlight}"
236
+ />
237
+ <text
238
+ x="${rect.x + rect.width - 10}"
239
+ y="${rect.y + 10}"
240
+ font-family="Arial, sans-serif"
241
+ font-size="10"
242
+ fill="#ffffff"
243
+ text-anchor="middle"
244
+ dominant-baseline="middle"
245
+ >×${part.resolvedQuantity}</text>
246
+ `);
247
+ }
248
+ }
249
+ // Dimensions
250
+ if (this.options.showDimensions) {
251
+ const lengthLabel = part.dimensions.length.original;
252
+ const widthLabel = part.dimensions.width.original;
253
+ // Bottom dimension (length)
254
+ elements.push(this.renderDimensionH(rect.x, rect.y + rect.height + 15, rect.width, lengthLabel));
255
+ // Right dimension (width)
256
+ elements.push(this.renderDimensionV(rect.x + rect.width + 15, rect.y, rect.height, widthLabel));
257
+ }
258
+ return `<g class="part" data-id="${part.id}">${elements.join('\n')}</g>`;
259
+ }
260
+ renderCutPart(part, rect) {
261
+ const elements = [];
262
+ // Main rectangle
263
+ elements.push(`
264
+ <rect
265
+ x="${rect.x}"
266
+ y="${rect.y}"
267
+ width="${rect.width}"
268
+ height="${rect.height}"
269
+ fill="${this.colors.partFill}"
270
+ stroke="${this.colors.partStroke}"
271
+ stroke-width="1"
272
+ />
273
+ `);
274
+ // Part ID centered
275
+ const name = part.name || part.id;
276
+ const fontSize = Math.min(this.options.fontSize, rect.width / 6, rect.height / 3);
277
+ if (fontSize >= 6) {
278
+ elements.push(`
279
+ <text
280
+ x="${rect.x + rect.width / 2}"
281
+ y="${rect.y + rect.height / 2}"
282
+ font-family="Arial, sans-serif"
283
+ font-size="${fontSize}"
284
+ fill="${this.colors.nameText}"
285
+ text-anchor="middle"
286
+ dominant-baseline="middle"
287
+ >${this.escapeXml(name)}</text>
288
+ `);
289
+ }
290
+ return `<g class="cut-part" data-id="${part.id}">${elements.join('\n')}</g>`;
291
+ }
292
+ render3DPart(part, x, y, length, width, thickness) {
293
+ const elements = [];
294
+ const isoAngle = 30; // degrees
295
+ const offsetX = thickness * Math.cos((isoAngle * Math.PI) / 180);
296
+ const offsetY = thickness * Math.sin((isoAngle * Math.PI) / 180);
297
+ // Top face
298
+ const topPoints = [
299
+ `${x},${y}`,
300
+ `${x + length},${y}`,
301
+ `${x + length + offsetX},${y - offsetY}`,
302
+ `${x + offsetX},${y - offsetY}`,
303
+ ].join(' ');
304
+ elements.push(`
305
+ <polygon
306
+ points="${topPoints}"
307
+ fill="${this.colors.partFill}"
308
+ stroke="${this.colors.partStroke}"
309
+ stroke-width="1"
310
+ />
311
+ `);
312
+ // Front face
313
+ const frontPoints = [
314
+ `${x},${y}`,
315
+ `${x + length},${y}`,
316
+ `${x + length},${y + width}`,
317
+ `${x},${y + width}`,
318
+ ].join(' ');
319
+ elements.push(`
320
+ <polygon
321
+ points="${frontPoints}"
322
+ fill="${this.adjustBrightness(this.colors.partFill, -20)}"
323
+ stroke="${this.colors.partStroke}"
324
+ stroke-width="1"
325
+ />
326
+ `);
327
+ // Right face
328
+ const rightPoints = [
329
+ `${x + length},${y}`,
330
+ `${x + length + offsetX},${y - offsetY}`,
331
+ `${x + length + offsetX},${y + width - offsetY}`,
332
+ `${x + length},${y + width}`,
333
+ ].join(' ');
334
+ elements.push(`
335
+ <polygon
336
+ points="${rightPoints}"
337
+ fill="${this.adjustBrightness(this.colors.partFill, -40)}"
338
+ stroke="${this.colors.partStroke}"
339
+ stroke-width="1"
340
+ />
341
+ `);
342
+ // Part name
343
+ if (this.options.showNames) {
344
+ const name = part.name || part.id;
345
+ elements.push(`
346
+ <text
347
+ x="${x + length / 2}"
348
+ y="${y + width / 2}"
349
+ font-family="Arial, sans-serif"
350
+ font-size="${this.options.fontSize}"
351
+ fill="${this.colors.nameText}"
352
+ text-anchor="middle"
353
+ dominant-baseline="middle"
354
+ >${this.escapeXml(name)}</text>
355
+ `);
356
+ }
357
+ return `<g class="part-3d" data-id="${part.id}">${elements.join('\n')}</g>`;
358
+ }
359
+ renderGrain(rect, direction) {
360
+ const lines = [];
361
+ const spacing = 8;
362
+ if (direction === 'long') {
363
+ // Horizontal lines
364
+ for (let y = rect.y + spacing; y < rect.y + rect.height - spacing; y += spacing) {
365
+ const waveAmplitude = 2;
366
+ const path = this.generateWavyLine(rect.x + 5, y, rect.x + rect.width - 5, y, waveAmplitude);
367
+ lines.push(`<path d="${path}" stroke="${this.colors.grainLine}" fill="none" stroke-width="0.5" opacity="0.5" />`);
368
+ }
369
+ }
370
+ else {
371
+ // Vertical lines
372
+ for (let x = rect.x + spacing; x < rect.x + rect.width - spacing; x += spacing) {
373
+ const waveAmplitude = 2;
374
+ const path = this.generateWavyLine(x, rect.y + 5, x, rect.y + rect.height - 5, waveAmplitude);
375
+ lines.push(`<path d="${path}" stroke="${this.colors.grainLine}" fill="none" stroke-width="0.5" opacity="0.5" />`);
376
+ }
377
+ }
378
+ return lines.join('\n');
379
+ }
380
+ generateWavyLine(x1, y1, x2, y2, amplitude) {
381
+ const dx = x2 - x1;
382
+ const dy = y2 - y1;
383
+ const length = Math.sqrt(dx * dx + dy * dy);
384
+ const segments = Math.floor(length / 20);
385
+ if (segments < 1) {
386
+ return `M${x1},${y1} L${x2},${y2}`;
387
+ }
388
+ const parts = [`M${x1},${y1}`];
389
+ for (let i = 1; i <= segments; i++) {
390
+ const t = i / segments;
391
+ const x = x1 + dx * t;
392
+ const y = y1 + dy * t;
393
+ const offset = (i % 2 === 0 ? amplitude : -amplitude) * (Math.random() * 0.5 + 0.5);
394
+ if (Math.abs(dx) > Math.abs(dy)) {
395
+ parts.push(`L${x},${y + offset}`);
396
+ }
397
+ else {
398
+ parts.push(`L${x + offset},${y}`);
399
+ }
400
+ }
401
+ parts.push(`L${x2},${y2}`);
402
+ return parts.join(' ');
403
+ }
404
+ renderDimensionH(x, y, width, label) {
405
+ const arrowSize = 6;
406
+ return `
407
+ <g class="dimension dimension-h">
408
+ <line x1="${x}" y1="${y}" x2="${x + width}" y2="${y}"
409
+ stroke="${this.colors.dimensionLine}" stroke-width="1" />
410
+ <line x1="${x}" y1="${y - 5}" x2="${x}" y2="${y + 5}"
411
+ stroke="${this.colors.dimensionLine}" stroke-width="1" />
412
+ <line x1="${x + width}" y1="${y - 5}" x2="${x + width}" y2="${y + 5}"
413
+ stroke="${this.colors.dimensionLine}" stroke-width="1" />
414
+ <polygon
415
+ points="${x},${y} ${x + arrowSize},${y - 3} ${x + arrowSize},${y + 3}"
416
+ fill="${this.colors.dimensionLine}" />
417
+ <polygon
418
+ points="${x + width},${y} ${x + width - arrowSize},${y - 3} ${x + width - arrowSize},${y + 3}"
419
+ fill="${this.colors.dimensionLine}" />
420
+ <text
421
+ x="${x + width / 2}"
422
+ y="${y + 15}"
423
+ font-family="Arial, sans-serif"
424
+ font-size="${this.options.fontSize - 2}"
425
+ fill="${this.colors.dimensionText}"
426
+ text-anchor="middle"
427
+ >${this.escapeXml(label)}</text>
428
+ </g>
429
+ `;
430
+ }
431
+ renderDimensionV(x, y, height, label) {
432
+ const arrowSize = 6;
433
+ return `
434
+ <g class="dimension dimension-v">
435
+ <line x1="${x}" y1="${y}" x2="${x}" y2="${y + height}"
436
+ stroke="${this.colors.dimensionLine}" stroke-width="1" />
437
+ <line x1="${x - 5}" y1="${y}" x2="${x + 5}" y2="${y}"
438
+ stroke="${this.colors.dimensionLine}" stroke-width="1" />
439
+ <line x1="${x - 5}" y1="${y + height}" x2="${x + 5}" y2="${y + height}"
440
+ stroke="${this.colors.dimensionLine}" stroke-width="1" />
441
+ <polygon
442
+ points="${x},${y} ${x - 3},${y + arrowSize} ${x + 3},${y + arrowSize}"
443
+ fill="${this.colors.dimensionLine}" />
444
+ <polygon
445
+ points="${x},${y + height} ${x - 3},${y + height - arrowSize} ${x + 3},${y + height - arrowSize}"
446
+ fill="${this.colors.dimensionLine}" />
447
+ <text
448
+ x="${x + 15}"
449
+ y="${y + height / 2}"
450
+ font-family="Arial, sans-serif"
451
+ font-size="${this.options.fontSize - 2}"
452
+ fill="${this.colors.dimensionText}"
453
+ text-anchor="start"
454
+ dominant-baseline="middle"
455
+ transform="rotate(90, ${x + 15}, ${y + height / 2})"
456
+ >${this.escapeXml(label)}</text>
457
+ </g>
458
+ `;
459
+ }
460
+ // ============================================
461
+ // LAYOUT HELPERS
462
+ // ============================================
463
+ calculatePartsLayout(parts) {
464
+ const result = [];
465
+ const availableWidth = this.options.width - this.options.padding * 2;
466
+ const availableHeight = this.options.height - this.options.padding * 2;
467
+ // Find the best scale to fit all parts
468
+ let totalArea = 0;
469
+ let maxLength = 0;
470
+ let maxWidth = 0;
471
+ for (const part of parts) {
472
+ const lengthIn = part.dimensions.length.value;
473
+ const widthIn = part.dimensions.width.value;
474
+ totalArea += lengthIn * widthIn;
475
+ maxLength = Math.max(maxLength, lengthIn);
476
+ maxWidth = Math.max(maxWidth, widthIn);
477
+ }
478
+ // Calculate scale based on available space
479
+ const scale = Math.min((availableWidth - 100) / maxLength, (availableHeight - 100) / maxWidth, this.options.scale);
480
+ // Simple grid layout
481
+ let currentX = this.options.padding;
482
+ let currentY = this.options.padding;
483
+ let rowHeight = 0;
484
+ const gap = 40;
485
+ for (const part of parts) {
486
+ const lengthIn = part.dimensions.length.value;
487
+ const widthIn = part.dimensions.width.value;
488
+ const scaledLength = lengthIn * scale;
489
+ const scaledWidth = widthIn * scale;
490
+ // Check if we need to wrap to next row
491
+ if (currentX + scaledLength + gap > this.options.width - this.options.padding) {
492
+ currentX = this.options.padding;
493
+ currentY += rowHeight + gap + 30; // Extra space for dimensions
494
+ rowHeight = 0;
495
+ }
496
+ result.push({
497
+ part,
498
+ rect: {
499
+ x: currentX,
500
+ y: currentY,
501
+ width: scaledLength,
502
+ height: scaledWidth,
503
+ },
504
+ });
505
+ currentX += scaledLength + gap + 20; // Extra for dimension labels
506
+ rowHeight = Math.max(rowHeight, scaledWidth);
507
+ }
508
+ return result;
509
+ }
510
+ findPlacement(width, height, stockWidth, stockHeight, occupied) {
511
+ const step = 5;
512
+ for (let y = 0; y <= stockHeight - height; y += step) {
513
+ for (let x = 0; x <= stockWidth - width; x += step) {
514
+ const candidate = { x, y, width, height };
515
+ if (!this.overlapsAny(candidate, occupied)) {
516
+ return candidate;
517
+ }
518
+ }
519
+ }
520
+ return null;
521
+ }
522
+ overlapsAny(rect, others) {
523
+ for (const other of others) {
524
+ if (this.overlaps(rect, other)) {
525
+ return true;
526
+ }
527
+ }
528
+ return false;
529
+ }
530
+ overlaps(a, b) {
531
+ return !(a.x + a.width <= b.x || b.x + b.width <= a.x || a.y + a.height <= b.y || b.y + b.height <= a.y);
532
+ }
533
+ // ============================================
534
+ // UTILITY METHODS
535
+ // ============================================
536
+ wrapSVG(content, layout, width, height) {
537
+ const w = width ?? this.options.width;
538
+ const h = height ?? this.options.height;
539
+ return `<?xml version="1.0" encoding="UTF-8"?>
540
+ <svg xmlns="http://www.w3.org/2000/svg"
541
+ viewBox="0 0 ${w} ${h}"
542
+ width="${w}"
543
+ height="${h}">
544
+ <defs>
545
+ <style>
546
+ .part { cursor: pointer; }
547
+ .part:hover rect { stroke-width: 3; }
548
+ .dimension text { pointer-events: none; }
549
+ </style>
550
+ </defs>
551
+ <rect width="100%" height="100%" fill="${this.colors.background}" />
552
+ ${content}
553
+ </svg>`;
554
+ }
555
+ emptyDiagram(message) {
556
+ return `<?xml version="1.0" encoding="UTF-8"?>
557
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${this.options.width} ${this.options.height}" width="${this.options.width}" height="${this.options.height}">
558
+ <rect width="100%" height="100%" fill="${this.colors.background}" />
559
+ <text x="50%" y="50%" text-anchor="middle" font-family="Arial, sans-serif" fill="${this.colors.nameText}">${this.escapeXml(message)}</text>
560
+ </svg>`;
561
+ }
562
+ escapeXml(str) {
563
+ return str
564
+ .replace(/&/g, '&amp;')
565
+ .replace(/</g, '&lt;')
566
+ .replace(/>/g, '&gt;')
567
+ .replace(/"/g, '&quot;')
568
+ .replace(/'/g, '&apos;');
569
+ }
570
+ adjustBrightness(hex, percent) {
571
+ if (hex === 'none')
572
+ return hex;
573
+ // Handle named colors
574
+ const colorMap = {
575
+ wheat: '#f5deb3',
576
+ };
577
+ hex = colorMap[hex.toLowerCase()] || hex;
578
+ // Parse hex
579
+ const num = parseInt(hex.replace('#', ''), 16);
580
+ const r = Math.max(0, Math.min(255, ((num >> 16) & 0xff) + percent));
581
+ const g = Math.max(0, Math.min(255, ((num >> 8) & 0xff) + percent));
582
+ const b = Math.max(0, Math.min(255, (num & 0xff) + percent));
583
+ return `#${((r << 16) | (g << 8) | b).toString(16).padStart(6, '0')}`;
584
+ }
585
+ }
586
+ exports.SVGGenerator = SVGGenerator;
587
+ // ============================================
588
+ // CONVENIENCE FUNCTIONS
589
+ // ============================================
590
+ /**
591
+ * Generate an SVG diagram for a resolved document
592
+ */
593
+ function generateSVG(doc, type = 'parts', options) {
594
+ const generator = new SVGGenerator(options);
595
+ switch (type) {
596
+ case 'parts':
597
+ return generator.generatePartsDiagram(doc);
598
+ case 'exploded':
599
+ return generator.generateExplodedView(doc);
600
+ case 'cutlist':
601
+ return generator.generateCutListDiagram(doc);
602
+ default:
603
+ return generator.generatePartsDiagram(doc);
604
+ }
605
+ }
606
+ /**
607
+ * Generate an SVG diagram for a single part
608
+ */
609
+ function generatePartSVG(part, options) {
610
+ const generator = new SVGGenerator(options);
611
+ return generator.generateSinglePart(part);
612
+ }
613
+ //# sourceMappingURL=svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.js","sourceRoot":"","sources":["../src/svg.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for SVG diagram generation
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=svg.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.test.d.ts","sourceRoot":"","sources":["../src/svg.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}