@ifc-lite/parser 3.9.0 → 3.10.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/dist/columnar-parser-attributes.d.ts.map +1 -1
- package/dist/columnar-parser-attributes.js +5 -1
- package/dist/columnar-parser-attributes.js.map +1 -1
- package/dist/columnar-parser.d.ts +8 -4
- package/dist/columnar-parser.d.ts.map +1 -1
- package/dist/columnar-parser.js +38 -3
- package/dist/columnar-parser.js.map +1 -1
- package/dist/data-store-transport.d.ts +1 -1
- package/dist/data-store-transport.d.ts.map +1 -1
- package/dist/deterministic-global-id.d.ts.map +1 -1
- package/dist/deterministic-global-id.js +26 -11
- package/dist/deterministic-global-id.js.map +1 -1
- package/dist/ifczip.d.ts +19 -0
- package/dist/ifczip.d.ts.map +1 -1
- package/dist/ifczip.js +81 -14
- package/dist/ifczip.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/material-resolver.d.ts +27 -3
- package/dist/material-resolver.d.ts.map +1 -1
- package/dist/material-resolver.js +277 -81
- package/dist/material-resolver.js.map +1 -1
- package/dist/on-demand-extractors.d.ts +2 -2
- package/dist/on-demand-extractors.d.ts.map +1 -1
- package/dist/on-demand-extractors.js +12 -7
- package/dist/on-demand-extractors.js.map +1 -1
- package/dist/scan-worker-inline.d.ts +8 -0
- package/dist/scan-worker-inline.d.ts.map +1 -1
- package/dist/scan-worker-inline.js +18 -4
- package/dist/scan-worker-inline.js.map +1 -1
- package/dist/source-header.d.ts.map +1 -1
- package/dist/source-header.js +71 -2
- package/dist/source-header.js.map +1 -1
- package/package.json +5 -5
package/dist/ifczip.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ifczip.js","sourceRoot":"","sources":["../src/ifczip.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D
|
|
1
|
+
{"version":3,"file":"ifczip.js","sourceRoot":"","sources":["../src/ifczip.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { unwrapIfcZip, unwrapIfcZipView } from './ifczip.js';
|
|
1
|
+
export { unwrapIfcZip, unwrapIfcZipView, unwrapIfcZipWithResources } from './ifczip.js';
|
|
2
|
+
export type { IfcZipContents } from './ifczip.js';
|
|
2
3
|
export { StepTokenizer } from './tokenizer.js';
|
|
3
4
|
export { EntityIndexBuilder } from './entity-index.js';
|
|
4
5
|
export { EntityExtractor } from './entity-extractor.js';
|
|
@@ -12,7 +13,7 @@ export { RelationshipExtractor } from './relationship-extractor.js';
|
|
|
12
13
|
export { SpatialHierarchyBuilder } from './spatial-hierarchy-builder.js';
|
|
13
14
|
export { extractLengthUnitScale } from './unit-extractor.js';
|
|
14
15
|
export { extractProjectUnits, measureUnit, ProjectUnits, type ResolvedUnit, type MeasureUnit, } from './project-units.js';
|
|
15
|
-
export { ColumnarParser, type IfcDataStore, type EntityByIdIndex, extractPropertiesOnDemand, extractQuantitiesOnDemand, extractEntityAttributesOnDemand, extractAllEntityAttributes, getRawNamedAttributes, extractRootAttributesFromEntity, extractClassificationsOnDemand, extractMaterialsOnDemand, extractMaterialPropertiesOnDemand, extractMaterialPropertiesForMaterialId, resolveMaterialDefId, collectMaterialLeaves, buildMaterialUsageIndex, getMaterialDisplay, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractTypeQuantitiesOnDemand, extractDocumentsOnDemand, extractRelationshipsOnDemand, extractGroupMembersOnDemand, extractGeoreferencingOnDemand, type ClassificationInfo, type MaterialInfo, type MaterialLayerInfo, type MaterialProfileInfo, type MaterialConstituentInfo, type MaterialPsetGroup, type MaterialLeaf, type MaterialUsage, type TypePropertyInfo, type TypeQuantityInfo, type DocumentInfo, type EntityRelationships, type GroupMember } from './columnar-parser.js';
|
|
16
|
+
export { ColumnarParser, type IfcDataStore, type EntityByIdIndex, extractPropertiesOnDemand, extractQuantitiesOnDemand, extractEntityAttributesOnDemand, extractAllEntityAttributes, getRawNamedAttributes, extractRootAttributesFromEntity, extractClassificationsOnDemand, extractMaterialsOnDemand, extractAllMaterialsOnDemand, extractMaterialPropertiesOnDemand, extractMaterialPropertiesForMaterialId, resolveMaterialDefId, resolveAllMaterialDefIds, collectMaterialLeaves, buildMaterialUsageIndex, getMaterialDisplay, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractTypeQuantitiesOnDemand, extractDocumentsOnDemand, extractRelationshipsOnDemand, extractGroupMembersOnDemand, extractGeoreferencingOnDemand, type ClassificationInfo, type MaterialInfo, type MaterialLayerInfo, type MaterialProfileInfo, type MaterialConstituentInfo, type MaterialPsetGroup, type MaterialLeaf, type MaterialUsage, type TypePropertyInfo, type TypeQuantityInfo, type DocumentInfo, type EntityRelationships, type GroupMember } from './columnar-parser.js';
|
|
16
17
|
export type { IfcStoreBase, IfcSourceHeader, SpatialHierarchy, EntityTable } from '@ifc-lite/data';
|
|
17
18
|
export { parseSourceHeader } from './source-header.js';
|
|
18
19
|
export { attachDataStoreAccessors, type IfcStoreData } from './data-store-accessors.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import { unwrapIfcZip } from './ifczip.js';
|
|
|
11
11
|
// magic-byte predicate `isZipBuffer` stays internal to `./ifczip.js` — no
|
|
12
12
|
// external consumer needs to know WHETHER a buffer was a zip, only to get the
|
|
13
13
|
// unwrapped bytes back.
|
|
14
|
-
export { unwrapIfcZip, unwrapIfcZipView } from './ifczip.js';
|
|
14
|
+
export { unwrapIfcZip, unwrapIfcZipView, unwrapIfcZipWithResources } from './ifczip.js';
|
|
15
15
|
export { StepTokenizer } from './tokenizer.js';
|
|
16
16
|
export { EntityIndexBuilder } from './entity-index.js';
|
|
17
17
|
export { EntityExtractor } from './entity-extractor.js';
|
|
@@ -24,7 +24,7 @@ export { RelationshipExtractor } from './relationship-extractor.js';
|
|
|
24
24
|
export { SpatialHierarchyBuilder } from './spatial-hierarchy-builder.js';
|
|
25
25
|
export { extractLengthUnitScale } from './unit-extractor.js';
|
|
26
26
|
export { extractProjectUnits, measureUnit, ProjectUnits, } from './project-units.js';
|
|
27
|
-
export { ColumnarParser, extractPropertiesOnDemand, extractQuantitiesOnDemand, extractEntityAttributesOnDemand, extractAllEntityAttributes, getRawNamedAttributes, extractRootAttributesFromEntity, extractClassificationsOnDemand, extractMaterialsOnDemand, extractMaterialPropertiesOnDemand, extractMaterialPropertiesForMaterialId, resolveMaterialDefId, collectMaterialLeaves, buildMaterialUsageIndex, getMaterialDisplay, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractTypeQuantitiesOnDemand, extractDocumentsOnDemand, extractRelationshipsOnDemand, extractGroupMembersOnDemand, extractGeoreferencingOnDemand } from './columnar-parser.js';
|
|
27
|
+
export { ColumnarParser, extractPropertiesOnDemand, extractQuantitiesOnDemand, extractEntityAttributesOnDemand, extractAllEntityAttributes, getRawNamedAttributes, extractRootAttributesFromEntity, extractClassificationsOnDemand, extractMaterialsOnDemand, extractAllMaterialsOnDemand, extractMaterialPropertiesOnDemand, extractMaterialPropertiesForMaterialId, resolveMaterialDefId, resolveAllMaterialDefIds, collectMaterialLeaves, buildMaterialUsageIndex, getMaterialDisplay, extractTypePropertiesOnDemand, extractTypeEntityOwnProperties, extractTypeQuantitiesOnDemand, extractDocumentsOnDemand, extractRelationshipsOnDemand, extractGroupMembersOnDemand, extractGeoreferencingOnDemand } from './columnar-parser.js';
|
|
28
28
|
export { parseSourceHeader } from './source-header.js';
|
|
29
29
|
export { attachDataStoreAccessors } from './data-store-accessors.js';
|
|
30
30
|
export { createSyntheticDataStore } from './synthetic-data-store.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,gFAAgF;AAChF,wEAAwE;AACxE,0EAA0E;AAC1E,8EAA8E;AAC9E,wBAAwB;AACxB,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,12 +46,32 @@ export interface MaterialConstituentInfo {
|
|
|
46
46
|
/** IfcMaterial.Category — see above. */
|
|
47
47
|
materialCategory?: string;
|
|
48
48
|
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve ALL material definition ids for an entity: every occurrence-level
|
|
51
|
+
* IfcRelAssociatesMaterial (elements may legally carry more than one), or —
|
|
52
|
+
* when the occurrence has none — the associations of its type
|
|
53
|
+
* (IfcRelDefinesByType), matching {@link extractMaterialsOnDemand}'s
|
|
54
|
+
* occurrence-overrides-type precedence. Ordered by rel express id, so
|
|
55
|
+
* index 0 is the entity's deterministic "primary" material definition.
|
|
56
|
+
*/
|
|
57
|
+
export declare function resolveAllMaterialDefIds(store: IfcDataStore, entityId: number): number[];
|
|
58
|
+
/**
|
|
59
|
+
* Extract EVERY material association for an entity ON-DEMAND, resolved to
|
|
60
|
+
* full material structures (layers, profiles, constituents, lists). Most
|
|
61
|
+
* entities carry one; exporters that attach e.g. a layer set *and* a plain
|
|
62
|
+
* fallback IfcMaterial yield several. Order matches
|
|
63
|
+
* {@link resolveAllMaterialDefIds}. Consumers that need a single value use
|
|
64
|
+
* {@link extractMaterialsOnDemand} (=== element 0 here).
|
|
65
|
+
*/
|
|
66
|
+
export declare function extractAllMaterialsOnDemand(store: IfcDataStore, entityId: number): MaterialInfo[];
|
|
49
67
|
/**
|
|
50
68
|
* Extract materials for a single entity ON-DEMAND.
|
|
51
69
|
* Uses the onDemandMaterialMap built during parsing.
|
|
52
70
|
* Falls back to relationship graph when on-demand map is not available (e.g., server-loaded models).
|
|
53
71
|
* Also checks type-level material assignments via IfcRelDefinesByType.
|
|
54
72
|
* Resolves the full material structure (layers, profiles, constituents, lists).
|
|
73
|
+
* Returns the entity's PRIMARY material (lowest-rel-express-id association);
|
|
74
|
+
* use {@link extractAllMaterialsOnDemand} when every association matters.
|
|
55
75
|
*/
|
|
56
76
|
export declare function extractMaterialsOnDemand(store: IfcDataStore, entityId: number): MaterialInfo | null;
|
|
57
77
|
/** A base IfcMaterial reachable from an element's material association. */
|
|
@@ -97,9 +117,13 @@ export declare function resolveMaterialDefId(store: IfcDataStore, entityId: numb
|
|
|
97
117
|
export declare function collectMaterialLeaves(store: IfcDataStore, defId: number): MaterialLeaf[];
|
|
98
118
|
/**
|
|
99
119
|
* Build (and memoise) the model-wide index of base material → using elements,
|
|
100
|
-
* with per-element volume weights.
|
|
101
|
-
* `onDemandMaterialMap` (element → definition) that the parser already
|
|
102
|
-
*
|
|
120
|
+
* with per-element volume weights. Element enumeration comes from the forward
|
|
121
|
+
* `onDemandMaterialMap` (element → definition list) that the parser already
|
|
122
|
+
* builds, falling back to the relationship graph's AssociatesMaterial edges
|
|
123
|
+
* (server-loaded models). Each element's definition list is preferentially
|
|
124
|
+
* resolved from the graph (rel-express-id order, deduped) so multiple
|
|
125
|
+
* IfcRelAssociatesMaterial per element all surface deterministically. Keyed
|
|
126
|
+
* by base IfcMaterial express id.
|
|
103
127
|
*/
|
|
104
128
|
export declare function buildMaterialUsageIndex(store: IfcDataStore): Map<number, MaterialUsage>;
|
|
105
129
|
/** Resolve a material entity's display name + IFC class for headers/labels.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"material-resolver.d.ts","sourceRoot":"","sources":["../src/material-resolver.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"material-resolver.d.ts","sourceRoot":"","sources":["../src/material-resolver.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGzD,MAAM,WAAW,YAAY;IACzB,IAAI,EAAE,UAAU,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,wBAAwB,GAAG,cAAc,CAAC;IACzG,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,uBAAuB,EAAE,CAAC;IACzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1D;AAED,MAAM,WAAW,iBAAiB;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;iFAC6E;IAC7E,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAmCD;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAcxF;AAED;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CACvC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,GACjB,YAAY,EAAE,CAWhB;AAED;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACpC,KAAK,EAAE,YAAY,EACnB,QAAQ,EAAE,MAAM,GACjB,YAAY,GAAG,IAAI,CAOrB;AA2OD,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IACzB;oDACgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;6DAEyD;IACzD,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC1B,0CAA0C;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,OAAO,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAuBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE9F;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CA2BxF;AA0KD;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAmIvF;AAID;mFACmF;AACnF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAmB1G"}
|
|
@@ -8,40 +8,100 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { EntityExtractor } from './entity-extractor.js';
|
|
10
10
|
import { RelationshipType } from '@ifc-lite/data';
|
|
11
|
+
import { isIfcTypeLikeEntity } from './columnar-parser-indexes.js';
|
|
12
|
+
/**
|
|
13
|
+
* Resolve the OCCURRENCE-LEVEL material definition ids directly associated
|
|
14
|
+
* with an entity (no type fallback): every IfcRelAssociatesMaterial that
|
|
15
|
+
* targets it, deduped and ordered by the rel's express id — the same rule
|
|
16
|
+
* that decides the single-entry `onDemandMaterialMap` winner, so index 0
|
|
17
|
+
* always equals the map's entry. Falls back to the map when no relationship
|
|
18
|
+
* graph is available (minimal/test stores).
|
|
19
|
+
*/
|
|
20
|
+
function resolveOwnMaterialDefIds(store, entityId) {
|
|
21
|
+
if (store.relationships) {
|
|
22
|
+
// Prefer getEdges (carries relationshipId for deterministic ordering);
|
|
23
|
+
// facade graphs (server data model, test mocks) may implement only
|
|
24
|
+
// getRelated, whose order is best-effort.
|
|
25
|
+
if (typeof store.relationships.inverse?.getEdges === 'function') {
|
|
26
|
+
const edges = store.relationships.inverse.getEdges(entityId, RelationshipType.AssociatesMaterial);
|
|
27
|
+
if (edges.length > 0) {
|
|
28
|
+
const sorted = [...edges].sort((a, b) => a.relationshipId - b.relationshipId);
|
|
29
|
+
const out = [];
|
|
30
|
+
for (const e of sorted) {
|
|
31
|
+
if (!out.includes(e.target))
|
|
32
|
+
out.push(e.target);
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const related = store.relationships.getRelated(entityId, RelationshipType.AssociatesMaterial, 'inverse');
|
|
39
|
+
if (related.length > 0)
|
|
40
|
+
return [...new Set(related)];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Map values are LISTS (all associations, file order) since #1773.
|
|
44
|
+
const mapped = store.onDemandMaterialMap?.get(entityId);
|
|
45
|
+
return mapped !== undefined ? [...mapped] : [];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve ALL material definition ids for an entity: every occurrence-level
|
|
49
|
+
* IfcRelAssociatesMaterial (elements may legally carry more than one), or —
|
|
50
|
+
* when the occurrence has none — the associations of its type
|
|
51
|
+
* (IfcRelDefinesByType), matching {@link extractMaterialsOnDemand}'s
|
|
52
|
+
* occurrence-overrides-type precedence. Ordered by rel express id, so
|
|
53
|
+
* index 0 is the entity's deterministic "primary" material definition.
|
|
54
|
+
*/
|
|
55
|
+
export function resolveAllMaterialDefIds(store, entityId) {
|
|
56
|
+
const own = resolveOwnMaterialDefIds(store, entityId);
|
|
57
|
+
if (own.length > 0)
|
|
58
|
+
return own;
|
|
59
|
+
// Type fallback: first type with any association wins (mirrors the
|
|
60
|
+
// single-def lookup's `break`).
|
|
61
|
+
if (store.relationships) {
|
|
62
|
+
const typeIds = store.relationships.getRelated(entityId, RelationshipType.DefinesByType, 'inverse');
|
|
63
|
+
for (const typeId of typeIds) {
|
|
64
|
+
const typeDefs = resolveOwnMaterialDefIds(store, typeId);
|
|
65
|
+
if (typeDefs.length > 0)
|
|
66
|
+
return typeDefs;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract EVERY material association for an entity ON-DEMAND, resolved to
|
|
73
|
+
* full material structures (layers, profiles, constituents, lists). Most
|
|
74
|
+
* entities carry one; exporters that attach e.g. a layer set *and* a plain
|
|
75
|
+
* fallback IfcMaterial yield several. Order matches
|
|
76
|
+
* {@link resolveAllMaterialDefIds}. Consumers that need a single value use
|
|
77
|
+
* {@link extractMaterialsOnDemand} (=== element 0 here).
|
|
78
|
+
*/
|
|
79
|
+
export function extractAllMaterialsOnDemand(store, entityId) {
|
|
80
|
+
if (!store.source?.length)
|
|
81
|
+
return [];
|
|
82
|
+
const defIds = resolveAllMaterialDefIds(store, entityId);
|
|
83
|
+
if (defIds.length === 0)
|
|
84
|
+
return [];
|
|
85
|
+
const extractor = new EntityExtractor(store.source);
|
|
86
|
+
const out = [];
|
|
87
|
+
for (const defId of defIds) {
|
|
88
|
+
const info = resolveMaterial(store, extractor, defId, new Set());
|
|
89
|
+
if (info)
|
|
90
|
+
out.push(info);
|
|
91
|
+
}
|
|
92
|
+
return out;
|
|
93
|
+
}
|
|
11
94
|
/**
|
|
12
95
|
* Extract materials for a single entity ON-DEMAND.
|
|
13
96
|
* Uses the onDemandMaterialMap built during parsing.
|
|
14
97
|
* Falls back to relationship graph when on-demand map is not available (e.g., server-loaded models).
|
|
15
98
|
* Also checks type-level material assignments via IfcRelDefinesByType.
|
|
16
99
|
* Resolves the full material structure (layers, profiles, constituents, lists).
|
|
100
|
+
* Returns the entity's PRIMARY material (lowest-rel-express-id association);
|
|
101
|
+
* use {@link extractAllMaterialsOnDemand} when every association matters.
|
|
17
102
|
*/
|
|
18
103
|
export function extractMaterialsOnDemand(store, entityId) {
|
|
19
|
-
|
|
20
|
-
if (store.onDemandMaterialMap) {
|
|
21
|
-
materialId = store.onDemandMaterialMap.get(entityId);
|
|
22
|
-
}
|
|
23
|
-
else if (store.relationships) {
|
|
24
|
-
// Fallback: use relationship graph (server-loaded models)
|
|
25
|
-
const related = store.relationships.getRelated(entityId, RelationshipType.AssociatesMaterial, 'inverse');
|
|
26
|
-
if (related.length > 0)
|
|
27
|
-
materialId = related[0];
|
|
28
|
-
}
|
|
29
|
-
// Check type-level material if occurrence has none
|
|
30
|
-
if (materialId === undefined && store.relationships) {
|
|
31
|
-
const typeIds = store.relationships.getRelated(entityId, RelationshipType.DefinesByType, 'inverse');
|
|
32
|
-
for (const typeId of typeIds) {
|
|
33
|
-
if (store.onDemandMaterialMap) {
|
|
34
|
-
materialId = store.onDemandMaterialMap.get(typeId);
|
|
35
|
-
}
|
|
36
|
-
else {
|
|
37
|
-
const related = store.relationships.getRelated(typeId, RelationshipType.AssociatesMaterial, 'inverse');
|
|
38
|
-
if (related.length > 0)
|
|
39
|
-
materialId = related[0];
|
|
40
|
-
}
|
|
41
|
-
if (materialId !== undefined)
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
}
|
|
104
|
+
const materialId = resolveAllMaterialDefIds(store, entityId)[0];
|
|
45
105
|
if (materialId === undefined)
|
|
46
106
|
return null;
|
|
47
107
|
if (!store.source?.length)
|
|
@@ -274,31 +334,7 @@ function readMaterialNameCategory(store, extractor, materialId) {
|
|
|
274
334
|
* element's type. Returns the definition express id, or undefined.
|
|
275
335
|
*/
|
|
276
336
|
export function resolveMaterialDefId(store, entityId) {
|
|
277
|
-
|
|
278
|
-
if (store.onDemandMaterialMap) {
|
|
279
|
-
materialId = store.onDemandMaterialMap.get(entityId);
|
|
280
|
-
}
|
|
281
|
-
else if (store.relationships) {
|
|
282
|
-
const related = store.relationships.getRelated(entityId, RelationshipType.AssociatesMaterial, 'inverse');
|
|
283
|
-
if (related.length > 0)
|
|
284
|
-
materialId = related[0];
|
|
285
|
-
}
|
|
286
|
-
if (materialId === undefined && store.relationships) {
|
|
287
|
-
const typeIds = store.relationships.getRelated(entityId, RelationshipType.DefinesByType, 'inverse');
|
|
288
|
-
for (const typeId of typeIds) {
|
|
289
|
-
if (store.onDemandMaterialMap) {
|
|
290
|
-
materialId = store.onDemandMaterialMap.get(typeId);
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
const related = store.relationships.getRelated(typeId, RelationshipType.AssociatesMaterial, 'inverse');
|
|
294
|
-
if (related.length > 0)
|
|
295
|
-
materialId = related[0];
|
|
296
|
-
}
|
|
297
|
-
if (materialId !== undefined)
|
|
298
|
-
break;
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
return materialId;
|
|
337
|
+
return resolveAllMaterialDefIds(store, entityId)[0];
|
|
302
338
|
}
|
|
303
339
|
const leavesCache = new WeakMap();
|
|
304
340
|
/**
|
|
@@ -318,7 +354,25 @@ export function collectMaterialLeaves(store, defId) {
|
|
|
318
354
|
if (cached)
|
|
319
355
|
return cached;
|
|
320
356
|
const extractor = store.source?.length ? new EntityExtractor(store.source) : null;
|
|
321
|
-
|
|
357
|
+
let result;
|
|
358
|
+
if (extractor) {
|
|
359
|
+
result = resolveLeaves(store, extractor, defId, new Set());
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
// Source-less store (server-loaded models keep `source` as an EMPTY
|
|
363
|
+
// Uint8Array): a definition's internal structure (layers/profiles/
|
|
364
|
+
// constituents -> base materials) lives in attribute references that
|
|
365
|
+
// the server does not emit as relationship rows, so it cannot be
|
|
366
|
+
// fanned out here. Surface the definition itself as one opaque leaf
|
|
367
|
+
// carrying the element's full weight - the usage index then still
|
|
368
|
+
// groups elements by their material association instead of staying
|
|
369
|
+
// empty. Dangling definition refs resolve to nothing, mirroring
|
|
370
|
+
// resolveLeaves.
|
|
371
|
+
const ref = getRef(store, defId);
|
|
372
|
+
result = ref
|
|
373
|
+
? [{ id: defId, name: store.entities?.getName(defId) || undefined, weight: 1 }]
|
|
374
|
+
: [];
|
|
375
|
+
}
|
|
322
376
|
cache.set(defId, result);
|
|
323
377
|
return result;
|
|
324
378
|
}
|
|
@@ -377,7 +431,9 @@ function resolveLeaves(store, extractor, defId, visited) {
|
|
|
377
431
|
// IfcMaterialLayer: [Material, LayerThickness, IsVentilated, Name, Description, Category, Priority]
|
|
378
432
|
layers.push({
|
|
379
433
|
matId: typeof la[0] === 'number' ? la[0] : undefined,
|
|
380
|
-
|
|
434
|
+
// Non-finite thickness would turn every weight into NaN
|
|
435
|
+
// (Infinity/Infinity) - treat it as absent like <= 0.
|
|
436
|
+
thickness: typeof la[1] === 'number' && Number.isFinite(la[1]) && la[1] > 0 ? la[1] : 0,
|
|
381
437
|
});
|
|
382
438
|
}
|
|
383
439
|
const totalThickness = layers.reduce((s, l) => s + l.thickness, 0);
|
|
@@ -413,17 +469,43 @@ function resolveLeaves(store, extractor, defId, visited) {
|
|
|
413
469
|
continue;
|
|
414
470
|
const ca = extractor.extractEntity(constRef)?.attributes ?? [];
|
|
415
471
|
// IfcMaterialConstituent: [Name, Description, Material, Fraction, Category]
|
|
472
|
+
// An authored Fraction of 0 is preserved as 0 (an explicit
|
|
473
|
+
// "contributes nothing"), distinct from an ABSENT fraction.
|
|
416
474
|
constituents.push({
|
|
417
475
|
matId: typeof ca[2] === 'number' ? ca[2] : undefined,
|
|
418
|
-
|
|
476
|
+
// Non-finite (NaN/Infinity) and negative fractions are
|
|
477
|
+
// malformed for an IfcNormalisedRatioMeasure — treat them
|
|
478
|
+
// as unset so they can't poison the weight arithmetic
|
|
479
|
+
// below. An authored 0.0 is legal and PRESERVED: it is an
|
|
480
|
+
// explicit "contributes nothing", distinct from absent.
|
|
481
|
+
fraction: typeof ca[3] === 'number' && Number.isFinite(ca[3]) && ca[3] >= 0 ? ca[3] : undefined,
|
|
419
482
|
});
|
|
420
483
|
}
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
484
|
+
// Constituent Fraction is optional per-constituent. Constituents
|
|
485
|
+
// WITHOUT an explicit fraction share whatever remains of the whole
|
|
486
|
+
// (1 - sum of explicit) evenly, so they must not collapse to
|
|
487
|
+
// weight 0 and vanish from the totals. When the explicit fractions
|
|
488
|
+
// already fill (or overflow) the whole, each implicit sibling gets
|
|
489
|
+
// an even 1/n share instead so it still registers. The set is then
|
|
490
|
+
// renormalised to sum to exactly 1 (e.g. {1.0, unset} would
|
|
491
|
+
// otherwise weigh 1.5x the element), so the totals panel can never
|
|
492
|
+
// over-report an element's quantities. Explicit zeros survive all
|
|
493
|
+
// branches: an all-explicit-zero set keeps every weight at 0
|
|
494
|
+
// rather than inventing equal shares.
|
|
495
|
+
const explicitTotal = constituents.reduce((s, c) => s + (c.fraction ?? 0), 0);
|
|
496
|
+
const implicitCount = constituents.reduce((n, c) => n + (c.fraction === undefined ? 1 : 0), 0);
|
|
497
|
+
const remaining = 1 - explicitTotal;
|
|
498
|
+
const perImplicit = implicitCount > 0
|
|
499
|
+
? (remaining > 0 ? remaining / implicitCount : 1 / constituents.length)
|
|
500
|
+
: 0;
|
|
501
|
+
const provisional = constituents.map((c) => c.fraction ?? perImplicit);
|
|
502
|
+
const totalWeight = provisional.reduce((s, w) => s + w, 0);
|
|
503
|
+
for (let i = 0; i < constituents.length; i++) {
|
|
504
|
+
// totalWeight can only be 0 when EVERY fraction is an authored
|
|
505
|
+
// 0.0 (absent fractions receive a positive share) — keep those
|
|
506
|
+
// explicit zeros instead of inventing equal weights.
|
|
507
|
+
const weight = totalWeight > 0 ? provisional[i] / totalWeight : 0;
|
|
508
|
+
addMaterialLeaf(constituents[i].matId, weight);
|
|
427
509
|
}
|
|
428
510
|
return [...merged.values()];
|
|
429
511
|
}
|
|
@@ -456,37 +538,151 @@ function resolveLeaves(store, extractor, defId, visited) {
|
|
|
456
538
|
const usageIndexCache = new WeakMap();
|
|
457
539
|
/**
|
|
458
540
|
* Build (and memoise) the model-wide index of base material → using elements,
|
|
459
|
-
* with per-element volume weights.
|
|
460
|
-
* `onDemandMaterialMap` (element → definition) that the parser already
|
|
461
|
-
*
|
|
541
|
+
* with per-element volume weights. Element enumeration comes from the forward
|
|
542
|
+
* `onDemandMaterialMap` (element → definition list) that the parser already
|
|
543
|
+
* builds, falling back to the relationship graph's AssociatesMaterial edges
|
|
544
|
+
* (server-loaded models). Each element's definition list is preferentially
|
|
545
|
+
* resolved from the graph (rel-express-id order, deduped) so multiple
|
|
546
|
+
* IfcRelAssociatesMaterial per element all surface deterministically. Keyed
|
|
547
|
+
* by base IfcMaterial express id.
|
|
462
548
|
*/
|
|
463
549
|
export function buildMaterialUsageIndex(store) {
|
|
464
550
|
const cached = usageIndexCache.get(store);
|
|
465
551
|
if (cached)
|
|
466
552
|
return cached;
|
|
467
553
|
const usage = new Map();
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
554
|
+
// Element -> material-definition list. Prefer the parser's forward
|
|
555
|
+
// `onDemandMaterialMap`; when it's absent (server-loaded models) fall back
|
|
556
|
+
// to the relationship graph's AssociatesMaterial edges - the same fallback
|
|
557
|
+
// extractMaterialsOnDemand uses - so the model-wide index still populates
|
|
558
|
+
// instead of silently caching an empty map forever. Candidates are
|
|
559
|
+
// enumerated via entityIndex.byId (every server entity is indexed there):
|
|
560
|
+
// the server's facade graph exposes only getRelated/getEdges closures over
|
|
561
|
+
// private maps and keeps `inverse.offsets` as an EMPTY Map, so iterating
|
|
562
|
+
// the CSR columns is not an option for the exact store this fallback
|
|
563
|
+
// serves.
|
|
564
|
+
let forward = store.onDemandMaterialMap;
|
|
565
|
+
if (!forward && store.relationships) {
|
|
566
|
+
const rebuilt = new Map();
|
|
567
|
+
for (const entityId of store.entityIndex.byId.keys()) {
|
|
568
|
+
const defs = store.relationships.getRelated(entityId, RelationshipType.AssociatesMaterial, 'inverse');
|
|
569
|
+
if (defs.length > 0)
|
|
570
|
+
rebuilt.set(entityId, defs);
|
|
571
|
+
}
|
|
572
|
+
forward = rebuilt;
|
|
573
|
+
}
|
|
574
|
+
// No source requirement: server-loaded stores carry an EMPTY source buffer,
|
|
575
|
+
// and collectMaterialLeaves has a source-less path (the definition becomes
|
|
576
|
+
// one opaque full-weight leaf) precisely so this index works for them.
|
|
577
|
+
if (forward && forward.size > 0) {
|
|
578
|
+
// One entries-row per (material, element): the totals panel counts
|
|
579
|
+
// rows, so an element must never appear twice under one material —
|
|
580
|
+
// duplicate DefinesByType edges (malformed double-typing) and repeated
|
|
581
|
+
// leaves must not add rows. But when SEVERAL of an element's
|
|
582
|
+
// associations resolve to the same base material (e.g. a layer set
|
|
583
|
+
// containing A plus a plain association to A) their weights ACCUMULATE
|
|
584
|
+
// on that single row instead of the later association being dropped
|
|
585
|
+
// (which would make the total depend on rel order).
|
|
586
|
+
const rowPerMaterial = new Map();
|
|
587
|
+
// A (malformed) multi-typed occurrence must aggregate only its WINNING
|
|
588
|
+
// type — the first material-bearing one in DefinesByType order, the
|
|
589
|
+
// same precedence resolveAllMaterialDefIds applies — or two type keys
|
|
590
|
+
// would each expand to it and double-count its quantities.
|
|
591
|
+
const winningTypeCache = new Map();
|
|
592
|
+
const winningTypeFor = (occId) => {
|
|
593
|
+
if (winningTypeCache.has(occId))
|
|
594
|
+
return winningTypeCache.get(occId);
|
|
595
|
+
let winner;
|
|
596
|
+
const typeIds = store.relationships.getRelated(occId, RelationshipType.DefinesByType, 'inverse');
|
|
597
|
+
for (const typeId of typeIds) {
|
|
598
|
+
if (resolveOwnMaterialDefIds(store, typeId).length > 0) {
|
|
599
|
+
winner = typeId;
|
|
600
|
+
break;
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
winningTypeCache.set(occId, winner);
|
|
604
|
+
return winner;
|
|
605
|
+
};
|
|
606
|
+
for (const [entityId, mappedDefIds] of forward) {
|
|
607
|
+
// IfcRelAssociatesMaterial commonly targets the TYPE entity
|
|
608
|
+
// (IfcDoorType etc.). The tab/totals need occurrences — a type
|
|
609
|
+
// has no geometry, so a type-keyed entry is invisible in the
|
|
610
|
+
// By Material tree (geom filter) and mis-attributes quantities
|
|
611
|
+
// (#1755). Expand type keys to their instances via forward
|
|
612
|
+
// DefinesByType edges; occurrences with their OWN association
|
|
613
|
+
// are skipped (IFC precedence: occurrence overrides type — they
|
|
614
|
+
// get their entry from their own map iteration). The type keeps
|
|
615
|
+
// no entry of its own: a zero-instance type would only produce
|
|
616
|
+
// dead rows. Stores without a relationship graph (minimal test
|
|
617
|
+
// stores) keep the old verbatim behavior.
|
|
618
|
+
const ref = getRef(store, entityId);
|
|
619
|
+
let targets;
|
|
620
|
+
if (ref && store.relationships && isIfcTypeLikeEntity(ref.type.toUpperCase())) {
|
|
621
|
+
targets = store.relationships
|
|
622
|
+
.getRelated(entityId, RelationshipType.DefinesByType, 'forward')
|
|
623
|
+
.filter((occId) => !forward.has(occId) && winningTypeFor(occId) === entityId);
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
targets = [entityId];
|
|
627
|
+
}
|
|
628
|
+
if (targets.length === 0)
|
|
629
|
+
continue;
|
|
630
|
+
// Duplicate forward edges (malformed double-typing) must not
|
|
631
|
+
// double a target's contribution within this map key.
|
|
632
|
+
const uniqueTargets = targets.length > 1 ? [...new Set(targets)] : targets;
|
|
633
|
+
// Every association of this map key — an element carrying e.g. a
|
|
634
|
+
// layer set AND a fallback IfcMaterial must appear under both.
|
|
635
|
+
// Prefer the graph (rel-id-ordered, deduped); fall back to the
|
|
636
|
+
// map's own list when the store has no graph.
|
|
637
|
+
const graphDefIds = store.relationships ? resolveOwnMaterialDefIds(store, entityId) : [];
|
|
638
|
+
const defIds = graphDefIds.length > 0 ? graphDefIds : [...new Set(mappedDefIds)];
|
|
639
|
+
for (const defId of defIds) {
|
|
640
|
+
const leaves = collectMaterialLeaves(store, defId);
|
|
641
|
+
for (const leaf of leaves) {
|
|
642
|
+
let entry = usage.get(leaf.id);
|
|
643
|
+
if (!entry) {
|
|
644
|
+
const leafRef = getRef(store, leaf.id);
|
|
645
|
+
entry = {
|
|
646
|
+
id: leaf.id,
|
|
647
|
+
name: leaf.name || `Material #${leaf.id}`,
|
|
648
|
+
category: leaf.category,
|
|
649
|
+
ifcClass: leafRef?.type || 'IfcMaterial',
|
|
650
|
+
entries: [],
|
|
651
|
+
};
|
|
652
|
+
usage.set(leaf.id, entry);
|
|
653
|
+
}
|
|
654
|
+
let rows = rowPerMaterial.get(leaf.id);
|
|
655
|
+
if (!rows) {
|
|
656
|
+
rows = new Map();
|
|
657
|
+
rowPerMaterial.set(leaf.id, rows);
|
|
658
|
+
}
|
|
659
|
+
for (const target of uniqueTargets) {
|
|
660
|
+
const row = rows.get(target);
|
|
661
|
+
if (row) {
|
|
662
|
+
row.weight += leaf.weight;
|
|
663
|
+
}
|
|
664
|
+
else {
|
|
665
|
+
const fresh = { entityId: target, weight: leaf.weight };
|
|
666
|
+
rows.set(target, fresh);
|
|
667
|
+
entry.entries.push(fresh);
|
|
668
|
+
}
|
|
669
|
+
}
|
|
484
670
|
}
|
|
485
|
-
entry.entries.push({ entityId, weight: leaf.weight });
|
|
486
671
|
}
|
|
487
672
|
}
|
|
488
673
|
}
|
|
489
|
-
|
|
674
|
+
// Don't memoise an empty index built from a store that had NO material
|
|
675
|
+
// inputs at all (no forward map, no relationship graph, no source): such a
|
|
676
|
+
// store may be populated later (a load that wires onDemandMaterialMap /
|
|
677
|
+
// relationships after first render), and a cached empty result would mask
|
|
678
|
+
// it forever. Non-empty results, or empty ones from a store that did have
|
|
679
|
+
// inputs (a genuinely material-free model), are safe to cache.
|
|
680
|
+
const hadInputs = (store.onDemandMaterialMap?.size ?? 0) > 0
|
|
681
|
+
|| !!store.relationships
|
|
682
|
+
|| !!store.source?.length;
|
|
683
|
+
if (usage.size > 0 || hadInputs) {
|
|
684
|
+
usageIndexCache.set(store, usage);
|
|
685
|
+
}
|
|
490
686
|
return usage;
|
|
491
687
|
}
|
|
492
688
|
const displayCache = new WeakMap();
|