@inweb/viewer-three 26.12.5 → 26.12.7

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.
Files changed (45) hide show
  1. package/dist/extensions/loaders/GLTFFileLoader.js +1 -1
  2. package/dist/extensions/loaders/GLTFFileLoader.js.map +1 -1
  3. package/dist/extensions/loaders/GLTFFileLoader.min.js +1 -1
  4. package/dist/extensions/loaders/GLTFFileLoader.module.js +1 -1
  5. package/dist/extensions/loaders/GLTFFileLoader.module.js.map +1 -1
  6. package/dist/extensions/loaders/IFCXLoader.js +2 -2
  7. package/dist/extensions/loaders/IFCXLoader.js.map +1 -1
  8. package/dist/extensions/loaders/IFCXLoader.min.js +1 -1
  9. package/dist/extensions/loaders/IFCXLoader.module.js +2 -2
  10. package/dist/extensions/loaders/IFCXLoader.module.js.map +1 -1
  11. package/dist/viewer-three.js +467 -164
  12. package/dist/viewer-three.js.map +1 -1
  13. package/dist/viewer-three.min.js +3 -3
  14. package/dist/viewer-three.module.js +465 -162
  15. package/dist/viewer-three.module.js.map +1 -1
  16. package/extensions/loaders/GLTFFileLoader.ts +1 -1
  17. package/extensions/loaders/IFCX/IFCXCloudLoader.ts +1 -1
  18. package/extensions/loaders/IFCX/IFCXFileLoader.ts +1 -1
  19. package/lib/Viewer/components/ExtentsComponent.d.ts +1 -1
  20. package/lib/Viewer/components/ResetComponent.d.ts +1 -1
  21. package/lib/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.d.ts +3 -3
  22. package/lib/Viewer/measurement/Snapper.d.ts +1 -0
  23. package/lib/Viewer/measurement/UnitConverter.d.ts +20 -13
  24. package/lib/Viewer/models/IModelImpl.d.ts +2 -6
  25. package/lib/Viewer/models/ModelImpl.d.ts +4 -6
  26. package/package.json +5 -5
  27. package/src/Viewer/Viewer.ts +15 -11
  28. package/src/Viewer/commands/GetSelected2.ts +2 -2
  29. package/src/Viewer/commands/ResetView.ts +0 -5
  30. package/src/Viewer/commands/ZoomTo.ts +3 -3
  31. package/src/Viewer/components/CameraComponent.ts +4 -4
  32. package/src/Viewer/components/ExtentsComponent.ts +3 -3
  33. package/src/Viewer/components/HighlighterComponent.ts +11 -17
  34. package/src/Viewer/components/ResetComponent.ts +5 -2
  35. package/src/Viewer/components/SelectionComponent.ts +14 -13
  36. package/src/Viewer/draggers/MeasureLineDragger.ts +1 -0
  37. package/src/Viewer/draggers/OrbitDragger.ts +2 -0
  38. package/src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js +285 -10
  39. package/src/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.ts +94 -18
  40. package/src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js +1 -1
  41. package/src/Viewer/measurement/Snapper.ts +6 -3
  42. package/src/Viewer/measurement/UnitConverter.ts +19 -12
  43. package/src/Viewer/measurement/UnitFormatter.ts +2 -2
  44. package/src/Viewer/models/IModelImpl.ts +2 -10
  45. package/src/Viewer/models/ModelImpl.ts +111 -61
@@ -32,8 +32,29 @@ export class ModelImpl implements IModelImpl {
32
32
  public id: string;
33
33
  public scene: Object3D;
34
34
 
35
+ private handleToObjects: Map<any, Set<Object3D>>;
36
+ private originalObjects: Set<Object3D>;
37
+
35
38
  constructor(scene: Object3D) {
36
39
  this.scene = scene;
40
+
41
+ this.handleToObjects = new Map();
42
+ this.originalObjects = new Set();
43
+
44
+ this.scene.traverse((object) => {
45
+ this.originalObjects.add(object);
46
+
47
+ const handle = object.userData.handle;
48
+ if (!handle) return;
49
+
50
+ let objects = this.handleToObjects.get(handle);
51
+ if (!objects) {
52
+ objects = new Set();
53
+ this.handleToObjects.set(handle, objects);
54
+ }
55
+
56
+ objects.add(object);
57
+ });
37
58
  }
38
59
 
39
60
  dispose() {
@@ -73,6 +94,9 @@ export class ModelImpl implements IModelImpl {
73
94
  if (object.material) disposeMaterials(object.material);
74
95
  }
75
96
 
97
+ this.handleToObjects = undefined;
98
+ this.originalObjects = undefined;
99
+
76
100
  this.scene.traverse(disposeObject);
77
101
  this.scene.clear();
78
102
  }
@@ -250,74 +274,65 @@ export class ModelImpl implements IModelImpl {
250
274
  }
251
275
 
252
276
  getExtents(target: Box3): Box3 {
253
- this.scene.traverseVisible((object) => !object.children.length && target.expandByObject(object));
277
+ this.scene.traverseVisible((object) => target.expandByObject(object));
254
278
  return target;
255
279
  }
256
280
 
257
281
  getObjects(): Object3D[] {
258
- const objects = [];
259
- this.scene.traverse((object) => objects.push(object));
260
- return objects;
282
+ return Array.from(this.originalObjects);
261
283
  }
262
284
 
263
285
  getVisibleObjects(): Object3D[] {
264
286
  const objects = [];
265
287
  this.scene.traverseVisible((object) => objects.push(object));
266
- return objects;
288
+ return objects.filter((object) => object.userData.handle);
267
289
  }
268
290
 
269
- hasObject(object: Object3D): boolean {
270
- while (object) {
271
- if (object === this.scene) return true;
272
- object = object.parent;
273
- }
274
- return false;
275
- }
276
-
277
- hasHandle(handle: string): boolean {
278
- return !handle.includes(":") || handle.split(":", 1)[0] === this.id + "";
279
- }
280
-
281
- getOwnObjects(objects: Object3D | Object3D[]): Object3D[] {
282
- if (!Array.isArray(objects)) objects = [objects];
283
- return objects.filter((object) => this.hasObject(object));
284
- }
285
-
286
- getOwnHandles(handles: string | string[]): string[] {
291
+ getObjectsByHandles(handles: string | string[]): Object3D[] {
287
292
  if (!Array.isArray(handles)) handles = [handles];
288
- return handles.filter((handle) => this.hasHandle(handle));
289
- }
290
293
 
291
- getObjectsByHandles(handles: string | string[]): Object3D[] {
292
- const ownHandles = this.getOwnHandles(handles);
293
- if (ownHandles.length === 0) return [];
294
+ const ownHandles = [];
295
+ handles.forEach((handle) => {
296
+ const index = handle.indexOf(":");
297
+ if (index !== -1) {
298
+ if (handle.slice(0, index) !== this.id) return;
299
+ handle = handle.slice(index + 1);
300
+ }
301
+ ownHandles.push(handle);
302
+ });
294
303
 
295
- const handleSet = new Set(ownHandles.map((handle) => handle.slice(handle.indexOf(":") + 1)));
304
+ const handlesSet = new Set<string>(ownHandles);
296
305
 
297
306
  const objects = [];
298
- this.scene.traverse((object) => {
299
- const handle = object.userData.handle;
300
- if (handle && handleSet.has(handle)) objects.push(object);
307
+ handlesSet.forEach((handle) => {
308
+ objects.push(Array.from(this.handleToObjects.get(handle) || []));
301
309
  });
302
310
 
303
- return objects;
311
+ return objects.flat();
304
312
  }
305
313
 
306
314
  getHandlesByObjects(objects: Object3D | Object3D[]): string[] {
307
- const ownObjects = this.getOwnObjects(objects);
308
- if (ownObjects.length === 0) return [];
315
+ if (!Array.isArray(objects)) objects = [objects];
309
316
 
310
317
  const handleSet = new Set<string>();
311
- ownObjects.forEach((object) => {
312
- const handle = object.userData.handle;
313
- if (handle) handleSet.add(`${this.id}:${handle}`);
314
- });
318
+ objects
319
+ .filter((object) => this.originalObjects.has(object))
320
+ .forEach((object) => {
321
+ handleSet.add(`${this.id}:${object.userData.handle}`);
322
+ });
315
323
 
316
324
  return Array.from(handleSet);
317
325
  }
318
326
 
319
327
  hideObjects(objects: Object3D | Object3D[]): this {
320
- this.getOwnObjects(objects).forEach((object) => (object.visible = false));
328
+ if (!Array.isArray(objects)) objects = [objects];
329
+
330
+ objects
331
+ .filter((object) => this.originalObjects.has(object))
332
+ .forEach((object) => {
333
+ object.visible = false;
334
+ });
335
+
321
336
  return this;
322
337
  }
323
338
 
@@ -327,17 +342,29 @@ export class ModelImpl implements IModelImpl {
327
342
 
328
343
  isolateObjects(objects: Object3D | Object3D[]): this {
329
344
  if (!Array.isArray(objects)) objects = [objects];
345
+
330
346
  const visibleSet = new Set(objects);
331
- this.getOwnObjects(objects).forEach((object) => object.traverseAncestors((parent) => visibleSet.add(parent)));
347
+ objects
348
+ .filter((object) => this.originalObjects.has(object))
349
+ .forEach((object) => {
350
+ object.traverseAncestors((parent) => visibleSet.add(parent));
351
+ });
352
+
332
353
  this.scene.traverse((object) => (object.visible = visibleSet.has(object)));
354
+
333
355
  return this;
334
356
  }
335
357
 
336
358
  showObjects(objects: Object3D | Object3D[]): this {
337
- this.getOwnObjects(objects).forEach((object) => {
338
- object.visible = true;
339
- object.traverseAncestors((parent) => (parent.visible = true));
340
- });
359
+ if (!Array.isArray(objects)) objects = [objects];
360
+
361
+ objects
362
+ .filter((object) => this.originalObjects.has(object))
363
+ .forEach((object) => {
364
+ object.visible = true;
365
+ object.traverseAncestors((parent) => (parent.visible = true));
366
+ });
367
+
341
368
  return this;
342
369
  }
343
370
 
@@ -346,43 +373,66 @@ export class ModelImpl implements IModelImpl {
346
373
  return this;
347
374
  }
348
375
 
349
- showOriginalObjects(objects: Object3D | Object3D[]): this {
376
+ highlightObjects(objects: Object3D | Object3D[]): this {
350
377
  return this;
351
378
  }
352
379
 
353
- hideOriginalObjects(objects: Object3D | Object3D[]): this {
380
+ unhighlightObjects(objects: Object3D | Object3D[]): this {
354
381
  return this;
355
382
  }
356
383
 
357
384
  explode(scale = 0, coeff = 4): this {
385
+ const centers = new Map();
386
+
387
+ const getObjectCenter = (object: Object3D, target: Vector3): Vector3 => {
388
+ const extents = new Box3().setFromObject(object);
389
+
390
+ const handle = object.userData.handle;
391
+ if (!handle) return extents.getCenter(target);
392
+
393
+ const center = centers.get(handle);
394
+ if (center) return target.copy(center);
395
+
396
+ const objects = this.getObjectsByHandles(handle);
397
+ objects.forEach((x: Object3D) => extents.expandByObject(x));
398
+ extents.getCenter(target);
399
+
400
+ centers.set(handle, target.clone());
401
+
402
+ return target;
403
+ };
404
+
358
405
  function calcExplodeDepth(object: Object3D, depth: number): number {
359
- let res = depth;
406
+ let result = depth;
360
407
  object.children.forEach((x: Object3D) => {
361
408
  const objectDepth = calcExplodeDepth(x, depth + 1);
362
- if (res < objectDepth) res = objectDepth;
409
+ if (result < objectDepth) result = objectDepth;
363
410
  });
364
411
 
365
412
  object.userData.originalPosition = object.position.clone();
366
- object.userData.originalCenter = new Box3().setFromObject(object).getCenter(new Vector3());
367
- object.userData.isExplodeLocked = depth > 2 && object.children.length === 0;
413
+ object.userData.originalCenter = getObjectCenter(object, new Vector3());
368
414
 
369
- return res;
415
+ return result;
370
416
  }
371
417
 
372
- scale /= 100;
418
+ const explodeScale = scale / 100;
419
+ const explodeRoot = this.scene;
373
420
 
374
- if (!this.scene.userData.explodeDepth) this.scene.userData.explodeDepth = calcExplodeDepth(this.scene, 1);
375
- const maxDepth = this.scene.userData.explodeDepth;
421
+ if (!explodeRoot.userData.explodeDepth) explodeRoot.userData.explodeDepth = calcExplodeDepth(explodeRoot, 1);
422
+ const maxDepth = explodeRoot.userData.explodeDepth;
376
423
 
377
- const scaledExplodeDepth = scale * maxDepth + 1;
424
+ const scaledExplodeDepth = explodeScale * maxDepth + 1;
378
425
  const explodeDepth = 0 | scaledExplodeDepth;
379
426
  const currentSegmentFraction = scaledExplodeDepth - explodeDepth;
380
427
 
381
- function explodeObject(object: Object3D, depth: number) {
428
+ function explodeObject(object, depth: number) {
429
+ if (object.isCamera) return;
430
+ if (object.userData.isHighlightWireframe) return;
431
+
382
432
  object.position.copy(object.userData.originalPosition);
383
433
 
384
- if (depth > 0 && depth <= explodeDepth && !object.userData.isExplodeLocked) {
385
- let objectScale = scale * coeff;
434
+ if (depth > 0 && depth <= explodeDepth) {
435
+ let objectScale = explodeScale * coeff;
386
436
  if (depth === explodeDepth) objectScale *= currentSegmentFraction;
387
437
 
388
438
  const parentCenter = object.parent.userData.originalCenter;
@@ -392,10 +442,10 @@ export class ModelImpl implements IModelImpl {
392
442
  object.position.add(objectOffset);
393
443
  }
394
444
 
395
- object.children.forEach((x) => explodeObject(x, depth + 1));
445
+ object.children.forEach((x: Object3D) => explodeObject(x, depth + 1));
396
446
  }
397
447
 
398
- explodeObject(this.scene, 0);
448
+ explodeObject(explodeRoot, 0);
399
449
  this.scene.updateMatrixWorld();
400
450
 
401
451
  return this;