@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.
Files changed (226) hide show
  1. package/dist/components/_commonjsHelpers.js +41 -0
  2. package/dist/components/_commonjsHelpers.js.map +1 -0
  3. package/dist/components/browser.esm.js +3173 -0
  4. package/dist/components/browser.esm.js.map +1 -0
  5. package/dist/components/bundle.esm.js +2250 -0
  6. package/dist/components/bundle.esm.js.map +1 -0
  7. package/dist/components/bundle.esm2.js +39740 -0
  8. package/dist/components/bundle.esm2.js.map +1 -0
  9. package/dist/components/config.js +81 -0
  10. package/dist/components/config.js.map +1 -0
  11. package/dist/components/controller.js +7627 -0
  12. package/dist/components/controller.js.map +1 -0
  13. package/dist/components/controller2.js +124 -0
  14. package/dist/components/controller2.js.map +1 -0
  15. package/dist/components/controller3.js +111 -0
  16. package/dist/components/controller3.js.map +1 -0
  17. package/dist/components/cursors.js +110 -0
  18. package/dist/components/cursors.js.map +1 -0
  19. package/dist/components/dom.js +43 -0
  20. package/dist/components/dom.js.map +1 -0
  21. package/dist/components/dom2.js +10 -0
  22. package/dist/components/dom2.js.map +1 -0
  23. package/dist/components/elementRectObserver.js +25 -0
  24. package/dist/components/elementRectObserver.js.map +1 -0
  25. package/dist/components/entities.js +179 -0
  26. package/dist/components/entities.js.map +1 -0
  27. package/dist/components/errors.js +80 -0
  28. package/dist/components/errors.js.map +1 -0
  29. package/dist/components/events.js +11 -0
  30. package/dist/components/events.js.map +1 -0
  31. package/dist/components/index.d.ts +26 -0
  32. package/dist/components/index.js +365 -0
  33. package/dist/components/index.js.map +1 -0
  34. package/dist/components/index2.js +63 -0
  35. package/dist/components/index2.js.map +1 -0
  36. package/dist/components/interactions.js +236 -0
  37. package/dist/components/interactions.js.map +1 -0
  38. package/dist/components/mapper.js +9811 -0
  39. package/dist/components/mapper.js.map +1 -0
  40. package/dist/components/markup.js +33 -0
  41. package/dist/components/markup.js.map +1 -0
  42. package/dist/components/model.js +134 -0
  43. package/dist/components/model.js.map +1 -0
  44. package/dist/components/model2.js +157 -0
  45. package/dist/components/model2.js.map +1 -0
  46. package/dist/components/overlays.js +76 -0
  47. package/dist/components/overlays.js.map +1 -0
  48. package/dist/components/png-decoder.js +2405 -0
  49. package/dist/components/png-decoder.js.map +1 -0
  50. package/dist/components/regl-component.js +12582 -0
  51. package/dist/components/regl-component.js.map +1 -0
  52. package/dist/components/results.js +24 -0
  53. package/dist/components/results.js.map +1 -0
  54. package/dist/components/row.js +32 -0
  55. package/dist/components/row.js.map +1 -0
  56. package/dist/components/scene-tree-search.js +146 -0
  57. package/dist/components/scene-tree-search.js.map +1 -0
  58. package/dist/components/scene-tree-table-layout.js +928 -0
  59. package/dist/components/scene-tree-table-layout.js.map +1 -0
  60. package/dist/components/scene-tree-toolbar.js +35 -0
  61. package/dist/components/scene-tree-toolbar.js.map +1 -0
  62. package/dist/components/scene.js +1508 -0
  63. package/dist/components/scene.js.map +1 -0
  64. package/dist/components/stencil.js +25 -0
  65. package/dist/components/stencil.js.map +1 -0
  66. package/dist/components/streamAttributes.js +40833 -0
  67. package/dist/components/streamAttributes.js.map +1 -0
  68. package/dist/components/templates.js +36 -0
  69. package/dist/components/templates.js.map +1 -0
  70. package/dist/components/tslib.es6.js +125 -0
  71. package/dist/components/tslib.es6.js.map +1 -0
  72. package/dist/components/vertex-scene-tree-search.d.ts +11 -0
  73. package/dist/components/vertex-scene-tree-search.js +11 -0
  74. package/dist/components/vertex-scene-tree-search.js.map +1 -0
  75. package/dist/components/vertex-scene-tree-table-cell.d.ts +11 -0
  76. package/dist/components/vertex-scene-tree-table-cell.js +209 -0
  77. package/dist/components/vertex-scene-tree-table-cell.js.map +1 -0
  78. package/dist/components/vertex-scene-tree-table-column.d.ts +11 -0
  79. package/dist/components/vertex-scene-tree-table-column.js +42 -0
  80. package/dist/components/vertex-scene-tree-table-column.js.map +1 -0
  81. package/dist/components/vertex-scene-tree-table-header.d.ts +11 -0
  82. package/dist/components/vertex-scene-tree-table-header.js +38 -0
  83. package/dist/components/vertex-scene-tree-table-header.js.map +1 -0
  84. package/dist/components/vertex-scene-tree-table-layout.d.ts +11 -0
  85. package/dist/components/vertex-scene-tree-table-layout.js +11 -0
  86. package/dist/components/vertex-scene-tree-table-layout.js.map +1 -0
  87. package/dist/components/vertex-scene-tree-table-resize-divider.d.ts +11 -0
  88. package/dist/components/vertex-scene-tree-table-resize-divider.js +57 -0
  89. package/dist/components/vertex-scene-tree-table-resize-divider.js.map +1 -0
  90. package/dist/components/vertex-scene-tree-toolbar-group.d.ts +11 -0
  91. package/dist/components/vertex-scene-tree-toolbar-group.js +38 -0
  92. package/dist/components/vertex-scene-tree-toolbar-group.js.map +1 -0
  93. package/dist/components/vertex-scene-tree-toolbar.d.ts +11 -0
  94. package/dist/components/vertex-scene-tree-toolbar.js +11 -0
  95. package/dist/components/vertex-scene-tree-toolbar.js.map +1 -0
  96. package/dist/components/vertex-scene-tree.d.ts +11 -0
  97. package/dist/components/vertex-scene-tree.js +803 -0
  98. package/dist/components/vertex-scene-tree.js.map +1 -0
  99. package/dist/components/vertex-viewer-box-query-tool.d.ts +11 -0
  100. package/dist/components/vertex-viewer-box-query-tool.js +352 -0
  101. package/dist/components/vertex-viewer-box-query-tool.js.map +1 -0
  102. package/dist/components/vertex-viewer-button.d.ts +11 -0
  103. package/dist/components/vertex-viewer-button.js +11 -0
  104. package/dist/components/vertex-viewer-button.js.map +1 -0
  105. package/dist/components/vertex-viewer-default-toolbar.d.ts +11 -0
  106. package/dist/components/vertex-viewer-default-toolbar.js +99 -0
  107. package/dist/components/vertex-viewer-default-toolbar.js.map +1 -0
  108. package/dist/components/vertex-viewer-dom-element.d.ts +11 -0
  109. package/dist/components/vertex-viewer-dom-element.js +11 -0
  110. package/dist/components/vertex-viewer-dom-element.js.map +1 -0
  111. package/dist/components/vertex-viewer-dom-group.d.ts +11 -0
  112. package/dist/components/vertex-viewer-dom-group.js +11 -0
  113. package/dist/components/vertex-viewer-dom-group.js.map +1 -0
  114. package/dist/components/vertex-viewer-dom-renderer.d.ts +11 -0
  115. package/dist/components/vertex-viewer-dom-renderer.js +11 -0
  116. package/dist/components/vertex-viewer-dom-renderer.js.map +1 -0
  117. package/dist/components/vertex-viewer-hit-result-indicator.d.ts +11 -0
  118. package/dist/components/vertex-viewer-hit-result-indicator.js +335 -0
  119. package/dist/components/vertex-viewer-hit-result-indicator.js.map +1 -0
  120. package/dist/components/vertex-viewer-icon.d.ts +11 -0
  121. package/dist/components/vertex-viewer-icon.js +11 -0
  122. package/dist/components/vertex-viewer-icon.js.map +1 -0
  123. package/dist/components/vertex-viewer-layer.d.ts +11 -0
  124. package/dist/components/vertex-viewer-layer.js +11 -0
  125. package/dist/components/vertex-viewer-layer.js.map +1 -0
  126. package/dist/components/vertex-viewer-markup-arrow.d.ts +11 -0
  127. package/dist/components/vertex-viewer-markup-arrow.js +11 -0
  128. package/dist/components/vertex-viewer-markup-arrow.js.map +1 -0
  129. package/dist/components/vertex-viewer-markup-circle.d.ts +11 -0
  130. package/dist/components/vertex-viewer-markup-circle.js +11 -0
  131. package/dist/components/vertex-viewer-markup-circle.js.map +1 -0
  132. package/dist/components/vertex-viewer-markup-freeform.d.ts +11 -0
  133. package/dist/components/vertex-viewer-markup-freeform.js +11 -0
  134. package/dist/components/vertex-viewer-markup-freeform.js.map +1 -0
  135. package/dist/components/vertex-viewer-markup-tool.d.ts +11 -0
  136. package/dist/components/vertex-viewer-markup-tool.js +257 -0
  137. package/dist/components/vertex-viewer-markup-tool.js.map +1 -0
  138. package/dist/components/vertex-viewer-markup.d.ts +11 -0
  139. package/dist/components/vertex-viewer-markup.js +362 -0
  140. package/dist/components/vertex-viewer-markup.js.map +1 -0
  141. package/dist/components/vertex-viewer-measurement-details.d.ts +11 -0
  142. package/dist/components/vertex-viewer-measurement-details.js +307 -0
  143. package/dist/components/vertex-viewer-measurement-details.js.map +1 -0
  144. package/dist/components/vertex-viewer-measurement-distance.d.ts +11 -0
  145. package/dist/components/vertex-viewer-measurement-distance.js +1067 -0
  146. package/dist/components/vertex-viewer-measurement-distance.js.map +1 -0
  147. package/dist/components/vertex-viewer-measurement-line.d.ts +11 -0
  148. package/dist/components/vertex-viewer-measurement-line.js +11 -0
  149. package/dist/components/vertex-viewer-measurement-line.js.map +1 -0
  150. package/dist/components/vertex-viewer-measurement-overlays.d.ts +11 -0
  151. package/dist/components/vertex-viewer-measurement-overlays.js +11 -0
  152. package/dist/components/vertex-viewer-measurement-overlays.js.map +1 -0
  153. package/dist/components/vertex-viewer-measurement-precise.d.ts +11 -0
  154. package/dist/components/vertex-viewer-measurement-precise.js +362 -0
  155. package/dist/components/vertex-viewer-measurement-precise.js.map +1 -0
  156. package/dist/components/vertex-viewer-pin-group.d.ts +11 -0
  157. package/dist/components/vertex-viewer-pin-group.js +11 -0
  158. package/dist/components/vertex-viewer-pin-group.js.map +1 -0
  159. package/dist/components/vertex-viewer-pin-label-line.d.ts +11 -0
  160. package/dist/components/vertex-viewer-pin-label-line.js +11 -0
  161. package/dist/components/vertex-viewer-pin-label-line.js.map +1 -0
  162. package/dist/components/vertex-viewer-pin-label.d.ts +11 -0
  163. package/dist/components/vertex-viewer-pin-label.js +11 -0
  164. package/dist/components/vertex-viewer-pin-label.js.map +1 -0
  165. package/dist/components/vertex-viewer-pin-tool.d.ts +11 -0
  166. package/dist/components/vertex-viewer-pin-tool.js +430 -0
  167. package/dist/components/vertex-viewer-pin-tool.js.map +1 -0
  168. package/dist/components/vertex-viewer-spinner.d.ts +11 -0
  169. package/dist/components/vertex-viewer-spinner.js +11 -0
  170. package/dist/components/vertex-viewer-spinner.js.map +1 -0
  171. package/dist/components/vertex-viewer-toolbar-group.d.ts +11 -0
  172. package/dist/components/vertex-viewer-toolbar-group.js +11 -0
  173. package/dist/components/vertex-viewer-toolbar-group.js.map +1 -0
  174. package/dist/components/vertex-viewer-toolbar.d.ts +11 -0
  175. package/dist/components/vertex-viewer-toolbar.js +11 -0
  176. package/dist/components/vertex-viewer-toolbar.js.map +1 -0
  177. package/dist/components/vertex-viewer-transform-widget.d.ts +11 -0
  178. package/dist/components/vertex-viewer-transform-widget.js +838 -0
  179. package/dist/components/vertex-viewer-transform-widget.js.map +1 -0
  180. package/dist/components/vertex-viewer-view-cube.d.ts +11 -0
  181. package/dist/components/vertex-viewer-view-cube.js +270 -0
  182. package/dist/components/vertex-viewer-view-cube.js.map +1 -0
  183. package/dist/components/vertex-viewer.d.ts +11 -0
  184. package/dist/components/vertex-viewer.js +3543 -0
  185. package/dist/components/vertex-viewer.js.map +1 -0
  186. package/dist/components/viewer-button.js +35 -0
  187. package/dist/components/viewer-button.js.map +1 -0
  188. package/dist/components/viewer-dom-element.js +250 -0
  189. package/dist/components/viewer-dom-element.js.map +1 -0
  190. package/dist/components/viewer-dom-group.js +214 -0
  191. package/dist/components/viewer-dom-group.js.map +1 -0
  192. package/dist/components/viewer-dom-renderer.js +295 -0
  193. package/dist/components/viewer-dom-renderer.js.map +1 -0
  194. package/dist/components/viewer-icon.js +87 -0
  195. package/dist/components/viewer-icon.js.map +1 -0
  196. package/dist/components/viewer-layer.js +46 -0
  197. package/dist/components/viewer-layer.js.map +1 -0
  198. package/dist/components/viewer-markup-arrow.js +235 -0
  199. package/dist/components/viewer-markup-arrow.js.map +1 -0
  200. package/dist/components/viewer-markup-circle-components.js +42 -0
  201. package/dist/components/viewer-markup-circle-components.js.map +1 -0
  202. package/dist/components/viewer-markup-circle.js +201 -0
  203. package/dist/components/viewer-markup-circle.js.map +1 -0
  204. package/dist/components/viewer-markup-freeform.js +251 -0
  205. package/dist/components/viewer-markup-freeform.js.map +1 -0
  206. package/dist/components/viewer-measurement-line.js +77 -0
  207. package/dist/components/viewer-measurement-line.js.map +1 -0
  208. package/dist/components/viewer-measurement-overlays.js +184 -0
  209. package/dist/components/viewer-measurement-overlays.js.map +1 -0
  210. package/dist/components/viewer-pin-group.js +207 -0
  211. package/dist/components/viewer-pin-group.js.map +1 -0
  212. package/dist/components/viewer-pin-label-line.js +43 -0
  213. package/dist/components/viewer-pin-label-line.js.map +1 -0
  214. package/dist/components/viewer-pin-label.js +427 -0
  215. package/dist/components/viewer-pin-label.js.map +1 -0
  216. package/dist/components/viewer-spinner.js +53 -0
  217. package/dist/components/viewer-spinner.js.map +1 -0
  218. package/dist/components/viewer-toolbar-group.js +42 -0
  219. package/dist/components/viewer-toolbar-group.js.map +1 -0
  220. package/dist/components/viewer-toolbar.js +61 -0
  221. package/dist/components/viewer-toolbar.js.map +1 -0
  222. package/dist/components/viewport.js +188 -0
  223. package/dist/components/viewport.js.map +1 -0
  224. package/dist/components/wrappers_pb.js +1926 -0
  225. package/dist/components/wrappers_pb.js.map +1 -0
  226. 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