@ifc-lite/drawing-2d 1.4.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 (158) hide show
  1. package/LICENSE +373 -0
  2. package/dist/drawing-generator.d.ts +80 -0
  3. package/dist/drawing-generator.d.ts.map +1 -0
  4. package/dist/drawing-generator.js +281 -0
  5. package/dist/drawing-generator.js.map +1 -0
  6. package/dist/edge-extractor.d.ts +47 -0
  7. package/dist/edge-extractor.d.ts.map +1 -0
  8. package/dist/edge-extractor.js +204 -0
  9. package/dist/edge-extractor.js.map +1 -0
  10. package/dist/gpu-section-cutter.d.ts +42 -0
  11. package/dist/gpu-section-cutter.d.ts.map +1 -0
  12. package/dist/gpu-section-cutter.js +405 -0
  13. package/dist/gpu-section-cutter.js.map +1 -0
  14. package/dist/graphic-overrides/index.d.ts +10 -0
  15. package/dist/graphic-overrides/index.d.ts.map +1 -0
  16. package/dist/graphic-overrides/index.js +8 -0
  17. package/dist/graphic-overrides/index.js.map +1 -0
  18. package/dist/graphic-overrides/presets.d.ts +22 -0
  19. package/dist/graphic-overrides/presets.d.ts.map +1 -0
  20. package/dist/graphic-overrides/presets.js +283 -0
  21. package/dist/graphic-overrides/presets.js.map +1 -0
  22. package/dist/graphic-overrides/rule-engine.d.ts +64 -0
  23. package/dist/graphic-overrides/rule-engine.d.ts.map +1 -0
  24. package/dist/graphic-overrides/rule-engine.js +438 -0
  25. package/dist/graphic-overrides/rule-engine.js.map +1 -0
  26. package/dist/graphic-overrides/types.d.ts +200 -0
  27. package/dist/graphic-overrides/types.d.ts.map +1 -0
  28. package/dist/graphic-overrides/types.js +5 -0
  29. package/dist/graphic-overrides/types.js.map +1 -0
  30. package/dist/hatch-generator.d.ts +76 -0
  31. package/dist/hatch-generator.d.ts.map +1 -0
  32. package/dist/hatch-generator.js +282 -0
  33. package/dist/hatch-generator.js.map +1 -0
  34. package/dist/hidden-line.d.ts +64 -0
  35. package/dist/hidden-line.d.ts.map +1 -0
  36. package/dist/hidden-line.js +318 -0
  37. package/dist/hidden-line.js.map +1 -0
  38. package/dist/index.d.ts +44 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +109 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/line-merger.d.ts +35 -0
  43. package/dist/line-merger.d.ts.map +1 -0
  44. package/dist/line-merger.js +265 -0
  45. package/dist/line-merger.js.map +1 -0
  46. package/dist/math.d.ts +90 -0
  47. package/dist/math.d.ts.map +1 -0
  48. package/dist/math.js +284 -0
  49. package/dist/math.js.map +1 -0
  50. package/dist/openings/index.d.ts +7 -0
  51. package/dist/openings/index.d.ts.map +1 -0
  52. package/dist/openings/index.js +10 -0
  53. package/dist/openings/index.js.map +1 -0
  54. package/dist/openings/opening-filter.d.ts +61 -0
  55. package/dist/openings/opening-filter.d.ts.map +1 -0
  56. package/dist/openings/opening-filter.js +244 -0
  57. package/dist/openings/opening-filter.js.map +1 -0
  58. package/dist/openings/opening-relationship-builder.d.ts +35 -0
  59. package/dist/openings/opening-relationship-builder.d.ts.map +1 -0
  60. package/dist/openings/opening-relationship-builder.js +121 -0
  61. package/dist/openings/opening-relationship-builder.js.map +1 -0
  62. package/dist/openings/opening-utils.d.ts +55 -0
  63. package/dist/openings/opening-utils.d.ts.map +1 -0
  64. package/dist/openings/opening-utils.js +128 -0
  65. package/dist/openings/opening-utils.js.map +1 -0
  66. package/dist/polygon-builder.d.ts +62 -0
  67. package/dist/polygon-builder.d.ts.map +1 -0
  68. package/dist/polygon-builder.js +261 -0
  69. package/dist/polygon-builder.js.map +1 -0
  70. package/dist/section-cutter.d.ts +49 -0
  71. package/dist/section-cutter.d.ts.map +1 -0
  72. package/dist/section-cutter.js +220 -0
  73. package/dist/section-cutter.js.map +1 -0
  74. package/dist/sheet/frame-renderer.d.ts +28 -0
  75. package/dist/sheet/frame-renderer.d.ts.map +1 -0
  76. package/dist/sheet/frame-renderer.js +199 -0
  77. package/dist/sheet/frame-renderer.js.map +1 -0
  78. package/dist/sheet/frame-types.d.ts +57 -0
  79. package/dist/sheet/frame-types.d.ts.map +1 -0
  80. package/dist/sheet/frame-types.js +88 -0
  81. package/dist/sheet/frame-types.js.map +1 -0
  82. package/dist/sheet/index.d.ts +26 -0
  83. package/dist/sheet/index.d.ts.map +1 -0
  84. package/dist/sheet/index.js +12 -0
  85. package/dist/sheet/index.js.map +1 -0
  86. package/dist/sheet/paper-sizes.d.ts +36 -0
  87. package/dist/sheet/paper-sizes.d.ts.map +1 -0
  88. package/dist/sheet/paper-sizes.js +252 -0
  89. package/dist/sheet/paper-sizes.js.map +1 -0
  90. package/dist/sheet/scale-bar-renderer.d.ts +29 -0
  91. package/dist/sheet/scale-bar-renderer.d.ts.map +1 -0
  92. package/dist/sheet/scale-bar-renderer.js +287 -0
  93. package/dist/sheet/scale-bar-renderer.js.map +1 -0
  94. package/dist/sheet/scale-bar-types.d.ts +82 -0
  95. package/dist/sheet/scale-bar-types.d.ts.map +1 -0
  96. package/dist/sheet/scale-bar-types.js +66 -0
  97. package/dist/sheet/scale-bar-types.js.map +1 -0
  98. package/dist/sheet/sheet-types.d.ts +84 -0
  99. package/dist/sheet/sheet-types.d.ts.map +1 -0
  100. package/dist/sheet/sheet-types.js +77 -0
  101. package/dist/sheet/sheet-types.js.map +1 -0
  102. package/dist/sheet/title-block-renderer.d.ts +44 -0
  103. package/dist/sheet/title-block-renderer.d.ts.map +1 -0
  104. package/dist/sheet/title-block-renderer.js +335 -0
  105. package/dist/sheet/title-block-renderer.js.map +1 -0
  106. package/dist/sheet/title-block-types.d.ts +100 -0
  107. package/dist/sheet/title-block-types.d.ts.map +1 -0
  108. package/dist/sheet/title-block-types.js +174 -0
  109. package/dist/sheet/title-block-types.js.map +1 -0
  110. package/dist/styles.d.ts +77 -0
  111. package/dist/styles.d.ts.map +1 -0
  112. package/dist/styles.js +347 -0
  113. package/dist/styles.js.map +1 -0
  114. package/dist/styling/index.d.ts +7 -0
  115. package/dist/styling/index.d.ts.map +1 -0
  116. package/dist/styling/index.js +10 -0
  117. package/dist/styling/index.js.map +1 -0
  118. package/dist/styling/layer-mapping.d.ts +57 -0
  119. package/dist/styling/layer-mapping.d.ts.map +1 -0
  120. package/dist/styling/layer-mapping.js +303 -0
  121. package/dist/styling/layer-mapping.js.map +1 -0
  122. package/dist/styling/line-styles.d.ts +49 -0
  123. package/dist/styling/line-styles.d.ts.map +1 -0
  124. package/dist/styling/line-styles.js +123 -0
  125. package/dist/styling/line-styles.js.map +1 -0
  126. package/dist/styling/line-weights.d.ts +61 -0
  127. package/dist/styling/line-weights.d.ts.map +1 -0
  128. package/dist/styling/line-weights.js +183 -0
  129. package/dist/styling/line-weights.js.map +1 -0
  130. package/dist/svg-exporter.d.ts +63 -0
  131. package/dist/svg-exporter.d.ts.map +1 -0
  132. package/dist/svg-exporter.js +278 -0
  133. package/dist/svg-exporter.js.map +1 -0
  134. package/dist/symbols/door-symbol.d.ts +82 -0
  135. package/dist/symbols/door-symbol.d.ts.map +1 -0
  136. package/dist/symbols/door-symbol.js +390 -0
  137. package/dist/symbols/door-symbol.js.map +1 -0
  138. package/dist/symbols/index.d.ts +8 -0
  139. package/dist/symbols/index.d.ts.map +1 -0
  140. package/dist/symbols/index.js +11 -0
  141. package/dist/symbols/index.js.map +1 -0
  142. package/dist/symbols/symbol-renderer.d.ts +29 -0
  143. package/dist/symbols/symbol-renderer.d.ts.map +1 -0
  144. package/dist/symbols/symbol-renderer.js +173 -0
  145. package/dist/symbols/symbol-renderer.js.map +1 -0
  146. package/dist/symbols/symbol-utils.d.ts +48 -0
  147. package/dist/symbols/symbol-utils.d.ts.map +1 -0
  148. package/dist/symbols/symbol-utils.js +129 -0
  149. package/dist/symbols/symbol-utils.js.map +1 -0
  150. package/dist/symbols/window-symbol.d.ts +57 -0
  151. package/dist/symbols/window-symbol.d.ts.map +1 -0
  152. package/dist/symbols/window-symbol.js +209 -0
  153. package/dist/symbols/window-symbol.js.map +1 -0
  154. package/dist/types.d.ts +443 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/dist/types.js +31 -0
  157. package/dist/types.js.map +1 -0
  158. package/package.json +53 -0
@@ -0,0 +1,220 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { vec3, vec3Lerp, EPSILON, getAxisNormal, signedDistanceToPlane, projectTo2D, } from './math';
5
+ import { PolygonBuilder } from './polygon-builder';
6
+ // ═══════════════════════════════════════════════════════════════════════════
7
+ // SECTION CUTTER CLASS
8
+ // ═══════════════════════════════════════════════════════════════════════════
9
+ export class SectionCutter {
10
+ planeNormal;
11
+ planeDistance;
12
+ axis;
13
+ flipped;
14
+ constructor(config) {
15
+ this.axis = config.axis;
16
+ this.flipped = config.flipped;
17
+ this.planeNormal = getAxisNormal(config.axis, config.flipped);
18
+ this.planeDistance = config.position;
19
+ }
20
+ /**
21
+ * Cut all meshes with the section plane
22
+ */
23
+ cutMeshes(meshes) {
24
+ const startTime = performance.now();
25
+ const segmentArrays = [];
26
+ let totalTriangles = 0;
27
+ let intersectedTriangles = 0;
28
+ // Process each mesh - collect segment arrays for efficient flattening
29
+ for (const mesh of meshes) {
30
+ const result = this.cutSingleMesh(mesh);
31
+ segmentArrays.push(result.segments);
32
+ totalTriangles += result.trianglesProcessed;
33
+ intersectedTriangles += result.trianglesIntersected;
34
+ }
35
+ // Flatten all segments at once (more efficient than repeated push(...spread))
36
+ const allSegments = segmentArrays.flat();
37
+ // Reconstruct closed polygons from segments
38
+ const polygonBuilder = new PolygonBuilder();
39
+ const polygons = polygonBuilder.buildPolygons(allSegments);
40
+ const processingTimeMs = performance.now() - startTime;
41
+ return {
42
+ segments: allSegments,
43
+ polygons,
44
+ stats: {
45
+ totalTriangles,
46
+ intersectedTriangles,
47
+ segmentCount: allSegments.length,
48
+ polygonCount: polygons.length,
49
+ processingTimeMs,
50
+ },
51
+ };
52
+ }
53
+ /**
54
+ * Cut a single mesh with the section plane
55
+ */
56
+ cutSingleMesh(mesh) {
57
+ const segments = [];
58
+ const { positions, indices, expressId, ifcType, modelIndex } = mesh;
59
+ const triangleCount = indices.length / 3;
60
+ let intersectedCount = 0;
61
+ for (let t = 0; t < triangleCount; t++) {
62
+ const i0 = indices[t * 3];
63
+ const i1 = indices[t * 3 + 1];
64
+ const i2 = indices[t * 3 + 2];
65
+ // Get triangle vertices
66
+ const v0 = this.getVertex(positions, i0);
67
+ const v1 = this.getVertex(positions, i1);
68
+ const v2 = this.getVertex(positions, i2);
69
+ // Compute signed distances from plane
70
+ const d0 = signedDistanceToPlane(v0, this.planeNormal, this.planeDistance);
71
+ const d1 = signedDistanceToPlane(v1, this.planeNormal, this.planeDistance);
72
+ const d2 = signedDistanceToPlane(v2, this.planeNormal, this.planeDistance);
73
+ // Intersect triangle with plane
74
+ const intersection = this.intersectTrianglePlane(v0, v1, v2, d0, d1, d2);
75
+ if (intersection) {
76
+ intersectedCount++;
77
+ // Project 3D points to 2D
78
+ const p0_2d = projectTo2D(intersection.p0, this.axis, this.flipped);
79
+ const p1_2d = projectTo2D(intersection.p1, this.axis, this.flipped);
80
+ // Skip degenerate segments
81
+ const dx = p1_2d.x - p0_2d.x;
82
+ const dy = p1_2d.y - p0_2d.y;
83
+ if (dx * dx + dy * dy < EPSILON * EPSILON) {
84
+ continue;
85
+ }
86
+ segments.push({
87
+ p0: intersection.p0,
88
+ p1: intersection.p1,
89
+ p0_2d,
90
+ p1_2d,
91
+ entityId: expressId,
92
+ ifcType: ifcType || 'Unknown',
93
+ modelIndex: modelIndex || 0,
94
+ });
95
+ }
96
+ }
97
+ return {
98
+ segments,
99
+ trianglesProcessed: triangleCount,
100
+ trianglesIntersected: intersectedCount,
101
+ };
102
+ }
103
+ /**
104
+ * Get vertex from positions array
105
+ */
106
+ getVertex(positions, index) {
107
+ const base = index * 3;
108
+ return vec3(positions[base], positions[base + 1], positions[base + 2]);
109
+ }
110
+ /**
111
+ * Intersect a triangle with the section plane
112
+ * Returns the two intersection points, or null if no intersection
113
+ */
114
+ intersectTrianglePlane(v0, v1, v2, d0, d1, d2) {
115
+ // Count vertices on each side of the plane
116
+ const pos = (d0 > EPSILON ? 1 : 0) + (d1 > EPSILON ? 1 : 0) + (d2 > EPSILON ? 1 : 0);
117
+ const neg = (d0 < -EPSILON ? 1 : 0) + (d1 < -EPSILON ? 1 : 0) + (d2 < -EPSILON ? 1 : 0);
118
+ // No intersection if all vertices on same side
119
+ if (pos === 3 || neg === 3)
120
+ return null;
121
+ // All vertices on the plane - skip (degenerate case)
122
+ if (pos === 0 && neg === 0)
123
+ return null;
124
+ // Find intersection points on edges
125
+ const points = [];
126
+ // Check edge v0-v1
127
+ const p01 = this.edgePlaneIntersection(v0, v1, d0, d1);
128
+ if (p01)
129
+ points.push(p01);
130
+ // Check edge v1-v2
131
+ const p12 = this.edgePlaneIntersection(v1, v2, d1, d2);
132
+ if (p12)
133
+ points.push(p12);
134
+ // Check edge v2-v0
135
+ if (points.length < 2) {
136
+ const p20 = this.edgePlaneIntersection(v2, v0, d2, d0);
137
+ if (p20)
138
+ points.push(p20);
139
+ }
140
+ // Need exactly 2 intersection points
141
+ if (points.length >= 2) {
142
+ return { p0: points[0], p1: points[1] };
143
+ }
144
+ return null;
145
+ }
146
+ /**
147
+ * Find intersection point of an edge with the plane
148
+ */
149
+ edgePlaneIntersection(v0, v1, d0, d1) {
150
+ // Both vertices on the plane - edge lies on plane
151
+ if (Math.abs(d0) < EPSILON && Math.abs(d1) < EPSILON) {
152
+ return null; // Handled separately as face-on-plane
153
+ }
154
+ // One vertex on plane - return that vertex
155
+ if (Math.abs(d0) < EPSILON)
156
+ return v0;
157
+ if (Math.abs(d1) < EPSILON)
158
+ return v1;
159
+ // Both vertices on same side - no intersection
160
+ if ((d0 > 0) === (d1 > 0))
161
+ return null;
162
+ // Compute interpolation parameter
163
+ const t = d0 / (d0 - d1);
164
+ // Interpolate to find intersection point
165
+ return vec3Lerp(v0, v1, t);
166
+ }
167
+ }
168
+ /**
169
+ * Streaming section cutter for large models
170
+ * Processes meshes in batches to avoid blocking the main thread
171
+ */
172
+ export async function cutMeshesStreaming(meshes, config, options = {}) {
173
+ const { onSegments, batchSize = 100, yieldIntervalMs = 16 } = options;
174
+ const cutter = new SectionCutter(config);
175
+ const startTime = performance.now();
176
+ const allSegmentArrays = [];
177
+ let totalTriangles = 0;
178
+ let intersectedTriangles = 0;
179
+ let lastYield = performance.now();
180
+ for (let i = 0; i < meshes.length; i += batchSize) {
181
+ const batch = meshes.slice(i, Math.min(i + batchSize, meshes.length));
182
+ const batchSegmentArrays = [];
183
+ for (const mesh of batch) {
184
+ const result = cutter.cutSingleMesh(mesh);
185
+ batchSegmentArrays.push(result.segments);
186
+ totalTriangles += result.trianglesProcessed;
187
+ intersectedTriangles += result.trianglesIntersected;
188
+ }
189
+ // Flatten batch for progress callback
190
+ const batchSegments = batchSegmentArrays.flat();
191
+ allSegmentArrays.push(batchSegments);
192
+ // Report progress
193
+ const progress = Math.min(1, (i + batch.length) / meshes.length);
194
+ onSegments?.(batchSegments, progress);
195
+ // Yield to event loop periodically
196
+ const now = performance.now();
197
+ if (now - lastYield > yieldIntervalMs) {
198
+ await new Promise((resolve) => setTimeout(resolve, 0));
199
+ lastYield = performance.now();
200
+ }
201
+ }
202
+ // Flatten all segments at once (more efficient than repeated push(...spread))
203
+ const allSegments = allSegmentArrays.flat();
204
+ // Build polygons from all segments
205
+ const polygonBuilder = new PolygonBuilder();
206
+ const polygons = polygonBuilder.buildPolygons(allSegments);
207
+ const processingTimeMs = performance.now() - startTime;
208
+ return {
209
+ segments: allSegments,
210
+ polygons,
211
+ stats: {
212
+ totalTriangles,
213
+ intersectedTriangles,
214
+ segmentCount: allSegments.length,
215
+ polygonCount: polygons.length,
216
+ processingTimeMs,
217
+ },
218
+ };
219
+ }
220
+ //# sourceMappingURL=section-cutter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-cutter.js","sourceRoot":"","sources":["../src/section-cutter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Frame Renderer - Generates SVG for drawing frames
3
+ *
4
+ * Renders:
5
+ * - Outer and inner border rectangles
6
+ * - Zone reference labels (A-H, 1-8)
7
+ * - Fold marks for large format folding
8
+ * - Trim marks for print cutting
9
+ */
10
+ import type { PaperSizeDefinition } from './paper-sizes';
11
+ import type { DrawingFrame } from './frame-types';
12
+ /** Result of frame rendering */
13
+ export interface FrameRenderResult {
14
+ /** SVG elements for the frame (as string) */
15
+ svgElements: string;
16
+ /** Inner bounds for drawing content (mm from paper origin) */
17
+ innerBounds: {
18
+ x: number;
19
+ y: number;
20
+ width: number;
21
+ height: number;
22
+ };
23
+ }
24
+ /**
25
+ * Render a drawing frame to SVG
26
+ */
27
+ export declare function renderFrame(paper: PaperSizeDefinition, frame: DrawingFrame): FrameRenderResult;
28
+ //# sourceMappingURL=frame-renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-renderer.d.ts","sourceRoot":"","sources":["../../src/sheet/frame-renderer.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAElD,gCAAgC;AAChC,MAAM,WAAW,iBAAiB;IAChC,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,WAAW,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,YAAY,GAClB,iBAAiB,CAuEnB"}
@@ -0,0 +1,199 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * Render a drawing frame to SVG
6
+ */
7
+ export function renderFrame(paper, frame) {
8
+ let svg = ' <g id="drawing-frame">\n';
9
+ // Calculate outer border position
10
+ const outerX = frame.margins.left + frame.margins.bindingMargin;
11
+ const outerY = frame.margins.top;
12
+ const outerW = paper.widthMm -
13
+ frame.margins.left -
14
+ frame.margins.right -
15
+ frame.margins.bindingMargin;
16
+ const outerH = paper.heightMm - frame.margins.top - frame.margins.bottom;
17
+ // Outer border
18
+ svg += ` <rect x="${outerX.toFixed(2)}" y="${outerY.toFixed(2)}" `;
19
+ svg += `width="${outerW.toFixed(2)}" height="${outerH.toFixed(2)}" `;
20
+ svg += `fill="none" stroke="#000000" stroke-width="${frame.border.outerLineWeight}"/>\n`;
21
+ // Inner border (if gap specified)
22
+ let innerX = outerX;
23
+ let innerY = outerY;
24
+ let innerW = outerW;
25
+ let innerH = outerH;
26
+ if (frame.border.borderGap > 0 && frame.border.innerLineWeight > 0) {
27
+ innerX = outerX + frame.border.borderGap;
28
+ innerY = outerY + frame.border.borderGap;
29
+ innerW = outerW - 2 * frame.border.borderGap;
30
+ innerH = outerH - 2 * frame.border.borderGap;
31
+ svg += ` <rect x="${innerX.toFixed(2)}" y="${innerY.toFixed(2)}" `;
32
+ svg += `width="${innerW.toFixed(2)}" height="${innerH.toFixed(2)}" `;
33
+ svg += `fill="none" stroke="#000000" stroke-width="${frame.border.innerLineWeight}"/>\n`;
34
+ }
35
+ // Zone references
36
+ if (frame.showZoneReferences && frame.horizontalZones > 0) {
37
+ svg += renderZoneReferences(outerX, outerY, outerW, outerH, frame.border.borderGap, frame.horizontalZones, frame.verticalZones, frame.zoneFontSize, frame.border.innerLineWeight);
38
+ }
39
+ // Fold marks (for A0, A1, A2 sizes)
40
+ if (frame.border.showFoldMarks) {
41
+ svg += renderFoldMarks(paper, outerX, outerY, outerW, outerH);
42
+ }
43
+ // Trim marks
44
+ if (frame.border.showTrimMarks) {
45
+ svg += renderTrimMarks(paper);
46
+ }
47
+ svg += ' </g>\n';
48
+ return {
49
+ svgElements: svg,
50
+ innerBounds: {
51
+ x: innerX,
52
+ y: innerY,
53
+ width: innerW,
54
+ height: innerH,
55
+ },
56
+ };
57
+ }
58
+ /**
59
+ * Render zone reference labels around the frame
60
+ */
61
+ function renderZoneReferences(outerX, outerY, outerW, outerH, borderGap, horizontalZones, verticalZones, fontSize, lineWeight) {
62
+ let svg = ' <g id="zone-references">\n';
63
+ const zoneWidth = outerW / horizontalZones;
64
+ const zoneHeight = outerH / verticalZones;
65
+ // Horizontal zone labels (letters A-H at top and bottom)
66
+ const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
67
+ for (let i = 0; i < horizontalZones; i++) {
68
+ const x = outerX + zoneWidth * (i + 0.5);
69
+ const letter = letters[i % 26];
70
+ // Top label (in the gap area)
71
+ svg += ` <text x="${x.toFixed(2)}" y="${(outerY - borderGap / 2).toFixed(2)}" `;
72
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize}" `;
73
+ svg += `text-anchor="middle" dominant-baseline="middle">${letter}</text>\n`;
74
+ // Bottom label
75
+ svg += ` <text x="${x.toFixed(2)}" y="${(outerY + outerH + borderGap / 2).toFixed(2)}" `;
76
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize}" `;
77
+ svg += `text-anchor="middle" dominant-baseline="middle">${letter}</text>\n`;
78
+ // Vertical tick marks between zones
79
+ if (i > 0) {
80
+ const tickX = outerX + zoneWidth * i;
81
+ // Top tick
82
+ svg += ` <line x1="${tickX.toFixed(2)}" y1="${outerY.toFixed(2)}" `;
83
+ svg += `x2="${tickX.toFixed(2)}" y2="${(outerY - borderGap + 2).toFixed(2)}" `;
84
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
85
+ // Bottom tick
86
+ svg += ` <line x1="${tickX.toFixed(2)}" y1="${(outerY + outerH).toFixed(2)}" `;
87
+ svg += `x2="${tickX.toFixed(2)}" y2="${(outerY + outerH + borderGap - 2).toFixed(2)}" `;
88
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
89
+ }
90
+ }
91
+ // Vertical zone labels (numbers 1-8 at left and right)
92
+ for (let i = 0; i < verticalZones; i++) {
93
+ const y = outerY + zoneHeight * (i + 0.5);
94
+ const number = (i + 1).toString();
95
+ // Left label
96
+ svg += ` <text x="${(outerX - borderGap / 2).toFixed(2)}" y="${y.toFixed(2)}" `;
97
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize}" `;
98
+ svg += `text-anchor="middle" dominant-baseline="middle">${number}</text>\n`;
99
+ // Right label
100
+ svg += ` <text x="${(outerX + outerW + borderGap / 2).toFixed(2)}" y="${y.toFixed(2)}" `;
101
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize}" `;
102
+ svg += `text-anchor="middle" dominant-baseline="middle">${number}</text>\n`;
103
+ // Horizontal tick marks between zones
104
+ if (i > 0) {
105
+ const tickY = outerY + zoneHeight * i;
106
+ // Left tick
107
+ svg += ` <line x1="${outerX.toFixed(2)}" y1="${tickY.toFixed(2)}" `;
108
+ svg += `x2="${(outerX - borderGap + 2).toFixed(2)}" y2="${tickY.toFixed(2)}" `;
109
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
110
+ // Right tick
111
+ svg += ` <line x1="${(outerX + outerW).toFixed(2)}" y1="${tickY.toFixed(2)}" `;
112
+ svg += `x2="${(outerX + outerW + borderGap - 2).toFixed(2)}" y2="${tickY.toFixed(2)}" `;
113
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
114
+ }
115
+ }
116
+ svg += ' </g>\n';
117
+ return svg;
118
+ }
119
+ /**
120
+ * Render fold marks for large format drawings
121
+ * Based on DIN 824 folding standard for A0/A1 to A4
122
+ */
123
+ function renderFoldMarks(paper, outerX, outerY, outerW, outerH) {
124
+ let svg = ' <g id="fold-marks">\n';
125
+ // Standard A4 folded size: 210mm x 297mm
126
+ const foldWidth = 210;
127
+ const foldHeight = 297;
128
+ const markLength = 5; // Length of fold mark lines
129
+ const lineWeight = 0.25;
130
+ // Horizontal fold lines (for height > 297mm)
131
+ if (paper.heightMm > foldHeight) {
132
+ const numHFolds = Math.ceil(paper.heightMm / foldHeight);
133
+ for (let i = 1; i < numHFolds; i++) {
134
+ const y = i * foldHeight;
135
+ if (y < paper.heightMm - 20) {
136
+ // Small marks at edges
137
+ svg += ` <line x1="0" y1="${y.toFixed(2)}" x2="${markLength.toFixed(2)}" y2="${y.toFixed(2)}" `;
138
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
139
+ svg += ` <line x1="${(paper.widthMm - markLength).toFixed(2)}" y1="${y.toFixed(2)}" `;
140
+ svg += `x2="${paper.widthMm.toFixed(2)}" y2="${y.toFixed(2)}" `;
141
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
142
+ }
143
+ }
144
+ }
145
+ // Vertical fold lines (for width > 210mm)
146
+ if (paper.widthMm > foldWidth) {
147
+ const numVFolds = Math.ceil(paper.widthMm / foldWidth);
148
+ for (let i = 1; i < numVFolds; i++) {
149
+ const x = paper.widthMm - i * foldWidth; // Fold from right
150
+ if (x > 20) {
151
+ svg += ` <line x1="${x.toFixed(2)}" y1="0" x2="${x.toFixed(2)}" y2="${markLength.toFixed(2)}" `;
152
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
153
+ svg += ` <line x1="${x.toFixed(2)}" y1="${(paper.heightMm - markLength).toFixed(2)}" `;
154
+ svg += `x2="${x.toFixed(2)}" y2="${paper.heightMm.toFixed(2)}" `;
155
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
156
+ }
157
+ }
158
+ }
159
+ svg += ' </g>\n';
160
+ return svg;
161
+ }
162
+ /**
163
+ * Render trim marks at paper corners
164
+ */
165
+ function renderTrimMarks(paper) {
166
+ let svg = ' <g id="trim-marks">\n';
167
+ const markLength = 8;
168
+ const offset = 3;
169
+ const lineWeight = 0.15;
170
+ // Top-left corner
171
+ svg += ` <line x1="${offset.toFixed(2)}" y1="0" x2="${offset.toFixed(2)}" y2="${markLength.toFixed(2)}" `;
172
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
173
+ svg += ` <line x1="0" y1="${offset.toFixed(2)}" x2="${markLength.toFixed(2)}" y2="${offset.toFixed(2)}" `;
174
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
175
+ // Top-right corner
176
+ svg += ` <line x1="${(paper.widthMm - offset).toFixed(2)}" y1="0" `;
177
+ svg += `x2="${(paper.widthMm - offset).toFixed(2)}" y2="${markLength.toFixed(2)}" `;
178
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
179
+ svg += ` <line x1="${(paper.widthMm - markLength).toFixed(2)}" y1="${offset.toFixed(2)}" `;
180
+ svg += `x2="${paper.widthMm.toFixed(2)}" y2="${offset.toFixed(2)}" `;
181
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
182
+ // Bottom-left corner
183
+ svg += ` <line x1="${offset.toFixed(2)}" y1="${(paper.heightMm - markLength).toFixed(2)}" `;
184
+ svg += `x2="${offset.toFixed(2)}" y2="${paper.heightMm.toFixed(2)}" `;
185
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
186
+ svg += ` <line x1="0" y1="${(paper.heightMm - offset).toFixed(2)}" `;
187
+ svg += `x2="${markLength.toFixed(2)}" y2="${(paper.heightMm - offset).toFixed(2)}" `;
188
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
189
+ // Bottom-right corner
190
+ svg += ` <line x1="${(paper.widthMm - offset).toFixed(2)}" y1="${(paper.heightMm - markLength).toFixed(2)}" `;
191
+ svg += `x2="${(paper.widthMm - offset).toFixed(2)}" y2="${paper.heightMm.toFixed(2)}" `;
192
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
193
+ svg += ` <line x1="${(paper.widthMm - markLength).toFixed(2)}" y1="${(paper.heightMm - offset).toFixed(2)}" `;
194
+ svg += `x2="${paper.widthMm.toFixed(2)}" y2="${(paper.heightMm - offset).toFixed(2)}" `;
195
+ svg += `stroke="#000000" stroke-width="${lineWeight}"/>\n`;
196
+ svg += ' </g>\n';
197
+ return svg;
198
+ }
199
+ //# sourceMappingURL=frame-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-renderer.js","sourceRoot":"","sources":["../../src/sheet/frame-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Drawing Frame Types
3
+ *
4
+ * Professional drawing frame configurations with:
5
+ * - Multiple style presets
6
+ * - Configurable margins and borders
7
+ * - Zone references (A-H, 1-8)
8
+ * - Fold and trim marks
9
+ */
10
+ /** Frame style presets */
11
+ export type FrameStyle = 'simple' | 'professional' | 'minimal' | 'iso' | 'custom';
12
+ /** Frame border configuration */
13
+ export interface FrameBorderConfig {
14
+ /** Outer border line weight (mm) */
15
+ outerLineWeight: number;
16
+ /** Inner border line weight (mm) */
17
+ innerLineWeight: number;
18
+ /** Gap between outer and inner border (mm) */
19
+ borderGap: number;
20
+ /** Corner fold marks visible */
21
+ showFoldMarks: boolean;
22
+ /** Trim marks for printing */
23
+ showTrimMarks: boolean;
24
+ }
25
+ /** Margin configuration (in mm from paper edge to frame) */
26
+ export interface FrameMargins {
27
+ top: number;
28
+ right: number;
29
+ bottom: number;
30
+ left: number;
31
+ /** Extra binding margin on left (for hole punch) */
32
+ bindingMargin: number;
33
+ }
34
+ /** Complete frame definition */
35
+ export interface DrawingFrame {
36
+ /** Frame style ID */
37
+ style: FrameStyle;
38
+ /** Frame margins */
39
+ margins: FrameMargins;
40
+ /** Border configuration */
41
+ border: FrameBorderConfig;
42
+ /** Grid/zone references (A-H horizontal, 1-8 vertical) */
43
+ showZoneReferences: boolean;
44
+ /** Number of horizontal zones */
45
+ horizontalZones: number;
46
+ /** Number of vertical zones */
47
+ verticalZones: number;
48
+ /** Zone reference font size (mm) */
49
+ zoneFontSize: number;
50
+ }
51
+ /** Default frame configurations by style */
52
+ export declare const FRAME_PRESETS: Record<FrameStyle, Omit<DrawingFrame, 'style'>>;
53
+ /** Create a frame with a specific style */
54
+ export declare function createFrame(style: FrameStyle): DrawingFrame;
55
+ /** Get default frame (professional style) */
56
+ export declare function getDefaultFrame(): DrawingFrame;
57
+ //# sourceMappingURL=frame-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-types.d.ts","sourceRoot":"","sources":["../../src/sheet/frame-types.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,0BAA0B;AAC1B,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,CAAC;AAElF,iCAAiC;AACjC,MAAM,WAAW,iBAAiB;IAChC,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,8BAA8B;IAC9B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,qBAAqB;IACrB,KAAK,EAAE,UAAU,CAAC;IAClB,oBAAoB;IACpB,OAAO,EAAE,YAAY,CAAC;IACtB,2BAA2B;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,0DAA0D;IAC1D,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iCAAiC;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,4CAA4C;AAC5C,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAuEzE,CAAC;AAEF,2CAA2C;AAC3C,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAK3D;AAED,6CAA6C;AAC7C,wBAAgB,eAAe,IAAI,YAAY,CAE9C"}
@@ -0,0 +1,88 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /** Default frame configurations by style */
5
+ export const FRAME_PRESETS = {
6
+ simple: {
7
+ margins: { top: 10, right: 10, bottom: 10, left: 10, bindingMargin: 0 },
8
+ border: {
9
+ outerLineWeight: 0.7,
10
+ innerLineWeight: 0.35,
11
+ borderGap: 0,
12
+ showFoldMarks: false,
13
+ showTrimMarks: false,
14
+ },
15
+ showZoneReferences: false,
16
+ horizontalZones: 0,
17
+ verticalZones: 0,
18
+ zoneFontSize: 3,
19
+ },
20
+ professional: {
21
+ margins: { top: 10, right: 10, bottom: 10, left: 20, bindingMargin: 10 },
22
+ border: {
23
+ outerLineWeight: 0.7,
24
+ innerLineWeight: 0.35,
25
+ borderGap: 5,
26
+ showFoldMarks: true,
27
+ showTrimMarks: true,
28
+ },
29
+ showZoneReferences: true,
30
+ horizontalZones: 8,
31
+ verticalZones: 6,
32
+ zoneFontSize: 3.5,
33
+ },
34
+ minimal: {
35
+ margins: { top: 5, right: 5, bottom: 5, left: 5, bindingMargin: 0 },
36
+ border: {
37
+ outerLineWeight: 0.35,
38
+ innerLineWeight: 0,
39
+ borderGap: 0,
40
+ showFoldMarks: false,
41
+ showTrimMarks: false,
42
+ },
43
+ showZoneReferences: false,
44
+ horizontalZones: 0,
45
+ verticalZones: 0,
46
+ zoneFontSize: 3,
47
+ },
48
+ iso: {
49
+ margins: { top: 10, right: 10, bottom: 10, left: 20, bindingMargin: 10 },
50
+ border: {
51
+ outerLineWeight: 0.7,
52
+ innerLineWeight: 0.35,
53
+ borderGap: 5,
54
+ showFoldMarks: true,
55
+ showTrimMarks: true,
56
+ },
57
+ showZoneReferences: true,
58
+ horizontalZones: 8,
59
+ verticalZones: 4,
60
+ zoneFontSize: 3.5,
61
+ },
62
+ custom: {
63
+ margins: { top: 10, right: 10, bottom: 10, left: 10, bindingMargin: 0 },
64
+ border: {
65
+ outerLineWeight: 0.5,
66
+ innerLineWeight: 0.25,
67
+ borderGap: 3,
68
+ showFoldMarks: false,
69
+ showTrimMarks: false,
70
+ },
71
+ showZoneReferences: false,
72
+ horizontalZones: 0,
73
+ verticalZones: 0,
74
+ zoneFontSize: 3,
75
+ },
76
+ };
77
+ /** Create a frame with a specific style */
78
+ export function createFrame(style) {
79
+ return {
80
+ style,
81
+ ...FRAME_PRESETS[style],
82
+ };
83
+ }
84
+ /** Get default frame (professional style) */
85
+ export function getDefaultFrame() {
86
+ return createFrame('professional');
87
+ }
88
+ //# sourceMappingURL=frame-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-types.js","sourceRoot":"","sources":["../../src/sheet/frame-types.ts"],"names":[],"mappings":"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"}