@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,390 @@
|
|
|
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
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
arcSegments: 16,
|
|
6
|
+
swingAngle: 90,
|
|
7
|
+
showLeaf: true,
|
|
8
|
+
showThreshold: false,
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Generates door symbols for 2D floor plans
|
|
12
|
+
*/
|
|
13
|
+
export class DoorSymbolGenerator {
|
|
14
|
+
config;
|
|
15
|
+
constructor(config = {}) {
|
|
16
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate door symbol from opening info
|
|
20
|
+
*/
|
|
21
|
+
generateFromOpening(opening, bounds2D, wallDirection) {
|
|
22
|
+
const operation = opening.doorOperation ?? 'SINGLE_SWING_LEFT';
|
|
23
|
+
const width = opening.width;
|
|
24
|
+
// Calculate center of opening
|
|
25
|
+
const center = {
|
|
26
|
+
x: (bounds2D.min.x + bounds2D.max.x) / 2,
|
|
27
|
+
y: (bounds2D.min.y + bounds2D.max.y) / 2,
|
|
28
|
+
};
|
|
29
|
+
// Determine wall perpendicular direction (into room)
|
|
30
|
+
const perpendicular = this.getPerpendicularDirection(wallDirection);
|
|
31
|
+
return this.generateSymbol(center, width, operation, wallDirection, perpendicular);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Generate a door symbol at a specific position
|
|
35
|
+
*/
|
|
36
|
+
generateSymbol(center, width, operation, wallDirection, swingDirection) {
|
|
37
|
+
switch (operation) {
|
|
38
|
+
case 'SINGLE_SWING_LEFT':
|
|
39
|
+
return this.generateSwingDoor(center, width, wallDirection, swingDirection, 'left', false);
|
|
40
|
+
case 'SINGLE_SWING_RIGHT':
|
|
41
|
+
return this.generateSwingDoor(center, width, wallDirection, swingDirection, 'right', false);
|
|
42
|
+
case 'DOUBLE_SWING_LEFT':
|
|
43
|
+
return this.generateSwingDoor(center, width, wallDirection, swingDirection, 'left', true);
|
|
44
|
+
case 'DOUBLE_SWING_RIGHT':
|
|
45
|
+
return this.generateSwingDoor(center, width, wallDirection, swingDirection, 'right', true);
|
|
46
|
+
case 'DOUBLE_DOOR_SINGLE_SWING':
|
|
47
|
+
case 'DOUBLE_DOOR_DOUBLE_SWING':
|
|
48
|
+
return this.generateDoubleDoor(center, width, wallDirection, swingDirection);
|
|
49
|
+
case 'SLIDING_TO_LEFT':
|
|
50
|
+
return this.generateSlidingDoor(center, width, wallDirection, 'left');
|
|
51
|
+
case 'SLIDING_TO_RIGHT':
|
|
52
|
+
return this.generateSlidingDoor(center, width, wallDirection, 'right');
|
|
53
|
+
case 'DOUBLE_DOOR_SLIDING':
|
|
54
|
+
return this.generateDoubleSlidingDoor(center, width, wallDirection);
|
|
55
|
+
case 'FOLDING_TO_LEFT':
|
|
56
|
+
return this.generateFoldingDoor(center, width, wallDirection, 'left');
|
|
57
|
+
case 'FOLDING_TO_RIGHT':
|
|
58
|
+
return this.generateFoldingDoor(center, width, wallDirection, 'right');
|
|
59
|
+
case 'REVOLVING':
|
|
60
|
+
return this.generateRevolvingDoor(center, width);
|
|
61
|
+
default:
|
|
62
|
+
// Default to single swing left
|
|
63
|
+
return this.generateSwingDoor(center, width, wallDirection, swingDirection, 'left', false);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Generate single swing door symbol
|
|
68
|
+
*/
|
|
69
|
+
generateSwingDoor(center, width, wallDir, swingDir, hingeSide, bothWays) {
|
|
70
|
+
const lines = [];
|
|
71
|
+
const halfWidth = width / 2;
|
|
72
|
+
// Calculate hinge point (at edge of opening)
|
|
73
|
+
const hingeOffset = hingeSide === 'left' ? -halfWidth : halfWidth;
|
|
74
|
+
const hingePoint = {
|
|
75
|
+
x: center.x + wallDir.x * hingeOffset,
|
|
76
|
+
y: center.y + wallDir.y * hingeOffset,
|
|
77
|
+
};
|
|
78
|
+
// Door leaf endpoint (open position)
|
|
79
|
+
const swingAngleRad = (this.config.swingAngle * Math.PI) / 180;
|
|
80
|
+
const leafEnd = {
|
|
81
|
+
x: hingePoint.x + swingDir.x * width,
|
|
82
|
+
y: hingePoint.y + swingDir.y * width,
|
|
83
|
+
};
|
|
84
|
+
// Door leaf line (shows door in open position)
|
|
85
|
+
if (this.config.showLeaf) {
|
|
86
|
+
lines.push({ start: hingePoint, end: leafEnd });
|
|
87
|
+
}
|
|
88
|
+
// Generate swing arc
|
|
89
|
+
const arcLines = this.generateArc(hingePoint, width, wallDir, swingDir, hingeSide === 'left' ? 1 : -1, swingAngleRad);
|
|
90
|
+
lines.push(...arcLines);
|
|
91
|
+
// If door swings both ways, add arc on opposite side
|
|
92
|
+
if (bothWays) {
|
|
93
|
+
const oppositeSwingDir = {
|
|
94
|
+
x: -swingDir.x,
|
|
95
|
+
y: -swingDir.y,
|
|
96
|
+
};
|
|
97
|
+
const oppositeArcLines = this.generateArc(hingePoint, width, wallDir, oppositeSwingDir, hingeSide === 'left' ? -1 : 1, swingAngleRad);
|
|
98
|
+
lines.push(...oppositeArcLines);
|
|
99
|
+
}
|
|
100
|
+
const params = {
|
|
101
|
+
width,
|
|
102
|
+
swingDirection: hingeSide === 'left' ? 1 : -1,
|
|
103
|
+
swingAngle: swingAngleRad,
|
|
104
|
+
hingePoint,
|
|
105
|
+
isDouble: false,
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
symbol: {
|
|
109
|
+
type: 'door-swing',
|
|
110
|
+
position: center,
|
|
111
|
+
rotation: Math.atan2(wallDir.y, wallDir.x),
|
|
112
|
+
scale: 1,
|
|
113
|
+
parameters: params,
|
|
114
|
+
},
|
|
115
|
+
lines,
|
|
116
|
+
arcPath: this.generateArcSVGPath(hingePoint, width, wallDir, swingDir, swingAngleRad),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Generate double door symbol (two leaves meeting in middle)
|
|
121
|
+
*/
|
|
122
|
+
generateDoubleDoor(center, width, wallDir, swingDir) {
|
|
123
|
+
const lines = [];
|
|
124
|
+
const halfWidth = width / 2;
|
|
125
|
+
const leafWidth = halfWidth;
|
|
126
|
+
// Left hinge point
|
|
127
|
+
const leftHinge = {
|
|
128
|
+
x: center.x - wallDir.x * halfWidth,
|
|
129
|
+
y: center.y - wallDir.y * halfWidth,
|
|
130
|
+
};
|
|
131
|
+
// Right hinge point
|
|
132
|
+
const rightHinge = {
|
|
133
|
+
x: center.x + wallDir.x * halfWidth,
|
|
134
|
+
y: center.y + wallDir.y * halfWidth,
|
|
135
|
+
};
|
|
136
|
+
const swingAngleRad = (this.config.swingAngle * Math.PI) / 180;
|
|
137
|
+
// Left door leaf and arc
|
|
138
|
+
if (this.config.showLeaf) {
|
|
139
|
+
lines.push({
|
|
140
|
+
start: leftHinge,
|
|
141
|
+
end: {
|
|
142
|
+
x: leftHinge.x + swingDir.x * leafWidth,
|
|
143
|
+
y: leftHinge.y + swingDir.y * leafWidth,
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
lines.push(...this.generateArc(leftHinge, leafWidth, wallDir, swingDir, 1, swingAngleRad));
|
|
148
|
+
// Right door leaf and arc
|
|
149
|
+
if (this.config.showLeaf) {
|
|
150
|
+
lines.push({
|
|
151
|
+
start: rightHinge,
|
|
152
|
+
end: {
|
|
153
|
+
x: rightHinge.x + swingDir.x * leafWidth,
|
|
154
|
+
y: rightHinge.y + swingDir.y * leafWidth,
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
lines.push(...this.generateArc(rightHinge, leafWidth, wallDir, swingDir, -1, swingAngleRad));
|
|
159
|
+
const params = {
|
|
160
|
+
width,
|
|
161
|
+
swingDirection: 1,
|
|
162
|
+
swingAngle: swingAngleRad,
|
|
163
|
+
hingePoint: center,
|
|
164
|
+
isDouble: true,
|
|
165
|
+
};
|
|
166
|
+
return {
|
|
167
|
+
symbol: {
|
|
168
|
+
type: 'door-swing',
|
|
169
|
+
position: center,
|
|
170
|
+
rotation: Math.atan2(wallDir.y, wallDir.x),
|
|
171
|
+
scale: 1,
|
|
172
|
+
parameters: params,
|
|
173
|
+
},
|
|
174
|
+
lines,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Generate sliding door symbol
|
|
179
|
+
*/
|
|
180
|
+
generateSlidingDoor(center, width, wallDir, slideDirection) {
|
|
181
|
+
const lines = [];
|
|
182
|
+
const halfWidth = width / 2;
|
|
183
|
+
// Door panel line (centered)
|
|
184
|
+
const panelStart = {
|
|
185
|
+
x: center.x - wallDir.x * halfWidth,
|
|
186
|
+
y: center.y - wallDir.y * halfWidth,
|
|
187
|
+
};
|
|
188
|
+
const panelEnd = {
|
|
189
|
+
x: center.x + wallDir.x * halfWidth,
|
|
190
|
+
y: center.y + wallDir.y * halfWidth,
|
|
191
|
+
};
|
|
192
|
+
lines.push({ start: panelStart, end: panelEnd });
|
|
193
|
+
// Arrow indicating slide direction
|
|
194
|
+
const arrowDir = slideDirection === 'left' ? -1 : 1;
|
|
195
|
+
const arrowLen = width * 0.3;
|
|
196
|
+
const arrowStart = {
|
|
197
|
+
x: center.x - wallDir.x * arrowLen * 0.5 * arrowDir,
|
|
198
|
+
y: center.y - wallDir.y * arrowLen * 0.5 * arrowDir,
|
|
199
|
+
};
|
|
200
|
+
const arrowEnd = {
|
|
201
|
+
x: center.x + wallDir.x * arrowLen * 0.5 * arrowDir,
|
|
202
|
+
y: center.y + wallDir.y * arrowLen * 0.5 * arrowDir,
|
|
203
|
+
};
|
|
204
|
+
lines.push({ start: arrowStart, end: arrowEnd });
|
|
205
|
+
const params = {
|
|
206
|
+
width,
|
|
207
|
+
slideDirection: arrowDir,
|
|
208
|
+
panelCount: 1,
|
|
209
|
+
};
|
|
210
|
+
return {
|
|
211
|
+
symbol: {
|
|
212
|
+
type: 'door-sliding',
|
|
213
|
+
position: center,
|
|
214
|
+
rotation: Math.atan2(wallDir.y, wallDir.x),
|
|
215
|
+
scale: 1,
|
|
216
|
+
parameters: params,
|
|
217
|
+
},
|
|
218
|
+
lines,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Generate double sliding door symbol
|
|
223
|
+
*/
|
|
224
|
+
generateDoubleSlidingDoor(center, width, wallDir) {
|
|
225
|
+
const lines = [];
|
|
226
|
+
const quarterWidth = width / 4;
|
|
227
|
+
// Two panel lines that slide apart
|
|
228
|
+
const leftPanel = {
|
|
229
|
+
start: {
|
|
230
|
+
x: center.x - wallDir.x * quarterWidth * 2,
|
|
231
|
+
y: center.y - wallDir.y * quarterWidth * 2,
|
|
232
|
+
},
|
|
233
|
+
end: center,
|
|
234
|
+
};
|
|
235
|
+
const rightPanel = {
|
|
236
|
+
start: center,
|
|
237
|
+
end: {
|
|
238
|
+
x: center.x + wallDir.x * quarterWidth * 2,
|
|
239
|
+
y: center.y + wallDir.y * quarterWidth * 2,
|
|
240
|
+
},
|
|
241
|
+
};
|
|
242
|
+
lines.push(leftPanel, rightPanel);
|
|
243
|
+
const params = {
|
|
244
|
+
width,
|
|
245
|
+
slideDirection: 1,
|
|
246
|
+
panelCount: 2,
|
|
247
|
+
};
|
|
248
|
+
return {
|
|
249
|
+
symbol: {
|
|
250
|
+
type: 'door-sliding',
|
|
251
|
+
position: center,
|
|
252
|
+
rotation: Math.atan2(wallDir.y, wallDir.x),
|
|
253
|
+
scale: 1,
|
|
254
|
+
parameters: params,
|
|
255
|
+
},
|
|
256
|
+
lines,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Generate folding door symbol
|
|
261
|
+
*/
|
|
262
|
+
generateFoldingDoor(center, width, wallDir, foldDirection) {
|
|
263
|
+
const lines = [];
|
|
264
|
+
const halfWidth = width / 2;
|
|
265
|
+
// Accordion-style zigzag pattern
|
|
266
|
+
const hingePoint = {
|
|
267
|
+
x: center.x + wallDir.x * halfWidth * (foldDirection === 'left' ? -1 : 1),
|
|
268
|
+
y: center.y + wallDir.y * halfWidth * (foldDirection === 'left' ? -1 : 1),
|
|
269
|
+
};
|
|
270
|
+
// Draw folded panels as small zigzag
|
|
271
|
+
const panelCount = 3;
|
|
272
|
+
const panelWidth = width / panelCount;
|
|
273
|
+
const foldDepth = panelWidth * 0.3;
|
|
274
|
+
const perpDir = this.getPerpendicularDirection(wallDir);
|
|
275
|
+
let currentX = hingePoint.x;
|
|
276
|
+
let currentY = hingePoint.y;
|
|
277
|
+
for (let i = 0; i < panelCount; i++) {
|
|
278
|
+
const offset = i % 2 === 0 ? foldDepth : -foldDepth;
|
|
279
|
+
const nextX = currentX + wallDir.x * panelWidth * (foldDirection === 'left' ? 1 : -1);
|
|
280
|
+
const nextY = currentY + wallDir.y * panelWidth * (foldDirection === 'left' ? 1 : -1);
|
|
281
|
+
lines.push({
|
|
282
|
+
start: { x: currentX, y: currentY },
|
|
283
|
+
end: {
|
|
284
|
+
x: nextX + perpDir.x * offset,
|
|
285
|
+
y: nextY + perpDir.y * offset,
|
|
286
|
+
},
|
|
287
|
+
});
|
|
288
|
+
currentX = nextX;
|
|
289
|
+
currentY = nextY;
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
symbol: {
|
|
293
|
+
type: 'door-folding',
|
|
294
|
+
position: center,
|
|
295
|
+
rotation: Math.atan2(wallDir.y, wallDir.x),
|
|
296
|
+
scale: 1,
|
|
297
|
+
parameters: { width, slideDirection: foldDirection === 'left' ? -1 : 1, panelCount },
|
|
298
|
+
},
|
|
299
|
+
lines,
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Generate revolving door symbol
|
|
304
|
+
*/
|
|
305
|
+
generateRevolvingDoor(center, width) {
|
|
306
|
+
const lines = [];
|
|
307
|
+
const radius = width / 2;
|
|
308
|
+
// Draw circle (as line segments)
|
|
309
|
+
const circleSegments = 24;
|
|
310
|
+
for (let i = 0; i < circleSegments; i++) {
|
|
311
|
+
const angle1 = (i / circleSegments) * Math.PI * 2;
|
|
312
|
+
const angle2 = ((i + 1) / circleSegments) * Math.PI * 2;
|
|
313
|
+
lines.push({
|
|
314
|
+
start: {
|
|
315
|
+
x: center.x + Math.cos(angle1) * radius,
|
|
316
|
+
y: center.y + Math.sin(angle1) * radius,
|
|
317
|
+
},
|
|
318
|
+
end: {
|
|
319
|
+
x: center.x + Math.cos(angle2) * radius,
|
|
320
|
+
y: center.y + Math.sin(angle2) * radius,
|
|
321
|
+
},
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
// Draw 4 door leaves (cross pattern)
|
|
325
|
+
for (let i = 0; i < 4; i++) {
|
|
326
|
+
const angle = (i / 4) * Math.PI * 2;
|
|
327
|
+
lines.push({
|
|
328
|
+
start: center,
|
|
329
|
+
end: {
|
|
330
|
+
x: center.x + Math.cos(angle) * radius,
|
|
331
|
+
y: center.y + Math.sin(angle) * radius,
|
|
332
|
+
},
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
return {
|
|
336
|
+
symbol: {
|
|
337
|
+
type: 'door-revolving',
|
|
338
|
+
position: center,
|
|
339
|
+
rotation: 0,
|
|
340
|
+
scale: 1,
|
|
341
|
+
parameters: { width, swingDirection: 1, swingAngle: Math.PI / 2, hingePoint: center, isDouble: false },
|
|
342
|
+
},
|
|
343
|
+
lines,
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Generate arc as line segments
|
|
348
|
+
*/
|
|
349
|
+
generateArc(center, radius, wallDir, swingDir, direction, angleRad) {
|
|
350
|
+
const lines = [];
|
|
351
|
+
const segments = this.config.arcSegments;
|
|
352
|
+
// Start angle is along wall direction (door closed)
|
|
353
|
+
const startAngle = Math.atan2(wallDir.y, wallDir.x) + (direction > 0 ? Math.PI : 0);
|
|
354
|
+
for (let i = 0; i < segments; i++) {
|
|
355
|
+
const t1 = i / segments;
|
|
356
|
+
const t2 = (i + 1) / segments;
|
|
357
|
+
const angle1 = startAngle + direction * t1 * angleRad;
|
|
358
|
+
const angle2 = startAngle + direction * t2 * angleRad;
|
|
359
|
+
lines.push({
|
|
360
|
+
start: {
|
|
361
|
+
x: center.x + Math.cos(angle1) * radius,
|
|
362
|
+
y: center.y + Math.sin(angle1) * radius,
|
|
363
|
+
},
|
|
364
|
+
end: {
|
|
365
|
+
x: center.x + Math.cos(angle2) * radius,
|
|
366
|
+
y: center.y + Math.sin(angle2) * radius,
|
|
367
|
+
},
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
return lines;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Generate SVG arc path string
|
|
374
|
+
*/
|
|
375
|
+
generateArcSVGPath(center, radius, wallDir, swingDir, angleRad) {
|
|
376
|
+
const startAngle = Math.atan2(wallDir.y, wallDir.x);
|
|
377
|
+
const endAngle = startAngle + angleRad;
|
|
378
|
+
const startX = center.x + Math.cos(startAngle) * radius;
|
|
379
|
+
const startY = center.y + Math.sin(startAngle) * radius;
|
|
380
|
+
const endX = center.x + Math.cos(endAngle) * radius;
|
|
381
|
+
const endY = center.y + Math.sin(endAngle) * radius;
|
|
382
|
+
const largeArc = angleRad > Math.PI ? 1 : 0;
|
|
383
|
+
const sweep = 1;
|
|
384
|
+
return `M ${startX} ${startY} A ${radius} ${radius} 0 ${largeArc} ${sweep} ${endX} ${endY}`;
|
|
385
|
+
}
|
|
386
|
+
getPerpendicularDirection(dir) {
|
|
387
|
+
return { x: -dir.y, y: dir.x };
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=door-symbol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"door-symbol.js","sourceRoot":"","sources":["../../src/symbols/door-symbol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architectural symbol generators for 2D drawings
|
|
3
|
+
*/
|
|
4
|
+
export { DoorSymbolGenerator } from './door-symbol';
|
|
5
|
+
export { WindowSymbolGenerator } from './window-symbol';
|
|
6
|
+
export { SymbolRenderer } from './symbol-renderer';
|
|
7
|
+
export { generateDoorSymbol, generateWindowSymbol, generateStairArrow, } from './symbol-utils';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/symbols/index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
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
|
+
* Architectural symbol generators for 2D drawings
|
|
6
|
+
*/
|
|
7
|
+
export { DoorSymbolGenerator } from './door-symbol';
|
|
8
|
+
export { WindowSymbolGenerator } from './window-symbol';
|
|
9
|
+
export { SymbolRenderer } from './symbol-renderer';
|
|
10
|
+
export { generateDoorSymbol, generateWindowSymbol, generateStairArrow, } from './symbol-utils';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/symbols/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;GAEG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders architectural symbols to SVG
|
|
3
|
+
*/
|
|
4
|
+
import type { ArchitecturalSymbol } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* Renders architectural symbols to SVG elements
|
|
7
|
+
*/
|
|
8
|
+
export declare class SymbolRenderer {
|
|
9
|
+
/**
|
|
10
|
+
* Render a symbol to SVG path/group elements
|
|
11
|
+
*/
|
|
12
|
+
renderToSVG(symbol: ArchitecturalSymbol, transform?: SVGTransform): string;
|
|
13
|
+
private buildTransformAttr;
|
|
14
|
+
private renderDoorSwing;
|
|
15
|
+
private renderDoorSliding;
|
|
16
|
+
private renderDoorFolding;
|
|
17
|
+
private renderDoorRevolving;
|
|
18
|
+
private renderWindowFrame;
|
|
19
|
+
private renderStairArrow;
|
|
20
|
+
private renderNorthArrow;
|
|
21
|
+
}
|
|
22
|
+
interface SVGTransform {
|
|
23
|
+
offsetX: number;
|
|
24
|
+
offsetY: number;
|
|
25
|
+
scale: number;
|
|
26
|
+
flipY: boolean;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=symbol-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-renderer.d.ts","sourceRoot":"","sources":["../../src/symbols/symbol-renderer.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EACV,mBAAmB,EAMpB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,qBAAa,cAAc;IACzB;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,mBAAmB,EAAE,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM;IA4B1E,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,gBAAgB;CAezB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB"}
|
|
@@ -0,0 +1,173 @@
|
|
|
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
|
+
* Renders architectural symbols to SVG elements
|
|
6
|
+
*/
|
|
7
|
+
export class SymbolRenderer {
|
|
8
|
+
/**
|
|
9
|
+
* Render a symbol to SVG path/group elements
|
|
10
|
+
*/
|
|
11
|
+
renderToSVG(symbol, transform) {
|
|
12
|
+
const tx = transform?.offsetX ?? 0;
|
|
13
|
+
const ty = transform?.offsetY ?? 0;
|
|
14
|
+
const scale = transform?.scale ?? 1;
|
|
15
|
+
const flipY = transform?.flipY ?? false;
|
|
16
|
+
const transformAttr = this.buildTransformAttr(symbol, tx, ty, scale, flipY);
|
|
17
|
+
switch (symbol.type) {
|
|
18
|
+
case 'door-swing':
|
|
19
|
+
return this.renderDoorSwing(symbol, transformAttr);
|
|
20
|
+
case 'door-sliding':
|
|
21
|
+
return this.renderDoorSliding(symbol, transformAttr);
|
|
22
|
+
case 'door-folding':
|
|
23
|
+
return this.renderDoorFolding(symbol, transformAttr);
|
|
24
|
+
case 'door-revolving':
|
|
25
|
+
return this.renderDoorRevolving(symbol, transformAttr);
|
|
26
|
+
case 'window-frame':
|
|
27
|
+
return this.renderWindowFrame(symbol, transformAttr);
|
|
28
|
+
case 'stair-arrow':
|
|
29
|
+
return this.renderStairArrow(symbol, transformAttr);
|
|
30
|
+
case 'north-arrow':
|
|
31
|
+
return this.renderNorthArrow(symbol, transformAttr);
|
|
32
|
+
default:
|
|
33
|
+
return '';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
buildTransformAttr(symbol, tx, ty, scale, flipY) {
|
|
37
|
+
const { position, rotation } = symbol;
|
|
38
|
+
const x = position.x * scale + tx;
|
|
39
|
+
const y = flipY ? -position.y * scale + ty : position.y * scale + ty;
|
|
40
|
+
const rotDeg = (rotation * 180) / Math.PI;
|
|
41
|
+
return `transform="translate(${x}, ${y}) rotate(${flipY ? -rotDeg : rotDeg}) scale(${symbol.scale * scale})"`;
|
|
42
|
+
}
|
|
43
|
+
renderDoorSwing(symbol, transformAttr) {
|
|
44
|
+
const params = symbol.parameters;
|
|
45
|
+
const { width, swingAngle, swingDirection, isDouble } = params;
|
|
46
|
+
// Door swing arc
|
|
47
|
+
const arcRadius = width;
|
|
48
|
+
const startAngle = 0;
|
|
49
|
+
const endAngle = swingAngle * swingDirection;
|
|
50
|
+
const startX = 0;
|
|
51
|
+
const startY = arcRadius;
|
|
52
|
+
const endX = Math.sin(endAngle) * arcRadius;
|
|
53
|
+
const endY = Math.cos(endAngle) * arcRadius;
|
|
54
|
+
const largeArc = Math.abs(swingAngle) > Math.PI ? 1 : 0;
|
|
55
|
+
const sweep = swingDirection > 0 ? 1 : 0;
|
|
56
|
+
let svg = `<g ${transformAttr} class="door-swing">`;
|
|
57
|
+
// Swing arc
|
|
58
|
+
svg += `<path d="M ${startX} ${startY} A ${arcRadius} ${arcRadius} 0 ${largeArc} ${sweep} ${endX} ${endY}" `;
|
|
59
|
+
svg += `fill="none" stroke="currentColor" stroke-width="0.5"/>`;
|
|
60
|
+
// Door leaf line (from hinge to arc end)
|
|
61
|
+
svg += `<line x1="0" y1="0" x2="${endX}" y2="${endY}" stroke="currentColor" stroke-width="0.5"/>`;
|
|
62
|
+
if (isDouble) {
|
|
63
|
+
// Mirror for double door
|
|
64
|
+
svg += `<path d="M ${startX} ${-startY} A ${arcRadius} ${arcRadius} 0 ${largeArc} ${1 - sweep} ${endX} ${-endY}" `;
|
|
65
|
+
svg += `fill="none" stroke="currentColor" stroke-width="0.5"/>`;
|
|
66
|
+
svg += `<line x1="0" y1="0" x2="${endX}" y2="${-endY}" stroke="currentColor" stroke-width="0.5"/>`;
|
|
67
|
+
}
|
|
68
|
+
svg += '</g>';
|
|
69
|
+
return svg;
|
|
70
|
+
}
|
|
71
|
+
renderDoorSliding(symbol, transformAttr) {
|
|
72
|
+
const params = symbol.parameters;
|
|
73
|
+
const { width, slideDirection, panelCount } = params;
|
|
74
|
+
const halfWidth = width / 2;
|
|
75
|
+
let svg = `<g ${transformAttr} class="door-sliding">`;
|
|
76
|
+
// Door panel(s)
|
|
77
|
+
if (panelCount === 1) {
|
|
78
|
+
svg += `<line x1="${-halfWidth}" y1="0" x2="${halfWidth}" y2="0" stroke="currentColor" stroke-width="1"/>`;
|
|
79
|
+
// Arrow
|
|
80
|
+
const arrowLen = width * 0.2;
|
|
81
|
+
const arrowX = slideDirection * arrowLen;
|
|
82
|
+
svg += `<path d="M 0 0 L ${arrowX} 0 M ${arrowX * 0.7} ${-arrowLen * 0.3} L ${arrowX} 0 L ${arrowX * 0.7} ${arrowLen * 0.3}" `;
|
|
83
|
+
svg += `fill="none" stroke="currentColor" stroke-width="0.5"/>`;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// Double sliding - two panels meeting in middle
|
|
87
|
+
svg += `<line x1="${-halfWidth}" y1="0" x2="0" y2="0" stroke="currentColor" stroke-width="1"/>`;
|
|
88
|
+
svg += `<line x1="0" y1="0" x2="${halfWidth}" y2="0" stroke="currentColor" stroke-width="1"/>`;
|
|
89
|
+
}
|
|
90
|
+
svg += '</g>';
|
|
91
|
+
return svg;
|
|
92
|
+
}
|
|
93
|
+
renderDoorFolding(symbol, transformAttr) {
|
|
94
|
+
const params = symbol.parameters;
|
|
95
|
+
const { width } = params;
|
|
96
|
+
let svg = `<g ${transformAttr} class="door-folding">`;
|
|
97
|
+
// Zigzag pattern for folding door
|
|
98
|
+
const panelWidth = width / 4;
|
|
99
|
+
const foldDepth = panelWidth * 0.5;
|
|
100
|
+
let path = `M ${-width / 2} 0`;
|
|
101
|
+
for (let i = 0; i < 4; i++) {
|
|
102
|
+
const x = -width / 2 + (i + 1) * panelWidth;
|
|
103
|
+
const y = i % 2 === 0 ? foldDepth : 0;
|
|
104
|
+
path += ` L ${x} ${y}`;
|
|
105
|
+
}
|
|
106
|
+
svg += `<path d="${path}" fill="none" stroke="currentColor" stroke-width="0.5"/>`;
|
|
107
|
+
svg += '</g>';
|
|
108
|
+
return svg;
|
|
109
|
+
}
|
|
110
|
+
renderDoorRevolving(symbol, transformAttr) {
|
|
111
|
+
const params = symbol.parameters;
|
|
112
|
+
const radius = params.width / 2;
|
|
113
|
+
let svg = `<g ${transformAttr} class="door-revolving">`;
|
|
114
|
+
// Circle
|
|
115
|
+
svg += `<circle cx="0" cy="0" r="${radius}" fill="none" stroke="currentColor" stroke-width="0.5"/>`;
|
|
116
|
+
// Four door leaves (cross pattern)
|
|
117
|
+
for (let i = 0; i < 4; i++) {
|
|
118
|
+
const angle = (i * Math.PI) / 2;
|
|
119
|
+
const x = Math.cos(angle) * radius;
|
|
120
|
+
const y = Math.sin(angle) * radius;
|
|
121
|
+
svg += `<line x1="0" y1="0" x2="${x}" y2="${y}" stroke="currentColor" stroke-width="0.5"/>`;
|
|
122
|
+
}
|
|
123
|
+
svg += '</g>';
|
|
124
|
+
return svg;
|
|
125
|
+
}
|
|
126
|
+
renderWindowFrame(symbol, transformAttr) {
|
|
127
|
+
const params = symbol.parameters;
|
|
128
|
+
const { width, frameDepth } = params;
|
|
129
|
+
const halfWidth = width / 2;
|
|
130
|
+
let svg = `<g ${transformAttr} class="window-frame">`;
|
|
131
|
+
// Frame lines
|
|
132
|
+
svg += `<line x1="${-halfWidth}" y1="${frameDepth}" x2="${halfWidth}" y2="${frameDepth}" stroke="currentColor" stroke-width="0.5"/>`;
|
|
133
|
+
svg += `<line x1="${-halfWidth}" y1="${-frameDepth}" x2="${halfWidth}" y2="${-frameDepth}" stroke="currentColor" stroke-width="0.5"/>`;
|
|
134
|
+
// Glass line (center)
|
|
135
|
+
svg += `<line x1="${-halfWidth}" y1="0" x2="${halfWidth}" y2="0" stroke="currentColor" stroke-width="0.25"/>`;
|
|
136
|
+
svg += '</g>';
|
|
137
|
+
return svg;
|
|
138
|
+
}
|
|
139
|
+
renderStairArrow(symbol, transformAttr) {
|
|
140
|
+
const params = symbol.parameters;
|
|
141
|
+
const { direction, length } = params;
|
|
142
|
+
const arrowHead = length * 0.15;
|
|
143
|
+
let svg = `<g ${transformAttr} class="stair-arrow">`;
|
|
144
|
+
// Arrow line
|
|
145
|
+
svg += `<line x1="0" y1="0" x2="${length}" y2="0" stroke="currentColor" stroke-width="0.5"/>`;
|
|
146
|
+
// Arrow head
|
|
147
|
+
if (direction === 'up') {
|
|
148
|
+
svg += `<path d="M ${length - arrowHead} ${-arrowHead * 0.5} L ${length} 0 L ${length - arrowHead} ${arrowHead * 0.5}" `;
|
|
149
|
+
svg += `fill="none" stroke="currentColor" stroke-width="0.5"/>`;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
svg += `<path d="M ${arrowHead} ${-arrowHead * 0.5} L 0 0 L ${arrowHead} ${arrowHead * 0.5}" `;
|
|
153
|
+
svg += `fill="none" stroke="currentColor" stroke-width="0.5"/>`;
|
|
154
|
+
}
|
|
155
|
+
// Direction text
|
|
156
|
+
const text = direction === 'up' ? 'UP' : 'DN';
|
|
157
|
+
svg += `<text x="${length / 2}" y="${arrowHead * 2}" text-anchor="middle" font-size="3" fill="currentColor">${text}</text>`;
|
|
158
|
+
svg += '</g>';
|
|
159
|
+
return svg;
|
|
160
|
+
}
|
|
161
|
+
renderNorthArrow(symbol, transformAttr) {
|
|
162
|
+
const scale = symbol.scale * 10; // Base size
|
|
163
|
+
let svg = `<g ${transformAttr} class="north-arrow">`;
|
|
164
|
+
// Arrow
|
|
165
|
+
svg += `<path d="M 0 ${-scale} L ${scale * 0.3} ${scale * 0.5} L 0 ${scale * 0.2} L ${-scale * 0.3} ${scale * 0.5} Z" `;
|
|
166
|
+
svg += `fill="currentColor" stroke="currentColor" stroke-width="0.5"/>`;
|
|
167
|
+
// N label
|
|
168
|
+
svg += `<text x="0" y="${scale * 0.9}" text-anchor="middle" font-size="4" fill="currentColor">N</text>`;
|
|
169
|
+
svg += '</g>';
|
|
170
|
+
return svg;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=symbol-renderer.js.map
|