@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,144 @@
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
+ export class EntityExtractor {
5
+ buffer;
6
+ constructor(buffer) {
7
+ this.buffer = buffer;
8
+ }
9
+ /**
10
+ * Extract full entity data from a reference
11
+ */
12
+ extractEntity(ref) {
13
+ try {
14
+ const entityText = new TextDecoder().decode(this.buffer.subarray(ref.byteOffset, ref.byteOffset + ref.byteLength));
15
+ // Parse: #ID = TYPE(attr1, attr2, ...)
16
+ const match = entityText.match(/^#(\d+)\s*=\s*(\w+)\((.*)\)/);
17
+ if (!match)
18
+ return null;
19
+ const expressId = parseInt(match[1], 10);
20
+ const type = match[2];
21
+ const paramsText = match[3];
22
+ // Parse attributes (simplified - handles basic types)
23
+ const attributes = this.parseAttributes(paramsText);
24
+ return {
25
+ expressId,
26
+ type,
27
+ attributes,
28
+ };
29
+ }
30
+ catch (error) {
31
+ console.warn(`Failed to extract entity #${ref.expressId}:`, error);
32
+ return null;
33
+ }
34
+ }
35
+ parseAttributes(paramsText) {
36
+ if (!paramsText.trim())
37
+ return [];
38
+ const attributes = [];
39
+ let depth = 0;
40
+ let current = '';
41
+ let inString = false;
42
+ let escapeNext = false;
43
+ for (let i = 0; i < paramsText.length; i++) {
44
+ const char = paramsText[i];
45
+ if (escapeNext) {
46
+ current += char;
47
+ escapeNext = false;
48
+ continue;
49
+ }
50
+ if (char === "'") {
51
+ inString = !inString;
52
+ current += char;
53
+ }
54
+ else if (inString) {
55
+ if (char === '\\') {
56
+ escapeNext = true;
57
+ }
58
+ current += char;
59
+ }
60
+ else if (char === '(') {
61
+ depth++;
62
+ current += char;
63
+ }
64
+ else if (char === ')') {
65
+ depth--;
66
+ current += char;
67
+ }
68
+ else if (char === ',' && depth === 0) {
69
+ // End of attribute
70
+ attributes.push(this.parseAttributeValue(current.trim()));
71
+ current = '';
72
+ }
73
+ else {
74
+ current += char;
75
+ }
76
+ }
77
+ // Add last attribute
78
+ if (current.trim()) {
79
+ attributes.push(this.parseAttributeValue(current.trim()));
80
+ }
81
+ return attributes;
82
+ }
83
+ parseAttributeValue(value) {
84
+ value = value.trim();
85
+ if (!value || value === '$') {
86
+ return null;
87
+ }
88
+ // List/Array: (#123) or (#123, #456) or ()
89
+ if (value.startsWith('(') && value.endsWith(')')) {
90
+ const listContent = value.slice(1, -1).trim();
91
+ if (!listContent) {
92
+ return []; // Empty list
93
+ }
94
+ // Parse list items (comma-separated)
95
+ const items = [];
96
+ let depth = 0;
97
+ let current = '';
98
+ for (let i = 0; i < listContent.length; i++) {
99
+ const char = listContent[i];
100
+ if (char === '(') {
101
+ depth++;
102
+ current += char;
103
+ }
104
+ else if (char === ')') {
105
+ depth--;
106
+ current += char;
107
+ }
108
+ else if (char === ',' && depth === 0) {
109
+ // End of item
110
+ const itemValue = current.trim();
111
+ if (itemValue) {
112
+ items.push(this.parseAttributeValue(itemValue));
113
+ }
114
+ current = '';
115
+ }
116
+ else {
117
+ current += char;
118
+ }
119
+ }
120
+ // Add last item
121
+ if (current.trim()) {
122
+ items.push(this.parseAttributeValue(current.trim()));
123
+ }
124
+ return items;
125
+ }
126
+ // Reference: #123
127
+ if (value.startsWith('#')) {
128
+ const id = parseInt(value.substring(1), 10);
129
+ return isNaN(id) ? null : id;
130
+ }
131
+ // String: 'text'
132
+ if (value.startsWith("'") && value.endsWith("'")) {
133
+ return value.slice(1, -1).replace(/\\'/g, "'").replace(/\\\\/g, '\\');
134
+ }
135
+ // Number
136
+ const num = parseFloat(value);
137
+ if (!isNaN(num)) {
138
+ return num;
139
+ }
140
+ // Enumeration or other identifier
141
+ return value;
142
+ }
143
+ }
144
+ //# sourceMappingURL=entity-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-extractor.js","sourceRoot":"","sources":["../src/entity-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Entity index builder - creates fast lookup structures
3
+ */
4
+ import type { EntityRef, EntityIndex } from './types.js';
5
+ export declare class EntityIndexBuilder {
6
+ private byId;
7
+ private byType;
8
+ addEntity(ref: EntityRef): void;
9
+ build(): EntityIndex;
10
+ }
11
+ //# sourceMappingURL=entity-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-index.d.ts","sourceRoot":"","sources":["../src/entity-index.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,IAAI,CAAqC;IACjD,OAAO,CAAC,MAAM,CAAoC;IAElD,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,IAAI;IAY/B,KAAK,IAAI,WAAW;CAMrB"}
@@ -0,0 +1,24 @@
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
+ export class EntityIndexBuilder {
5
+ byId = new Map();
6
+ byType = new Map();
7
+ addEntity(ref) {
8
+ this.byId.set(ref.expressId, ref);
9
+ // Add to type index
10
+ let typeList = this.byType.get(ref.type);
11
+ if (!typeList) {
12
+ typeList = [];
13
+ this.byType.set(ref.type, typeList);
14
+ }
15
+ typeList.push(ref.expressId);
16
+ }
17
+ build() {
18
+ return {
19
+ byId: this.byId,
20
+ byType: this.byType,
21
+ };
22
+ }
23
+ }
24
+ //# sourceMappingURL=entity-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-index.js","sourceRoot":"","sources":["../src/entity-index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAQ/D,MAAM,OAAO,kBAAkB;IACrB,IAAI,GAA2B,IAAI,GAAG,EAAE,CAAC;IACzC,MAAM,GAA0B,IAAI,GAAG,EAAE,CAAC;IAElD,SAAS,CAAC,GAAc;QACtB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAElC,oBAAoB;QACpB,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Comprehensive IFC Extraction Example
3
+ *
4
+ * Demonstrates how to use all extractors together to get complete IFC data,
5
+ * leveraging the 100% schema coverage from code generation.
6
+ */
7
+ import type { IfcEntity } from '../entity-extractor';
8
+ /**
9
+ * Complete IFC data with all extracted information
10
+ */
11
+ export interface CompleteIfcData {
12
+ entities: Map<number, IfcEntity>;
13
+ entitiesByType: Map<string, number[]>;
14
+ propertySets: any[];
15
+ quantitySets: any[];
16
+ relationships: any[];
17
+ spatialHierarchy: any;
18
+ materials: any;
19
+ georeferencing: any;
20
+ classifications: any;
21
+ styles: any;
22
+ schemaVersion: string;
23
+ schemaName: string;
24
+ }
25
+ /**
26
+ * Extract all IFC data with 100% schema coverage
27
+ */
28
+ export declare function extractCompleteIfcData(entities: Map<number, IfcEntity>, entitiesByType: Map<string, number[]>): CompleteIfcData;
29
+ /**
30
+ * Get enriched element information (with materials, classifications, georeferencing)
31
+ */
32
+ export interface EnrichedElementInfo {
33
+ id: number;
34
+ type: string;
35
+ name?: string;
36
+ globalId?: string;
37
+ properties: Record<string, any>;
38
+ quantities: Record<string, any>;
39
+ material?: {
40
+ name: string;
41
+ type: string;
42
+ layers?: Array<{
43
+ material: string;
44
+ thickness: number;
45
+ }>;
46
+ };
47
+ classifications: Array<{
48
+ system: string;
49
+ code: string;
50
+ name: string;
51
+ path: string[];
52
+ }>;
53
+ worldCoordinates?: [number, number, number];
54
+ inheritanceChain: string[];
55
+ }
56
+ /**
57
+ * Get enriched information for a single element
58
+ */
59
+ export declare function getEnrichedElementInfo(elementId: number, data: CompleteIfcData): EnrichedElementInfo | null;
60
+ /**
61
+ * Example: Find all walls with specific material
62
+ */
63
+ export declare function findWallsByMaterial(materialName: string, data: CompleteIfcData): number[];
64
+ /**
65
+ * Example: Find all elements with specific classification code
66
+ */
67
+ export declare function findElementsByClassification(classificationCode: string, data: CompleteIfcData): number[];
68
+ /**
69
+ * Example: Generate material usage report
70
+ */
71
+ export declare function generateMaterialReport(data: CompleteIfcData): string;
72
+ /**
73
+ * Example: Print schema coverage statistics
74
+ */
75
+ export declare function printSchemaCoverage(): void;
76
+ //# sourceMappingURL=comprehensive-extraction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comprehensive-extraction.d.ts","sourceRoot":"","sources":["../../src/examples/comprehensive-extraction.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAYrD;;GAEG;AACH,MAAM,WAAW,eAAe;IAE9B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACjC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAGtC,YAAY,EAAE,GAAG,EAAE,CAAC;IACpB,YAAY,EAAE,GAAG,EAAE,CAAC;IAGpB,aAAa,EAAE,GAAG,EAAE,CAAC;IAGrB,gBAAgB,EAAE,GAAG,CAAC;IAGtB,SAAS,EAAE,GAAG,CAAC;IAGf,cAAc,EAAE,GAAG,CAAC;IAGpB,eAAe,EAAE,GAAG,CAAC;IAGrB,MAAM,EAAE,GAAG,CAAC;IAGZ,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;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,eAAe,CA2DjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAGlB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAGhC,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACzD,CAAC;IAGF,eAAe,EAAE,KAAK,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC,CAAC;IAGH,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAG5C,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,eAAe,GACpB,mBAAmB,GAAG,IAAI,CA+F5B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,eAAe,GACpB,MAAM,EAAE,CAYV;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC1C,kBAAkB,EAAE,MAAM,EAC1B,IAAI,EAAE,eAAe,GACpB,MAAM,EAAE,CAWV;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,MAAM,CAyBpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAe1C"}
@@ -0,0 +1,228 @@
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 { extractMaterials, getMaterialNameForElement } from '../material-extractor';
5
+ import { extractGeoreferencing, transformToWorld, getCoordinateSystemDescription } from '../georef-extractor';
6
+ import { extractClassifications, getClassificationsForElement, getClassificationPath } from '../classification-extractor';
7
+ import { extractPropertySets } from '../property-extractor';
8
+ import { extractRelationships } from '../relationship-extractor';
9
+ import { extractQuantitySets } from '../quantity-extractor';
10
+ import { extractStyles } from '../style-extractor';
11
+ import { buildSpatialHierarchy } from '../spatial-hierarchy-builder';
12
+ import { SCHEMA_REGISTRY, getEntityMetadata } from '../generated/schema-registry';
13
+ /**
14
+ * Extract all IFC data with 100% schema coverage
15
+ */
16
+ export function extractCompleteIfcData(entities, entitiesByType) {
17
+ console.log('🔍 Extracting complete IFC data with 100% schema coverage...\n');
18
+ // Extract all data in parallel
19
+ const propertySets = extractPropertySets(entities);
20
+ const quantitySets = extractQuantitySets(entities);
21
+ const relationships = extractRelationships(entities);
22
+ const spatialHierarchy = buildSpatialHierarchy(entities, relationships);
23
+ const styles = extractStyles(entities);
24
+ // NEW: Extract materials (previously unavailable)
25
+ console.log('📦 Extracting materials (IfcMaterial, layers, profiles)...');
26
+ const materials = extractMaterials(entities, entitiesByType);
27
+ console.log(` ✓ Found ${materials.materials.size} materials`);
28
+ console.log(` ✓ Found ${materials.materialLayerSets.size} layer sets`);
29
+ console.log(` ✓ Found ${materials.materialProfileSets.size} profile sets`);
30
+ console.log(` ✓ Found ${materials.associations.length} material associations\n`);
31
+ // NEW: Extract georeferencing (previously unavailable)
32
+ console.log('🌍 Extracting georeferencing (coordinate systems)...');
33
+ const georeferencing = extractGeoreferencing(entities, entitiesByType);
34
+ if (georeferencing.hasGeoreference) {
35
+ console.log(` ✓ ${getCoordinateSystemDescription(georeferencing)}\n`);
36
+ }
37
+ else {
38
+ console.log(` ℹ No georeferencing found (using local coordinates)\n`);
39
+ }
40
+ // NEW: Extract classifications (previously unavailable)
41
+ console.log('🏷️ Extracting classifications (Uniclass, Omniclass, etc.)...');
42
+ const classifications = extractClassifications(entities, entitiesByType);
43
+ console.log(` ✓ Found ${classifications.classifications.size} classification systems`);
44
+ console.log(` ✓ Found ${classifications.classificationReferences.size} classification references`);
45
+ console.log(` ✓ Found ${classifications.associations.length} classification associations\n`);
46
+ // Get schema info
47
+ const projectIds = entitiesByType.get('IfcProject') || [];
48
+ let schemaVersion = 'UNKNOWN';
49
+ if (projectIds.length > 0) {
50
+ const project = entities.get(projectIds[0]);
51
+ // Would extract schema version from project entity
52
+ schemaVersion = 'IFC4';
53
+ }
54
+ console.log('✅ Extraction complete!\n');
55
+ return {
56
+ entities,
57
+ entitiesByType,
58
+ propertySets,
59
+ quantitySets,
60
+ relationships,
61
+ spatialHierarchy,
62
+ materials,
63
+ georeferencing,
64
+ classifications,
65
+ styles,
66
+ schemaVersion,
67
+ schemaName: SCHEMA_REGISTRY.name,
68
+ };
69
+ }
70
+ /**
71
+ * Get enriched information for a single element
72
+ */
73
+ export function getEnrichedElementInfo(elementId, data) {
74
+ const entity = data.entities.get(elementId);
75
+ if (!entity)
76
+ return null;
77
+ // Get basic info
78
+ const info = {
79
+ id: elementId,
80
+ type: entity.type,
81
+ name: entity.attributes[2], // Usually Name is attribute 2
82
+ globalId: entity.attributes[0], // GlobalId is attribute 0
83
+ properties: {},
84
+ quantities: {},
85
+ classifications: [],
86
+ inheritanceChain: [],
87
+ };
88
+ // Get inheritance chain from schema
89
+ const metadata = getEntityMetadata(entity.type);
90
+ if (metadata) {
91
+ info.inheritanceChain = metadata.inheritanceChain || [];
92
+ }
93
+ // Get properties
94
+ for (const pset of data.propertySets) {
95
+ if (pset.definesObjects?.includes(elementId)) {
96
+ info.properties[pset.name] = pset.properties;
97
+ }
98
+ }
99
+ // Get quantities
100
+ for (const qset of data.quantitySets) {
101
+ if (qset.definesObjects?.includes(elementId)) {
102
+ info.quantities[qset.name] = qset.quantities;
103
+ }
104
+ }
105
+ // NEW: Get material info
106
+ const materialId = getMaterialForElement(elementId, data.materials);
107
+ if (materialId) {
108
+ const material = data.materials.materials.get(materialId);
109
+ const layerSet = data.materials.materialLayerSets.get(materialId);
110
+ const profileSet = data.materials.materialProfileSets.get(materialId);
111
+ if (material) {
112
+ info.material = {
113
+ name: material.name,
114
+ type: 'Material',
115
+ };
116
+ }
117
+ else if (layerSet) {
118
+ info.material = {
119
+ name: layerSet.name || 'LayerSet',
120
+ type: 'LayerSet',
121
+ layers: layerSet.layers.map(layerId => {
122
+ const layer = data.materials.materialLayers.get(layerId);
123
+ const layerMaterial = layer ? data.materials.materials.get(layer.material) : undefined;
124
+ return {
125
+ material: layerMaterial?.name || 'Unknown',
126
+ thickness: layer?.thickness || 0,
127
+ };
128
+ }),
129
+ };
130
+ }
131
+ else if (profileSet) {
132
+ info.material = {
133
+ name: profileSet.name || 'ProfileSet',
134
+ type: 'ProfileSet',
135
+ };
136
+ }
137
+ }
138
+ // NEW: Get classifications
139
+ const classificationRefs = getClassificationsForElement(elementId, data.classifications);
140
+ for (const ref of classificationRefs) {
141
+ const path = getClassificationPath(ref.id, data.classifications);
142
+ const systemName = path[0] || 'Unknown';
143
+ info.classifications.push({
144
+ system: systemName,
145
+ code: ref.identification || '',
146
+ name: ref.name || '',
147
+ path,
148
+ });
149
+ }
150
+ // NEW: Get world coordinates (if georeferenced and if element has placement)
151
+ if (data.georeferencing.hasGeoreference) {
152
+ // Would extract local placement from entity and transform
153
+ // For demo, assume we have local coordinates [x, y, z]
154
+ const localCoords = [0, 0, 0]; // Would extract from entity
155
+ const worldCoords = transformToWorld(localCoords, data.georeferencing);
156
+ if (worldCoords) {
157
+ info.worldCoordinates = worldCoords;
158
+ }
159
+ }
160
+ return info;
161
+ }
162
+ /**
163
+ * Example: Find all walls with specific material
164
+ */
165
+ export function findWallsByMaterial(materialName, data) {
166
+ const wallIds = data.entitiesByType.get('IfcWall') || [];
167
+ const results = [];
168
+ for (const wallId of wallIds) {
169
+ const materialForWall = getMaterialNameForElement(wallId, data.materials);
170
+ if (materialForWall?.toLowerCase().includes(materialName.toLowerCase())) {
171
+ results.push(wallId);
172
+ }
173
+ }
174
+ return results;
175
+ }
176
+ /**
177
+ * Example: Find all elements with specific classification code
178
+ */
179
+ export function findElementsByClassification(classificationCode, data) {
180
+ const results = [];
181
+ for (const assoc of data.classifications.associations) {
182
+ const ref = data.classifications.classificationReferences.get(assoc.classificationId);
183
+ if (ref?.identification === classificationCode) {
184
+ results.push(...assoc.relatedObjects);
185
+ }
186
+ }
187
+ return results;
188
+ }
189
+ /**
190
+ * Example: Generate material usage report
191
+ */
192
+ export function generateMaterialReport(data) {
193
+ let report = '# Material Usage Report\n\n';
194
+ // Count elements by material
195
+ const materialUsage = new Map();
196
+ for (const assoc of data.materials.associations) {
197
+ for (const elementId of assoc.relatedObjects) {
198
+ const materialName = getMaterialNameForElement(elementId, data.materials) || 'Unknown';
199
+ materialUsage.set(materialName, (materialUsage.get(materialName) || 0) + 1);
200
+ }
201
+ }
202
+ // Sort by usage count
203
+ const sorted = Array.from(materialUsage.entries())
204
+ .sort((a, b) => b[1] - a[1]);
205
+ report += '| Material | Element Count |\n';
206
+ report += '|----------|---------------|\n';
207
+ for (const [material, count] of sorted) {
208
+ report += `| ${material} | ${count} |\n`;
209
+ }
210
+ return report;
211
+ }
212
+ /**
213
+ * Example: Print schema coverage statistics
214
+ */
215
+ export function printSchemaCoverage() {
216
+ console.log('\n📊 IFC Schema Coverage Statistics\n');
217
+ console.log(`Schema: ${SCHEMA_REGISTRY.name}`);
218
+ console.log(`Entities: ${Object.keys(SCHEMA_REGISTRY.entities).length}`);
219
+ console.log(`Types: ${Object.keys(SCHEMA_REGISTRY.types).length}`);
220
+ console.log(`Enums: ${Object.keys(SCHEMA_REGISTRY.enums).length}`);
221
+ console.log(`Selects: ${Object.keys(SCHEMA_REGISTRY.selects).length}`);
222
+ console.log(`\nTotal definitions: ${Object.keys(SCHEMA_REGISTRY.entities).length +
223
+ Object.keys(SCHEMA_REGISTRY.types).length +
224
+ Object.keys(SCHEMA_REGISTRY.enums).length +
225
+ Object.keys(SCHEMA_REGISTRY.selects).length}`);
226
+ console.log('\n✅ 100% Schema Coverage - All IFC concepts supported!\n');
227
+ }
228
+ //# sourceMappingURL=comprehensive-extraction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comprehensive-extraction.js","sourceRoot":"","sources":["../../src/examples/comprehensive-extraction.ts"],"names":[],"mappings":"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"}