@ifc-lite/parser 1.0.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 (95) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +326 -0
  3. package/dist/classification-extractor.d.ts +73 -0
  4. package/dist/classification-extractor.d.ts.map +1 -0
  5. package/dist/classification-extractor.js +218 -0
  6. package/dist/classification-extractor.js.map +1 -0
  7. package/dist/columnar-parser.d.ts +43 -0
  8. package/dist/columnar-parser.d.ts.map +1 -0
  9. package/dist/columnar-parser.js +226 -0
  10. package/dist/columnar-parser.js.map +1 -0
  11. package/dist/entity-extractor.d.ts +15 -0
  12. package/dist/entity-extractor.d.ts.map +1 -0
  13. package/dist/entity-extractor.js +144 -0
  14. package/dist/entity-extractor.js.map +1 -0
  15. package/dist/entity-index.d.ts +11 -0
  16. package/dist/entity-index.d.ts.map +1 -0
  17. package/dist/entity-index.js +24 -0
  18. package/dist/entity-index.js.map +1 -0
  19. package/dist/examples/comprehensive-extraction.d.ts +76 -0
  20. package/dist/examples/comprehensive-extraction.d.ts.map +1 -0
  21. package/dist/examples/comprehensive-extraction.js +228 -0
  22. package/dist/examples/comprehensive-extraction.js.map +1 -0
  23. package/dist/generated/entities.d.ts +6198 -0
  24. package/dist/generated/entities.d.ts.map +1 -0
  25. package/dist/generated/entities.js +5 -0
  26. package/dist/generated/entities.js.map +1 -0
  27. package/dist/generated/enums.d.ts +2260 -0
  28. package/dist/generated/enums.d.ts.map +1 -0
  29. package/dist/generated/enums.js +2470 -0
  30. package/dist/generated/enums.js.map +1 -0
  31. package/dist/generated/index.d.ts +11 -0
  32. package/dist/generated/index.d.ts.map +1 -0
  33. package/dist/generated/index.js +14 -0
  34. package/dist/generated/index.js.map +1 -0
  35. package/dist/generated/schema-registry.d.ts +50 -0
  36. package/dist/generated/schema-registry.d.ts.map +1 -0
  37. package/dist/generated/schema-registry.js +60518 -0
  38. package/dist/generated/schema-registry.js.map +1 -0
  39. package/dist/generated/selects.d.ts +127 -0
  40. package/dist/generated/selects.d.ts.map +1 -0
  41. package/dist/generated/selects.js +5 -0
  42. package/dist/generated/selects.js.map +1 -0
  43. package/dist/generated/test-compile.d.ts +7 -0
  44. package/dist/generated/test-compile.d.ts.map +1 -0
  45. package/dist/generated/test-compile.js +30 -0
  46. package/dist/generated/test-compile.js.map +1 -0
  47. package/dist/generated/types.d.ts +801 -0
  48. package/dist/generated/types.d.ts.map +1 -0
  49. package/dist/generated/types.js +499 -0
  50. package/dist/generated/types.js.map +1 -0
  51. package/dist/georef-extractor.d.ts +60 -0
  52. package/dist/georef-extractor.d.ts.map +1 -0
  53. package/dist/georef-extractor.js +200 -0
  54. package/dist/georef-extractor.js.map +1 -0
  55. package/dist/ifc-schema.d.ts +13 -0
  56. package/dist/ifc-schema.d.ts.map +1 -0
  57. package/dist/ifc-schema.js +203 -0
  58. package/dist/ifc-schema.js.map +1 -0
  59. package/dist/index.d.ts +43 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +150 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/material-extractor.d.ts +97 -0
  64. package/dist/material-extractor.d.ts.map +1 -0
  65. package/dist/material-extractor.js +283 -0
  66. package/dist/material-extractor.js.map +1 -0
  67. package/dist/property-extractor.d.ts +23 -0
  68. package/dist/property-extractor.d.ts.map +1 -0
  69. package/dist/property-extractor.js +102 -0
  70. package/dist/property-extractor.js.map +1 -0
  71. package/dist/quantity-extractor.d.ts +64 -0
  72. package/dist/quantity-extractor.d.ts.map +1 -0
  73. package/dist/quantity-extractor.js +202 -0
  74. package/dist/quantity-extractor.js.map +1 -0
  75. package/dist/relationship-extractor.d.ts +18 -0
  76. package/dist/relationship-extractor.d.ts.map +1 -0
  77. package/dist/relationship-extractor.js +91 -0
  78. package/dist/relationship-extractor.js.map +1 -0
  79. package/dist/spatial-hierarchy-builder.d.ts +21 -0
  80. package/dist/spatial-hierarchy-builder.d.ts.map +1 -0
  81. package/dist/spatial-hierarchy-builder.js +201 -0
  82. package/dist/spatial-hierarchy-builder.js.map +1 -0
  83. package/dist/style-extractor.d.ts +83 -0
  84. package/dist/style-extractor.d.ts.map +1 -0
  85. package/dist/style-extractor.js +327 -0
  86. package/dist/style-extractor.js.map +1 -0
  87. package/dist/tokenizer.d.ts +26 -0
  88. package/dist/tokenizer.d.ts.map +1 -0
  89. package/dist/tokenizer.js +181 -0
  90. package/dist/tokenizer.js.map +1 -0
  91. package/dist/types.d.ts +42 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +5 -0
  94. package/dist/types.js.map +1 -0
  95. package/package.json +47 -0
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Classification Extractor
3
+ *
4
+ * Extracts IFC classification information.
5
+ *
6
+ * Classification systems in IFC:
7
+ * - IfcClassification: The classification system itself (e.g., Uniclass, Omniclass, MasterFormat)
8
+ * - IfcClassificationReference: Reference to a specific class in the system
9
+ * - IfcRelAssociatesClassification: Associates classifications with elements
10
+ *
11
+ * Common classification systems:
12
+ * - Uniclass 2015 (UK)
13
+ * - Omniclass (North America)
14
+ * - MasterFormat (North America)
15
+ * - Uniformat (North America)
16
+ * - DIN 276 (Germany)
17
+ * - SfB (Sweden/Denmark)
18
+ */
19
+ import type { IfcEntity } from './entity-extractor';
20
+ export interface Classification {
21
+ id: number;
22
+ name: string;
23
+ source?: string;
24
+ edition?: string;
25
+ editionDate?: string;
26
+ description?: string;
27
+ location?: string;
28
+ referenceTokens?: string[];
29
+ }
30
+ export interface ClassificationReference {
31
+ id: number;
32
+ location?: string;
33
+ identification?: string;
34
+ name?: string;
35
+ referencedSource?: number;
36
+ description?: string;
37
+ sort?: string;
38
+ }
39
+ export interface ClassificationAssociation {
40
+ relationshipId: number;
41
+ classificationId: number;
42
+ relatedObjects: number[];
43
+ }
44
+ export interface ClassificationsData {
45
+ classifications: Map<number, Classification>;
46
+ classificationReferences: Map<number, ClassificationReference>;
47
+ associations: ClassificationAssociation[];
48
+ }
49
+ /**
50
+ * Extract classifications from IFC entities
51
+ */
52
+ export declare function extractClassifications(entities: Map<number, IfcEntity>, entitiesByType: Map<string, number[]>): ClassificationsData;
53
+ /**
54
+ * Get classifications for an element
55
+ */
56
+ export declare function getClassificationsForElement(elementId: number, classificationsData: ClassificationsData): ClassificationReference[];
57
+ /**
58
+ * Get classification code for an element (first classification found)
59
+ */
60
+ export declare function getClassificationCodeForElement(elementId: number, classificationsData: ClassificationsData): string | undefined;
61
+ /**
62
+ * Get full classification path (e.g., "Pr_60 > Pr_60_10 > Pr_60_10_32")
63
+ */
64
+ export declare function getClassificationPath(classificationRefId: number, classificationsData: ClassificationsData): string[];
65
+ /**
66
+ * Group elements by classification
67
+ */
68
+ export declare function groupElementsByClassification(classificationsData: ClassificationsData): Map<string, number[]>;
69
+ /**
70
+ * Get classification system name
71
+ */
72
+ export declare function getClassificationSystemName(classificationRefId: number, classificationsData: ClassificationsData): string | undefined;
73
+ //# sourceMappingURL=classification-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classification-extractor.d.ts","sourceRoot":"","sources":["../src/classification-extractor.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAC7C,wBAAwB,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC/D,YAAY,EAAE,yBAAyB,EAAE,CAAC;CAC3C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAChC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,mBAAmB,CAsCrB;AAmED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,mBAAmB,GACvC,uBAAuB,EAAE,CAc3B;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAC7C,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,GAAG,SAAS,CAGpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,EAAE,CA8BV;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAC3C,mBAAmB,EAAE,mBAAmB,GACvC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAavB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,mBAAmB,EAAE,MAAM,EAC3B,mBAAmB,EAAE,mBAAmB,GACvC,MAAM,GAAG,SAAS,CAmBpB"}
@@ -0,0 +1,218 @@
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
+ * Extract classifications from IFC entities
6
+ */
7
+ export function extractClassifications(entities, entitiesByType) {
8
+ const data = {
9
+ classifications: new Map(),
10
+ classificationReferences: new Map(),
11
+ associations: [],
12
+ };
13
+ // Extract IfcClassification
14
+ const classificationIds = entitiesByType.get('IfcClassification') || [];
15
+ for (const id of classificationIds) {
16
+ const entity = entities.get(id);
17
+ if (entity) {
18
+ data.classifications.set(id, extractClassification(entity));
19
+ }
20
+ }
21
+ // Extract IfcClassificationReference
22
+ const referenceIds = entitiesByType.get('IfcClassificationReference') || [];
23
+ for (const id of referenceIds) {
24
+ const entity = entities.get(id);
25
+ if (entity) {
26
+ data.classificationReferences.set(id, extractClassificationReference(entity));
27
+ }
28
+ }
29
+ // Extract IfcRelAssociatesClassification
30
+ const relIds = entitiesByType.get('IfcRelAssociatesClassification') || [];
31
+ for (const id of relIds) {
32
+ const entity = entities.get(id);
33
+ if (entity) {
34
+ const association = extractClassificationAssociation(entity);
35
+ if (association) {
36
+ data.associations.push(association);
37
+ }
38
+ }
39
+ }
40
+ return data;
41
+ }
42
+ function extractClassification(entity) {
43
+ // IfcClassification attributes (IFC4):
44
+ // [0] Source (OPTIONAL IfcLabel)
45
+ // [1] Edition (OPTIONAL IfcLabel)
46
+ // [2] EditionDate (OPTIONAL IfcDate)
47
+ // [3] Name (IfcLabel)
48
+ // [4] Description (OPTIONAL IfcText)
49
+ // [5] Location (OPTIONAL IfcURIReference)
50
+ // [6] ReferenceTokens (OPTIONAL LIST OF IfcIdentifier)
51
+ return {
52
+ id: entity.id,
53
+ source: getString(entity.attributes[0]),
54
+ edition: getString(entity.attributes[1]),
55
+ editionDate: getString(entity.attributes[2]),
56
+ name: getString(entity.attributes[3]) || '',
57
+ description: getString(entity.attributes[4]),
58
+ location: getString(entity.attributes[5]),
59
+ referenceTokens: getStringList(entity.attributes[6]),
60
+ };
61
+ }
62
+ function extractClassificationReference(entity) {
63
+ // IfcClassificationReference attributes (IFC4):
64
+ // [0] Location (OPTIONAL IfcURIReference)
65
+ // [1] Identification (OPTIONAL IfcIdentifier)
66
+ // [2] Name (OPTIONAL IfcLabel)
67
+ // [3] ReferencedSource (OPTIONAL IfcClassificationReferenceSelect)
68
+ // [4] Description (OPTIONAL IfcText)
69
+ // [5] Sort (OPTIONAL IfcIdentifier)
70
+ return {
71
+ id: entity.id,
72
+ location: getString(entity.attributes[0]),
73
+ identification: getString(entity.attributes[1]),
74
+ name: getString(entity.attributes[2]),
75
+ referencedSource: getReference(entity.attributes[3]),
76
+ description: getString(entity.attributes[4]),
77
+ sort: getString(entity.attributes[5]),
78
+ };
79
+ }
80
+ function extractClassificationAssociation(entity) {
81
+ // IfcRelAssociatesClassification attributes:
82
+ // [0] GlobalId
83
+ // [1] OwnerHistory
84
+ // [2] Name
85
+ // [3] Description
86
+ // [4] RelatedObjects (list of elements)
87
+ // [5] RelatingClassification (ClassificationReference or Classification)
88
+ const relatedObjects = getReferences(entity.attributes[4]) || [];
89
+ const classificationRef = getReference(entity.attributes[5]);
90
+ if (!classificationRef) {
91
+ return null;
92
+ }
93
+ return {
94
+ relationshipId: entity.id,
95
+ classificationId: classificationRef,
96
+ relatedObjects,
97
+ };
98
+ }
99
+ /**
100
+ * Get classifications for an element
101
+ */
102
+ export function getClassificationsForElement(elementId, classificationsData) {
103
+ const results = [];
104
+ // Find all associations for this element
105
+ for (const assoc of classificationsData.associations) {
106
+ if (assoc.relatedObjects.includes(elementId)) {
107
+ const ref = classificationsData.classificationReferences.get(assoc.classificationId);
108
+ if (ref) {
109
+ results.push(ref);
110
+ }
111
+ }
112
+ }
113
+ return results;
114
+ }
115
+ /**
116
+ * Get classification code for an element (first classification found)
117
+ */
118
+ export function getClassificationCodeForElement(elementId, classificationsData) {
119
+ const classifications = getClassificationsForElement(elementId, classificationsData);
120
+ return classifications[0]?.identification;
121
+ }
122
+ /**
123
+ * Get full classification path (e.g., "Pr_60 > Pr_60_10 > Pr_60_10_32")
124
+ */
125
+ export function getClassificationPath(classificationRefId, classificationsData) {
126
+ const path = [];
127
+ let currentId = classificationRefId;
128
+ // Walk up the reference chain
129
+ while (currentId !== undefined) {
130
+ const ref = classificationsData.classificationReferences.get(currentId);
131
+ if (!ref)
132
+ break;
133
+ // Add identification or name to path
134
+ const code = ref.identification || ref.name;
135
+ if (code) {
136
+ path.unshift(code); // Add to front
137
+ }
138
+ // Move to parent
139
+ currentId = ref.referencedSource;
140
+ // Stop if we reached a Classification (not a ClassificationReference)
141
+ if (currentId && !classificationsData.classificationReferences.has(currentId)) {
142
+ // This is a Classification, add its name
143
+ const classification = classificationsData.classifications.get(currentId);
144
+ if (classification) {
145
+ path.unshift(classification.name);
146
+ }
147
+ break;
148
+ }
149
+ }
150
+ return path;
151
+ }
152
+ /**
153
+ * Group elements by classification
154
+ */
155
+ export function groupElementsByClassification(classificationsData) {
156
+ const groups = new Map();
157
+ for (const assoc of classificationsData.associations) {
158
+ const ref = classificationsData.classificationReferences.get(assoc.classificationId);
159
+ const code = ref?.identification || ref?.name || 'Unclassified';
160
+ const existing = groups.get(code) || [];
161
+ existing.push(...assoc.relatedObjects);
162
+ groups.set(code, existing);
163
+ }
164
+ return groups;
165
+ }
166
+ /**
167
+ * Get classification system name
168
+ */
169
+ export function getClassificationSystemName(classificationRefId, classificationsData) {
170
+ // Walk up to find the root Classification
171
+ let currentId = classificationRefId;
172
+ while (currentId !== undefined) {
173
+ // Check if this is a Classification
174
+ const classification = classificationsData.classifications.get(currentId);
175
+ if (classification) {
176
+ return classification.name;
177
+ }
178
+ // Otherwise, get the parent reference
179
+ const ref = classificationsData.classificationReferences.get(currentId);
180
+ if (!ref || !ref.referencedSource)
181
+ break;
182
+ currentId = ref.referencedSource;
183
+ }
184
+ return undefined;
185
+ }
186
+ // Helper functions
187
+ function getString(value) {
188
+ if (value === null || value === undefined)
189
+ return undefined;
190
+ if (typeof value === 'string')
191
+ return value;
192
+ return String(value);
193
+ }
194
+ function getReference(value) {
195
+ if (value === null || value === undefined)
196
+ return undefined;
197
+ if (typeof value === 'number')
198
+ return value;
199
+ if (typeof value === 'string' && value.startsWith('#')) {
200
+ return parseInt(value.substring(1));
201
+ }
202
+ return undefined;
203
+ }
204
+ function getReferences(value) {
205
+ if (!Array.isArray(value))
206
+ return undefined;
207
+ return value
208
+ .map(v => getReference(v))
209
+ .filter(ref => ref !== undefined);
210
+ }
211
+ function getStringList(value) {
212
+ if (!Array.isArray(value))
213
+ return undefined;
214
+ return value
215
+ .map(v => getString(v))
216
+ .filter(str => str !== undefined);
217
+ }
218
+ //# sourceMappingURL=classification-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classification-extractor.js","sourceRoot":"","sources":["../src/classification-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Columnar parser - builds columnar data structures
3
+ */
4
+ import type { EntityRef, IfcEntity } from './types.js';
5
+ import { StringTable, EntityTableBuilder, PropertyTableBuilder, RelationshipGraphBuilder } from '@ifc-lite/data';
6
+ import type { SpatialHierarchy, QuantityTable } from '@ifc-lite/data';
7
+ export interface SpatialIndex {
8
+ queryAABB(bounds: {
9
+ min: [number, number, number];
10
+ max: [number, number, number];
11
+ }): number[];
12
+ raycast(origin: [number, number, number], direction: [number, number, number]): number[];
13
+ }
14
+ export interface IfcDataStore {
15
+ fileSize: number;
16
+ schemaVersion: 'IFC2X3' | 'IFC4' | 'IFC4X3';
17
+ entityCount: number;
18
+ parseTime: number;
19
+ source: Uint8Array;
20
+ entityIndex: {
21
+ byId: Map<number, EntityRef>;
22
+ byType: Map<string, number[]>;
23
+ };
24
+ strings: StringTable;
25
+ entities: ReturnType<EntityTableBuilder['build']>;
26
+ properties: ReturnType<PropertyTableBuilder['build']>;
27
+ quantities: QuantityTable;
28
+ relationships: ReturnType<RelationshipGraphBuilder['build']>;
29
+ spatialHierarchy?: SpatialHierarchy;
30
+ spatialIndex?: SpatialIndex;
31
+ }
32
+ export declare class ColumnarParser {
33
+ /**
34
+ * Parse IFC file into columnar data store
35
+ */
36
+ parse(buffer: ArrayBuffer, entityRefs: EntityRef[], entities: Map<number, IfcEntity>, options?: {
37
+ onProgress?: (progress: {
38
+ phase: string;
39
+ percent: number;
40
+ }) => void;
41
+ }): Promise<IfcDataStore>;
42
+ }
43
+ //# sourceMappingURL=columnar-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnar-parser.d.ts","sourceRoot":"","sources":["../src/columnar-parser.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAKvD,OAAO,EACH,WAAW,EACX,kBAAkB,EAClB,oBAAoB,EAEpB,wBAAwB,EAI3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAItE,MAAM,WAAW,YAAY;IACzB,SAAS,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,MAAM,EAAE,CAAC;IAC9F,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC;CAC5F;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAElB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;KAAE,CAAC;IAE7E,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,UAAU,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IAClD,UAAU,EAAE,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtD,UAAU,EAAE,aAAa,CAAC;IAC1B,aAAa,EAAE,UAAU,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IAG7D,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B;AAED,qBAAa,cAAc;IACvB;;OAEG;IACG,KAAK,CACP,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAChC,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAA;KAAO,GACtF,OAAO,CAAC,YAAY,CAAC;CAuP3B"}
@@ -0,0 +1,226 @@
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 { PropertyExtractor } from './property-extractor.js';
5
+ import { QuantityExtractor } from './quantity-extractor.js';
6
+ import { RelationshipExtractor } from './relationship-extractor.js';
7
+ import { SpatialHierarchyBuilder } from './spatial-hierarchy-builder.js';
8
+ import { StringTable, EntityTableBuilder, PropertyTableBuilder, QuantityTableBuilder, RelationshipGraphBuilder, RelationshipType, PropertyValueType, QuantityType, } from '@ifc-lite/data';
9
+ export class ColumnarParser {
10
+ /**
11
+ * Parse IFC file into columnar data store
12
+ */
13
+ async parse(buffer, entityRefs, entities, options = {}) {
14
+ const startTime = performance.now();
15
+ const uint8Buffer = new Uint8Array(buffer);
16
+ // Initialize builders
17
+ const strings = new StringTable();
18
+ const entityTableBuilder = new EntityTableBuilder(entities.size, strings);
19
+ const propertyTableBuilder = new PropertyTableBuilder(strings);
20
+ const relationshipGraphBuilder = new RelationshipGraphBuilder();
21
+ // === Build Entity Table ===
22
+ options.onProgress?.({ phase: 'entities', percent: 0 });
23
+ let processed = 0;
24
+ for (const [id, entity] of entities) {
25
+ const attrs = entity.attributes || [];
26
+ const globalId = String(attrs[0] || '');
27
+ const name = String(attrs[2] || '');
28
+ const description = String(attrs[3] || '');
29
+ const objectType = String(attrs[7] || '');
30
+ // Check if entity has geometry (simplified check)
31
+ const hasGeometry = entity.type.toUpperCase().includes('WALL') ||
32
+ entity.type.toUpperCase().includes('DOOR') ||
33
+ entity.type.toUpperCase().includes('WINDOW') ||
34
+ entity.type.toUpperCase().includes('SLAB') ||
35
+ entity.type.toUpperCase().includes('COLUMN') ||
36
+ entity.type.toUpperCase().includes('BEAM');
37
+ const isType = entity.type.toUpperCase().endsWith('TYPE');
38
+ entityTableBuilder.add(id, entity.type, globalId, name, description, objectType, hasGeometry, isType);
39
+ processed++;
40
+ if (processed % 1000 === 0) {
41
+ options.onProgress?.({ phase: 'entities', percent: (processed / entities.size) * 100 });
42
+ }
43
+ }
44
+ const entityTable = entityTableBuilder.build();
45
+ options.onProgress?.({ phase: 'entities', percent: 100 });
46
+ // === Build Property Table ===
47
+ options.onProgress?.({ phase: 'properties', percent: 0 });
48
+ const propertyExtractor = new PropertyExtractor(entities);
49
+ const propertySets = propertyExtractor.extractPropertySets();
50
+ // Build mapping: psetId -> entityIds
51
+ const psetToEntities = new Map();
52
+ const relationshipExtractor = new RelationshipExtractor(entities);
53
+ const relationships = relationshipExtractor.extractRelationships();
54
+ for (const rel of relationships) {
55
+ if (rel.type.toUpperCase() === 'IFCRELDEFINESBYPROPERTIES') {
56
+ const psetId = rel.relatingObject;
57
+ for (const entityId of rel.relatedObjects) {
58
+ let list = psetToEntities.get(psetId);
59
+ if (!list) {
60
+ list = [];
61
+ psetToEntities.set(psetId, list);
62
+ }
63
+ list.push(entityId);
64
+ }
65
+ }
66
+ }
67
+ // Extract properties into columnar format
68
+ for (const [psetId, pset] of propertySets) {
69
+ const entityIds = psetToEntities.get(psetId) || [];
70
+ const globalId = String(entities.get(psetId)?.attributes?.[0] || '');
71
+ for (const [propName, propValue] of pset.properties) {
72
+ for (const entityId of entityIds) {
73
+ let propType = PropertyValueType.String;
74
+ let value = propValue.value;
75
+ if (propValue.type === 'number') {
76
+ propType = PropertyValueType.Real;
77
+ value = propValue.value;
78
+ }
79
+ else if (propValue.type === 'boolean') {
80
+ propType = PropertyValueType.Boolean;
81
+ value = propValue.value;
82
+ }
83
+ else if (propValue.type === 'string') {
84
+ propType = PropertyValueType.String;
85
+ value = String(propValue.value);
86
+ }
87
+ propertyTableBuilder.add({
88
+ entityId,
89
+ psetName: pset.name,
90
+ psetGlobalId: globalId,
91
+ propName,
92
+ propType,
93
+ value,
94
+ });
95
+ }
96
+ }
97
+ }
98
+ const propertyTable = propertyTableBuilder.build();
99
+ options.onProgress?.({ phase: 'properties', percent: 100 });
100
+ // === Build Quantity Table ===
101
+ options.onProgress?.({ phase: 'quantities', percent: 0 });
102
+ const quantityTableBuilder = new QuantityTableBuilder(strings);
103
+ const quantityExtractor = new QuantityExtractor(entities);
104
+ const quantitySets = quantityExtractor.extractQuantitySets();
105
+ // Build mapping: qsetId -> entityIds (similar to properties)
106
+ const qsetToEntities = new Map();
107
+ for (const rel of relationships) {
108
+ if (rel.type.toUpperCase() === 'IFCRELDEFINESBYPROPERTIES') {
109
+ const qsetId = rel.relatingObject;
110
+ // Check if this is actually a quantity set (not a property set)
111
+ if (quantitySets.has(qsetId)) {
112
+ for (const entityId of rel.relatedObjects) {
113
+ let list = qsetToEntities.get(qsetId);
114
+ if (!list) {
115
+ list = [];
116
+ qsetToEntities.set(qsetId, list);
117
+ }
118
+ list.push(entityId);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ // Map quantity type names to QuantityType enum
124
+ const quantityTypeMap = {
125
+ 'length': QuantityType.Length,
126
+ 'area': QuantityType.Area,
127
+ 'volume': QuantityType.Volume,
128
+ 'count': QuantityType.Count,
129
+ 'weight': QuantityType.Weight,
130
+ 'time': QuantityType.Time,
131
+ };
132
+ // Extract quantities into columnar format
133
+ for (const [qsetId, qset] of quantitySets) {
134
+ const entityIds = qsetToEntities.get(qsetId) || [];
135
+ for (const quantity of qset.quantities) {
136
+ for (const entityId of entityIds) {
137
+ quantityTableBuilder.add({
138
+ entityId,
139
+ qsetName: qset.name,
140
+ quantityName: quantity.name,
141
+ quantityType: quantityTypeMap[quantity.type] ?? QuantityType.Length,
142
+ value: quantity.value,
143
+ formula: quantity.formula,
144
+ });
145
+ }
146
+ }
147
+ }
148
+ const quantityTable = quantityTableBuilder.build();
149
+ options.onProgress?.({ phase: 'quantities', percent: 100 });
150
+ // === Build Relationship Graph ===
151
+ options.onProgress?.({ phase: 'relationships', percent: 0 });
152
+ const relTypeMap = {
153
+ 'IFCRELCONTAINEDINSPATIALSTRUCTURE': RelationshipType.ContainsElements,
154
+ 'IFCRELAGGREGATES': RelationshipType.Aggregates,
155
+ 'IFCRELDEFINESBYPROPERTIES': RelationshipType.DefinesByProperties,
156
+ 'IFCRELDEFINESBYTYPE': RelationshipType.DefinesByType,
157
+ 'IFCRELASSOCIATESMATERIAL': RelationshipType.AssociatesMaterial,
158
+ 'IFCRELASSOCIATESCLASSIFICATION': RelationshipType.AssociatesClassification,
159
+ 'IFCRELVOIDSELEMENT': RelationshipType.VoidsElement,
160
+ 'IFCRELFILLSELEMENT': RelationshipType.FillsElement,
161
+ 'IFCRELCONNECTSPATHELEMENTS': RelationshipType.ConnectsPathElements,
162
+ 'IFCRELSPACEBOUNDARY': RelationshipType.SpaceBoundary,
163
+ };
164
+ for (const rel of relationships) {
165
+ const relType = relTypeMap[rel.type.toUpperCase()];
166
+ if (relType) {
167
+ for (const targetId of rel.relatedObjects) {
168
+ relationshipGraphBuilder.addEdge(rel.relatingObject, targetId, relType, rel.relatingObject);
169
+ }
170
+ }
171
+ }
172
+ const relationshipGraph = relationshipGraphBuilder.build();
173
+ options.onProgress?.({ phase: 'relationships', percent: 100 });
174
+ // Detect schema version (simplified)
175
+ let schemaVersion = 'IFC4';
176
+ for (const [, entity] of entities) {
177
+ if (entity.type.toUpperCase() === 'IFCPROJECT') {
178
+ // Check schema version from header or entity
179
+ schemaVersion = 'IFC4';
180
+ break;
181
+ }
182
+ }
183
+ const parseTime = performance.now() - startTime;
184
+ // Build entity index
185
+ const entityIndex = {
186
+ byId: new Map(),
187
+ byType: new Map(),
188
+ };
189
+ for (const ref of entityRefs) {
190
+ entityIndex.byId.set(ref.expressId, ref);
191
+ let typeList = entityIndex.byType.get(ref.type);
192
+ if (!typeList) {
193
+ typeList = [];
194
+ entityIndex.byType.set(ref.type, typeList);
195
+ }
196
+ typeList.push(ref.expressId);
197
+ }
198
+ // === Build Spatial Hierarchy ===
199
+ options.onProgress?.({ phase: 'spatial-hierarchy', percent: 0 });
200
+ let spatialHierarchy;
201
+ try {
202
+ const hierarchyBuilder = new SpatialHierarchyBuilder();
203
+ spatialHierarchy = hierarchyBuilder.build(entityTable, relationshipGraph, strings, uint8Buffer, entityIndex);
204
+ }
205
+ catch (error) {
206
+ console.warn('[ColumnarParser] Failed to build spatial hierarchy:', error);
207
+ // Continue without hierarchy - it's optional
208
+ }
209
+ options.onProgress?.({ phase: 'spatial-hierarchy', percent: 100 });
210
+ return {
211
+ fileSize: buffer.byteLength,
212
+ schemaVersion,
213
+ entityCount: entities.size,
214
+ parseTime,
215
+ source: uint8Buffer,
216
+ entityIndex,
217
+ strings,
218
+ entities: entityTable,
219
+ properties: propertyTable,
220
+ quantities: quantityTable,
221
+ relationships: relationshipGraph,
222
+ spatialHierarchy,
223
+ };
224
+ }
225
+ }
226
+ //# sourceMappingURL=columnar-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columnar-parser.js","sourceRoot":"","sources":["../src/columnar-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Entity extractor - parses full entity content from STEP format
3
+ */
4
+ import type { IfcEntity, EntityRef } from './types.js';
5
+ export declare class EntityExtractor {
6
+ private buffer;
7
+ constructor(buffer: Uint8Array);
8
+ /**
9
+ * Extract full entity data from a reference
10
+ */
11
+ extractEntity(ref: EntityRef): IfcEntity | null;
12
+ private parseAttributes;
13
+ private parseAttributeValue;
14
+ }
15
+ //# sourceMappingURL=entity-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-extractor.d.ts","sourceRoot":"","sources":["../src/entity-extractor.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAa;gBAEf,MAAM,EAAE,UAAU;IAI9B;;OAEG;IACH,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI;IA4B/C,OAAO,CAAC,eAAe;IAiDvB,OAAO,CAAC,mBAAmB;CAoE5B"}