@ifc-lite/export 1.21.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -9
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/lod1-generator.d.ts.map +1 -1
- package/dist/lod1-generator.js +10 -11
- package/dist/lod1-generator.js.map +1 -1
- package/dist/merged-exporter.d.ts +146 -6
- package/dist/merged-exporter.d.ts.map +1 -1
- package/dist/merged-exporter.js +428 -186
- package/dist/merged-exporter.js.map +1 -1
- package/package.json +5 -5
- package/dist/csv-exporter.d.ts +0 -54
- package/dist/csv-exporter.d.ts.map +0 -1
- package/dist/csv-exporter.js +0 -254
- package/dist/csv-exporter.js.map +0 -1
- package/dist/gltf-exporter.d.ts +0 -57
- package/dist/gltf-exporter.d.ts.map +0 -1
- package/dist/gltf-exporter.js +0 -352
- package/dist/gltf-exporter.js.map +0 -1
- package/dist/jsonld-exporter.d.ts +0 -36
- package/dist/jsonld-exporter.d.ts.map +0 -1
- package/dist/jsonld-exporter.js +0 -167
- package/dist/jsonld-exporter.js.map +0 -1
package/dist/gltf-exporter.js
DELETED
|
@@ -1,352 +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 GLTFExporter {
|
|
5
|
-
geometryResult;
|
|
6
|
-
constructor(geometryResult) {
|
|
7
|
-
this.geometryResult = geometryResult;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Export to GLB (binary glTF)
|
|
11
|
-
*/
|
|
12
|
-
exportGLB(options = {}) {
|
|
13
|
-
const gltf = this.buildGLTF(options);
|
|
14
|
-
return this.packGLB(gltf.json, gltf.buffers);
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Export to glTF (JSON + separate .bin)
|
|
18
|
-
*/
|
|
19
|
-
exportGLTF(options = {}) {
|
|
20
|
-
const gltf = this.buildGLTF(options);
|
|
21
|
-
return {
|
|
22
|
-
json: JSON.stringify(gltf.json, null, 2),
|
|
23
|
-
bin: this.combineBuffers(gltf.buffers),
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
buildGLTF(options) {
|
|
27
|
-
const meshes = this.geometryResult.meshes;
|
|
28
|
-
const colorSource = options.colorSource ?? 'rendering';
|
|
29
|
-
const visibleOnly = options.visibleOnly === true;
|
|
30
|
-
const hidden = options.hiddenEntityIds ?? null;
|
|
31
|
-
const isolated = options.isolatedEntityIds ?? null;
|
|
32
|
-
const hasIsolation = isolated !== null && isolated.size > 0;
|
|
33
|
-
const hiddenTypes = options.hiddenIfcTypes ?? null;
|
|
34
|
-
const isMeshVisible = (m) => {
|
|
35
|
-
if (!visibleOnly)
|
|
36
|
-
return true;
|
|
37
|
-
if (hiddenTypes && m.ifcType && hiddenTypes.has(m.ifcType))
|
|
38
|
-
return false;
|
|
39
|
-
if (hasIsolation && !isolated.has(m.expressId))
|
|
40
|
-
return false;
|
|
41
|
-
if (hidden && hidden.has(m.expressId))
|
|
42
|
-
return false;
|
|
43
|
-
return true;
|
|
44
|
-
};
|
|
45
|
-
const pickColor = (m) => {
|
|
46
|
-
if (colorSource === 'shading') {
|
|
47
|
-
return m.shadingColor ?? m.color;
|
|
48
|
-
}
|
|
49
|
-
return m.color;
|
|
50
|
-
};
|
|
51
|
-
const gltf = {
|
|
52
|
-
asset: {
|
|
53
|
-
version: '2.0',
|
|
54
|
-
generator: 'IFC-Lite',
|
|
55
|
-
},
|
|
56
|
-
scene: 0,
|
|
57
|
-
scenes: [{ nodes: [] }],
|
|
58
|
-
nodes: [],
|
|
59
|
-
meshes: [],
|
|
60
|
-
accessors: [],
|
|
61
|
-
bufferViews: [],
|
|
62
|
-
buffers: [{ byteLength: 0 }],
|
|
63
|
-
};
|
|
64
|
-
if (options.includeMetadata) {
|
|
65
|
-
gltf.asset.extras = {
|
|
66
|
-
meshCount: meshes.length,
|
|
67
|
-
vertexCount: this.geometryResult.totalVertices,
|
|
68
|
-
triangleCount: this.geometryResult.totalTriangles,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
// Build materials from mesh colors (deduplicate by rounded RGBA key)
|
|
72
|
-
const materialMap = new Map();
|
|
73
|
-
const materials = [];
|
|
74
|
-
function getOrCreateMaterial(color) {
|
|
75
|
-
// Round to 2 decimals for deduplicate key only — use original values for export
|
|
76
|
-
const key = `${Math.round(color[0] * 100)},${Math.round(color[1] * 100)},${Math.round(color[2] * 100)},${Math.round(color[3] * 100)}`;
|
|
77
|
-
const existing = materialMap.get(key);
|
|
78
|
-
if (existing !== undefined)
|
|
79
|
-
return existing;
|
|
80
|
-
const idx = materials.length;
|
|
81
|
-
materials.push({
|
|
82
|
-
pbrMetallicRoughness: {
|
|
83
|
-
baseColorFactor: [color[0], color[1], color[2], color[3]],
|
|
84
|
-
metallicFactor: 0,
|
|
85
|
-
roughnessFactor: 1,
|
|
86
|
-
},
|
|
87
|
-
extensions: { KHR_materials_unlit: {} },
|
|
88
|
-
...(color[3] < 1 ? { alphaMode: 'BLEND' } : {}),
|
|
89
|
-
});
|
|
90
|
-
materialMap.set(key, idx);
|
|
91
|
-
return idx;
|
|
92
|
-
}
|
|
93
|
-
const meshMetas = [];
|
|
94
|
-
let totalPosFloats = 0;
|
|
95
|
-
let totalNormFloats = 0;
|
|
96
|
-
let totalIdxInts = 0;
|
|
97
|
-
for (let i = 0; i < meshes.length; i++) {
|
|
98
|
-
const mesh = meshes[i];
|
|
99
|
-
if (!isMeshVisible(mesh))
|
|
100
|
-
continue;
|
|
101
|
-
const mp = mesh.positions;
|
|
102
|
-
const mn = mesh.normals;
|
|
103
|
-
const mi = mesh.indices;
|
|
104
|
-
if (!mp.length || !mn.length || !mi.length)
|
|
105
|
-
continue;
|
|
106
|
-
if (mp.length % 3 !== 0 || mn.length % 3 !== 0)
|
|
107
|
-
continue;
|
|
108
|
-
if (mp.length !== mn.length)
|
|
109
|
-
continue;
|
|
110
|
-
// Calculate bounds directly from the typed array
|
|
111
|
-
let minX = mp[0], minY = mp[1], minZ = mp[2];
|
|
112
|
-
let maxX = mp[0], maxY = mp[1], maxZ = mp[2];
|
|
113
|
-
for (let j = 3; j < mp.length; j += 3) {
|
|
114
|
-
const x = mp[j], y = mp[j + 1], z = mp[j + 2];
|
|
115
|
-
if (x < minX)
|
|
116
|
-
minX = x;
|
|
117
|
-
if (x > maxX)
|
|
118
|
-
maxX = x;
|
|
119
|
-
if (y < minY)
|
|
120
|
-
minY = y;
|
|
121
|
-
if (y > maxY)
|
|
122
|
-
maxY = y;
|
|
123
|
-
if (z < minZ)
|
|
124
|
-
minZ = z;
|
|
125
|
-
if (z > maxZ)
|
|
126
|
-
maxZ = z;
|
|
127
|
-
}
|
|
128
|
-
const effectiveColor = pickColor(mesh);
|
|
129
|
-
meshMetas.push({
|
|
130
|
-
meshIndex: i,
|
|
131
|
-
posCount: mp.length,
|
|
132
|
-
normCount: mn.length,
|
|
133
|
-
idxCount: mi.length,
|
|
134
|
-
posByteOffset: totalPosFloats * 4,
|
|
135
|
-
normByteOffset: totalNormFloats * 4,
|
|
136
|
-
idxByteOffset: totalIdxInts * 4,
|
|
137
|
-
bounds: { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] },
|
|
138
|
-
materialIdx: effectiveColor ? getOrCreateMaterial(effectiveColor) : undefined,
|
|
139
|
-
});
|
|
140
|
-
totalPosFloats += mp.length;
|
|
141
|
-
totalNormFloats += mn.length;
|
|
142
|
-
totalIdxInts += mi.length;
|
|
143
|
-
}
|
|
144
|
-
if (totalPosFloats === 0 || totalNormFloats === 0 || totalIdxInts === 0) {
|
|
145
|
-
throw new Error('Cannot export GLB: no valid geometry data found');
|
|
146
|
-
}
|
|
147
|
-
// ── Pass 2: build glTF structure and copy geometry into typed arrays ──
|
|
148
|
-
const positionsArray = new Float32Array(totalPosFloats);
|
|
149
|
-
const normalsArray = new Float32Array(totalNormFloats);
|
|
150
|
-
const indicesArray = new Uint32Array(totalIdxInts);
|
|
151
|
-
let posOffset = 0;
|
|
152
|
-
let normOffset = 0;
|
|
153
|
-
let idxOffset = 0;
|
|
154
|
-
const nodeIndices = [];
|
|
155
|
-
for (const meta of meshMetas) {
|
|
156
|
-
const mesh = meshes[meta.meshIndex];
|
|
157
|
-
// Copy geometry data directly (no intermediate array)
|
|
158
|
-
positionsArray.set(mesh.positions, posOffset);
|
|
159
|
-
normalsArray.set(mesh.normals, normOffset);
|
|
160
|
-
indicesArray.set(mesh.indices, idxOffset);
|
|
161
|
-
posOffset += meta.posCount;
|
|
162
|
-
normOffset += meta.normCount;
|
|
163
|
-
idxOffset += meta.idxCount;
|
|
164
|
-
// Accessors
|
|
165
|
-
const posAccessorIdx = gltf.accessors.length;
|
|
166
|
-
gltf.accessors.push({
|
|
167
|
-
bufferView: 0,
|
|
168
|
-
byteOffset: meta.posByteOffset,
|
|
169
|
-
componentType: 5126,
|
|
170
|
-
count: meta.posCount / 3,
|
|
171
|
-
type: 'VEC3',
|
|
172
|
-
min: meta.bounds.min,
|
|
173
|
-
max: meta.bounds.max,
|
|
174
|
-
});
|
|
175
|
-
const normAccessorIdx = gltf.accessors.length;
|
|
176
|
-
gltf.accessors.push({
|
|
177
|
-
bufferView: 1,
|
|
178
|
-
byteOffset: meta.normByteOffset,
|
|
179
|
-
componentType: 5126,
|
|
180
|
-
count: meta.normCount / 3,
|
|
181
|
-
type: 'VEC3',
|
|
182
|
-
});
|
|
183
|
-
const idxAccessorIdx = gltf.accessors.length;
|
|
184
|
-
gltf.accessors.push({
|
|
185
|
-
bufferView: 2,
|
|
186
|
-
byteOffset: meta.idxByteOffset,
|
|
187
|
-
componentType: 5125,
|
|
188
|
-
count: meta.idxCount,
|
|
189
|
-
type: 'SCALAR',
|
|
190
|
-
});
|
|
191
|
-
// Mesh with material
|
|
192
|
-
const meshIdx = gltf.meshes.length;
|
|
193
|
-
gltf.meshes.push({
|
|
194
|
-
primitives: [{
|
|
195
|
-
attributes: {
|
|
196
|
-
POSITION: posAccessorIdx,
|
|
197
|
-
NORMAL: normAccessorIdx,
|
|
198
|
-
},
|
|
199
|
-
indices: idxAccessorIdx,
|
|
200
|
-
...(meta.materialIdx !== undefined ? { material: meta.materialIdx } : {}),
|
|
201
|
-
}],
|
|
202
|
-
});
|
|
203
|
-
// Node
|
|
204
|
-
const nodeIdx = gltf.nodes.length;
|
|
205
|
-
const node = { mesh: meshIdx };
|
|
206
|
-
// Positions/accessor bounds are stored in the element's LOCAL frame
|
|
207
|
-
// (world = origin + local). Express the per-mesh origin as a glTF
|
|
208
|
-
// node translation so the buffer keeps small, precise f32 coords
|
|
209
|
-
// (no fan reintroduction) while the element lands at its world
|
|
210
|
-
// position. Omitted when origin is absent or all-zero.
|
|
211
|
-
const mo = mesh.origin;
|
|
212
|
-
if (mo && (mo[0] !== 0 || mo[1] !== 0 || mo[2] !== 0)) {
|
|
213
|
-
node.translation = [mo[0], mo[1], mo[2]];
|
|
214
|
-
}
|
|
215
|
-
if (options.includeMetadata && mesh.expressId !== undefined) {
|
|
216
|
-
node.extras = mesh.modelIndex !== undefined
|
|
217
|
-
? { expressId: mesh.expressId, modelIndex: mesh.modelIndex }
|
|
218
|
-
: { expressId: mesh.expressId };
|
|
219
|
-
}
|
|
220
|
-
gltf.nodes.push(node);
|
|
221
|
-
nodeIndices.push(nodeIdx);
|
|
222
|
-
}
|
|
223
|
-
gltf.scenes[0].nodes = nodeIndices;
|
|
224
|
-
// Attach materials if any were created
|
|
225
|
-
if (materials.length > 0) {
|
|
226
|
-
gltf.materials = materials;
|
|
227
|
-
gltf.extensionsUsed = ['KHR_materials_unlit'];
|
|
228
|
-
}
|
|
229
|
-
// Buffer views
|
|
230
|
-
const positionsBytes = positionsArray.buffer;
|
|
231
|
-
const normalsBytes = normalsArray.buffer;
|
|
232
|
-
const indicesBytes = indicesArray.buffer;
|
|
233
|
-
const totalBufferSize = positionsBytes.byteLength + normalsBytes.byteLength + indicesBytes.byteLength;
|
|
234
|
-
// Create bufferViews
|
|
235
|
-
// byteStride is set to the element size (12 bytes for VEC3 FLOAT) for non-interleaved data
|
|
236
|
-
// This satisfies validators that require byteStride when multiple accessors share a bufferView
|
|
237
|
-
gltf.bufferViews.push({
|
|
238
|
-
buffer: 0,
|
|
239
|
-
byteOffset: 0,
|
|
240
|
-
byteLength: positionsBytes.byteLength,
|
|
241
|
-
byteStride: 12, // 3 floats * 4 bytes = 12 bytes per VEC3
|
|
242
|
-
target: 34962, // ARRAY_BUFFER
|
|
243
|
-
});
|
|
244
|
-
gltf.bufferViews.push({
|
|
245
|
-
buffer: 0,
|
|
246
|
-
byteOffset: positionsBytes.byteLength,
|
|
247
|
-
byteLength: normalsBytes.byteLength,
|
|
248
|
-
byteStride: 12, // 3 floats * 4 bytes = 12 bytes per VEC3
|
|
249
|
-
target: 34962,
|
|
250
|
-
});
|
|
251
|
-
gltf.bufferViews.push({
|
|
252
|
-
buffer: 0,
|
|
253
|
-
byteOffset: positionsBytes.byteLength + normalsBytes.byteLength,
|
|
254
|
-
byteLength: indicesBytes.byteLength,
|
|
255
|
-
// No byteStride for indices (ELEMENT_ARRAY_BUFFER)
|
|
256
|
-
target: 34963, // ELEMENT_ARRAY_BUFFER
|
|
257
|
-
});
|
|
258
|
-
gltf.buffers[0].byteLength = totalBufferSize;
|
|
259
|
-
// Validate that all accessors fit within their bufferViews
|
|
260
|
-
for (const accessor of gltf.accessors) {
|
|
261
|
-
const bufferView = gltf.bufferViews[accessor.bufferView];
|
|
262
|
-
if (!bufferView) {
|
|
263
|
-
throw new Error(`Accessor references invalid bufferView ${accessor.bufferView}`);
|
|
264
|
-
}
|
|
265
|
-
// Calculate accessor byte length
|
|
266
|
-
let componentSize = 0;
|
|
267
|
-
if (accessor.componentType === 5126)
|
|
268
|
-
componentSize = 4; // FLOAT
|
|
269
|
-
else if (accessor.componentType === 5125)
|
|
270
|
-
componentSize = 4; // UNSIGNED_INT
|
|
271
|
-
else if (accessor.componentType === 5123)
|
|
272
|
-
componentSize = 2; // UNSIGNED_SHORT
|
|
273
|
-
else if (accessor.componentType === 5120)
|
|
274
|
-
componentSize = 1; // BYTE
|
|
275
|
-
else
|
|
276
|
-
throw new Error(`Unsupported component type: ${accessor.componentType}`);
|
|
277
|
-
let componentsPerElement = 1;
|
|
278
|
-
if (accessor.type === 'VEC3')
|
|
279
|
-
componentsPerElement = 3;
|
|
280
|
-
else if (accessor.type === 'VEC2')
|
|
281
|
-
componentsPerElement = 2;
|
|
282
|
-
else if (accessor.type === 'SCALAR')
|
|
283
|
-
componentsPerElement = 1;
|
|
284
|
-
else
|
|
285
|
-
throw new Error(`Unsupported accessor type: ${accessor.type}`);
|
|
286
|
-
const accessorByteLength = accessor.count * componentsPerElement * componentSize;
|
|
287
|
-
const accessorEnd = (accessor.byteOffset || 0) + accessorByteLength;
|
|
288
|
-
if (accessorEnd > bufferView.byteLength) {
|
|
289
|
-
throw new Error(`Accessor exceeds bufferView bounds: ` +
|
|
290
|
-
`accessor byteOffset=${accessor.byteOffset || 0}, length=${accessorByteLength}, ` +
|
|
291
|
-
`bufferView byteLength=${bufferView.byteLength}, end=${accessorEnd}`);
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
return {
|
|
295
|
-
json: gltf,
|
|
296
|
-
buffers: [
|
|
297
|
-
new Uint8Array(positionsBytes),
|
|
298
|
-
new Uint8Array(normalsBytes),
|
|
299
|
-
new Uint8Array(indicesBytes),
|
|
300
|
-
],
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
combineBuffers(buffers) {
|
|
304
|
-
const totalLength = buffers.reduce((sum, buf) => sum + buf.byteLength, 0);
|
|
305
|
-
const combined = new Uint8Array(totalLength);
|
|
306
|
-
let offset = 0;
|
|
307
|
-
for (const buffer of buffers) {
|
|
308
|
-
combined.set(buffer, offset);
|
|
309
|
-
offset += buffer.byteLength;
|
|
310
|
-
}
|
|
311
|
-
return combined;
|
|
312
|
-
}
|
|
313
|
-
packGLB(gltfJson, buffers) {
|
|
314
|
-
const jsonString = JSON.stringify(gltfJson);
|
|
315
|
-
const jsonBuffer = new TextEncoder().encode(jsonString);
|
|
316
|
-
const jsonPadding = (4 - (jsonBuffer.byteLength % 4)) % 4;
|
|
317
|
-
const paddedJsonLength = jsonBuffer.byteLength + jsonPadding;
|
|
318
|
-
const bin = this.combineBuffers(buffers);
|
|
319
|
-
const binPadding = (4 - (bin.byteLength % 4)) % 4;
|
|
320
|
-
const paddedBinLength = bin.byteLength + binPadding;
|
|
321
|
-
const totalLength = 12 + 8 + paddedJsonLength + 8 + paddedBinLength;
|
|
322
|
-
const glb = new ArrayBuffer(totalLength);
|
|
323
|
-
const view = new DataView(glb);
|
|
324
|
-
const bytes = new Uint8Array(glb);
|
|
325
|
-
let offset = 0;
|
|
326
|
-
// GLB header
|
|
327
|
-
view.setUint32(offset, 0x46546C67, true); // 'glTF'
|
|
328
|
-
offset += 4;
|
|
329
|
-
view.setUint32(offset, 2, true);
|
|
330
|
-
offset += 4;
|
|
331
|
-
view.setUint32(offset, totalLength, true);
|
|
332
|
-
offset += 4;
|
|
333
|
-
// JSON chunk
|
|
334
|
-
view.setUint32(offset, paddedJsonLength, true);
|
|
335
|
-
offset += 4;
|
|
336
|
-
view.setUint32(offset, 0x4E4F534A, true); // 'JSON'
|
|
337
|
-
offset += 4;
|
|
338
|
-
bytes.set(jsonBuffer, offset);
|
|
339
|
-
offset += jsonBuffer.byteLength;
|
|
340
|
-
for (let i = 0; i < jsonPadding; i++) {
|
|
341
|
-
bytes[offset++] = 0x20;
|
|
342
|
-
}
|
|
343
|
-
// BIN chunk
|
|
344
|
-
view.setUint32(offset, paddedBinLength, true);
|
|
345
|
-
offset += 4;
|
|
346
|
-
view.setUint32(offset, 0x004E4942, true); // 'BIN\0'
|
|
347
|
-
offset += 4;
|
|
348
|
-
bytes.set(bin, offset);
|
|
349
|
-
return new Uint8Array(glb);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
//# sourceMappingURL=gltf-exporter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gltf-exporter.js","sourceRoot":"","sources":["../src/gltf-exporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON-LD exporter for semantic web compatibility
|
|
3
|
-
*/
|
|
4
|
-
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
5
|
-
export interface JSONLDExportOptions {
|
|
6
|
-
context?: string;
|
|
7
|
-
includeGeometry?: boolean;
|
|
8
|
-
includeProperties?: boolean;
|
|
9
|
-
includeQuantities?: boolean;
|
|
10
|
-
entityIds?: number[];
|
|
11
|
-
}
|
|
12
|
-
export declare class JSONLDExporter {
|
|
13
|
-
private store;
|
|
14
|
-
constructor(store: IfcDataStore);
|
|
15
|
-
/**
|
|
16
|
-
* Export to JSON-LD format
|
|
17
|
-
*/
|
|
18
|
-
export(options?: JSONLDExportOptions): object;
|
|
19
|
-
/**
|
|
20
|
-
* Get all entity IDs from the store
|
|
21
|
-
*/
|
|
22
|
-
private getAllEntityIds;
|
|
23
|
-
/**
|
|
24
|
-
* Format property value for JSON-LD
|
|
25
|
-
*/
|
|
26
|
-
private formatPropertyValue;
|
|
27
|
-
/**
|
|
28
|
-
* Get property type name from enum
|
|
29
|
-
*/
|
|
30
|
-
private getPropertyTypeName;
|
|
31
|
-
/**
|
|
32
|
-
* Get quantity type name from enum
|
|
33
|
-
*/
|
|
34
|
-
private getQuantityTypeName;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=jsonld-exporter.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld-exporter.d.ts","sourceRoot":"","sources":["../src/jsonld-exporter.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA2CrD,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAe;gBAEhB,KAAK,EAAE,YAAY;IAI/B;;OAEG;IACH,MAAM,CAAC,OAAO,GAAE,mBAAwB,GAAG,MAAM;IA6HjD;;OAEG;IACH,OAAO,CAAC,eAAe;IAQvB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAW3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
|
package/dist/jsonld-exporter.js
DELETED
|
@@ -1,167 +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
|
-
const DEFAULT_CONTEXT = 'https://standards.buildingsmart.org/IFC/DEV/IFC4/ADD2/OWL';
|
|
5
|
-
export class JSONLDExporter {
|
|
6
|
-
store;
|
|
7
|
-
constructor(store) {
|
|
8
|
-
this.store = store;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Export to JSON-LD format
|
|
12
|
-
*/
|
|
13
|
-
export(options = {}) {
|
|
14
|
-
const context = options.context ?? DEFAULT_CONTEXT;
|
|
15
|
-
const includeProperties = options.includeProperties ?? true;
|
|
16
|
-
const includeQuantities = options.includeQuantities ?? false;
|
|
17
|
-
const entityIds = options.entityIds ?? this.getAllEntityIds();
|
|
18
|
-
const graph = [];
|
|
19
|
-
for (const id of entityIds) {
|
|
20
|
-
const node = {
|
|
21
|
-
'@id': `ifc:${id}`,
|
|
22
|
-
'@type': `ifc:${this.store.entities.getTypeName(id)}`,
|
|
23
|
-
'ifc:expressId': id,
|
|
24
|
-
};
|
|
25
|
-
const globalId = this.store.entities.getGlobalId(id);
|
|
26
|
-
if (globalId) {
|
|
27
|
-
node['ifc:globalId'] = globalId;
|
|
28
|
-
}
|
|
29
|
-
const name = this.store.entities.getName(id);
|
|
30
|
-
if (name) {
|
|
31
|
-
node['ifc:name'] = name;
|
|
32
|
-
}
|
|
33
|
-
if (includeProperties) {
|
|
34
|
-
const properties = this.store.properties.getForEntity(id);
|
|
35
|
-
if (properties.length > 0) {
|
|
36
|
-
const propertySets = [];
|
|
37
|
-
for (const pset of properties) {
|
|
38
|
-
const psetNode = {
|
|
39
|
-
'@type': 'ifc:IfcPropertySet',
|
|
40
|
-
'ifc:name': pset.name,
|
|
41
|
-
};
|
|
42
|
-
if (pset.globalId) {
|
|
43
|
-
psetNode['ifc:globalId'] = pset.globalId;
|
|
44
|
-
}
|
|
45
|
-
const props = [];
|
|
46
|
-
for (const prop of pset.properties) {
|
|
47
|
-
const propNode = {
|
|
48
|
-
'@type': `ifc:${this.getPropertyTypeName(prop.type)}`,
|
|
49
|
-
'ifc:name': prop.name,
|
|
50
|
-
};
|
|
51
|
-
const value = this.formatPropertyValue(prop.value);
|
|
52
|
-
if (value !== null) {
|
|
53
|
-
propNode['ifc:nominalValue'] = value;
|
|
54
|
-
}
|
|
55
|
-
if (prop.unit) {
|
|
56
|
-
propNode['ifc:unit'] = prop.unit;
|
|
57
|
-
}
|
|
58
|
-
props.push(propNode);
|
|
59
|
-
}
|
|
60
|
-
if (props.length > 0) {
|
|
61
|
-
psetNode['ifc:hasProperties'] = props;
|
|
62
|
-
}
|
|
63
|
-
propertySets.push(psetNode);
|
|
64
|
-
}
|
|
65
|
-
if (propertySets.length > 0) {
|
|
66
|
-
node['ifc:hasPropertySets'] = propertySets;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
if (includeQuantities && this.store.quantities) {
|
|
71
|
-
const quantities = this.store.quantities.getForEntity(id);
|
|
72
|
-
if (quantities.length > 0) {
|
|
73
|
-
const quantitySets = [];
|
|
74
|
-
for (const qset of quantities) {
|
|
75
|
-
const qsetNode = {
|
|
76
|
-
'@type': 'ifc:IfcElementQuantity',
|
|
77
|
-
'ifc:name': qset.name,
|
|
78
|
-
};
|
|
79
|
-
const quants = [];
|
|
80
|
-
for (const quant of qset.quantities) {
|
|
81
|
-
const quantNode = {
|
|
82
|
-
'@type': `ifc:${this.getQuantityTypeName(quant.type)}`,
|
|
83
|
-
'ifc:name': quant.name,
|
|
84
|
-
'ifc:value': quant.value,
|
|
85
|
-
};
|
|
86
|
-
if (quant.unit) {
|
|
87
|
-
quantNode['ifc:unit'] = quant.unit;
|
|
88
|
-
}
|
|
89
|
-
if (quant.formula) {
|
|
90
|
-
quantNode['ifc:formula'] = quant.formula;
|
|
91
|
-
}
|
|
92
|
-
quants.push(quantNode);
|
|
93
|
-
}
|
|
94
|
-
if (quants.length > 0) {
|
|
95
|
-
qsetNode['ifc:quantities'] = quants;
|
|
96
|
-
}
|
|
97
|
-
quantitySets.push(qsetNode);
|
|
98
|
-
}
|
|
99
|
-
if (quantitySets.length > 0) {
|
|
100
|
-
node['ifc:hasQuantitySets'] = quantitySets;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
graph.push(node);
|
|
105
|
-
}
|
|
106
|
-
return {
|
|
107
|
-
'@context': {
|
|
108
|
-
'@vocab': context + '#',
|
|
109
|
-
'ifc': context + '#',
|
|
110
|
-
},
|
|
111
|
-
'@graph': graph,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Get all entity IDs from the store
|
|
116
|
-
*/
|
|
117
|
-
getAllEntityIds() {
|
|
118
|
-
const ids = [];
|
|
119
|
-
for (let i = 0; i < this.store.entities.count; i++) {
|
|
120
|
-
ids.push(this.store.entities.expressId[i]);
|
|
121
|
-
}
|
|
122
|
-
return ids;
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Format property value for JSON-LD
|
|
126
|
-
*/
|
|
127
|
-
formatPropertyValue(value) {
|
|
128
|
-
if (value === null || value === undefined) {
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
if (Array.isArray(value)) {
|
|
132
|
-
return value.map(v => this.formatPropertyValue(v));
|
|
133
|
-
}
|
|
134
|
-
if (typeof value === 'object') {
|
|
135
|
-
return JSON.stringify(value);
|
|
136
|
-
}
|
|
137
|
-
return value;
|
|
138
|
-
}
|
|
139
|
-
/**
|
|
140
|
-
* Get property type name from enum
|
|
141
|
-
*/
|
|
142
|
-
getPropertyTypeName(type) {
|
|
143
|
-
const typeNames = {
|
|
144
|
-
0: 'IfcPropertySingleValue',
|
|
145
|
-
1: 'IfcPropertySingleValue',
|
|
146
|
-
2: 'IfcPropertyEnumeratedValue',
|
|
147
|
-
3: 'IfcPropertyBoundedValue',
|
|
148
|
-
4: 'IfcPropertyListValue',
|
|
149
|
-
};
|
|
150
|
-
return typeNames[type] ?? 'IfcPropertySingleValue';
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Get quantity type name from enum
|
|
154
|
-
*/
|
|
155
|
-
getQuantityTypeName(type) {
|
|
156
|
-
const typeNames = {
|
|
157
|
-
0: 'IfcQuantityLength',
|
|
158
|
-
1: 'IfcQuantityArea',
|
|
159
|
-
2: 'IfcQuantityVolume',
|
|
160
|
-
3: 'IfcQuantityCount',
|
|
161
|
-
4: 'IfcQuantityWeight',
|
|
162
|
-
5: 'IfcQuantityTime',
|
|
163
|
-
};
|
|
164
|
-
return typeNames[type] ?? 'IfcQuantityLength';
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
//# sourceMappingURL=jsonld-exporter.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jsonld-exporter.js","sourceRoot":"","sources":["../src/jsonld-exporter.ts"],"names":[],"mappings":"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"}
|