ifc-reader-2 1.0.4 → 1.0.6

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.
@@ -1,61 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.IfcJsonExporter = void 0;
13
- const WEBIFC = require("web-ifc");
14
- const ifc_geometry_types_1 = require("./ifc-geometry-types");
15
- /**
16
- * Object to export all the properties from an IFC to a JS object.
17
- */
18
- class IfcJsonExporter {
19
- /**
20
- * Exports all the properties of an IFC into an array of JS objects.
21
- * @param webIfc The instance of [web-ifc]{@link https://github.com/ThatOpen/engine_web-ifc} to use.
22
- * @param modelID ID of the IFC model whose properties to extract.
23
- * @param indirect whether to get the indirect relationships as well.
24
- * @param recursiveSpatial whether to get the properties of spatial items recursively
25
- * to make the location data available (e.g. absolute position of building).
26
- */
27
- export(webIfc_1, modelID_1) {
28
- return __awaiter(this, arguments, void 0, function* (webIfc, modelID, indirect = false, recursiveSpatial = true) {
29
- const properties = {};
30
- const allIfcEntities = new Set(webIfc.GetIfcEntityList(modelID));
31
- // let finalCount = 0;
32
- // Spatial items get their properties recursively to make
33
- // the location data available (e.g. absolute position of building)
34
- const spatialStructure = new Set([
35
- WEBIFC.IFCPROJECT,
36
- WEBIFC.IFCSITE,
37
- WEBIFC.IFCBUILDING,
38
- WEBIFC.IFCBUILDINGSTOREY,
39
- WEBIFC.IFCSPACE,
40
- ]);
41
- for (const type of spatialStructure) {
42
- allIfcEntities.add(type);
43
- }
44
- for (const type of allIfcEntities) {
45
- if (ifc_geometry_types_1.GeometryTypes.has(type)) {
46
- continue;
47
- }
48
- const recursive = spatialStructure.has(type) && recursiveSpatial;
49
- const ids = webIfc.GetLineIDsWithType(modelID, type);
50
- // const allIDs = this._webIfc.GetAllLines(0);
51
- for (const id of ids) {
52
- const property = webIfc.GetLine(0, id, recursive, indirect);
53
- properties[property.expressID] = property;
54
- }
55
- }
56
- return properties;
57
- });
58
- }
59
- }
60
- exports.IfcJsonExporter = IfcJsonExporter;
61
- //# sourceMappingURL=ifc-json-exporter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ifc-json-exporter.js","sourceRoot":"","sources":["../../../src/models/ifc-json-exporter/ifc-json-exporter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,kCAAkC;AAClC,6DAAqD;AAGrD;;GAEG;AACH,MAAa,eAAe;IAC1B;;;;;;;OAOG;IACG,MAAM;6DACV,MAAqB,EACrB,OAAe,EACf,QAAQ,GAAG,KAAK,EAChB,gBAAgB,GAAG,IAAI;YAEvB,MAAM,UAAU,GAAkB,EAAE,CAAC;YAErC,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;YAEjE,sBAAsB;YAEtB,yDAAyD;YACzD,mEAAmE;YACnE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;gBAC/B,MAAM,CAAC,UAAU;gBACjB,MAAM,CAAC,OAAO;gBACd,MAAM,CAAC,WAAW;gBAClB,MAAM,CAAC,iBAAiB;gBACxB,MAAM,CAAC,QAAQ;aAChB,CAAC,CAAC;YAEH,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE,CAAC;gBACpC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,IAAI,kCAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5B,SAAS;gBACX,CAAC;gBAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC;gBAEjE,MAAM,GAAG,GAAG,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAErD,8CAA8C;gBAC9C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;oBACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;oBAC5D,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,OAAO,UAAU,CAAC;QACpB,CAAC;KAAA;CACF;AArDD,0CAqDC"}
@@ -1,110 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SpatialStructure = void 0;
4
- const WEBIFC = require("web-ifc");
5
- const units_1 = require("./units");
6
- class SpatialStructure {
7
- constructor() {
8
- this.itemsByFloor = {};
9
- this._units = new units_1.Units();
10
- }
11
- // TODO: Maybe make this more flexible so that it also support more exotic spatial structures?
12
- setUp(webIfc) {
13
- this._units.setUp(webIfc);
14
- this.cleanUp();
15
- try {
16
- const spatialRels = webIfc.GetLineIDsWithType(0, WEBIFC.IFCRELCONTAINEDINSPATIALSTRUCTURE);
17
- const allRooms = new Set();
18
- const rooms = webIfc.GetLineIDsWithType(0, WEBIFC.IFCSPACE);
19
- for (let i = 0; i < rooms.size(); i++) {
20
- allRooms.add(rooms.get(i));
21
- }
22
- // First add rooms (if any) to floors
23
- const aggregates = webIfc.GetLineIDsWithType(0, WEBIFC.IFCRELAGGREGATES);
24
- const aggregatesSize = aggregates.size();
25
- for (let i = 0; i < aggregatesSize; i++) {
26
- const id = aggregates.get(i);
27
- const properties = webIfc.GetLine(0, id);
28
- if (!properties ||
29
- !properties.RelatingObject ||
30
- !properties.RelatedObjects) {
31
- continue;
32
- }
33
- const parentID = properties.RelatingObject.value;
34
- const childsIDs = properties.RelatedObjects;
35
- for (const child of childsIDs) {
36
- const childID = child.value;
37
- if (allRooms.has(childID)) {
38
- this.itemsByFloor[childID] = parentID;
39
- }
40
- }
41
- }
42
- // Now add items contained in floors and rooms
43
- // If items contained in room, look for the floor where that room is and assign it to it
44
- const itemsContainedInRooms = {};
45
- const spatialRelsSize = spatialRels.size();
46
- for (let i = 0; i < spatialRelsSize; i++) {
47
- const id = spatialRels.get(i);
48
- const properties = webIfc.GetLine(0, id);
49
- if (!properties ||
50
- !properties.RelatingStructure ||
51
- !properties.RelatedElements) {
52
- continue;
53
- }
54
- const structureID = properties.RelatingStructure.value;
55
- const relatedItems = properties.RelatedElements;
56
- if (allRooms.has(structureID)) {
57
- for (const related of relatedItems) {
58
- if (!itemsContainedInRooms[structureID]) {
59
- itemsContainedInRooms[structureID] = [];
60
- }
61
- const id = related.value;
62
- itemsContainedInRooms[structureID].push(id);
63
- }
64
- }
65
- else {
66
- for (const related of relatedItems) {
67
- const id = related.value;
68
- this.itemsByFloor[id] = structureID;
69
- }
70
- }
71
- }
72
- for (const roomID in itemsContainedInRooms) {
73
- const roomFloor = this.itemsByFloor[roomID];
74
- if (roomFloor !== undefined) {
75
- const items = itemsContainedInRooms[roomID];
76
- for (const item of items) {
77
- this.itemsByFloor[item] = roomFloor;
78
- }
79
- }
80
- }
81
- // Finally, add nested items (e.g. elements of curtain walls)
82
- for (let i = 0; i < aggregatesSize; i++) {
83
- const id = aggregates.get(i);
84
- const properties = webIfc.GetLine(0, id);
85
- if (!properties ||
86
- !properties.RelatingObject ||
87
- !properties.RelatedObjects) {
88
- continue;
89
- }
90
- const parentID = properties.RelatingObject.value;
91
- const childsIDs = properties.RelatedObjects;
92
- for (const child of childsIDs) {
93
- const childID = child.value;
94
- const parentStructure = this.itemsByFloor[parentID];
95
- if (parentStructure !== undefined) {
96
- this.itemsByFloor[childID] = parentStructure;
97
- }
98
- }
99
- }
100
- }
101
- catch (e) {
102
- console.log("Could not get floors.");
103
- }
104
- }
105
- cleanUp() {
106
- this.itemsByFloor = {};
107
- }
108
- }
109
- exports.SpatialStructure = SpatialStructure;
110
- //# sourceMappingURL=spatial-structure.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spatial-structure.js","sourceRoot":"","sources":["../../src/models/spatial-structure.ts"],"names":[],"mappings":"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"}
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Units = void 0;
4
- const WEBIFC = require("web-ifc");
5
- const THREE = require("three");
6
- class Units {
7
- constructor() {
8
- this.factor = 1;
9
- this.complement = 1;
10
- }
11
- apply(matrix) {
12
- const scale = this.getScaleMatrix();
13
- const result = scale.multiply(matrix);
14
- matrix.copy(result);
15
- }
16
- setUp(webIfc) {
17
- var _a;
18
- this.factor = 1;
19
- const length = this.getLengthUnits(webIfc);
20
- if (!length) {
21
- return;
22
- }
23
- const isLengthNull = length === undefined || length === null;
24
- const isValueNull = length.Name === undefined || length.Name === null;
25
- if (isLengthNull || isValueNull) {
26
- return;
27
- }
28
- if (length.Name.value === "FOOT") {
29
- this.factor = 0.3048;
30
- }
31
- else if (((_a = length.Prefix) === null || _a === void 0 ? void 0 : _a.value) === "MILLI") {
32
- this.complement = 0.001;
33
- }
34
- }
35
- getLengthUnits(webIfc) {
36
- try {
37
- const allUnitsAssigns = webIfc.GetLineIDsWithType(0, WEBIFC.IFCUNITASSIGNMENT);
38
- const unitsAssign = allUnitsAssigns.get(0);
39
- const unitsAssignProps = webIfc.GetLine(0, unitsAssign);
40
- for (const units of unitsAssignProps.Units) {
41
- if (!units || units.value === null || units.value === undefined) {
42
- continue;
43
- }
44
- const unitsProps = webIfc.GetLine(0, units.value);
45
- if (unitsProps.UnitType && unitsProps.UnitType.value === "LENGTHUNIT") {
46
- return unitsProps;
47
- }
48
- }
49
- return null;
50
- }
51
- catch (e) {
52
- console.log("Could not get units");
53
- return null;
54
- }
55
- }
56
- getScaleMatrix() {
57
- const f = this.factor;
58
- // prettier-ignore
59
- return new THREE.Matrix4().fromArray([
60
- f, 0, 0, 0,
61
- 0, f, 0, 0,
62
- 0, 0, f, 0,
63
- 0, 0, 0, 1,
64
- ]);
65
- }
66
- }
67
- exports.Units = Units;
68
- //# sourceMappingURL=units.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"units.js","sourceRoot":"","sources":["../../src/models/units.ts"],"names":[],"mappings":";;;AAAA,kCAAkC;AAClC,+BAA+B;AAE/B,MAAa,KAAK;IAAlB;QACE,WAAM,GAAG,CAAC,CAAC;QACX,eAAU,GAAG,CAAC,CAAC;IA4DjB,CAAC;IA1DC,KAAK,CAAC,MAAqB;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAqB;;QACzB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,CAAC;QAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC;QACtE,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACvB,CAAC;aAAM,IAAI,CAAA,MAAA,MAAM,CAAC,MAAM,0CAAE,KAAK,MAAK,OAAO,EAAE,CAAC;YAC5C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,MAAqB;QAC1C,IAAI,CAAC;YACH,MAAM,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAC/C,CAAC,EACD,MAAM,CAAC,iBAAiB,CACzB,CAAC;YACF,MAAM,WAAW,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;YACxD,KAAK,MAAM,KAAK,IAAI,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAChE,SAAS;gBACX,CAAC;gBACD,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;gBAClD,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;oBACtE,OAAO,UAAU,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACtB,kBAAkB;QAClB,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC;YACnC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACV,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACX,CAAC,CAAC;IACL,CAAC;CACF;AA9DD,sBA8DC"}