@ifc-lite/parser 6.5.0 → 7.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 (106) hide show
  1. package/README.md +21 -0
  2. package/dist/columnar-parser-root-attributes.d.ts +2 -5
  3. package/dist/columnar-parser-root-attributes.d.ts.map +1 -1
  4. package/dist/columnar-parser-root-attributes.js +22 -2
  5. package/dist/columnar-parser-root-attributes.js.map +1 -1
  6. package/dist/columnar-parser.d.ts +4 -0
  7. package/dist/columnar-parser.d.ts.map +1 -1
  8. package/dist/columnar-parser.js +2 -47
  9. package/dist/columnar-parser.js.map +1 -1
  10. package/dist/cost-category-buckets.d.ts +5 -0
  11. package/dist/cost-category-buckets.d.ts.map +1 -0
  12. package/dist/cost-category-buckets.js +37 -0
  13. package/dist/cost-category-buckets.js.map +1 -0
  14. package/dist/cost-compatibility-tree.d.ts +4 -0
  15. package/dist/cost-compatibility-tree.d.ts.map +1 -0
  16. package/dist/cost-compatibility-tree.js +46 -0
  17. package/dist/cost-compatibility-tree.js.map +1 -0
  18. package/dist/cost-evaluation-arithmetic.d.ts +16 -0
  19. package/dist/cost-evaluation-arithmetic.d.ts.map +1 -0
  20. package/dist/cost-evaluation-arithmetic.js +181 -0
  21. package/dist/cost-evaluation-arithmetic.js.map +1 -0
  22. package/dist/cost-evaluation-context.d.ts +20 -0
  23. package/dist/cost-evaluation-context.d.ts.map +1 -0
  24. package/dist/cost-evaluation-context.js +54 -0
  25. package/dist/cost-evaluation-context.js.map +1 -0
  26. package/dist/cost-evaluation-result.d.ts +5 -0
  27. package/dist/cost-evaluation-result.d.ts.map +1 -0
  28. package/dist/cost-evaluation-result.js +20 -0
  29. package/dist/cost-evaluation-result.js.map +1 -0
  30. package/dist/cost-evaluator.d.ts +6 -0
  31. package/dist/cost-evaluator.d.ts.map +1 -0
  32. package/dist/cost-evaluator.js +398 -0
  33. package/dist/cost-evaluator.js.map +1 -0
  34. package/dist/cost-extractor.d.ts +4 -8
  35. package/dist/cost-extractor.d.ts.map +1 -1
  36. package/dist/cost-extractor.js +346 -334
  37. package/dist/cost-extractor.js.map +1 -1
  38. package/dist/cost-overlay.d.ts +72 -0
  39. package/dist/cost-overlay.d.ts.map +1 -0
  40. package/dist/cost-overlay.js +5 -0
  41. package/dist/cost-overlay.js.map +1 -0
  42. package/dist/cost-quantities.d.ts +5 -0
  43. package/dist/cost-quantities.d.ts.map +1 -0
  44. package/dist/cost-quantities.js +116 -0
  45. package/dist/cost-quantities.js.map +1 -0
  46. package/dist/cost-quantity-evaluator.d.ts +23 -0
  47. package/dist/cost-quantity-evaluator.d.ts.map +1 -0
  48. package/dist/cost-quantity-evaluator.js +153 -0
  49. package/dist/cost-quantity-evaluator.js.map +1 -0
  50. package/dist/cost-reader.d.ts +59 -0
  51. package/dist/cost-reader.d.ts.map +1 -0
  52. package/dist/cost-reader.js +210 -0
  53. package/dist/cost-reader.js.map +1 -0
  54. package/dist/cost-relationships.d.ts +7 -0
  55. package/dist/cost-relationships.d.ts.map +1 -0
  56. package/dist/cost-relationships.js +237 -0
  57. package/dist/cost-relationships.js.map +1 -0
  58. package/dist/cost-step-lexemes.d.ts +16 -0
  59. package/dist/cost-step-lexemes.d.ts.map +1 -0
  60. package/dist/cost-step-lexemes.js +131 -0
  61. package/dist/cost-step-lexemes.js.map +1 -0
  62. package/dist/cost-types.d.ts +218 -76
  63. package/dist/cost-types.d.ts.map +1 -1
  64. package/dist/cost-units.d.ts +38 -0
  65. package/dist/cost-units.d.ts.map +1 -0
  66. package/dist/cost-units.js +348 -0
  67. package/dist/cost-units.js.map +1 -0
  68. package/dist/cost-value-evaluation-session.d.ts +19 -0
  69. package/dist/cost-value-evaluation-session.d.ts.map +1 -0
  70. package/dist/cost-value-evaluation-session.js +25 -0
  71. package/dist/cost-value-evaluation-session.js.map +1 -0
  72. package/dist/cost.d.ts +5 -0
  73. package/dist/cost.d.ts.map +1 -0
  74. package/dist/cost.js +6 -0
  75. package/dist/cost.js.map +1 -0
  76. package/dist/entity-extractor.d.ts.map +1 -1
  77. package/dist/entity-extractor.js +5 -2
  78. package/dist/entity-extractor.js.map +1 -1
  79. package/dist/index.d.ts +1 -2
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +1 -1
  82. package/dist/index.js.map +1 -1
  83. package/dist/on-demand-extractors.d.ts +3 -4
  84. package/dist/on-demand-extractors.d.ts.map +1 -1
  85. package/dist/on-demand-extractors.js +9 -6
  86. package/dist/on-demand-extractors.js.map +1 -1
  87. package/dist/project-units.d.ts.map +1 -1
  88. package/dist/project-units.js +8 -2
  89. package/dist/project-units.js.map +1 -1
  90. package/dist/property-unit.d.ts +24 -0
  91. package/dist/property-unit.d.ts.map +1 -0
  92. package/dist/property-unit.js +29 -0
  93. package/dist/property-unit.js.map +1 -0
  94. package/dist/step-entity-parameters.d.ts +9 -0
  95. package/dist/step-entity-parameters.d.ts.map +1 -0
  96. package/dist/step-entity-parameters.js +30 -0
  97. package/dist/step-entity-parameters.js.map +1 -0
  98. package/dist/worker-parser.d.ts +29 -1
  99. package/dist/worker-parser.d.ts.map +1 -1
  100. package/dist/worker-parser.js +80 -7
  101. package/dist/worker-parser.js.map +1 -1
  102. package/package.json +6 -5
  103. package/dist/cost-schedule-2x3.d.ts +0 -31
  104. package/dist/cost-schedule-2x3.d.ts.map +0 -1
  105. package/dist/cost-schedule-2x3.js +0 -75
  106. package/dist/cost-schedule-2x3.js.map +0 -1
@@ -0,0 +1,210 @@
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 { getEntityRefFromStore } from './columnar-parser-root-attributes.js';
5
+ import { EntityExtractor } from './entity-extractor.js';
6
+ import { costAttributePresent, costNumericLexeme, costNumericTypeLexeme, costReferenceLexeme, costReferenceListLexeme, splitCostAttributeLexemes, } from './cost-step-lexemes.js';
7
+ import { asSourceBytes } from './source-bytes.js';
8
+ class CostSourceCache {
9
+ source;
10
+ decoded = new Map();
11
+ constructor(source) {
12
+ this.source = source;
13
+ }
14
+ get byteLength() { return this.source.byteLength; }
15
+ get length() { return this.source.length; }
16
+ get isResident() { return this.source.isResident; }
17
+ get contentKey() { return this.source.contentKey; }
18
+ slice(start, end) { return this.source.slice(start, end); }
19
+ decodeUtf8(start, end) {
20
+ const key = `${start}:${end}`;
21
+ const cached = this.decoded.get(key);
22
+ if (cached !== undefined)
23
+ return cached;
24
+ const decoded = this.source.decodeUtf8(start, end);
25
+ this.decoded.set(key, decoded);
26
+ return decoded;
27
+ }
28
+ materialize() { return this.source.materialize(); }
29
+ withMaterialized(fn) { return this.source.withMaterialized(fn); }
30
+ withMaterializedAsync(fn) {
31
+ return this.source.withMaterializedAsync(fn);
32
+ }
33
+ toTransferable() { return this.source.toTransferable(); }
34
+ }
35
+ /**
36
+ * Memoized source reader used once per cost extraction.
37
+ *
38
+ * When an {@link CostMutationOverlay} is supplied, every read goes through it
39
+ * first: a tombstoned entity does not exist (no id, no type, no record), a
40
+ * retyped entity is listed under and reports its pending class, and a record
41
+ * any pending edit reaches is read from the text the exporter will write for
42
+ * it. This is the one place the overlay is applied — see `cost-overlay.ts`
43
+ * for why it is here and not on the finished graph. The caches below are
44
+ * per-reader and a reader is built per extraction, so an overlaid read never
45
+ * reuses an unoverlaid entry.
46
+ */
47
+ export class CostEntityReader {
48
+ store;
49
+ overlay;
50
+ diagnostics;
51
+ extractor;
52
+ source;
53
+ cache = new Map();
54
+ lexemeCache = new Map();
55
+ recordCache = new Map();
56
+ retyped;
57
+ constructor(store, overlay, diagnostics) {
58
+ this.store = store;
59
+ this.overlay = overlay;
60
+ this.diagnostics = diagnostics;
61
+ this.source = new CostSourceCache(asSourceBytes(store.source));
62
+ this.extractor = new EntityExtractor(this.source);
63
+ }
64
+ /** True when a pending edit has deleted `expressId` from the loaded model. */
65
+ isDeleted(expressId) {
66
+ return this.overlay?.isDeleted(expressId) === true;
67
+ }
68
+ /** Pending retypes, UPPERCASE, restricted to entities the source actually has. */
69
+ retypes() {
70
+ if (!this.retyped) {
71
+ const retyped = new Map();
72
+ for (const [id, type] of this.overlay?.retypes() ?? []) {
73
+ if (getEntityRefFromStore(this.store, id))
74
+ retyped.set(id, type.toUpperCase());
75
+ }
76
+ this.retyped = retyped;
77
+ }
78
+ return this.retyped;
79
+ }
80
+ /**
81
+ * The record text an overlaid read sees, or `undefined` when the record
82
+ * reads exactly as the source states it (no overlay, or no edit reaches it)
83
+ * and the unoverlaid source path applies. `null` means no record at all.
84
+ */
85
+ overlaidRecord(expressId) {
86
+ if (!this.overlay)
87
+ return undefined;
88
+ if (this.recordCache.has(expressId))
89
+ return this.recordCache.get(expressId);
90
+ const ref = this.isDeleted(expressId) ? null : getEntityRefFromStore(this.store, expressId);
91
+ let text = null;
92
+ if (ref) {
93
+ const sourceText = this.source.decodeUtf8(ref.byteOffset, ref.byteOffset + ref.byteLength);
94
+ const effective = this.overlay.effectiveRecord(expressId, sourceText, ref.type);
95
+ // Unchanged text reads through the shared source extractor and caches.
96
+ text = effective.text === sourceText ? undefined : effective.text;
97
+ for (const reason of effective.notWritten) {
98
+ this.diagnostics?.push({
99
+ Code: 'PENDING_EDIT_NOT_APPLIED', Severity: 'warning', expressId,
100
+ Message: `A pending edit to #${expressId} is not written on export and is not reflected here: ${reason}`,
101
+ });
102
+ }
103
+ }
104
+ this.recordCache.set(expressId, text);
105
+ return text;
106
+ }
107
+ ids(type) {
108
+ const wanted = type.toUpperCase();
109
+ const ids = this.store.entityIndex.byType.get(wanted) ?? [];
110
+ if (!this.overlay)
111
+ return ids;
112
+ const retyped = this.retypes();
113
+ const kept = ids.filter(id => !this.isDeleted(id) && (retyped.get(id) ?? wanted) === wanted);
114
+ const retypedIn = [...retyped].filter(([id, newType]) => newType === wanted && !this.isDeleted(id) && !ids.includes(id));
115
+ if (retypedIn.length === 0)
116
+ return kept;
117
+ return [...kept, ...retypedIn.map(([id]) => id)].sort((a, b) => a - b);
118
+ }
119
+ get schemaVersion() {
120
+ return this.store.schemaVersion;
121
+ }
122
+ get(expressId) {
123
+ const cached = this.cache.get(expressId);
124
+ if (cached !== undefined)
125
+ return cached;
126
+ const record = this.overlaidRecord(expressId);
127
+ let entity;
128
+ if (record === undefined) {
129
+ const ref = getEntityRefFromStore(this.store, expressId);
130
+ entity = ref ? this.extractor.extractEntity(ref) : null;
131
+ }
132
+ else if (record === null) {
133
+ entity = null;
134
+ }
135
+ else {
136
+ const bytes = new TextEncoder().encode(record);
137
+ entity = new EntityExtractor(bytes).extractEntity({
138
+ expressId, type: this.typeOf(expressId) ?? '', byteOffset: 0, byteLength: bytes.byteLength, lineNumber: 0,
139
+ });
140
+ }
141
+ this.cache.set(expressId, entity);
142
+ return entity;
143
+ }
144
+ typeOf(expressId) {
145
+ if (this.isDeleted(expressId))
146
+ return undefined;
147
+ const type = getEntityRefFromStore(this.store, expressId)?.type.toUpperCase();
148
+ if (type === undefined || !this.overlay)
149
+ return type;
150
+ return this.retypes().get(expressId) ?? type;
151
+ }
152
+ attributeLexeme(expressId, index) {
153
+ let lexemes = this.lexemeCache.get(expressId);
154
+ if (!lexemes) {
155
+ const record = this.overlaidRecord(expressId);
156
+ const ref = record === undefined ? getEntityRefFromStore(this.store, expressId) : undefined;
157
+ const text = record ?? (ref ? this.source.decodeUtf8(ref.byteOffset, ref.byteOffset + ref.byteLength) : undefined);
158
+ lexemes = text === undefined ? [] : splitCostAttributeLexemes(text);
159
+ this.lexemeCache.set(expressId, lexemes);
160
+ }
161
+ return lexemes[index];
162
+ }
163
+ decimalLexeme(expressId, index) {
164
+ return costNumericLexeme(this.attributeLexeme(expressId, index));
165
+ }
166
+ decimalTypeLexeme(expressId, index) {
167
+ return costNumericTypeLexeme(this.attributeLexeme(expressId, index));
168
+ }
169
+ referenceLexeme(expressId, index) {
170
+ return costReferenceLexeme(this.attributeLexeme(expressId, index));
171
+ }
172
+ referenceListLexeme(expressId, index) {
173
+ return costReferenceListLexeme(this.attributeLexeme(expressId, index));
174
+ }
175
+ attributePresent(expressId, index) {
176
+ return costAttributePresent(this.attributeLexeme(expressId, index));
177
+ }
178
+ }
179
+ /**
180
+ * Read a STEP string attribute (IfcLabel/IfcText/IfcIdentifier) as-is,
181
+ * keeping an explicit `''` distinct from an absent (`$`) attribute — both
182
+ * are legal `IfcLabel` values per the schema, and IfcOpenShell keeps them
183
+ * distinct too (see #4881). Only `undefined` means "not a string at all".
184
+ */
185
+ export function asString(value) {
186
+ return typeof value === 'string' ? value : undefined;
187
+ }
188
+ export function asEnum(value) {
189
+ if (typeof value !== 'string')
190
+ return undefined;
191
+ const match = /^\.([A-Z0-9_]+)\.$/i.exec(value);
192
+ return match?.[1]?.toUpperCase();
193
+ }
194
+ export function asRef(value) {
195
+ return typeof value === 'number' && Number.isInteger(value) && value >= 0
196
+ ? value
197
+ : undefined;
198
+ }
199
+ export function asRefList(value) {
200
+ if (!Array.isArray(value))
201
+ return undefined;
202
+ const refs = [];
203
+ for (const entry of value) {
204
+ const ref = asRef(entry);
205
+ if (ref !== undefined)
206
+ refs.push(ref);
207
+ }
208
+ return refs;
209
+ }
210
+ //# sourceMappingURL=cost-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-reader.js","sourceRoot":"","sources":["../src/cost-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { CostEntityReader } from './cost-reader.js';
2
+ import type { CostDiagnostic, CostRelationshipInfo, CostValueInfo } from './cost-types.js';
3
+ /** Preserve every cost-relevant edge with its original relationship identity. */
4
+ export declare function extractCostRelationships(reader: CostEntityReader, itemIds: Set<number>, scheduleIds: Set<number>, valueIds: Set<number>): CostRelationshipInfo[];
5
+ /** Diagnose malformed nesting and value graphs without discarding them. */
6
+ export declare function diagnoseCostGraphs(relationships: CostRelationshipInfo[], values: CostValueInfo[], itemIds: Set<number>, diagnostics: CostDiagnostic[]): void;
7
+ //# sourceMappingURL=cost-relationships.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-relationships.d.ts","sourceRoot":"","sources":["../src/cost-relationships.ts"],"names":[],"mappings":"AAIA,OAAO,EAAsC,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAExF,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EAEpB,aAAa,EACd,MAAM,iBAAiB,CAAC;AAuCzB,iFAAiF;AACjF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EACxB,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GACpB,oBAAoB,EAAE,CAqHxB;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,oBAAoB,EAAE,EACrC,MAAM,EAAE,aAAa,EAAE,EACvB,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,WAAW,EAAE,cAAc,EAAE,GAC5B,IAAI,CAsCN"}
@@ -0,0 +1,237 @@
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 { asEnum, asRef, asRefList, asString } from './cost-reader.js';
5
+ import { getInheritanceChain } from './ifc-schema.js';
6
+ function base(expressId, Type, a) {
7
+ return { expressId, Type, GlobalId: asString(a[0]), Name: asString(a[2]), Description: asString(a[3]) };
8
+ }
9
+ function reference(reader, expressId, index, required = true) {
10
+ const value = reader.referenceLexeme(expressId, index);
11
+ return { value, invalid: value === undefined && (required || reader.attributePresent(expressId, index)) };
12
+ }
13
+ function references(reader, expressId, index, required = true) {
14
+ const value = reader.referenceListLexeme(expressId, index);
15
+ return { value: value ?? [], invalid: value === undefined && (required || reader.attributePresent(expressId, index)) };
16
+ }
17
+ function targetIs(reader, expressId, roots) {
18
+ const type = reader.typeOf(expressId);
19
+ if (type === undefined)
20
+ return false;
21
+ return getInheritanceChain(type).some(entry => roots.has(entry.toUpperCase()));
22
+ }
23
+ const OBJECT_DEFINITION_ROOT = new Set(['IFCOBJECTDEFINITION']);
24
+ const CONTROL_ROOT = new Set(['IFCCONTROL']);
25
+ const CONTEXT_ROOT = new Set(['IFCCONTEXT']);
26
+ const DEFINITION_SELECT_ROOTS = new Set(['IFCOBJECTDEFINITION', 'IFCPROPERTYDEFINITION']);
27
+ const PROCESS_ROOT = new Set(['IFCPROCESS']);
28
+ const PROCESS_SELECT_ROOTS = new Set(['IFCPROCESS', 'IFCTYPEPROCESS']);
29
+ const PRODUCT_ROOT = new Set(['IFCPRODUCT']);
30
+ const PRODUCT_SELECT_ROOTS = new Set([...PRODUCT_ROOT, 'IFCTYPEPRODUCT']);
31
+ const ROOT = new Set(['IFCROOT']);
32
+ const APPLIED_VALUE_ROOT = new Set(['IFCAPPLIEDVALUE']);
33
+ const COST_ITEM = new Set(['IFCCOSTITEM']);
34
+ const COST_SCHEDULE = new Set(['IFCCOSTSCHEDULE']);
35
+ /** Preserve every cost-relevant edge with its original relationship identity. */
36
+ export function extractCostRelationships(reader, itemIds, scheduleIds, valueIds) {
37
+ const result = [];
38
+ const assignedTasks = new Set();
39
+ for (const expressId of reader.ids('IFCRELASSIGNSTOCONTROL')) {
40
+ const a = reader.get(expressId)?.attributes ?? [];
41
+ const related = references(reader, expressId, 4);
42
+ const control = reference(reader, expressId, 6);
43
+ const candidates = asRefList(a[4]) ?? [];
44
+ const candidateControl = asRef(a[6]);
45
+ if (!itemIds.has(candidateControl ?? -1) && !scheduleIds.has(candidateControl ?? -1) &&
46
+ !candidates.some(id => itemIds.has(id)))
47
+ continue;
48
+ const InvalidReferences = related.invalid || control.invalid ||
49
+ related.value.some(id => !targetIs(reader, id, OBJECT_DEFINITION_ROOT)) ||
50
+ (control.value !== undefined && !targetIs(reader, control.value, CONTROL_ROOT));
51
+ const RelatedObjects = related.value;
52
+ const RelatingControl = control.value;
53
+ result.push({ ...base(expressId, 'IfcRelAssignsToControl', a), RelatedObjects, RelatingControl,
54
+ InvalidReferences: InvalidReferences || undefined });
55
+ if (RelatingControl !== undefined && itemIds.has(RelatingControl)) {
56
+ for (const id of RelatedObjects)
57
+ if (reader.typeOf(id) === 'IFCTASK')
58
+ assignedTasks.add(id);
59
+ }
60
+ }
61
+ for (const expressId of reader.ids('IFCRELASSIGNSTOPRODUCT')) {
62
+ const a = reader.get(expressId)?.attributes ?? [];
63
+ const related = references(reader, expressId, 4);
64
+ const product = reference(reader, expressId, 6);
65
+ if ((asRefList(a[4]) ?? []).some(id => itemIds.has(id))) {
66
+ const InvalidReferences = related.invalid || product.invalid ||
67
+ related.value.some(id => !targetIs(reader, id, OBJECT_DEFINITION_ROOT)) ||
68
+ (product.value !== undefined && !targetIs(reader, product.value, reader.schemaVersion === 'IFC2X3' ? PRODUCT_ROOT : PRODUCT_SELECT_ROOTS));
69
+ result.push({ ...base(expressId, 'IfcRelAssignsToProduct', a), RelatedObjects: related.value,
70
+ RelatingProduct: product.value, InvalidReferences: InvalidReferences || undefined });
71
+ }
72
+ }
73
+ for (const expressId of reader.ids('IFCRELNESTS')) {
74
+ const a = reader.get(expressId)?.attributes ?? [];
75
+ const parent = reference(reader, expressId, 4);
76
+ const related = references(reader, expressId, 5);
77
+ const RelatingObject = parent.value;
78
+ const RelatedObjects = related.value;
79
+ const candidateParent = asRef(a[4]);
80
+ const candidateRelated = asRefList(a[5]) ?? [];
81
+ const InvalidRelatedObjects = related.invalid;
82
+ if ((candidateParent !== undefined && itemIds.has(candidateParent)) || candidateRelated.some(id => itemIds.has(id))) {
83
+ result.push({ ...base(expressId, 'IfcRelNests', a), RelatingObject, RelatedObjects,
84
+ InvalidRelatedObjects: InvalidRelatedObjects || undefined,
85
+ InvalidReferences: (parent.invalid || related.invalid ||
86
+ related.value.some(id => !targetIs(reader, id, OBJECT_DEFINITION_ROOT)) ||
87
+ (parent.value !== undefined && !targetIs(reader, parent.value, OBJECT_DEFINITION_ROOT))) || undefined });
88
+ }
89
+ }
90
+ for (const expressId of reader.ids('IFCRELDECLARES')) {
91
+ const a = reader.get(expressId)?.attributes ?? [];
92
+ const definitions = references(reader, expressId, 5);
93
+ const context = reference(reader, expressId, 4);
94
+ if ((asRefList(a[5]) ?? []).some(id => scheduleIds.has(id) || itemIds.has(id))) {
95
+ const InvalidReferences = definitions.invalid || context.invalid ||
96
+ definitions.value.some(id => !targetIs(reader, id, DEFINITION_SELECT_ROOTS)) ||
97
+ (context.value !== undefined && !targetIs(reader, context.value, CONTEXT_ROOT));
98
+ result.push({ ...base(expressId, 'IfcRelDeclares', a), RelatingContext: context.value,
99
+ RelatedDefinitions: definitions.value, InvalidReferences: InvalidReferences || undefined });
100
+ }
101
+ }
102
+ for (const expressId of reader.ids('IFCRELASSIGNSTOPROCESS')) {
103
+ const a = reader.get(expressId)?.attributes ?? [];
104
+ const related = references(reader, expressId, 4);
105
+ const process = reference(reader, expressId, 6);
106
+ const candidateProcess = asRef(a[6]);
107
+ if ((candidateProcess !== undefined && assignedTasks.has(candidateProcess)) ||
108
+ (asRefList(a[4]) ?? []).some(id => itemIds.has(id))) {
109
+ const InvalidReferences = related.invalid || process.invalid ||
110
+ related.value.some(id => !targetIs(reader, id, OBJECT_DEFINITION_ROOT)) ||
111
+ (process.value !== undefined && !targetIs(reader, process.value, reader.schemaVersion === 'IFC2X3' ? PROCESS_ROOT : PROCESS_SELECT_ROOTS));
112
+ result.push({ ...base(expressId, 'IfcRelAssignsToProcess', a), RelatedObjects: related.value,
113
+ RelatingProcess: process.value, InvalidReferences: InvalidReferences || undefined });
114
+ }
115
+ }
116
+ for (const expressId of reader.ids('IFCRELASSOCIATESAPPLIEDVALUE')) {
117
+ const a = reader.get(expressId)?.attributes ?? [];
118
+ const related = references(reader, expressId, 4);
119
+ const applied = reference(reader, expressId, 5);
120
+ const candidateApplied = asRef(a[5]);
121
+ if ((asRefList(a[4]) ?? []).some(id => itemIds.has(id)) ||
122
+ (candidateApplied !== undefined && valueIds.has(candidateApplied))) {
123
+ const InvalidReferences = related.invalid || applied.invalid ||
124
+ related.value.some(id => !targetIs(reader, id, ROOT)) ||
125
+ (applied.value !== undefined && !targetIs(reader, applied.value, APPLIED_VALUE_ROOT));
126
+ result.push({ ...base(expressId, 'IfcRelAssociatesAppliedValue', a), RelatedObjects: related.value,
127
+ RelatingAppliedValue: applied.value, InvalidReferences: InvalidReferences || undefined });
128
+ }
129
+ }
130
+ for (const expressId of reader.ids('IFCRELSCHEDULESCOSTITEMS')) {
131
+ const a = reader.get(expressId)?.attributes ?? [];
132
+ const related = references(reader, expressId, 4);
133
+ const control = reference(reader, expressId, 6);
134
+ const InvalidReferences = related.invalid || control.invalid ||
135
+ related.value.some(id => !targetIs(reader, id, COST_ITEM)) ||
136
+ (control.value !== undefined && !targetIs(reader, control.value, COST_SCHEDULE));
137
+ result.push({ ...base(expressId, 'IfcRelSchedulesCostItems', a), RelatedObjects: related.value,
138
+ RelatingControl: control.value, InvalidReferences: InvalidReferences || undefined });
139
+ }
140
+ for (const expressId of reader.ids('IFCAPPLIEDVALUERELATIONSHIP')) {
141
+ const a = reader.get(expressId)?.attributes ?? [];
142
+ const total = reference(reader, expressId, 0);
143
+ const components = references(reader, expressId, 1);
144
+ result.push({
145
+ expressId, Type: 'IfcAppliedValueRelationship', ComponentOfTotal: total.value,
146
+ Components: components.value, ArithmeticOperator: asEnum(a[2]),
147
+ Name: asString(a[3]), Description: asString(a[4]),
148
+ InvalidReferences: (total.invalid || components.invalid ||
149
+ (total.value !== undefined && !targetIs(reader, total.value, APPLIED_VALUE_ROOT)) ||
150
+ components.value.some(id => !targetIs(reader, id, APPLIED_VALUE_ROOT))) || undefined,
151
+ });
152
+ }
153
+ return result;
154
+ }
155
+ /** Diagnose malformed nesting and value graphs without discarding them. */
156
+ export function diagnoseCostGraphs(relationships, values, itemIds, diagnostics) {
157
+ for (const relationship of relationships) {
158
+ if (relationship.InvalidReferences)
159
+ diagnostics.push({
160
+ Code: 'INVALID_LIST', Message: `${relationship.Type} #${relationship.expressId} contains an invalid endpoint`,
161
+ Severity: 'error', expressId: relationship.expressId,
162
+ });
163
+ }
164
+ const parents = new Map();
165
+ const children = new Map();
166
+ for (const rel of relationships) {
167
+ if (rel.Type !== 'IfcRelNests' || rel.RelatingObject === undefined || !itemIds.has(rel.RelatingObject))
168
+ continue;
169
+ if (rel.InvalidRelatedObjects)
170
+ diagnostics.push({
171
+ Code: 'INVALID_LIST', Message: `RelatedObjects on IfcRelNests #${rel.expressId} is malformed`,
172
+ Severity: 'error', expressId: rel.expressId,
173
+ });
174
+ const list = children.get(rel.RelatingObject) ?? [];
175
+ for (const child of rel.RelatedObjects ?? []) {
176
+ if (!itemIds.has(child))
177
+ continue;
178
+ const previous = parents.get(child);
179
+ if (previous !== undefined) {
180
+ diagnostics.push({ Code: 'MULTIPLE_NESTING_PARENTS', Message: `Cost item #${child} participates in multiple nesting relationships`, Severity: 'error', expressId: child, RelatedExpressId: rel.expressId });
181
+ }
182
+ else
183
+ parents.set(child, { parent: rel.RelatingObject, relationship: rel.expressId });
184
+ list.push(child);
185
+ }
186
+ children.set(rel.RelatingObject, list);
187
+ }
188
+ const valueMap = new Map();
189
+ for (const value of values)
190
+ if (value.expressId !== undefined)
191
+ valueMap.set(value.expressId, value);
192
+ const valueEdges = new Map();
193
+ for (const [id, value] of valueMap)
194
+ valueEdges.set(id, [...(value.Components ?? [])]);
195
+ for (const relationship of relationships) {
196
+ if (relationship.Type !== 'IfcAppliedValueRelationship' || relationship.ComponentOfTotal === undefined)
197
+ continue;
198
+ const edges = valueEdges.get(relationship.ComponentOfTotal) ?? [];
199
+ for (const component of relationship.Components ?? [])
200
+ edges.push(component);
201
+ valueEdges.set(relationship.ComponentOfTotal, edges);
202
+ }
203
+ diagnoseCycles(children, itemIds, 'NESTING_CYCLE', 'Cost item nesting', diagnostics);
204
+ diagnoseCycles(valueEdges, new Set(valueEdges.keys()), 'VALUE_CYCLE', 'IfcAppliedValue', diagnostics);
205
+ }
206
+ function diagnoseCycles(edges, nodes, Code, label, diagnostics) {
207
+ const state = new Map();
208
+ const reported = new Set();
209
+ for (const root of nodes) {
210
+ if (state.has(root))
211
+ continue;
212
+ const stack = [{ id: root, next: 0 }];
213
+ state.set(root, 1);
214
+ while (stack.length > 0) {
215
+ const frame = stack[stack.length - 1];
216
+ const adjacent = edges.get(frame.id) ?? [];
217
+ if (frame.next >= adjacent.length) {
218
+ state.set(frame.id, 2);
219
+ stack.pop();
220
+ continue;
221
+ }
222
+ const child = adjacent[frame.next++];
223
+ if (!nodes.has(child))
224
+ continue;
225
+ const childState = state.get(child);
226
+ if (childState === 1 && !reported.has(child)) {
227
+ diagnostics.push({ Code, Message: `${label} cycle includes #${child}`, Severity: 'error', expressId: child });
228
+ reported.add(child);
229
+ }
230
+ else if (childState === undefined) {
231
+ state.set(child, 1);
232
+ stack.push({ id: child, next: 0 });
233
+ }
234
+ }
235
+ }
236
+ }
237
+ //# sourceMappingURL=cost-relationships.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-relationships.js","sourceRoot":"","sources":["../src/cost-relationships.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare function withoutStepComments(token: string): string;
2
+ /** Distinguish an omitted STEP attribute from malformed-but-present input. */
3
+ export declare function costAttributePresent(token: string | undefined): boolean;
4
+ /** Split one entity parameter list while retaining the original STEP lexemes. */
5
+ export declare function splitCostAttributeLexemes(record: string): string[];
6
+ /** Return the exact numeric token, unwrapping an IFC typed value when present. */
7
+ export declare function costNumericLexeme(token: string | undefined): string | undefined;
8
+ /** Return the EXPRESS wrapper around an exact numeric token, if one was supplied. */
9
+ export declare function costNumericTypeLexeme(token: string | undefined): string | undefined;
10
+ /** True only when the STEP significand is zero; exponent digits do not count. */
11
+ export declare function isZeroCostNumericLexeme(token: string): boolean;
12
+ /** Read one exact STEP entity-reference token, rejecting integer literals. */
13
+ export declare function costReferenceLexeme(token: string | undefined): number | undefined;
14
+ /** Read a flat non-empty aggregate of exact STEP entity-reference tokens. */
15
+ export declare function costReferenceListLexeme(token: string | undefined): number[] | undefined;
16
+ //# sourceMappingURL=cost-step-lexemes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost-step-lexemes.d.ts","sourceRoot":"","sources":["../src/cost-step-lexemes.ts"],"names":[],"mappings":"AASA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAkBzD;AAID,8EAA8E;AAC9E,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAIvE;AAED,iFAAiF;AACjF,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CA+ClE;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAM/E;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAInF;AAED,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIjF;AAED,6EAA6E;AAC7E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,SAAS,CAQvF"}