@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,335 @@
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 title block to SVG
6
+ */
7
+ export function renderTitleBlock(config, frameInnerBounds, revisions = [], extras) {
8
+ // Calculate title block position and size
9
+ let x, y, w, h;
10
+ switch (config.position) {
11
+ case 'bottom-right':
12
+ w = config.widthMm;
13
+ h = config.heightMm;
14
+ x = frameInnerBounds.x + frameInnerBounds.width - w;
15
+ y = frameInnerBounds.y + frameInnerBounds.height - h;
16
+ break;
17
+ case 'bottom-full':
18
+ w = frameInnerBounds.width;
19
+ h = config.heightMm;
20
+ x = frameInnerBounds.x;
21
+ y = frameInnerBounds.y + frameInnerBounds.height - h;
22
+ break;
23
+ case 'right-strip':
24
+ w = config.widthMm;
25
+ h = frameInnerBounds.height;
26
+ x = frameInnerBounds.x + frameInnerBounds.width - w;
27
+ y = frameInnerBounds.y;
28
+ break;
29
+ default:
30
+ w = config.widthMm;
31
+ h = config.heightMm;
32
+ x = frameInnerBounds.x + frameInnerBounds.width - w;
33
+ y = frameInnerBounds.y + frameInnerBounds.height - h;
34
+ }
35
+ let svg = ' <g id="title-block">\n';
36
+ // Background (if specified)
37
+ if (config.backgroundColor) {
38
+ svg += ` <rect x="${x.toFixed(2)}" y="${y.toFixed(2)}" `;
39
+ svg += `width="${w.toFixed(2)}" height="${h.toFixed(2)}" `;
40
+ svg += `fill="${config.backgroundColor}"/>\n`;
41
+ }
42
+ // Outer border
43
+ svg += ` <rect x="${x.toFixed(2)}" y="${y.toFixed(2)}" `;
44
+ svg += `width="${w.toFixed(2)}" height="${h.toFixed(2)}" `;
45
+ svg += `fill="none" stroke="#000000" stroke-width="${config.borderWeight}"/>\n`;
46
+ // Render fields based on layout
47
+ svg += renderTitleBlockFields(config, x, y, w, h);
48
+ // Logo
49
+ if (config.logo?.source) {
50
+ svg += renderLogo(config.logo, x, y, w, h);
51
+ }
52
+ // Scale bar (in title block, bottom-left area)
53
+ if (extras?.scaleBar?.visible && extras?.scale && h > 10) {
54
+ svg += renderScaleBarInTitleBlock(extras.scaleBar, extras.scale, x, y, w, h, config.logo != null, extras.effectiveScaleFactor);
55
+ }
56
+ // North arrow (in title block, next to scale bar or logo area)
57
+ if (extras?.northArrow && extras.northArrow.style !== 'none' && h > 15) {
58
+ svg += renderNorthArrowInTitleBlock(extras.northArrow, x, y, w, h, config.logo != null, config.position);
59
+ }
60
+ // Revision history
61
+ if (config.showRevisionHistory && revisions.length > 0) {
62
+ svg += renderRevisionHistory(revisions.slice(0, config.maxRevisionEntries), x, y, w, h, config);
63
+ }
64
+ svg += ' </g>\n';
65
+ return {
66
+ svgElements: svg,
67
+ bounds: { x, y, width: w, height: h },
68
+ };
69
+ }
70
+ /**
71
+ * Render title block fields in a grid layout
72
+ * Uses a simpler row-based layout with fixed heights based on font size
73
+ */
74
+ function renderTitleBlockFields(config, x, y, w, h) {
75
+ let svg = ' <g id="title-block-fields">\n';
76
+ // Calculate grid dimensions
77
+ const numCols = 2;
78
+ const logoSpace = config.logo ? 50 : 0; // Reserve space for logo
79
+ const revisionSpace = config.showRevisionHistory ? 20 : 0;
80
+ const availableWidth = w - logoSpace - 5; // 5mm padding
81
+ const availableHeight = h - revisionSpace - 4; // padding
82
+ // Group fields by row and calculate row heights based on content
83
+ const fieldsByRow = new Map();
84
+ for (const field of config.fields) {
85
+ const row = field.row ?? 0;
86
+ if (!fieldsByRow.has(row)) {
87
+ fieldsByRow.set(row, []);
88
+ }
89
+ fieldsByRow.get(row).push(field);
90
+ }
91
+ // Calculate minimum height needed for each row based on its largest font
92
+ const rowCount = Math.max(...Array.from(fieldsByRow.keys())) + 1;
93
+ const rowHeights = [];
94
+ let totalMinHeight = 0;
95
+ for (let r = 0; r < rowCount; r++) {
96
+ const fields = fieldsByRow.get(r) || [];
97
+ // Row needs space for: label (small) + gap + value (fontSize) + padding
98
+ const maxFontSize = fields.length > 0 ? Math.max(...fields.map(f => f.fontSize)) : 3;
99
+ const labelSize = Math.min(maxFontSize * 0.5, 2.2);
100
+ // Minimum row height: label + small gap + value + padding
101
+ const minRowHeight = labelSize + 1 + maxFontSize + 2;
102
+ rowHeights.push(minRowHeight);
103
+ totalMinHeight += minRowHeight;
104
+ }
105
+ // Scale row heights if they exceed available space
106
+ const scaleFactor = totalMinHeight > availableHeight ? availableHeight / totalMinHeight : 1;
107
+ const scaledRowHeights = rowHeights.map(h => h * scaleFactor);
108
+ // Grid start position
109
+ const gridStartX = x + logoSpace + 2;
110
+ const gridStartY = y + 2;
111
+ const colWidth = availableWidth / numCols;
112
+ // Calculate row Y positions
113
+ const rowYPositions = [gridStartY];
114
+ for (let i = 0; i < scaledRowHeights.length - 1; i++) {
115
+ rowYPositions.push(rowYPositions[i] + scaledRowHeights[i]);
116
+ }
117
+ // Draw horizontal grid lines between rows
118
+ for (let i = 1; i < rowCount; i++) {
119
+ const lineY = rowYPositions[i];
120
+ svg += ` <line x1="${gridStartX.toFixed(2)}" y1="${lineY.toFixed(2)}" `;
121
+ svg += `x2="${(gridStartX + availableWidth - 4).toFixed(2)}" y2="${lineY.toFixed(2)}" `;
122
+ svg += `stroke="#000000" stroke-width="${config.gridWeight}"/>\n`;
123
+ }
124
+ // Vertical dividers for rows with multiple columns
125
+ for (const [row, fields] of fieldsByRow) {
126
+ const hasMultipleCols = fields.some(f => (f.colSpan ?? 1) < 2);
127
+ if (hasMultipleCols) {
128
+ const centerX = gridStartX + colWidth;
129
+ const lineY1 = rowYPositions[row];
130
+ const lineY2 = rowYPositions[row] + scaledRowHeights[row];
131
+ svg += ` <line x1="${centerX.toFixed(2)}" y1="${lineY1.toFixed(2)}" `;
132
+ svg += `x2="${centerX.toFixed(2)}" y2="${lineY2.toFixed(2)}" `;
133
+ svg += `stroke="#000000" stroke-width="${config.gridWeight}"/>\n`;
134
+ }
135
+ }
136
+ // Render each field
137
+ for (const [row, fields] of fieldsByRow) {
138
+ const rowY = rowYPositions[row];
139
+ const rowH = scaledRowHeights[row];
140
+ for (const field of fields) {
141
+ const col = field.col ?? 0;
142
+ const colSpan = field.colSpan ?? 1;
143
+ const fieldX = gridStartX + col * colWidth + 1.5;
144
+ // Scale font sizes if row is compressed
145
+ const effectiveScale = scaleFactor < 1 ? scaleFactor : 1;
146
+ const labelFontSize = Math.min(field.fontSize * 0.45, 2.2) * Math.max(effectiveScale, 0.7);
147
+ const valueFontSize = field.fontSize * Math.max(effectiveScale, 0.7);
148
+ // Position label at top of cell
149
+ const labelY = rowY + 0.5 + labelFontSize;
150
+ svg += ` <text x="${fieldX.toFixed(2)}" y="${labelY.toFixed(2)}" `;
151
+ svg += `font-family="Arial, sans-serif" font-size="${labelFontSize.toFixed(2)}" `;
152
+ svg += `fill="#666666">${escapeXml(field.label)}</text>\n`;
153
+ // Position value below label (with small gap)
154
+ const valueY = labelY + 0.8 + valueFontSize * 0.8;
155
+ svg += ` <text x="${fieldX.toFixed(2)}" y="${valueY.toFixed(2)}" `;
156
+ svg += `font-family="Arial, sans-serif" font-size="${valueFontSize.toFixed(2)}" `;
157
+ svg += `font-weight="${field.fontWeight}" fill="#000000">${escapeXml(field.value)}</text>\n`;
158
+ }
159
+ }
160
+ svg += ' </g>\n';
161
+ return svg;
162
+ }
163
+ /**
164
+ * Render company logo
165
+ */
166
+ function renderLogo(logo, x, y, w, h) {
167
+ let svg = ' <g id="title-block-logo">\n';
168
+ let logoX, logoY;
169
+ switch (logo.position) {
170
+ case 'top-left':
171
+ logoX = x + 3;
172
+ logoY = y + 3;
173
+ break;
174
+ case 'top-right':
175
+ logoX = x + w - logo.widthMm - 3;
176
+ logoY = y + 3;
177
+ break;
178
+ case 'bottom-left':
179
+ default:
180
+ logoX = x + 3;
181
+ logoY = y + h - logo.heightMm - 3;
182
+ break;
183
+ }
184
+ // Render logo as image
185
+ svg += ` <image x="${logoX.toFixed(2)}" y="${logoY.toFixed(2)}" `;
186
+ svg += `width="${logo.widthMm.toFixed(2)}" height="${logo.heightMm.toFixed(2)}" `;
187
+ svg += `href="${escapeXml(logo.source)}" preserveAspectRatio="xMidYMid meet"/>\n`;
188
+ svg += ' </g>\n';
189
+ return svg;
190
+ }
191
+ /**
192
+ * Render revision history table
193
+ */
194
+ function renderRevisionHistory(revisions, x, y, w, h, config) {
195
+ let svg = ' <g id="revision-history">\n';
196
+ const tableHeight = 18;
197
+ const tableY = y - tableHeight - 2;
198
+ const rowHeight = 4;
199
+ const fontSize = 2.2;
200
+ // Table header
201
+ svg += ` <rect x="${x.toFixed(2)}" y="${tableY.toFixed(2)}" `;
202
+ svg += `width="${w.toFixed(2)}" height="${tableHeight.toFixed(2)}" `;
203
+ svg += `fill="none" stroke="#000000" stroke-width="${config.gridWeight}"/>\n`;
204
+ // Column headers
205
+ const cols = [
206
+ { label: 'REV', width: w * 0.1 },
207
+ { label: 'DESCRIPTION', width: w * 0.5 },
208
+ { label: 'DATE', width: w * 0.2 },
209
+ { label: 'BY', width: w * 0.2 },
210
+ ];
211
+ let colX = x;
212
+ for (const col of cols) {
213
+ // Header text
214
+ svg += ` <text x="${(colX + 1).toFixed(2)}" y="${(tableY + 3).toFixed(2)}" `;
215
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize}" `;
216
+ svg += `font-weight="bold" fill="#000000">${col.label}</text>\n`;
217
+ // Vertical divider
218
+ if (colX > x) {
219
+ svg += ` <line x1="${colX.toFixed(2)}" y1="${tableY.toFixed(2)}" `;
220
+ svg += `x2="${colX.toFixed(2)}" y2="${(tableY + tableHeight).toFixed(2)}" `;
221
+ svg += `stroke="#000000" stroke-width="${config.gridWeight}"/>\n`;
222
+ }
223
+ colX += col.width;
224
+ }
225
+ // Header divider line
226
+ svg += ` <line x1="${x.toFixed(2)}" y1="${(tableY + rowHeight).toFixed(2)}" `;
227
+ svg += `x2="${(x + w).toFixed(2)}" y2="${(tableY + rowHeight).toFixed(2)}" `;
228
+ svg += `stroke="#000000" stroke-width="${config.gridWeight}"/>\n`;
229
+ // Revision entries
230
+ for (let i = 0; i < revisions.length && i < config.maxRevisionEntries; i++) {
231
+ const rev = revisions[i];
232
+ const rowY = tableY + rowHeight * (i + 1.5);
233
+ colX = x;
234
+ const values = [rev.revision, rev.description, rev.date, rev.author];
235
+ for (let j = 0; j < cols.length; j++) {
236
+ const maxChars = Math.floor(cols[j].width / 2);
237
+ const displayValue = values[j].length > maxChars
238
+ ? values[j].substring(0, maxChars - 2) + '..'
239
+ : values[j];
240
+ svg += ` <text x="${(colX + 1).toFixed(2)}" y="${rowY.toFixed(2)}" `;
241
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize}" `;
242
+ svg += `fill="#000000">${escapeXml(displayValue)}</text>\n`;
243
+ colX += cols[j].width;
244
+ }
245
+ // Row divider
246
+ if (i < revisions.length - 1) {
247
+ svg += ` <line x1="${x.toFixed(2)}" y1="${(tableY + rowHeight * (i + 2)).toFixed(2)}" `;
248
+ svg += `x2="${(x + w).toFixed(2)}" y2="${(tableY + rowHeight * (i + 2)).toFixed(2)}" `;
249
+ svg += `stroke="#000000" stroke-width="${config.gridWeight * 0.5}"/>\n`;
250
+ }
251
+ }
252
+ svg += ' </g>\n';
253
+ return svg;
254
+ }
255
+ /**
256
+ * Render scale bar at BOTTOM LEFT of title block
257
+ */
258
+ function renderScaleBarInTitleBlock(scaleBar, scale, x, y, w, h, _hasLogo, effectiveScaleFactor) {
259
+ let svg = ' <g id="title-block-scale-bar">\n';
260
+ // Use effective scale factor if provided (for dynamic scaling), otherwise use configured scale
261
+ const scaleFactor = effectiveScaleFactor ?? scale.factor;
262
+ // Position: bottom left with small margin
263
+ const barX = x + 3;
264
+ const barY = y + h - 8; // 8mm from bottom (leaves room for label)
265
+ const maxBarWidth = Math.min(w * 0.3, 50);
266
+ const barLengthMm = (scaleBar.totalLengthM * 1000) / scaleFactor;
267
+ const actualBarLength = Math.min(barLengthMm, maxBarWidth);
268
+ const barHeight = Math.min(scaleBar.heightMm, 3);
269
+ const actualTotalLength = (actualBarLength * scaleFactor) / 1000;
270
+ // Draw alternating bar segments
271
+ const divisions = scaleBar.primaryDivisions;
272
+ const divWidth = actualBarLength / divisions;
273
+ for (let i = 0; i < divisions; i++) {
274
+ const segX = barX + i * divWidth;
275
+ const fill = i % 2 === 0 ? scaleBar.fillColor : '#ffffff';
276
+ svg += ` <rect x="${segX.toFixed(2)}" y="${barY.toFixed(2)}" `;
277
+ svg += `width="${divWidth.toFixed(2)}" height="${barHeight.toFixed(2)}" `;
278
+ svg += `fill="${fill}" stroke="${scaleBar.strokeColor}" stroke-width="${scaleBar.lineWeight}"/>\n`;
279
+ }
280
+ // Draw distance labels - only at 0 and end
281
+ const fontSize = 1.8;
282
+ const labelY = barY + barHeight + fontSize + 0.3;
283
+ svg += ` <text x="${barX.toFixed(2)}" y="${labelY.toFixed(2)}" `;
284
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize}" `;
285
+ svg += `text-anchor="start" fill="#000000">0</text>\n`;
286
+ const endLabel = actualTotalLength < 1
287
+ ? `${(actualTotalLength * 100).toFixed(0)}cm`
288
+ : `${actualTotalLength.toFixed(0)}m`;
289
+ svg += ` <text x="${(barX + actualBarLength).toFixed(2)}" y="${labelY.toFixed(2)}" `;
290
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize}" `;
291
+ svg += `text-anchor="end" fill="#000000">${endLabel}</text>\n`;
292
+ svg += ' </g>\n';
293
+ return svg;
294
+ }
295
+ /**
296
+ * Render north arrow at BOTTOM RIGHT of title block
297
+ */
298
+ function renderNorthArrowInTitleBlock(northArrow, x, y, w, h, _hasLogo, _position) {
299
+ let svg = ' <g id="title-block-north-arrow">\n';
300
+ // Position: bottom right with margin
301
+ const size = Math.min(northArrow.sizeMm, 8, h * 0.6);
302
+ const arrowX = x + w - size - 5; // Right side with margin
303
+ const arrowY = y + h - size / 2 - 3; // Bottom with margin
304
+ // Apply rotation transform
305
+ const rotation = northArrow.rotation;
306
+ svg += ` <g transform="translate(${arrowX.toFixed(2)}, ${arrowY.toFixed(2)}) rotate(${rotation})">\n`;
307
+ // Draw simple north arrow
308
+ const halfSize = size / 2;
309
+ // Arrow body (filled triangle pointing up)
310
+ svg += ` <polygon points="0,${(-halfSize).toFixed(2)} ${(-halfSize / 3).toFixed(2)},${(halfSize / 2).toFixed(2)} ${(halfSize / 3).toFixed(2)},${(halfSize / 2).toFixed(2)}" `;
311
+ svg += `fill="#000000" stroke="none"/>\n`;
312
+ // Arrow outline (lower part, unfilled)
313
+ svg += ` <polygon points="0,${(halfSize / 3).toFixed(2)} ${(-halfSize / 3).toFixed(2)},${(halfSize / 2).toFixed(2)} ${(halfSize / 3).toFixed(2)},${(halfSize / 2).toFixed(2)}" `;
314
+ svg += `fill="#ffffff" stroke="#000000" stroke-width="0.25"/>\n`;
315
+ // "N" label
316
+ const fontSize = size * 0.4;
317
+ svg += ` <text x="0" y="${(-halfSize - 1).toFixed(2)}" `;
318
+ svg += `font-family="Arial, sans-serif" font-size="${fontSize.toFixed(2)}" font-weight="bold" `;
319
+ svg += `text-anchor="middle" fill="#000000">N</text>\n`;
320
+ svg += ' </g>\n';
321
+ svg += ' </g>\n';
322
+ return svg;
323
+ }
324
+ /**
325
+ * Escape special XML characters
326
+ */
327
+ function escapeXml(str) {
328
+ return str
329
+ .replace(/&/g, '&amp;')
330
+ .replace(/</g, '&lt;')
331
+ .replace(/>/g, '&gt;')
332
+ .replace(/"/g, '&quot;')
333
+ .replace(/'/g, '&apos;');
334
+ }
335
+ //# sourceMappingURL=title-block-renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title-block-renderer.js","sourceRoot":"","sources":["../../src/sheet/title-block-renderer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Title Block Types
3
+ *
4
+ * Professional title block configurations with:
5
+ * - Editable fields (project, drawing, revision, etc.)
6
+ * - Auto-population from IFC metadata
7
+ * - Company logo support
8
+ * - Revision history
9
+ */
10
+ /** Title block position relative to frame */
11
+ export type TitleBlockPosition = 'bottom-right' | 'bottom-full' | 'right-strip';
12
+ /** Title block layout preset */
13
+ export type TitleBlockLayout = 'compact' | 'standard' | 'extended' | 'custom';
14
+ /** Editable field in title block */
15
+ export interface TitleBlockField {
16
+ /** Unique field identifier */
17
+ id: string;
18
+ /** Field label displayed in title block */
19
+ label: string;
20
+ /** Current value */
21
+ value: string;
22
+ /** Whether this field is editable by user */
23
+ editable: boolean;
24
+ /** Whether this field is auto-populated from model metadata */
25
+ autoPopulate: boolean;
26
+ /** Source path for auto-population (e.g., 'project.name', 'model.author') */
27
+ autoPopulateSource?: string;
28
+ /** Font size in mm */
29
+ fontSize: number;
30
+ /** Font weight */
31
+ fontWeight: 'normal' | 'bold';
32
+ /** Maximum width in mm (for wrapping) */
33
+ maxWidth?: number;
34
+ /** Row position in grid (0-based) */
35
+ row?: number;
36
+ /** Column position in grid (0-based) */
37
+ col?: number;
38
+ /** Row span in grid layout */
39
+ rowSpan?: number;
40
+ /** Column span in grid layout */
41
+ colSpan?: number;
42
+ }
43
+ /** Company/firm logo configuration */
44
+ export interface TitleBlockLogo {
45
+ /** Logo source (data URL or URL) */
46
+ source: string;
47
+ /** Width in mm */
48
+ widthMm: number;
49
+ /** Height in mm */
50
+ heightMm: number;
51
+ /** Position within title block */
52
+ position: 'top-left' | 'top-right' | 'bottom-left';
53
+ }
54
+ /** Revision history entry */
55
+ export interface RevisionEntry {
56
+ /** Revision number/letter */
57
+ revision: string;
58
+ /** Description of changes */
59
+ description: string;
60
+ /** Date of revision */
61
+ date: string;
62
+ /** Author/approver */
63
+ author: string;
64
+ }
65
+ /** Complete title block configuration */
66
+ export interface TitleBlockConfig {
67
+ /** Layout preset */
68
+ layout: TitleBlockLayout;
69
+ /** Position relative to frame */
70
+ position: TitleBlockPosition;
71
+ /** Width in mm (for bottom-right) or ignored for full width */
72
+ widthMm: number;
73
+ /** Height in mm */
74
+ heightMm: number;
75
+ /** Border line weight */
76
+ borderWeight: number;
77
+ /** Internal grid line weight */
78
+ gridWeight: number;
79
+ /** Background color (optional) */
80
+ backgroundColor?: string;
81
+ /** All fields in the title block */
82
+ fields: TitleBlockField[];
83
+ /** Logo configuration */
84
+ logo: TitleBlockLogo | null;
85
+ /** Show revision history table */
86
+ showRevisionHistory: boolean;
87
+ /** Maximum revision entries to display */
88
+ maxRevisionEntries: number;
89
+ }
90
+ /** Default title block fields for architectural drawings */
91
+ export declare const DEFAULT_TITLE_BLOCK_FIELDS: TitleBlockField[];
92
+ /** Title block layout presets */
93
+ export declare const TITLE_BLOCK_PRESETS: Record<TitleBlockLayout, Omit<TitleBlockConfig, 'fields' | 'logo'>>;
94
+ /** Create a title block with a specific layout */
95
+ export declare function createTitleBlock(layout: TitleBlockLayout): TitleBlockConfig;
96
+ /** Get default title block (standard layout) */
97
+ export declare function getDefaultTitleBlock(): TitleBlockConfig;
98
+ /** Update a specific field in a title block */
99
+ export declare function updateTitleBlockField(config: TitleBlockConfig, fieldId: string, value: string): TitleBlockConfig;
100
+ //# sourceMappingURL=title-block-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title-block-types.d.ts","sourceRoot":"","sources":["../../src/sheet/title-block-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
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 title block fields for architectural drawings */
5
+ export const DEFAULT_TITLE_BLOCK_FIELDS = [
6
+ {
7
+ id: 'project-name',
8
+ label: 'Project',
9
+ value: '',
10
+ editable: true,
11
+ autoPopulate: true,
12
+ autoPopulateSource: 'project.name',
13
+ fontSize: 4.5,
14
+ fontWeight: 'bold',
15
+ row: 0,
16
+ col: 0,
17
+ colSpan: 2,
18
+ },
19
+ {
20
+ id: 'drawing-title',
21
+ label: 'Drawing Title',
22
+ value: 'Section',
23
+ editable: true,
24
+ autoPopulate: false,
25
+ fontSize: 5,
26
+ fontWeight: 'bold',
27
+ row: 1,
28
+ col: 0,
29
+ colSpan: 2,
30
+ },
31
+ {
32
+ id: 'drawing-number',
33
+ label: 'Drawing No.',
34
+ value: 'A-001',
35
+ editable: true,
36
+ autoPopulate: false,
37
+ fontSize: 4,
38
+ fontWeight: 'bold',
39
+ row: 2,
40
+ col: 0,
41
+ },
42
+ {
43
+ id: 'revision',
44
+ label: 'Rev',
45
+ value: '-',
46
+ editable: true,
47
+ autoPopulate: false,
48
+ fontSize: 3.5,
49
+ fontWeight: 'bold',
50
+ row: 2,
51
+ col: 1,
52
+ },
53
+ {
54
+ id: 'scale',
55
+ label: 'Scale',
56
+ value: '1:100',
57
+ editable: false,
58
+ autoPopulate: true,
59
+ autoPopulateSource: 'drawing.scale',
60
+ fontSize: 3.5,
61
+ fontWeight: 'normal',
62
+ row: 3,
63
+ col: 0,
64
+ },
65
+ {
66
+ id: 'date',
67
+ label: 'Date',
68
+ value: '',
69
+ editable: true,
70
+ autoPopulate: true,
71
+ autoPopulateSource: 'date.today',
72
+ fontSize: 3,
73
+ fontWeight: 'normal',
74
+ row: 3,
75
+ col: 1,
76
+ },
77
+ {
78
+ id: 'drawn-by',
79
+ label: 'Drawn',
80
+ value: '',
81
+ editable: true,
82
+ autoPopulate: false,
83
+ fontSize: 3,
84
+ fontWeight: 'normal',
85
+ row: 4,
86
+ col: 0,
87
+ },
88
+ {
89
+ id: 'checked-by',
90
+ label: 'Checked',
91
+ value: '',
92
+ editable: true,
93
+ autoPopulate: false,
94
+ fontSize: 3,
95
+ fontWeight: 'normal',
96
+ row: 4,
97
+ col: 1,
98
+ },
99
+ {
100
+ id: 'sheet-number',
101
+ label: 'Sheet',
102
+ value: '1 of 1',
103
+ editable: true,
104
+ autoPopulate: false,
105
+ fontSize: 3,
106
+ fontWeight: 'normal',
107
+ row: 5,
108
+ col: 0,
109
+ colSpan: 2,
110
+ },
111
+ ];
112
+ /** Title block layout presets */
113
+ export const TITLE_BLOCK_PRESETS = {
114
+ compact: {
115
+ layout: 'compact',
116
+ position: 'bottom-right',
117
+ widthMm: 120,
118
+ heightMm: 35,
119
+ borderWeight: 0.5,
120
+ gridWeight: 0.25,
121
+ showRevisionHistory: false,
122
+ maxRevisionEntries: 0,
123
+ },
124
+ standard: {
125
+ layout: 'standard',
126
+ position: 'bottom-right',
127
+ widthMm: 180,
128
+ heightMm: 55,
129
+ borderWeight: 0.5,
130
+ gridWeight: 0.25,
131
+ showRevisionHistory: true,
132
+ maxRevisionEntries: 3,
133
+ },
134
+ extended: {
135
+ layout: 'extended',
136
+ position: 'bottom-full',
137
+ widthMm: 0, // Full width
138
+ heightMm: 70,
139
+ borderWeight: 0.5,
140
+ gridWeight: 0.25,
141
+ showRevisionHistory: true,
142
+ maxRevisionEntries: 5,
143
+ },
144
+ custom: {
145
+ layout: 'custom',
146
+ position: 'bottom-right',
147
+ widthMm: 180,
148
+ heightMm: 55,
149
+ borderWeight: 0.5,
150
+ gridWeight: 0.25,
151
+ showRevisionHistory: false,
152
+ maxRevisionEntries: 0,
153
+ },
154
+ };
155
+ /** Create a title block with a specific layout */
156
+ export function createTitleBlock(layout) {
157
+ return {
158
+ ...TITLE_BLOCK_PRESETS[layout],
159
+ fields: DEFAULT_TITLE_BLOCK_FIELDS.map((f) => ({ ...f })),
160
+ logo: null,
161
+ };
162
+ }
163
+ /** Get default title block (standard layout) */
164
+ export function getDefaultTitleBlock() {
165
+ return createTitleBlock('standard');
166
+ }
167
+ /** Update a specific field in a title block */
168
+ export function updateTitleBlockField(config, fieldId, value) {
169
+ return {
170
+ ...config,
171
+ fields: config.fields.map((f) => (f.id === fieldId ? { ...f, value } : f)),
172
+ };
173
+ }
174
+ //# sourceMappingURL=title-block-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"title-block-types.js","sourceRoot":"","sources":["../../src/sheet/title-block-types.ts"],"names":[],"mappings":"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"}