@inweb/viewer-three 26.12.6 → 27.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/dist/extensions/loaders/GLTFFileLoader.js +1 -1
- package/dist/extensions/loaders/GLTFFileLoader.js.map +1 -1
- package/dist/extensions/loaders/GLTFFileLoader.min.js +1 -1
- package/dist/extensions/loaders/GLTFFileLoader.module.js +1 -1
- package/dist/extensions/loaders/GLTFFileLoader.module.js.map +1 -1
- package/dist/extensions/loaders/IFCXLoader.js +2 -2
- package/dist/extensions/loaders/IFCXLoader.js.map +1 -1
- package/dist/extensions/loaders/IFCXLoader.min.js +1 -1
- package/dist/extensions/loaders/IFCXLoader.module.js +2 -2
- package/dist/extensions/loaders/IFCXLoader.module.js.map +1 -1
- package/dist/viewer-three.js +466 -170
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +2 -2
- package/dist/viewer-three.module.js +464 -168
- package/dist/viewer-three.module.js.map +1 -1
- package/extensions/loaders/GLTFFileLoader.ts +1 -1
- package/extensions/loaders/IFCX/IFCXCloudLoader.ts +1 -1
- package/extensions/loaders/IFCX/IFCXFileLoader.ts +1 -1
- package/lib/Viewer/Viewer.d.ts +2 -1
- package/lib/Viewer/components/ExtentsComponent.d.ts +1 -1
- package/lib/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.d.ts +3 -3
- package/lib/Viewer/measurement/Snapper.d.ts +1 -0
- package/lib/Viewer/measurement/UnitConverter.d.ts +20 -13
- package/lib/Viewer/models/IModelImpl.d.ts +2 -6
- package/lib/Viewer/models/ModelImpl.d.ts +4 -6
- package/package.json +5 -5
- package/src/Viewer/Viewer.ts +25 -15
- package/src/Viewer/commands/GetSelected2.ts +2 -2
- package/src/Viewer/commands/ZoomTo.ts +3 -3
- package/src/Viewer/components/CameraComponent.ts +4 -4
- package/src/Viewer/components/ExtentsComponent.ts +3 -3
- package/src/Viewer/components/HighlighterComponent.ts +11 -17
- package/src/Viewer/components/SelectionComponent.ts +14 -13
- package/src/Viewer/draggers/MeasureLineDragger.ts +1 -0
- package/src/Viewer/draggers/OrbitDragger.ts +2 -0
- package/src/Viewer/loaders/DynamicGltfLoader/DynamicGltfLoader.js +287 -22
- package/src/Viewer/loaders/DynamicGltfLoader/DynamicModelImpl.ts +94 -18
- package/src/Viewer/loaders/DynamicGltfLoader/GltfStructure.js +1 -1
- package/src/Viewer/measurement/Snapper.ts +6 -3
- package/src/Viewer/measurement/UnitConverter.ts +19 -12
- package/src/Viewer/measurement/UnitFormatter.ts +2 -2
- package/src/Viewer/models/IModelImpl.ts +2 -10
- 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) =>
|
|
277
|
+
this.scene.traverseVisible((object) => target.expandByObject(object));
|
|
254
278
|
return target;
|
|
255
279
|
}
|
|
256
280
|
|
|
257
281
|
getObjects(): Object3D[] {
|
|
258
|
-
|
|
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
|
-
|
|
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
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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
|
|
304
|
+
const handlesSet = new Set<string>(ownHandles);
|
|
296
305
|
|
|
297
306
|
const objects = [];
|
|
298
|
-
|
|
299
|
-
|
|
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
|
-
|
|
308
|
-
if (ownObjects.length === 0) return [];
|
|
315
|
+
if (!Array.isArray(objects)) objects = [objects];
|
|
309
316
|
|
|
310
317
|
const handleSet = new Set<string>();
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
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
|
-
|
|
376
|
+
highlightObjects(objects: Object3D | Object3D[]): this {
|
|
350
377
|
return this;
|
|
351
378
|
}
|
|
352
379
|
|
|
353
|
-
|
|
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
|
|
406
|
+
let result = depth;
|
|
360
407
|
object.children.forEach((x: Object3D) => {
|
|
361
408
|
const objectDepth = calcExplodeDepth(x, depth + 1);
|
|
362
|
-
if (
|
|
409
|
+
if (result < objectDepth) result = objectDepth;
|
|
363
410
|
});
|
|
364
411
|
|
|
365
412
|
object.userData.originalPosition = object.position.clone();
|
|
366
|
-
object.userData.originalCenter =
|
|
367
|
-
object.userData.isExplodeLocked = depth > 2 && object.children.length === 0;
|
|
413
|
+
object.userData.originalCenter = getObjectCenter(object, new Vector3());
|
|
368
414
|
|
|
369
|
-
return
|
|
415
|
+
return result;
|
|
370
416
|
}
|
|
371
417
|
|
|
372
|
-
scale
|
|
418
|
+
const explodeScale = scale / 100;
|
|
419
|
+
const explodeRoot = this.scene;
|
|
373
420
|
|
|
374
|
-
if (!
|
|
375
|
-
const maxDepth =
|
|
421
|
+
if (!explodeRoot.userData.explodeDepth) explodeRoot.userData.explodeDepth = calcExplodeDepth(explodeRoot, 1);
|
|
422
|
+
const maxDepth = explodeRoot.userData.explodeDepth;
|
|
376
423
|
|
|
377
|
-
const scaledExplodeDepth =
|
|
424
|
+
const scaledExplodeDepth = explodeScale * maxDepth + 1;
|
|
378
425
|
const explodeDepth = 0 | scaledExplodeDepth;
|
|
379
426
|
const currentSegmentFraction = scaledExplodeDepth - explodeDepth;
|
|
380
427
|
|
|
381
|
-
function explodeObject(object
|
|
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
|
|
385
|
-
let objectScale =
|
|
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(
|
|
448
|
+
explodeObject(explodeRoot, 0);
|
|
399
449
|
this.scene.updateMatrixWorld();
|
|
400
450
|
|
|
401
451
|
return this;
|