@ifc-lite/parser 1.1.7 → 1.2.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/README.md +1 -1
- package/dist/classification-extractor.js +3 -3
- package/dist/classification-extractor.js.map +1 -1
- package/dist/columnar-parser.d.ts +86 -2
- package/dist/columnar-parser.d.ts.map +1 -1
- package/dist/columnar-parser.js +440 -173
- package/dist/columnar-parser.js.map +1 -1
- package/dist/entity-extractor.d.ts.map +1 -1
- package/dist/entity-extractor.js +23 -11
- package/dist/entity-extractor.js.map +1 -1
- package/dist/generated/entities.d.ts +3 -2
- package/dist/generated/entities.d.ts.map +1 -1
- package/dist/generated/entities.js +6 -3
- package/dist/generated/entities.js.map +1 -1
- package/dist/generated/enums.d.ts.map +1 -1
- package/dist/generated/enums.js +0 -3
- package/dist/generated/enums.js.map +1 -1
- package/dist/generated/index.d.ts +4 -2
- package/dist/generated/index.d.ts.map +1 -1
- package/dist/generated/index.js +4 -2
- package/dist/generated/index.js.map +1 -1
- package/dist/generated/schema-registry.d.ts.map +1 -1
- package/dist/generated/schema-registry.js +8 -3
- package/dist/generated/schema-registry.js.map +1 -1
- package/dist/generated/selects.d.ts +3 -0
- package/dist/generated/selects.d.ts.map +1 -1
- package/dist/generated/selects.js +6 -3
- package/dist/generated/selects.js.map +1 -1
- package/dist/generated/serializers.d.ts +71 -0
- package/dist/generated/serializers.d.ts.map +1 -0
- package/dist/generated/serializers.js +236 -0
- package/dist/generated/serializers.js.map +1 -0
- package/dist/generated/test-compile.d.ts +1 -6
- package/dist/generated/test-compile.d.ts.map +1 -1
- package/dist/generated/test-compile.js +30 -25
- package/dist/generated/test-compile.js.map +1 -1
- package/dist/generated/type-ids.d.ts +815 -0
- package/dist/generated/type-ids.d.ts.map +1 -0
- package/dist/generated/type-ids.js +1669 -0
- package/dist/generated/type-ids.js.map +1 -0
- package/dist/generated/types.d.ts +9 -542
- package/dist/generated/types.d.ts.map +1 -1
- package/dist/generated/types.js +6 -497
- package/dist/generated/types.js.map +1 -1
- package/dist/georef-extractor.js +2 -2
- package/dist/georef-extractor.js.map +1 -1
- package/dist/index.d.ts +38 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +233 -41
- package/dist/index.js.map +1 -1
- package/dist/material-extractor.js +8 -8
- package/dist/material-extractor.js.map +1 -1
- package/dist/parser.worker.d.ts +2 -0
- package/dist/parser.worker.d.ts.map +1 -0
- package/dist/parser.worker.js +43 -0
- package/dist/parser.worker.js.map +1 -0
- package/dist/property-extractor.d.ts +5 -1
- package/dist/property-extractor.d.ts.map +1 -1
- package/dist/property-extractor.js +22 -1
- package/dist/property-extractor.js.map +1 -1
- package/dist/quantity-extractor.d.ts +5 -1
- package/dist/quantity-extractor.d.ts.map +1 -1
- package/dist/quantity-extractor.js +29 -1
- package/dist/quantity-extractor.js.map +1 -1
- package/dist/relationship-extractor.d.ts +5 -1
- package/dist/relationship-extractor.d.ts.map +1 -1
- package/dist/relationship-extractor.js +27 -2
- package/dist/relationship-extractor.js.map +1 -1
- package/dist/spatial-hierarchy-builder.d.ts +4 -3
- package/dist/spatial-hierarchy-builder.d.ts.map +1 -1
- package/dist/spatial-hierarchy-builder.js +46 -34
- package/dist/spatial-hierarchy-builder.js.map +1 -1
- package/dist/style-extractor.d.ts +1 -0
- package/dist/style-extractor.d.ts.map +1 -1
- package/dist/style-extractor.js +18 -0
- package/dist/style-extractor.js.map +1 -1
- package/dist/tokenizer.d.ts +11 -0
- package/dist/tokenizer.d.ts.map +1 -1
- package/dist/tokenizer.js +150 -10
- package/dist/tokenizer.js.map +1 -1
- package/dist/unit-extractor.d.ts +22 -0
- package/dist/unit-extractor.d.ts.map +1 -0
- package/dist/unit-extractor.js +205 -0
- package/dist/unit-extractor.js.map +1 -0
- package/dist/worker-parser.d.ts +28 -0
- package/dist/worker-parser.d.ts.map +1 -0
- package/dist/worker-parser.js +81 -0
- package/dist/worker-parser.js.map +1 -0
- package/package.json +9 -8
- package/dist/examples/comprehensive-extraction.d.ts +0 -76
- package/dist/examples/comprehensive-extraction.d.ts.map +0 -1
- package/dist/examples/comprehensive-extraction.js +0 -228
- package/dist/examples/comprehensive-extraction.js.map +0 -1
package/dist/tokenizer.js
CHANGED
|
@@ -75,6 +75,145 @@ export class StepTokenizer {
|
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* FAST scan - skips to semicolon instead of matching parentheses
|
|
80
|
+
* ~5-10x faster for large files, yields length=0 (calculate on-demand)
|
|
81
|
+
*/
|
|
82
|
+
*scanEntitiesFast() {
|
|
83
|
+
this.position = 0;
|
|
84
|
+
this.lineNumber = 1;
|
|
85
|
+
// Pre-compute common byte codes
|
|
86
|
+
const HASH = 0x23; // '#'
|
|
87
|
+
const EQUALS = 0x3D; // '='
|
|
88
|
+
const LPAREN = 0x28; // '('
|
|
89
|
+
const SEMICOLON = 0x3B; // ';'
|
|
90
|
+
const QUOTE = 0x27; // '\''
|
|
91
|
+
const NEWLINE = 0x0A; // '\n'
|
|
92
|
+
const buf = this.buffer;
|
|
93
|
+
const len = buf.length;
|
|
94
|
+
let pos = 0;
|
|
95
|
+
let line = 1;
|
|
96
|
+
while (pos < len) {
|
|
97
|
+
const char = buf[pos];
|
|
98
|
+
if (char === HASH) {
|
|
99
|
+
const startOffset = pos;
|
|
100
|
+
const startLine = line;
|
|
101
|
+
pos++; // Skip '#'
|
|
102
|
+
// Read express ID (inline for speed)
|
|
103
|
+
let expressId = 0;
|
|
104
|
+
let hasDigits = false;
|
|
105
|
+
while (pos < len) {
|
|
106
|
+
const c = buf[pos];
|
|
107
|
+
if (c >= 0x30 && c <= 0x39) { // '0'-'9'
|
|
108
|
+
expressId = expressId * 10 + (c - 0x30);
|
|
109
|
+
hasDigits = true;
|
|
110
|
+
pos++;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (!hasDigits)
|
|
117
|
+
continue;
|
|
118
|
+
// Skip whitespace (inline)
|
|
119
|
+
while (pos < len) {
|
|
120
|
+
const c = buf[pos];
|
|
121
|
+
if (c === 0x20 || c === 0x09 || c === 0x0D) {
|
|
122
|
+
pos++;
|
|
123
|
+
}
|
|
124
|
+
else if (c === NEWLINE) {
|
|
125
|
+
line++;
|
|
126
|
+
pos++;
|
|
127
|
+
}
|
|
128
|
+
else
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
// Check for '='
|
|
132
|
+
if (pos >= len || buf[pos] !== EQUALS)
|
|
133
|
+
continue;
|
|
134
|
+
pos++;
|
|
135
|
+
// Skip whitespace
|
|
136
|
+
while (pos < len) {
|
|
137
|
+
const c = buf[pos];
|
|
138
|
+
if (c === 0x20 || c === 0x09 || c === 0x0D) {
|
|
139
|
+
pos++;
|
|
140
|
+
}
|
|
141
|
+
else if (c === NEWLINE) {
|
|
142
|
+
line++;
|
|
143
|
+
pos++;
|
|
144
|
+
}
|
|
145
|
+
else
|
|
146
|
+
break;
|
|
147
|
+
}
|
|
148
|
+
// Read type name (inline)
|
|
149
|
+
const typeStart = pos;
|
|
150
|
+
if (pos >= len || buf[pos] < 0x41 || buf[pos] > 0x5A)
|
|
151
|
+
continue; // Must start A-Z
|
|
152
|
+
while (pos < len) {
|
|
153
|
+
const c = buf[pos];
|
|
154
|
+
if ((c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A) ||
|
|
155
|
+
(c >= 0x30 && c <= 0x39) || c === 0x5F) {
|
|
156
|
+
pos++;
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (pos === typeStart)
|
|
163
|
+
continue;
|
|
164
|
+
// Decode type name
|
|
165
|
+
const type = String.fromCharCode(...buf.subarray(typeStart, pos));
|
|
166
|
+
// Skip whitespace
|
|
167
|
+
while (pos < len) {
|
|
168
|
+
const c = buf[pos];
|
|
169
|
+
if (c === 0x20 || c === 0x09 || c === 0x0D) {
|
|
170
|
+
pos++;
|
|
171
|
+
}
|
|
172
|
+
else if (c === NEWLINE) {
|
|
173
|
+
line++;
|
|
174
|
+
pos++;
|
|
175
|
+
}
|
|
176
|
+
else
|
|
177
|
+
break;
|
|
178
|
+
}
|
|
179
|
+
// Check for '('
|
|
180
|
+
if (pos >= len || buf[pos] !== LPAREN)
|
|
181
|
+
continue;
|
|
182
|
+
// FAST: Skip to semicolon (handling strings)
|
|
183
|
+
let inString = false;
|
|
184
|
+
while (pos < len) {
|
|
185
|
+
const c = buf[pos];
|
|
186
|
+
if (c === QUOTE) {
|
|
187
|
+
if (inString && pos + 1 < len && buf[pos + 1] === QUOTE) {
|
|
188
|
+
pos += 2; // Skip escaped quote
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
inString = !inString;
|
|
192
|
+
}
|
|
193
|
+
else if (c === SEMICOLON && !inString) {
|
|
194
|
+
// Found end of entity
|
|
195
|
+
const entityLength = pos - startOffset + 1; // Include semicolon
|
|
196
|
+
yield { expressId, type, offset: startOffset, length: entityLength, line: startLine };
|
|
197
|
+
pos++;
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
else if (c === NEWLINE) {
|
|
201
|
+
line++;
|
|
202
|
+
}
|
|
203
|
+
pos++;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else if (char === NEWLINE) {
|
|
207
|
+
line++;
|
|
208
|
+
pos++;
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
pos++;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
this.position = pos;
|
|
215
|
+
this.lineNumber = line;
|
|
216
|
+
}
|
|
78
217
|
readExpressId() {
|
|
79
218
|
let id = 0;
|
|
80
219
|
let digits = 0;
|
|
@@ -139,23 +278,24 @@ export class StepTokenizer {
|
|
|
139
278
|
let pos = this.position;
|
|
140
279
|
let depth = 0;
|
|
141
280
|
let inString = false;
|
|
142
|
-
let escapeNext = false;
|
|
143
281
|
while (pos < this.buffer.length) {
|
|
144
282
|
const char = this.buffer[pos];
|
|
145
|
-
if (escapeNext) {
|
|
146
|
-
escapeNext = false;
|
|
147
|
-
pos++;
|
|
148
|
-
continue;
|
|
149
|
-
}
|
|
150
283
|
if (char === 0x27) { // Single quote (string delimiter)
|
|
151
|
-
inString
|
|
284
|
+
if (inString) {
|
|
285
|
+
// Check for escaped quote ('') - STEP uses doubled quotes
|
|
286
|
+
if (pos + 1 < this.buffer.length && this.buffer[pos + 1] === 0x27) {
|
|
287
|
+
pos += 2; // Skip escaped quote
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
inString = false;
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
inString = true;
|
|
294
|
+
}
|
|
152
295
|
pos++;
|
|
153
296
|
continue;
|
|
154
297
|
}
|
|
155
298
|
if (inString) {
|
|
156
|
-
if (char === 0x5C) { // Backslash (escape)
|
|
157
|
-
escapeNext = true;
|
|
158
|
-
}
|
|
159
299
|
pos++;
|
|
160
300
|
continue;
|
|
161
301
|
}
|
package/dist/tokenizer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../src/tokenizer.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAa;IACnB,QAAQ,GAAW,CAAC,CAAC;IACrB,UAAU,GAAW,CAAC,CAAC;IAE/B,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,CAAC,YAAY;QACX,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC1C,4CAA4C;YAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;gBAC/C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAClC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;gBAElC,kBAAkB;gBAClB,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvC,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;oBACvB,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBAED,kBAAkB;gBAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,6BAA6B;gBAC7B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW;gBAE5B,kBAAkB;gBAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,iBAAiB;gBACjB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;gBACjC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBAED,kBAAkB;gBAClB,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,sCAAsC;gBACtC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC/E,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAChB,SAAS;gBACX,CAAC;gBAED,8DAA8D;gBAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBACxD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM;wBACJ,SAAS;wBACT,IAAI;wBACJ,MAAM,EAAE,WAAW;wBACnB,MAAM,EAAE,YAAY;wBACpB,IAAI,EAAE,SAAS;qBAChB,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC/C,UAAU;gBACV,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,CAAC,gBAAgB;QACf,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAEpB,gCAAgC;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAM,MAAM;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAI,MAAM;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,CAAI,MAAM;QAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,MAAM;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAK,OAAO;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAG,OAAO;QAE/B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QACxB,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;QACvB,IAAI,GAAG,GAAG,CAAC,CAAC;QACZ,IAAI,IAAI,GAAG,CAAC,CAAC;QAEb,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,MAAM,WAAW,GAAG,GAAG,CAAC;gBACxB,MAAM,SAAS,GAAG,IAAI,CAAC;gBACvB,GAAG,EAAE,CAAC,CAAC,WAAW;gBAElB,qCAAqC;gBACrC,IAAI,SAAS,GAAG,CAAC,CAAC;gBAClB,IAAI,SAAS,GAAG,KAAK,CAAC;gBACtB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU;wBACtC,SAAS,GAAG,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;wBACxC,SAAS,GAAG,IAAI,CAAC;wBACjB,GAAG,EAAE,CAAC;oBACR,CAAC;yBAAM,CAAC;wBACN,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,SAAS;oBAAE,SAAS;gBAEzB,2BAA2B;gBAC3B,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;yBACjD,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;wBAAC,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;;wBACrC,MAAM;gBACb,CAAC;gBAED,gBAAgB;gBAChB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM;oBAAE,SAAS;gBAChD,GAAG,EAAE,CAAC;gBAEN,kBAAkB;gBAClB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;yBACjD,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;wBAAC,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;;wBACrC,MAAM;gBACb,CAAC;gBAED,0BAA0B;gBAC1B,MAAM,SAAS,GAAG,GAAG,CAAC;gBACtB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;oBAAE,SAAS,CAAC,iBAAiB;gBAEjF,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;wBACpD,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAC3C,GAAG,EAAE,CAAC;oBACR,CAAC;yBAAM,CAAC;wBACN,MAAM;oBACR,CAAC;gBACH,CAAC;gBAED,IAAI,GAAG,KAAK,SAAS;oBAAE,SAAS;gBAEhC,mBAAmB;gBACnB,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC;gBAElE,kBAAkB;gBAClB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;yBACjD,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;wBAAC,IAAI,EAAE,CAAC;wBAAC,GAAG,EAAE,CAAC;oBAAC,CAAC;;wBACrC,MAAM;gBACb,CAAC;gBAED,gBAAgB;gBAChB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM;oBAAE,SAAS;gBAEhD,6CAA6C;gBAC7C,IAAI,QAAQ,GAAG,KAAK,CAAC;gBACrB,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC;oBACjB,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;oBACnB,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;wBAChB,IAAI,QAAQ,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;4BACxD,GAAG,IAAI,CAAC,CAAC,CAAC,qBAAqB;4BAC/B,SAAS;wBACX,CAAC;wBACD,QAAQ,GAAG,CAAC,QAAQ,CAAC;oBACvB,CAAC;yBAAM,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACxC,sBAAsB;wBACtB,MAAM,YAAY,GAAG,GAAG,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,oBAAoB;wBAChE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;wBACtF,GAAG,EAAE,CAAC;wBACN,MAAM;oBACR,CAAC;yBAAM,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC;wBACzB,IAAI,EAAE,CAAC;oBACT,CAAC;oBACD,GAAG,EAAE,CAAC;gBACR,CAAC;YACH,CAAC;iBAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC5B,IAAI,EAAE,CAAC;gBACP,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,CAAC;gBACN,GAAG,EAAE,CAAC;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAEO,aAAa;QACnB,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,WAAW;QAExC,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,UAAU;gBAC5C,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;gBAC7B,MAAM,EAAE,CAAC;gBACT,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,YAAY;QAClB,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,yCAAyC;QACzC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC;YAClH,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,yCAAyC;YACzC,IACE,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM;gBACxC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM;gBACxC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,MAAM;gBACxC,IAAI,KAAK,IAAI,CAAC,IAAI;cAClB,CAAC;gBACD,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,GAAG,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QAE/B,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,cAAc;QACpB,OAAO,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,qBAAqB;gBAC3F,IAAI,IAAI,KAAK,IAAI;oBAAE,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,WAAmB;QAC1C,IAAI,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QACxB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,KAAK,CAAC;QAErB,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE9B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,kCAAkC;gBACrD,IAAI,QAAQ,EAAE,CAAC;oBACb,0DAA0D;oBAC1D,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;wBAClE,GAAG,IAAI,CAAC,CAAC,CAAC,qBAAqB;wBAC/B,SAAS;oBACX,CAAC;oBACD,QAAQ,GAAG,KAAK,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,QAAQ,GAAG,IAAI,CAAC;gBAClB,CAAC;gBACD,GAAG,EAAE,CAAC;gBACN,SAAS;YACX,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,EAAE,CAAC;gBACN,SAAS;YACX,CAAC;YAED,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;gBACzB,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,CAAC;YACR,CAAC;iBAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM;gBAChC,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,CAAC;gBACN,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;oBAChB,qCAAqC;oBACrC,OAAO,GAAG,GAAG,WAAW,CAAC;gBAC3B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,EAAE,CAAC;YACR,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC,CAAC,wCAAwC;IACpD,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit extraction for IFC files
|
|
3
|
+
*
|
|
4
|
+
* Extracts length unit scale factor from IFCPROJECT -> IFCUNITASSIGNMENT -> IFCSIUNIT/IFCCONVERSIONBASEDUNIT
|
|
5
|
+
* Used to convert elevation values and other length measurements to meters.
|
|
6
|
+
*/
|
|
7
|
+
import type { EntityRef } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Extract length unit scale factor from IFC file
|
|
10
|
+
*
|
|
11
|
+
* Follows the chain: IFCPROJECT → IFCUNITASSIGNMENT → IFCSIUNIT/IFCCONVERSIONBASEDUNIT
|
|
12
|
+
* Returns the multiplier to convert coordinates to meters.
|
|
13
|
+
*
|
|
14
|
+
* @param source - Raw IFC file bytes
|
|
15
|
+
* @param entityIndex - Entity index with byId and byType maps
|
|
16
|
+
* @returns Scale factor to apply to length values (e.g., 0.001 for millimeters)
|
|
17
|
+
*/
|
|
18
|
+
export declare function extractLengthUnitScale(source: Uint8Array, entityIndex: {
|
|
19
|
+
byId: Map<number, EntityRef>;
|
|
20
|
+
byType: Map<string, number[]>;
|
|
21
|
+
}): number;
|
|
22
|
+
//# sourceMappingURL=unit-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-extractor.d.ts","sourceRoot":"","sources":["../src/unit-extractor.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAwC5C;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE;IAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;CAAE,GAC3E,MAAM,CAmLR"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
import { EntityExtractor } from './entity-extractor.js';
|
|
5
|
+
/**
|
|
6
|
+
* SI Prefix multipliers as defined in IFC specification
|
|
7
|
+
*/
|
|
8
|
+
const SI_PREFIX_MULTIPLIERS = {
|
|
9
|
+
'ATTO': 1e-18,
|
|
10
|
+
'FEMTO': 1e-15,
|
|
11
|
+
'PICO': 1e-12,
|
|
12
|
+
'NANO': 1e-9,
|
|
13
|
+
'MICRO': 1e-6,
|
|
14
|
+
'MILLI': 1e-3, // Most common: millimeters
|
|
15
|
+
'CENTI': 1e-2, // Centimeters
|
|
16
|
+
'DECI': 1e-1, // Decimeters
|
|
17
|
+
'DECA': 1e1,
|
|
18
|
+
'HECTO': 1e2,
|
|
19
|
+
'KILO': 1e3,
|
|
20
|
+
'MEGA': 1e6,
|
|
21
|
+
'GIGA': 1e9,
|
|
22
|
+
'TERA': 1e12,
|
|
23
|
+
'PETA': 1e15,
|
|
24
|
+
'EXA': 1e18,
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Known conversion factors for imperial/conversion-based units to meters
|
|
28
|
+
*/
|
|
29
|
+
const CONVERSION_BASED_UNIT_FACTORS = {
|
|
30
|
+
'FOOT': 0.3048,
|
|
31
|
+
'FEET': 0.3048,
|
|
32
|
+
"'FOOT'": 0.3048,
|
|
33
|
+
'INCH': 0.0254,
|
|
34
|
+
"'INCH'": 0.0254,
|
|
35
|
+
'YARD': 0.9144,
|
|
36
|
+
"'YARD'": 0.9144,
|
|
37
|
+
'MILE': 1609.344,
|
|
38
|
+
"'MILE'": 1609.344,
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Extract length unit scale factor from IFC file
|
|
42
|
+
*
|
|
43
|
+
* Follows the chain: IFCPROJECT → IFCUNITASSIGNMENT → IFCSIUNIT/IFCCONVERSIONBASEDUNIT
|
|
44
|
+
* Returns the multiplier to convert coordinates to meters.
|
|
45
|
+
*
|
|
46
|
+
* @param source - Raw IFC file bytes
|
|
47
|
+
* @param entityIndex - Entity index with byId and byType maps
|
|
48
|
+
* @returns Scale factor to apply to length values (e.g., 0.001 for millimeters)
|
|
49
|
+
*/
|
|
50
|
+
export function extractLengthUnitScale(source, entityIndex) {
|
|
51
|
+
const extractor = new EntityExtractor(source);
|
|
52
|
+
// Find IFCPROJECT
|
|
53
|
+
const projectIds = entityIndex.byType.get('IFCPROJECT') || [];
|
|
54
|
+
if (projectIds.length === 0) {
|
|
55
|
+
console.warn('[UnitExtractor] No IFCPROJECT found, defaulting to meters');
|
|
56
|
+
return 1.0;
|
|
57
|
+
}
|
|
58
|
+
const projectRef = entityIndex.byId.get(projectIds[0]);
|
|
59
|
+
if (!projectRef) {
|
|
60
|
+
return 1.0;
|
|
61
|
+
}
|
|
62
|
+
const projectEntity = extractor.extractEntity(projectRef);
|
|
63
|
+
if (!projectEntity) {
|
|
64
|
+
return 1.0;
|
|
65
|
+
}
|
|
66
|
+
// IFCPROJECT attributes:
|
|
67
|
+
// [0] GlobalId, [1] OwnerHistory, [2] Name, [3] Description, [4] ObjectType,
|
|
68
|
+
// [5] LongName, [6] Phase, [7] RepresentationContexts, [8] UnitsInContext
|
|
69
|
+
const attrs = projectEntity.attributes || [];
|
|
70
|
+
const unitsRef = attrs[8];
|
|
71
|
+
if (typeof unitsRef !== 'number') {
|
|
72
|
+
console.warn('[UnitExtractor] No UnitsInContext reference, defaulting to meters');
|
|
73
|
+
return 1.0;
|
|
74
|
+
}
|
|
75
|
+
// Resolve IFCUNITASSIGNMENT
|
|
76
|
+
const unitAssignmentRef = entityIndex.byId.get(unitsRef);
|
|
77
|
+
if (!unitAssignmentRef) {
|
|
78
|
+
return 1.0;
|
|
79
|
+
}
|
|
80
|
+
const unitAssignment = extractor.extractEntity(unitAssignmentRef);
|
|
81
|
+
if (!unitAssignment || unitAssignment.type.toUpperCase() !== 'IFCUNITASSIGNMENT') {
|
|
82
|
+
return 1.0;
|
|
83
|
+
}
|
|
84
|
+
// Guard against missing attributes
|
|
85
|
+
if (!unitAssignment.attributes || !Array.isArray(unitAssignment.attributes)) {
|
|
86
|
+
return 1.0;
|
|
87
|
+
}
|
|
88
|
+
// IFCUNITASSIGNMENT has a single attribute: Units (list of references)
|
|
89
|
+
const unitsList = unitAssignment.attributes[0];
|
|
90
|
+
if (!Array.isArray(unitsList)) {
|
|
91
|
+
return 1.0;
|
|
92
|
+
}
|
|
93
|
+
// Search for length unit
|
|
94
|
+
for (const unitRef of unitsList) {
|
|
95
|
+
if (typeof unitRef !== 'number')
|
|
96
|
+
continue;
|
|
97
|
+
const unitEntityRef = entityIndex.byId.get(unitRef);
|
|
98
|
+
if (!unitEntityRef)
|
|
99
|
+
continue;
|
|
100
|
+
const unitEntity = extractor.extractEntity(unitEntityRef);
|
|
101
|
+
if (!unitEntity)
|
|
102
|
+
continue;
|
|
103
|
+
const unitType = unitEntity.type.toUpperCase();
|
|
104
|
+
const unitAttrs = unitEntity.attributes || [];
|
|
105
|
+
// Handle IFCSIUNIT
|
|
106
|
+
if (unitType === 'IFCSIUNIT') {
|
|
107
|
+
// IFCSIUNIT: [0] Dimensions, [1] UnitType, [2] Prefix, [3] Name
|
|
108
|
+
const unitTypeValue = unitAttrs[1];
|
|
109
|
+
// Check if this is a length unit (enum value like .LENGTHUNIT.)
|
|
110
|
+
const isLengthUnit = typeof unitTypeValue === 'string' &&
|
|
111
|
+
unitTypeValue.replace(/\./g, '').toUpperCase() === 'LENGTHUNIT';
|
|
112
|
+
if (!isLengthUnit)
|
|
113
|
+
continue;
|
|
114
|
+
// Extract prefix (can be null/$, enum like .MILLI., or string)
|
|
115
|
+
const prefix = unitAttrs[2];
|
|
116
|
+
if (prefix === null || prefix === undefined || prefix === '$') {
|
|
117
|
+
// No prefix = base meters
|
|
118
|
+
return 1.0;
|
|
119
|
+
}
|
|
120
|
+
// Clean up enum value (remove dots)
|
|
121
|
+
const prefixStr = typeof prefix === 'string'
|
|
122
|
+
? prefix.replace(/\./g, '').toUpperCase()
|
|
123
|
+
: '';
|
|
124
|
+
const multiplier = SI_PREFIX_MULTIPLIERS[prefixStr];
|
|
125
|
+
if (multiplier !== undefined) {
|
|
126
|
+
console.log(`[UnitExtractor] Found SI unit with prefix ${prefixStr}, scale = ${multiplier}`);
|
|
127
|
+
return multiplier;
|
|
128
|
+
}
|
|
129
|
+
return 1.0;
|
|
130
|
+
}
|
|
131
|
+
// Handle IFCCONVERSIONBASEDUNIT (imperial units)
|
|
132
|
+
if (unitType === 'IFCCONVERSIONBASEDUNIT') {
|
|
133
|
+
// IFCCONVERSIONBASEDUNIT: [0] Dimensions, [1] UnitType, [2] Name, [3] ConversionFactor
|
|
134
|
+
const unitTypeValue = unitAttrs[1];
|
|
135
|
+
const isLengthUnit = typeof unitTypeValue === 'string' &&
|
|
136
|
+
unitTypeValue.replace(/\./g, '').toUpperCase() === 'LENGTHUNIT';
|
|
137
|
+
if (!isLengthUnit)
|
|
138
|
+
continue;
|
|
139
|
+
// Try to get known conversion factor by name
|
|
140
|
+
const unitName = unitAttrs[2];
|
|
141
|
+
if (typeof unitName === 'string') {
|
|
142
|
+
const nameUpper = unitName.toUpperCase();
|
|
143
|
+
const knownFactor = CONVERSION_BASED_UNIT_FACTORS[nameUpper];
|
|
144
|
+
if (knownFactor !== undefined) {
|
|
145
|
+
console.log(`[UnitExtractor] Found conversion-based unit ${unitName}, scale = ${knownFactor}`);
|
|
146
|
+
return knownFactor;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Try to extract from ConversionFactor (IFCMEASUREWITHUNIT reference)
|
|
150
|
+
const conversionRef = unitAttrs[3];
|
|
151
|
+
if (typeof conversionRef === 'number') {
|
|
152
|
+
const measureRef = entityIndex.byId.get(conversionRef);
|
|
153
|
+
if (measureRef) {
|
|
154
|
+
const measureEntity = extractor.extractEntity(measureRef);
|
|
155
|
+
if (measureEntity) {
|
|
156
|
+
// IFCMEASUREWITHUNIT: [0] ValueComponent, [1] UnitComponent
|
|
157
|
+
const valueAttr = measureEntity.attributes[0];
|
|
158
|
+
const unitComponentRef = measureEntity.attributes[1];
|
|
159
|
+
let conversionValue;
|
|
160
|
+
if (typeof valueAttr === 'number') {
|
|
161
|
+
conversionValue = valueAttr;
|
|
162
|
+
}
|
|
163
|
+
else if (Array.isArray(valueAttr) && valueAttr.length === 2 && typeof valueAttr[1] === 'number') {
|
|
164
|
+
// Typed value like ['IFCLENGTHMEASURE', 0.3048]
|
|
165
|
+
conversionValue = valueAttr[1];
|
|
166
|
+
}
|
|
167
|
+
if (conversionValue !== undefined && conversionValue > 0) {
|
|
168
|
+
// IMPORTANT: ValueComponent is expressed in UnitComponent's units.
|
|
169
|
+
// If UnitComponent is a prefixed SI unit (e.g., millimeters),
|
|
170
|
+
// we must multiply by that unit's scale factor.
|
|
171
|
+
let unitComponentScale = 1.0;
|
|
172
|
+
if (typeof unitComponentRef === 'number') {
|
|
173
|
+
const unitCompEntityRef = entityIndex.byId.get(unitComponentRef);
|
|
174
|
+
if (unitCompEntityRef) {
|
|
175
|
+
const unitCompEntity = extractor.extractEntity(unitCompEntityRef);
|
|
176
|
+
if (unitCompEntity && unitCompEntity.type.toUpperCase() === 'IFCSIUNIT') {
|
|
177
|
+
// IFCSIUNIT: [0] Dimensions, [1] UnitType, [2] Prefix, [3] Name
|
|
178
|
+
const unitCompAttrs = unitCompEntity.attributes || [];
|
|
179
|
+
const prefix = unitCompAttrs[2];
|
|
180
|
+
if (prefix !== null && prefix !== undefined && prefix !== '$') {
|
|
181
|
+
const prefixStr = typeof prefix === 'string'
|
|
182
|
+
? prefix.replace(/\./g, '').toUpperCase()
|
|
183
|
+
: '';
|
|
184
|
+
const prefixMultiplier = SI_PREFIX_MULTIPLIERS[prefixStr];
|
|
185
|
+
if (prefixMultiplier !== undefined) {
|
|
186
|
+
unitComponentScale = prefixMultiplier;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const finalScale = conversionValue * unitComponentScale;
|
|
193
|
+
console.log(`[UnitExtractor] Found conversion factor ${conversionValue} * ${unitComponentScale} = ${finalScale} from IFCMEASUREWITHUNIT`);
|
|
194
|
+
return finalScale;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// No length unit found, default to meters
|
|
202
|
+
console.warn('[UnitExtractor] No length unit found, defaulting to meters');
|
|
203
|
+
return 1.0;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=unit-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-extractor.js","sourceRoot":"","sources":["../src/unit-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker-based parser wrapper for parallel data model parsing
|
|
3
|
+
* Spawns a Web Worker to parse IFC data model without blocking main thread
|
|
4
|
+
*/
|
|
5
|
+
import type { IfcDataStore } from './columnar-parser.js';
|
|
6
|
+
import type { ParseOptions } from './index.js';
|
|
7
|
+
export interface WorkerParserOptions extends ParseOptions {
|
|
8
|
+
/** Worker URL (default: auto-detect) */
|
|
9
|
+
workerUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parser that uses Web Worker for true parallel execution
|
|
13
|
+
*/
|
|
14
|
+
export declare class WorkerParser {
|
|
15
|
+
private worker;
|
|
16
|
+
private workerUrl;
|
|
17
|
+
constructor(options?: WorkerParserOptions);
|
|
18
|
+
/**
|
|
19
|
+
* Parse IFC file into columnar data store using Web Worker
|
|
20
|
+
* Returns immediately, parsing happens in parallel
|
|
21
|
+
*/
|
|
22
|
+
parseColumnar(buffer: ArrayBuffer, options?: ParseOptions): Promise<IfcDataStore>;
|
|
23
|
+
/**
|
|
24
|
+
* Terminate the worker (cleanup)
|
|
25
|
+
*/
|
|
26
|
+
terminate(): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=worker-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-parser.d.ts","sourceRoot":"","sources":["../src/worker-parser.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO/C,MAAM,WAAW,mBAAoB,SAAQ,YAAY;IACvD,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,GAAE,mBAAwB;IAK7C;;;OAGG;IACG,aAAa,CACjB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,YAAY,CAAC;IAyDxB;;OAEG;IACH,SAAS,IAAI,IAAI;CAMlB"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
// Import worker URL using Vite's worker bundling - this ensures the worker
|
|
5
|
+
// is properly compiled and bundled for production builds
|
|
6
|
+
// @ts-ignore - Vite-specific import syntax
|
|
7
|
+
import ParserWorkerUrl from './parser.worker.ts?worker&url';
|
|
8
|
+
/**
|
|
9
|
+
* Parser that uses Web Worker for true parallel execution
|
|
10
|
+
*/
|
|
11
|
+
export class WorkerParser {
|
|
12
|
+
worker = null;
|
|
13
|
+
workerUrl;
|
|
14
|
+
constructor(options = {}) {
|
|
15
|
+
// Use provided worker URL or the Vite-bundled worker URL
|
|
16
|
+
this.workerUrl = options.workerUrl ?? ParserWorkerUrl;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Parse IFC file into columnar data store using Web Worker
|
|
20
|
+
* Returns immediately, parsing happens in parallel
|
|
21
|
+
*/
|
|
22
|
+
async parseColumnar(buffer, options = {}) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
// Generate unique ID for this parse request
|
|
25
|
+
const id = `parse_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
26
|
+
// Create worker
|
|
27
|
+
try {
|
|
28
|
+
this.worker = new Worker(this.workerUrl, { type: 'module' });
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
// Fallback: if worker creation fails, reject
|
|
32
|
+
reject(new Error(`Failed to create worker: ${error}`));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
// Handle worker messages
|
|
36
|
+
this.worker.onmessage = (e) => {
|
|
37
|
+
const { type, id: msgId, progress, dataStore, error } = e.data;
|
|
38
|
+
if (msgId !== id) {
|
|
39
|
+
return; // Ignore messages for other requests
|
|
40
|
+
}
|
|
41
|
+
switch (type) {
|
|
42
|
+
case 'progress':
|
|
43
|
+
// Forward progress updates
|
|
44
|
+
options.onProgress?.(progress);
|
|
45
|
+
break;
|
|
46
|
+
case 'complete':
|
|
47
|
+
// Clean up worker
|
|
48
|
+
this.worker?.terminate();
|
|
49
|
+
this.worker = null;
|
|
50
|
+
resolve(dataStore);
|
|
51
|
+
break;
|
|
52
|
+
case 'error':
|
|
53
|
+
// Clean up worker
|
|
54
|
+
this.worker?.terminate();
|
|
55
|
+
this.worker = null;
|
|
56
|
+
reject(new Error(error));
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
this.worker.onerror = (error) => {
|
|
61
|
+
// Clean up worker
|
|
62
|
+
this.worker?.terminate();
|
|
63
|
+
this.worker = null;
|
|
64
|
+
reject(new Error(`Worker error: ${error.message}`));
|
|
65
|
+
};
|
|
66
|
+
// Transfer buffer to worker (caller is responsible for cloning if needed)
|
|
67
|
+
// The worker will transfer/detach this buffer, so caller must clone before calling
|
|
68
|
+
this.worker.postMessage({ buffer, id }, [buffer]);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Terminate the worker (cleanup)
|
|
73
|
+
*/
|
|
74
|
+
terminate() {
|
|
75
|
+
if (this.worker) {
|
|
76
|
+
this.worker.terminate();
|
|
77
|
+
this.worker = null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=worker-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-parser.js","sourceRoot":"","sources":["../src/worker-parser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ifc-lite/parser",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "IFC/STEP parser for IFC-Lite",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -11,12 +11,9 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts"
|
|
12
12
|
}
|
|
13
13
|
},
|
|
14
|
-
"scripts": {
|
|
15
|
-
"build": "tsc || true",
|
|
16
|
-
"dev": "tsc --watch"
|
|
17
|
-
},
|
|
18
14
|
"dependencies": {
|
|
19
|
-
"@ifc-lite/data": "
|
|
15
|
+
"@ifc-lite/data": "^1.1.7",
|
|
16
|
+
"@ifc-lite/ifcx": "^1.2.0"
|
|
20
17
|
},
|
|
21
18
|
"devDependencies": {
|
|
22
19
|
"typescript": "^5.3.0"
|
|
@@ -43,5 +40,9 @@
|
|
|
43
40
|
"files": [
|
|
44
41
|
"dist",
|
|
45
42
|
"README.md"
|
|
46
|
-
]
|
|
47
|
-
|
|
43
|
+
],
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsc || true",
|
|
46
|
+
"dev": "tsc --watch"
|
|
47
|
+
}
|
|
48
|
+
}
|