@ifc-lite/query 1.0.0 → 1.1.1
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/duckdb-integration.d.ts.map +1 -0
- package/dist/duckdb-integration.js.map +1 -0
- package/dist/entity-node.d.ts.map +1 -0
- package/dist/entity-node.js.map +1 -0
- package/dist/entity-query.d.ts.map +1 -0
- package/dist/entity-query.js.map +1 -0
- package/dist/entity-table.d.ts.map +1 -0
- package/dist/entity-table.js.map +1 -0
- package/dist/fluent-api.d.ts.map +1 -0
- package/dist/fluent-api.js.map +1 -0
- package/dist/ifc-query.d.ts.map +1 -0
- package/dist/ifc-query.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/property-table.d.ts.map +1 -0
- package/dist/property-table.js.map +1 -0
- package/dist/query-result-entity.d.ts.map +1 -0
- package/dist/query-result-entity.js.map +1 -0
- package/package.json +5 -5
- package/dist/parser/src/classification-extractor.d.ts +0 -73
- package/dist/parser/src/classification-extractor.d.ts.map +0 -1
- package/dist/parser/src/classification-extractor.js +0 -218
- package/dist/parser/src/classification-extractor.js.map +0 -1
- package/dist/parser/src/columnar-parser.d.ts +0 -43
- package/dist/parser/src/columnar-parser.d.ts.map +0 -1
- package/dist/parser/src/columnar-parser.js +0 -226
- package/dist/parser/src/columnar-parser.js.map +0 -1
- package/dist/parser/src/entity-extractor.d.ts +0 -15
- package/dist/parser/src/entity-extractor.d.ts.map +0 -1
- package/dist/parser/src/entity-extractor.js +0 -144
- package/dist/parser/src/entity-extractor.js.map +0 -1
- package/dist/parser/src/entity-index.d.ts +0 -11
- package/dist/parser/src/entity-index.d.ts.map +0 -1
- package/dist/parser/src/entity-index.js +0 -24
- package/dist/parser/src/entity-index.js.map +0 -1
- package/dist/parser/src/generated/entities.d.ts +0 -6198
- package/dist/parser/src/generated/entities.d.ts.map +0 -1
- package/dist/parser/src/generated/entities.js +0 -5
- package/dist/parser/src/generated/entities.js.map +0 -1
- package/dist/parser/src/generated/enums.d.ts +0 -2260
- package/dist/parser/src/generated/enums.d.ts.map +0 -1
- package/dist/parser/src/generated/enums.js +0 -2470
- package/dist/parser/src/generated/enums.js.map +0 -1
- package/dist/parser/src/generated/schema-registry.d.ts +0 -50
- package/dist/parser/src/generated/schema-registry.d.ts.map +0 -1
- package/dist/parser/src/generated/schema-registry.js +0 -60518
- package/dist/parser/src/generated/schema-registry.js.map +0 -1
- package/dist/parser/src/georef-extractor.d.ts +0 -60
- package/dist/parser/src/georef-extractor.d.ts.map +0 -1
- package/dist/parser/src/georef-extractor.js +0 -200
- package/dist/parser/src/georef-extractor.js.map +0 -1
- package/dist/parser/src/ifc-schema.d.ts +0 -13
- package/dist/parser/src/ifc-schema.d.ts.map +0 -1
- package/dist/parser/src/ifc-schema.js +0 -203
- package/dist/parser/src/ifc-schema.js.map +0 -1
- package/dist/parser/src/index.d.ts +0 -43
- package/dist/parser/src/index.d.ts.map +0 -1
- package/dist/parser/src/index.js +0 -150
- package/dist/parser/src/index.js.map +0 -1
- package/dist/parser/src/material-extractor.d.ts +0 -97
- package/dist/parser/src/material-extractor.d.ts.map +0 -1
- package/dist/parser/src/material-extractor.js +0 -283
- package/dist/parser/src/material-extractor.js.map +0 -1
- package/dist/parser/src/property-extractor.d.ts +0 -23
- package/dist/parser/src/property-extractor.d.ts.map +0 -1
- package/dist/parser/src/property-extractor.js +0 -102
- package/dist/parser/src/property-extractor.js.map +0 -1
- package/dist/parser/src/quantity-extractor.d.ts +0 -64
- package/dist/parser/src/quantity-extractor.d.ts.map +0 -1
- package/dist/parser/src/quantity-extractor.js +0 -202
- package/dist/parser/src/quantity-extractor.js.map +0 -1
- package/dist/parser/src/relationship-extractor.d.ts +0 -18
- package/dist/parser/src/relationship-extractor.d.ts.map +0 -1
- package/dist/parser/src/relationship-extractor.js +0 -91
- package/dist/parser/src/relationship-extractor.js.map +0 -1
- package/dist/parser/src/spatial-hierarchy-builder.d.ts +0 -21
- package/dist/parser/src/spatial-hierarchy-builder.d.ts.map +0 -1
- package/dist/parser/src/spatial-hierarchy-builder.js +0 -201
- package/dist/parser/src/spatial-hierarchy-builder.js.map +0 -1
- package/dist/parser/src/style-extractor.d.ts +0 -83
- package/dist/parser/src/style-extractor.d.ts.map +0 -1
- package/dist/parser/src/style-extractor.js +0 -327
- package/dist/parser/src/style-extractor.js.map +0 -1
- package/dist/parser/src/tokenizer.d.ts +0 -26
- package/dist/parser/src/tokenizer.d.ts.map +0 -1
- package/dist/parser/src/tokenizer.js +0 -181
- package/dist/parser/src/tokenizer.js.map +0 -1
- package/dist/parser/src/types.d.ts +0 -42
- package/dist/parser/src/types.d.ts.map +0 -1
- package/dist/parser/src/types.js +0 -5
- package/dist/parser/src/types.js.map +0 -1
- package/dist/query/src/duckdb-integration.d.ts.map +0 -1
- package/dist/query/src/duckdb-integration.js.map +0 -1
- package/dist/query/src/entity-node.d.ts.map +0 -1
- package/dist/query/src/entity-node.js.map +0 -1
- package/dist/query/src/entity-query.d.ts.map +0 -1
- package/dist/query/src/entity-query.js.map +0 -1
- package/dist/query/src/entity-table.d.ts.map +0 -1
- package/dist/query/src/entity-table.js.map +0 -1
- package/dist/query/src/fluent-api.d.ts.map +0 -1
- package/dist/query/src/fluent-api.js.map +0 -1
- package/dist/query/src/ifc-query.d.ts.map +0 -1
- package/dist/query/src/ifc-query.js.map +0 -1
- package/dist/query/src/index.d.ts.map +0 -1
- package/dist/query/src/index.js.map +0 -1
- package/dist/query/src/property-table.d.ts.map +0 -1
- package/dist/query/src/property-table.js.map +0 -1
- package/dist/query/src/query-result-entity.d.ts.map +0 -1
- package/dist/query/src/query-result-entity.js.map +0 -1
- /package/dist/{query/src/duckdb-integration.d.ts → duckdb-integration.d.ts} +0 -0
- /package/dist/{query/src/duckdb-integration.js → duckdb-integration.js} +0 -0
- /package/dist/{query/src/entity-node.d.ts → entity-node.d.ts} +0 -0
- /package/dist/{query/src/entity-node.js → entity-node.js} +0 -0
- /package/dist/{query/src/entity-query.d.ts → entity-query.d.ts} +0 -0
- /package/dist/{query/src/entity-query.js → entity-query.js} +0 -0
- /package/dist/{query/src/entity-table.d.ts → entity-table.d.ts} +0 -0
- /package/dist/{query/src/entity-table.js → entity-table.js} +0 -0
- /package/dist/{query/src/fluent-api.d.ts → fluent-api.d.ts} +0 -0
- /package/dist/{query/src/fluent-api.js → fluent-api.js} +0 -0
- /package/dist/{query/src/ifc-query.d.ts → ifc-query.d.ts} +0 -0
- /package/dist/{query/src/ifc-query.js → ifc-query.js} +0 -0
- /package/dist/{query/src/index.d.ts → index.d.ts} +0 -0
- /package/dist/{query/src/index.js → index.js} +0 -0
- /package/dist/{query/src/property-table.d.ts → property-table.d.ts} +0 -0
- /package/dist/{query/src/property-table.js → property-table.js} +0 -0
- /package/dist/{query/src/query-result-entity.d.ts → query-result-entity.d.ts} +0 -0
- /package/dist/{query/src/query-result-entity.js → query-result-entity.js} +0 -0
|
@@ -1,102 +0,0 @@
|
|
|
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 PropertyExtractor {
|
|
5
|
-
entities;
|
|
6
|
-
constructor(entities) {
|
|
7
|
-
this.entities = entities;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Extract all PropertySets from entities
|
|
11
|
-
*/
|
|
12
|
-
extractPropertySets() {
|
|
13
|
-
const propertySets = new Map();
|
|
14
|
-
for (const [id, entity] of this.entities) {
|
|
15
|
-
// IFC entity types may be uppercase (IFCPROPERTYSET) or mixed case (IfcPropertySet)
|
|
16
|
-
if (entity.type.toUpperCase() === 'IFCPROPERTYSET') {
|
|
17
|
-
const pset = this.extractPropertySet(entity);
|
|
18
|
-
if (pset) {
|
|
19
|
-
propertySets.set(id, pset);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
return propertySets;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Extract PropertySet from entity
|
|
27
|
-
*/
|
|
28
|
-
extractPropertySet(entity) {
|
|
29
|
-
try {
|
|
30
|
-
// IfcPropertySet structure: (GlobalId, OwnerHistory, Name, Description, HasProperties)
|
|
31
|
-
// Attributes: [0]=GlobalId, [1]=OwnerHistory, [2]=Name, [3]=Description, [4]=HasProperties
|
|
32
|
-
const name = this.getAttributeValue(entity, 2);
|
|
33
|
-
if (!name)
|
|
34
|
-
return null;
|
|
35
|
-
const hasProperties = this.getAttributeValue(entity, 4);
|
|
36
|
-
const properties = new Map();
|
|
37
|
-
// HasProperties is a list of references to IfcProperty
|
|
38
|
-
if (Array.isArray(hasProperties)) {
|
|
39
|
-
for (const propRef of hasProperties) {
|
|
40
|
-
if (typeof propRef === 'number') {
|
|
41
|
-
const propEntity = this.entities.get(propRef);
|
|
42
|
-
if (propEntity) {
|
|
43
|
-
const prop = this.extractProperty(propEntity);
|
|
44
|
-
if (prop) {
|
|
45
|
-
properties.set(prop.name, prop.value);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return { name, properties };
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
console.warn(`Failed to extract PropertySet #${entity.expressId}:`, error);
|
|
55
|
-
return null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Extract property from IfcProperty entity
|
|
60
|
-
*/
|
|
61
|
-
extractProperty(entity) {
|
|
62
|
-
try {
|
|
63
|
-
// IfcPropertySingleValue structure: (Name, Description, NominalValue, Unit)
|
|
64
|
-
const name = this.getAttributeValue(entity, 0);
|
|
65
|
-
if (!name)
|
|
66
|
-
return null;
|
|
67
|
-
const nominalValue = this.getAttributeValue(entity, 2);
|
|
68
|
-
const value = this.parsePropertyValue(nominalValue);
|
|
69
|
-
return { name, value };
|
|
70
|
-
}
|
|
71
|
-
catch (error) {
|
|
72
|
-
console.warn(`Failed to extract property #${entity.expressId}:`, error);
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
parsePropertyValue(value) {
|
|
77
|
-
if (value === null || value === undefined) {
|
|
78
|
-
return { type: 'null', value: null };
|
|
79
|
-
}
|
|
80
|
-
if (typeof value === 'number') {
|
|
81
|
-
return { type: 'number', value };
|
|
82
|
-
}
|
|
83
|
-
if (typeof value === 'boolean') {
|
|
84
|
-
return { type: 'boolean', value };
|
|
85
|
-
}
|
|
86
|
-
if (typeof value === 'string') {
|
|
87
|
-
return { type: 'string', value };
|
|
88
|
-
}
|
|
89
|
-
if (typeof value === 'number' && value < 0) {
|
|
90
|
-
// Negative numbers might be references in some contexts
|
|
91
|
-
return { type: 'reference', value };
|
|
92
|
-
}
|
|
93
|
-
return { type: 'string', value: String(value) };
|
|
94
|
-
}
|
|
95
|
-
getAttributeValue(entity, index) {
|
|
96
|
-
if (index < 0 || index >= entity.attributes.length) {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
return entity.attributes[index];
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
//# sourceMappingURL=property-extractor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"property-extractor.js","sourceRoot":"","sources":["../../../../parser/src/property-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Quantity extractor - extracts IfcElementQuantity sets and their values
|
|
3
|
-
*/
|
|
4
|
-
import type { IfcEntity } from './types.js';
|
|
5
|
-
export interface QuantitySet {
|
|
6
|
-
expressId: number;
|
|
7
|
-
name: string;
|
|
8
|
-
globalId?: string;
|
|
9
|
-
methodOfMeasurement?: string;
|
|
10
|
-
quantities: QuantityValue[];
|
|
11
|
-
}
|
|
12
|
-
export interface QuantityValue {
|
|
13
|
-
name: string;
|
|
14
|
-
type: QuantityValueType;
|
|
15
|
-
value: number;
|
|
16
|
-
unit?: string;
|
|
17
|
-
formula?: string;
|
|
18
|
-
}
|
|
19
|
-
export type QuantityValueType = 'length' | 'area' | 'volume' | 'count' | 'weight' | 'time';
|
|
20
|
-
export declare class QuantityExtractor {
|
|
21
|
-
private entities;
|
|
22
|
-
private debug;
|
|
23
|
-
constructor(entities: Map<number, IfcEntity>, debug?: boolean);
|
|
24
|
-
/**
|
|
25
|
-
* Extract all IfcElementQuantity sets from entities
|
|
26
|
-
*/
|
|
27
|
-
extractQuantitySets(): Map<number, QuantitySet>;
|
|
28
|
-
/**
|
|
29
|
-
* Extract QuantitySet from IfcElementQuantity entity
|
|
30
|
-
*
|
|
31
|
-
* IFC Schema for IfcElementQuantity:
|
|
32
|
-
* - GlobalId (IfcGloballyUniqueId) [0]
|
|
33
|
-
* - OwnerHistory (IfcOwnerHistory) [1]
|
|
34
|
-
* - Name (IfcLabel) [2]
|
|
35
|
-
* - Description (IfcText) [3]
|
|
36
|
-
* - MethodOfMeasurement (IfcLabel) [4]
|
|
37
|
-
* - Quantities (SET [1:?] OF IfcPhysicalQuantity) [5]
|
|
38
|
-
*/
|
|
39
|
-
private extractQuantitySet;
|
|
40
|
-
/**
|
|
41
|
-
* Extract quantity from IfcPhysicalQuantity entity
|
|
42
|
-
*
|
|
43
|
-
* All IFC quantity types (IfcQuantityLength, IfcQuantityArea, etc.) have:
|
|
44
|
-
* - Name (IfcLabel) [0]
|
|
45
|
-
* - Description (IfcText) [1]
|
|
46
|
-
* - Unit (IfcNamedUnit) [2] - optional reference
|
|
47
|
-
* - *Value (IfcLengthMeasure/etc.) [3]
|
|
48
|
-
* - Formula (IfcLabel) [4] - optional (IFC4 only)
|
|
49
|
-
*/
|
|
50
|
-
private extractQuantity;
|
|
51
|
-
/**
|
|
52
|
-
* Safely convert a value to string
|
|
53
|
-
*/
|
|
54
|
-
private toString;
|
|
55
|
-
/**
|
|
56
|
-
* Get count of IfcElementQuantity entities in the model
|
|
57
|
-
*/
|
|
58
|
-
getElementQuantityCount(): number;
|
|
59
|
-
/**
|
|
60
|
-
* Get count of individual quantity values (IfcQuantityLength, etc.)
|
|
61
|
-
*/
|
|
62
|
-
getQuantityValueCount(): number;
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=quantity-extractor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quantity-extractor.d.ts","sourceRoot":"","sources":["../../../../parser/src/quantity-extractor.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,aAAa,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAY3F,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,KAAK,CAAU;gBAEX,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,GAAE,OAAe;IAKpE;;OAEG;IACH,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC;IAgC/C;;;;;;;;;;OAUG;IACH,OAAO,CAAC,kBAAkB;IAuD1B;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IAmDvB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAUhB;;OAEG;IACH,uBAAuB,IAAI,MAAM;IAUjC;;OAEG;IACH,qBAAqB,IAAI,MAAM;CAUhC"}
|
|
@@ -1,202 +0,0 @@
|
|
|
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
|
-
// Map IFC type names to our quantity types
|
|
5
|
-
const QUANTITY_TYPE_MAP = {
|
|
6
|
-
'IFCQUANTITYLENGTH': 'length',
|
|
7
|
-
'IFCQUANTITYAREA': 'area',
|
|
8
|
-
'IFCQUANTITYVOLUME': 'volume',
|
|
9
|
-
'IFCQUANTITYCOUNT': 'count',
|
|
10
|
-
'IFCQUANTITYWEIGHT': 'weight',
|
|
11
|
-
'IFCQUANTITYTIME': 'time',
|
|
12
|
-
};
|
|
13
|
-
export class QuantityExtractor {
|
|
14
|
-
entities;
|
|
15
|
-
debug;
|
|
16
|
-
constructor(entities, debug = false) {
|
|
17
|
-
this.entities = entities;
|
|
18
|
-
this.debug = debug;
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Extract all IfcElementQuantity sets from entities
|
|
22
|
-
*/
|
|
23
|
-
extractQuantitySets() {
|
|
24
|
-
const quantitySets = new Map();
|
|
25
|
-
let elementQuantityCount = 0;
|
|
26
|
-
let quantityValueCount = 0;
|
|
27
|
-
for (const [id, entity] of this.entities) {
|
|
28
|
-
const typeUpper = entity.type.toUpperCase();
|
|
29
|
-
if (typeUpper === 'IFCELEMENTQUANTITY') {
|
|
30
|
-
elementQuantityCount++;
|
|
31
|
-
const qset = this.extractQuantitySet(entity);
|
|
32
|
-
if (qset) {
|
|
33
|
-
quantitySets.set(id, qset);
|
|
34
|
-
quantityValueCount += qset.quantities.length;
|
|
35
|
-
if (this.debug && quantitySets.size <= 3) {
|
|
36
|
-
console.log(`[QuantityExtractor] Extracted QuantitySet #${id}:`, {
|
|
37
|
-
name: qset.name,
|
|
38
|
-
quantities: qset.quantities.length,
|
|
39
|
-
first: qset.quantities[0],
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
console.log(`[QuantityExtractor] Found ${elementQuantityCount} IfcElementQuantity entities`);
|
|
46
|
-
console.log(`[QuantityExtractor] Extracted ${quantitySets.size} quantity sets with ${quantityValueCount} total quantities`);
|
|
47
|
-
return quantitySets;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Extract QuantitySet from IfcElementQuantity entity
|
|
51
|
-
*
|
|
52
|
-
* IFC Schema for IfcElementQuantity:
|
|
53
|
-
* - GlobalId (IfcGloballyUniqueId) [0]
|
|
54
|
-
* - OwnerHistory (IfcOwnerHistory) [1]
|
|
55
|
-
* - Name (IfcLabel) [2]
|
|
56
|
-
* - Description (IfcText) [3]
|
|
57
|
-
* - MethodOfMeasurement (IfcLabel) [4]
|
|
58
|
-
* - Quantities (SET [1:?] OF IfcPhysicalQuantity) [5]
|
|
59
|
-
*/
|
|
60
|
-
extractQuantitySet(entity) {
|
|
61
|
-
try {
|
|
62
|
-
const attrs = entity.attributes;
|
|
63
|
-
if (attrs.length < 6) {
|
|
64
|
-
if (this.debug) {
|
|
65
|
-
console.warn(`[QuantityExtractor] IfcElementQuantity #${entity.expressId} has insufficient attributes: ${attrs.length}`);
|
|
66
|
-
}
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
const globalId = this.toString(attrs[0]);
|
|
70
|
-
const name = this.toString(attrs[2]);
|
|
71
|
-
if (!name) {
|
|
72
|
-
if (this.debug) {
|
|
73
|
-
console.warn(`[QuantityExtractor] IfcElementQuantity #${entity.expressId} has no name`);
|
|
74
|
-
}
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
const methodOfMeasurement = this.toString(attrs[4]) || undefined;
|
|
78
|
-
const quantitiesRefs = attrs[5];
|
|
79
|
-
const quantities = [];
|
|
80
|
-
// Quantities is a list of references to IfcPhysicalQuantity subtypes
|
|
81
|
-
if (Array.isArray(quantitiesRefs)) {
|
|
82
|
-
for (const quantRef of quantitiesRefs) {
|
|
83
|
-
if (typeof quantRef === 'number') {
|
|
84
|
-
const quantEntity = this.entities.get(quantRef);
|
|
85
|
-
if (quantEntity) {
|
|
86
|
-
const quantity = this.extractQuantity(quantEntity);
|
|
87
|
-
if (quantity) {
|
|
88
|
-
quantities.push(quantity);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
else if (this.debug) {
|
|
92
|
-
console.warn(`[QuantityExtractor] Referenced quantity #${quantRef} not found`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
98
|
-
expressId: entity.expressId,
|
|
99
|
-
name,
|
|
100
|
-
globalId: globalId || undefined,
|
|
101
|
-
methodOfMeasurement,
|
|
102
|
-
quantities,
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
catch (error) {
|
|
106
|
-
console.warn(`[QuantityExtractor] Failed to extract QuantitySet #${entity.expressId}:`, error);
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Extract quantity from IfcPhysicalQuantity entity
|
|
112
|
-
*
|
|
113
|
-
* All IFC quantity types (IfcQuantityLength, IfcQuantityArea, etc.) have:
|
|
114
|
-
* - Name (IfcLabel) [0]
|
|
115
|
-
* - Description (IfcText) [1]
|
|
116
|
-
* - Unit (IfcNamedUnit) [2] - optional reference
|
|
117
|
-
* - *Value (IfcLengthMeasure/etc.) [3]
|
|
118
|
-
* - Formula (IfcLabel) [4] - optional (IFC4 only)
|
|
119
|
-
*/
|
|
120
|
-
extractQuantity(entity) {
|
|
121
|
-
try {
|
|
122
|
-
const typeUpper = entity.type.toUpperCase();
|
|
123
|
-
const quantityType = QUANTITY_TYPE_MAP[typeUpper];
|
|
124
|
-
if (!quantityType) {
|
|
125
|
-
// Not a recognized quantity type
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
const attrs = entity.attributes;
|
|
129
|
-
if (attrs.length < 4) {
|
|
130
|
-
if (this.debug) {
|
|
131
|
-
console.warn(`[QuantityExtractor] ${entity.type} #${entity.expressId} has insufficient attributes: ${attrs.length}`);
|
|
132
|
-
}
|
|
133
|
-
return null;
|
|
134
|
-
}
|
|
135
|
-
const name = this.toString(attrs[0]);
|
|
136
|
-
if (!name) {
|
|
137
|
-
if (this.debug) {
|
|
138
|
-
console.warn(`[QuantityExtractor] ${entity.type} #${entity.expressId} has no name`);
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
141
|
-
}
|
|
142
|
-
// Value is at index 3 for all quantity types
|
|
143
|
-
const value = attrs[3];
|
|
144
|
-
if (typeof value !== 'number') {
|
|
145
|
-
if (this.debug) {
|
|
146
|
-
console.warn(`[QuantityExtractor] ${entity.type} #${entity.expressId} has non-numeric value:`, value);
|
|
147
|
-
}
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
// Formula is optional (index 4, IFC4 only)
|
|
151
|
-
const formula = attrs.length > 4 ? this.toString(attrs[4]) || undefined : undefined;
|
|
152
|
-
return {
|
|
153
|
-
name,
|
|
154
|
-
type: quantityType,
|
|
155
|
-
value,
|
|
156
|
-
formula,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
catch (error) {
|
|
160
|
-
console.warn(`[QuantityExtractor] Failed to extract quantity #${entity.expressId}:`, error);
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Safely convert a value to string
|
|
166
|
-
*/
|
|
167
|
-
toString(value) {
|
|
168
|
-
if (value === null || value === undefined) {
|
|
169
|
-
return null;
|
|
170
|
-
}
|
|
171
|
-
if (typeof value === 'string') {
|
|
172
|
-
return value;
|
|
173
|
-
}
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
/**
|
|
177
|
-
* Get count of IfcElementQuantity entities in the model
|
|
178
|
-
*/
|
|
179
|
-
getElementQuantityCount() {
|
|
180
|
-
let count = 0;
|
|
181
|
-
for (const entity of this.entities.values()) {
|
|
182
|
-
if (entity.type.toUpperCase() === 'IFCELEMENTQUANTITY') {
|
|
183
|
-
count++;
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
return count;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Get count of individual quantity values (IfcQuantityLength, etc.)
|
|
190
|
-
*/
|
|
191
|
-
getQuantityValueCount() {
|
|
192
|
-
let count = 0;
|
|
193
|
-
for (const entity of this.entities.values()) {
|
|
194
|
-
const typeUpper = entity.type.toUpperCase();
|
|
195
|
-
if (QUANTITY_TYPE_MAP[typeUpper]) {
|
|
196
|
-
count++;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return count;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=quantity-extractor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"quantity-extractor.js","sourceRoot":"","sources":["../../../../parser/src/quantity-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Relationship extractor - extracts spatial structure and other relationships
|
|
3
|
-
*/
|
|
4
|
-
import type { IfcEntity, Relationship } from './types.js';
|
|
5
|
-
export declare class RelationshipExtractor {
|
|
6
|
-
private entities;
|
|
7
|
-
constructor(entities: Map<number, IfcEntity>);
|
|
8
|
-
/**
|
|
9
|
-
* Extract all relationships
|
|
10
|
-
*/
|
|
11
|
-
extractRelationships(): Relationship[];
|
|
12
|
-
/**
|
|
13
|
-
* Extract relationship from entity
|
|
14
|
-
*/
|
|
15
|
-
private extractRelationship;
|
|
16
|
-
private getAttributeValue;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=relationship-extractor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-extractor.d.ts","sourceRoot":"","sources":["../../../../parser/src/relationship-extractor.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAyB;gBAE7B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IAI5C;;OAEG;IACH,oBAAoB,IAAI,YAAY,EAAE;IAwBtC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwD3B,OAAO,CAAC,iBAAiB;CAM1B"}
|
|
@@ -1,91 +0,0 @@
|
|
|
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 RelationshipExtractor {
|
|
5
|
-
entities;
|
|
6
|
-
constructor(entities) {
|
|
7
|
-
this.entities = entities;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Extract all relationships
|
|
11
|
-
*/
|
|
12
|
-
extractRelationships() {
|
|
13
|
-
const relationships = [];
|
|
14
|
-
// Debug: count relationship types found
|
|
15
|
-
const typeCounts = new Map();
|
|
16
|
-
for (const [, entity] of this.entities) {
|
|
17
|
-
const typeUpper = entity.type.toUpperCase();
|
|
18
|
-
if (typeUpper.startsWith('IFCREL')) {
|
|
19
|
-
typeCounts.set(typeUpper, (typeCounts.get(typeUpper) || 0) + 1);
|
|
20
|
-
}
|
|
21
|
-
const rel = this.extractRelationship(entity);
|
|
22
|
-
if (rel) {
|
|
23
|
-
relationships.push(rel);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
console.log('[RelationshipExtractor] Relationship type counts:', Object.fromEntries(typeCounts));
|
|
27
|
-
console.log('[RelationshipExtractor] Successfully extracted:', relationships.length);
|
|
28
|
-
return relationships;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Extract relationship from entity
|
|
32
|
-
*/
|
|
33
|
-
extractRelationship(entity) {
|
|
34
|
-
// IFC entity types may be uppercase or mixed case
|
|
35
|
-
const entityTypeUpper = entity.type.toUpperCase();
|
|
36
|
-
const relTypes = [
|
|
37
|
-
'IFCRELCONTAINEDINSPATIALSTRUCTURE',
|
|
38
|
-
'IFCRELAGGREGATES',
|
|
39
|
-
'IFCRELDEFINESBYPROPERTIES',
|
|
40
|
-
'IFCRELDEFINESBYTYPE',
|
|
41
|
-
'IFCRELASSOCIATESMATERIAL',
|
|
42
|
-
'IFCRELVOIDSELEMENT',
|
|
43
|
-
'IFCRELFILLSELEMENT',
|
|
44
|
-
];
|
|
45
|
-
if (!relTypes.includes(entityTypeUpper)) {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
try {
|
|
49
|
-
// IFC relationship attribute order varies by type:
|
|
50
|
-
// IfcRelDefinesByProperties: RelatedObjects (4), RelatingPropertyDefinition (5)
|
|
51
|
-
// IfcRelAggregates: RelatingObject (4), RelatedObjects (5)
|
|
52
|
-
// IfcRelContainedInSpatialStructure: RelatedElements (4), RelatingStructure (5)
|
|
53
|
-
let relatingObject;
|
|
54
|
-
let relatedObjects;
|
|
55
|
-
if (entityTypeUpper === 'IFCRELDEFINESBYPROPERTIES') {
|
|
56
|
-
// RelatedObjects at 4, RelatingPropertyDefinition at 5
|
|
57
|
-
relatedObjects = this.getAttributeValue(entity, 4);
|
|
58
|
-
relatingObject = this.getAttributeValue(entity, 5);
|
|
59
|
-
}
|
|
60
|
-
else if (entityTypeUpper === 'IFCRELCONTAINEDINSPATIALSTRUCTURE') {
|
|
61
|
-
// RelatedElements at 4, RelatingStructure at 5
|
|
62
|
-
relatedObjects = this.getAttributeValue(entity, 4);
|
|
63
|
-
relatingObject = this.getAttributeValue(entity, 5);
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
// Standard: RelatingObject at 4, RelatedObjects at 5
|
|
67
|
-
relatingObject = this.getAttributeValue(entity, 4);
|
|
68
|
-
relatedObjects = this.getAttributeValue(entity, 5);
|
|
69
|
-
}
|
|
70
|
-
if (relatingObject === null || typeof relatingObject !== 'number' || !Array.isArray(relatedObjects)) {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
return {
|
|
74
|
-
type: entity.type,
|
|
75
|
-
relatingObject: relatingObject,
|
|
76
|
-
relatedObjects: relatedObjects.filter((id) => typeof id === 'number'),
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
console.warn(`Failed to extract relationship #${entity.expressId}:`, error);
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
getAttributeValue(entity, index) {
|
|
85
|
-
if (index < 0 || index >= entity.attributes.length) {
|
|
86
|
-
return null;
|
|
87
|
-
}
|
|
88
|
-
return entity.attributes[index];
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=relationship-extractor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-extractor.js","sourceRoot":"","sources":["../../../../parser/src/relationship-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Spatial hierarchy builder - builds project/building/storey tree
|
|
3
|
-
*/
|
|
4
|
-
import type { EntityTable, StringTable, RelationshipGraph, SpatialHierarchy } from '@ifc-lite/data';
|
|
5
|
-
import type { EntityRef } from './types.js';
|
|
6
|
-
export declare class SpatialHierarchyBuilder {
|
|
7
|
-
/**
|
|
8
|
-
* Build spatial hierarchy from entities and relationships
|
|
9
|
-
*/
|
|
10
|
-
build(entities: EntityTable, relationships: RelationshipGraph, strings: StringTable, source: Uint8Array, entityIndex: {
|
|
11
|
-
byId: Map<number, EntityRef>;
|
|
12
|
-
}): SpatialHierarchy;
|
|
13
|
-
private buildNode;
|
|
14
|
-
private getTypeEnum;
|
|
15
|
-
/**
|
|
16
|
-
* Extract elevation from IfcBuildingStorey entity
|
|
17
|
-
* Elevation is typically in attribute index 8 (after GlobalId, OwnerHistory, Name, Description, ObjectType, etc.)
|
|
18
|
-
*/
|
|
19
|
-
private extractElevation;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=spatial-hierarchy-builder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"spatial-hierarchy-builder.d.ts","sourceRoot":"","sources":["../../../../parser/src/spatial-hierarchy-builder.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,gBAAgB,EAAe,MAAM,gBAAgB,CAAC;AAEjH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,qBAAa,uBAAuB;IAClC;;OAEG;IACH,KAAK,CACH,QAAQ,EAAE,WAAW,EACrB,aAAa,EAAE,iBAAiB,EAChC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE;QAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;KAAE,GAC5C,gBAAgB;IA0HnB,OAAO,CAAC,SAAS;IA0FjB,OAAO,CAAC,WAAW;IAUnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CA4CzB"}
|