@ifc-lite/parser 9.0.0 → 9.1.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 (58) hide show
  1. package/dist/columnar-parser.d.ts +1 -0
  2. package/dist/columnar-parser.d.ts.map +1 -1
  3. package/dist/data-store-transport.d.ts +1 -0
  4. package/dist/data-store-transport.d.ts.map +1 -1
  5. package/dist/data-store-transport.js +6 -0
  6. package/dist/data-store-transport.js.map +1 -1
  7. package/dist/effective-spatial-members.d.ts +11 -0
  8. package/dist/effective-spatial-members.d.ts.map +1 -0
  9. package/dist/effective-spatial-members.js +32 -0
  10. package/dist/effective-spatial-members.js.map +1 -0
  11. package/dist/effective-storey.d.ts +5 -0
  12. package/dist/effective-storey.d.ts.map +1 -0
  13. package/dist/effective-storey.js +64 -0
  14. package/dist/effective-storey.js.map +1 -0
  15. package/dist/index.d.ts +4 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +3 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/material-associations.d.ts +24 -0
  20. package/dist/material-associations.d.ts.map +1 -0
  21. package/dist/material-associations.js +67 -0
  22. package/dist/material-associations.js.map +1 -0
  23. package/dist/material-properties-extractor.d.ts +37 -0
  24. package/dist/material-properties-extractor.d.ts.map +1 -0
  25. package/dist/material-properties-extractor.js +217 -0
  26. package/dist/material-properties-extractor.js.map +1 -0
  27. package/dist/material-resolver.d.ts +1 -9
  28. package/dist/material-resolver.d.ts.map +1 -1
  29. package/dist/material-resolver.js +23 -67
  30. package/dist/material-resolver.js.map +1 -1
  31. package/dist/on-demand-extractors.d.ts +2 -26
  32. package/dist/on-demand-extractors.d.ts.map +1 -1
  33. package/dist/on-demand-extractors.js +15 -168
  34. package/dist/on-demand-extractors.js.map +1 -1
  35. package/dist/owning-project.d.ts.map +1 -1
  36. package/dist/owning-project.js +1 -0
  37. package/dist/owning-project.js.map +1 -1
  38. package/dist/property-complex-value.d.ts +34 -0
  39. package/dist/property-complex-value.d.ts.map +1 -0
  40. package/dist/property-complex-value.js +111 -0
  41. package/dist/property-complex-value.js.map +1 -0
  42. package/dist/property-reference-value.d.ts +15 -0
  43. package/dist/property-reference-value.d.ts.map +1 -0
  44. package/dist/property-reference-value.js +34 -0
  45. package/dist/property-reference-value.js.map +1 -0
  46. package/dist/property-value-parser.d.ts +7 -21
  47. package/dist/property-value-parser.d.ts.map +1 -1
  48. package/dist/property-value-parser.js +28 -96
  49. package/dist/property-value-parser.js.map +1 -1
  50. package/dist/structural-extractor-values.d.ts +18 -0
  51. package/dist/structural-extractor-values.d.ts.map +1 -0
  52. package/dist/structural-extractor-values.js +50 -0
  53. package/dist/structural-extractor-values.js.map +1 -0
  54. package/dist/structural-extractor.d.ts +16 -1
  55. package/dist/structural-extractor.d.ts.map +1 -1
  56. package/dist/structural-extractor.js +70 -74
  57. package/dist/structural-extractor.js.map +1 -1
  58. package/package.json +6 -6
@@ -11,6 +11,8 @@ import type { IfcEntity } from './types.js';
11
11
  import type { EntityExtractor } from './entity-extractor.js';
12
12
  import type { PropertyValue } from '@ifc-lite/data';
13
13
  import type { IfcDataStore } from './columnar-parser.js';
14
+ import { resolveComplexPropertyValue } from './property-complex-value.js';
15
+ export { resolveComplexPropertyValue };
14
16
  /** One decoded `IfcProperty`. `dataType` is the IFC type of the value (for a
15
17
  * list or enumeration, the one type all members share). `dataTypeMixed`
16
18
  * marks an `IfcPropertyTableValue`, whose columns carry different types by
@@ -27,6 +29,8 @@ export interface ParsedIfcPropertyValue {
27
29
  * an enumerated or list value, every cell of a table (#5475).
28
30
  */
29
31
  structure?: 'enumerated' | 'bounded' | 'list' | 'table' | 'reference' | 'complex';
32
+ /** `IfcComplexProperty` only: each nested property, by its own `Name`, decoded the same way (#5475). */
33
+ members?: ExtractedProperty[];
30
34
  }
31
35
  /** One property as the on-demand extractors return it: the parsed value
32
36
  * plus its name and, when the file declares one, its explicit unit. */
@@ -43,31 +47,13 @@ export interface ExtractedProperty extends ParsedIfcPropertyValue {
43
47
  * - IfcPropertyBoundedValue: upper/lower bounds → "value [min – max]"
44
48
  * - IfcPropertyListValue: list of values → joined string
45
49
  * - IfcPropertyTableValue: defining/defined value pairs → "Table(N rows)"
46
- * - IfcPropertyReferenceValue: entity reference → "Reference #ID"
50
+ * - IfcPropertyReferenceValue: `#<id>` of the reference (slot 3); `parsePropertyValueWithComplex` reads the referenced Name instead
47
51
  */
48
52
  export declare function parsePropertyValue(propEntity: IfcEntity): ParsedIfcPropertyValue;
49
53
  /** Extract a numeric value from a possibly typed STEP value. */
50
54
  export declare function extractNumericValue(attr: unknown): number | null;
51
- /**
52
- * Resolve an `IfcComplexProperty`'s nested `HasProperties` (EXPRESS:
53
- * `[Name, Description, UsageName, HasProperties]`, index 3) into a display
54
- * value plus a flat `values` candidate list, recursing into any further
55
- * nested `IfcComplexProperty`. Without this, {@link parsePropertyValue}'s
56
- * default branch reads attribute index 2 as if it were a `NominalValue`,
57
- * which for `IfcComplexProperty` is `UsageName` — a label, not a value — and
58
- * every nested property silently vanishes from the panel/query output.
59
- *
60
- * Hitting {@link MAX_COMPLEX_PROPERTY_DEPTH} with a non-empty `HasProperties`
61
- * still unread appends {@link complexPropertyTruncationMarker}; a bare
62
- * `UsageName` there is a plausible, well-formed value indistinguishable from
63
- * a complex property that genuinely has no nested content (issue #3972). The
64
- * empty-`UsageName` case matters most — before #3972 it produced an empty
65
- * display, the caller loop `continue`d past it, and the whole nested member
66
- * vanished while its parent fell back to showing its OWN `UsageName`, so the
67
- * reader saw a real value attributed to the wrong nesting level. An absent or
68
- * empty `HasProperties` is NOT a truncation and keeps the bare `UsageName`.
69
- */
70
- export declare function resolveComplexPropertyValue(store: IfcDataStore, extractor: EntityExtractor, propEntity: IfcEntity, depth?: number): ParsedIfcPropertyValue;
55
+ /** Copy the optional parts of a decoded value onto an extracted property. */
56
+ export declare function copyParsedExtras(entry: ExtractedProperty, parsed: ParsedIfcPropertyValue): void;
71
57
  /** Dispatch a pset member to {@link resolveComplexPropertyValue} for
72
58
  * `IfcComplexProperty`, else the single-entity {@link parsePropertyValue}. */
73
59
  export declare function parsePropertyValueWithComplex(store: IfcDataStore, extractor: EntityExtractor, propEntity: IfcEntity): ParsedIfcPropertyValue;
@@ -1 +1 @@
1
- {"version":3,"file":"property-value-parser.d.ts","sourceRoot":"","sources":["../src/property-value-parser.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMzD;;;sDAGsD;AACtD,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;CACrF;AAED;wEACwE;AACxE,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,GAAG,sBAAsB,CAiMhF;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIhE;AA2BD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,SAAS,EACrB,KAAK,SAAI,GACV,sBAAsB,CAiDxB;AAED;+EAC+E;AAC/E,wBAAgB,6BAA6B,CACzC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,SAAS,GACtB,sBAAsB,CAKxB"}
1
+ {"version":3,"file":"property-value-parser.d.ts","sourceRoot":"","sources":["../src/property-value-parser.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAE1E,OAAO,EAAE,2BAA2B,EAAE,CAAC;AAMvC;;;sDAGsD;AACtD,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,IAAI,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,CAAC;IAClF,wGAAwG;IACxG,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;CACjC;AAED;wEACwE;AACxE,MAAM,WAAW,iBAAkB,SAAQ,sBAAsB;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,GAAG,sBAAsB,CAkMhF;AAED,gEAAgE;AAChE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAIhE;AAED,6EAA6E;AAC7E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAM/F;AAED;+EAC+E;AAC/E,wBAAgB,6BAA6B,CACzC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,eAAe,EAC1B,UAAU,EAAE,SAAS,GACtB,sBAAsB,CASxB"}
@@ -2,6 +2,9 @@
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  import { PropertyValueType } from '@ifc-lite/data';
5
+ import { resolvePropertyReferenceValue } from './property-reference-value.js';
6
+ import { resolveComplexPropertyValue } from './property-complex-value.js';
7
+ export { resolveComplexPropertyValue };
5
8
  /** The IFC type every typed member of a list shares, or `undefined` when a
6
9
  * member is untyped or the types differ. */
7
10
  function sharedMemberType(members) {
@@ -24,7 +27,7 @@ function sharedMemberType(members) {
24
27
  * - IfcPropertyBoundedValue: upper/lower bounds → "value [min – max]"
25
28
  * - IfcPropertyListValue: list of values → joined string
26
29
  * - IfcPropertyTableValue: defining/defined value pairs → "Table(N rows)"
27
- * - IfcPropertyReferenceValue: entity reference → "Reference #ID"
30
+ * - IfcPropertyReferenceValue: `#<id>` of the reference (slot 3); `parsePropertyValueWithComplex` reads the referenced Name instead
28
31
  */
29
32
  export function parsePropertyValue(propEntity) {
30
33
  const attrs = propEntity.attributes || [];
@@ -137,12 +140,13 @@ export function parsePropertyValue(propEntity) {
137
140
  return { type: 0, value: null };
138
141
  }
139
142
  case 'IFCPROPERTYREFERENCEVALUE': {
140
- // [Name, Description, PropertyReference]
141
- const refValue = attrs[2];
142
- if (typeof refValue === 'number') {
143
- return { type: 0, value: `#${refValue}`, structure: 'reference' };
144
- }
145
- return { type: 0, value: null };
143
+ // [Name, Description, UsageName, PropertyReference]. Without a
144
+ // store the referenced object cannot be read, so only its id is
145
+ // known; `parsePropertyValueWithComplex` reads its Name (#5475).
146
+ const refValue = attrs[3];
147
+ return typeof refValue === 'number'
148
+ ? { type: 0, value: `#${refValue}`, structure: 'reference' }
149
+ : { type: 0, value: null, structure: 'reference' };
146
150
  }
147
151
  default: {
148
152
  // IfcPropertySingleValue and fallback: [Name, Description, NominalValue, Unit]
@@ -234,101 +238,29 @@ export function extractNumericValue(attr) {
234
238
  return attr[1];
235
239
  return null;
236
240
  }
237
- /** Guards {@link resolveComplexPropertyValue} against a pathological/cyclic
238
- * HasProperties chain; real IFC nests IfcComplexProperty at most a couple of
239
- * levels deep (e.g. Pset "sub-properties"). */
240
- const MAX_COMPLEX_PROPERTY_DEPTH = 8;
241
- /**
242
- * The suffix minted into a complex property's display value when
243
- * {@link MAX_COMPLEX_PROPERTY_DEPTH} stops the walk with `HasProperties`
244
- * members still unread (issue #3972). Byte-identical to
245
- * `complex_property_truncation_marker()` in
246
- * `apps/server/src/services/data_model/property_value.rs` — the two paths
247
- * feed the same property panel, CSV/parquet export and compare fingerprints,
248
- * so a divergence here reads as a data difference between browser and server.
249
- *
250
- * A suffix rather than a `truncated` flag on `Property`: a flag would have to
251
- * be carried through the `Property` type, the `serverDataModel` adapter, the
252
- * Rust struct + serde, the per-field parquet columns and the panel renderer,
253
- * and is silently lost at any one of them — the same "a signal that never
254
- * fires" shape this issue is about. The value string reaches every reader by
255
- * construction.
256
- */
257
- function complexPropertyTruncationMarker() {
258
- return `(truncated: nesting deeper than ${MAX_COMPLEX_PROPERTY_DEPTH} levels)`;
259
- }
260
- /**
261
- * Resolve an `IfcComplexProperty`'s nested `HasProperties` (EXPRESS:
262
- * `[Name, Description, UsageName, HasProperties]`, index 3) into a display
263
- * value plus a flat `values` candidate list, recursing into any further
264
- * nested `IfcComplexProperty`. Without this, {@link parsePropertyValue}'s
265
- * default branch reads attribute index 2 as if it were a `NominalValue`,
266
- * which for `IfcComplexProperty` is `UsageName` — a label, not a value — and
267
- * every nested property silently vanishes from the panel/query output.
268
- *
269
- * Hitting {@link MAX_COMPLEX_PROPERTY_DEPTH} with a non-empty `HasProperties`
270
- * still unread appends {@link complexPropertyTruncationMarker}; a bare
271
- * `UsageName` there is a plausible, well-formed value indistinguishable from
272
- * a complex property that genuinely has no nested content (issue #3972). The
273
- * empty-`UsageName` case matters most — before #3972 it produced an empty
274
- * display, the caller loop `continue`d past it, and the whole nested member
275
- * vanished while its parent fell back to showing its OWN `UsageName`, so the
276
- * reader saw a real value attributed to the wrong nesting level. An absent or
277
- * empty `HasProperties` is NOT a truncation and keeps the bare `UsageName`.
278
- */
279
- export function resolveComplexPropertyValue(store, extractor, propEntity, depth = 0) {
280
- const attrs = propEntity.attributes || [];
281
- const usageName = typeof attrs[2] === 'string' ? attrs[2] : '';
282
- const hasProperties = attrs[3];
283
- if (!Array.isArray(hasProperties) || hasProperties.length === 0) {
284
- // Nothing nested exists, so stopping here loses nothing and must NOT
285
- // be marked as a truncation.
286
- return { type: PropertyValueType.String, value: usageName || null };
287
- }
288
- if (depth >= MAX_COMPLEX_PROPERTY_DEPTH) {
289
- // Members were present and we declined to read them. Say so.
290
- const marker = complexPropertyTruncationMarker();
291
- return {
292
- type: PropertyValueType.String,
293
- value: usageName ? `${usageName} ${marker}` : marker,
294
- };
295
- }
296
- const parts = [];
297
- const values = [];
298
- for (const ref of hasProperties) {
299
- if (typeof ref !== 'number')
300
- continue;
301
- // @raw-entity-enumeration-ok complex-property parsing follows this source member reference, not an entity set
302
- const nestedRef = store.entityIndex.byId.get(ref) ?? store.deferredEntityIndex?.get(ref);
303
- if (!nestedRef)
304
- continue;
305
- const nestedEntity = extractor.extractEntity(nestedRef);
306
- if (!nestedEntity)
307
- continue;
308
- const nestedAttrs = nestedEntity.attributes || [];
309
- const nestedName = typeof nestedAttrs[0] === 'string' ? nestedAttrs[0] : '';
310
- const nestedParsed = nestedEntity.type.toUpperCase() === 'IFCCOMPLEXPROPERTY'
311
- ? resolveComplexPropertyValue(store, extractor, nestedEntity, depth + 1)
312
- : parsePropertyValue(nestedEntity);
313
- const display = nestedParsed.value != null ? String(nestedParsed.value) : '';
314
- if (!display)
315
- continue;
316
- parts.push(nestedName ? `${nestedName}: ${display}` : display);
317
- values.push(display);
318
- }
319
- return {
320
- type: PropertyValueType.String,
321
- value: parts.length > 0 ? parts.join(', ') : (usageName || null),
322
- structure: 'complex',
323
- ...(values.length > 0 ? { values } : {}),
324
- };
241
+ /** Copy the optional parts of a decoded value onto an extracted property. */
242
+ export function copyParsedExtras(entry, parsed) {
243
+ if (parsed.values)
244
+ entry.values = parsed.values;
245
+ if (parsed.dataType)
246
+ entry.dataType = parsed.dataType;
247
+ if (parsed.dataTypeMixed)
248
+ entry.dataTypeMixed = true;
249
+ if (parsed.structure)
250
+ entry.structure = parsed.structure;
251
+ if (parsed.members)
252
+ entry.members = parsed.members;
325
253
  }
326
254
  /** Dispatch a pset member to {@link resolveComplexPropertyValue} for
327
255
  * `IfcComplexProperty`, else the single-entity {@link parsePropertyValue}. */
328
256
  export function parsePropertyValueWithComplex(store, extractor, propEntity) {
329
- if (propEntity.type.toUpperCase() === 'IFCCOMPLEXPROPERTY') {
257
+ const type = propEntity.type.toUpperCase();
258
+ if (type === 'IFCCOMPLEXPROPERTY') {
330
259
  return resolveComplexPropertyValue(store, extractor, propEntity);
331
260
  }
261
+ if (type === 'IFCPROPERTYREFERENCEVALUE') {
262
+ return resolvePropertyReferenceValue(store, extractor, propEntity);
263
+ }
332
264
  return parsePropertyValue(propEntity);
333
265
  }
334
266
  //# sourceMappingURL=property-value-parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"property-value-parser.js","sourceRoot":"","sources":["../src/property-value-parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"property-value-parser.js","sourceRoot":"","sources":["../src/property-value-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type RawEntity } from './structural-step-values.js';
2
+ import type { StructuralExtraction } from './structural-types.js';
3
+ export type StructuralRole = 'member' | 'connection' | 'activity' | 'loadGroup' | 'resultGroup' | 'analysisModel';
4
+ /** Empty result shared by the parsed and live-overlay extractor paths. */
5
+ export declare function emptyStructuralExtraction(): StructuralExtraction;
6
+ /**
7
+ * Classify by inheritance, not by name. Unrelated `IFCSTRUCTURAL*` entities
8
+ * such as load leaves and profile properties are intentionally skipped.
9
+ */
10
+ export declare function structuralRoleOf(type: string): StructuralRole | undefined;
11
+ export declare function structuralActivityKind(type: string): 'Action' | 'Reaction' | 'Unknown';
12
+ /** IfcRoot attribute 2 is Name, 3 Description; IfcObject adds ObjectType at 4. */
13
+ export declare function structuralRootFields(e: RawEntity): {
14
+ name?: string;
15
+ description?: string;
16
+ objectType?: string;
17
+ };
18
+ //# sourceMappingURL=structural-extractor-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-extractor-values.d.ts","sourceRoot":"","sources":["../src/structural-extractor-values.ts"],"names":[],"mappings":"AAIA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAEvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,WAAW,GACX,aAAa,GACb,eAAe,CAAC;AAEpB,0EAA0E;AAC1E,wBAAgB,yBAAyB,IAAI,oBAAoB,CAKhE;AAYD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAMzE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAKtF;AAED,kFAAkF;AAClF,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,SAAS,GAAG;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAMA"}
@@ -0,0 +1,50 @@
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 { asString } from './structural-step-values.js';
5
+ import { getInheritanceChain } from './ifc-schema.js';
6
+ /** Empty result shared by the parsed and live-overlay extractor paths. */
7
+ export function emptyStructuralExtraction() {
8
+ return {
9
+ analysisModels: [], members: [], connections: [], activities: [],
10
+ loadGroups: [], resultGroups: [], hasStructural: false, loadsTruncated: false,
11
+ };
12
+ }
13
+ /** Chain marker → role. Every marker is disjoint, so match order is not load-bearing. */
14
+ const ROLE_BY_SUPERTYPE = [
15
+ ['IFCSTRUCTURALANALYSISMODEL', 'analysisModel'],
16
+ ['IFCSTRUCTURALRESULTGROUP', 'resultGroup'],
17
+ ['IFCSTRUCTURALLOADGROUP', 'loadGroup'],
18
+ ['IFCSTRUCTURALMEMBER', 'member'],
19
+ ['IFCSTRUCTURALCONNECTION', 'connection'],
20
+ ['IFCSTRUCTURALACTIVITY', 'activity'],
21
+ ];
22
+ /**
23
+ * Classify by inheritance, not by name. Unrelated `IFCSTRUCTURAL*` entities
24
+ * such as load leaves and profile properties are intentionally skipped.
25
+ */
26
+ export function structuralRoleOf(type) {
27
+ const chain = getInheritanceChain(type).map((c) => c.toUpperCase());
28
+ for (const [marker, role] of ROLE_BY_SUPERTYPE) {
29
+ if (chain.includes(marker))
30
+ return role;
31
+ }
32
+ return undefined;
33
+ }
34
+ export function structuralActivityKind(type) {
35
+ const chain = getInheritanceChain(type).map((c) => c.toUpperCase());
36
+ if (chain.includes('IFCSTRUCTURALACTION'))
37
+ return 'Action';
38
+ if (chain.includes('IFCSTRUCTURALREACTION'))
39
+ return 'Reaction';
40
+ return 'Unknown';
41
+ }
42
+ /** IfcRoot attribute 2 is Name, 3 Description; IfcObject adds ObjectType at 4. */
43
+ export function structuralRootFields(e) {
44
+ return {
45
+ name: asString(e.attrs[2]),
46
+ description: asString(e.attrs[3]),
47
+ objectType: asString(e.attrs[4]),
48
+ };
49
+ }
50
+ //# sourceMappingURL=structural-extractor-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-extractor-values.js","sourceRoot":"","sources":["../src/structural-extractor-values.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D,OAAO,EAAE,QAAQ,EAAkB,MAAM,6BAA6B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAWtD,0EAA0E;AAC1E,MAAM,UAAU,yBAAyB;IACvC,OAAO;QACL,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE;QAChE,UAAU,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK;KAC9E,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,MAAM,iBAAiB,GAAqD;IAC1E,CAAC,4BAA4B,EAAE,eAAe,CAAC;IAC/C,CAAC,0BAA0B,EAAE,aAAa,CAAC;IAC3C,CAAC,wBAAwB,EAAE,WAAW,CAAC;IACvC,CAAC,qBAAqB,EAAE,QAAQ,CAAC;IACjC,CAAC,yBAAyB,EAAE,YAAY,CAAC;IACzC,CAAC,uBAAuB,EAAE,UAAU,CAAC;CACtC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACpE,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,iBAAiB,EAAE,CAAC;QAC/C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;IAC1C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACpE,IAAI,KAAK,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3D,IAAI,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAAE,OAAO,UAAU,CAAC;IAC/D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,oBAAoB,CAAC,CAAY;IAK/C,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1B,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;KACjC,CAAC;AACJ,CAAC"}
@@ -1,9 +1,24 @@
1
+ import { type EffectiveEntityOverlay } from '@ifc-lite/data';
1
2
  import type { IfcDataStore } from './columnar-parser.js';
2
3
  import { type BoundaryConditionInfo, type StructuralLoadConfigurationEntry, type StructuralLoadConfigurationInfo, type StructuralLoadDropReason, type StructuralLoadInfo } from './structural-load-extractor.js';
4
+ import { type RawEntity } from './structural-step-values.js';
3
5
  import type { StructuralActivityInfo, StructuralAnalysisModelInfo, StructuralConnectionInfo, StructuralExtraction, StructuralLoadGroupInfo, StructuralMemberInfo, StructuralResultGroupInfo } from './structural-types.js';
4
6
  export type { BoundaryConditionInfo, StructuralActivityInfo, StructuralAnalysisModelInfo, StructuralConnectionInfo, StructuralExtraction, StructuralLoadConfigurationEntry, StructuralLoadConfigurationInfo, StructuralLoadDropReason, StructuralLoadGroupInfo, StructuralLoadInfo, StructuralMemberInfo, StructuralResultGroupInfo, };
7
+ /** Optional live-session view used when structural data is queried in the viewer. */
8
+ export interface StructuralExtractionView extends EffectiveEntityOverlay {
9
+ getNewEntity?(expressId: number): {
10
+ readonly type: string;
11
+ readonly attributes?: readonly unknown[];
12
+ } | null;
13
+ /**
14
+ * Resolve the attributes for an effective entity. `source` is absent for a
15
+ * session-created entity. Callers can merge positional/named edits without
16
+ * making parser depend on the mutations package.
17
+ */
18
+ readEntity?: (expressId: number, effectiveType: string, source?: RawEntity) => RawEntity | undefined;
19
+ }
5
20
  /**
6
21
  * Extract all structural analysis data from a parsed IFC store.
7
22
  */
8
- export declare function extractStructuralOnDemand(store: IfcDataStore): StructuralExtraction;
23
+ export declare function extractStructuralOnDemand(store: IfcDataStore, view?: StructuralExtractionView | null): StructuralExtraction;
9
24
  //# sourceMappingURL=structural-extractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"structural-extractor.d.ts","sourceRoot":"","sources":["../src/structural-extractor.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAcxC,OAAO,KAAK,EACV,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,gCAAgC,EAChC,+BAA+B,EAC/B,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,GAC1B,CAAC;AAmEF;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,YAAY,GAAG,oBAAoB,CAkOnF"}
1
+ {"version":3,"file":"structural-extractor.d.ts","sourceRoot":"","sources":["../src/structural-extractor.ts"],"names":[],"mappings":"AAyCA,OAAO,EAA4B,KAAK,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,gCAAgC,EACrC,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EACV,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,uBAAuB,CAAC;AAS/B,YAAY,EACV,qBAAqB,EACrB,sBAAsB,EACtB,2BAA2B,EAC3B,wBAAwB,EACxB,oBAAoB,EACpB,gCAAgC,EAChC,+BAA+B,EAC/B,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,yBAAyB,GAC1B,CAAC;AAEF,qFAAqF;AACrF,MAAM,WAAW,wBAAyB,SAAQ,sBAAsB;IACtE,YAAY,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;KAAE,GAAG,IAAI,CAAC;IAC7G;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,KAAK,SAAS,GAAG,SAAS,CAAC;CACtG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,YAAY,EACnB,IAAI,CAAC,EAAE,wBAAwB,GAAG,IAAI,GACrC,oBAAoB,CA0QtB"}
@@ -37,92 +37,88 @@
37
37
  * here; a 2X3-only attribute reads as absent rather than as the wrong slot.
38
38
  */
39
39
  import { EntityExtractor } from './entity-extractor.js';
40
- import { getInheritanceChain } from './ifc-schema.js';
40
+ import { iterateEffectiveEntities } from '@ifc-lite/data';
41
+ import { normalizeIfcTypeName } from './ifc-schema.js';
41
42
  import { extractBoundaryCondition, extractStructuralLoad, } from './structural-load-extractor.js';
42
- import { addUnique, asBoolean, asEnum, asNumber, asNumberList, asRef, asRefList, asString, readAttr, readEntities, } from './structural-step-values.js';
43
- function emptyExtraction() {
44
- return {
45
- analysisModels: [],
46
- members: [],
47
- connections: [],
48
- activities: [],
49
- loadGroups: [],
50
- resultGroups: [],
51
- hasStructural: false,
52
- loadsTruncated: false,
53
- };
54
- }
55
- /** Chain marker → role. Every marker is disjoint, so match order is not load-bearing. */
56
- const ROLE_BY_SUPERTYPE = [
57
- ['IFCSTRUCTURALANALYSISMODEL', 'analysisModel'],
58
- ['IFCSTRUCTURALRESULTGROUP', 'resultGroup'],
59
- ['IFCSTRUCTURALLOADGROUP', 'loadGroup'],
60
- ['IFCSTRUCTURALMEMBER', 'member'],
61
- ['IFCSTRUCTURALCONNECTION', 'connection'],
62
- ['IFCSTRUCTURALACTIVITY', 'activity'],
63
- ];
64
- /**
65
- * Classify a concrete type by inheritance, not by name. Returns undefined for
66
- * an `IFCSTRUCTURAL*` type that is none of the six roles — `IfcStructuralLoad`
67
- * leaves and `IfcStructuralProfileProperties` reach here and are read through
68
- * their owners instead.
69
- */
70
- function roleOf(type) {
71
- const chain = getInheritanceChain(type).map((c) => c.toUpperCase());
72
- for (const [marker, role] of ROLE_BY_SUPERTYPE) {
73
- if (chain.includes(marker))
74
- return role;
75
- }
76
- return undefined;
77
- }
78
- function activityKind(type) {
79
- const chain = getInheritanceChain(type).map((c) => c.toUpperCase());
80
- if (chain.includes('IFCSTRUCTURALACTION'))
81
- return 'Action';
82
- if (chain.includes('IFCSTRUCTURALREACTION'))
83
- return 'Reaction';
84
- return 'Unknown';
85
- }
86
- /** IfcRoot attribute 2 is Name, 3 Description; IfcObject adds ObjectType at 4. */
87
- function rootFields(e) {
88
- return {
89
- name: asString(e.attrs[2]),
90
- description: asString(e.attrs[3]),
91
- objectType: asString(e.attrs[4]),
92
- };
93
- }
43
+ import { addUnique, asBoolean, asEnum, asNumber, asNumberList, asRef, asRefList, asString, readAttr, } from './structural-step-values.js';
44
+ import { emptyStructuralExtraction as emptyExtraction, structuralActivityKind as activityKind, structuralRoleOf as roleOf, structuralRootFields as rootFields, } from './structural-extractor-values.js';
94
45
  /**
95
46
  * Extract all structural analysis data from a parsed IFC store.
96
47
  */
97
- export function extractStructuralOnDemand(store) {
98
- if (!store.source?.length)
48
+ export function extractStructuralOnDemand(store, view) {
49
+ if (!store.source?.length && !view)
99
50
  return emptyExtraction();
51
+ // @raw-entity-enumeration-ok source buckets define the candidate domain; iterateEffectiveEntities below applies tombstones, creations and retypes
100
52
  const byType = store.entityIndex.byType;
101
- // Partition every IFCSTRUCTURAL* type present into the six roles.
102
- const idsByRole = new Map();
53
+ // Candidate source ids are the structural classes plus the three relation
54
+ // classes below. The effective iterator removes tombstones and folds in
55
+ // created and retyped records before the extractor reads their attributes.
56
+ const sourceIds = new Set();
103
57
  for (const [typeKey, ids] of byType) {
104
58
  if (!typeKey.startsWith('IFCSTRUCTURAL'))
105
59
  continue;
106
60
  const role = roleOf(typeKey);
107
61
  if (!role)
108
62
  continue;
109
- const bucket = idsByRole.get(role);
110
- if (bucket)
111
- bucket.push(...ids);
112
- else
113
- idsByRole.set(role, [...ids]);
63
+ for (const id of ids)
64
+ sourceIds.add(id);
65
+ }
66
+ const relationIds = new Set([
67
+ ...(byType.get('IFCRELCONNECTSSTRUCTURALMEMBER') ?? []),
68
+ ...(byType.get('IFCRELCONNECTSSTRUCTURALACTIVITY') ?? []),
69
+ ...(byType.get('IFCRELASSIGNSTOGROUP') ?? []),
70
+ ]);
71
+ for (const id of relationIds)
72
+ sourceIds.add(id);
73
+ for (const [id, mutation] of view?.getTypeMutations?.() ?? []) {
74
+ if (roleOf(mutation.newType) || mutation.newType.toUpperCase().startsWith('IFCRELCONNECTSSTRUCTURAL') || mutation.newType.toUpperCase() === 'IFCRELASSIGNSTOGROUP') {
75
+ sourceIds.add(id);
76
+ }
114
77
  }
115
- const relMemberIds = byType.get('IFCRELCONNECTSSTRUCTURALMEMBER') ?? [];
116
- const relActivityIds = byType.get('IFCRELCONNECTSSTRUCTURALACTIVITY') ?? [];
117
- const relGroupIds = byType.get('IFCRELASSIGNSTOGROUP') ?? [];
118
- // Behaviour-neutral early-out, not a guard: with no structural entity the
119
- // passes below already produce an empty extraction. It exists so the common
120
- // case — a model with no structural analysis at all — never constructs an
121
- // EntityExtractor over the whole source buffer.
122
- if (idsByRole.size === 0)
78
+ const effectiveRows = [...iterateEffectiveEntities(store, view, undefined, sourceIds)];
79
+ // Preserve the common no-structural-data path without setting up a source
80
+ // extractor. Created/retyped structural entities are already in this set.
81
+ if (!effectiveRows.some((row) => roleOf(row.type)))
123
82
  return emptyExtraction();
124
83
  const extractor = new EntityExtractor(store.source);
125
- const read = (role) => readEntities(extractor, store, idsByRole.get(role) ?? []);
84
+ const effectiveTypeById = new Map(effectiveRows.map((row) => [row.expressId, row.type]));
85
+ const readRaw = (id, effectiveType) => {
86
+ // @raw-entity-enumeration-ok the effective iterator chose this one record; source bytes supply its baseline attributes
87
+ const ref = store.entityIndex.byId.get(id) ?? store.deferredEntityIndex?.get(id);
88
+ const entity = ref ? extractor.extractEntity(ref) : undefined;
89
+ const created = !entity ? view?.getNewEntity?.(id) : null;
90
+ const source = entity ? {
91
+ expressId: id,
92
+ type: normalizeIfcTypeName(effectiveType),
93
+ attrs: entity.attributes ?? [],
94
+ globalId: asString(entity.attributes?.[0]) ?? '',
95
+ } : created ? {
96
+ expressId: id,
97
+ type: normalizeIfcTypeName(effectiveType),
98
+ attrs: [...(created.attributes ?? [])],
99
+ globalId: asString(created.attributes?.[0]) ?? '',
100
+ } : undefined;
101
+ return view?.readEntity?.(id, effectiveType, source) ?? source;
102
+ };
103
+ const activeByRole = new Map();
104
+ const relMemberIds = [];
105
+ const relActivityIds = [];
106
+ const relGroupIds = [];
107
+ for (const row of effectiveRows) {
108
+ const role = roleOf(row.type);
109
+ if (role) {
110
+ const ids = activeByRole.get(role) ?? [];
111
+ ids.push(row.expressId);
112
+ activeByRole.set(role, ids);
113
+ }
114
+ if (row.type === 'IFCRELCONNECTSSTRUCTURALMEMBER')
115
+ relMemberIds.push(row.expressId);
116
+ if (row.type === 'IFCRELCONNECTSSTRUCTURALACTIVITY')
117
+ relActivityIds.push(row.expressId);
118
+ if (row.type === 'IFCRELASSIGNSTOGROUP')
119
+ relGroupIds.push(row.expressId);
120
+ }
121
+ const read = (role) => (activeByRole.get(role) ?? []).map((id) => readRaw(id, effectiveTypeById.get(id))).filter((row) => !!row);
126
122
  const memberRaw = read('member');
127
123
  const connectionRaw = read('connection');
128
124
  const activityRaw = read('activity');
@@ -146,7 +142,7 @@ export function extractStructuralOnDemand(store) {
146
142
  // ── Relationship passes ────────────────────────────────────────────────
147
143
  const connectionsOfMember = new Map();
148
144
  const membersOfConnection = new Map();
149
- for (const rel of readEntities(extractor, store, relMemberIds)) {
145
+ for (const rel of relMemberIds.map((id) => readRaw(id, 'IFCRELCONNECTSSTRUCTURALMEMBER')).filter((row) => !!row)) {
150
146
  const memberId = asRef(readAttr(rel.type, rel.attrs, 'RelatingStructuralMember'));
151
147
  const connectionId = asRef(readAttr(rel.type, rel.attrs, 'RelatedStructuralConnection'));
152
148
  if (memberId === undefined || connectionId === undefined)
@@ -161,7 +157,7 @@ export function extractStructuralOnDemand(store) {
161
157
  const activitiesOfItem = new Map();
162
158
  /** activity expressId → the item globalId it applies to. */
163
159
  const itemOfActivity = new Map();
164
- for (const rel of readEntities(extractor, store, relActivityIds)) {
160
+ for (const rel of relActivityIds.map((id) => readRaw(id, 'IFCRELCONNECTSSTRUCTURALACTIVITY')).filter((row) => !!row)) {
165
161
  const itemId = asRef(readAttr(rel.type, rel.attrs, 'RelatingElement'));
166
162
  const activityId = asRef(readAttr(rel.type, rel.attrs, 'RelatedStructuralActivity'));
167
163
  if (itemId === undefined || activityId === undefined)
@@ -177,7 +173,7 @@ export function extractStructuralOnDemand(store) {
177
173
  // only the rows whose RelatingGroup is a structural group are read.
178
174
  const groupsOfObject = new Map();
179
175
  const objectsOfGroup = new Map();
180
- for (const rel of readEntities(extractor, store, relGroupIds)) {
176
+ for (const rel of relGroupIds.map((id) => readRaw(id, 'IFCRELASSIGNSTOGROUP')).filter((row) => !!row)) {
181
177
  const groupId = asRef(readAttr(rel.type, rel.attrs, 'RelatingGroup'));
182
178
  if (groupId === undefined)
183
179
  continue;