@ifc-lite/parser 5.2.0 → 6.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 (151) hide show
  1. package/dist/columnar-entity-preparation.d.ts +3 -0
  2. package/dist/columnar-entity-preparation.d.ts.map +1 -1
  3. package/dist/columnar-entity-preparation.js +101 -11
  4. package/dist/columnar-entity-preparation.js.map +1 -1
  5. package/dist/columnar-parser-indexes.d.ts +17 -1
  6. package/dist/columnar-parser-indexes.d.ts.map +1 -1
  7. package/dist/columnar-parser-indexes.js +31 -21
  8. package/dist/columnar-parser-indexes.js.map +1 -1
  9. package/dist/columnar-parser.d.ts +10 -1
  10. package/dist/columnar-parser.d.ts.map +1 -1
  11. package/dist/columnar-parser.js +14 -2
  12. package/dist/columnar-parser.js.map +1 -1
  13. package/dist/cost-extractor.d.ts +10 -0
  14. package/dist/cost-extractor.d.ts.map +1 -0
  15. package/dist/cost-extractor.js +369 -0
  16. package/dist/cost-extractor.js.map +1 -0
  17. package/dist/cost-schedule-2x3.d.ts +31 -0
  18. package/dist/cost-schedule-2x3.d.ts.map +1 -0
  19. package/dist/cost-schedule-2x3.js +75 -0
  20. package/dist/cost-schedule-2x3.js.map +1 -0
  21. package/dist/cost-types.d.ts +105 -0
  22. package/dist/cost-types.d.ts.map +1 -0
  23. package/dist/cost-types.js +5 -0
  24. package/dist/cost-types.js.map +1 -0
  25. package/dist/data-store-transport.d.ts +1 -0
  26. package/dist/data-store-transport.d.ts.map +1 -1
  27. package/dist/data-store-transport.js +5 -29
  28. package/dist/data-store-transport.js.map +1 -1
  29. package/dist/drop-census.d.ts +136 -0
  30. package/dist/drop-census.d.ts.map +1 -0
  31. package/dist/drop-census.js +53 -0
  32. package/dist/drop-census.js.map +1 -0
  33. package/dist/entity-scanner.d.ts.map +1 -1
  34. package/dist/entity-scanner.js +10 -5
  35. package/dist/entity-scanner.js.map +1 -1
  36. package/dist/generated/ifc2x3/schema-registry.d.ts +50 -0
  37. package/dist/generated/ifc2x3/schema-registry.d.ts.map +1 -0
  38. package/dist/generated/ifc2x3/schema-registry.js +50052 -0
  39. package/dist/generated/ifc2x3/schema-registry.js.map +1 -0
  40. package/dist/generated/ifc4x3/schema-registry.d.ts +50 -0
  41. package/dist/generated/ifc4x3/schema-registry.d.ts.map +1 -0
  42. package/dist/generated/ifc4x3/schema-registry.js +71299 -0
  43. package/dist/generated/ifc4x3/schema-registry.js.map +1 -0
  44. package/dist/generated/schema-registry-by-version.d.ts +61 -0
  45. package/dist/generated/schema-registry-by-version.d.ts.map +1 -0
  46. package/dist/generated/schema-registry-by-version.js +86 -0
  47. package/dist/generated/schema-registry-by-version.js.map +1 -0
  48. package/dist/group-assignment-factor.d.ts +13 -0
  49. package/dist/group-assignment-factor.d.ts.map +1 -0
  50. package/dist/group-assignment-factor.js +30 -0
  51. package/dist/group-assignment-factor.js.map +1 -0
  52. package/dist/ifczip.d.ts +6 -0
  53. package/dist/ifczip.d.ts.map +1 -1
  54. package/dist/ifczip.js +20 -11
  55. package/dist/ifczip.js.map +1 -1
  56. package/dist/index.d.ts +7 -2
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +13 -2
  59. package/dist/index.js.map +1 -1
  60. package/dist/on-demand-extractors.d.ts +1 -0
  61. package/dist/on-demand-extractors.d.ts.map +1 -1
  62. package/dist/on-demand-extractors.js +2 -1
  63. package/dist/on-demand-extractors.js.map +1 -1
  64. package/dist/property-value-parser.d.ts +10 -0
  65. package/dist/property-value-parser.d.ts.map +1 -1
  66. package/dist/property-value-parser.js +40 -1
  67. package/dist/property-value-parser.js.map +1 -1
  68. package/dist/scan-entities-balanced.d.ts.map +1 -1
  69. package/dist/scan-entities-balanced.js +8 -6
  70. package/dist/scan-entities-balanced.js.map +1 -1
  71. package/dist/scan-worker-lexing.d.ts +14 -0
  72. package/dist/scan-worker-lexing.d.ts.map +1 -0
  73. package/dist/scan-worker-lexing.js +101 -0
  74. package/dist/scan-worker-lexing.js.map +1 -0
  75. package/dist/scan-worker-source.d.ts +1 -1
  76. package/dist/scan-worker-source.d.ts.map +1 -1
  77. package/dist/scan-worker-source.js +61 -59
  78. package/dist/scan-worker-source.js.map +1 -1
  79. package/dist/schedule-extractor.d.ts +2 -80
  80. package/dist/schedule-extractor.d.ts.map +1 -1
  81. package/dist/schedule-extractor.js +100 -225
  82. package/dist/schedule-extractor.js.map +1 -1
  83. package/dist/schedule-serializer-builders.d.ts +28 -0
  84. package/dist/schedule-serializer-builders.d.ts.map +1 -0
  85. package/dist/schedule-serializer-builders.js +163 -0
  86. package/dist/schedule-serializer-builders.js.map +1 -0
  87. package/dist/schedule-serializer.d.ts +6 -0
  88. package/dist/schedule-serializer.d.ts.map +1 -1
  89. package/dist/schedule-serializer.js +26 -165
  90. package/dist/schedule-serializer.js.map +1 -1
  91. package/dist/schedule-types.d.ts +211 -0
  92. package/dist/schedule-types.d.ts.map +1 -0
  93. package/dist/schedule-types.js +221 -0
  94. package/dist/schedule-types.js.map +1 -0
  95. package/dist/spatial-hierarchy-ambiguity.d.ts +39 -0
  96. package/dist/spatial-hierarchy-ambiguity.d.ts.map +1 -0
  97. package/dist/spatial-hierarchy-ambiguity.js +25 -0
  98. package/dist/spatial-hierarchy-ambiguity.js.map +1 -0
  99. package/dist/spatial-hierarchy-attributes.d.ts +54 -0
  100. package/dist/spatial-hierarchy-attributes.d.ts.map +1 -0
  101. package/dist/spatial-hierarchy-attributes.js +145 -0
  102. package/dist/spatial-hierarchy-attributes.js.map +1 -0
  103. package/dist/spatial-hierarchy-builder.d.ts +0 -30
  104. package/dist/spatial-hierarchy-builder.d.ts.map +1 -1
  105. package/dist/spatial-hierarchy-builder.js +45 -167
  106. package/dist/spatial-hierarchy-builder.js.map +1 -1
  107. package/dist/spatial-hierarchy-canonical-parent.d.ts +52 -2
  108. package/dist/spatial-hierarchy-canonical-parent.d.ts.map +1 -1
  109. package/dist/spatial-hierarchy-canonical-parent.js +153 -4
  110. package/dist/spatial-hierarchy-canonical-parent.js.map +1 -1
  111. package/dist/step-lexing.d.ts +1 -1
  112. package/dist/step-lexing.d.ts.map +1 -1
  113. package/dist/step-lexing.js +1 -56
  114. package/dist/step-lexing.js.map +1 -1
  115. package/dist/step-record-boundary.d.ts +28 -0
  116. package/dist/step-record-boundary.d.ts.map +1 -0
  117. package/dist/step-record-boundary.js +108 -0
  118. package/dist/step-record-boundary.js.map +1 -0
  119. package/dist/step-record-boundary.vectors.d.ts +58 -0
  120. package/dist/step-record-boundary.vectors.d.ts.map +1 -0
  121. package/dist/step-record-boundary.vectors.js +80 -0
  122. package/dist/step-record-boundary.vectors.js.map +1 -0
  123. package/dist/structural-extractor.d.ts +9 -0
  124. package/dist/structural-extractor.d.ts.map +1 -0
  125. package/dist/structural-extractor.js +310 -0
  126. package/dist/structural-extractor.js.map +1 -0
  127. package/dist/structural-load-extractor.d.ts +147 -0
  128. package/dist/structural-load-extractor.d.ts.map +1 -0
  129. package/dist/structural-load-extractor.js +178 -0
  130. package/dist/structural-load-extractor.js.map +1 -0
  131. package/dist/structural-step-values.d.ts +51 -0
  132. package/dist/structural-step-values.d.ts.map +1 -0
  133. package/dist/structural-step-values.js +109 -0
  134. package/dist/structural-step-values.js.map +1 -0
  135. package/dist/structural-types.d.ts +145 -0
  136. package/dist/structural-types.d.ts.map +1 -0
  137. package/dist/structural-types.js +5 -0
  138. package/dist/structural-types.js.map +1 -0
  139. package/dist/tokenizer.d.ts +11 -5
  140. package/dist/tokenizer.d.ts.map +1 -1
  141. package/dist/tokenizer.js +75 -21
  142. package/dist/tokenizer.js.map +1 -1
  143. package/dist/wasm-init-retry.d.ts +6 -42
  144. package/dist/wasm-init-retry.d.ts.map +1 -1
  145. package/dist/wasm-init-retry.js +6 -99
  146. package/dist/wasm-init-retry.js.map +1 -1
  147. package/dist/wasm-panic-forward.d.ts +7 -63
  148. package/dist/wasm-panic-forward.d.ts.map +1 -1
  149. package/dist/wasm-panic-forward.js +7 -100
  150. package/dist/wasm-panic-forward.js.map +1 -1
  151. package/package.json +5 -4
@@ -0,0 +1,145 @@
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
+ * Attribute extraction for spatial hierarchy nodes - reads a node's LongName,
6
+ * its IfcBuildingStorey Elevation, and the ObjectPlacement-Z fallback
7
+ * straight off the raw IFC records via `EntityExtractor`.
8
+ *
9
+ * Split out of spatial-hierarchy-builder.ts: these three functions share one
10
+ * concern - resolving values from source bytes when a source is available -
11
+ * distinct from the tree-building recursion in `buildNode` that calls them.
12
+ * Same pattern as spatial-hierarchy-canonical-parent.ts, which split out the
13
+ * cycle-safe canonical-parent resolution for the same reason.
14
+ */
15
+ import { createLogger, IFC_BUILDING_STOREY_ELEVATION_INDEX, IFC_BUILDING_STOREY_PLACEMENT_INDEX, } from '@ifc-lite/data';
16
+ import { EntityExtractor } from './entity-extractor.js';
17
+ import { getAttributeNamesAcrossSchemas } from './ifc-schema.js';
18
+ const log = createLogger('SpatialHierarchy');
19
+ /**
20
+ * Read an entity's LongName by schema attribute *name*. IfcSite / IfcBuilding /
21
+ * IfcBuildingStorey / IfcSpace (and the IFC4.3 facility/infra containers)
22
+ * declare LongName at index 7, but IfcProject carries it at a different slot,
23
+ * so resolving by name (not a fixed index) stays correct across the IfcRoot
24
+ * family. The lookup spans every bundled schema, so IFC4.3 leaves outside the
25
+ * parser's IFC4 codegen pin resolve too. Returns the trimmed value, or
26
+ * undefined when the type declares no LongName, it is empty, or no source
27
+ * buffer is available (the buildFromCache path).
28
+ */
29
+ export function extractLongName(expressId, attrSource, attrExtractor) {
30
+ if (!attrSource || !attrExtractor)
31
+ return undefined;
32
+ const ref = attrSource.entityIndex.byId.get(expressId);
33
+ if (!ref)
34
+ return undefined;
35
+ try {
36
+ const entity = attrExtractor.extractEntity(ref);
37
+ if (!entity)
38
+ return undefined;
39
+ const idx = getAttributeNamesAcrossSchemas(entity.type).indexOf('LongName');
40
+ if (idx < 0)
41
+ return undefined;
42
+ const raw = (entity.attributes || [])[idx];
43
+ const value = typeof raw === 'string' ? raw.trim() : '';
44
+ return value.length > 0 ? value : undefined;
45
+ }
46
+ catch (error) {
47
+ log.caught('Failed to extract LongName', error, {
48
+ operation: 'extractLongName',
49
+ entityId: expressId,
50
+ });
51
+ return undefined;
52
+ }
53
+ }
54
+ /**
55
+ * Extract elevation from an IfcBuildingStorey. Elevation is attribute index 9
56
+ * in both IFC2x3 and IFC4 (GlobalId, OwnerHistory, Name, Description,
57
+ * ObjectType, ObjectPlacement, Representation, LongName, CompositionType,
58
+ * Elevation).
59
+ */
60
+ export function extractElevation(expressId, source, entityIndex) {
61
+ const ref = entityIndex.byId.get(expressId);
62
+ if (!ref)
63
+ return undefined;
64
+ try {
65
+ const extractor = new EntityExtractor(source);
66
+ const entity = extractor.extractEntity(ref);
67
+ if (!entity)
68
+ return undefined;
69
+ const attrs = entity.attributes || [];
70
+ // Number from a raw value or a typed value like ['IFCLENGTHMEASURE', 3.0].
71
+ const extractNumber = (val) => {
72
+ if (typeof val === 'number')
73
+ return val;
74
+ if (Array.isArray(val) && val.length === 2 && typeof val[1] === 'number') {
75
+ return val[1];
76
+ }
77
+ return undefined;
78
+ };
79
+ // Read ONLY the Elevation slot: a previous "scan every attribute for a
80
+ // number < 10000" fallback wrongly treated reference attributes (parsed as
81
+ // bare express-id numbers, e.g. OwnerHistory #3628 -> 3628) as elevations,
82
+ // so a storey with a null Elevation got a garbage value instead of falling
83
+ // through to the ObjectPlacement-Z fallback below (#1289).
84
+ if (attrs.length > IFC_BUILDING_STOREY_ELEVATION_INDEX) {
85
+ return extractNumber(attrs[IFC_BUILDING_STOREY_ELEVATION_INDEX]);
86
+ }
87
+ }
88
+ catch (error) {
89
+ log.caught('Failed to extract elevation', error, {
90
+ operation: 'extractElevation',
91
+ entityId: expressId,
92
+ entityType: 'IfcBuildingStorey',
93
+ });
94
+ }
95
+ return undefined;
96
+ }
97
+ /**
98
+ * Resolve a storey's elevation from its ObjectPlacement, used as a fallback when
99
+ * the Elevation attribute is null. Walks
100
+ * IfcBuildingStorey.ObjectPlacement (IfcLocalPlacement)
101
+ * -> RelativePlacement (IfcAxis2Placement3D)
102
+ * -> Location (IfcCartesianPoint).Coordinates[2]
103
+ * i.e. the storey's Z relative to its parent spatial container, which matches
104
+ * the semantics of the Elevation attribute and avoids folding in any site-level
105
+ * georeferencing Z. Returns the raw (unscaled) Z, or undefined when the chain
106
+ * can't be resolved.
107
+ */
108
+ export function extractPlacementElevation(expressId, source, entityIndex) {
109
+ try {
110
+ const extractor = new EntityExtractor(source);
111
+ const readAttrs = (id) => {
112
+ const ref = entityIndex.byId.get(id);
113
+ if (!ref)
114
+ return undefined;
115
+ return extractor.extractEntity(ref)?.attributes ?? undefined;
116
+ };
117
+ const placementId = readAttrs(expressId)?.[IFC_BUILDING_STOREY_PLACEMENT_INDEX];
118
+ if (typeof placementId !== 'number')
119
+ return undefined;
120
+ // IfcLocalPlacement(PlacementRelTo, RelativePlacement) - RelativePlacement
121
+ // (index 1) is the IfcAxis2Placement3D carrying this storey's own offset.
122
+ const axisId = readAttrs(placementId)?.[1];
123
+ if (typeof axisId !== 'number')
124
+ return undefined;
125
+ // IfcAxis2Placement3D(Location, Axis, RefDirection) - Location (index 0) is
126
+ // an IfcCartesianPoint.
127
+ const locationId = readAttrs(axisId)?.[0];
128
+ if (typeof locationId !== 'number')
129
+ return undefined;
130
+ // IfcCartesianPoint.Coordinates (index 0) is a list [x, y, z].
131
+ const coords = readAttrs(locationId)?.[0];
132
+ if (Array.isArray(coords) && coords.length >= 3 && typeof coords[2] === 'number') {
133
+ return coords[2];
134
+ }
135
+ }
136
+ catch (error) {
137
+ log.caught('Failed to extract placement elevation', error, {
138
+ operation: 'extractPlacementElevation',
139
+ entityId: expressId,
140
+ entityType: 'IfcBuildingStorey',
141
+ });
142
+ }
143
+ return undefined;
144
+ }
145
+ //# sourceMappingURL=spatial-hierarchy-attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spatial-hierarchy-attributes.js","sourceRoot":"","sources":["../src/spatial-hierarchy-attributes.ts"],"names":[],"mappings":"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"}
@@ -30,35 +30,5 @@ export declare class SpatialHierarchyBuilder {
30
30
  buildFromCache(entities: EntityTable, relationships: RelationshipGraph): SpatialHierarchy | undefined;
31
31
  private assemble;
32
32
  private buildNode;
33
- /**
34
- * Read an entity's LongName by schema attribute *name*. IfcSite / IfcBuilding /
35
- * IfcBuildingStorey / IfcSpace (and the IFC4.3 facility/infra containers)
36
- * declare LongName at index 7, but IfcProject carries it at a different slot,
37
- * so resolving by name (not a fixed index) stays correct across the IfcRoot
38
- * family. The lookup spans every bundled schema, so IFC4.3 leaves outside the
39
- * parser's IFC4 codegen pin resolve too. Returns the trimmed value, or
40
- * undefined when the type declares no LongName, it is empty, or no source
41
- * buffer is available (the buildFromCache path).
42
- */
43
- private extractLongName;
44
- /**
45
- * Extract elevation from an IfcBuildingStorey. Elevation is attribute index 9
46
- * in both IFC2x3 and IFC4 (GlobalId, OwnerHistory, Name, Description,
47
- * ObjectType, ObjectPlacement, Representation, LongName, CompositionType,
48
- * Elevation).
49
- */
50
- private extractElevation;
51
- /**
52
- * Resolve a storey's elevation from its ObjectPlacement, used as a fallback when
53
- * the Elevation attribute is null. Walks
54
- * IfcBuildingStorey.ObjectPlacement (IfcLocalPlacement)
55
- * -> RelativePlacement (IfcAxis2Placement3D)
56
- * -> Location (IfcCartesianPoint).Coordinates[2]
57
- * i.e. the storey's Z relative to its parent spatial container, which matches
58
- * the semantics of the Elevation attribute and avoids folding in any site-level
59
- * georeferencing Z. Returns the raw (unscaled) Z, or undefined when the chain
60
- * can't be resolved.
61
- */
62
- private extractPlacementElevation;
63
33
  }
64
34
  //# sourceMappingURL=spatial-hierarchy-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spatial-hierarchy-builder.d.ts","sourceRoot":"","sources":["../src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAajH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAmCxD,qBAAa,uBAAuB;IAClC;;;;;OAKG;IACH,KAAK,CACH,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,EAChC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,WAAW,EAAE;QAAE,IAAI,EAAE;YAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;SAAE,CAAA;KAAE,EACxE,eAAe,GAAE,MAAY,GAC5B,gBAAgB;IAMnB;;;OAGG;IACH,cAAc,CACZ,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,GAC/B,gBAAgB,GAAG,SAAS;IAI/B,OAAO,CAAC,QAAQ;IAoGhB,OAAO,CAAC,SAAS;IA8JjB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IAqBvB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IA2CxB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,yBAAyB;CAyClC"}
1
+ {"version":3,"file":"spatial-hierarchy-builder.d.ts","sourceRoot":"","sources":["../src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAWjH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAiCxD,qBAAa,uBAAuB;IAClC;;;;;OAKG;IACH,KAAK,CACH,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,EAChC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,UAAU,GAAG,cAAc,EACnC,WAAW,EAAE;QAAE,IAAI,EAAE;YAAE,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;SAAE,CAAA;KAAE,EACxE,eAAe,GAAE,MAAY,GAC5B,gBAAgB;IAMnB;;;OAGG;IACH,cAAc,CACZ,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,GAC/B,gBAAgB,GAAG,SAAS;IAI/B,OAAO,CAAC,QAAQ;IA6EhB,OAAO,CAAC,SAAS;CAwLlB"}
@@ -1,11 +1,11 @@
1
1
  /* This Source Code Form is subject to the terms of the Mozilla Public
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
- import { IfcTypeEnum, RelationshipType, createLogger, isBuildingLikeSpatialType, isSpaceLikeSpatialType, isSpatialStructureType, isStoreyLikeSpatialType, IFC_BUILDING_STOREY_ELEVATION_INDEX, IFC_BUILDING_STOREY_PLACEMENT_INDEX, findStoreyByElevation, } from '@ifc-lite/data';
4
+ import { IfcTypeEnum, RelationshipType, isBuildingLikeSpatialType, isSpaceLikeSpatialType, isSpatialStructureType, isStoreyLikeSpatialType, findStoreyByElevation, spatialLookups, } from '@ifc-lite/data';
5
5
  import { EntityExtractor } from './entity-extractor.js';
6
- import { getAttributeNamesAcrossSchemas } from './ifc-schema.js';
7
- import { computeCanonicalParent } from './spatial-hierarchy-canonical-parent.js';
8
- const log = createLogger('SpatialHierarchy');
6
+ import { computeCanonicalParent, computeReachableSpatialNodes } from './spatial-hierarchy-canonical-parent.js';
7
+ import { extractLongName, extractElevation, extractPlacementElevation, } from './spatial-hierarchy-attributes.js';
8
+ import { computeAmbiguousStorey } from './spatial-hierarchy-ambiguity.js';
9
9
  export class SpatialHierarchyBuilder {
10
10
  /**
11
11
  * Fresh-parse build. Extracts storey elevations from the source buffer.
@@ -38,6 +38,7 @@ export class SpatialHierarchyBuilder {
38
38
  elementToContainer: new Map(),
39
39
  visited: new Set(),
40
40
  canonicalParent: computeCanonicalParent(entities, relationships),
41
+ reachableSpatialNodes: new Set(), // filled in below once IfcProject is known
41
42
  attrSource,
42
43
  attrExtractor: attrSource ? new EntityExtractor(attrSource.source) : undefined,
43
44
  };
@@ -49,6 +50,10 @@ export class SpatialHierarchyBuilder {
49
50
  }
50
51
  return undefined;
51
52
  }
53
+ // Which storeys buildNode will actually recurse into, computed up front
54
+ // so ContainsElements resolution below never depends on this node's own
55
+ // position in the traversal (#4310) - see computeReachableSpatialNodes.
56
+ ctx.reachableSpatialNodes = computeReachableSpatialNodes(projectIds[0], ctx.canonicalParent);
52
57
  const projectNode = this.buildNode(projectIds[0], ctx);
53
58
  if (ctx.byStorey.size === 0) {
54
59
  console.warn('[SpatialHierarchyBuilder] No storeys found in spatial hierarchy');
@@ -57,13 +62,6 @@ export class SpatialHierarchyBuilder {
57
62
  console.warn('[SpatialHierarchyBuilder] No buildings found in spatial hierarchy');
58
63
  }
59
64
  const { byStorey, byBuilding, bySite, bySpace, storeyElevations, elementToStorey, elementToContainer } = ctx;
60
- // Pre-build the element -> space lookup for O(1) getContainingSpace.
61
- const elementToSpace = new Map();
62
- for (const [spaceId, elementIds] of bySpace) {
63
- for (const elementId of elementIds) {
64
- elementToSpace.set(elementId, spaceId);
65
- }
66
- }
67
65
  return {
68
66
  project: projectNode,
69
67
  byStorey,
@@ -75,6 +73,7 @@ export class SpatialHierarchyBuilder {
75
73
  storeyHeights: new Map(),
76
74
  elementToStorey,
77
75
  elementToContainer,
76
+ ambiguousStorey: computeAmbiguousStorey(byStorey), // #4311
78
77
  getStoreyElements(storeyId) {
79
78
  return byStorey.get(storeyId) ?? [];
80
79
  },
@@ -84,29 +83,7 @@ export class SpatialHierarchyBuilder {
84
83
  // Z can never resolve to a different storey depending on entry path.
85
84
  return findStoreyByElevation(storeyElevations, z);
86
85
  },
87
- getContainingSpace(elementId) {
88
- return elementToSpace.get(elementId) ?? null;
89
- },
90
- getPath(elementId) {
91
- const path = [];
92
- const findPath = (node, targetId) => {
93
- path.push(node);
94
- // Match the node itself (so a promoted space/zone resolves) or one of
95
- // its contained elements.
96
- if (node.expressId === targetId || node.elements.includes(targetId)) {
97
- return true;
98
- }
99
- for (const child of node.children) {
100
- if (findPath(child, targetId)) {
101
- return true;
102
- }
103
- }
104
- path.pop();
105
- return false;
106
- };
107
- findPath(projectNode, elementId);
108
- return path;
109
- },
86
+ ...spatialLookups(projectNode, bySpace, elementToContainer),
110
87
  };
111
88
  }
112
89
  buildNode(expressId, ctx) {
@@ -118,17 +95,23 @@ export class SpatialHierarchyBuilder {
118
95
  // show both (issue #1634). It lives only in the raw record, so it needs the
119
96
  // source bytes; the source-less buildFromCache fallback leaves it undefined,
120
97
  // exactly like storey elevation.
121
- const rawLongName = this.extractLongName(expressId, ctx);
98
+ const rawLongName = extractLongName(expressId, ctx.attrSource, ctx.attrExtractor);
122
99
  // Fall back to LongName when Name is empty (common for IfcSpace). Left
123
100
  // empty, not a fabricated `Entity #<id>` — it flows into the export layer.
124
101
  const name = rawName || rawLongName || '';
125
102
  // Only keep LongName as a distinct descriptor when it adds something beyond
126
103
  // the primary label (never duplicate it into the secondary slot).
127
104
  const longName = rawLongName && rawLongName !== name ? rawLongName : undefined;
128
- // Guard against cyclic IfcRelAggregates chains (A aggregates B, B aggregates
129
- // A), which would otherwise recurse unbounded and overflow the stack. A
130
- // revisited node is returned as a leaf so the rest of the hierarchy still
131
- // builds.
105
+ // This is NOT what actually prevents unbounded recursion on a cyclic
106
+ // IfcRelAggregates chain (A aggregates B, B aggregates A) - it never
107
+ // fires today. Recursion here only ever follows a node's ONE canonical
108
+ // parent (computeCanonicalParent in spatial-hierarchy-canonical-parent.ts
109
+ // picks exactly one, and skips any candidate that would close a cycle
110
+ // back through the child, #4246), so a cycle can supply at most one
111
+ // recursion edge into any node - which structurally cannot loop. Kept as
112
+ // defence in depth in case that single-parent invariant is ever
113
+ // weakened; if it does fire, a revisited node is returned as a leaf so
114
+ // the rest of the hierarchy still builds.
132
115
  if (ctx.visited.has(expressId)) {
133
116
  return { expressId, type: typeEnum, name, longName, elevation: undefined, children: [], elements: [] };
134
117
  }
@@ -137,12 +120,12 @@ export class SpatialHierarchyBuilder {
137
120
  let elevation;
138
121
  if (typeEnum === IfcTypeEnum.IfcBuildingStorey && ctx.attrSource) {
139
122
  const { source, entityIndex, lengthUnitScale } = ctx.attrSource;
140
- let rawElevation = this.extractElevation(expressId, source, entityIndex);
123
+ let rawElevation = extractElevation(expressId, source, entityIndex);
141
124
  if (rawElevation === undefined) {
142
125
  // Elevation is optional and frequently null (Revit / ArchiCAD). Fall back
143
126
  // to the storey's Z from its ObjectPlacement so it still orders + lifts in
144
127
  // Exploded mode instead of collapsing to a single floor (#1289).
145
- rawElevation = this.extractPlacementElevation(expressId, source, entityIndex);
128
+ rawElevation = extractPlacementElevation(expressId, source, entityIndex);
146
129
  }
147
130
  if (rawElevation !== undefined) {
148
131
  elevation = rawElevation * lengthUnitScale;
@@ -205,6 +188,27 @@ export class SpatialHierarchyBuilder {
205
188
  }
206
189
  if (isStoreyLikeSpatialType(typeEnum)) {
207
190
  for (const elementId of containedElements) {
191
+ // First-declared wins on duplicate containment, matching containedIn()
192
+ // (#4248) - but only among storeys buildNode actually visits. A
193
+ // first-declared edge naming an unreachable storey (no path back to
194
+ // IfcProject, e.g. missing its own IfcRelAggregates edge) is not a
195
+ // real competing answer: buildNode never runs that storey's own
196
+ // branch, so nothing would ever claim the element there, and the
197
+ // element must not be dropped just because a later-declared but
198
+ // VIABLE storey lost a tie to a candidate that can't win (#4310).
199
+ // Only storey-like containers compete: a reachable IfcSpace edge
200
+ // declared first is not a storey answer, and letting it win here
201
+ // would leave the element with no elementToStorey entry at all
202
+ // (spaces never run this branch).
203
+ const containerEdges = relationships.inverse.getEdges(elementId, RelationshipType.ContainsElements);
204
+ const firstViableContainer = containerEdges.find((edge) => ctx.reachableSpatialNodes.has(edge.target) && isStoreyLikeSpatialType(entities.getTypeEnum(edge.target)));
205
+ // expressId is always reachable here (buildNode only runs on reachable
206
+ // nodes) and always has an edge to elementId (elementId came from THIS
207
+ // storey's own containedElements), so firstViableContainer is always
208
+ // defined - it can never fall through to the pre-#4310 "assign
209
+ // unconditionally" behavior by surprise.
210
+ if (firstViableContainer && firstViableContainer.target !== expressId)
211
+ continue; // a viable earlier-declared storey wins instead
208
212
  ctx.elementToStorey.set(elementId, expressId);
209
213
  // Propagate the storey assignment to aggregated descendants (e.g. an
210
214
  // IfcBuildingElementPart child of an IfcWall). Without this, parts have no
@@ -266,131 +270,5 @@ export class SpatialHierarchyBuilder {
266
270
  }
267
271
  return { expressId, type: typeEnum, name, longName, elevation, children: childNodes, elements: containedElements };
268
272
  }
269
- /**
270
- * Read an entity's LongName by schema attribute *name*. IfcSite / IfcBuilding /
271
- * IfcBuildingStorey / IfcSpace (and the IFC4.3 facility/infra containers)
272
- * declare LongName at index 7, but IfcProject carries it at a different slot,
273
- * so resolving by name (not a fixed index) stays correct across the IfcRoot
274
- * family. The lookup spans every bundled schema, so IFC4.3 leaves outside the
275
- * parser's IFC4 codegen pin resolve too. Returns the trimmed value, or
276
- * undefined when the type declares no LongName, it is empty, or no source
277
- * buffer is available (the buildFromCache path).
278
- */
279
- extractLongName(expressId, ctx) {
280
- if (!ctx.attrSource || !ctx.attrExtractor)
281
- return undefined;
282
- const ref = ctx.attrSource.entityIndex.byId.get(expressId);
283
- if (!ref)
284
- return undefined;
285
- try {
286
- const entity = ctx.attrExtractor.extractEntity(ref);
287
- if (!entity)
288
- return undefined;
289
- const idx = getAttributeNamesAcrossSchemas(entity.type).indexOf('LongName');
290
- if (idx < 0)
291
- return undefined;
292
- const raw = (entity.attributes || [])[idx];
293
- const value = typeof raw === 'string' ? raw.trim() : '';
294
- return value.length > 0 ? value : undefined;
295
- }
296
- catch (error) {
297
- log.caught('Failed to extract LongName', error, {
298
- operation: 'extractLongName',
299
- entityId: expressId,
300
- });
301
- return undefined;
302
- }
303
- }
304
- /**
305
- * Extract elevation from an IfcBuildingStorey. Elevation is attribute index 9
306
- * in both IFC2x3 and IFC4 (GlobalId, OwnerHistory, Name, Description,
307
- * ObjectType, ObjectPlacement, Representation, LongName, CompositionType,
308
- * Elevation).
309
- */
310
- extractElevation(expressId, source, entityIndex) {
311
- const ref = entityIndex.byId.get(expressId);
312
- if (!ref)
313
- return undefined;
314
- try {
315
- const extractor = new EntityExtractor(source);
316
- const entity = extractor.extractEntity(ref);
317
- if (!entity)
318
- return undefined;
319
- const attrs = entity.attributes || [];
320
- // Number from a raw value or a typed value like ['IFCLENGTHMEASURE', 3.0].
321
- const extractNumber = (val) => {
322
- if (typeof val === 'number')
323
- return val;
324
- if (Array.isArray(val) && val.length === 2 && typeof val[1] === 'number') {
325
- return val[1];
326
- }
327
- return undefined;
328
- };
329
- // Read ONLY the Elevation slot: a previous "scan every attribute for a
330
- // number < 10000" fallback wrongly treated reference attributes (parsed as
331
- // bare express-id numbers, e.g. OwnerHistory #3628 -> 3628) as elevations,
332
- // so a storey with a null Elevation got a garbage value instead of falling
333
- // through to the ObjectPlacement-Z fallback below (#1289).
334
- if (attrs.length > IFC_BUILDING_STOREY_ELEVATION_INDEX) {
335
- return extractNumber(attrs[IFC_BUILDING_STOREY_ELEVATION_INDEX]);
336
- }
337
- }
338
- catch (error) {
339
- log.caught('Failed to extract elevation', error, {
340
- operation: 'extractElevation',
341
- entityId: expressId,
342
- entityType: 'IfcBuildingStorey',
343
- });
344
- }
345
- return undefined;
346
- }
347
- /**
348
- * Resolve a storey's elevation from its ObjectPlacement, used as a fallback when
349
- * the Elevation attribute is null. Walks
350
- * IfcBuildingStorey.ObjectPlacement (IfcLocalPlacement)
351
- * -> RelativePlacement (IfcAxis2Placement3D)
352
- * -> Location (IfcCartesianPoint).Coordinates[2]
353
- * i.e. the storey's Z relative to its parent spatial container, which matches
354
- * the semantics of the Elevation attribute and avoids folding in any site-level
355
- * georeferencing Z. Returns the raw (unscaled) Z, or undefined when the chain
356
- * can't be resolved.
357
- */
358
- extractPlacementElevation(expressId, source, entityIndex) {
359
- try {
360
- const extractor = new EntityExtractor(source);
361
- const readAttrs = (id) => {
362
- const ref = entityIndex.byId.get(id);
363
- if (!ref)
364
- return undefined;
365
- return extractor.extractEntity(ref)?.attributes ?? undefined;
366
- };
367
- const placementId = readAttrs(expressId)?.[IFC_BUILDING_STOREY_PLACEMENT_INDEX];
368
- if (typeof placementId !== 'number')
369
- return undefined;
370
- // IfcLocalPlacement(PlacementRelTo, RelativePlacement) - RelativePlacement
371
- // (index 1) is the IfcAxis2Placement3D carrying this storey's own offset.
372
- const axisId = readAttrs(placementId)?.[1];
373
- if (typeof axisId !== 'number')
374
- return undefined;
375
- // IfcAxis2Placement3D(Location, Axis, RefDirection) - Location (index 0) is
376
- // an IfcCartesianPoint.
377
- const locationId = readAttrs(axisId)?.[0];
378
- if (typeof locationId !== 'number')
379
- return undefined;
380
- // IfcCartesianPoint.Coordinates (index 0) is a list [x, y, z].
381
- const coords = readAttrs(locationId)?.[0];
382
- if (Array.isArray(coords) && coords.length >= 3 && typeof coords[2] === 'number') {
383
- return coords[2];
384
- }
385
- }
386
- catch (error) {
387
- log.caught('Failed to extract placement elevation', error, {
388
- operation: 'extractPlacementElevation',
389
- entityId: expressId,
390
- entityType: 'IfcBuildingStorey',
391
- });
392
- }
393
- return undefined;
394
- }
395
273
  }
396
274
  //# sourceMappingURL=spatial-hierarchy-builder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spatial-hierarchy-builder.js","sourceRoot":"","sources":["../src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spatial-hierarchy-builder.js","sourceRoot":"","sources":["../src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,27 @@
3
3
  * under the module-size budget, #4095).
4
4
  */
5
5
  import type { EntityTable, RelationshipGraph } from '@ifc-lite/data';
6
+ /**
7
+ * Is `candidateParent` reachable from `childId` by walking forward
8
+ * `IfcRelAggregates` edges (i.e. is `childId` an ANCESTOR of `candidateParent`
9
+ * in the raw, unresolved aggregation graph)? Used only to disqualify a tied
10
+ * candidate parent that would close a cycle back through the child itself -
11
+ * see the doc comment on `computeCanonicalParent` for why that specific shape
12
+ * needs a check at all. Bounded to `childId`'s own (raw) aggregation
13
+ * subtree, so it only costs anything on an already-malformed file where a
14
+ * child has more than one candidate Aggregates parent - the common case
15
+ * (one candidate) never calls this.
16
+ */
17
+ /**
18
+ * Upper bound on aggregate-graph node visits spent on back-edge cycle checks
19
+ * for one file. The check only runs for children named by MORE THAN ONE
20
+ * IfcRelAggregates (already malformed), and costs one descendant walk per
21
+ * such child - O(V+E) each - so a crafted file with thousands of contested
22
+ * children could otherwise burn O(C·(V+E)). Past the budget the resolver
23
+ * falls back to plain first-declared-wins (the pre-#4285 behaviour) and says
24
+ * so once, instead of stalling the parse.
25
+ */
26
+ export declare const CYCLE_CHECK_VISIT_BUDGET = 2000000;
6
27
  /**
7
28
  * Resolve each spatial-structure entity's ONE canonical parent, globally,
8
29
  * before any recursion starts - so the result cannot depend on traversal
@@ -21,7 +42,19 @@ import type { EntityTable, RelationshipGraph } from '@ifc-lite/data';
21
42
  * sort is stable per key (`relationship-graph.ts`) - it scatters edges
22
43
  * for the same child in the order they were appended, never
23
44
  * reordering by id. So `edges[0]` for a given child is the
24
- * first-declared parent edge; no id comparison is needed or correct.
45
+ * first-declared parent edge; no id comparison is needed or correct -
46
+ * EXCEPT that a candidate closing a cycle back through the child is
47
+ * skipped first (see `aggregatedDescendants`, #4246): a mutual or
48
+ * longer aggregation back-edge cannot win a tie against a candidate that
49
+ * doesn't orphan the child's own subtree from itself. Each time that
50
+ * happens, a warning is logged (always-visible, like the existing
51
+ * "No storeys/buildings found" warnings below) naming the child and the
52
+ * disqualified candidate - the only signal a caller gets that a
53
+ * malformed back-edge was found and repaired, short of building a
54
+ * dedicated report (out of scope here; see the #4208 semantic drop
55
+ * census for that shape of reporting - a different layer: per-STEP-class
56
+ * scan/retain counts collected during columnar categorization, not a
57
+ * graph-repair event like this one).
25
58
  * 2. Only when a child has NO aggregates edge at all does a containment edge
26
59
  * (IfcRelContainedInSpatialStructure targeting a spatial-structure type -
27
60
  * the Revit Family/Dynamo `IfcSpace`/`IfcSpatialZone` pattern, #1075)
@@ -32,5 +65,22 @@ import type { EntityTable, RelationshipGraph } from '@ifc-lite/data';
32
65
  * names the child drops the edge instead of adding an empty-stub duplicate
33
66
  * (#4095).
34
67
  */
35
- export declare function computeCanonicalParent(entities: EntityTable, relationships: RelationshipGraph): Map<number, number>;
68
+ export declare function computeCanonicalParent(entities: EntityTable, relationships: RelationshipGraph, options?: {
69
+ cycleCheckVisitBudget?: number;
70
+ }): Map<number, number>;
71
+ /**
72
+ * Which spatial-structure nodes will `SpatialHierarchyBuilder.buildNode`
73
+ * actually visit, starting from `projectId`? Mirrors `addSpatialChild`
74
+ * exactly: a node is visited iff it is `projectId` itself, or its
75
+ * `canonicalParent` entry points to an already-visited node - the same
76
+ * check `addSpatialChild` makes before recursing (`canonicalParent.get
77
+ * (childId) === expressId`). Computed as one forward walk over
78
+ * `canonicalParent` (childId -> parentId) up front, so a storey's
79
+ * reachability never depends on where in the traversal it happens to sit
80
+ * (#4310): a node named only by an unreachable storey - one with no path
81
+ * back to `projectId`, e.g. a malformed file where a storey has no
82
+ * `IfcRelAggregates` edge at all - is never in this set, exactly as
83
+ * `buildNode` would never recurse into it.
84
+ */
85
+ export declare function computeReachableSpatialNodes(projectId: number, canonicalParent: Map<number, number>): Set<number>;
36
86
  //# sourceMappingURL=spatial-hierarchy-canonical-parent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spatial-hierarchy-canonical-parent.d.ts","sourceRoot":"","sources":["../src/spatial-hierarchy-canonical-parent.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGrE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAmCnH"}
1
+ {"version":3,"file":"spatial-hierarchy-canonical-parent.d.ts","sourceRoot":"","sources":["../src/spatial-hierarchy-canonical-parent.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAKrE;;;;;;;;;;GAUG;AACH;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,UAAY,CAAC;AA4BlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,EAChC,OAAO,GAAE;IAAE,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CA6FrB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GACnC,GAAG,CAAC,MAAM,CAAC,CAsBb"}