@inweb/viewer-three 27.5.0 → 27.6.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.
Files changed (53) hide show
  1. package/dist/extensions/components/LightHelperComponent.js +1 -1
  2. package/dist/extensions/components/LightHelperComponent.js.map +1 -1
  3. package/dist/extensions/components/LightHelperComponent.min.js +1 -1
  4. package/dist/extensions/components/LightHelperComponent.module.js +1 -1
  5. package/dist/extensions/components/LightHelperComponent.module.js.map +1 -1
  6. package/dist/extensions/components/StatsPanelComponent.js +0 -1
  7. package/dist/extensions/components/StatsPanelComponent.js.map +1 -1
  8. package/dist/extensions/components/StatsPanelComponent.min.js +1 -1
  9. package/dist/extensions/components/StatsPanelComponent.module.js +0 -1
  10. package/dist/extensions/components/StatsPanelComponent.module.js.map +1 -1
  11. package/dist/extensions/loaders/GLTFCloudLoader.js +7 -2
  12. package/dist/extensions/loaders/GLTFCloudLoader.js.map +1 -1
  13. package/dist/extensions/loaders/GLTFCloudLoader.min.js +1 -1
  14. package/dist/extensions/loaders/GLTFCloudLoader.module.js +7 -2
  15. package/dist/extensions/loaders/GLTFCloudLoader.module.js.map +1 -1
  16. package/dist/extensions/loaders/GLTFFileLoader.js +2 -1
  17. package/dist/extensions/loaders/GLTFFileLoader.js.map +1 -1
  18. package/dist/extensions/loaders/GLTFFileLoader.min.js +1 -1
  19. package/dist/extensions/loaders/GLTFFileLoader.module.js +2 -1
  20. package/dist/extensions/loaders/GLTFFileLoader.module.js.map +1 -1
  21. package/dist/extensions/loaders/IFCXLoader.js +10 -5
  22. package/dist/extensions/loaders/IFCXLoader.js.map +1 -1
  23. package/dist/extensions/loaders/IFCXLoader.min.js +1 -1
  24. package/dist/extensions/loaders/IFCXLoader.module.js +10 -5
  25. package/dist/extensions/loaders/IFCXLoader.module.js.map +1 -1
  26. package/dist/viewer-three.js +161 -157
  27. package/dist/viewer-three.js.map +1 -1
  28. package/dist/viewer-three.min.js +3 -3
  29. package/dist/viewer-three.module.js +68 -53
  30. package/dist/viewer-three.module.js.map +1 -1
  31. package/extensions/components/LightHelperComponent.ts +1 -1
  32. package/extensions/components/StatsPanelComponent.ts +0 -1
  33. package/extensions/loaders/GLTFCloudLoader.ts +8 -2
  34. package/extensions/loaders/GLTFFileLoader.ts +3 -2
  35. package/extensions/loaders/IFCX/IFCXFileLoader.ts +11 -5
  36. package/lib/Viewer/Viewer.d.ts +1 -1
  37. package/lib/Viewer/measurement/Snapper.d.ts +1 -1
  38. package/package.json +5 -5
  39. package/src/Viewer/Viewer.ts +14 -16
  40. package/src/Viewer/commands/GetSelected2.ts +1 -1
  41. package/src/Viewer/commands/SetSelected.ts +1 -1
  42. package/src/Viewer/components/BackgroundComponent.ts +1 -1
  43. package/src/Viewer/components/CameraComponent.ts +1 -1
  44. package/src/Viewer/components/CanvasRemoveComponent.ts +0 -1
  45. package/src/Viewer/components/HighlighterUtils.ts +2 -2
  46. package/src/Viewer/components/SelectionComponent.ts +4 -2
  47. package/src/Viewer/helpers/SectionsHelper.js +4 -8
  48. package/src/Viewer/helpers/WCSHelper.ts +7 -5
  49. package/src/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.ts +19 -14
  50. package/src/Viewer/loaders/GLTFBinaryParser.ts +2 -2
  51. package/src/Viewer/loaders/GLTFFileDynamicLoader.ts +2 -2
  52. package/src/Viewer/measurement/Snapper.ts +2 -2
  53. package/src/Viewer/models/ModelImpl.ts +38 -25
@@ -815,7 +815,7 @@ class Snapper {
815
815
  const object = intersections[0].object;
816
816
  const intersectionPoint = intersections[0].point;
817
817
  const localPoint = object.worldToLocal(intersectionPoint.clone());
818
- let snapPoint;
818
+ let snapPoint = undefined;
819
819
  let snapDistance = this.getDetectRadius(intersectionPoint);
820
820
  const geometry = object.geometry;
821
821
  const positions = geometry.attributes.position.array;
@@ -2700,7 +2700,7 @@ class BackgroundComponent {
2700
2700
  }
2701
2701
  dispose() {
2702
2702
  this.viewer.removeEventListener("optionschange", this.syncOptions);
2703
- this.viewer.scene.background = undefined;
2703
+ this.viewer.scene.background = null;
2704
2704
  }
2705
2705
  }
2706
2706
 
@@ -2776,7 +2776,7 @@ class CameraComponent {
2776
2776
  if (mode === this.getCameraMode(currentCamera))
2777
2777
  return;
2778
2778
  const target = this.viewer.target.clone();
2779
- let camera;
2779
+ let camera = null;
2780
2780
  if (currentCamera.isOrthographicCamera) {
2781
2781
  const fov = currentCamera.userData.fov || 45;
2782
2782
  const fieldHeight = (currentCamera.top - currentCamera.bottom) / currentCamera.zoom;
@@ -3067,7 +3067,6 @@ class CanvasRemoveComponent {
3067
3067
  }
3068
3068
  dispose() {
3069
3069
  this.mutationObserver.disconnect();
3070
- this.mutationObserver = undefined;
3071
3070
  }
3072
3071
  }
3073
3072
 
@@ -4276,11 +4275,13 @@ class WCSHelper extends Object3D {
4276
4275
  canvas.width = 64;
4277
4276
  canvas.height = 64;
4278
4277
  const context = canvas.getContext("2d");
4279
- context.clearRect(0, 0, 64, 64);
4280
- context.font = "24px Arial";
4281
- context.textAlign = "center";
4282
- context.fillStyle = color.getStyle();
4283
- context.fillText(text, 32, 41);
4278
+ if (context) {
4279
+ context.clearRect(0, 0, 64, 64);
4280
+ context.font = "24px Arial";
4281
+ context.textAlign = "center";
4282
+ context.fillStyle = color.getStyle();
4283
+ context.fillText(text, 32, 41);
4284
+ }
4284
4285
  const texture = new CanvasTexture(canvas);
4285
4286
  texture.colorSpace = SRGBColorSpace;
4286
4287
  return new SpriteMaterial({ map: texture, toneMapped: false });
@@ -4409,8 +4410,8 @@ class ModelImpl {
4409
4410
  if (object.material)
4410
4411
  disposeMaterials(object.material);
4411
4412
  }
4412
- this.handleToObjects = undefined;
4413
- this.originalObjects = undefined;
4413
+ this.handleToObjects.clear();
4414
+ this.originalObjects.clear();
4414
4415
  this.scene.traverse(disposeObject);
4415
4416
  this.scene.clear();
4416
4417
  }
@@ -4676,44 +4677,54 @@ class ModelImpl {
4676
4677
  centersCache.set(handle, target.clone());
4677
4678
  return target;
4678
4679
  };
4679
- function calcExplodeDepth(object, depth) {
4680
- let result = depth;
4681
- object.children.forEach((x) => {
4682
- const objectDepth = calcExplodeDepth(x, depth + 1);
4683
- if (result < objectDepth)
4684
- result = objectDepth;
4685
- });
4680
+ const calcObjectOffset = (object, target) => {
4681
+ const parent = object.parent;
4682
+ if (!parent || parent.userData.originalCenter === undefined)
4683
+ return target;
4684
+ return target.subVectors(object.userData.originalCenter, parent.userData.originalCenter);
4685
+ };
4686
+ const calcObjectDepth = (object) => {
4687
+ if (object.userData.depth !== undefined)
4688
+ return object.userData.depth;
4689
+ const parent = object.parent;
4690
+ const depth = parent && object !== explodeRoot ? calcObjectDepth(parent) + 1 : 0;
4691
+ object.userData.depth = depth;
4686
4692
  object.userData.originalPosition = object.position.clone();
4687
4693
  object.userData.originalCenter = calcObjectCenter(object, new Vector3());
4688
- return result;
4689
- }
4694
+ object.userData.originalOffset = calcObjectOffset(object, new Vector3());
4695
+ return depth;
4696
+ };
4690
4697
  const explodeScale = scale / 100;
4691
4698
  const explodeRoot = this.scene;
4692
- if (!explodeRoot.userData.explodeDepth) {
4693
- explodeRoot.userData.explodeDepth = calcExplodeDepth(explodeRoot, 1);
4699
+ const explodeObjects = this.getObjects();
4700
+ if (explodeRoot.userData.explodeDepth === undefined) {
4701
+ let maxDepth = 0;
4702
+ explodeObjects.forEach((object) => {
4703
+ const depth = calcObjectDepth(object);
4704
+ if (depth > maxDepth)
4705
+ maxDepth = depth;
4706
+ });
4707
+ explodeRoot.userData.explodeDepth = maxDepth;
4694
4708
  }
4695
4709
  const maxDepth = explodeRoot.userData.explodeDepth;
4696
4710
  const scaledExplodeDepth = explodeScale * maxDepth + 1;
4697
4711
  const explodeDepth = 0 | scaledExplodeDepth;
4698
4712
  const currentSegmentFraction = scaledExplodeDepth - explodeDepth;
4699
- function explodeObject(object, depth) {
4713
+ const explodeObject = (object) => {
4700
4714
  if (object.isCamera)
4701
4715
  return;
4702
- if (object.userData.isHighlightWireframe)
4703
- return;
4704
4716
  object.position.copy(object.userData.originalPosition);
4717
+ const depth = object.userData.depth;
4705
4718
  if (depth > 0 && depth <= explodeDepth) {
4706
4719
  let objectScale = explodeScale * coeff;
4707
4720
  if (depth === explodeDepth)
4708
4721
  objectScale *= currentSegmentFraction;
4709
- const parentCenter = object.parent.userData.originalCenter;
4710
- const objectCenter = object.userData.originalCenter;
4711
- const localOffset = objectCenter.clone().sub(parentCenter).multiplyScalar(objectScale);
4712
- object.position.add(localOffset);
4722
+ object.position.addScaledVector(object.userData.originalOffset, objectScale);
4713
4723
  }
4714
- object.children.forEach((x) => explodeObject(x, depth + 1));
4715
- }
4716
- explodeObject(explodeRoot, 0);
4724
+ };
4725
+ explodeObjects.forEach((object) => {
4726
+ explodeObject(object);
4727
+ });
4717
4728
  this.scene.updateMatrixWorld();
4718
4729
  return this;
4719
4730
  }
@@ -4816,6 +4827,12 @@ class DynamicModelImpl extends ModelImpl {
4816
4827
  centersCache.set(handle, target.clone());
4817
4828
  return target;
4818
4829
  };
4830
+ const calcObjectOffset = (object, target) => {
4831
+ const parent = object.parent;
4832
+ if (!parent || parent.userData.originalCenter === undefined)
4833
+ return target;
4834
+ return target.subVectors(object.userData.originalCenter, parent.userData.originalCenter);
4835
+ };
4819
4836
  const calcObjectDepth = (object) => {
4820
4837
  if (object.userData.depth !== undefined)
4821
4838
  return object.userData.depth;
@@ -4824,13 +4841,15 @@ class DynamicModelImpl extends ModelImpl {
4824
4841
  object.userData.depth = depth;
4825
4842
  object.userData.originalPosition = object.position.clone();
4826
4843
  object.userData.originalCenter = calcObjectCenter(object, new Vector3());
4844
+ object.userData.originalOffset = calcObjectOffset(object, new Vector3());
4827
4845
  return depth;
4828
4846
  };
4829
4847
  const explodeScale = scale / 100;
4830
4848
  const explodeRoot = this.scene.children[0];
4831
- if (!explodeRoot.userData.explodeDepth) {
4849
+ const explodeObjects = this.getObjects();
4850
+ if (explodeRoot.userData.explodeDepth === undefined) {
4832
4851
  let maxDepth = 0;
4833
- this.gltfLoader.originalObjects.forEach((object) => {
4852
+ explodeObjects.forEach((object) => {
4834
4853
  const depth = calcObjectDepth(object);
4835
4854
  if (depth > maxDepth)
4836
4855
  maxDepth = depth;
@@ -4842,29 +4861,26 @@ class DynamicModelImpl extends ModelImpl {
4842
4861
  const explodeDepth = 0 | scaledExplodeDepth;
4843
4862
  const currentSegmentFraction = scaledExplodeDepth - explodeDepth;
4844
4863
  const offsetCache = new Map();
4845
- const calcObjectOffset = (object, target) => {
4864
+ const calcExplodeOffset = (object, target) => {
4846
4865
  if (offsetCache.has(object))
4847
4866
  return target.copy(offsetCache.get(object));
4848
4867
  const parent = object.parent;
4849
4868
  if (parent && object !== explodeRoot)
4850
- calcObjectOffset(parent, target);
4869
+ calcExplodeOffset(parent, target);
4851
4870
  const depth = object.userData.depth;
4852
4871
  if (depth > 0 && depth <= explodeDepth) {
4853
4872
  let objectScale = explodeScale * coeff;
4854
4873
  if (depth === explodeDepth)
4855
4874
  objectScale *= currentSegmentFraction;
4856
- const parentCenter = parent.userData.originalCenter;
4857
- const objectCenter = object.userData.originalCenter;
4858
- const localOffset = objectCenter.clone().sub(parentCenter).multiplyScalar(objectScale);
4859
- target.add(localOffset);
4875
+ target.addScaledVector(object.userData.originalOffset, objectScale);
4860
4876
  }
4861
4877
  offsetCache.set(object, target.clone());
4862
4878
  return target;
4863
4879
  };
4864
4880
  const transformMap = new Map();
4865
- this.gltfLoader.originalObjects.forEach((object) => {
4866
- const globalOffset = calcObjectOffset(object, new Vector3());
4867
- transformMap.set(object, new Matrix4().makeTranslation(globalOffset));
4881
+ explodeObjects.forEach((object) => {
4882
+ const offset = calcExplodeOffset(object, new Vector3());
4883
+ transformMap.set(object, new Matrix4().makeTranslation(offset));
4868
4884
  });
4869
4885
  this.gltfLoader.applyObjectTransforms(transformMap);
4870
4886
  this.scene.updateMatrixWorld();
@@ -8074,10 +8090,10 @@ class GLTFBinaryParser {
8074
8090
  }
8075
8091
  offset += chunkLength;
8076
8092
  }
8077
- if (typeof this.content === "undefined") {
8093
+ if (this.content === undefined) {
8078
8094
  throw new Error("GLTFBinaryParser: JSON content not found.");
8079
8095
  }
8080
- if (typeof this.body === "undefined") {
8096
+ if (this.body === undefined) {
8081
8097
  throw new Error("GLTFBinaryParser: Binary buffer chunk not found or type not supported.");
8082
8098
  }
8083
8099
  }
@@ -8160,11 +8176,11 @@ class GLTFFileDynamicLoader extends Loader {
8160
8176
  if (this.manager)
8161
8177
  this.manager.dispose();
8162
8178
  }
8163
- isSupport(file, format) {
8179
+ isSupport(file, format = "") {
8164
8180
  return ((typeof file === "string" || file instanceof globalThis.File || file instanceof ArrayBuffer) &&
8165
8181
  /(gltf|glb)$/i.test(format));
8166
8182
  }
8167
- async load(file, format, params) {
8183
+ async load(file, format, params = {}) {
8168
8184
  this.manager = new GLTFLoadingManager(file, params);
8169
8185
  const scene = new Group();
8170
8186
  this.gltfLoader = new DynamicGltfLoader(this.viewer.camera, scene, this.viewer.renderer);
@@ -8399,7 +8415,9 @@ class Viewer extends EventEmitter2 {
8399
8415
  this.canvasEvents.forEach((x) => canvas.addEventListener(x, this.canvaseventlistener));
8400
8416
  this._markup.initialize(this.canvas, this.canvasEvents, this, this);
8401
8417
  for (const name of components.getComponents().keys()) {
8402
- this._components.push(components.createComponent(name, this));
8418
+ const component = components.createComponent(name, this);
8419
+ if (component)
8420
+ this._components.push(component);
8403
8421
  }
8404
8422
  this.syncOptions();
8405
8423
  this.syncOverlay();
@@ -8421,10 +8439,7 @@ class Viewer extends EventEmitter2 {
8421
8439
  this.setActiveDragger();
8422
8440
  this._components.forEach((component) => component.dispose());
8423
8441
  this._components.length = 0;
8424
- if (this._markup) {
8425
- this._markup.dispose();
8426
- this._markup = undefined;
8427
- }
8442
+ this._markup.dispose();
8428
8443
  if (this.canvas) {
8429
8444
  this.canvasEvents.forEach((x) => this.canvas.removeEventListener(x, this.canvaseventlistener));
8430
8445
  this.canvas = undefined;
@@ -8677,7 +8692,7 @@ class Viewer extends EventEmitter2 {
8677
8692
  }
8678
8693
  }
8679
8694
  getComponent(name) {
8680
- return this._components.find((component) => component.name === name);
8695
+ return this._components.find((component) => component.name === name) || null;
8681
8696
  }
8682
8697
  drawViewpoint(viewpoint) {
8683
8698
  var _a, _b, _c, _d;