@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/reader.js ADDED
@@ -0,0 +1,632 @@
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 reader
6
+ *
7
+ * Parses .bcfzip files into BCFProject structure
8
+ */
9
+ import JSZip from 'jszip';
10
+ /**
11
+ * Parse a BCF file (.bcfzip) into a BCFProject
12
+ *
13
+ * @param file - BCF file as File, Blob, or ArrayBuffer
14
+ * @returns Parsed BCF project
15
+ */
16
+ export async function readBCF(file) {
17
+ const zip = await JSZip.loadAsync(file);
18
+ // Read version file
19
+ const version = await readVersionFile(zip);
20
+ // Read project file (optional)
21
+ const { projectId, name, extensions } = await readProjectFile(zip);
22
+ // Read topics
23
+ const topics = await readTopics(zip);
24
+ return {
25
+ version: version.versionId,
26
+ projectId,
27
+ name,
28
+ topics,
29
+ extensions,
30
+ };
31
+ }
32
+ /**
33
+ * Read bcf.version file
34
+ */
35
+ async function readVersionFile(zip) {
36
+ const versionFile = zip.file('bcf.version');
37
+ if (!versionFile) {
38
+ throw new Error('Invalid BCF file: missing bcf.version');
39
+ }
40
+ const content = await versionFile.async('string');
41
+ const versionMatch = content.match(/VersionId="([^"]+)"/);
42
+ if (!versionMatch) {
43
+ throw new Error('Invalid BCF version file: could not parse VersionId');
44
+ }
45
+ const versionId = versionMatch[1];
46
+ if (versionId !== '2.1' && versionId !== '3.0') {
47
+ console.warn(`Unsupported BCF version: ${versionId}, treating as 2.1`);
48
+ }
49
+ return {
50
+ versionId: versionId === '3.0' ? '3.0' : '2.1',
51
+ detailedVersion: versionMatch[1],
52
+ };
53
+ }
54
+ /**
55
+ * Read project.bcfp file (optional)
56
+ */
57
+ async function readProjectFile(zip) {
58
+ const projectFile = zip.file('project.bcfp');
59
+ if (!projectFile) {
60
+ return {};
61
+ }
62
+ const content = await projectFile.async('string');
63
+ const projectIdMatch = content.match(/ProjectId="([^"]+)"/);
64
+ const nameMatch = content.match(/<Name>([^<]+)<\/Name>/);
65
+ return {
66
+ projectId: projectIdMatch?.[1],
67
+ name: nameMatch?.[1],
68
+ };
69
+ }
70
+ /**
71
+ * Read all topics from the BCF archive
72
+ */
73
+ async function readTopics(zip) {
74
+ const topics = new Map();
75
+ // Find all topic folders (folders with markup.bcf)
76
+ const topicFolders = new Set();
77
+ zip.forEach((relativePath) => {
78
+ const match = relativePath.match(/^([^/]+)\/markup\.bcf$/i);
79
+ if (match) {
80
+ topicFolders.add(match[1]);
81
+ }
82
+ });
83
+ // Parse each topic
84
+ for (const topicGuid of topicFolders) {
85
+ try {
86
+ const topic = await readTopic(zip, topicGuid);
87
+ if (topic) {
88
+ topics.set(topic.guid, topic);
89
+ }
90
+ }
91
+ catch (error) {
92
+ console.warn(`Failed to parse topic ${topicGuid}:`, error);
93
+ }
94
+ }
95
+ return topics;
96
+ }
97
+ /**
98
+ * Read a single topic from the BCF archive
99
+ */
100
+ async function readTopic(zip, topicFolder) {
101
+ const markupFile = zip.file(`${topicFolder}/markup.bcf`);
102
+ if (!markupFile) {
103
+ return null;
104
+ }
105
+ const markupContent = await markupFile.async('string');
106
+ // Parse Topic element
107
+ const topicMatch = markupContent.match(/<Topic\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Topic>/);
108
+ if (!topicMatch) {
109
+ console.warn(`Invalid markup.bcf in ${topicFolder}: missing Topic element`);
110
+ return null;
111
+ }
112
+ const guid = topicMatch[1];
113
+ const topicContent = topicMatch[2];
114
+ // Extract topic attributes
115
+ const topicTypeMatch = markupContent.match(/<Topic[^>]*TopicType="([^"]+)"/);
116
+ const topicStatusMatch = markupContent.match(/<Topic[^>]*TopicStatus="([^"]+)"/);
117
+ // Extract topic elements
118
+ const title = extractElement(topicContent, 'Title') || 'Untitled';
119
+ const description = extractElement(topicContent, 'Description');
120
+ const priority = extractElement(topicContent, 'Priority');
121
+ const index = extractElement(topicContent, 'Index');
122
+ const creationDate = extractElement(topicContent, 'CreationDate') || new Date().toISOString();
123
+ const creationAuthor = extractElement(topicContent, 'CreationAuthor') || 'Unknown';
124
+ const modifiedDate = extractElement(topicContent, 'ModifiedDate');
125
+ const modifiedAuthor = extractElement(topicContent, 'ModifiedAuthor');
126
+ const dueDate = extractElement(topicContent, 'DueDate');
127
+ const assignedTo = extractElement(topicContent, 'AssignedTo');
128
+ const stage = extractElement(topicContent, 'Stage');
129
+ // Extract labels
130
+ const labels = [];
131
+ const labelMatches = topicContent.matchAll(/<Labels>([^<]+)<\/Labels>/g);
132
+ for (const match of labelMatches) {
133
+ labels.push(match[1]);
134
+ }
135
+ // Extract BIM snippet
136
+ const bimSnippet = extractBimSnippet(topicContent);
137
+ // Extract document references
138
+ const documentReferences = extractDocumentReferences(topicContent);
139
+ // Extract related topics
140
+ const relatedTopics = [];
141
+ const relatedMatches = topicContent.matchAll(/<RelatedTopic\s+Guid="([^"]+)"/g);
142
+ for (const match of relatedMatches) {
143
+ relatedTopics.push(match[1]);
144
+ }
145
+ // Parse comments
146
+ const comments = parseComments(markupContent);
147
+ // Parse viewpoints
148
+ const viewpoints = await parseViewpoints(zip, topicFolder, markupContent);
149
+ return {
150
+ guid,
151
+ title,
152
+ description,
153
+ topicType: topicTypeMatch?.[1],
154
+ topicStatus: topicStatusMatch?.[1],
155
+ priority,
156
+ index: index ? parseInt(index, 10) : undefined,
157
+ creationDate,
158
+ creationAuthor,
159
+ modifiedDate,
160
+ modifiedAuthor,
161
+ dueDate,
162
+ assignedTo,
163
+ stage,
164
+ labels: labels.length > 0 ? labels : undefined,
165
+ bimSnippet,
166
+ documentReferences: documentReferences.length > 0 ? documentReferences : undefined,
167
+ relatedTopics: relatedTopics.length > 0 ? relatedTopics : undefined,
168
+ comments,
169
+ viewpoints,
170
+ };
171
+ }
172
+ /**
173
+ * Extract a simple element value from XML
174
+ */
175
+ function extractElement(content, elementName) {
176
+ const match = content.match(new RegExp(`<${elementName}>([^<]*)<\\/${elementName}>`));
177
+ return match?.[1];
178
+ }
179
+ /**
180
+ * Extract BIM snippet from topic content
181
+ */
182
+ function extractBimSnippet(content) {
183
+ const match = content.match(/<BimSnippet\s+SnippetType="([^"]+)"[^>]*>([\s\S]*?)<\/BimSnippet>/);
184
+ if (!match)
185
+ return undefined;
186
+ const isExternalMatch = match[0].match(/isExternal="([^"]+)"/);
187
+ const reference = extractElement(match[2], 'Reference');
188
+ const referenceSchema = extractElement(match[2], 'ReferenceSchema');
189
+ return {
190
+ snippetType: match[1],
191
+ isExternal: isExternalMatch?.[1] === 'true',
192
+ reference: reference || '',
193
+ referenceSchema,
194
+ };
195
+ }
196
+ /**
197
+ * Extract document references from topic content
198
+ */
199
+ function extractDocumentReferences(content) {
200
+ const refs = [];
201
+ const matches = content.matchAll(/<DocumentReference[^>]*>([\s\S]*?)<\/DocumentReference>/g);
202
+ for (const match of matches) {
203
+ const guidMatch = match[0].match(/Guid="([^"]+)"/);
204
+ const isExternalMatch = match[0].match(/isExternal="([^"]+)"/);
205
+ const referencedDoc = extractElement(match[1], 'ReferencedDocument');
206
+ const description = extractElement(match[1], 'Description');
207
+ if (referencedDoc) {
208
+ refs.push({
209
+ guid: guidMatch?.[1],
210
+ isExternal: isExternalMatch?.[1] === 'true',
211
+ referencedDocument: referencedDoc,
212
+ description,
213
+ });
214
+ }
215
+ }
216
+ return refs;
217
+ }
218
+ /**
219
+ * Parse comments from markup.bcf
220
+ */
221
+ function parseComments(markupContent) {
222
+ const comments = [];
223
+ const commentMatches = markupContent.matchAll(/<Comment\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Comment>/g);
224
+ for (const match of commentMatches) {
225
+ const guid = match[1];
226
+ const content = match[2];
227
+ const date = extractElement(content, 'Date') || new Date().toISOString();
228
+ const author = extractElement(content, 'Author') || 'Unknown';
229
+ const comment = extractElement(content, 'Comment') || '';
230
+ const modifiedDate = extractElement(content, 'ModifiedDate');
231
+ const modifiedAuthor = extractElement(content, 'ModifiedAuthor');
232
+ // Extract viewpoint reference
233
+ const viewpointMatch = content.match(/<Viewpoint\s+Guid="([^"]+)"/);
234
+ comments.push({
235
+ guid,
236
+ date,
237
+ author,
238
+ comment,
239
+ viewpointGuid: viewpointMatch?.[1],
240
+ modifiedDate,
241
+ modifiedAuthor,
242
+ });
243
+ }
244
+ return comments;
245
+ }
246
+ /**
247
+ * Parse viewpoints from the BCF archive
248
+ */
249
+ async function parseViewpoints(zip, topicFolder, markupContent) {
250
+ const viewpoints = [];
251
+ // Parse viewpoint references from markup.bcf to get snapshot filenames
252
+ // Format: <Viewpoint Guid="xxx"><Viewpoint>filename.bcfv</Viewpoint><Snapshot>snapshot.png</Snapshot></Viewpoint>
253
+ const viewpointInfoMap = new Map();
254
+ // Match full viewpoint elements with both viewpoint and snapshot references
255
+ const viewpointElementRegex = /<Viewpoint\s+Guid="([^"]+)"[^>]*>([\s\S]*?)<\/Viewpoint>/g;
256
+ for (const match of markupContent.matchAll(viewpointElementRegex)) {
257
+ const guid = match[1];
258
+ const content = match[2];
259
+ const viewpointFileMatch = content.match(/<Viewpoint>([^<]+)<\/Viewpoint>/);
260
+ const snapshotFileMatch = content.match(/<Snapshot>([^<]+)<\/Snapshot>/);
261
+ viewpointInfoMap.set(guid, {
262
+ viewpointFile: viewpointFileMatch?.[1],
263
+ snapshotFile: snapshotFileMatch?.[1],
264
+ });
265
+ }
266
+ // Also match self-closing viewpoint references
267
+ const simpleViewpointRefs = markupContent.matchAll(/<Viewpoint\s+Guid="([^"]+)"[^>]*\/>/g);
268
+ for (const match of simpleViewpointRefs) {
269
+ if (!viewpointInfoMap.has(match[1])) {
270
+ viewpointInfoMap.set(match[1], {});
271
+ }
272
+ }
273
+ // Find viewpoint files directly in the folder
274
+ const viewpointFiles = [];
275
+ zip.forEach((relativePath) => {
276
+ if (relativePath.startsWith(`${topicFolder}/`) && relativePath.endsWith('.bcfv')) {
277
+ viewpointFiles.push(relativePath);
278
+ }
279
+ });
280
+ // Parse each viewpoint file
281
+ for (const viewpointPath of viewpointFiles) {
282
+ try {
283
+ const viewpointFile = zip.file(viewpointPath);
284
+ if (!viewpointFile)
285
+ continue;
286
+ const viewpointContent = await viewpointFile.async('string');
287
+ const viewpoint = parseViewpointContent(viewpointContent);
288
+ if (viewpoint) {
289
+ // Get snapshot filename from markup.bcf if available
290
+ const viewpointInfo = viewpointInfoMap.get(viewpoint.guid);
291
+ let snapshotFile = null;
292
+ let snapshotFormat = 'png';
293
+ // First, try the snapshot filename from markup.bcf
294
+ if (viewpointInfo?.snapshotFile) {
295
+ const snapshotPath = `${topicFolder}/${viewpointInfo.snapshotFile}`;
296
+ snapshotFile = zip.file(snapshotPath);
297
+ if (viewpointInfo.snapshotFile.toLowerCase().endsWith('.jpg') ||
298
+ viewpointInfo.snapshotFile.toLowerCase().endsWith('.jpeg')) {
299
+ snapshotFormat = 'jpeg';
300
+ }
301
+ }
302
+ // Fallback: try common naming patterns
303
+ if (!snapshotFile) {
304
+ const viewpointBaseName = viewpointPath.replace('.bcfv', '');
305
+ // Handle different naming conventions:
306
+ // 1. Viewpoint_<guid>.bcfv -> Snapshot_<guid>.png (buildingSMART standard)
307
+ // 2. <guid>_viewpoint.bcfv -> <guid>_snapshot.png (alternative pattern)
308
+ // 3. viewpoint.bcfv -> snapshot.png (simple default)
309
+ const snapshotBaseName1 = viewpointBaseName.replace(/Viewpoint_/i, 'Snapshot_');
310
+ const snapshotBaseName2 = viewpointBaseName.replace(/_viewpoint$/i, '_snapshot');
311
+ const pathsToTry = [
312
+ // Pattern 1: Snapshot_<guid>.png
313
+ `${snapshotBaseName1}.png`,
314
+ // Pattern 2: <guid>_snapshot.png
315
+ `${snapshotBaseName2}.png`,
316
+ // Pattern 3: same name as viewpoint but .png
317
+ `${viewpointBaseName}.png`,
318
+ // Default: snapshot.png
319
+ `${topicFolder}/snapshot.png`,
320
+ // JPG variants
321
+ `${snapshotBaseName1}.jpg`,
322
+ `${snapshotBaseName2}.jpg`,
323
+ `${viewpointBaseName}.jpg`,
324
+ `${topicFolder}/snapshot.jpg`,
325
+ ];
326
+ for (const path of pathsToTry) {
327
+ snapshotFile = zip.file(path);
328
+ if (snapshotFile) {
329
+ if (path.toLowerCase().endsWith('.jpg') || path.toLowerCase().endsWith('.jpeg')) {
330
+ snapshotFormat = 'jpeg';
331
+ }
332
+ break;
333
+ }
334
+ }
335
+ }
336
+ if (snapshotFile) {
337
+ const snapshotData = await snapshotFile.async('uint8array');
338
+ viewpoint.snapshotData = snapshotData;
339
+ viewpoint.snapshot = `data:image/${snapshotFormat};base64,${uint8ArrayToBase64(snapshotData)}`;
340
+ }
341
+ viewpoints.push(viewpoint);
342
+ }
343
+ }
344
+ catch (error) {
345
+ console.warn(`Failed to parse viewpoint ${viewpointPath}:`, error);
346
+ }
347
+ }
348
+ // If no viewpoint files found, check for default snapshot
349
+ if (viewpoints.length === 0) {
350
+ const defaultSnapshot = zip.file(`${topicFolder}/snapshot.png`) || zip.file(`${topicFolder}/snapshot.jpg`);
351
+ if (defaultSnapshot) {
352
+ const isJpg = defaultSnapshot.name.toLowerCase().endsWith('.jpg');
353
+ const snapshotData = await defaultSnapshot.async('uint8array');
354
+ viewpoints.push({
355
+ guid: topicFolder, // Use topic GUID as viewpoint GUID
356
+ snapshot: `data:image/${isJpg ? 'jpeg' : 'png'};base64,${uint8ArrayToBase64(snapshotData)}`,
357
+ snapshotData,
358
+ });
359
+ }
360
+ }
361
+ return viewpoints;
362
+ }
363
+ /**
364
+ * Parse viewpoint XML content
365
+ */
366
+ function parseViewpointContent(content) {
367
+ // Extract viewpoint GUID from root element (Guid can be anywhere in the tag)
368
+ const guidMatch = content.match(/<VisualizationInfo[^>]+Guid="([^"]+)"/);
369
+ const guid = guidMatch?.[1] || crypto.randomUUID?.() || `vp-${Date.now()}`;
370
+ // Parse perspective camera
371
+ const perspectiveCamera = parsePerspectiveCamera(content);
372
+ // Parse orthogonal camera
373
+ const orthogonalCamera = parseOrthogonalCamera(content);
374
+ // Parse components
375
+ const components = parseComponents(content);
376
+ // Parse lines
377
+ const lines = parseLines(content);
378
+ // Parse clipping planes
379
+ const clippingPlanes = parseClippingPlanes(content);
380
+ // Parse bitmaps
381
+ const bitmaps = parseBitmaps(content);
382
+ return {
383
+ guid,
384
+ perspectiveCamera,
385
+ orthogonalCamera,
386
+ components,
387
+ lines: lines.length > 0 ? lines : undefined,
388
+ clippingPlanes: clippingPlanes.length > 0 ? clippingPlanes : undefined,
389
+ bitmaps: bitmaps.length > 0 ? bitmaps : undefined,
390
+ };
391
+ }
392
+ /**
393
+ * Parse perspective camera from viewpoint content
394
+ */
395
+ function parsePerspectiveCamera(content) {
396
+ const match = content.match(/<PerspectiveCamera>([\s\S]*?)<\/PerspectiveCamera>/);
397
+ if (!match)
398
+ return undefined;
399
+ const cameraContent = match[1];
400
+ const viewPoint = parsePoint(cameraContent, 'CameraViewPoint');
401
+ const direction = parseDirection(cameraContent, 'CameraDirection');
402
+ const upVector = parseDirection(cameraContent, 'CameraUpVector');
403
+ const fieldOfView = extractElement(cameraContent, 'FieldOfView');
404
+ if (!viewPoint || !direction || !upVector || !fieldOfView) {
405
+ return undefined;
406
+ }
407
+ return {
408
+ cameraViewPoint: viewPoint,
409
+ cameraDirection: direction,
410
+ cameraUpVector: upVector,
411
+ fieldOfView: parseFloat(fieldOfView),
412
+ };
413
+ }
414
+ /**
415
+ * Parse orthogonal camera from viewpoint content
416
+ */
417
+ function parseOrthogonalCamera(content) {
418
+ const match = content.match(/<OrthogonalCamera>([\s\S]*?)<\/OrthogonalCamera>/);
419
+ if (!match)
420
+ return undefined;
421
+ const cameraContent = match[1];
422
+ const viewPoint = parsePoint(cameraContent, 'CameraViewPoint');
423
+ const direction = parseDirection(cameraContent, 'CameraDirection');
424
+ const upVector = parseDirection(cameraContent, 'CameraUpVector');
425
+ const viewToWorldScale = extractElement(cameraContent, 'ViewToWorldScale');
426
+ if (!viewPoint || !direction || !upVector || !viewToWorldScale) {
427
+ return undefined;
428
+ }
429
+ return {
430
+ cameraViewPoint: viewPoint,
431
+ cameraDirection: direction,
432
+ cameraUpVector: upVector,
433
+ viewToWorldScale: parseFloat(viewToWorldScale),
434
+ };
435
+ }
436
+ /**
437
+ * Parse a 3D point from XML
438
+ */
439
+ function parsePoint(content, elementName) {
440
+ const match = content.match(new RegExp(`<${elementName}>([\\s\\S]*?)<\\/${elementName}>`));
441
+ if (!match)
442
+ return undefined;
443
+ const x = extractElement(match[1], 'X');
444
+ const y = extractElement(match[1], 'Y');
445
+ const z = extractElement(match[1], 'Z');
446
+ if (x === undefined || y === undefined || z === undefined) {
447
+ return undefined;
448
+ }
449
+ return {
450
+ x: parseFloat(x),
451
+ y: parseFloat(y),
452
+ z: parseFloat(z),
453
+ };
454
+ }
455
+ /**
456
+ * Parse a 3D direction from XML
457
+ */
458
+ function parseDirection(content, elementName) {
459
+ return parsePoint(content, elementName);
460
+ }
461
+ /**
462
+ * Parse components (selection/visibility/coloring)
463
+ */
464
+ function parseComponents(content) {
465
+ const componentsMatch = content.match(/<Components>([\s\S]*?)<\/Components>/);
466
+ if (!componentsMatch)
467
+ return undefined;
468
+ const componentsContent = componentsMatch[1];
469
+ // Parse selection
470
+ const selection = parseComponentList(componentsContent, 'Selection');
471
+ // Parse visibility
472
+ const visibility = parseVisibility(componentsContent);
473
+ // Parse coloring
474
+ const coloring = parseColoring(componentsContent);
475
+ if (!selection && !visibility && !coloring) {
476
+ return undefined;
477
+ }
478
+ return {
479
+ selection: selection?.length ? selection : undefined,
480
+ visibility,
481
+ coloring: coloring?.length ? coloring : undefined,
482
+ };
483
+ }
484
+ /**
485
+ * Parse a list of components
486
+ */
487
+ function parseComponentList(content, elementName) {
488
+ const match = content.match(new RegExp(`<${elementName}>([\\s\\S]*?)<\\/${elementName}>`));
489
+ if (!match)
490
+ return undefined;
491
+ const components = [];
492
+ const componentMatches = match[1].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);
493
+ for (const compMatch of componentMatches) {
494
+ const component = parseComponent(compMatch[0]);
495
+ if (component) {
496
+ components.push(component);
497
+ }
498
+ }
499
+ return components.length > 0 ? components : undefined;
500
+ }
501
+ /**
502
+ * Parse a single component
503
+ */
504
+ function parseComponent(content) {
505
+ const ifcGuidMatch = content.match(/IfcGuid="([^"]+)"/);
506
+ const authoringToolIdMatch = content.match(/AuthoringToolId="([^"]+)"/);
507
+ const originatingSystemMatch = content.match(/OriginatingSystem="([^"]+)"/);
508
+ if (!ifcGuidMatch && !authoringToolIdMatch) {
509
+ return undefined;
510
+ }
511
+ return {
512
+ ifcGuid: ifcGuidMatch?.[1],
513
+ authoringToolId: authoringToolIdMatch?.[1],
514
+ originatingSystem: originatingSystemMatch?.[1],
515
+ };
516
+ }
517
+ /**
518
+ * Parse visibility settings
519
+ */
520
+ function parseVisibility(content) {
521
+ const visibilityMatch = content.match(/<Visibility[^>]*>([\s\S]*?)<\/Visibility>/);
522
+ if (!visibilityMatch)
523
+ return undefined;
524
+ const defaultVisMatch = content.match(/DefaultVisibility="([^"]+)"/);
525
+ const defaultVisibility = defaultVisMatch?.[1] !== 'false';
526
+ const exceptions = parseComponentList(visibilityMatch[1], 'Exceptions');
527
+ return {
528
+ defaultVisibility,
529
+ exceptions,
530
+ };
531
+ }
532
+ /**
533
+ * Parse coloring settings
534
+ */
535
+ function parseColoring(content) {
536
+ const coloringMatch = content.match(/<Coloring>([\s\S]*?)<\/Coloring>/);
537
+ if (!coloringMatch)
538
+ return undefined;
539
+ const colorings = [];
540
+ const colorMatches = coloringMatch[1].matchAll(/<Color\s+Color="([^"]+)"[^>]*>([\s\S]*?)<\/Color>/g);
541
+ for (const match of colorMatches) {
542
+ const color = match[1];
543
+ const components = [];
544
+ const componentMatches = match[2].matchAll(/<Component[^>]*(?:\/>|>[\s\S]*?<\/Component>)/g);
545
+ for (const compMatch of componentMatches) {
546
+ const component = parseComponent(compMatch[0]);
547
+ if (component) {
548
+ components.push(component);
549
+ }
550
+ }
551
+ if (components.length > 0) {
552
+ colorings.push({ color, components });
553
+ }
554
+ }
555
+ return colorings.length > 0 ? colorings : undefined;
556
+ }
557
+ /**
558
+ * Parse lines
559
+ */
560
+ function parseLines(content) {
561
+ const lines = [];
562
+ const linesMatch = content.match(/<Lines>([\s\S]*?)<\/Lines>/);
563
+ if (!linesMatch)
564
+ return lines;
565
+ const lineMatches = linesMatch[1].matchAll(/<Line>([\s\S]*?)<\/Line>/g);
566
+ for (const match of lineMatches) {
567
+ const startPoint = parsePoint(match[1], 'StartPoint');
568
+ const endPoint = parsePoint(match[1], 'EndPoint');
569
+ if (startPoint && endPoint) {
570
+ lines.push({ startPoint, endPoint });
571
+ }
572
+ }
573
+ return lines;
574
+ }
575
+ /**
576
+ * Parse clipping planes
577
+ */
578
+ function parseClippingPlanes(content) {
579
+ const planes = [];
580
+ const planesMatch = content.match(/<ClippingPlanes>([\s\S]*?)<\/ClippingPlanes>/);
581
+ if (!planesMatch)
582
+ return planes;
583
+ const planeMatches = planesMatch[1].matchAll(/<ClippingPlane>([\s\S]*?)<\/ClippingPlane>/g);
584
+ for (const match of planeMatches) {
585
+ const location = parsePoint(match[1], 'Location');
586
+ const direction = parseDirection(match[1], 'Direction');
587
+ if (location && direction) {
588
+ planes.push({ location, direction });
589
+ }
590
+ }
591
+ return planes;
592
+ }
593
+ /**
594
+ * Parse bitmaps
595
+ */
596
+ function parseBitmaps(content) {
597
+ const bitmaps = [];
598
+ const bitmapsMatch = content.match(/<Bitmaps>([\s\S]*?)<\/Bitmaps>/);
599
+ if (!bitmapsMatch)
600
+ return bitmaps;
601
+ const bitmapMatches = bitmapsMatch[1].matchAll(/<Bitmap>([\s\S]*?)<\/Bitmap>/g);
602
+ for (const match of bitmapMatches) {
603
+ const format = extractElement(match[1], 'Format') || extractElement(match[1], 'Bitmap');
604
+ const reference = extractElement(match[1], 'Reference');
605
+ const location = parsePoint(match[1], 'Location');
606
+ const normal = parseDirection(match[1], 'Normal');
607
+ const up = parseDirection(match[1], 'Up');
608
+ const height = extractElement(match[1], 'Height');
609
+ if (format && reference && location && normal && up && height) {
610
+ bitmaps.push({
611
+ format: format.toUpperCase() === 'JPG' ? 'JPG' : 'PNG',
612
+ reference,
613
+ location,
614
+ normal,
615
+ up,
616
+ height: parseFloat(height),
617
+ });
618
+ }
619
+ }
620
+ return bitmaps;
621
+ }
622
+ /**
623
+ * Convert Uint8Array to base64 string
624
+ */
625
+ function uint8ArrayToBase64(bytes) {
626
+ let binary = '';
627
+ for (let i = 0; i < bytes.length; i++) {
628
+ binary += String.fromCharCode(bytes[i]);
629
+ }
630
+ return btoa(binary);
631
+ }
632
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../src/reader.ts"],"names":[],"mappings":"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"}