@ifc-lite/bcf 1.4.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/dist/writer.js ADDED
@@ -0,0 +1,445 @@
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
+ * BCF file writer
6
+ *
7
+ * Creates .bcfzip files from BCFProject structure
8
+ */
9
+ import JSZip from 'jszip';
10
+ import { generateUuid } from './guid.js';
11
+ /**
12
+ * Write a BCFProject to a .bcfzip file
13
+ *
14
+ * @param project - BCF project to write
15
+ * @returns Blob containing the .bcfzip file
16
+ */
17
+ export async function writeBCF(project) {
18
+ const zip = new JSZip();
19
+ // Write version file
20
+ writeVersionFile(zip, project.version);
21
+ // Write project file (optional)
22
+ if (project.projectId || project.name) {
23
+ writeProjectFile(zip, project);
24
+ }
25
+ // Write topics
26
+ for (const [guid, topic] of project.topics) {
27
+ await writeTopicFolder(zip, topic);
28
+ }
29
+ // Generate zip file
30
+ return zip.generateAsync({
31
+ type: 'blob',
32
+ compression: 'DEFLATE',
33
+ compressionOptions: { level: 6 },
34
+ });
35
+ }
36
+ /**
37
+ * Write bcf.version file
38
+ * Uses buildingSMART standard format with both xsi and xsd namespaces
39
+ */
40
+ function writeVersionFile(zip, version) {
41
+ const content = `<?xml version="1.0" encoding="UTF-8"?>
42
+ <Version xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" VersionId="${version}">
43
+ <DetailedVersion>${version}</DetailedVersion>
44
+ </Version>`;
45
+ zip.file('bcf.version', content);
46
+ }
47
+ /**
48
+ * Write project.bcfp file
49
+ * Uses buildingSMART standard format
50
+ */
51
+ function writeProjectFile(zip, project) {
52
+ const projectId = project.projectId || generateUuid();
53
+ const nameElement = project.name ? `\n <Name>${escapeXml(project.name)}</Name>` : '';
54
+ const content = `<?xml version="1.0" encoding="UTF-8"?>
55
+ <ProjectExtension xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
56
+ <Project ProjectId="${projectId}">${nameElement}
57
+ </Project>
58
+ </ProjectExtension>`;
59
+ zip.file('project.bcfp', content);
60
+ }
61
+ /**
62
+ * Write a topic folder with all its contents
63
+ */
64
+ async function writeTopicFolder(zip, topic) {
65
+ const folder = zip.folder(topic.guid);
66
+ if (!folder)
67
+ return;
68
+ // Write markup.bcf
69
+ writeMarkupFile(folder, topic);
70
+ // Write viewpoints
71
+ for (let i = 0; i < topic.viewpoints.length; i++) {
72
+ const viewpoint = topic.viewpoints[i];
73
+ const isDefault = i === 0;
74
+ await writeViewpointFiles(folder, viewpoint, isDefault);
75
+ }
76
+ }
77
+ /**
78
+ * Write markup.bcf file
79
+ * Uses buildingSMART standard format
80
+ */
81
+ function writeMarkupFile(folder, topic) {
82
+ let content = `<?xml version="1.0" encoding="UTF-8"?>
83
+ <Markup xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
84
+ <Topic Guid="${topic.guid}"${topic.topicType ? ` TopicType="${escapeXml(topic.topicType)}"` : ''}${topic.topicStatus ? ` TopicStatus="${escapeXml(topic.topicStatus)}"` : ''}>
85
+ <Title>${escapeXml(topic.title)}</Title>`;
86
+ if (topic.description) {
87
+ content += `\n <Description>${escapeXml(topic.description)}</Description>`;
88
+ }
89
+ if (topic.priority) {
90
+ content += `\n <Priority>${escapeXml(topic.priority)}</Priority>`;
91
+ }
92
+ if (topic.index !== undefined) {
93
+ content += `\n <Index>${topic.index}</Index>`;
94
+ }
95
+ content += `\n <CreationDate>${topic.creationDate}</CreationDate>`;
96
+ content += `\n <CreationAuthor>${escapeXml(topic.creationAuthor)}</CreationAuthor>`;
97
+ if (topic.modifiedDate) {
98
+ content += `\n <ModifiedDate>${topic.modifiedDate}</ModifiedDate>`;
99
+ // BCF spec requires ModifiedAuthor when ModifiedDate is present
100
+ const modifiedAuthor = topic.modifiedAuthor || topic.creationAuthor;
101
+ content += `\n <ModifiedAuthor>${escapeXml(modifiedAuthor)}</ModifiedAuthor>`;
102
+ }
103
+ if (topic.dueDate) {
104
+ content += `\n <DueDate>${topic.dueDate}</DueDate>`;
105
+ }
106
+ if (topic.assignedTo) {
107
+ content += `\n <AssignedTo>${escapeXml(topic.assignedTo)}</AssignedTo>`;
108
+ }
109
+ if (topic.stage) {
110
+ content += `\n <Stage>${escapeXml(topic.stage)}</Stage>`;
111
+ }
112
+ if (topic.labels && topic.labels.length > 0) {
113
+ for (const label of topic.labels) {
114
+ content += `\n <Labels>${escapeXml(label)}</Labels>`;
115
+ }
116
+ }
117
+ if (topic.relatedTopics && topic.relatedTopics.length > 0) {
118
+ for (const relatedGuid of topic.relatedTopics) {
119
+ content += `\n <RelatedTopic Guid="${relatedGuid}"/>`;
120
+ }
121
+ }
122
+ content += `\n </Topic>`;
123
+ // Write viewpoint references
124
+ for (let i = 0; i < topic.viewpoints.length; i++) {
125
+ const viewpoint = topic.viewpoints[i];
126
+ // Use standard buildingSMART naming convention: Viewpoint_<guid>.bcfv
127
+ const filename = `Viewpoint_${viewpoint.guid}.bcfv`;
128
+ const snapshotName = `Snapshot_${viewpoint.guid}.png`;
129
+ content += `\n <Viewpoints Guid="${viewpoint.guid}">`;
130
+ content += `\n <Viewpoint>${filename}</Viewpoint>`;
131
+ if (viewpoint.snapshot || viewpoint.snapshotData) {
132
+ content += `\n <Snapshot>${snapshotName}</Snapshot>`;
133
+ }
134
+ content += `\n </Viewpoints>`;
135
+ }
136
+ // Write comments
137
+ for (const comment of topic.comments) {
138
+ content += `\n <Comment Guid="${comment.guid}">`;
139
+ content += `\n <Date>${comment.date}</Date>`;
140
+ content += `\n <Author>${escapeXml(comment.author)}</Author>`;
141
+ content += `\n <Comment>${escapeXml(comment.comment)}</Comment>`;
142
+ if (comment.viewpointGuid) {
143
+ content += `\n <Viewpoint Guid="${comment.viewpointGuid}"/>`;
144
+ }
145
+ if (comment.modifiedDate) {
146
+ content += `\n <ModifiedDate>${comment.modifiedDate}</ModifiedDate>`;
147
+ }
148
+ if (comment.modifiedAuthor) {
149
+ content += `\n <ModifiedAuthor>${escapeXml(comment.modifiedAuthor)}</ModifiedAuthor>`;
150
+ }
151
+ content += `\n </Comment>`;
152
+ }
153
+ content += `\n</Markup>`;
154
+ folder.file('markup.bcf', content);
155
+ }
156
+ /**
157
+ * Write viewpoint files (bcfv and snapshot)
158
+ */
159
+ async function writeViewpointFiles(folder, viewpoint, _isDefault) {
160
+ // Use standard buildingSMART naming convention: Viewpoint_<guid>.bcfv
161
+ const filename = `Viewpoint_${viewpoint.guid}.bcfv`;
162
+ const snapshotName = `Snapshot_${viewpoint.guid}.png`;
163
+ // Write viewpoint XML - use buildingSMART standard format
164
+ let content = `<?xml version="1.0" encoding="UTF-8"?>
165
+ <VisualizationInfo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Guid="${viewpoint.guid}">`;
166
+ // Write components
167
+ if (viewpoint.components) {
168
+ content += writeComponents(viewpoint.components);
169
+ }
170
+ // Write perspective camera
171
+ if (viewpoint.perspectiveCamera) {
172
+ content += writePerspectiveCamera(viewpoint.perspectiveCamera);
173
+ }
174
+ // Write orthogonal camera
175
+ if (viewpoint.orthogonalCamera) {
176
+ content += writeOrthogonalCamera(viewpoint.orthogonalCamera);
177
+ }
178
+ // Write lines
179
+ if (viewpoint.lines && viewpoint.lines.length > 0) {
180
+ content += `\n <Lines>`;
181
+ for (const line of viewpoint.lines) {
182
+ content += writeLine(line);
183
+ }
184
+ content += `\n </Lines>`;
185
+ }
186
+ // Write clipping planes
187
+ if (viewpoint.clippingPlanes && viewpoint.clippingPlanes.length > 0) {
188
+ content += `\n <ClippingPlanes>`;
189
+ for (const plane of viewpoint.clippingPlanes) {
190
+ content += writeClippingPlane(plane);
191
+ }
192
+ content += `\n </ClippingPlanes>`;
193
+ }
194
+ // Write bitmaps
195
+ if (viewpoint.bitmaps && viewpoint.bitmaps.length > 0) {
196
+ content += `\n <Bitmaps>`;
197
+ for (const bitmap of viewpoint.bitmaps) {
198
+ content += writeBitmap(bitmap);
199
+ }
200
+ content += `\n </Bitmaps>`;
201
+ }
202
+ content += `\n</VisualizationInfo>`;
203
+ folder.file(filename, content);
204
+ // Write snapshot
205
+ if (viewpoint.snapshotData) {
206
+ folder.file(snapshotName, viewpoint.snapshotData);
207
+ }
208
+ else if (viewpoint.snapshot && viewpoint.snapshot.startsWith('data:')) {
209
+ // Convert data URL to binary
210
+ const base64Data = viewpoint.snapshot.split(',')[1];
211
+ const binaryString = atob(base64Data);
212
+ const bytes = new Uint8Array(binaryString.length);
213
+ for (let i = 0; i < binaryString.length; i++) {
214
+ bytes[i] = binaryString.charCodeAt(i);
215
+ }
216
+ folder.file(snapshotName, bytes);
217
+ }
218
+ }
219
+ /**
220
+ * Write components XML
221
+ *
222
+ * BCF 2.1 schema order (MUST follow this order):
223
+ * 1. ViewSetupHints (optional)
224
+ * 2. Selection (optional)
225
+ * 3. Visibility (REQUIRED)
226
+ * 4. Coloring (optional)
227
+ */
228
+ function writeComponents(components) {
229
+ let content = `\n <Components>`;
230
+ // 1. Write ViewSetupHints (if present in visibility)
231
+ if (components.visibility?.viewSetupHints) {
232
+ const hints = components.visibility.viewSetupHints;
233
+ content += `\n <ViewSetupHints`;
234
+ if (hints.spacesVisible !== undefined) {
235
+ content += ` SpacesVisible="${hints.spacesVisible}"`;
236
+ }
237
+ if (hints.spaceBoundariesVisible !== undefined) {
238
+ content += ` SpaceBoundariesVisible="${hints.spaceBoundariesVisible}"`;
239
+ }
240
+ if (hints.openingsVisible !== undefined) {
241
+ content += ` OpeningsVisible="${hints.openingsVisible}"`;
242
+ }
243
+ content += `/>`;
244
+ }
245
+ // 2. Write selection (before visibility per schema)
246
+ if (components.selection && components.selection.length > 0) {
247
+ content += `\n <Selection>`;
248
+ for (const component of components.selection) {
249
+ content += writeComponent(component);
250
+ }
251
+ content += `\n </Selection>`;
252
+ }
253
+ // 3. Write visibility (REQUIRED by schema)
254
+ content += writeVisibility(components.visibility);
255
+ // 4. Write coloring
256
+ if (components.coloring && components.coloring.length > 0) {
257
+ content += `\n <Coloring>`;
258
+ for (const coloring of components.coloring) {
259
+ content += writeColoringEntry(coloring);
260
+ }
261
+ content += `\n </Coloring>`;
262
+ }
263
+ content += `\n </Components>`;
264
+ return content;
265
+ }
266
+ /**
267
+ * Write visibility XML
268
+ *
269
+ * Per BCF 2.1 schema:
270
+ * - Visibility is REQUIRED inside Components
271
+ * - DefaultVisibility attribute defaults to false
272
+ * - Exceptions contains Component elements (entities to show/hide opposite of default)
273
+ * - ViewSetupHints is NOT inside Visibility (moved to Components level)
274
+ */
275
+ function writeVisibility(visibility) {
276
+ // Default visibility to true (show all) if not specified
277
+ const defaultVis = visibility?.defaultVisibility ?? true;
278
+ let content = `\n <Visibility DefaultVisibility="${defaultVis}">`;
279
+ if (visibility?.exceptions && visibility.exceptions.length > 0) {
280
+ content += `\n <Exceptions>`;
281
+ for (const component of visibility.exceptions) {
282
+ content += writeComponent(component, ' ');
283
+ }
284
+ content += `\n </Exceptions>`;
285
+ }
286
+ content += `\n </Visibility>`;
287
+ return content;
288
+ }
289
+ /**
290
+ * Write a single component XML
291
+ *
292
+ * Per BCF 2.1 schema:
293
+ * - IfcGuid is an ATTRIBUTE (required for IFC objects)
294
+ * - OriginatingSystem is a child ELEMENT (optional)
295
+ * - AuthoringToolId is a child ELEMENT (optional)
296
+ */
297
+ function writeComponent(component, indent = ' ') {
298
+ const hasChildren = component.originatingSystem || component.authoringToolId;
299
+ let content = `\n${indent}<Component`;
300
+ if (component.ifcGuid) {
301
+ content += ` IfcGuid="${component.ifcGuid}"`;
302
+ }
303
+ if (hasChildren) {
304
+ content += `>`;
305
+ if (component.originatingSystem) {
306
+ content += `\n${indent} <OriginatingSystem>${escapeXml(component.originatingSystem)}</OriginatingSystem>`;
307
+ }
308
+ if (component.authoringToolId) {
309
+ content += `\n${indent} <AuthoringToolId>${escapeXml(component.authoringToolId)}</AuthoringToolId>`;
310
+ }
311
+ content += `\n${indent}</Component>`;
312
+ }
313
+ else {
314
+ content += `/>`;
315
+ }
316
+ return content;
317
+ }
318
+ /**
319
+ * Write coloring entry XML
320
+ */
321
+ function writeColoringEntry(coloring) {
322
+ let content = `\n <Color Color="${coloring.color}">`;
323
+ for (const component of coloring.components) {
324
+ content += writeComponent(component, ' ');
325
+ }
326
+ content += `\n </Color>`;
327
+ return content;
328
+ }
329
+ /**
330
+ * Write perspective camera XML
331
+ */
332
+ function writePerspectiveCamera(camera) {
333
+ return `\n <PerspectiveCamera>
334
+ <CameraViewPoint>
335
+ <X>${camera.cameraViewPoint.x}</X>
336
+ <Y>${camera.cameraViewPoint.y}</Y>
337
+ <Z>${camera.cameraViewPoint.z}</Z>
338
+ </CameraViewPoint>
339
+ <CameraDirection>
340
+ <X>${camera.cameraDirection.x}</X>
341
+ <Y>${camera.cameraDirection.y}</Y>
342
+ <Z>${camera.cameraDirection.z}</Z>
343
+ </CameraDirection>
344
+ <CameraUpVector>
345
+ <X>${camera.cameraUpVector.x}</X>
346
+ <Y>${camera.cameraUpVector.y}</Y>
347
+ <Z>${camera.cameraUpVector.z}</Z>
348
+ </CameraUpVector>
349
+ <FieldOfView>${camera.fieldOfView}</FieldOfView>
350
+ </PerspectiveCamera>`;
351
+ }
352
+ /**
353
+ * Write orthogonal camera XML
354
+ */
355
+ function writeOrthogonalCamera(camera) {
356
+ return `\n <OrthogonalCamera>
357
+ <CameraViewPoint>
358
+ <X>${camera.cameraViewPoint.x}</X>
359
+ <Y>${camera.cameraViewPoint.y}</Y>
360
+ <Z>${camera.cameraViewPoint.z}</Z>
361
+ </CameraViewPoint>
362
+ <CameraDirection>
363
+ <X>${camera.cameraDirection.x}</X>
364
+ <Y>${camera.cameraDirection.y}</Y>
365
+ <Z>${camera.cameraDirection.z}</Z>
366
+ </CameraDirection>
367
+ <CameraUpVector>
368
+ <X>${camera.cameraUpVector.x}</X>
369
+ <Y>${camera.cameraUpVector.y}</Y>
370
+ <Z>${camera.cameraUpVector.z}</Z>
371
+ </CameraUpVector>
372
+ <ViewToWorldScale>${camera.viewToWorldScale}</ViewToWorldScale>
373
+ </OrthogonalCamera>`;
374
+ }
375
+ /**
376
+ * Write line XML
377
+ */
378
+ function writeLine(line) {
379
+ return `\n <Line>
380
+ <StartPoint>
381
+ <X>${line.startPoint.x}</X>
382
+ <Y>${line.startPoint.y}</Y>
383
+ <Z>${line.startPoint.z}</Z>
384
+ </StartPoint>
385
+ <EndPoint>
386
+ <X>${line.endPoint.x}</X>
387
+ <Y>${line.endPoint.y}</Y>
388
+ <Z>${line.endPoint.z}</Z>
389
+ </EndPoint>
390
+ </Line>`;
391
+ }
392
+ /**
393
+ * Write clipping plane XML
394
+ */
395
+ function writeClippingPlane(plane) {
396
+ return `\n <ClippingPlane>
397
+ <Location>
398
+ <X>${plane.location.x}</X>
399
+ <Y>${plane.location.y}</Y>
400
+ <Z>${plane.location.z}</Z>
401
+ </Location>
402
+ <Direction>
403
+ <X>${plane.direction.x}</X>
404
+ <Y>${plane.direction.y}</Y>
405
+ <Z>${plane.direction.z}</Z>
406
+ </Direction>
407
+ </ClippingPlane>`;
408
+ }
409
+ /**
410
+ * Write bitmap XML
411
+ */
412
+ function writeBitmap(bitmap) {
413
+ return `\n <Bitmap>
414
+ <Format>${bitmap.format}</Format>
415
+ <Reference>${escapeXml(bitmap.reference)}</Reference>
416
+ <Location>
417
+ <X>${bitmap.location.x}</X>
418
+ <Y>${bitmap.location.y}</Y>
419
+ <Z>${bitmap.location.z}</Z>
420
+ </Location>
421
+ <Normal>
422
+ <X>${bitmap.normal.x}</X>
423
+ <Y>${bitmap.normal.y}</Y>
424
+ <Z>${bitmap.normal.z}</Z>
425
+ </Normal>
426
+ <Up>
427
+ <X>${bitmap.up.x}</X>
428
+ <Y>${bitmap.up.y}</Y>
429
+ <Z>${bitmap.up.z}</Z>
430
+ </Up>
431
+ <Height>${bitmap.height}</Height>
432
+ </Bitmap>`;
433
+ }
434
+ /**
435
+ * Escape XML special characters
436
+ */
437
+ function escapeXml(str) {
438
+ return str
439
+ .replace(/&/g, '&amp;')
440
+ .replace(/</g, '&lt;')
441
+ .replace(/>/g, '&gt;')
442
+ .replace(/"/g, '&quot;')
443
+ .replace(/'/g, '&apos;');
444
+ }
445
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAkB1B,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAmB;IAChD,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;IAExB,qBAAqB;IACrB,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvC,gCAAgC;IAChC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,eAAe;IACf,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC3C,MAAM,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,oBAAoB;IACpB,OAAO,GAAG,CAAC,aAAa,CAAC;QACvB,IAAI,EAAE,MAAM;QACZ,WAAW,EAAE,SAAS;QACtB,kBAAkB,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;KACjC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAU,EAAE,OAAsB;IAC1D,MAAM,OAAO,GAAG;yHACuG,OAAO;qBAC3G,OAAO;WACjB,CAAC;IAEV,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB,CAAC,GAAU,EAAE,OAAmB;IACvD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,YAAY,EAAE,CAAC;IACtD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAExF,MAAM,OAAO,GAAG;;wBAEM,SAAS,KAAK,WAAW;;oBAE7B,CAAC;IAEnB,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAAC,GAAU,EAAE,KAAe;IACzD,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,mBAAmB;IACnB,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAE/B,mBAAmB;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,MAAa,EAAE,KAAe;IACrD,IAAI,OAAO,GAAG;;iBAEC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,eAAe,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;aACjK,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;IAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO,IAAI,sBAAsB,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC;IAChF,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,IAAI,mBAAmB,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;IACvE,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,gBAAgB,KAAK,CAAC,KAAK,UAAU,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,uBAAuB,KAAK,CAAC,YAAY,iBAAiB,CAAC;IACtE,OAAO,IAAI,yBAAyB,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,mBAAmB,CAAC;IAEvF,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,OAAO,IAAI,uBAAuB,KAAK,CAAC,YAAY,iBAAiB,CAAC;QACtE,gEAAgE;QAChE,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,cAAc,CAAC;QACpE,OAAO,IAAI,yBAAyB,SAAS,CAAC,cAAc,CAAC,mBAAmB,CAAC;IACnF,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,IAAI,kBAAkB,KAAK,CAAC,OAAO,YAAY,CAAC;IACzD,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,IAAI,qBAAqB,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,eAAe,CAAC;IAC7E,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,IAAI,gBAAgB,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;IAC9D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjC,OAAO,IAAI,iBAAiB,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YAC9C,OAAO,IAAI,6BAA6B,WAAW,KAAK,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,cAAc,CAAC;IAE1B,6BAA6B;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtC,sEAAsE;QACtE,MAAM,QAAQ,GAAG,aAAa,SAAS,CAAC,IAAI,OAAO,CAAC;QACpD,MAAM,YAAY,GAAG,YAAY,SAAS,CAAC,IAAI,MAAM,CAAC;QAEtD,OAAO,IAAI,yBAAyB,SAAS,CAAC,IAAI,IAAI,CAAC;QACvD,OAAO,IAAI,oBAAoB,QAAQ,cAAc,CAAC;QACtD,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;YACjD,OAAO,IAAI,mBAAmB,YAAY,aAAa,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,mBAAmB,CAAC;IACjC,CAAC;IAED,iBAAiB;IACjB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACrC,OAAO,IAAI,sBAAsB,OAAO,CAAC,IAAI,IAAI,CAAC;QAClD,OAAO,IAAI,eAAe,OAAO,CAAC,IAAI,SAAS,CAAC;QAChD,OAAO,IAAI,iBAAiB,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;QACjE,OAAO,IAAI,kBAAkB,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;QACpE,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,OAAO,IAAI,0BAA0B,OAAO,CAAC,aAAa,KAAK,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,OAAO,IAAI,uBAAuB,OAAO,CAAC,YAAY,iBAAiB,CAAC;QAC1E,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,OAAO,IAAI,yBAAyB,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,mBAAmB,CAAC;QAC3F,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,aAAa,CAAC;IAEzB,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,MAAa,EACb,SAAuB,EACvB,UAAmB;IAEnB,sEAAsE;IACtE,MAAM,QAAQ,GAAG,aAAa,SAAS,CAAC,IAAI,OAAO,CAAC;IACpD,MAAM,YAAY,GAAG,YAAY,SAAS,CAAC,IAAI,MAAM,CAAC;IAEtD,0DAA0D;IAC1D,IAAI,OAAO,GAAG;8HAC8G,SAAS,CAAC,IAAI,IAAI,CAAC;IAE/I,mBAAmB;IACnB,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,IAAI,eAAe,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,2BAA2B;IAC3B,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC;QAChC,OAAO,IAAI,sBAAsB,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACjE,CAAC;IAED,0BAA0B;IAC1B,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC/B,OAAO,IAAI,qBAAqB,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAED,cAAc;IACd,IAAI,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,OAAO,IAAI,aAAa,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;YACnC,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,cAAc,CAAC;IAC5B,CAAC;IAED,wBAAwB;IACxB,IAAI,SAAS,CAAC,cAAc,IAAI,SAAS,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpE,OAAO,IAAI,sBAAsB,CAAC;QAClC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;YAC7C,OAAO,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,uBAAuB,CAAC;IACrC,CAAC;IAED,gBAAgB;IAChB,IAAI,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,eAAe,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,gBAAgB,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,wBAAwB,CAAC;IAEpC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE/B,iBAAiB;IACjB,IAAI,SAAS,CAAC,YAAY,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;SAAM,IAAI,SAAS,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACxE,6BAA6B;QAC7B,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,KAAK,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,UAAyB;IAChD,IAAI,OAAO,GAAG,kBAAkB,CAAC;IAEjC,qDAAqD;IACrD,IAAI,UAAU,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,cAAc,CAAC;QACnD,OAAO,IAAI,uBAAuB,CAAC;QACnC,IAAI,KAAK,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,IAAI,mBAAmB,KAAK,CAAC,aAAa,GAAG,CAAC;QACvD,CAAC;QACD,IAAI,KAAK,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;YAC/C,OAAO,IAAI,4BAA4B,KAAK,CAAC,sBAAsB,GAAG,CAAC;QACzE,CAAC;QACD,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;YACxC,OAAO,IAAI,qBAAqB,KAAK,CAAC,eAAe,GAAG,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,oDAAoD;IACpD,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,OAAO,IAAI,mBAAmB,CAAC;QAC/B,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YAC7C,OAAO,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,oBAAoB,CAAC;IAClC,CAAC;IAED,2CAA2C;IAC3C,OAAO,IAAI,eAAe,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAElD,oBAAoB;IACpB,IAAI,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,kBAAkB,CAAC;QAC9B,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;YAC3C,OAAO,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,IAAI,mBAAmB,CAAC;IACjC,CAAC;IAED,OAAO,IAAI,mBAAmB,CAAC;IAC/B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,eAAe,CAAC,UAAqC;IAC5D,yDAAyD;IACzD,MAAM,UAAU,GAAG,UAAU,EAAE,iBAAiB,IAAI,IAAI,CAAC;IAEzD,IAAI,OAAO,GAAG,wCAAwC,UAAU,IAAI,CAAC;IAErE,IAAI,UAAU,EAAE,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,sBAAsB,CAAC;QAClC,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC9C,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,uBAAuB,CAAC;IACrC,CAAC;IAED,OAAO,IAAI,qBAAqB,CAAC;IACjC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,cAAc,CAAC,SAAuB,EAAE,MAAM,GAAG,QAAQ;IAChE,MAAM,WAAW,GAAG,SAAS,CAAC,iBAAiB,IAAI,SAAS,CAAC,eAAe,CAAC;IAE7E,IAAI,OAAO,GAAG,KAAK,MAAM,YAAY,CAAC;IAEtC,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QACtB,OAAO,IAAI,aAAa,SAAS,CAAC,OAAO,GAAG,CAAC;IAC/C,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,IAAI,GAAG,CAAC;QACf,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAC;YAChC,OAAO,IAAI,KAAK,MAAM,wBAAwB,SAAS,CAAC,SAAS,CAAC,iBAAiB,CAAC,sBAAsB,CAAC;QAC7G,CAAC;QACD,IAAI,SAAS,CAAC,eAAe,EAAE,CAAC;YAC9B,OAAO,IAAI,KAAK,MAAM,sBAAsB,SAAS,CAAC,SAAS,CAAC,eAAe,CAAC,oBAAoB,CAAC;QACvG,CAAC;QACD,OAAO,IAAI,KAAK,MAAM,cAAc,CAAC;IACvC,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,QAAqB;IAC/C,IAAI,OAAO,GAAG,yBAAyB,QAAQ,CAAC,KAAK,IAAI,CAAC;IAC1D,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5C,OAAO,IAAI,cAAc,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,kBAAkB,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,sBAAsB,CAAC,MAA4B;IAC1D,OAAO;;WAEE,MAAM,CAAC,eAAe,CAAC,CAAC;WACxB,MAAM,CAAC,eAAe,CAAC,CAAC;WACxB,MAAM,CAAC,eAAe,CAAC,CAAC;;;WAGxB,MAAM,CAAC,eAAe,CAAC,CAAC;WACxB,MAAM,CAAC,eAAe,CAAC,CAAC;WACxB,MAAM,CAAC,eAAe,CAAC,CAAC;;;WAGxB,MAAM,CAAC,cAAc,CAAC,CAAC;WACvB,MAAM,CAAC,cAAc,CAAC,CAAC;WACvB,MAAM,CAAC,cAAc,CAAC,CAAC;;mBAEf,MAAM,CAAC,WAAW;uBACd,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAA2B;IACxD,OAAO;;WAEE,MAAM,CAAC,eAAe,CAAC,CAAC;WACxB,MAAM,CAAC,eAAe,CAAC,CAAC;WACxB,MAAM,CAAC,eAAe,CAAC,CAAC;;;WAGxB,MAAM,CAAC,eAAe,CAAC,CAAC;WACxB,MAAM,CAAC,eAAe,CAAC,CAAC;WACxB,MAAM,CAAC,eAAe,CAAC,CAAC;;;WAGxB,MAAM,CAAC,cAAc,CAAC,CAAC;WACvB,MAAM,CAAC,cAAc,CAAC,CAAC;WACvB,MAAM,CAAC,cAAc,CAAC,CAAC;;wBAEV,MAAM,CAAC,gBAAgB;sBACzB,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,IAAa;IAC9B,OAAO;;aAEI,IAAI,CAAC,UAAU,CAAC,CAAC;aACjB,IAAI,CAAC,UAAU,CAAC,CAAC;aACjB,IAAI,CAAC,UAAU,CAAC,CAAC;;;aAGjB,IAAI,CAAC,QAAQ,CAAC,CAAC;aACf,IAAI,CAAC,QAAQ,CAAC,CAAC;aACf,IAAI,CAAC,QAAQ,CAAC,CAAC;;YAEhB,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAuB;IACjD,OAAO;;aAEI,KAAK,CAAC,QAAQ,CAAC,CAAC;aAChB,KAAK,CAAC,QAAQ,CAAC,CAAC;aAChB,KAAK,CAAC,QAAQ,CAAC,CAAC;;;aAGhB,KAAK,CAAC,SAAS,CAAC,CAAC;aACjB,KAAK,CAAC,SAAS,CAAC,CAAC;aACjB,KAAK,CAAC,SAAS,CAAC,CAAC;;qBAET,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,MAAiB;IACpC,OAAO;gBACO,MAAM,CAAC,MAAM;mBACV,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;;aAEjC,MAAM,CAAC,QAAQ,CAAC,CAAC;aACjB,MAAM,CAAC,QAAQ,CAAC,CAAC;aACjB,MAAM,CAAC,QAAQ,CAAC,CAAC;;;aAGjB,MAAM,CAAC,MAAM,CAAC,CAAC;aACf,MAAM,CAAC,MAAM,CAAC,CAAC;aACf,MAAM,CAAC,MAAM,CAAC,CAAC;;;aAGf,MAAM,CAAC,EAAE,CAAC,CAAC;aACX,MAAM,CAAC,EAAE,CAAC,CAAC;aACX,MAAM,CAAC,EAAE,CAAC,CAAC;;gBAER,MAAM,CAAC,MAAM;cACf,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@ifc-lite/bcf",
3
+ "version": "1.4.0",
4
+ "description": "BIM Collaboration Format (BCF) support for IFC-Lite",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "jszip": "^3.10.0"
16
+ },
17
+ "devDependencies": {
18
+ "typescript": "^5.3.0",
19
+ "vitest": "^1.6.0"
20
+ },
21
+ "license": "MPL-2.0",
22
+ "author": "Louis True",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/louistrue/ifc-lite.git",
26
+ "directory": "packages/bcf"
27
+ },
28
+ "homepage": "https://louistrue.github.io/ifc-lite/",
29
+ "bugs": "https://github.com/louistrue/ifc-lite/issues",
30
+ "keywords": [
31
+ "ifc",
32
+ "bim",
33
+ "bcf",
34
+ "buildingsmart",
35
+ "collaboration",
36
+ "issue-tracking",
37
+ "aec"
38
+ ],
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "files": [
43
+ "dist",
44
+ "README.md"
45
+ ],
46
+ "scripts": {
47
+ "build": "tsc",
48
+ "dev": "tsc --watch",
49
+ "test": "vitest run"
50
+ }
51
+ }