@inweb/viewer-three 26.10.2 → 26.10.3
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/plugins/components/AxesHelperComponent.js +5 -9
- package/dist/plugins/components/AxesHelperComponent.js.map +1 -1
- package/dist/plugins/components/AxesHelperComponent.min.js +1 -1
- package/dist/plugins/components/AxesHelperComponent.module.js +5 -9
- package/dist/plugins/components/AxesHelperComponent.module.js.map +1 -1
- package/dist/plugins/components/GridHelperComponent.js +62 -0
- package/dist/plugins/components/GridHelperComponent.js.map +1 -0
- package/dist/plugins/components/GridHelperComponent.min.js +24 -0
- package/dist/plugins/components/GridHelperComponent.module.js +57 -0
- package/dist/plugins/components/GridHelperComponent.module.js.map +1 -0
- package/dist/viewer-three.js +32 -16
- package/dist/viewer-three.js.map +1 -1
- package/dist/viewer-three.min.js +3 -3
- package/dist/viewer-three.module.js +27 -12
- package/dist/viewer-three.module.js.map +1 -1
- package/package.json +5 -5
- package/plugins/components/AxesHelperComponent.ts +6 -11
- package/plugins/components/GridHelperComponent.ts +67 -0
- package/src/Viewer/components/SelectionComponent.ts +7 -1
- package/src/Viewer/draggers/MeasureLineDragger.ts +31 -12
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inweb/viewer-three",
|
|
3
|
-
"version": "26.10.
|
|
3
|
+
"version": "26.10.3",
|
|
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.10.
|
|
39
|
-
"@inweb/eventemitter2": "~26.10.
|
|
40
|
-
"@inweb/markup": "~26.10.
|
|
41
|
-
"@inweb/viewer-core": "~26.10.
|
|
38
|
+
"@inweb/client": "~26.10.3",
|
|
39
|
+
"@inweb/eventemitter2": "~26.10.3",
|
|
40
|
+
"@inweb/markup": "~26.10.3",
|
|
41
|
+
"@inweb/viewer-core": "~26.10.3"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/three": "^0.179.0",
|
|
@@ -30,8 +30,8 @@ class AxesHelperComponent implements IComponent {
|
|
|
30
30
|
private axesHelper2: AxesHelper;
|
|
31
31
|
|
|
32
32
|
constructor(viewer: Viewer) {
|
|
33
|
-
this.axesHelper1 = new AxesHelper();
|
|
34
|
-
this.axesHelper2 = new AxesHelper();
|
|
33
|
+
this.axesHelper1 = new AxesHelper(1);
|
|
34
|
+
this.axesHelper2 = new AxesHelper(1);
|
|
35
35
|
|
|
36
36
|
this.viewer = viewer;
|
|
37
37
|
this.viewer.addEventListener("initialize", this.syncHelper);
|
|
@@ -53,23 +53,18 @@ class AxesHelperComponent implements IComponent {
|
|
|
53
53
|
|
|
54
54
|
syncHelper = () => {
|
|
55
55
|
this.axesHelper1.removeFromParent();
|
|
56
|
-
this.axesHelper1.dispose();
|
|
57
|
-
|
|
58
56
|
this.axesHelper2.removeFromParent();
|
|
59
|
-
this.axesHelper2.dispose();
|
|
60
57
|
|
|
61
58
|
const size = this.viewer.extents.getSize(new Vector3()).length();
|
|
62
59
|
const center = this.viewer.extents.getCenter(new Vector3());
|
|
63
60
|
|
|
64
|
-
this.axesHelper1 = new AxesHelper(size || 1);
|
|
65
|
-
this.axesHelper2 = new AxesHelper(size);
|
|
66
|
-
|
|
67
61
|
this.axesHelper1.position.set(0, 0, 0);
|
|
68
|
-
this.
|
|
69
|
-
|
|
70
|
-
if (this.viewer.extents.isEmpty()) return;
|
|
62
|
+
this.axesHelper1.scale.setScalar(size);
|
|
71
63
|
|
|
72
64
|
this.axesHelper2.position.copy(center);
|
|
65
|
+
this.axesHelper2.scale.setScalar(size);
|
|
66
|
+
|
|
67
|
+
this.viewer.helpers.add(this.axesHelper1);
|
|
73
68
|
this.viewer.helpers.add(this.axesHelper2);
|
|
74
69
|
};
|
|
75
70
|
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2002-2025, Open Design Alliance (the "Alliance").
|
|
3
|
+
// All rights reserved.
|
|
4
|
+
//
|
|
5
|
+
// This software and its documentation and related materials are owned by
|
|
6
|
+
// the Alliance. The software may only be incorporated into application
|
|
7
|
+
// programs owned by members of the Alliance, subject to a signed
|
|
8
|
+
// Membership Agreement and Supplemental Software License Agreement with the
|
|
9
|
+
// Alliance. The structure and organization of this software are the valuable
|
|
10
|
+
// trade secrets of the Alliance and its suppliers. The software is also
|
|
11
|
+
// protected by copyright law and international treaty provisions. Application
|
|
12
|
+
// programs incorporating this software must include the following statement
|
|
13
|
+
// with their copyright notices:
|
|
14
|
+
//
|
|
15
|
+
// This application incorporates Open Design Alliance software pursuant to a
|
|
16
|
+
// license agreement with Open Design Alliance.
|
|
17
|
+
// Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance.
|
|
18
|
+
// All rights reserved.
|
|
19
|
+
//
|
|
20
|
+
// By use of this software, its documentation or related materials, you
|
|
21
|
+
// acknowledge and accept the above terms.
|
|
22
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
23
|
+
|
|
24
|
+
import { GridHelper, Vector3 } from "three";
|
|
25
|
+
import { IComponent, components, Viewer } from "@inweb/viewer-three";
|
|
26
|
+
|
|
27
|
+
class GridHelperComponent implements IComponent {
|
|
28
|
+
private viewer: Viewer;
|
|
29
|
+
private gridHelper: GridHelper;
|
|
30
|
+
|
|
31
|
+
constructor(viewer: Viewer) {
|
|
32
|
+
this.gridHelper = new GridHelper(10, 20, 0x444444, 0xaaaaaa);
|
|
33
|
+
this.viewer = viewer;
|
|
34
|
+
this.viewer.on("initialize", this.syncHelper);
|
|
35
|
+
this.viewer.on("geometryend", this.syncHelper);
|
|
36
|
+
this.viewer.on("clear", this.syncHelper);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
dispose() {
|
|
40
|
+
this.gridHelper.removeFromParent();
|
|
41
|
+
this.gridHelper.dispose();
|
|
42
|
+
|
|
43
|
+
this.viewer.off("initialize", this.syncHelper);
|
|
44
|
+
this.viewer.off("geometryend", this.syncHelper);
|
|
45
|
+
this.viewer.off("clear", this.syncHelper);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
syncHelper = () => {
|
|
49
|
+
this.gridHelper.removeFromParent();
|
|
50
|
+
|
|
51
|
+
if (this.viewer.extents.isEmpty()) return;
|
|
52
|
+
|
|
53
|
+
const size = this.viewer.extents.getSize(new Vector3()).multiply(this.viewer.camera.up).length();
|
|
54
|
+
const center = this.viewer.extents.getCenter(new Vector3());
|
|
55
|
+
|
|
56
|
+
const upY = new Vector3(0, 1, 0);
|
|
57
|
+
const up = new Vector3().copy(this.viewer.camera.up);
|
|
58
|
+
|
|
59
|
+
this.gridHelper.scale.setScalar(size);
|
|
60
|
+
this.gridHelper.position.copy(center);
|
|
61
|
+
this.gridHelper.quaternion.setFromUnitVectors(upY, up);
|
|
62
|
+
|
|
63
|
+
this.viewer.helpers.add(this.gridHelper);
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
components.registerComponent("GridHelperComponent", (viewer) => new GridHelperComponent(viewer));
|
|
@@ -114,7 +114,13 @@ export class SelectionComponent implements IComponent {
|
|
|
114
114
|
Sprite: {},
|
|
115
115
|
};
|
|
116
116
|
|
|
117
|
-
|
|
117
|
+
let intersects = this.raycaster.intersectObjects(objects, false);
|
|
118
|
+
|
|
119
|
+
(this.viewer.renderer.clippingPlanes || []).forEach((plane) => {
|
|
120
|
+
intersects = intersects.filter((intersect) => plane.distanceToPoint(intersect.point) >= 0);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
return intersects;
|
|
118
124
|
}
|
|
119
125
|
|
|
120
126
|
select(objects: Object3D | Object3D[], model?: IModelImpl) {
|
|
@@ -29,6 +29,7 @@ import {
|
|
|
29
29
|
MathUtils,
|
|
30
30
|
Matrix4,
|
|
31
31
|
Object3D,
|
|
32
|
+
Plane,
|
|
32
33
|
Raycaster,
|
|
33
34
|
Vector2,
|
|
34
35
|
Vector3,
|
|
@@ -89,8 +90,6 @@ export class MeasureLineDragger extends OrbitDragger {
|
|
|
89
90
|
|
|
90
91
|
this.snapper.dispose();
|
|
91
92
|
|
|
92
|
-
this.snapper.dispose();
|
|
93
|
-
|
|
94
93
|
this.overlay.detach();
|
|
95
94
|
this.overlay.dispose();
|
|
96
95
|
|
|
@@ -147,7 +146,7 @@ export class MeasureLineDragger extends OrbitDragger {
|
|
|
147
146
|
};
|
|
148
147
|
|
|
149
148
|
updateSnapper = () => {
|
|
150
|
-
this.snapper.
|
|
149
|
+
this.snapper.setFromViewer(this.viewer);
|
|
151
150
|
};
|
|
152
151
|
|
|
153
152
|
updateSnapperCamera = () => {
|
|
@@ -167,6 +166,7 @@ class MeasureSnapper {
|
|
|
167
166
|
public camera: Camera;
|
|
168
167
|
private canvas: HTMLCanvasElement;
|
|
169
168
|
private objects: Object3D[];
|
|
169
|
+
private clippingPlanes: Plane[];
|
|
170
170
|
private raycaster: Raycaster;
|
|
171
171
|
private detectRadiusInPixels: number;
|
|
172
172
|
private edgesCache: WeakMap<any, EdgesGeometry>;
|
|
@@ -175,6 +175,7 @@ class MeasureSnapper {
|
|
|
175
175
|
this.camera = camera;
|
|
176
176
|
this.canvas = canvas;
|
|
177
177
|
this.objects = [];
|
|
178
|
+
this.clippingPlanes = [];
|
|
178
179
|
this.raycaster = new Raycaster();
|
|
179
180
|
this.detectRadiusInPixels = this.isMobile() ? MOBILE_SNAP_DISTANCE : DESKTOP_SNAP_DISTANCE;
|
|
180
181
|
this.edgesCache = new WeakMap();
|
|
@@ -202,7 +203,7 @@ class MeasureSnapper {
|
|
|
202
203
|
return target.set(event.clientX, event.clientY);
|
|
203
204
|
}
|
|
204
205
|
|
|
205
|
-
getPointerIntersects(mouse: Vector2
|
|
206
|
+
getPointerIntersects(mouse: Vector2): Array<Intersection<Object3D>> {
|
|
206
207
|
const rect = this.canvas.getBoundingClientRect();
|
|
207
208
|
const x = ((mouse.x - rect.left) / rect.width) * 2 - 1;
|
|
208
209
|
const y = (-(mouse.y - rect.top) / rect.height) * 2 + 1;
|
|
@@ -219,7 +220,13 @@ class MeasureSnapper {
|
|
|
219
220
|
Sprite: {},
|
|
220
221
|
};
|
|
221
222
|
|
|
222
|
-
|
|
223
|
+
let intersects = this.raycaster.intersectObjects(this.objects, false);
|
|
224
|
+
|
|
225
|
+
this.clippingPlanes.forEach((plane) => {
|
|
226
|
+
intersects = intersects.filter((intersect) => plane.distanceToPoint(intersect.point) >= 0);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
return intersects;
|
|
223
230
|
}
|
|
224
231
|
|
|
225
232
|
getDetectRadius(point: Vector3): number {
|
|
@@ -259,7 +266,7 @@ class MeasureSnapper {
|
|
|
259
266
|
getSnapPoint(event: PointerEvent): Vector3 {
|
|
260
267
|
const mouse = this.getMousePosition(event, new Vector2());
|
|
261
268
|
|
|
262
|
-
const intersections = this.getPointerIntersects(mouse
|
|
269
|
+
const intersections = this.getPointerIntersects(mouse);
|
|
263
270
|
if (intersections.length === 0) return undefined;
|
|
264
271
|
|
|
265
272
|
// ===================== AI-CODE-START ======================
|
|
@@ -323,11 +330,14 @@ class MeasureSnapper {
|
|
|
323
330
|
return intersectionPoint.clone();
|
|
324
331
|
}
|
|
325
332
|
|
|
326
|
-
|
|
333
|
+
setFromViewer(viewer: Viewer) {
|
|
327
334
|
this.objects.length = 0;
|
|
328
335
|
viewer.models.forEach((model) => {
|
|
329
336
|
model.getVisibleObjects().forEach((object) => this.objects.push(object));
|
|
330
337
|
});
|
|
338
|
+
|
|
339
|
+
this.camera = viewer.camera;
|
|
340
|
+
this.clippingPlanes = viewer.renderer.clippingPlanes || [];
|
|
331
341
|
}
|
|
332
342
|
}
|
|
333
343
|
|
|
@@ -337,22 +347,19 @@ class MeasureOverlay {
|
|
|
337
347
|
public container: HTMLElement;
|
|
338
348
|
public lines: MeasureLine[] = [];
|
|
339
349
|
public projector: MeasureProjector;
|
|
350
|
+
private resizeObserver: ResizeObserver;
|
|
340
351
|
|
|
341
352
|
constructor(camera: Camera, canvas: HTMLCanvasElement) {
|
|
342
353
|
this.camera = camera;
|
|
343
354
|
this.canvas = canvas;
|
|
344
355
|
this.projector = new MeasureProjector(camera, canvas);
|
|
356
|
+
this.resizeObserver = new ResizeObserver(this.resizeContainer);
|
|
345
357
|
}
|
|
346
358
|
|
|
347
359
|
attach() {
|
|
348
360
|
this.container = document.createElement("div");
|
|
349
361
|
this.container.id = "measure-container";
|
|
350
|
-
this.container.style.background = "rgba(0,0,0,0)";
|
|
351
362
|
this.container.style.position = "absolute";
|
|
352
|
-
this.container.style.top = "0px";
|
|
353
|
-
this.container.style.left = "0px";
|
|
354
|
-
this.container.style.width = "100%";
|
|
355
|
-
this.container.style.height = "100%";
|
|
356
363
|
this.container.style.outline = "none";
|
|
357
364
|
this.container.style.pointerEvents = "none";
|
|
358
365
|
this.container.style.overflow = "hidden";
|
|
@@ -360,6 +367,7 @@ class MeasureOverlay {
|
|
|
360
367
|
if (!this.canvas.parentElement) return;
|
|
361
368
|
|
|
362
369
|
this.canvas.parentElement.appendChild(this.container);
|
|
370
|
+
this.resizeObserver.observe(this.canvas.parentElement);
|
|
363
371
|
}
|
|
364
372
|
|
|
365
373
|
dispose() {
|
|
@@ -367,6 +375,8 @@ class MeasureOverlay {
|
|
|
367
375
|
}
|
|
368
376
|
|
|
369
377
|
detach() {
|
|
378
|
+
this.resizeObserver.disconnect();
|
|
379
|
+
|
|
370
380
|
this.container.remove();
|
|
371
381
|
this.container = undefined;
|
|
372
382
|
}
|
|
@@ -392,6 +402,15 @@ class MeasureOverlay {
|
|
|
392
402
|
removeLine(line: MeasureLine) {
|
|
393
403
|
this.lines = this.lines.filter((x) => x !== line);
|
|
394
404
|
}
|
|
405
|
+
|
|
406
|
+
resizeContainer = (entries: ResizeObserverEntry[]) => {
|
|
407
|
+
const { width, height } = entries[0].contentRect;
|
|
408
|
+
|
|
409
|
+
if (!width || !height) return; // <- invisible canvas, or canvas with parent removed
|
|
410
|
+
|
|
411
|
+
this.container.style.width = `${width}px`;
|
|
412
|
+
this.container.style.height = `${height}px`;
|
|
413
|
+
};
|
|
395
414
|
}
|
|
396
415
|
|
|
397
416
|
const _middlePoint = new Vector3();
|