@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,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