@inweb/viewer-three 26.12.6 → 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.
- 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 +457 -155
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +3 -3
- package/dist/viewer-three.module.js +455 -153
- 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/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 +15 -11
- 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 +285 -10
- 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
|
@@ -62,7 +62,7 @@ export class GLTFFileLoader extends Loader {
|
|
|
62
62
|
const gltf = await loader.loadAsync(this.manager.fileURL, progress);
|
|
63
63
|
if (!this.viewer.scene) return this;
|
|
64
64
|
|
|
65
|
-
let handle =
|
|
65
|
+
let handle = 1;
|
|
66
66
|
gltf.scene.traverse((object) => {
|
|
67
67
|
object.userData = { handle: handle + "", ...object.userData };
|
|
68
68
|
handle++;
|
|
@@ -56,7 +56,7 @@ export class IFCXFileLoader extends Loader {
|
|
|
56
56
|
const scene = await loader.loadAsync(manager.fileURL, progress);
|
|
57
57
|
if (!this.viewer.scene) return this;
|
|
58
58
|
|
|
59
|
-
let handle =
|
|
59
|
+
let handle = 1;
|
|
60
60
|
scene.traverse((object) => {
|
|
61
61
|
object.userData = { handle: handle + "", ...object.userData };
|
|
62
62
|
handle++;
|
|
@@ -8,13 +8,13 @@ export declare class DynamicModelImpl extends ModelImpl {
|
|
|
8
8
|
getExtents(target: Box3): Box3;
|
|
9
9
|
getObjects(): Object3D[];
|
|
10
10
|
getVisibleObjects(): Object3D[];
|
|
11
|
-
hasObject(object: any): boolean;
|
|
12
11
|
getObjectsByHandles(handles: string | string[]): Object3D[];
|
|
13
12
|
getHandlesByObjects(objects: Object3D | Object3D[]): string[];
|
|
14
13
|
hideObjects(objects: Object3D | Object3D[]): this;
|
|
15
14
|
isolateObjects(objects: Object3D | Object3D[]): this;
|
|
16
15
|
showObjects(objects: Object3D | Object3D[]): this;
|
|
17
16
|
showAllObjects(): this;
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
highlightObjects(objects: Object3D | Object3D[]): this;
|
|
18
|
+
unhighlightObjects(objects: Object3D | Object3D[]): this;
|
|
19
|
+
explode(scale?: number, coeff?: number): this;
|
|
20
20
|
}
|
|
@@ -1,62 +1,69 @@
|
|
|
1
|
-
export declare const
|
|
1
|
+
export declare const DisplayUnits: {
|
|
2
2
|
Meters: {
|
|
3
3
|
name: string;
|
|
4
|
-
|
|
4
|
+
symbol: string;
|
|
5
5
|
scale: number;
|
|
6
6
|
};
|
|
7
7
|
Centimeters: {
|
|
8
8
|
name: string;
|
|
9
|
-
|
|
9
|
+
symbol: string;
|
|
10
10
|
scale: number;
|
|
11
11
|
};
|
|
12
12
|
Millimeters: {
|
|
13
13
|
name: string;
|
|
14
|
-
|
|
14
|
+
symbol: string;
|
|
15
15
|
scale: number;
|
|
16
16
|
};
|
|
17
17
|
Feet: {
|
|
18
18
|
name: string;
|
|
19
|
-
|
|
19
|
+
symbol: string;
|
|
20
20
|
scale: number;
|
|
21
21
|
};
|
|
22
22
|
Inches: {
|
|
23
23
|
name: string;
|
|
24
|
-
|
|
24
|
+
symbol: string;
|
|
25
25
|
scale: number;
|
|
26
26
|
};
|
|
27
27
|
Yards: {
|
|
28
28
|
name: string;
|
|
29
|
-
|
|
29
|
+
symbol: string;
|
|
30
30
|
scale: number;
|
|
31
31
|
};
|
|
32
32
|
Kilometers: {
|
|
33
33
|
name: string;
|
|
34
|
-
|
|
34
|
+
symbol: string;
|
|
35
35
|
scale: number;
|
|
36
36
|
};
|
|
37
37
|
Miles: {
|
|
38
38
|
name: string;
|
|
39
|
-
|
|
39
|
+
symbol: string;
|
|
40
40
|
scale: number;
|
|
41
41
|
};
|
|
42
42
|
Micrometers: {
|
|
43
43
|
name: string;
|
|
44
|
-
|
|
44
|
+
symbol: string;
|
|
45
45
|
scale: number;
|
|
46
46
|
};
|
|
47
47
|
Mils: {
|
|
48
48
|
name: string;
|
|
49
|
-
|
|
49
|
+
symbol: string;
|
|
50
50
|
scale: number;
|
|
51
51
|
};
|
|
52
52
|
MicroInches: {
|
|
53
53
|
name: string;
|
|
54
|
-
|
|
54
|
+
symbol: string;
|
|
55
55
|
scale: number;
|
|
56
56
|
};
|
|
57
57
|
Default: {
|
|
58
58
|
name: string;
|
|
59
|
-
|
|
59
|
+
symbol: string;
|
|
60
|
+
scale: number;
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
export declare const ModelUnits: {
|
|
64
|
+
Default: {
|
|
65
|
+
name: string;
|
|
66
|
+
symbol: string;
|
|
60
67
|
scale: number;
|
|
61
68
|
};
|
|
62
69
|
};
|
|
@@ -13,10 +13,6 @@ export interface IModelImpl extends IModel {
|
|
|
13
13
|
getExtents(target: Box3): Box3;
|
|
14
14
|
getObjects(): Object3D[];
|
|
15
15
|
getVisibleObjects(): Object3D[];
|
|
16
|
-
hasObject(object: Object3D): boolean;
|
|
17
|
-
hasHandle(handle: string): boolean;
|
|
18
|
-
getOwnObjects(objects: Object3D | Object3D[]): Object3D[];
|
|
19
|
-
getOwnHandles(handles: string | string[]): string[];
|
|
20
16
|
getObjectsByHandles(handles: string | string[]): Object3D[];
|
|
21
17
|
getHandlesByObjects(objects: Object3D | Object3D[]): string[];
|
|
22
18
|
hideObjects(objects: Object3D | Object3D[]): this;
|
|
@@ -24,7 +20,7 @@ export interface IModelImpl extends IModel {
|
|
|
24
20
|
isolateObjects(objects: Object3D | Object3D[]): this;
|
|
25
21
|
showObjects(objects: Object3D | Object3D[]): this;
|
|
26
22
|
showAllObjects(): this;
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
highlightObjects(objects: Object3D | Object3D[]): this;
|
|
24
|
+
unhighlightObjects(objects: Object3D | Object3D[]): this;
|
|
29
25
|
explode(scale: number, coeff?: number): this;
|
|
30
26
|
}
|
|
@@ -4,6 +4,8 @@ import { IModelImpl } from "./IModelImpl";
|
|
|
4
4
|
export declare class ModelImpl implements IModelImpl {
|
|
5
5
|
id: string;
|
|
6
6
|
scene: Object3D;
|
|
7
|
+
private handleToObjects;
|
|
8
|
+
private originalObjects;
|
|
7
9
|
constructor(scene: Object3D);
|
|
8
10
|
dispose(): void;
|
|
9
11
|
getUnits(): string;
|
|
@@ -14,10 +16,6 @@ export declare class ModelImpl implements IModelImpl {
|
|
|
14
16
|
getExtents(target: Box3): Box3;
|
|
15
17
|
getObjects(): Object3D[];
|
|
16
18
|
getVisibleObjects(): Object3D[];
|
|
17
|
-
hasObject(object: Object3D): boolean;
|
|
18
|
-
hasHandle(handle: string): boolean;
|
|
19
|
-
getOwnObjects(objects: Object3D | Object3D[]): Object3D[];
|
|
20
|
-
getOwnHandles(handles: string | string[]): string[];
|
|
21
19
|
getObjectsByHandles(handles: string | string[]): Object3D[];
|
|
22
20
|
getHandlesByObjects(objects: Object3D | Object3D[]): string[];
|
|
23
21
|
hideObjects(objects: Object3D | Object3D[]): this;
|
|
@@ -25,7 +23,7 @@ export declare class ModelImpl implements IModelImpl {
|
|
|
25
23
|
isolateObjects(objects: Object3D | Object3D[]): this;
|
|
26
24
|
showObjects(objects: Object3D | Object3D[]): this;
|
|
27
25
|
showAllObjects(): this;
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
highlightObjects(objects: Object3D | Object3D[]): this;
|
|
27
|
+
unhighlightObjects(objects: Object3D | Object3D[]): this;
|
|
30
28
|
explode(scale?: number, coeff?: number): this;
|
|
31
29
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inweb/viewer-three",
|
|
3
|
-
"version": "26.12.
|
|
3
|
+
"version": "26.12.7",
|
|
4
4
|
"description": "JavaScript library for rendering CAD and BIM files in a browser using Three.js",
|
|
5
5
|
"homepage": "https://cloud.opendesign.com/docs/index.html",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -35,10 +35,10 @@
|
|
|
35
35
|
"docs": "typedoc"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@inweb/client": "~26.12.
|
|
39
|
-
"@inweb/eventemitter2": "~26.12.
|
|
40
|
-
"@inweb/markup": "~26.12.
|
|
41
|
-
"@inweb/viewer-core": "~26.12.
|
|
38
|
+
"@inweb/client": "~26.12.7",
|
|
39
|
+
"@inweb/eventemitter2": "~26.12.7",
|
|
40
|
+
"@inweb/markup": "~26.12.7",
|
|
41
|
+
"@inweb/viewer-core": "~26.12.7"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/three": "^0.180.0",
|
package/src/Viewer/Viewer.ts
CHANGED
|
@@ -175,9 +175,9 @@ export class Viewer
|
|
|
175
175
|
const rect = canvas.parentElement.getBoundingClientRect();
|
|
176
176
|
const width = rect.width || 1;
|
|
177
177
|
const height = rect.height || 1;
|
|
178
|
-
const
|
|
178
|
+
const aspectRatio = width / height;
|
|
179
179
|
|
|
180
|
-
this.camera = new PerspectiveCamera(45,
|
|
180
|
+
this.camera = new PerspectiveCamera(45, aspectRatio, 0.001, 1000);
|
|
181
181
|
this.camera.up.set(0, 1, 0);
|
|
182
182
|
this.camera.position.set(0, 0, 1);
|
|
183
183
|
this.camera.lookAt(this.target);
|
|
@@ -293,15 +293,15 @@ export class Viewer
|
|
|
293
293
|
if (!this.renderer) return;
|
|
294
294
|
|
|
295
295
|
const camera = this.camera as any;
|
|
296
|
-
const
|
|
296
|
+
const aspectRatio = width / height;
|
|
297
297
|
|
|
298
298
|
if (camera.isPerspectiveCamera) {
|
|
299
|
-
camera.aspect =
|
|
299
|
+
camera.aspect = aspectRatio;
|
|
300
300
|
camera.updateProjectionMatrix();
|
|
301
301
|
}
|
|
302
302
|
if (camera.isOrthographicCamera) {
|
|
303
|
-
camera.left = camera.bottom *
|
|
304
|
-
camera.right = camera.top *
|
|
303
|
+
camera.left = camera.bottom * aspectRatio;
|
|
304
|
+
camera.right = camera.top * aspectRatio;
|
|
305
305
|
camera.updateProjectionMatrix();
|
|
306
306
|
}
|
|
307
307
|
|
|
@@ -671,13 +671,13 @@ export class Viewer
|
|
|
671
671
|
if (orthogonal_camera) {
|
|
672
672
|
const extentsSize = this.extents.getBoundingSphere(new Sphere()).radius * 2;
|
|
673
673
|
const rendererSize = this.renderer.getSize(new Vector2());
|
|
674
|
-
const
|
|
674
|
+
const aspectRatio = rendererSize.x / rendererSize.y;
|
|
675
675
|
|
|
676
676
|
const camera = new OrthographicCamera();
|
|
677
677
|
camera.top = orthogonal_camera.field_height / 2;
|
|
678
678
|
camera.bottom = -orthogonal_camera.field_height / 2;
|
|
679
|
-
camera.left = camera.bottom *
|
|
680
|
-
camera.right = camera.top *
|
|
679
|
+
camera.left = camera.bottom * aspectRatio;
|
|
680
|
+
camera.right = camera.top * aspectRatio;
|
|
681
681
|
camera.near = 0;
|
|
682
682
|
camera.far = extentsSize * 1000;
|
|
683
683
|
camera.zoom = orthogonal_camera.view_to_world_scale;
|
|
@@ -693,6 +693,7 @@ export class Viewer
|
|
|
693
693
|
this.helpersPass.camera = camera;
|
|
694
694
|
this.ssaaRenderPass.camera = camera;
|
|
695
695
|
|
|
696
|
+
this.options.cameraMode = "orthographic";
|
|
696
697
|
this.emitEvent({ type: "changecameramode", mode: "orthographic" });
|
|
697
698
|
}
|
|
698
699
|
};
|
|
@@ -701,11 +702,11 @@ export class Viewer
|
|
|
701
702
|
if (perspective_camera) {
|
|
702
703
|
const extentsSize = this.extents.getBoundingSphere(new Sphere()).radius * 2;
|
|
703
704
|
const rendererSize = this.renderer.getSize(new Vector2());
|
|
704
|
-
const
|
|
705
|
+
const aspectRatio = rendererSize.x / rendererSize.y;
|
|
705
706
|
|
|
706
707
|
const camera = new PerspectiveCamera();
|
|
707
708
|
camera.fov = perspective_camera.field_of_view;
|
|
708
|
-
camera.aspect =
|
|
709
|
+
camera.aspect = aspectRatio;
|
|
709
710
|
camera.near = extentsSize / 1000;
|
|
710
711
|
camera.far = extentsSize * 1000;
|
|
711
712
|
camera.updateProjectionMatrix();
|
|
@@ -720,6 +721,7 @@ export class Viewer
|
|
|
720
721
|
this.helpersPass.camera = camera;
|
|
721
722
|
this.ssaaRenderPass.camera = camera;
|
|
722
723
|
|
|
724
|
+
this.options.cameraMode = "perspective";
|
|
723
725
|
this.emitEvent({ type: "changecameramode", mode: "perspective" });
|
|
724
726
|
}
|
|
725
727
|
};
|
|
@@ -760,6 +762,8 @@ export class Viewer
|
|
|
760
762
|
|
|
761
763
|
this.target.copy(getVector3FromPoint3d(viewpoint.custom_fields?.camera_target ?? this.target));
|
|
762
764
|
|
|
765
|
+
this.syncOverlay();
|
|
766
|
+
|
|
763
767
|
this.setActiveDragger(draggerName);
|
|
764
768
|
this.emitEvent({ type: "drawviewpoint", data: viewpoint });
|
|
765
769
|
this.update();
|
|
@@ -27,8 +27,8 @@ export function getSelected2(viewer: Viewer): string[] {
|
|
|
27
27
|
const handles2 = [];
|
|
28
28
|
|
|
29
29
|
viewer.models.forEach((model) => {
|
|
30
|
-
handles2.push(
|
|
30
|
+
handles2.push(model.getHandlesByObjects(viewer.selected));
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
return handles2;
|
|
33
|
+
return handles2.flat();
|
|
34
34
|
}
|
|
@@ -31,7 +31,7 @@ export function zoomTo(viewer: Viewer, box: Box3): void {
|
|
|
31
31
|
const boxSize = box.getBoundingSphere(new Sphere()).radius;
|
|
32
32
|
|
|
33
33
|
const rendererSize = viewer.renderer.getSize(new Vector2());
|
|
34
|
-
const
|
|
34
|
+
const aspectRatio = rendererSize.x / rendererSize.y;
|
|
35
35
|
|
|
36
36
|
const camera = viewer.camera as any;
|
|
37
37
|
|
|
@@ -46,8 +46,8 @@ export function zoomTo(viewer: Viewer, box: Box3): void {
|
|
|
46
46
|
if (camera.isOrthographicCamera) {
|
|
47
47
|
camera.top = boxSize;
|
|
48
48
|
camera.bottom = -boxSize;
|
|
49
|
-
camera.left = camera.bottom *
|
|
50
|
-
camera.right = camera.top *
|
|
49
|
+
camera.left = camera.bottom * aspectRatio;
|
|
50
|
+
camera.right = camera.top * aspectRatio;
|
|
51
51
|
camera.zoom = 1;
|
|
52
52
|
camera.updateProjectionMatrix();
|
|
53
53
|
|
|
@@ -49,16 +49,16 @@ export class CameraComponent implements IComponent {
|
|
|
49
49
|
switchCamera(camera: any) {
|
|
50
50
|
const extentsSize = this.viewer.extents.getBoundingSphere(new Sphere()).radius * 2 || 1;
|
|
51
51
|
const rendererSize = this.viewer.renderer.getSize(new Vector2());
|
|
52
|
-
const
|
|
52
|
+
const aspectRatio = rendererSize.x / rendererSize.y;
|
|
53
53
|
|
|
54
54
|
if (camera.isPerspectiveCamera) {
|
|
55
|
-
camera.aspect =
|
|
55
|
+
camera.aspect = aspectRatio;
|
|
56
56
|
camera.near = extentsSize / 1000;
|
|
57
57
|
camera.far = extentsSize * 1000;
|
|
58
58
|
}
|
|
59
59
|
if (camera.isOrthographicCamera) {
|
|
60
|
-
camera.left = camera.bottom *
|
|
61
|
-
camera.right = camera.top *
|
|
60
|
+
camera.left = camera.bottom * aspectRatio;
|
|
61
|
+
camera.right = camera.top * aspectRatio;
|
|
62
62
|
camera.near = 0;
|
|
63
63
|
camera.far = extentsSize * 1000;
|
|
64
64
|
}
|
|
@@ -50,13 +50,13 @@ export class ExtentsComponent implements IComponent {
|
|
|
50
50
|
this.viewer.off("showall", this.syncExtents);
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
syncExtents = () => {
|
|
53
|
+
syncExtents = (event) => {
|
|
54
54
|
const extents = new Box3();
|
|
55
55
|
this.viewer.models.forEach((model) => model.getExtents(extents));
|
|
56
56
|
this.viewer.extents.copy(extents);
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
if (this.viewer.models.length > 1) return;
|
|
58
|
+
if (event.type !== "databasechunk" && event.target !== "clear") return;
|
|
59
|
+
if (this.viewer.models.length > 1) return; // do not change target in assembly mode
|
|
60
60
|
|
|
61
61
|
this.viewer.extents.getCenter(this.viewer.target);
|
|
62
62
|
};
|
|
@@ -78,12 +78,12 @@ export class HighlighterComponent implements IComponent {
|
|
|
78
78
|
const { edgesVisibility } = this.viewer.options;
|
|
79
79
|
|
|
80
80
|
if (!Array.isArray(objects)) objects = [objects];
|
|
81
|
-
if (
|
|
81
|
+
if (objects.length === 0) return;
|
|
82
82
|
|
|
83
83
|
objects
|
|
84
84
|
.filter((object) => !object.userData.isEdge) // <- filtering server generated edges
|
|
85
85
|
.forEach((object: any) => {
|
|
86
|
-
if (object.isHighlighted) return;
|
|
86
|
+
if (object.userData.isHighlighted) return;
|
|
87
87
|
|
|
88
88
|
if (object.isLine || object.isLineSegments) {
|
|
89
89
|
const positions = object.geometry.attributes.position.array;
|
|
@@ -93,48 +93,42 @@ export class HighlighterComponent implements IComponent {
|
|
|
93
93
|
: HighlighterUtils.fromNonIndexedLine(positions, object.isLineSegments);
|
|
94
94
|
|
|
95
95
|
const wireframe = new Wireframe(lineGeometry, this.lineGlowMaterial);
|
|
96
|
-
wireframe.position.copy(object.position);
|
|
97
|
-
wireframe.rotation.copy(object.rotation);
|
|
98
|
-
wireframe.scale.copy(object.scale);
|
|
99
96
|
wireframe.visible = edgesVisibility;
|
|
97
|
+
wireframe.userData.isHighlightWireframe = true;
|
|
100
98
|
|
|
101
|
-
object.
|
|
99
|
+
object.add(wireframe);
|
|
102
100
|
object.userData.highlightWireframe = wireframe;
|
|
103
|
-
|
|
104
101
|
object.userData.originalMaterial = object.material;
|
|
105
102
|
object.material = this.lineMaterial;
|
|
106
|
-
object.isHighlighted = true;
|
|
103
|
+
object.userData.isHighlighted = true;
|
|
107
104
|
} else if (object.isMesh) {
|
|
108
105
|
const edgesGeometry = new EdgesGeometry(object.geometry, 89);
|
|
109
106
|
const lineGeometry = new LineSegmentsGeometry().fromEdgesGeometry(edgesGeometry);
|
|
110
107
|
|
|
111
108
|
const wireframe = new Wireframe(lineGeometry, this.edgesMaterial);
|
|
112
|
-
wireframe.position.copy(object.position);
|
|
113
|
-
wireframe.rotation.copy(object.rotation);
|
|
114
|
-
wireframe.scale.copy(object.scale);
|
|
115
109
|
wireframe.visible = edgesVisibility;
|
|
110
|
+
wireframe.userData.isHighlightWireframe = true;
|
|
116
111
|
|
|
117
|
-
object.
|
|
112
|
+
object.add(wireframe);
|
|
118
113
|
object.userData.highlightWireframe = wireframe;
|
|
119
|
-
|
|
120
114
|
object.userData.originalMaterial = object.material;
|
|
121
115
|
object.material = this.facesMaterial;
|
|
122
|
-
object.isHighlighted = true;
|
|
116
|
+
object.userData.isHighlighted = true;
|
|
123
117
|
}
|
|
124
118
|
});
|
|
125
119
|
}
|
|
126
120
|
|
|
127
121
|
unhighlight(objects: Object3D | Object3D[]) {
|
|
128
122
|
if (!Array.isArray(objects)) objects = [objects];
|
|
129
|
-
if (
|
|
123
|
+
if (objects.length === 0) return;
|
|
130
124
|
|
|
131
125
|
objects.forEach((object: any) => {
|
|
132
|
-
if (!object.isHighlighted) return;
|
|
126
|
+
if (!object.userData.isHighlighted) return;
|
|
133
127
|
|
|
134
|
-
object.isHighlighted = false;
|
|
135
128
|
object.material = object.userData.originalMaterial;
|
|
136
129
|
object.userData.highlightWireframe.removeFromParent();
|
|
137
130
|
|
|
131
|
+
delete object.userData.isHighlighted;
|
|
138
132
|
delete object.userData.originalMaterial;
|
|
139
133
|
delete object.userData.highlightWireframe;
|
|
140
134
|
});
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
// acknowledge and accept the above terms.
|
|
22
22
|
///////////////////////////////////////////////////////////////////////////////
|
|
23
23
|
|
|
24
|
-
import { Object3D, Vector2 } from "three";
|
|
24
|
+
import { Object3D, Vector2, Vector3 } from "three";
|
|
25
25
|
|
|
26
26
|
import type { IComponent } from "@inweb/viewer-core";
|
|
27
27
|
import type { Viewer } from "../Viewer";
|
|
@@ -64,6 +64,7 @@ export class SelectionComponent implements IComponent {
|
|
|
64
64
|
if (upPosition.distanceTo(this.downPosition) !== 0) return;
|
|
65
65
|
|
|
66
66
|
const snapper = new Snapper(this.viewer.camera, this.viewer.renderer, this.viewer.canvas);
|
|
67
|
+
snapper.threshold = this.viewer.extents.getSize(new Vector3()).length() / 10000;
|
|
67
68
|
|
|
68
69
|
let intersections = [];
|
|
69
70
|
this.viewer.models.forEach((model) => {
|
|
@@ -107,13 +108,13 @@ export class SelectionComponent implements IComponent {
|
|
|
107
108
|
}
|
|
108
109
|
|
|
109
110
|
if (!Array.isArray(objects)) objects = [objects];
|
|
110
|
-
if (
|
|
111
|
+
if (objects.length === 0) return;
|
|
111
112
|
|
|
112
|
-
model.
|
|
113
|
+
model.highlightObjects(objects);
|
|
113
114
|
this.highlighter.highlight(objects);
|
|
114
115
|
|
|
115
|
-
objects.forEach((object
|
|
116
|
-
objects.forEach((object
|
|
116
|
+
objects.forEach((object) => this.viewer.selected.push(object));
|
|
117
|
+
objects.forEach((object) => (object.userData.isSelected = true));
|
|
117
118
|
}
|
|
118
119
|
|
|
119
120
|
deselect(objects: Object3D | Object3D[], model?: IModelImpl) {
|
|
@@ -123,30 +124,30 @@ export class SelectionComponent implements IComponent {
|
|
|
123
124
|
}
|
|
124
125
|
|
|
125
126
|
if (!Array.isArray(objects)) objects = [objects];
|
|
126
|
-
if (
|
|
127
|
+
if (objects.length === 0) return;
|
|
127
128
|
|
|
129
|
+
model.unhighlightObjects(objects);
|
|
128
130
|
this.highlighter.unhighlight(objects);
|
|
129
|
-
model.hideOriginalObjects(objects);
|
|
130
131
|
|
|
131
132
|
this.viewer.selected = this.viewer.selected.filter((x) => !objects.includes(x));
|
|
132
|
-
objects.forEach((object
|
|
133
|
+
objects.forEach((object) => (object.userData.isSelected = false));
|
|
133
134
|
}
|
|
134
135
|
|
|
135
136
|
toggleSelection(objects: Object3D | Object3D[], model?: IModelImpl) {
|
|
136
137
|
if (!Array.isArray(objects)) objects = [objects];
|
|
137
|
-
if (
|
|
138
|
+
if (objects.length === 0) return;
|
|
138
139
|
|
|
139
|
-
if (
|
|
140
|
+
if (objects[0].userData.isSelected) this.deselect(objects, model);
|
|
140
141
|
else this.select(objects, model);
|
|
141
142
|
}
|
|
142
143
|
|
|
143
144
|
clearSelection() {
|
|
144
|
-
if (
|
|
145
|
+
if (this.viewer.selected.length === 0) return;
|
|
145
146
|
|
|
147
|
+
this.viewer.models.forEach((model) => model.unhighlightObjects(this.viewer.selected));
|
|
146
148
|
this.highlighter.unhighlight(this.viewer.selected);
|
|
147
|
-
this.viewer.models.forEach((model) => model.hideOriginalObjects(this.viewer.selected));
|
|
148
149
|
|
|
149
|
-
this.viewer.selected.forEach((object
|
|
150
|
+
this.viewer.selected.forEach((object) => (object.userData.isSelected = false));
|
|
150
151
|
this.viewer.selected.length = 0;
|
|
151
152
|
}
|
|
152
153
|
|
|
@@ -50,6 +50,7 @@ export class MeasureLineDragger extends OrbitDragger {
|
|
|
50
50
|
this.overlay.addLine(this.line);
|
|
51
51
|
|
|
52
52
|
this.snapper = new Snapper(viewer.camera, viewer.renderer, viewer.canvas);
|
|
53
|
+
this.snapper.threshold = viewer.extents.getSize(new Vector3()).length() / 10000;
|
|
53
54
|
|
|
54
55
|
this.objects = [];
|
|
55
56
|
this.updateObjects();
|
|
@@ -43,6 +43,7 @@ export class OrbitDragger implements IDragger {
|
|
|
43
43
|
this.changed = false;
|
|
44
44
|
this.viewer = viewer;
|
|
45
45
|
this.viewer.addEventListener("databasechunk", this.updateControls);
|
|
46
|
+
this.viewer.addEventListener("clear", this.updateControls);
|
|
46
47
|
this.viewer.on("viewposition", this.updateControls);
|
|
47
48
|
this.viewer.addEventListener("zoom", this.updateControls);
|
|
48
49
|
this.viewer.addEventListener("drawviewpoint", this.updateControls);
|
|
@@ -56,6 +57,7 @@ export class OrbitDragger implements IDragger {
|
|
|
56
57
|
|
|
57
58
|
dispose(): void {
|
|
58
59
|
this.viewer.removeEventListener("databasechunk", this.updateControls);
|
|
60
|
+
this.viewer.removeEventListener("clear", this.updateControls);
|
|
59
61
|
this.viewer.off("viewposition", this.updateControls);
|
|
60
62
|
this.viewer.removeEventListener("zoom", this.updateControls);
|
|
61
63
|
this.viewer.removeEventListener("drawviewpoint", this.updateControls);
|