@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,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, '&')
|
|
330
|
+
.replace(/</g, '<')
|
|
331
|
+
.replace(/>/g, '>')
|
|
332
|
+
.replace(/"/g, '"')
|
|
333
|
+
.replace(/'/g, ''');
|
|
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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"}
|