@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.
- package/LICENSE +373 -0
- package/dist/drawing-generator.d.ts +80 -0
- package/dist/drawing-generator.d.ts.map +1 -0
- package/dist/drawing-generator.js +281 -0
- package/dist/drawing-generator.js.map +1 -0
- package/dist/edge-extractor.d.ts +47 -0
- package/dist/edge-extractor.d.ts.map +1 -0
- package/dist/edge-extractor.js +204 -0
- package/dist/edge-extractor.js.map +1 -0
- package/dist/gpu-section-cutter.d.ts +42 -0
- package/dist/gpu-section-cutter.d.ts.map +1 -0
- package/dist/gpu-section-cutter.js +405 -0
- package/dist/gpu-section-cutter.js.map +1 -0
- package/dist/graphic-overrides/index.d.ts +10 -0
- package/dist/graphic-overrides/index.d.ts.map +1 -0
- package/dist/graphic-overrides/index.js +8 -0
- package/dist/graphic-overrides/index.js.map +1 -0
- package/dist/graphic-overrides/presets.d.ts +22 -0
- package/dist/graphic-overrides/presets.d.ts.map +1 -0
- package/dist/graphic-overrides/presets.js +283 -0
- package/dist/graphic-overrides/presets.js.map +1 -0
- package/dist/graphic-overrides/rule-engine.d.ts +64 -0
- package/dist/graphic-overrides/rule-engine.d.ts.map +1 -0
- package/dist/graphic-overrides/rule-engine.js +438 -0
- package/dist/graphic-overrides/rule-engine.js.map +1 -0
- package/dist/graphic-overrides/types.d.ts +200 -0
- package/dist/graphic-overrides/types.d.ts.map +1 -0
- package/dist/graphic-overrides/types.js +5 -0
- package/dist/graphic-overrides/types.js.map +1 -0
- package/dist/hatch-generator.d.ts +76 -0
- package/dist/hatch-generator.d.ts.map +1 -0
- package/dist/hatch-generator.js +282 -0
- package/dist/hatch-generator.js.map +1 -0
- package/dist/hidden-line.d.ts +64 -0
- package/dist/hidden-line.d.ts.map +1 -0
- package/dist/hidden-line.js +318 -0
- package/dist/hidden-line.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/line-merger.d.ts +35 -0
- package/dist/line-merger.d.ts.map +1 -0
- package/dist/line-merger.js +265 -0
- package/dist/line-merger.js.map +1 -0
- package/dist/math.d.ts +90 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +284 -0
- package/dist/math.js.map +1 -0
- package/dist/openings/index.d.ts +7 -0
- package/dist/openings/index.d.ts.map +1 -0
- package/dist/openings/index.js +10 -0
- package/dist/openings/index.js.map +1 -0
- package/dist/openings/opening-filter.d.ts +61 -0
- package/dist/openings/opening-filter.d.ts.map +1 -0
- package/dist/openings/opening-filter.js +244 -0
- package/dist/openings/opening-filter.js.map +1 -0
- package/dist/openings/opening-relationship-builder.d.ts +35 -0
- package/dist/openings/opening-relationship-builder.d.ts.map +1 -0
- package/dist/openings/opening-relationship-builder.js +121 -0
- package/dist/openings/opening-relationship-builder.js.map +1 -0
- package/dist/openings/opening-utils.d.ts +55 -0
- package/dist/openings/opening-utils.d.ts.map +1 -0
- package/dist/openings/opening-utils.js +128 -0
- package/dist/openings/opening-utils.js.map +1 -0
- package/dist/polygon-builder.d.ts +62 -0
- package/dist/polygon-builder.d.ts.map +1 -0
- package/dist/polygon-builder.js +261 -0
- package/dist/polygon-builder.js.map +1 -0
- package/dist/section-cutter.d.ts +49 -0
- package/dist/section-cutter.d.ts.map +1 -0
- package/dist/section-cutter.js +220 -0
- package/dist/section-cutter.js.map +1 -0
- package/dist/sheet/frame-renderer.d.ts +28 -0
- package/dist/sheet/frame-renderer.d.ts.map +1 -0
- package/dist/sheet/frame-renderer.js +199 -0
- package/dist/sheet/frame-renderer.js.map +1 -0
- package/dist/sheet/frame-types.d.ts +57 -0
- package/dist/sheet/frame-types.d.ts.map +1 -0
- package/dist/sheet/frame-types.js +88 -0
- package/dist/sheet/frame-types.js.map +1 -0
- package/dist/sheet/index.d.ts +26 -0
- package/dist/sheet/index.d.ts.map +1 -0
- package/dist/sheet/index.js +12 -0
- package/dist/sheet/index.js.map +1 -0
- package/dist/sheet/paper-sizes.d.ts +36 -0
- package/dist/sheet/paper-sizes.d.ts.map +1 -0
- package/dist/sheet/paper-sizes.js +252 -0
- package/dist/sheet/paper-sizes.js.map +1 -0
- package/dist/sheet/scale-bar-renderer.d.ts +29 -0
- package/dist/sheet/scale-bar-renderer.d.ts.map +1 -0
- package/dist/sheet/scale-bar-renderer.js +287 -0
- package/dist/sheet/scale-bar-renderer.js.map +1 -0
- package/dist/sheet/scale-bar-types.d.ts +82 -0
- package/dist/sheet/scale-bar-types.d.ts.map +1 -0
- package/dist/sheet/scale-bar-types.js +66 -0
- package/dist/sheet/scale-bar-types.js.map +1 -0
- package/dist/sheet/sheet-types.d.ts +84 -0
- package/dist/sheet/sheet-types.d.ts.map +1 -0
- package/dist/sheet/sheet-types.js +77 -0
- package/dist/sheet/sheet-types.js.map +1 -0
- package/dist/sheet/title-block-renderer.d.ts +44 -0
- package/dist/sheet/title-block-renderer.d.ts.map +1 -0
- package/dist/sheet/title-block-renderer.js +335 -0
- package/dist/sheet/title-block-renderer.js.map +1 -0
- package/dist/sheet/title-block-types.d.ts +100 -0
- package/dist/sheet/title-block-types.d.ts.map +1 -0
- package/dist/sheet/title-block-types.js +174 -0
- package/dist/sheet/title-block-types.js.map +1 -0
- package/dist/styles.d.ts +77 -0
- package/dist/styles.d.ts.map +1 -0
- package/dist/styles.js +347 -0
- package/dist/styles.js.map +1 -0
- package/dist/styling/index.d.ts +7 -0
- package/dist/styling/index.d.ts.map +1 -0
- package/dist/styling/index.js +10 -0
- package/dist/styling/index.js.map +1 -0
- package/dist/styling/layer-mapping.d.ts +57 -0
- package/dist/styling/layer-mapping.d.ts.map +1 -0
- package/dist/styling/layer-mapping.js +303 -0
- package/dist/styling/layer-mapping.js.map +1 -0
- package/dist/styling/line-styles.d.ts +49 -0
- package/dist/styling/line-styles.d.ts.map +1 -0
- package/dist/styling/line-styles.js +123 -0
- package/dist/styling/line-styles.js.map +1 -0
- package/dist/styling/line-weights.d.ts +61 -0
- package/dist/styling/line-weights.d.ts.map +1 -0
- package/dist/styling/line-weights.js +183 -0
- package/dist/styling/line-weights.js.map +1 -0
- package/dist/svg-exporter.d.ts +63 -0
- package/dist/svg-exporter.d.ts.map +1 -0
- package/dist/svg-exporter.js +278 -0
- package/dist/svg-exporter.js.map +1 -0
- package/dist/symbols/door-symbol.d.ts +82 -0
- package/dist/symbols/door-symbol.d.ts.map +1 -0
- package/dist/symbols/door-symbol.js +390 -0
- package/dist/symbols/door-symbol.js.map +1 -0
- package/dist/symbols/index.d.ts +8 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +11 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/symbol-renderer.d.ts +29 -0
- package/dist/symbols/symbol-renderer.d.ts.map +1 -0
- package/dist/symbols/symbol-renderer.js +173 -0
- package/dist/symbols/symbol-renderer.js.map +1 -0
- package/dist/symbols/symbol-utils.d.ts +48 -0
- package/dist/symbols/symbol-utils.d.ts.map +1 -0
- package/dist/symbols/symbol-utils.js +129 -0
- package/dist/symbols/symbol-utils.js.map +1 -0
- package/dist/symbols/window-symbol.d.ts +57 -0
- package/dist/symbols/window-symbol.d.ts.map +1 -0
- package/dist/symbols/window-symbol.js +209 -0
- package/dist/symbols/window-symbol.js.map +1 -0
- package/dist/types.d.ts +443 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +31 -0
- package/dist/types.js.map +1 -0
- 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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"}
|