@vertexvis/viewer 0.18.1 → 0.18.2-testing.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/components/_commonjsHelpers.js +41 -0
- package/dist/components/_commonjsHelpers.js.map +1 -0
- package/dist/components/browser.esm.js +3173 -0
- package/dist/components/browser.esm.js.map +1 -0
- package/dist/components/bundle.esm.js +2250 -0
- package/dist/components/bundle.esm.js.map +1 -0
- package/dist/components/bundle.esm2.js +39740 -0
- package/dist/components/bundle.esm2.js.map +1 -0
- package/dist/components/config.js +81 -0
- package/dist/components/config.js.map +1 -0
- package/dist/components/controller.js +7627 -0
- package/dist/components/controller.js.map +1 -0
- package/dist/components/controller2.js +124 -0
- package/dist/components/controller2.js.map +1 -0
- package/dist/components/controller3.js +111 -0
- package/dist/components/controller3.js.map +1 -0
- package/dist/components/cursors.js +110 -0
- package/dist/components/cursors.js.map +1 -0
- package/dist/components/dom.js +43 -0
- package/dist/components/dom.js.map +1 -0
- package/dist/components/dom2.js +10 -0
- package/dist/components/dom2.js.map +1 -0
- package/dist/components/elementRectObserver.js +25 -0
- package/dist/components/elementRectObserver.js.map +1 -0
- package/dist/components/entities.js +179 -0
- package/dist/components/entities.js.map +1 -0
- package/dist/components/errors.js +80 -0
- package/dist/components/errors.js.map +1 -0
- package/dist/components/events.js +11 -0
- package/dist/components/events.js.map +1 -0
- package/dist/components/index.d.ts +26 -0
- package/dist/components/index.js +365 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index2.js +63 -0
- package/dist/components/index2.js.map +1 -0
- package/dist/components/interactions.js +236 -0
- package/dist/components/interactions.js.map +1 -0
- package/dist/components/mapper.js +9811 -0
- package/dist/components/mapper.js.map +1 -0
- package/dist/components/markup.js +33 -0
- package/dist/components/markup.js.map +1 -0
- package/dist/components/model.js +134 -0
- package/dist/components/model.js.map +1 -0
- package/dist/components/model2.js +157 -0
- package/dist/components/model2.js.map +1 -0
- package/dist/components/overlays.js +76 -0
- package/dist/components/overlays.js.map +1 -0
- package/dist/components/png-decoder.js +2405 -0
- package/dist/components/png-decoder.js.map +1 -0
- package/dist/components/regl-component.js +12582 -0
- package/dist/components/regl-component.js.map +1 -0
- package/dist/components/results.js +24 -0
- package/dist/components/results.js.map +1 -0
- package/dist/components/row.js +32 -0
- package/dist/components/row.js.map +1 -0
- package/dist/components/scene-tree-search.js +146 -0
- package/dist/components/scene-tree-search.js.map +1 -0
- package/dist/components/scene-tree-table-layout.js +928 -0
- package/dist/components/scene-tree-table-layout.js.map +1 -0
- package/dist/components/scene-tree-toolbar.js +35 -0
- package/dist/components/scene-tree-toolbar.js.map +1 -0
- package/dist/components/scene.js +1508 -0
- package/dist/components/scene.js.map +1 -0
- package/dist/components/stencil.js +25 -0
- package/dist/components/stencil.js.map +1 -0
- package/dist/components/streamAttributes.js +40833 -0
- package/dist/components/streamAttributes.js.map +1 -0
- package/dist/components/templates.js +36 -0
- package/dist/components/templates.js.map +1 -0
- package/dist/components/tslib.es6.js +125 -0
- package/dist/components/tslib.es6.js.map +1 -0
- package/dist/components/vertex-scene-tree-search.d.ts +11 -0
- package/dist/components/vertex-scene-tree-search.js +11 -0
- package/dist/components/vertex-scene-tree-search.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-cell.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-cell.js +209 -0
- package/dist/components/vertex-scene-tree-table-cell.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-column.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-column.js +42 -0
- package/dist/components/vertex-scene-tree-table-column.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-header.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-header.js +38 -0
- package/dist/components/vertex-scene-tree-table-header.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-layout.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-layout.js +11 -0
- package/dist/components/vertex-scene-tree-table-layout.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-resize-divider.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-resize-divider.js +57 -0
- package/dist/components/vertex-scene-tree-table-resize-divider.js.map +1 -0
- package/dist/components/vertex-scene-tree-toolbar-group.d.ts +11 -0
- package/dist/components/vertex-scene-tree-toolbar-group.js +38 -0
- package/dist/components/vertex-scene-tree-toolbar-group.js.map +1 -0
- package/dist/components/vertex-scene-tree-toolbar.d.ts +11 -0
- package/dist/components/vertex-scene-tree-toolbar.js +11 -0
- package/dist/components/vertex-scene-tree-toolbar.js.map +1 -0
- package/dist/components/vertex-scene-tree.d.ts +11 -0
- package/dist/components/vertex-scene-tree.js +803 -0
- package/dist/components/vertex-scene-tree.js.map +1 -0
- package/dist/components/vertex-viewer-box-query-tool.d.ts +11 -0
- package/dist/components/vertex-viewer-box-query-tool.js +352 -0
- package/dist/components/vertex-viewer-box-query-tool.js.map +1 -0
- package/dist/components/vertex-viewer-button.d.ts +11 -0
- package/dist/components/vertex-viewer-button.js +11 -0
- package/dist/components/vertex-viewer-button.js.map +1 -0
- package/dist/components/vertex-viewer-default-toolbar.d.ts +11 -0
- package/dist/components/vertex-viewer-default-toolbar.js +99 -0
- package/dist/components/vertex-viewer-default-toolbar.js.map +1 -0
- package/dist/components/vertex-viewer-dom-element.d.ts +11 -0
- package/dist/components/vertex-viewer-dom-element.js +11 -0
- package/dist/components/vertex-viewer-dom-element.js.map +1 -0
- package/dist/components/vertex-viewer-dom-group.d.ts +11 -0
- package/dist/components/vertex-viewer-dom-group.js +11 -0
- package/dist/components/vertex-viewer-dom-group.js.map +1 -0
- package/dist/components/vertex-viewer-dom-renderer.d.ts +11 -0
- package/dist/components/vertex-viewer-dom-renderer.js +11 -0
- package/dist/components/vertex-viewer-dom-renderer.js.map +1 -0
- package/dist/components/vertex-viewer-hit-result-indicator.d.ts +11 -0
- package/dist/components/vertex-viewer-hit-result-indicator.js +335 -0
- package/dist/components/vertex-viewer-hit-result-indicator.js.map +1 -0
- package/dist/components/vertex-viewer-icon.d.ts +11 -0
- package/dist/components/vertex-viewer-icon.js +11 -0
- package/dist/components/vertex-viewer-icon.js.map +1 -0
- package/dist/components/vertex-viewer-layer.d.ts +11 -0
- package/dist/components/vertex-viewer-layer.js +11 -0
- package/dist/components/vertex-viewer-layer.js.map +1 -0
- package/dist/components/vertex-viewer-markup-arrow.d.ts +11 -0
- package/dist/components/vertex-viewer-markup-arrow.js +11 -0
- package/dist/components/vertex-viewer-markup-arrow.js.map +1 -0
- package/dist/components/vertex-viewer-markup-circle.d.ts +11 -0
- package/dist/components/vertex-viewer-markup-circle.js +11 -0
- package/dist/components/vertex-viewer-markup-circle.js.map +1 -0
- package/dist/components/vertex-viewer-markup-freeform.d.ts +11 -0
- package/dist/components/vertex-viewer-markup-freeform.js +11 -0
- package/dist/components/vertex-viewer-markup-freeform.js.map +1 -0
- package/dist/components/vertex-viewer-markup-tool.d.ts +11 -0
- package/dist/components/vertex-viewer-markup-tool.js +257 -0
- package/dist/components/vertex-viewer-markup-tool.js.map +1 -0
- package/dist/components/vertex-viewer-markup.d.ts +11 -0
- package/dist/components/vertex-viewer-markup.js +362 -0
- package/dist/components/vertex-viewer-markup.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-details.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-details.js +307 -0
- package/dist/components/vertex-viewer-measurement-details.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-distance.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-distance.js +1067 -0
- package/dist/components/vertex-viewer-measurement-distance.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-line.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-line.js +11 -0
- package/dist/components/vertex-viewer-measurement-line.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-overlays.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-overlays.js +11 -0
- package/dist/components/vertex-viewer-measurement-overlays.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-precise.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-precise.js +362 -0
- package/dist/components/vertex-viewer-measurement-precise.js.map +1 -0
- package/dist/components/vertex-viewer-pin-group.d.ts +11 -0
- package/dist/components/vertex-viewer-pin-group.js +11 -0
- package/dist/components/vertex-viewer-pin-group.js.map +1 -0
- package/dist/components/vertex-viewer-pin-label-line.d.ts +11 -0
- package/dist/components/vertex-viewer-pin-label-line.js +11 -0
- package/dist/components/vertex-viewer-pin-label-line.js.map +1 -0
- package/dist/components/vertex-viewer-pin-label.d.ts +11 -0
- package/dist/components/vertex-viewer-pin-label.js +11 -0
- package/dist/components/vertex-viewer-pin-label.js.map +1 -0
- package/dist/components/vertex-viewer-pin-tool.d.ts +11 -0
- package/dist/components/vertex-viewer-pin-tool.js +430 -0
- package/dist/components/vertex-viewer-pin-tool.js.map +1 -0
- package/dist/components/vertex-viewer-spinner.d.ts +11 -0
- package/dist/components/vertex-viewer-spinner.js +11 -0
- package/dist/components/vertex-viewer-spinner.js.map +1 -0
- package/dist/components/vertex-viewer-toolbar-group.d.ts +11 -0
- package/dist/components/vertex-viewer-toolbar-group.js +11 -0
- package/dist/components/vertex-viewer-toolbar-group.js.map +1 -0
- package/dist/components/vertex-viewer-toolbar.d.ts +11 -0
- package/dist/components/vertex-viewer-toolbar.js +11 -0
- package/dist/components/vertex-viewer-toolbar.js.map +1 -0
- package/dist/components/vertex-viewer-transform-widget.d.ts +11 -0
- package/dist/components/vertex-viewer-transform-widget.js +838 -0
- package/dist/components/vertex-viewer-transform-widget.js.map +1 -0
- package/dist/components/vertex-viewer-view-cube.d.ts +11 -0
- package/dist/components/vertex-viewer-view-cube.js +270 -0
- package/dist/components/vertex-viewer-view-cube.js.map +1 -0
- package/dist/components/vertex-viewer.d.ts +11 -0
- package/dist/components/vertex-viewer.js +3543 -0
- package/dist/components/vertex-viewer.js.map +1 -0
- package/dist/components/viewer-button.js +35 -0
- package/dist/components/viewer-button.js.map +1 -0
- package/dist/components/viewer-dom-element.js +250 -0
- package/dist/components/viewer-dom-element.js.map +1 -0
- package/dist/components/viewer-dom-group.js +214 -0
- package/dist/components/viewer-dom-group.js.map +1 -0
- package/dist/components/viewer-dom-renderer.js +295 -0
- package/dist/components/viewer-dom-renderer.js.map +1 -0
- package/dist/components/viewer-icon.js +87 -0
- package/dist/components/viewer-icon.js.map +1 -0
- package/dist/components/viewer-layer.js +46 -0
- package/dist/components/viewer-layer.js.map +1 -0
- package/dist/components/viewer-markup-arrow.js +235 -0
- package/dist/components/viewer-markup-arrow.js.map +1 -0
- package/dist/components/viewer-markup-circle-components.js +42 -0
- package/dist/components/viewer-markup-circle-components.js.map +1 -0
- package/dist/components/viewer-markup-circle.js +201 -0
- package/dist/components/viewer-markup-circle.js.map +1 -0
- package/dist/components/viewer-markup-freeform.js +251 -0
- package/dist/components/viewer-markup-freeform.js.map +1 -0
- package/dist/components/viewer-measurement-line.js +77 -0
- package/dist/components/viewer-measurement-line.js.map +1 -0
- package/dist/components/viewer-measurement-overlays.js +184 -0
- package/dist/components/viewer-measurement-overlays.js.map +1 -0
- package/dist/components/viewer-pin-group.js +207 -0
- package/dist/components/viewer-pin-group.js.map +1 -0
- package/dist/components/viewer-pin-label-line.js +43 -0
- package/dist/components/viewer-pin-label-line.js.map +1 -0
- package/dist/components/viewer-pin-label.js +427 -0
- package/dist/components/viewer-pin-label.js.map +1 -0
- package/dist/components/viewer-spinner.js +53 -0
- package/dist/components/viewer-spinner.js.map +1 -0
- package/dist/components/viewer-toolbar-group.js +42 -0
- package/dist/components/viewer-toolbar-group.js.map +1 -0
- package/dist/components/viewer-toolbar.js +61 -0
- package/dist/components/viewer-toolbar.js.map +1 -0
- package/dist/components/viewport.js +188 -0
- package/dist/components/viewport.js.map +1 -0
- package/dist/components/wrappers_pb.js +1926 -0
- package/dist/components/wrappers_pb.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,1067 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2023 Vertex Software LLC. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { h, proxyCustomElement, HTMLElement, createEvent, Host } from '@stencil/core/internal/client';
|
|
5
|
+
import { v as vector3, c as angle, p as point, l as line3 } from './bundle.esm.js';
|
|
6
|
+
import { m as measurementCursor } from './cursors.js';
|
|
7
|
+
import { a as cssTransformCenterAt, g as getMouseClientPosition } from './dom.js';
|
|
8
|
+
import './mapper.js';
|
|
9
|
+
import './wrappers_pb.js';
|
|
10
|
+
import { i as fromPbVector3f, D as DistanceUnits } from './streamAttributes.js';
|
|
11
|
+
import { M as MeasurementModel } from './model.js';
|
|
12
|
+
import { M as MeasurementOverlayManager } from './overlays.js';
|
|
13
|
+
import { m as makeMinimumDistanceResult } from './results.js';
|
|
14
|
+
import { V as Viewport } from './viewport.js';
|
|
15
|
+
import { E as EventDispatcher, m as mapper } from './browser.esm.js';
|
|
16
|
+
import { g as getViewingElementPositions, d as defineCustomElement$2 } from './viewer-measurement-overlays.js';
|
|
17
|
+
import { c as classnames } from './index2.js';
|
|
18
|
+
import { d as defineCustomElement$3 } from './viewer-measurement-line.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The default distance, in pixels, between the mouse position and a snappable
|
|
22
|
+
* measurement feature.
|
|
23
|
+
*/
|
|
24
|
+
const MEASUREMENT_SNAP_DISTANCE = 16;
|
|
25
|
+
/**
|
|
26
|
+
* The default length, in pixels, for the measurement line cap.
|
|
27
|
+
*/
|
|
28
|
+
const MEASUREMENT_LINE_CAP_LENGTH = 10;
|
|
29
|
+
|
|
30
|
+
function getMeasurementBoundingClientRect(el) {
|
|
31
|
+
return el.getBoundingClientRect();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
class PointToPointHitTester {
|
|
35
|
+
constructor(stencil, depthBuffer, viewport, camera) {
|
|
36
|
+
this.stencil = stencil;
|
|
37
|
+
this.depthBuffer = depthBuffer;
|
|
38
|
+
this.viewport = viewport;
|
|
39
|
+
this.camera = camera;
|
|
40
|
+
}
|
|
41
|
+
hitTest(pt) {
|
|
42
|
+
const dpt = this.viewport.transformPointToFrame(pt, this.depthBuffer);
|
|
43
|
+
if (this.stencil != null) {
|
|
44
|
+
const spt = this.viewport.transformPointToFrame(pt, this.stencil);
|
|
45
|
+
return this.stencil.hitTest(spt) || this.depthBuffer.hitTest(dpt);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
return this.depthBuffer.hitTest(dpt);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
snapToNearestPixel(pt, radius) {
|
|
52
|
+
if (this.stencil != null) {
|
|
53
|
+
const framePt = this.viewport.transformPointToFrame(pt, this.stencil);
|
|
54
|
+
const snapPt = this.stencil.snapToNearestPixel(framePt, radius);
|
|
55
|
+
return this.viewport.transformPointToViewport(snapPt, this.stencil);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
return pt;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
transformPointToWorld(pt, { ignoreHitTest = false } = {}) {
|
|
62
|
+
const buffer = this.pickDepthBuffer(pt);
|
|
63
|
+
if (buffer != null) {
|
|
64
|
+
return this.camera == null || this.camera.isPerspective()
|
|
65
|
+
? this.viewport.transformPointToWorldSpace(pt, buffer)
|
|
66
|
+
: this.viewport.transformPointToOrthographicWorldSpace(pt, buffer);
|
|
67
|
+
}
|
|
68
|
+
else if (ignoreHitTest) {
|
|
69
|
+
return this.camera == null || this.camera.isPerspective()
|
|
70
|
+
? this.viewport.transformPointToWorldSpace(pt, this.depthBuffer)
|
|
71
|
+
: this.viewport.transformPointToOrthographicWorldSpace(pt, this.depthBuffer);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
pickDepthBuffer(pt) {
|
|
75
|
+
if (this.stencil != null) {
|
|
76
|
+
const stencilPt = this.viewport.transformPointToFrame(pt, this.stencil);
|
|
77
|
+
if (this.stencil.hitTest(stencilPt)) {
|
|
78
|
+
return this.stencil.depthBuffer;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const depthPt = this.viewport.transformPointToFrame(pt, this.depthBuffer);
|
|
82
|
+
return this.depthBuffer.hitTest(depthPt) ? this.depthBuffer : undefined;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* A controller to handle point-to-point measurement interactions.
|
|
88
|
+
*/
|
|
89
|
+
class PointToPointInteractionController {
|
|
90
|
+
constructor(model) {
|
|
91
|
+
this.model = model;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Returns an interaction handler to perform a new measurement.
|
|
95
|
+
*
|
|
96
|
+
* @param pt A point in viewport coordinates.
|
|
97
|
+
* @param hits A provider to perform hits.
|
|
98
|
+
* @returns An interaction handler, or `undefined` if the point does not hit
|
|
99
|
+
* any geometry.
|
|
100
|
+
*/
|
|
101
|
+
newMeasurement(pt, hits) {
|
|
102
|
+
const world = hits.hitTester().transformPointToWorld(pt);
|
|
103
|
+
return world != null
|
|
104
|
+
? new NewMeasurementInteraction(pt, world, this.model)
|
|
105
|
+
: undefined;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Returns an interaction handler to edit an existing measurement.
|
|
109
|
+
*
|
|
110
|
+
* @param anchor The anchor to edit.
|
|
111
|
+
* @returns An interaction handler to edit a measurement.
|
|
112
|
+
*/
|
|
113
|
+
editMeasurement(anchor) {
|
|
114
|
+
const measurement = this.model.getMeasurement();
|
|
115
|
+
if (measurement == null) {
|
|
116
|
+
throw new Error('Cannot edit measurement. Measurement is empty.');
|
|
117
|
+
}
|
|
118
|
+
return anchor === 'start'
|
|
119
|
+
? new EditStartAnchorInteraction(measurement, this.model)
|
|
120
|
+
: new EditEndAnchorInteraction(measurement, this.model);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Clears the position of the feedback indicator.
|
|
124
|
+
*/
|
|
125
|
+
clearIndicator() {
|
|
126
|
+
this.model.setIndicator(undefined);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Updates the position of the feedback indicator.
|
|
130
|
+
*
|
|
131
|
+
* @param pt A point, in viewport coordinates.
|
|
132
|
+
* @param hits A provider to perform hits.
|
|
133
|
+
* @returns `true` if the indicator is over geometry.
|
|
134
|
+
*/
|
|
135
|
+
moveIndicator(pt, hits) {
|
|
136
|
+
const worldPt = hits.hitTester().transformPointToWorld(pt);
|
|
137
|
+
this.model.setIndicator(worldPt);
|
|
138
|
+
return worldPt != null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* The model for point-to-point interactions.
|
|
143
|
+
*/
|
|
144
|
+
class PointToPointInteractionModel {
|
|
145
|
+
constructor() {
|
|
146
|
+
this.measurementChanged = new EventDispatcher();
|
|
147
|
+
this.indicatorChanged = new EventDispatcher();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Returns a model that doesn't have the indicator or measurement set.
|
|
151
|
+
*/
|
|
152
|
+
static empty() {
|
|
153
|
+
return new PointToPointInteractionModel();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Returns the current measurement for the interaction.
|
|
157
|
+
*/
|
|
158
|
+
getMeasurement() {
|
|
159
|
+
return this.measurement;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Updates the measurement and emits a change event.
|
|
163
|
+
*
|
|
164
|
+
* @param measurement The new measurement.
|
|
165
|
+
*/
|
|
166
|
+
setMeasurement(measurement) {
|
|
167
|
+
if (this.measurement !== measurement) {
|
|
168
|
+
this.measurement = measurement;
|
|
169
|
+
this.measurementChanged.emit(measurement);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Updates the measurement from the given values. If `start` or `end` are
|
|
174
|
+
* `undefined` the measurement will be cleared.
|
|
175
|
+
*
|
|
176
|
+
* @param start The start point.
|
|
177
|
+
* @param end The end point.
|
|
178
|
+
* @param valid `true` if the measurement is valid.
|
|
179
|
+
*/
|
|
180
|
+
setMeasurementFromValues(start, end, valid) {
|
|
181
|
+
if (start != null && end != null) {
|
|
182
|
+
const measurement = valid
|
|
183
|
+
? validMeasurement(start, end)
|
|
184
|
+
: invalidMeasurement(start, end);
|
|
185
|
+
this.setMeasurement(measurement);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
this.setMeasurement(undefined);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Adds a callback that is invoked when the measurement changes.
|
|
193
|
+
*
|
|
194
|
+
* @param listener The callback to register.
|
|
195
|
+
* @returns A `Disposable` to remove the event listener.
|
|
196
|
+
*/
|
|
197
|
+
onMeasurementChanged(listener) {
|
|
198
|
+
return this.measurementChanged.on(listener);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Gets the position representing the feedback indicator.
|
|
202
|
+
*/
|
|
203
|
+
getIndicator() {
|
|
204
|
+
return this.indicator;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Updates the position of the feedback indicator.
|
|
208
|
+
*/
|
|
209
|
+
setIndicator(pt) {
|
|
210
|
+
if (this.indicator !== pt) {
|
|
211
|
+
this.indicator = pt;
|
|
212
|
+
this.indicatorChanged.emit(pt);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Adds a callback that is invoked when the feedback indicator position
|
|
217
|
+
* changes.
|
|
218
|
+
*
|
|
219
|
+
* @param listener The callback to register.
|
|
220
|
+
* @returns A `Disposable` to remove the event listener.
|
|
221
|
+
*/
|
|
222
|
+
onIndicatorChanged(listener) {
|
|
223
|
+
return this.indicatorChanged.on(listener);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* An interaction handler to perform a new measurement. As a user is performing
|
|
228
|
+
* an interaction, the handler will fetch the position of the starting anchor.
|
|
229
|
+
* While fetching the position, a position from the depth buffer will be used.
|
|
230
|
+
*/
|
|
231
|
+
class NewMeasurementInteraction {
|
|
232
|
+
constructor(pt, world, model) {
|
|
233
|
+
this.pt = pt;
|
|
234
|
+
this.world = world;
|
|
235
|
+
this.model = model;
|
|
236
|
+
this.hitWorldValid = true;
|
|
237
|
+
// Prevents any updates of the interaction while finish is completing.
|
|
238
|
+
this.preventUpdate = false;
|
|
239
|
+
}
|
|
240
|
+
fetchStartIfMissing(hits) {
|
|
241
|
+
if (this.pendingStart == null) {
|
|
242
|
+
this.pendingStart = this.fetchStart(hits);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async fetchStart(hits) {
|
|
246
|
+
const raycaster = await hits.raycaster();
|
|
247
|
+
const hitPt = await getHit(raycaster, this.pt);
|
|
248
|
+
if (hitPt == null) {
|
|
249
|
+
// If the hit is empty, fallback to using a point derived from the depth
|
|
250
|
+
// buffer.
|
|
251
|
+
const invalidPt = hits.hitTester().transformPointToWorld(this.pt);
|
|
252
|
+
this.hitWorld = invalidPt;
|
|
253
|
+
this.hitWorldValid = false;
|
|
254
|
+
}
|
|
255
|
+
else {
|
|
256
|
+
this.hitWorld = hitPt;
|
|
257
|
+
this.hitWorldValid = true;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
update(pt, hits) {
|
|
261
|
+
var _a;
|
|
262
|
+
if (!this.preventUpdate) {
|
|
263
|
+
this.fetchStartIfMissing(hits);
|
|
264
|
+
const end = hits
|
|
265
|
+
.hitTester()
|
|
266
|
+
.transformPointToWorld(pt, { ignoreHitTest: true });
|
|
267
|
+
const isHit = hits.hitTester().hitTest(pt);
|
|
268
|
+
const start = (_a = this.hitWorld) !== null && _a !== void 0 ? _a : this.world;
|
|
269
|
+
if (end == null) {
|
|
270
|
+
throw new Error('Cannot update new measurement interaction. End point is empty.');
|
|
271
|
+
}
|
|
272
|
+
else if (!this.hitWorldValid || !isHit) {
|
|
273
|
+
this.model.setIndicator(end);
|
|
274
|
+
this.setMeasurement(invalidMeasurement(start, end));
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
this.model.setIndicator(end);
|
|
278
|
+
this.setMeasurement(validMeasurement(start, end));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
async finish(pt, hits) {
|
|
283
|
+
var _a;
|
|
284
|
+
this.preventUpdate = true;
|
|
285
|
+
// Wait for the hit for the starting point.
|
|
286
|
+
this.fetchStartIfMissing(hits);
|
|
287
|
+
await this.pendingStart;
|
|
288
|
+
this.model.setIndicator(undefined);
|
|
289
|
+
const raycaster = await hits.raycaster();
|
|
290
|
+
const hitPt = await getHit(raycaster, pt);
|
|
291
|
+
const start = (_a = this.hitWorld) !== null && _a !== void 0 ? _a : this.world;
|
|
292
|
+
this.preventUpdate = false;
|
|
293
|
+
if (hitPt == null) {
|
|
294
|
+
const end = hits
|
|
295
|
+
.hitTester()
|
|
296
|
+
.transformPointToWorld(pt, { ignoreHitTest: true });
|
|
297
|
+
if (end == null) {
|
|
298
|
+
throw new Error('Cannot complete new measurement interaction. End point is empty.');
|
|
299
|
+
}
|
|
300
|
+
return this.setMeasurement(invalidMeasurement(start, end));
|
|
301
|
+
}
|
|
302
|
+
else if (!this.hitWorldValid) {
|
|
303
|
+
return this.setMeasurement(invalidMeasurement(start, hitPt));
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
return this.setMeasurement(validMeasurement(start, hitPt));
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
setMeasurement(measurement) {
|
|
310
|
+
this.model.setMeasurement(measurement);
|
|
311
|
+
return measurement;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Base class for an edit anchor interaction.
|
|
316
|
+
*
|
|
317
|
+
* @see {@link EditStartAnchorInteraction}
|
|
318
|
+
* @see {@link EditEndAnchorInteraction}
|
|
319
|
+
*/
|
|
320
|
+
class EditAnchorInteraction {
|
|
321
|
+
constructor(measurement, model) {
|
|
322
|
+
this.measurement = measurement;
|
|
323
|
+
this.model = model;
|
|
324
|
+
}
|
|
325
|
+
update(pt, context) {
|
|
326
|
+
const world = context
|
|
327
|
+
.hitTester()
|
|
328
|
+
.transformPointToWorld(pt, { ignoreHitTest: true });
|
|
329
|
+
const isHit = context.hitTester().hitTest(pt);
|
|
330
|
+
if (world == null) {
|
|
331
|
+
throw new Error('Cannot update new measurement interaction. End point is empty.');
|
|
332
|
+
}
|
|
333
|
+
else if (!isHit) {
|
|
334
|
+
this.model.setIndicator(world);
|
|
335
|
+
this.setMeasurement(this.getInvalidMeasurement(world));
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
this.model.setIndicator(world);
|
|
339
|
+
this.setMeasurement(this.getValidMeasurement(world));
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
async finish(pt, hits) {
|
|
343
|
+
const raycaster = await hits.raycaster();
|
|
344
|
+
const hitPt = await getHit(raycaster, pt);
|
|
345
|
+
this.model.setIndicator(undefined);
|
|
346
|
+
if (hitPt == null) {
|
|
347
|
+
const end = hits
|
|
348
|
+
.hitTester()
|
|
349
|
+
.transformPointToWorld(pt, { ignoreHitTest: true });
|
|
350
|
+
if (end == null) {
|
|
351
|
+
throw new Error('Cannot complete edit measurement interaction. End point is empty.');
|
|
352
|
+
}
|
|
353
|
+
return this.setMeasurement(this.getInvalidMeasurement(end));
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
return this.setMeasurement(this.getValidMeasurement(hitPt));
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
setMeasurement(measurement) {
|
|
360
|
+
this.model.setMeasurement(measurement);
|
|
361
|
+
return measurement;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
class EditStartAnchorInteraction extends EditAnchorInteraction {
|
|
365
|
+
constructor(measurement, model) {
|
|
366
|
+
super(measurement, model);
|
|
367
|
+
}
|
|
368
|
+
getInvalidMeasurement(startPt) {
|
|
369
|
+
return invalidMeasurement(startPt, this.measurement.end);
|
|
370
|
+
}
|
|
371
|
+
getValidMeasurement(startPt) {
|
|
372
|
+
return validMeasurement(startPt, this.measurement.end);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
class EditEndAnchorInteraction extends EditAnchorInteraction {
|
|
376
|
+
constructor(measurement, model) {
|
|
377
|
+
super(measurement, model);
|
|
378
|
+
}
|
|
379
|
+
getInvalidMeasurement(endPt) {
|
|
380
|
+
return invalidMeasurement(this.measurement.start, endPt);
|
|
381
|
+
}
|
|
382
|
+
getValidMeasurement(endPt) {
|
|
383
|
+
return validMeasurement(this.measurement.start, endPt);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
async function getHit(raycaster, pt) {
|
|
387
|
+
var _a;
|
|
388
|
+
const hitRes = await raycaster.hitItems(pt);
|
|
389
|
+
const [hit] = (_a = hitRes === null || hitRes === void 0 ? void 0 : hitRes.hits) !== null && _a !== void 0 ? _a : [];
|
|
390
|
+
if ((hit === null || hit === void 0 ? void 0 : hit.hitPoint) != null) {
|
|
391
|
+
const hitPt = fromPbVector3f(hit.hitPoint);
|
|
392
|
+
if (mapper.isInvalid(hitPt)) {
|
|
393
|
+
throw new Error(`Invalid hit response [${hitPt.errors.join(',')}]`);
|
|
394
|
+
}
|
|
395
|
+
return hitPt;
|
|
396
|
+
}
|
|
397
|
+
else
|
|
398
|
+
return undefined;
|
|
399
|
+
}
|
|
400
|
+
function validMeasurement(start, end) {
|
|
401
|
+
return { start, end, distance: vector3.distance(start, end), valid: true };
|
|
402
|
+
}
|
|
403
|
+
function invalidMeasurement(start, end) {
|
|
404
|
+
return { start, end, valid: false };
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
408
|
+
const DistanceMeasurementRenderer = ({ startPt, endPt, centerPt, indicatorPt, distance, anchorLabelOffset, lineCapLength, linePointerEvents, hideStartAnchor, hideEndAnchor, onStartAnchorPointerDown, onEndAnchorPointerDown, }) => {
|
|
409
|
+
const angle$1 = startPt != null && endPt != null
|
|
410
|
+
? angle.fromPoints(startPt, endPt)
|
|
411
|
+
: undefined;
|
|
412
|
+
const startLabelPt = angle$1 != null && startPt != null && anchorLabelOffset != null
|
|
413
|
+
? point.add(startPt, point.polar(-anchorLabelOffset, angle$1))
|
|
414
|
+
: undefined;
|
|
415
|
+
const endLabelPt = angle$1 != null && endPt != null && anchorLabelOffset != null
|
|
416
|
+
? point.add(endPt, point.polar(anchorLabelOffset, angle$1))
|
|
417
|
+
: undefined;
|
|
418
|
+
return (h("div", null,
|
|
419
|
+
startPt != null && endPt != null && (h("vertex-viewer-measurement-line", { class: classnames('line', {
|
|
420
|
+
'hide-start-line-cap': hideStartAnchor,
|
|
421
|
+
'hide-end-line-cap': hideEndAnchor,
|
|
422
|
+
}), start: startPt, end: endPt, capLength: lineCapLength, pointerEvents: linePointerEvents })),
|
|
423
|
+
!hideStartAnchor && startPt != null && (h("div", { id: "start-anchor", class: "anchor anchor-start", style: { transform: cssTransformCenterAt(startPt) }, onPointerDown: onStartAnchorPointerDown },
|
|
424
|
+
h("slot", { name: "start-anchor" },
|
|
425
|
+
h("div", { class: "anchor-placeholder" })))),
|
|
426
|
+
!hideStartAnchor && startLabelPt && (h("div", { class: "anchor-label anchor-label-start", style: { transform: cssTransformCenterAt(startLabelPt) } },
|
|
427
|
+
h("slot", { name: "start-label" }))),
|
|
428
|
+
!hideEndAnchor && endPt != null && (h("div", { id: "end-anchor", class: "anchor anchor-end", style: { transform: cssTransformCenterAt(endPt) }, onPointerDown: onEndAnchorPointerDown },
|
|
429
|
+
h("slot", { name: "end-anchor" },
|
|
430
|
+
h("div", { class: "anchor-placeholder" })))),
|
|
431
|
+
!hideEndAnchor && endLabelPt && (h("div", { class: "anchor-label anchor-label-end", style: { transform: cssTransformCenterAt(endLabelPt) } },
|
|
432
|
+
h("slot", { name: "end-label" }))),
|
|
433
|
+
centerPt != null && (h("div", { id: "label", class: "distance-label", style: { transform: cssTransformCenterAt(centerPt) } }, distance)),
|
|
434
|
+
indicatorPt != null && (h("div", { class: "indicator", style: { transform: cssTransformCenterAt(indicatorPt) } },
|
|
435
|
+
h("slot", { name: "indicator" },
|
|
436
|
+
h("div", { class: "indicator-placeholder" }))))));
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
const viewerMeasurementDistanceCss = ":host{--viewer-measurement-distance-accent-color:var(--neutral-900);--viewer-measurement-distance-contrast-color:var(--white);--viewer-measurement-distance-invalid-accent-color:var(--red-600);--viewer-measurement-distance-invalid-contrast-color:var(--white);--viewer-measurement-distance-line-stroke-width:1.25px;--viewer-measurement-distance-line-fill-width:2px;--viewer-measurement-distance-distance-border:1px solid\n var(--viewer-measurement-distance-accent-color);--viewer-measurement-distance-distance-border-radius:0.25rem;--viewer-measurement-distance-distance-padding:0.375rem 0.5rem;color:var(--viewer-measurement-distance-accent-color);font-size:0.75rem;position:absolute;top:0;bottom:0;left:0;right:0;overflow:hidden;pointer-events:none}:host([invalid]:not([invalid='false'])){--viewer-measurement-distance-accent-color:var(\n --viewer-measurement-distance-invalid-accent-color\n ) !important;--viewer-measurement-distance-contrast-color:var(\n --viewer-measurement-distance-invalid-contrast-color\n ) !important}.line{--viewer-measurement-line-stroke:var(\n --viewer-measurement-distance-contrast-color\n );--viewer-measurement-line-stroke-opacity:0.75;--viewer-measurement-line-stroke-width:var(\n --viewer-measurement-distance-line-stroke-width\n );--viewer-measurement-line-fill:var(\n --viewer-measurement-distance-accent-color\n );--viewer-measurement-line-fill-width:var(\n --viewer-measurement-distance-line-fill-width\n );position:absolute;width:100%;height:100%}.anchor{position:absolute;border-radius:50%;transform:translate(-50%, -50%);display:block;pointer-events:auto}:host([interacting-anchor='start']) .anchor-start,:host([interacting-anchor='start']) .anchor-label-start{visibility:hidden}.hide-start-line-cap,:host([interacting-anchor='start']) .line{--viewer-measurement-line-start-cap-visibility:hidden}:host([interacting-anchor='end']) .anchor-end,:host([interacting-anchor='end']) .anchor-label-end{visibility:hidden}.hide-end-line-cap,:host([interacting-anchor='end']) .line{--viewer-measurement-line-end-cap-visibility:hidden}.anchor-label{position:absolute;border-radius:50%;transform:translate(-50%, -50%);display:block;pointer-events:auto}:host(:not([mode=''])){cursor:inherit}:host(:not([mode=''])) .anchor{cursor:move}:host([mode='']) .anchor{visibility:hidden}.anchor-placeholder{background:var(--viewer-measurement-distance-contrast-color);width:12px;height:12px;border-radius:50%;box-sizing:border-box}:host(:not([mode=''])) .anchor-placeholder{border:2px solid var(--viewer-measurement-distance-accent-color);background:var(--viewer-measurement-distance-contrast-color)}:host([mode='']) .distance-label{color:var(--viewer-measurement-distance-contrast-color);background:var(--viewer-measurement-distance-accent-color)}.distance-label{position:absolute;background:var(--viewer-measurement-distance-contrast-color);border:var(--viewer-measurement-distance-distance-border);border-radius:var(--viewer-measurement-distance-distance-border-radius);padding:var(--viewer-measurement-distance-distance-padding);pointer-events:auto}.indicator{position:absolute}.indicator-placeholder{background:var(--viewer-measurement-distance-accent-color);border:1px solid var(--viewer-measurement-distance-contrast-color);width:6px;height:6px;border-radius:50%;box-sizing:border-box}";
|
|
440
|
+
|
|
441
|
+
const INTERACTION_THRESHOLD = 3;
|
|
442
|
+
const ViewerMeasurementDistance = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
443
|
+
constructor() {
|
|
444
|
+
super();
|
|
445
|
+
this.__registerHost();
|
|
446
|
+
this.__attachShadow();
|
|
447
|
+
this.editBegin = createEvent(this, "editBegin", 7);
|
|
448
|
+
this.editEnd = createEvent(this, "editEnd", 7);
|
|
449
|
+
/**
|
|
450
|
+
* Enables the display of axis reference lines between the start and end
|
|
451
|
+
* point.
|
|
452
|
+
*/
|
|
453
|
+
this.showAxisReferenceLines = false;
|
|
454
|
+
/**
|
|
455
|
+
* The distance, in pixels, between the mouse and nearest snappable edge. A
|
|
456
|
+
* value of 0 disables snapping.
|
|
457
|
+
*/
|
|
458
|
+
this.snapDistance = MEASUREMENT_SNAP_DISTANCE;
|
|
459
|
+
/**
|
|
460
|
+
* The unit of measurement.
|
|
461
|
+
*/
|
|
462
|
+
this.units = 'millimeters';
|
|
463
|
+
/**
|
|
464
|
+
* The number of fraction digits to display.
|
|
465
|
+
*/
|
|
466
|
+
this.fractionalDigits = 2;
|
|
467
|
+
/**
|
|
468
|
+
* The distance from an anchor to its label.
|
|
469
|
+
*/
|
|
470
|
+
this.anchorLabelOffset = 20;
|
|
471
|
+
/**
|
|
472
|
+
* The length of the caps at each end of the distance measurement.
|
|
473
|
+
*/
|
|
474
|
+
this.lineCapLength = MEASUREMENT_LINE_CAP_LENGTH;
|
|
475
|
+
/**
|
|
476
|
+
* A mode that specifies how the measurement component should behave.
|
|
477
|
+
*
|
|
478
|
+
* When unset, the component will not respond to interactions with the
|
|
479
|
+
* handles.
|
|
480
|
+
*
|
|
481
|
+
* When `edit`, the measurement anchors are interactive and the user is able
|
|
482
|
+
* to reposition them.
|
|
483
|
+
*
|
|
484
|
+
* When `replace`, anytime the user clicks on the canvas, a new measurement
|
|
485
|
+
* will be created and replace any existing measurement. After a measurement
|
|
486
|
+
* is created, the measurement will be editable.
|
|
487
|
+
*/
|
|
488
|
+
this.mode = '';
|
|
489
|
+
/**
|
|
490
|
+
* A property that reflects which anchor is currently being interacted with.
|
|
491
|
+
*/
|
|
492
|
+
this.interactingAnchor = 'none';
|
|
493
|
+
/**
|
|
494
|
+
* Indicates if the measurement is invalid. A measurement is invalid if either
|
|
495
|
+
* the start or end position are not on the surface of the model.
|
|
496
|
+
*/
|
|
497
|
+
this.invalid = false;
|
|
498
|
+
/**
|
|
499
|
+
* The measurement model that will be updated when this measurement changes.
|
|
500
|
+
* You can pass this to a <vertex-viewer-measurement-details> component to
|
|
501
|
+
* display measurement outcomes.
|
|
502
|
+
*/
|
|
503
|
+
this.measurementModel = new MeasurementModel();
|
|
504
|
+
this.viewport = new Viewport(0, 0);
|
|
505
|
+
this.interactionCount = 0;
|
|
506
|
+
this.invalidateStateCounter = 0;
|
|
507
|
+
this.stateMap = {};
|
|
508
|
+
this.measurementUnits = new DistanceUnits(this.units);
|
|
509
|
+
this.model = PointToPointInteractionModel.empty();
|
|
510
|
+
this.controller = new PointToPointInteractionController(this.model);
|
|
511
|
+
this.overlays = new MeasurementOverlayManager();
|
|
512
|
+
this.isUserInteractingWithModel = false;
|
|
513
|
+
this.handleFrameDrawn = () => {
|
|
514
|
+
this.invalidateState();
|
|
515
|
+
};
|
|
516
|
+
this.clearIndicator = () => {
|
|
517
|
+
this.controller.clearIndicator();
|
|
518
|
+
};
|
|
519
|
+
this.updateStartAnchor = async (event) => {
|
|
520
|
+
this.getStencilBuffer();
|
|
521
|
+
if (this.interactionCount === 0) {
|
|
522
|
+
const pt = getMouseClientPosition(event, this.elementBounds);
|
|
523
|
+
const snapPt = this.snapPoint(pt, event);
|
|
524
|
+
this.updateIndicator(snapPt);
|
|
525
|
+
}
|
|
526
|
+
};
|
|
527
|
+
this.newMeasurement = (event) => {
|
|
528
|
+
if (this.interactionCount === 0 && event.button === 0) {
|
|
529
|
+
// Function that registers event listeners to perform a new measurement.
|
|
530
|
+
const startMeasurement = (start) => {
|
|
531
|
+
const dispose = () => {
|
|
532
|
+
window.removeEventListener('pointerup', pointerUp);
|
|
533
|
+
window.removeEventListener('pointermove', pointerMove);
|
|
534
|
+
};
|
|
535
|
+
const pointerUp = async () => {
|
|
536
|
+
dispose();
|
|
537
|
+
start();
|
|
538
|
+
};
|
|
539
|
+
const pointerMove = (event) => {
|
|
540
|
+
if (event.buttons > 0) {
|
|
541
|
+
dispose();
|
|
542
|
+
}
|
|
543
|
+
};
|
|
544
|
+
window.addEventListener('pointermove', pointerMove);
|
|
545
|
+
window.addEventListener('pointerup', pointerUp);
|
|
546
|
+
};
|
|
547
|
+
// Function that registers event listeners to detect if a user is
|
|
548
|
+
// interacting with the model. If so, we temporarily disable measurement
|
|
549
|
+
// updates until the user finishes.
|
|
550
|
+
const pointerDownAndMove = (callback) => {
|
|
551
|
+
let downPt = point.create(0, 0);
|
|
552
|
+
const pointerMove = (event) => {
|
|
553
|
+
const dist = point.distance(downPt, getMouseClientPosition(event));
|
|
554
|
+
if (dist >= INTERACTION_THRESHOLD) {
|
|
555
|
+
callback();
|
|
556
|
+
}
|
|
557
|
+
};
|
|
558
|
+
const dispose = () => {
|
|
559
|
+
window.removeEventListener('pointermove', pointerMove);
|
|
560
|
+
window.removeEventListener('pointerup', pointerUp);
|
|
561
|
+
};
|
|
562
|
+
const pointerUp = () => dispose();
|
|
563
|
+
const pointerDown = (event) => {
|
|
564
|
+
downPt = getMouseClientPosition(event);
|
|
565
|
+
window.addEventListener('pointermove', pointerMove);
|
|
566
|
+
window.addEventListener('pointerup', pointerUp);
|
|
567
|
+
};
|
|
568
|
+
window.addEventListener('pointerdown', pointerDown);
|
|
569
|
+
return {
|
|
570
|
+
dispose: () => window.removeEventListener('pointerdown', pointerDown),
|
|
571
|
+
};
|
|
572
|
+
};
|
|
573
|
+
// Function that registers event listeners to finish a measurement.
|
|
574
|
+
const measureInteraction = () => {
|
|
575
|
+
const handleDownAndMove = pointerDownAndMove(() => {
|
|
576
|
+
var _a;
|
|
577
|
+
this.isUserInteractingWithModel = true;
|
|
578
|
+
(_a = this.stateMap.hoverCursor) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
579
|
+
});
|
|
580
|
+
const dispose = () => {
|
|
581
|
+
window.removeEventListener('pointermove', pointerMove);
|
|
582
|
+
window.removeEventListener('pointerup', pointerUp);
|
|
583
|
+
handleDownAndMove.dispose();
|
|
584
|
+
};
|
|
585
|
+
const pointerMove = this.createInteractionMoveHandler();
|
|
586
|
+
const pointerUp = async (event) => {
|
|
587
|
+
var _a;
|
|
588
|
+
if (event.button === 0) {
|
|
589
|
+
if (this.isUserInteractingWithModel) {
|
|
590
|
+
this.isUserInteractingWithModel = false;
|
|
591
|
+
}
|
|
592
|
+
else {
|
|
593
|
+
const hits = this.getHitProvider();
|
|
594
|
+
if (hits != null) {
|
|
595
|
+
const pt = getMouseClientPosition(event, this.elementBounds);
|
|
596
|
+
const snapPt = this.snapPoint(pt, event);
|
|
597
|
+
await ((_a = this.interaction) === null || _a === void 0 ? void 0 : _a.finish(snapPt, hits));
|
|
598
|
+
dispose();
|
|
599
|
+
this.updateMeasurementPropsFromModel();
|
|
600
|
+
this.endEditing();
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
};
|
|
605
|
+
this.beginEditing('replace', 'end');
|
|
606
|
+
this.newInteractionHandler = { dispose };
|
|
607
|
+
window.addEventListener('pointermove', pointerMove);
|
|
608
|
+
window.addEventListener('pointerup', pointerUp);
|
|
609
|
+
};
|
|
610
|
+
const hits = this.getHitProvider();
|
|
611
|
+
if (hits != null) {
|
|
612
|
+
const pt = getMouseClientPosition(event, this.elementBounds);
|
|
613
|
+
const snapPt = this.snapPoint(pt, event);
|
|
614
|
+
this.interaction = this.controller.newMeasurement(snapPt, hits);
|
|
615
|
+
if (this.interaction != null) {
|
|
616
|
+
startMeasurement(measureInteraction);
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
}
|
|
622
|
+
/**
|
|
623
|
+
* Computes the bounding boxes of the anchors and label. **Note:** invoking
|
|
624
|
+
* this function uses `getBoundingClientRect` internally and will cause a
|
|
625
|
+
* relayout of the DOM.
|
|
626
|
+
*/
|
|
627
|
+
async computeElementMetrics() {
|
|
628
|
+
var _a, _b, _c;
|
|
629
|
+
const startAnchorEl = (_a = this.hostEl.shadowRoot) === null || _a === void 0 ? void 0 : _a.getElementById('start-anchor');
|
|
630
|
+
const endAnchorEl = (_b = this.hostEl.shadowRoot) === null || _b === void 0 ? void 0 : _b.getElementById('end-anchor');
|
|
631
|
+
const labelEl = (_c = this.hostEl.shadowRoot) === null || _c === void 0 ? void 0 : _c.getElementById('label');
|
|
632
|
+
if (startAnchorEl != null && endAnchorEl != null && labelEl != null) {
|
|
633
|
+
return {
|
|
634
|
+
startAnchor: startAnchorEl.getBoundingClientRect(),
|
|
635
|
+
endAnchor: endAnchorEl.getBoundingClientRect(),
|
|
636
|
+
label: labelEl.getBoundingClientRect(),
|
|
637
|
+
};
|
|
638
|
+
}
|
|
639
|
+
else {
|
|
640
|
+
return undefined;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
/**
|
|
644
|
+
* @ignore
|
|
645
|
+
*/
|
|
646
|
+
disconnectedCallback() {
|
|
647
|
+
var _a, _b;
|
|
648
|
+
(_a = this.stateMap.hoverCursor) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
649
|
+
(_b = this.newInteractionHandler) === null || _b === void 0 ? void 0 : _b.dispose();
|
|
650
|
+
}
|
|
651
|
+
/**
|
|
652
|
+
* @ignore
|
|
653
|
+
*/
|
|
654
|
+
componentWillLoad() {
|
|
655
|
+
this.updatePropsFromJson();
|
|
656
|
+
this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);
|
|
657
|
+
this.getStencilBuffer();
|
|
658
|
+
this.updateViewport();
|
|
659
|
+
this.handleViewerChanged(this.viewer);
|
|
660
|
+
this.handleModeChanged();
|
|
661
|
+
this.computePropsAndState();
|
|
662
|
+
this.model.onIndicatorChanged((pt) => {
|
|
663
|
+
this.indicatorPt = pt;
|
|
664
|
+
});
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* @ignore
|
|
668
|
+
*/
|
|
669
|
+
componentDidLoad() {
|
|
670
|
+
const resize = new ResizeObserver(() => this.updateViewport());
|
|
671
|
+
resize.observe(this.hostEl);
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* @ignore
|
|
675
|
+
*/
|
|
676
|
+
componentWillUpdate() {
|
|
677
|
+
this.computePropsAndState();
|
|
678
|
+
}
|
|
679
|
+
/**
|
|
680
|
+
* @ignore
|
|
681
|
+
*/
|
|
682
|
+
render() {
|
|
683
|
+
return (h(Host, null, this.showAxisReferenceLines && (h("vertex-viewer-measurement-overlays", { measurementOverlays: this.overlays, viewer: this.viewer })), this.renderMeasurement()));
|
|
684
|
+
}
|
|
685
|
+
renderMeasurement() {
|
|
686
|
+
const positions = this.computeElementPositions();
|
|
687
|
+
const { startPt, endPt, labelPt, indicatorPt, hideStart, hideEnd } = positions;
|
|
688
|
+
const distance = this.formatDistance(this.distance);
|
|
689
|
+
if (this.mode === 'edit' || this.mode === 'replace') {
|
|
690
|
+
return (h(DistanceMeasurementRenderer, { startPt: startPt, endPt: endPt, centerPt: labelPt, indicatorPt: indicatorPt, distance: distance, anchorLabelOffset: this.anchorLabelOffset, lineCapLength: this.lineCapLength, hideStartAnchor: hideStart, hideEndAnchor: hideEnd, onStartAnchorPointerDown: this.handleEditAnchor('start'), onEndAnchorPointerDown: this.handleEditAnchor('end') }));
|
|
691
|
+
}
|
|
692
|
+
else {
|
|
693
|
+
return (h(DistanceMeasurementRenderer, { startPt: startPt, endPt: endPt, centerPt: labelPt, indicatorPt: this.indicatorPt, distance: distance, hideStartAnchor: hideStart, hideEndAnchor: hideEnd, anchorLabelOffset: this.anchorLabelOffset, lineCapLength: this.lineCapLength, linePointerEvents: "painted" }));
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
/**
|
|
697
|
+
* @ignore
|
|
698
|
+
*/
|
|
699
|
+
handleViewerChanged(newViewer, oldViewer) {
|
|
700
|
+
if (oldViewer != null) {
|
|
701
|
+
oldViewer.removeEventListener('frameDrawn', this.handleFrameDrawn);
|
|
702
|
+
this.removeInteractionListeners(oldViewer);
|
|
703
|
+
}
|
|
704
|
+
if (newViewer != null) {
|
|
705
|
+
newViewer.addEventListener('frameDrawn', this.handleFrameDrawn);
|
|
706
|
+
this.addInteractionListeners(newViewer);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
/**
|
|
710
|
+
* @ignore
|
|
711
|
+
*/
|
|
712
|
+
handleUnitsChanged() {
|
|
713
|
+
this.measurementUnits = new DistanceUnits(this.units);
|
|
714
|
+
}
|
|
715
|
+
/**
|
|
716
|
+
* @ignore
|
|
717
|
+
*/
|
|
718
|
+
handleCameraChanged() {
|
|
719
|
+
this.updateCamera();
|
|
720
|
+
}
|
|
721
|
+
/**
|
|
722
|
+
* @ignore
|
|
723
|
+
*/
|
|
724
|
+
handleModeChanged() {
|
|
725
|
+
this.warnIfDepthBuffersDisabled();
|
|
726
|
+
if (this.viewer != null) {
|
|
727
|
+
this.removeInteractionListeners(this.viewer);
|
|
728
|
+
this.addInteractionListeners(this.viewer);
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
/**
|
|
732
|
+
* @ignore
|
|
733
|
+
*/
|
|
734
|
+
handleStartChanged() {
|
|
735
|
+
this.updateInteractionModel();
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* @ignore
|
|
739
|
+
*/
|
|
740
|
+
handleEndChanged() {
|
|
741
|
+
this.updateInteractionModel();
|
|
742
|
+
}
|
|
743
|
+
/**
|
|
744
|
+
* @ignore
|
|
745
|
+
*/
|
|
746
|
+
handleInvalidChanged() {
|
|
747
|
+
this.updateInteractionModel();
|
|
748
|
+
}
|
|
749
|
+
computePropsAndState() {
|
|
750
|
+
this.updateCamera();
|
|
751
|
+
this.updateDepthBuffer();
|
|
752
|
+
this.updateMeasurementPropsFromModel();
|
|
753
|
+
this.updateOverlays();
|
|
754
|
+
}
|
|
755
|
+
updateOverlays() {
|
|
756
|
+
var _a;
|
|
757
|
+
(_a = this.overlay) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
758
|
+
if (this.showAxisReferenceLines &&
|
|
759
|
+
this.interactionCount === 0 &&
|
|
760
|
+
!this.invalid &&
|
|
761
|
+
this.start != null &&
|
|
762
|
+
this.end != null) {
|
|
763
|
+
this.overlay = this.overlays.addDistanceVector(this.start, this.end);
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
async setCursor(cursor) {
|
|
767
|
+
var _a, _b;
|
|
768
|
+
(_a = this.stateMap.hoverCursor) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
769
|
+
if (!this.isUserInteractingWithModel) {
|
|
770
|
+
this.stateMap.hoverCursor = await ((_b = this.viewer) === null || _b === void 0 ? void 0 : _b.addCursor(cursor));
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
computeElementPositions() {
|
|
774
|
+
if (this.mode === 'replace') {
|
|
775
|
+
return this.computeReplaceElementPositions();
|
|
776
|
+
}
|
|
777
|
+
else {
|
|
778
|
+
return this.computeEditOrViewElementPositions();
|
|
779
|
+
}
|
|
780
|
+
}
|
|
781
|
+
computeEditOrViewElementPositions() {
|
|
782
|
+
const measurement = this.model.getMeasurement();
|
|
783
|
+
if (this.internalCamera != null && measurement != null) {
|
|
784
|
+
return this.computeLineElementPositions(line3.create(measurement));
|
|
785
|
+
}
|
|
786
|
+
else {
|
|
787
|
+
return {};
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
computeReplaceElementPositions() {
|
|
791
|
+
if (this.internalCamera != null) {
|
|
792
|
+
const measurement = this.model.getMeasurement();
|
|
793
|
+
const line = measurement != null
|
|
794
|
+
? this.computeLineElementPositions(line3.create(measurement))
|
|
795
|
+
: {};
|
|
796
|
+
const indicator = this.indicatorPt != null
|
|
797
|
+
? {
|
|
798
|
+
indicatorPt: this.viewport.transformWorldToViewport(this.indicatorPt, this.internalCamera.projectionViewMatrix),
|
|
799
|
+
}
|
|
800
|
+
: {};
|
|
801
|
+
return Object.assign(Object.assign({}, line), indicator);
|
|
802
|
+
}
|
|
803
|
+
else {
|
|
804
|
+
return {};
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
computeLineElementPositions(line) {
|
|
808
|
+
if (this.internalCamera != null) {
|
|
809
|
+
return getViewingElementPositions(line, this.interactingAnchor, {
|
|
810
|
+
viewport: this.viewport,
|
|
811
|
+
camera: this.internalCamera,
|
|
812
|
+
});
|
|
813
|
+
}
|
|
814
|
+
else {
|
|
815
|
+
return {};
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
updateCamera() {
|
|
819
|
+
var _a, _b;
|
|
820
|
+
this.internalCamera = this.camera || ((_b = (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.frame) === null || _b === void 0 ? void 0 : _b.scene.camera);
|
|
821
|
+
}
|
|
822
|
+
async updateDepthBuffer() {
|
|
823
|
+
var _a, _b;
|
|
824
|
+
this.stateMap.depthBuffer = await ((_b = (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.frame) === null || _b === void 0 ? void 0 : _b.depthBuffer());
|
|
825
|
+
}
|
|
826
|
+
updateViewport() {
|
|
827
|
+
const rect = getMeasurementBoundingClientRect(this.hostEl);
|
|
828
|
+
this.viewport = new Viewport(rect.width, rect.height);
|
|
829
|
+
this.elementBounds = rect;
|
|
830
|
+
}
|
|
831
|
+
updatePropsFromJson() {
|
|
832
|
+
var _a, _b;
|
|
833
|
+
this.start = parseVector3((_a = this.startJson) !== null && _a !== void 0 ? _a : this.start);
|
|
834
|
+
this.end = parseVector3((_b = this.endJson) !== null && _b !== void 0 ? _b : this.end);
|
|
835
|
+
}
|
|
836
|
+
updateInteractionModel() {
|
|
837
|
+
this.model.setMeasurementFromValues(this.start, this.end, !this.invalid);
|
|
838
|
+
}
|
|
839
|
+
invalidateState() {
|
|
840
|
+
this.invalidateStateCounter = this.invalidateStateCounter + 1;
|
|
841
|
+
}
|
|
842
|
+
async addInteractionListeners(viewer) {
|
|
843
|
+
const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();
|
|
844
|
+
if (this.mode === 'replace') {
|
|
845
|
+
interactionTarget.addEventListener('pointermove', this.updateStartAnchor);
|
|
846
|
+
interactionTarget.addEventListener('pointerdown', this.newMeasurement);
|
|
847
|
+
interactionTarget.addEventListener('pointerleave', this.clearIndicator);
|
|
848
|
+
}
|
|
849
|
+
}
|
|
850
|
+
async removeInteractionListeners(viewer) {
|
|
851
|
+
const interactionTarget = await viewer.getInteractionTarget_DEPRECATED();
|
|
852
|
+
interactionTarget.removeEventListener('pointermove', this.updateStartAnchor);
|
|
853
|
+
interactionTarget.removeEventListener('pointerdown', this.newMeasurement);
|
|
854
|
+
interactionTarget.removeEventListener('pointerleave', this.clearIndicator);
|
|
855
|
+
}
|
|
856
|
+
handleEditAnchor(anchor) {
|
|
857
|
+
if (this.mode === 'edit' || this.mode === 'replace') {
|
|
858
|
+
const handlePointerMove = this.createInteractionMoveHandler();
|
|
859
|
+
const handlePointerUp = async (event) => {
|
|
860
|
+
var _a;
|
|
861
|
+
const hits = this.getHitProvider();
|
|
862
|
+
if (hits != null) {
|
|
863
|
+
window.removeEventListener('pointermove', handlePointerMove);
|
|
864
|
+
window.removeEventListener('pointerup', handlePointerUp);
|
|
865
|
+
const pt = getMouseClientPosition(event, this.elementBounds);
|
|
866
|
+
const snapPt = this.snapPoint(pt, event);
|
|
867
|
+
await ((_a = this.interaction) === null || _a === void 0 ? void 0 : _a.finish(snapPt, hits));
|
|
868
|
+
this.updateMeasurementPropsFromModel();
|
|
869
|
+
this.endEditing();
|
|
870
|
+
}
|
|
871
|
+
};
|
|
872
|
+
return (event) => {
|
|
873
|
+
this.getStencilBuffer();
|
|
874
|
+
if (event.button === 0) {
|
|
875
|
+
this.beginEditing('edit', anchor);
|
|
876
|
+
this.interaction = this.controller.editMeasurement(anchor);
|
|
877
|
+
window.addEventListener('pointermove', handlePointerMove);
|
|
878
|
+
window.addEventListener('pointerup', handlePointerUp);
|
|
879
|
+
}
|
|
880
|
+
};
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
createInteractionMoveHandler() {
|
|
884
|
+
return (event) => {
|
|
885
|
+
var _a;
|
|
886
|
+
const hits = this.getHitProvider();
|
|
887
|
+
if (this.elementBounds != null && hits != null) {
|
|
888
|
+
event.preventDefault();
|
|
889
|
+
this.getStencilBuffer();
|
|
890
|
+
const pt = getMouseClientPosition(event, this.elementBounds);
|
|
891
|
+
const snapPt = this.snapPoint(pt, event);
|
|
892
|
+
(_a = this.interaction) === null || _a === void 0 ? void 0 : _a.update(snapPt, hits);
|
|
893
|
+
this.updateMeasurementPropsFromModel();
|
|
894
|
+
}
|
|
895
|
+
};
|
|
896
|
+
}
|
|
897
|
+
async getStencilBuffer() {
|
|
898
|
+
var _a;
|
|
899
|
+
const stencil = await ((_a = this.viewer) === null || _a === void 0 ? void 0 : _a.stencilBuffer.latestAfterInteraction());
|
|
900
|
+
this.stateMap.stencil = stencil;
|
|
901
|
+
}
|
|
902
|
+
snapPoint(pt, event) {
|
|
903
|
+
const hits = this.getHitProvider();
|
|
904
|
+
if (hits != null && !event.shiftKey) {
|
|
905
|
+
const snapDistance = Math.max(0, this.snapDistance);
|
|
906
|
+
return hits.hitTester().snapToNearestPixel(pt, snapDistance);
|
|
907
|
+
}
|
|
908
|
+
return pt;
|
|
909
|
+
}
|
|
910
|
+
formatDistance(distance) {
|
|
911
|
+
const dist = distance != null
|
|
912
|
+
? this.measurementUnits.convertWorldValueToReal(distance)
|
|
913
|
+
: undefined;
|
|
914
|
+
if (this.labelFormatter != null) {
|
|
915
|
+
return this.labelFormatter(dist);
|
|
916
|
+
}
|
|
917
|
+
else {
|
|
918
|
+
const abbreviated = this.measurementUnits.unit.abbreviatedName;
|
|
919
|
+
return dist == null
|
|
920
|
+
? '---'
|
|
921
|
+
: `~${dist.toFixed(this.fractionalDigits)} ${abbreviated}`;
|
|
922
|
+
}
|
|
923
|
+
}
|
|
924
|
+
beginEditing(type, anchor) {
|
|
925
|
+
if (this.interactionCount === 0) {
|
|
926
|
+
this.interactingAnchor = anchor;
|
|
927
|
+
this.editBegin.emit({ type, anchor });
|
|
928
|
+
}
|
|
929
|
+
this.interactionCount = this.interactionCount + 1;
|
|
930
|
+
}
|
|
931
|
+
endEditing() {
|
|
932
|
+
if (this.interactionCount === 1) {
|
|
933
|
+
const measurement = this.model.getMeasurement();
|
|
934
|
+
this.interactingAnchor = 'none';
|
|
935
|
+
this.updateMeasurementModel();
|
|
936
|
+
if (measurement != null) {
|
|
937
|
+
this.editEnd.emit(measurement);
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
this.interactionCount = this.interactionCount - 1;
|
|
941
|
+
}
|
|
942
|
+
updateMeasurementModel() {
|
|
943
|
+
this.measurementModel.clearOutcome();
|
|
944
|
+
if (!this.invalid && this.start != null && this.end != null) {
|
|
945
|
+
this.measurementModel.setOutcome({
|
|
946
|
+
isApproximate: true,
|
|
947
|
+
results: [makeMinimumDistanceResult(this.start, this.end)],
|
|
948
|
+
});
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
getHitProvider() {
|
|
952
|
+
if (this.hitProvider == null) {
|
|
953
|
+
const hitTester = this.getHitTester();
|
|
954
|
+
const viewer = this.viewer;
|
|
955
|
+
if (viewer != null && hitTester != null) {
|
|
956
|
+
return {
|
|
957
|
+
hitTester: () => hitTester,
|
|
958
|
+
raycaster: async () => (await viewer.scene()).raycaster(),
|
|
959
|
+
};
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
else
|
|
963
|
+
return this.hitProvider;
|
|
964
|
+
}
|
|
965
|
+
getHitTester() {
|
|
966
|
+
const { stencil, depthBuffer } = this.stateMap;
|
|
967
|
+
if (depthBuffer != null) {
|
|
968
|
+
return new PointToPointHitTester(stencil, depthBuffer, this.viewport, this.internalCamera);
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
updateMeasurementPropsFromModel() {
|
|
972
|
+
const measurement = this.model.getMeasurement();
|
|
973
|
+
this.start = measurement === null || measurement === void 0 ? void 0 : measurement.start;
|
|
974
|
+
this.end = measurement === null || measurement === void 0 ? void 0 : measurement.end;
|
|
975
|
+
this.distance = measurement === null || measurement === void 0 ? void 0 : measurement.distance;
|
|
976
|
+
this.invalid = measurement != null && !measurement.valid;
|
|
977
|
+
}
|
|
978
|
+
updateIndicator(pt) {
|
|
979
|
+
var _a;
|
|
980
|
+
const hits = this.getHitProvider();
|
|
981
|
+
const clearCursor = hits == null || !this.controller.moveIndicator(pt, hits);
|
|
982
|
+
if (clearCursor) {
|
|
983
|
+
(_a = this.stateMap.hoverCursor) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
984
|
+
}
|
|
985
|
+
else {
|
|
986
|
+
this.setCursor(measurementCursor);
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
warnIfDepthBuffersDisabled() {
|
|
990
|
+
if (this.viewer != null && this.viewer.depthBuffers == null) {
|
|
991
|
+
console.warn('Measurement editing is disabled. <vertex-viewer> must have its `depth-buffers` attribute set.');
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
get hostEl() { return this; }
|
|
995
|
+
static get watchers() { return {
|
|
996
|
+
"viewer": ["handleViewerChanged"],
|
|
997
|
+
"units": ["handleUnitsChanged"],
|
|
998
|
+
"camera": ["handleCameraChanged"],
|
|
999
|
+
"mode": ["handleModeChanged"],
|
|
1000
|
+
"start": ["handleStartChanged"],
|
|
1001
|
+
"end": ["handleEndChanged"],
|
|
1002
|
+
"invalid": ["handleInvalidChanged"]
|
|
1003
|
+
}; }
|
|
1004
|
+
static get style() { return viewerMeasurementDistanceCss; }
|
|
1005
|
+
}, [1, "vertex-viewer-measurement-distance", {
|
|
1006
|
+
"start": [1040],
|
|
1007
|
+
"startJson": [1, "start-json"],
|
|
1008
|
+
"end": [1040],
|
|
1009
|
+
"endJson": [1, "end-json"],
|
|
1010
|
+
"distance": [1026],
|
|
1011
|
+
"showAxisReferenceLines": [4, "show-axis-reference-lines"],
|
|
1012
|
+
"snapDistance": [2, "snap-distance"],
|
|
1013
|
+
"units": [1],
|
|
1014
|
+
"fractionalDigits": [2, "fractional-digits"],
|
|
1015
|
+
"labelFormatter": [16],
|
|
1016
|
+
"anchorLabelOffset": [2, "anchor-label-offset"],
|
|
1017
|
+
"lineCapLength": [2, "line-cap-length"],
|
|
1018
|
+
"mode": [513],
|
|
1019
|
+
"interactingAnchor": [1537, "interacting-anchor"],
|
|
1020
|
+
"invalid": [1540],
|
|
1021
|
+
"camera": [16],
|
|
1022
|
+
"hitProvider": [16],
|
|
1023
|
+
"indicatorPt": [1040],
|
|
1024
|
+
"viewer": [16],
|
|
1025
|
+
"measurementModel": [16],
|
|
1026
|
+
"viewport": [32],
|
|
1027
|
+
"elementBounds": [32],
|
|
1028
|
+
"interactionCount": [32],
|
|
1029
|
+
"internalCamera": [32],
|
|
1030
|
+
"invalidateStateCounter": [32],
|
|
1031
|
+
"stateMap": [32],
|
|
1032
|
+
"measurementUnits": [32],
|
|
1033
|
+
"computeElementMetrics": [64]
|
|
1034
|
+
}]);
|
|
1035
|
+
function parseVector3(value) {
|
|
1036
|
+
return typeof value === 'string' ? vector3.fromJson(value) : value;
|
|
1037
|
+
}
|
|
1038
|
+
function defineCustomElement$1() {
|
|
1039
|
+
if (typeof customElements === "undefined") {
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
const components = ["vertex-viewer-measurement-distance", "vertex-viewer-measurement-line", "vertex-viewer-measurement-overlays"];
|
|
1043
|
+
components.forEach(tagName => { switch (tagName) {
|
|
1044
|
+
case "vertex-viewer-measurement-distance":
|
|
1045
|
+
if (!customElements.get(tagName)) {
|
|
1046
|
+
customElements.define(tagName, ViewerMeasurementDistance);
|
|
1047
|
+
}
|
|
1048
|
+
break;
|
|
1049
|
+
case "vertex-viewer-measurement-line":
|
|
1050
|
+
if (!customElements.get(tagName)) {
|
|
1051
|
+
defineCustomElement$3();
|
|
1052
|
+
}
|
|
1053
|
+
break;
|
|
1054
|
+
case "vertex-viewer-measurement-overlays":
|
|
1055
|
+
if (!customElements.get(tagName)) {
|
|
1056
|
+
defineCustomElement$2();
|
|
1057
|
+
}
|
|
1058
|
+
break;
|
|
1059
|
+
} });
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
const VertexViewerMeasurementDistance = ViewerMeasurementDistance;
|
|
1063
|
+
const defineCustomElement = defineCustomElement$1;
|
|
1064
|
+
|
|
1065
|
+
export { VertexViewerMeasurementDistance, defineCustomElement };
|
|
1066
|
+
|
|
1067
|
+
//# sourceMappingURL=vertex-viewer-measurement-distance.js.map
|