@vertexvis/viewer 0.12.0 → 0.13.0-canary.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 (225) hide show
  1. package/dist/cjs/{config-acd7cea9.js → config-90ee43d5.js} +1 -1
  2. package/dist/cjs/{cursors-399a9648.js → cursors-ad2fd395.js} +7 -0
  3. package/dist/cjs/{controller-8cbcdd8d.js → entities-aa59890e.js} +57 -22
  4. package/dist/cjs/{index-cc65325e.js → index-e100709a.js} +64 -3
  5. package/dist/cjs/index.cjs.js +21 -11
  6. package/dist/cjs/loader.cjs.js +2 -2
  7. package/dist/cjs/{model-18ef3363.js → mapper-f6e6cafe.js} +37 -191
  8. package/dist/cjs/model-4ec0c36e.js +134 -0
  9. package/dist/cjs/overlays-8a582edf.js +76 -0
  10. package/dist/cjs/results-bc325974.js +24 -0
  11. package/dist/cjs/{scene-ffee07ee.js → scene-f4040800.js} +1 -1
  12. package/dist/cjs/{stencil-bd453a38.js → stencil-a664cd10.js} +1 -1
  13. package/dist/cjs/{streamAttributes-9d6226ac.js → streamAttributes-d6236448.js} +87 -30
  14. package/dist/cjs/vertex-scene-tree-search_3.cjs.entry.js +2 -2
  15. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +1 -1
  16. package/dist/cjs/vertex-scene-tree-table-column.cjs.entry.js +1 -1
  17. package/dist/cjs/vertex-scene-tree-table-header.cjs.entry.js +1 -1
  18. package/dist/cjs/vertex-scene-tree-table-resize-divider.cjs.entry.js +1 -1
  19. package/dist/cjs/vertex-scene-tree-toolbar-group.cjs.entry.js +1 -1
  20. package/dist/cjs/vertex-scene-tree.cjs.entry.js +3 -3
  21. package/dist/cjs/vertex-viewer-button_3.cjs.entry.js +1 -1
  22. package/dist/cjs/vertex-viewer-default-toolbar.cjs.entry.js +1 -1
  23. package/dist/cjs/vertex-viewer-dom-element_3.cjs.entry.js +4 -4
  24. package/dist/cjs/vertex-viewer-icon.cjs.entry.js +1 -1
  25. package/dist/cjs/vertex-viewer-layer.cjs.entry.js +1 -1
  26. package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js +1 -1
  27. package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js +1 -1
  28. package/dist/cjs/vertex-viewer-markup.cjs.entry.js +1 -1
  29. package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js +221 -75
  30. package/dist/cjs/{vertex-viewer-measurement-distance_2.cjs.entry.js → vertex-viewer-measurement-distance.cjs.entry.js} +30 -69
  31. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +170 -0
  32. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js +163 -55
  33. package/dist/cjs/vertex-viewer-measurement-tool.cjs.entry.js +2 -2
  34. package/dist/cjs/vertex-viewer-measurements.cjs.entry.js +33 -4
  35. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +4 -4
  36. package/dist/cjs/vertex-viewer.cjs.entry.js +58 -10
  37. package/dist/cjs/viewer.cjs.js +2 -2
  38. package/dist/cjs/{viewport-51aa05ab.js → viewport-8c39089f.js} +11 -0
  39. package/dist/collection/collection-manifest.json +1 -0
  40. package/dist/collection/components/viewer/viewer.js +2 -2
  41. package/dist/collection/components/viewer-dom-renderer/viewer-dom-renderer.js +2 -2
  42. package/dist/collection/components/viewer-measurement-details/viewer-measurement-details-entry.js +14 -0
  43. package/dist/collection/components/viewer-measurement-details/viewer-measurement-details-results.js +22 -0
  44. package/dist/collection/components/viewer-measurement-details/viewer-measurement-details.css +3 -10
  45. package/dist/collection/components/viewer-measurement-details/viewer-measurement-details.js +125 -188
  46. package/dist/collection/components/viewer-measurement-distance/interactions.js +3 -14
  47. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js +41 -1
  48. package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays-components.js +30 -0
  49. package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.css +51 -0
  50. package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.js +149 -0
  51. package/dist/collection/components/viewer-measurement-precise/viewer-measurement-precise.js +118 -26
  52. package/dist/collection/components/viewer-measurements/viewer-measurements.js +67 -2
  53. package/dist/collection/components/viewer-view-cube/viewer-view-cube.css +21 -3
  54. package/dist/collection/index.js +2 -2
  55. package/dist/collection/lib/cursors.js +7 -1
  56. package/dist/collection/lib/elementRectObserver.js +19 -0
  57. package/dist/collection/lib/interactions/interactionApi.js +53 -4
  58. package/dist/collection/lib/mappers/frameStreaming.js +2 -4
  59. package/dist/collection/lib/measurement/controller.js +21 -17
  60. package/dist/collection/lib/measurement/entities.js +34 -0
  61. package/dist/collection/lib/measurement/index.js +4 -2
  62. package/dist/collection/lib/measurement/interactions.js +74 -28
  63. package/dist/collection/lib/measurement/mapper.js +5 -5
  64. package/dist/collection/lib/measurement/model.js +24 -85
  65. package/dist/collection/lib/measurement/outcomes.js +2 -0
  66. package/dist/collection/lib/measurement/overlays.js +69 -0
  67. package/dist/collection/lib/measurement/results.js +17 -0
  68. package/dist/collection/lib/types/entities.js +5 -1
  69. package/dist/collection/lib/types/featureMap.js +14 -5
  70. package/dist/collection/lib/types/frame.js +3 -3
  71. package/dist/collection/lib/types/measurementUnits.js +7 -7
  72. package/dist/collection/lib/types/viewport.js +12 -1
  73. package/dist/collection/testing/eventually.js +30 -0
  74. package/dist/collection/testing/fixtures.js +11 -4
  75. package/dist/collection/testing/index.js +2 -1
  76. package/dist/custom-elements/index.d.ts +6 -0
  77. package/dist/custom-elements/index.js +851 -287
  78. package/dist/esm/{browser.esm-e6827921.js → browser.esm-59e914f6.js} +1 -1
  79. package/dist/esm/{bundle.esm-8f14ac60.js → bundle.esm-d899b2d5.js} +1 -1
  80. package/dist/esm/{config-a200c227.js → config-604c644e.js} +2 -2
  81. package/dist/esm/{cursors-5157d29d.js → cursors-a7ec4adb.js} +8 -2
  82. package/dist/esm/{dom-2d6a1e1e.js → dom-780d25be.js} +1 -1
  83. package/dist/esm/{controller-a756cf9c.js → entities-759d97cd.js} +52 -18
  84. package/dist/esm/{index-f0053642.js → index-10c1495a.js} +64 -3
  85. package/dist/esm/index.js +13 -11
  86. package/dist/esm/index.mjs +13 -11
  87. package/dist/esm/loader.js +2 -2
  88. package/dist/esm/loader.mjs +2 -2
  89. package/dist/esm/{model-f711a825.js → mapper-4b815e31.js} +37 -190
  90. package/dist/esm/{markup-e46623b3.js → markup-1d177b4a.js} +2 -2
  91. package/dist/esm/{measurement-702d6b8c.js → measurement-12cdbf5c.js} +2 -2
  92. package/dist/esm/model-e5a4f00f.js +132 -0
  93. package/dist/esm/overlays-dbe5d652.js +74 -0
  94. package/dist/esm/{png-decoder-59a0e9c2.js → png-decoder-3f1fa486.js} +1 -1
  95. package/dist/esm/results-994bdb50.js +22 -0
  96. package/dist/esm/{scene-16490983.js → scene-9ac8a484.js} +3 -3
  97. package/dist/esm/{stencil-7d04d41a.js → stencil-9bf7fb9e.js} +1 -1
  98. package/dist/esm/{streamAttributes-7aa486b2.js → streamAttributes-d623bb60.js} +77 -20
  99. package/dist/esm/{utils-8070900a.js → utils-01e4f587.js} +1 -1
  100. package/dist/esm/{utils-953a1619.js → utils-5e57bf24.js} +1 -1
  101. package/dist/esm/vertex-scene-tree-search_3.entry.js +3 -3
  102. package/dist/esm/vertex-scene-tree-table-cell.entry.js +1 -1
  103. package/dist/esm/vertex-scene-tree-table-column.entry.js +1 -1
  104. package/dist/esm/vertex-scene-tree-table-header.entry.js +1 -1
  105. package/dist/esm/vertex-scene-tree-table-resize-divider.entry.js +1 -1
  106. package/dist/esm/vertex-scene-tree-toolbar-group.entry.js +1 -1
  107. package/dist/esm/vertex-scene-tree.entry.js +5 -5
  108. package/dist/esm/vertex-viewer-button_3.entry.js +1 -1
  109. package/dist/esm/vertex-viewer-default-toolbar.entry.js +1 -1
  110. package/dist/esm/vertex-viewer-dom-element_3.entry.js +6 -6
  111. package/dist/esm/vertex-viewer-icon.entry.js +1 -1
  112. package/dist/esm/vertex-viewer-layer.entry.js +1 -1
  113. package/dist/esm/vertex-viewer-markup-arrow_3.entry.js +4 -4
  114. package/dist/esm/vertex-viewer-markup-tool.entry.js +5 -5
  115. package/dist/esm/vertex-viewer-markup.entry.js +5 -5
  116. package/dist/esm/vertex-viewer-measurement-details.entry.js +221 -75
  117. package/dist/esm/{vertex-viewer-measurement-distance_2.entry.js → vertex-viewer-measurement-distance.entry.js} +35 -73
  118. package/dist/esm/vertex-viewer-measurement-line_2.entry.js +165 -0
  119. package/dist/esm/vertex-viewer-measurement-precise.entry.js +160 -52
  120. package/dist/esm/vertex-viewer-measurement-tool.entry.js +6 -6
  121. package/dist/esm/vertex-viewer-measurements.entry.js +36 -7
  122. package/dist/esm/vertex-viewer-view-cube.entry.js +6 -6
  123. package/dist/esm/vertex-viewer.entry.js +61 -13
  124. package/dist/esm/viewer.js +2 -2
  125. package/dist/esm/{viewport-bb7c46d9.js → viewport-01c886ea.js} +12 -1
  126. package/dist/types/components/viewer-dom-renderer/viewer-dom-renderer.d.ts +1 -1
  127. package/dist/types/components/viewer-measurement-details/viewer-measurement-details-entry.d.ts +8 -0
  128. package/dist/types/components/viewer-measurement-details/viewer-measurement-details-results.d.ts +15 -0
  129. package/dist/types/components/viewer-measurement-details/viewer-measurement-details.d.ts +44 -42
  130. package/dist/types/components/viewer-measurement-distance/interactions.d.ts +23 -1
  131. package/dist/types/components/viewer-measurement-distance/viewer-measurement-distance.d.ts +8 -0
  132. package/dist/types/components/viewer-measurement-overlays/viewer-measurement-overlays-components.d.ts +10 -0
  133. package/dist/types/components/viewer-measurement-overlays/viewer-measurement-overlays.d.ts +41 -0
  134. package/dist/types/components/viewer-measurement-precise/viewer-measurement-precise.d.ts +62 -6
  135. package/dist/types/components/viewer-measurements/viewer-measurements.d.ts +12 -0
  136. package/dist/types/components.d.ts +103 -40
  137. package/dist/types/index.d.ts +1 -1
  138. package/dist/types/lib/cursors.d.ts +5 -0
  139. package/dist/types/lib/elementRectObserver.d.ts +8 -0
  140. package/dist/types/lib/interactions/interactionApi.d.ts +32 -5
  141. package/dist/types/lib/measurement/controller.d.ts +8 -7
  142. package/dist/types/lib/measurement/entities.d.ts +10 -0
  143. package/dist/types/lib/measurement/index.d.ts +3 -1
  144. package/dist/types/lib/measurement/interactions.d.ts +19 -5
  145. package/dist/types/lib/measurement/mapper.d.ts +1 -1
  146. package/dist/types/lib/measurement/model.d.ts +18 -153
  147. package/dist/types/lib/measurement/outcomes.d.ts +8 -0
  148. package/dist/types/lib/measurement/overlays.d.ts +38 -0
  149. package/dist/types/lib/measurement/results.d.ts +90 -0
  150. package/dist/types/lib/types/entities.d.ts +5 -1
  151. package/dist/types/lib/types/featureMap.d.ts +2 -2
  152. package/dist/types/lib/types/measurementUnits.d.ts +1 -1
  153. package/dist/types/lib/types/viewport.d.ts +9 -1
  154. package/dist/types/testing/eventually.d.ts +15 -0
  155. package/dist/types/testing/fixtures.d.ts +2 -2
  156. package/dist/types/testing/index.d.ts +1 -0
  157. package/dist/viewer/index.esm.js +1 -1
  158. package/dist/viewer/p-081e6873.js +4 -0
  159. package/dist/viewer/{p-5d82c131.entry.js → p-099fe6ca.entry.js} +1 -1
  160. package/dist/viewer/{p-784914e4.js → p-0aba71fd.js} +1 -1
  161. package/dist/viewer/p-0aeab3fc.js +4 -0
  162. package/dist/viewer/p-0eb195dd.entry.js +4 -0
  163. package/dist/viewer/p-1a7df99a.entry.js +4 -0
  164. package/dist/viewer/{p-f70d8def.js → p-301660cf.js} +1 -1
  165. package/dist/viewer/{p-a0e49d10.entry.js → p-31658489.entry.js} +1 -1
  166. package/dist/viewer/{p-95f3a81c.entry.js → p-353cfc7a.entry.js} +1 -1
  167. package/dist/viewer/p-364ce21c.js +4 -0
  168. package/dist/viewer/{p-a5a0bf86.js → p-3f6ac74f.js} +1 -1
  169. package/dist/viewer/p-423410be.js +4 -0
  170. package/dist/viewer/{p-6f71f0f2.js → p-439220c6.js} +1 -1
  171. package/dist/viewer/{p-e84ed098.entry.js → p-46459921.entry.js} +1 -1
  172. package/dist/viewer/{p-c23a8b34.entry.js → p-4717c98e.entry.js} +1 -1
  173. package/dist/viewer/p-4985fad5.js +4 -0
  174. package/dist/viewer/{p-ba393340.entry.js → p-61b1097b.entry.js} +1 -1
  175. package/dist/viewer/{p-011eecd5.entry.js → p-6370098c.entry.js} +1 -1
  176. package/dist/viewer/p-67446e35.js +4 -0
  177. package/dist/viewer/p-7006fd4e.entry.js +4 -0
  178. package/dist/viewer/{p-a20e4ea1.entry.js → p-70ca1ea7.entry.js} +1 -1
  179. package/dist/viewer/p-76ec0245.js +4 -0
  180. package/dist/viewer/p-7cad9bf4.js +4 -0
  181. package/dist/viewer/p-7f25dcb5.entry.js +4 -0
  182. package/dist/viewer/{p-ca6bbe53.entry.js → p-8decee06.entry.js} +1 -1
  183. package/dist/viewer/{p-b7ffa306.entry.js → p-915d95ad.entry.js} +1 -1
  184. package/dist/viewer/{p-4485ac6d.js → p-a0df0e0c.js} +1 -1
  185. package/dist/viewer/{p-cc9888be.entry.js → p-a455ae02.entry.js} +1 -1
  186. package/dist/viewer/{p-a6a8026f.js → p-acf22d3e.js} +1 -1
  187. package/dist/viewer/{p-653aca1b.entry.js → p-b2b48a42.entry.js} +1 -1
  188. package/dist/viewer/p-bc9b1e67.entry.js +4 -0
  189. package/dist/viewer/p-c458f191.entry.js +32 -0
  190. package/dist/viewer/p-cafa57a6.js +4 -0
  191. package/dist/viewer/p-d00e9203.js +4 -0
  192. package/dist/viewer/{p-3e96bd62.entry.js → p-d2bcf788.entry.js} +1 -1
  193. package/dist/viewer/p-d90f2f6d.entry.js +4 -0
  194. package/dist/viewer/p-da2f4a56.js +4 -0
  195. package/dist/viewer/{p-5a2e34e1.entry.js → p-e07377fa.entry.js} +1 -1
  196. package/dist/viewer/{p-40800e8d.entry.js → p-f755af5a.entry.js} +1 -1
  197. package/dist/viewer/p-f7cb7e59.js +4 -0
  198. package/dist/viewer/p-fad9693e.js +4 -0
  199. package/dist/viewer/p-fe11d694.js +4 -0
  200. package/dist/viewer/{p-b92a3ac2.entry.js → p-fec1a8d0.entry.js} +1 -1
  201. package/dist/viewer/viewer.css +1 -1
  202. package/dist/viewer/viewer.esm.js +1 -1
  203. package/package.json +11 -10
  204. package/dist/cjs/summary-7bbdb4c9.js +0 -45
  205. package/dist/collection/lib/measurement/summary.js +0 -38
  206. package/dist/esm/summary-0a3d0bf9.js +0 -43
  207. package/dist/types/lib/measurement/summary.d.ts +0 -11
  208. package/dist/viewer/p-03e482ff.js +0 -4
  209. package/dist/viewer/p-0c052bc8.entry.js +0 -4
  210. package/dist/viewer/p-148cd792.js +0 -4
  211. package/dist/viewer/p-26d99e2d.entry.js +0 -4
  212. package/dist/viewer/p-38eeacc5.js +0 -4
  213. package/dist/viewer/p-39d1720c.js +0 -4
  214. package/dist/viewer/p-5dc17b8b.js +0 -4
  215. package/dist/viewer/p-5fea3491.js +0 -4
  216. package/dist/viewer/p-6b700561.entry.js +0 -4
  217. package/dist/viewer/p-6cd7a6e0.js +0 -4
  218. package/dist/viewer/p-75337d0b.js +0 -4
  219. package/dist/viewer/p-b83cc8a9.js +0 -4
  220. package/dist/viewer/p-d2a9e047.js +0 -4
  221. package/dist/viewer/p-d40bd835.entry.js +0 -4
  222. package/dist/viewer/p-e10b1526.js +0 -4
  223. package/dist/viewer/p-ec8a1a68.entry.js +0 -4
  224. package/dist/viewer/p-f4a8c901.js +0 -4
  225. package/dist/viewer/p-f77dde26.entry.js +0 -4
@@ -35,15 +35,15 @@ function __extends(d, b) {
35
35
  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
36
36
  }
37
37
 
38
- var __assign = function() {
39
- __assign = Object.assign || function __assign(t) {
38
+ var __assign$2 = function() {
39
+ __assign$2 = Object.assign || function __assign(t) {
40
40
  for (var s, i = 1, n = arguments.length; i < n; i++) {
41
41
  s = arguments[i];
42
42
  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
43
43
  }
44
44
  return t;
45
45
  };
46
- return __assign.apply(this, arguments);
46
+ return __assign$2.apply(this, arguments);
47
47
  };
48
48
 
49
49
  function __rest(s, e) {
@@ -2680,7 +2680,7 @@ function defaults() {
2680
2680
  objects[_i] = arguments[_i];
2681
2681
  }
2682
2682
  var _a = __read(objects), a = _a[0], other = _a.slice(1);
2683
- var result = __assign({}, a);
2683
+ var result = __assign$2({}, a);
2684
2684
  if (other.length === 0) {
2685
2685
  return result;
2686
2686
  }
@@ -2753,7 +2753,7 @@ function fromPairs(pairs) {
2753
2753
  return pairs.reduce(function (result, pair) {
2754
2754
  var _a;
2755
2755
  if (pair != null) {
2756
- return __assign(__assign({}, result), (_a = {}, _a[pair[0]] = pair[1], _a));
2756
+ return __assign$2(__assign$2({}, result), (_a = {}, _a[pair[0]] = pair[1], _a));
2757
2757
  }
2758
2758
  else {
2759
2759
  return result;
@@ -2845,7 +2845,7 @@ var isEqual$4 = function (a, b) {
2845
2845
  };
2846
2846
  var replacePath = function (path, uri) {
2847
2847
  var pathWithForwardSlash = path[0] === '/' ? path : "/".concat(path);
2848
- return __assign(__assign({}, uri), { path: pathWithForwardSlash });
2848
+ return __assign$2(__assign$2({}, uri), { path: pathWithForwardSlash });
2849
2849
  };
2850
2850
  var pathAsArray = function (uri) {
2851
2851
  return uri.path != null ? sanitizePath(uri.path.split('/')) : [];
@@ -2862,7 +2862,7 @@ var addQueryString = function (query, uri) {
2862
2862
  var addQueryEntry = function (query, uri) {
2863
2863
  if (query[1] != null) {
2864
2864
  var newQuery = __spreadArray(__spreadArray([], __read(queryAsArray(uri)), false), [query], false);
2865
- return __assign(__assign({}, uri), { query: newQuery
2865
+ return __assign$2(__assign$2({}, uri), { query: newQuery
2866
2866
  .map(function (entry) { return entry.map(encodeURIComponent).join('='); })
2867
2867
  .join('&') });
2868
2868
  }
@@ -2877,7 +2877,7 @@ var addQueryParams = function (params, uri) {
2877
2877
  return mapAsEntries(params).reduce(function (result, entry) { return addQueryEntry(entry, result); }, uri);
2878
2878
  };
2879
2879
  var replaceFragment = function (fragment, uri) {
2880
- return __assign(__assign({}, uri), { fragment: fragment });
2880
+ return __assign$2(__assign$2({}, uri), { fragment: fragment });
2881
2881
  };
2882
2882
  /**
2883
2883
  * Return an array of name/value pairs representing the query string of a URI.
@@ -2914,7 +2914,7 @@ var queryAsMap = function (uri) {
2914
2914
  return queryAsArray(uri).reduce(function (map, _a) {
2915
2915
  var _b;
2916
2916
  var _c = __read(_a, 2), name = _c[0], value = _c[1];
2917
- return __assign(__assign({}, map), (_b = {}, _b[name] = value, _b));
2917
+ return __assign$2(__assign$2({}, map), (_b = {}, _b[name] = value, _b));
2918
2918
  }, {});
2919
2919
  };
2920
2920
  var toString = function (uri) {
@@ -3156,7 +3156,7 @@ var EventDispatcher = /** @class */ (function () {
3156
3156
  controller.abort();
3157
3157
  resolve(event);
3158
3158
  }
3159
- }, __assign(__assign({}, opts), { abort: controller.signal }));
3159
+ }, __assign$2(__assign$2({}, opts), { abort: controller.signal }));
3160
3160
  })];
3161
3161
  });
3162
3162
  });
@@ -3345,11 +3345,17 @@ CursorManager.NORMAL_PRIORITY = 10;
3345
3345
  * A constant representing the high priority cursors.
3346
3346
  */
3347
3347
  CursorManager.HIGH_PRIORITY = 20;
3348
+ // CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/
3348
3349
  const measurementCursor = {
3349
3350
  url: "data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E",
3350
3351
  offsetX: -24,
3351
3352
  offsetY: -24,
3352
3353
  };
3354
+ const measurementWithArrowCursor = {
3355
+ url: "data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E",
3356
+ offsetX: -30,
3357
+ offsetY: -30,
3358
+ };
3353
3359
 
3354
3360
  var commonjsGlobal$1 = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
3355
3361
 
@@ -12443,7 +12449,8 @@ proto.vertexvis.protobuf.core.MeasurementOutcome.prototype.toObject = function(o
12443
12449
  proto.vertexvis.protobuf.core.MeasurementOutcome.toObject = function(includeInstance, msg) {
12444
12450
  var obj = {
12445
12451
  resultsList: googleProtobuf.Message.toObjectList(msg.getResultsList(),
12446
- proto.vertexvis.protobuf.core.MeasurementResult.toObject, includeInstance)
12452
+ proto.vertexvis.protobuf.core.MeasurementResult.toObject, includeInstance),
12453
+ isApproximate: googleProtobuf.Message.getFieldWithDefault(msg, 2, false)
12447
12454
  };
12448
12455
 
12449
12456
  if (includeInstance) {
@@ -12485,6 +12492,10 @@ proto.vertexvis.protobuf.core.MeasurementOutcome.deserializeBinaryFromReader = f
12485
12492
  reader.readMessage(value,proto.vertexvis.protobuf.core.MeasurementResult.deserializeBinaryFromReader);
12486
12493
  msg.addResults(value);
12487
12494
  break;
12495
+ case 2:
12496
+ var value = /** @type {boolean} */ (reader.readBool());
12497
+ msg.setIsApproximate(value);
12498
+ break;
12488
12499
  default:
12489
12500
  reader.skipField();
12490
12501
  break;
@@ -12522,6 +12533,13 @@ proto.vertexvis.protobuf.core.MeasurementOutcome.serializeBinaryToWriter = funct
12522
12533
  proto.vertexvis.protobuf.core.MeasurementResult.serializeBinaryToWriter
12523
12534
  );
12524
12535
  }
12536
+ f = message.getIsApproximate();
12537
+ if (f) {
12538
+ writer.writeBool(
12539
+ 2,
12540
+ f
12541
+ );
12542
+ }
12525
12543
  };
12526
12544
 
12527
12545
 
@@ -12556,6 +12574,23 @@ proto.vertexvis.protobuf.core.MeasurementOutcome.prototype.clearResultsList = fu
12556
12574
  };
12557
12575
 
12558
12576
 
12577
+ /**
12578
+ * optional bool is_approximate = 2;
12579
+ * Note that Boolean fields may be set to 0/1 when serialized from a Java server.
12580
+ * You should avoid comparisons like {@code val === true/false} in those cases.
12581
+ * @return {boolean}
12582
+ */
12583
+ proto.vertexvis.protobuf.core.MeasurementOutcome.prototype.getIsApproximate = function() {
12584
+ return /** @type {boolean} */ (googleProtobuf.Message.getFieldWithDefault(this, 2, false));
12585
+ };
12586
+
12587
+
12588
+ /** @param {boolean} value */
12589
+ proto.vertexvis.protobuf.core.MeasurementOutcome.prototype.setIsApproximate = function(value) {
12590
+ googleProtobuf.Message.setProto3BooleanField(this, 2, value);
12591
+ };
12592
+
12593
+
12559
12594
  goog.object.extend(exports, proto.vertexvis.protobuf.core);
12560
12595
  });
12561
12596
 
@@ -15594,16 +15629,16 @@ function invert(matrix) {
15594
15629
  function lookAt(m, position, target, up) {
15595
15630
  var z = subtract(position, target);
15596
15631
  if (magnitudeSquared(z) === 0) {
15597
- z = __assign(__assign({}, z), { z: 1 });
15632
+ z = __assign$2(__assign$2({}, z), { z: 1 });
15598
15633
  }
15599
15634
  z = normalize(z);
15600
15635
  var x = cross(up, z);
15601
15636
  if (magnitudeSquared(x) === 0) {
15602
15637
  if (Math.abs(up.z) === 1) {
15603
- z = __assign(__assign({}, z), { x: z.x + 0.0001 });
15638
+ z = __assign$2(__assign$2({}, z), { x: z.x + 0.0001 });
15604
15639
  }
15605
15640
  else {
15606
- z = __assign(__assign({}, z), { z: z.z + 0.0001 });
15641
+ z = __assign$2(__assign$2({}, z), { z: z.z + 0.0001 });
15607
15642
  }
15608
15643
  z = normalize(z);
15609
15644
  x = cross(up, z);
@@ -16889,7 +16924,7 @@ var matrix2 = /*#__PURE__*/Object.freeze({
16889
16924
  */
16890
16925
  function create$2$1(values) {
16891
16926
  if (values === void 0) { values = {}; }
16892
- return __assign({ normal: origin(), constant: 0 }, values);
16927
+ return __assign$2({ normal: origin(), constant: 0 }, values);
16893
16928
  }
16894
16929
  /**
16895
16930
  * Creates a plane from a normal and an arbitrary point on a plane.
@@ -16967,7 +17002,7 @@ var plane = /*#__PURE__*/Object.freeze({
16967
17002
  */
16968
17003
  function create$1$2(value) {
16969
17004
  if (value === void 0) { value = {}; }
16970
- return __assign({ x: 0, y: 0, z: 0, w: 1 }, value);
17005
+ return __assign$2({ x: 0, y: 0, z: 0, w: 1 }, value);
16971
17006
  }
16972
17007
  /**
16973
17008
  * Parses a JSON string representation of a `Quaternion`.
@@ -22685,6 +22720,7 @@ const vertexvis$1 = $root$1.vertexvis = (() => {
22685
22720
  * @interface IMetadataFilterQuery
22686
22721
  * @property {string|null} [valueFilter] MetadataFilterQuery valueFilter
22687
22722
  * @property {Array.<string>|null} [keys] MetadataFilterQuery keys
22723
+ * @property {boolean|null} [exactMatch] MetadataFilterQuery exactMatch
22688
22724
  */
22689
22725
 
22690
22726
  /**
@@ -22719,6 +22755,14 @@ const vertexvis$1 = $root$1.vertexvis = (() => {
22719
22755
  */
22720
22756
  MetadataFilterQuery.prototype.keys = $util$1.emptyArray;
22721
22757
 
22758
+ /**
22759
+ * MetadataFilterQuery exactMatch.
22760
+ * @member {boolean} exactMatch
22761
+ * @memberof vertexvis.protobuf.stream.MetadataFilterQuery
22762
+ * @instance
22763
+ */
22764
+ MetadataFilterQuery.prototype.exactMatch = false;
22765
+
22722
22766
  /**
22723
22767
  * Creates a new MetadataFilterQuery instance using the specified properties.
22724
22768
  * @function create
@@ -22748,6 +22792,8 @@ const vertexvis$1 = $root$1.vertexvis = (() => {
22748
22792
  if (message.keys != null && message.keys.length)
22749
22793
  for (let i = 0; i < message.keys.length; ++i)
22750
22794
  writer.uint32(/* id 3, wireType 2 =*/26).string(message.keys[i]);
22795
+ if (message.exactMatch != null && Object.hasOwnProperty.call(message, "exactMatch"))
22796
+ writer.uint32(/* id 4, wireType 0 =*/32).bool(message.exactMatch);
22751
22797
  return writer;
22752
22798
  };
22753
22799
 
@@ -22790,6 +22836,9 @@ const vertexvis$1 = $root$1.vertexvis = (() => {
22790
22836
  message.keys = [];
22791
22837
  message.keys.push(reader.string());
22792
22838
  break;
22839
+ case 4:
22840
+ message.exactMatch = reader.bool();
22841
+ break;
22793
22842
  default:
22794
22843
  reader.skipType(tag & 7);
22795
22844
  break;
@@ -22835,6 +22884,9 @@ const vertexvis$1 = $root$1.vertexvis = (() => {
22835
22884
  if (!$util$1.isString(message.keys[i]))
22836
22885
  return "keys: string[] expected";
22837
22886
  }
22887
+ if (message.exactMatch != null && message.hasOwnProperty("exactMatch"))
22888
+ if (typeof message.exactMatch !== "boolean")
22889
+ return "exactMatch: boolean expected";
22838
22890
  return null;
22839
22891
  };
22840
22892
 
@@ -22859,6 +22911,8 @@ const vertexvis$1 = $root$1.vertexvis = (() => {
22859
22911
  for (let i = 0; i < object.keys.length; ++i)
22860
22912
  message.keys[i] = String(object.keys[i]);
22861
22913
  }
22914
+ if (object.exactMatch != null)
22915
+ message.exactMatch = Boolean(object.exactMatch);
22862
22916
  return message;
22863
22917
  };
22864
22918
 
@@ -22877,8 +22931,10 @@ const vertexvis$1 = $root$1.vertexvis = (() => {
22877
22931
  let object = {};
22878
22932
  if (options.arrays || options.defaults)
22879
22933
  object.keys = [];
22880
- if (options.defaults)
22934
+ if (options.defaults) {
22881
22935
  object.valueFilter = "";
22936
+ object.exactMatch = false;
22937
+ }
22882
22938
  if (message.valueFilter != null && message.hasOwnProperty("valueFilter"))
22883
22939
  object.valueFilter = message.valueFilter;
22884
22940
  if (message.keys && message.keys.length) {
@@ -22886,6 +22942,8 @@ const vertexvis$1 = $root$1.vertexvis = (() => {
22886
22942
  for (let j = 0; j < message.keys.length; ++j)
22887
22943
  object.keys[j] = message.keys[j];
22888
22944
  }
22945
+ if (message.exactMatch != null && message.hasOwnProperty("exactMatch"))
22946
+ object.exactMatch = message.exactMatch;
22889
22947
  return object;
22890
22948
  };
22891
22949
 
@@ -50626,7 +50684,7 @@ function defineParams() {
50626
50684
  definitions[_i] = arguments[_i];
50627
50685
  }
50628
50686
  return function (settings) {
50629
- return definitions.reduce(function (result, def) { return (__assign(__assign({}, result), def(settings))); }, {});
50687
+ return definitions.reduce(function (result, def) { return (__assign$2(__assign$2({}, result), def(settings))); }, {});
50630
50688
  };
50631
50689
  }
50632
50690
  function defineBoolean(param, prop) {
@@ -52142,7 +52200,7 @@ var StreamApi = /** @class */ (function () {
52142
52200
  return __generator(this, function (_a) {
52143
52201
  switch (_a.label) {
52144
52202
  case 0:
52145
- desc = __assign(__assign({}, descriptor), { url: appendSettingsToUrl(descriptor.url, settings) });
52203
+ desc = __assign$2(__assign$2({}, descriptor), { url: appendSettingsToUrl(descriptor.url, settings) });
52146
52204
  return [4 /*yield*/, this.websocket.connect(desc)];
52147
52205
  case 1:
52148
52206
  _a.sent();
@@ -52473,7 +52531,7 @@ var StreamApi = /** @class */ (function () {
52473
52531
  * @param result A result to reply with.
52474
52532
  */
52475
52533
  StreamApi.prototype.replyResult = function (reqId, result) {
52476
- this.sendResponse(__assign({ requestId: { value: reqId } }, result));
52534
+ this.sendResponse(__assign$2({ requestId: { value: reqId } }, result));
52477
52535
  };
52478
52536
  /**
52479
52537
  * Acknowledges a failed request by sending a reply back to the server.
@@ -52525,7 +52583,7 @@ var StreamApi = /** @class */ (function () {
52525
52583
  var sentAtTime = currentDateAsProtoTimestamp();
52526
52584
  if (withResponse) {
52527
52585
  var requestId_1 = uuid.create();
52528
- var request_1 = __assign(__assign({}, req), { requestId: { value: requestId_1 } });
52586
+ var request_1 = __assign$2(__assign$2({}, req), { requestId: { value: requestId_1 } });
52529
52587
  return new Promise(function (resolve, reject) {
52530
52588
  var subscription = _this.onResponse(function (msg) {
52531
52589
  var _a;
@@ -53337,6 +53395,10 @@ var EntityType;
53337
53395
  * A value that represents the presence of geometry without BREP.
53338
53396
  */
53339
53397
  EntityType[EntityType["GENERIC_GEOMETRY"] = 96] = "GENERIC_GEOMETRY";
53398
+ /**
53399
+ * A value that represents the absence of geometry.
53400
+ */
53401
+ EntityType[EntityType["NO_GEOMETRY"] = 0] = "NO_GEOMETRY";
53340
53402
  })(EntityType || (EntityType = {}));
53341
53403
 
53342
53404
  /**
@@ -53363,11 +53425,17 @@ class FeatureMap {
53363
53425
  * @returns A new feature map.
53364
53426
  */
53365
53427
  static fromPng(png, imageAttr) {
53366
- if (png.data instanceof Uint8Array) {
53367
- return new FeatureMap(png.data, imageAttr);
53428
+ if (!(png.data instanceof Uint8Array)) {
53429
+ throw new Error('Cannot create FeatureMap. Expected decoded PNG to be a Uint8Array.');
53430
+ }
53431
+ else if (png.channels !== 4) {
53432
+ throw new Error('Cannot create FeatureMap. Missing alpha channel.');
53368
53433
  }
53369
53434
  else {
53370
- throw new Error('Cannot create FeatureMap. Expected decoded PNG to be a Uint8Array.');
53435
+ return new FeatureMap(png.data, Object.assign(Object.assign({}, imageAttr), {
53436
+ // TODO(dan): Need to change frame protos to include image attributes
53437
+ // per image artifact.
53438
+ imageRect: rectangle.fromPointAndDimensions(imageAttr.imageRect, png) }));
53371
53439
  }
53372
53440
  }
53373
53441
  /**
@@ -53398,6 +53466,9 @@ class FeatureMap {
53398
53466
  else if ((color === null || color === void 0 ? void 0 : color.a) === EntityType.PRECISE_SURFACE) {
53399
53467
  return EntityType.PRECISE_SURFACE;
53400
53468
  }
53469
+ else {
53470
+ return EntityType.NO_GEOMETRY;
53471
+ }
53401
53472
  }
53402
53473
  getColor(point$1) {
53403
53474
  const { width, height } = this.imageAttr.imageRect;
@@ -53472,7 +53543,7 @@ class Frame {
53472
53543
  if (this.cachedDepthBuffer == null) {
53473
53544
  this.cachedDepthBuffer =
53474
53545
  this.depthBufferBytes != null
53475
- ? this.decodeDepthBuffer(this.depthBufferBytes)
53546
+ ? this.decodeDepthBuffer(new Uint8Array(this.depthBufferBytes))
53476
53547
  : Promise.resolve(undefined);
53477
53548
  }
53478
53549
  return this.cachedDepthBuffer;
@@ -53485,7 +53556,7 @@ class Frame {
53485
53556
  if (this.cachedFeatureMap == null) {
53486
53557
  this.cachedFeatureMap =
53487
53558
  this.featureMapBytes != null
53488
- ? this.decodeFeatureMap(this.featureMapBytes)
53559
+ ? this.decodeFeatureMap(new Uint8Array(this.featureMapBytes))
53489
53560
  : Promise.resolve(undefined);
53490
53561
  }
53491
53562
  return this.cachedFeatureMap;
@@ -53835,32 +53906,32 @@ class AreaUnits {
53835
53906
  AreaUnits.units = {
53836
53907
  millimeters: {
53837
53908
  name: 'Square Millimeters',
53838
- abbreviatedName: 'mm<span class=measurement-details-entry-label-superscript>2</span>',
53909
+ abbreviatedName: 'mm²',
53839
53910
  converter: new MillimeterUnitConverter(),
53840
53911
  },
53841
53912
  centimeters: {
53842
53913
  name: 'Square Centimeters',
53843
- abbreviatedName: 'cm<span class=measurement-details-entry-label-superscript>2</span>',
53914
+ abbreviatedName: 'cm²',
53844
53915
  converter: new CentimeterUnitConverter(2),
53845
53916
  },
53846
53917
  meters: {
53847
53918
  name: 'Square Meters',
53848
- abbreviatedName: 'm<span class=measurement-details-entry-label-superscript>2</span>',
53919
+ abbreviatedName: 'm²',
53849
53920
  converter: new MeterUnitConverter(2),
53850
53921
  },
53851
53922
  inches: {
53852
53923
  name: 'Square Inches',
53853
- abbreviatedName: 'in<span class=measurement-details-entry-label-superscript>2</span>',
53924
+ abbreviatedName: 'in²',
53854
53925
  converter: new InchesUnitConverter(2),
53855
53926
  },
53856
53927
  feet: {
53857
53928
  name: 'Square Feet',
53858
- abbreviatedName: 'ft<span class=measurement-details-entry-label-superscript>2</span>',
53929
+ abbreviatedName: 'ft²',
53859
53930
  converter: new FeetUnitConverter(2),
53860
53931
  },
53861
53932
  yards: {
53862
53933
  name: 'Square Yards',
53863
- abbreviatedName: 'yd<span class=measurement-details-entry-label-superscript>2</span>',
53934
+ abbreviatedName: 'yd²',
53864
53935
  converter: new YardUnitConverter(2),
53865
53936
  },
53866
53937
  };
@@ -54398,6 +54469,17 @@ class Viewport {
54398
54469
  transformVectorToViewport(ndc) {
54399
54470
  return point.create(ndc.x * this.center.x + this.center.x, -ndc.y * this.center.y + this.center.y);
54400
54471
  }
54472
+ /**
54473
+ * Transforms a world point to 2D point in viewport space.
54474
+ *
54475
+ * @param worldPt The world point to transform.
54476
+ * @param projectionViewMatrix The projection matrix to transform a 3D point to 2D point.
54477
+ * @returns A point in viewport space.
54478
+ */
54479
+ transformWorldToViewport(worldPt, projectionViewMatrix) {
54480
+ const ndc = vector3.transformMatrix(worldPt, projectionViewMatrix);
54481
+ return this.transformVectorToViewport(ndc);
54482
+ }
54401
54483
  transformPointToViewport(pt, image) {
54402
54484
  const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);
54403
54485
  return point.scale(pt, 1 * scaleX, 1 * scaleY);
@@ -54543,9 +54625,7 @@ function fromPbFrameScene(worldOrientation) {
54543
54625
  return mapper.defineMapper(mapper.read(fromPbFrameSceneAttributes, fromPbFrameCamera), ([sceneAttr, camera]) => new FrameScene(camera, sceneAttr.boundingBox, sceneAttr.crossSectioning, worldOrientation, sceneAttr.hasChanged));
54544
54626
  }
54545
54627
  function fromPbFrame(worldOrientation) {
54546
- return mapper.defineMapper(mapper.read(mapper.mapProp('frameCorrelationIds', (ids) => (ids != null ? ids : [])), mapper.requiredProp('sequenceNumber'), mapper.compose(fromPbFrameImageAttributes, mapper.getProp('frameDimensions')), fromPbFrameScene(worldOrientation), fromPbFrameImage, mapper.getProp('depthBuffer'), mapper.getProp('featureMap')), ([cIds, seq, fd, s, i, db, fm]) => {
54547
- return new Frame(cIds, seq, fd, i, s, (db === null || db === void 0 ? void 0 : db.value) || undefined, (fm === null || fm === void 0 ? void 0 : fm.value) || undefined);
54548
- });
54628
+ return mapper.defineMapper(mapper.read(mapper.mapProp('frameCorrelationIds', (ids) => (ids != null ? ids : [])), mapper.requiredProp('sequenceNumber'), mapper.compose(fromPbFrameImageAttributes, mapper.getProp('frameDimensions')), fromPbFrameScene(worldOrientation), fromPbFrameImage, mapper.mapProp('depthBuffer', fromPbBytesValue), mapper.mapProp('featureMap', fromPbBytesValue)), ([cIds, seq, fd, s, i, db, fm]) => new Frame(cIds, seq, fd, i, s, db, fm));
54549
54629
  }
54550
54630
  function fromPbFrameOrThrow(worldOrientation) {
54551
54631
  return mapper.ifInvalidThrow(fromPbFrame(worldOrientation));
@@ -60040,6 +60120,7 @@ const vertexvis = $root.vertexvis = (() => {
60040
60120
  * @interface IMetadataFilterQuery
60041
60121
  * @property {string|null} [valueFilter] MetadataFilterQuery valueFilter
60042
60122
  * @property {Array.<string>|null} [keys] MetadataFilterQuery keys
60123
+ * @property {boolean|null} [exactMatch] MetadataFilterQuery exactMatch
60043
60124
  */
60044
60125
 
60045
60126
  /**
@@ -60074,6 +60155,14 @@ const vertexvis = $root.vertexvis = (() => {
60074
60155
  */
60075
60156
  MetadataFilterQuery.prototype.keys = $util.emptyArray;
60076
60157
 
60158
+ /**
60159
+ * MetadataFilterQuery exactMatch.
60160
+ * @member {boolean} exactMatch
60161
+ * @memberof vertexvis.protobuf.stream.MetadataFilterQuery
60162
+ * @instance
60163
+ */
60164
+ MetadataFilterQuery.prototype.exactMatch = false;
60165
+
60077
60166
  /**
60078
60167
  * Creates a new MetadataFilterQuery instance using the specified properties.
60079
60168
  * @function create
@@ -60103,6 +60192,8 @@ const vertexvis = $root.vertexvis = (() => {
60103
60192
  if (message.keys != null && message.keys.length)
60104
60193
  for (let i = 0; i < message.keys.length; ++i)
60105
60194
  writer.uint32(/* id 3, wireType 2 =*/26).string(message.keys[i]);
60195
+ if (message.exactMatch != null && Object.hasOwnProperty.call(message, "exactMatch"))
60196
+ writer.uint32(/* id 4, wireType 0 =*/32).bool(message.exactMatch);
60106
60197
  return writer;
60107
60198
  };
60108
60199
 
@@ -60145,6 +60236,9 @@ const vertexvis = $root.vertexvis = (() => {
60145
60236
  message.keys = [];
60146
60237
  message.keys.push(reader.string());
60147
60238
  break;
60239
+ case 4:
60240
+ message.exactMatch = reader.bool();
60241
+ break;
60148
60242
  default:
60149
60243
  reader.skipType(tag & 7);
60150
60244
  break;
@@ -60190,6 +60284,9 @@ const vertexvis = $root.vertexvis = (() => {
60190
60284
  if (!$util.isString(message.keys[i]))
60191
60285
  return "keys: string[] expected";
60192
60286
  }
60287
+ if (message.exactMatch != null && message.hasOwnProperty("exactMatch"))
60288
+ if (typeof message.exactMatch !== "boolean")
60289
+ return "exactMatch: boolean expected";
60193
60290
  return null;
60194
60291
  };
60195
60292
 
@@ -60214,6 +60311,8 @@ const vertexvis = $root.vertexvis = (() => {
60214
60311
  for (let i = 0; i < object.keys.length; ++i)
60215
60312
  message.keys[i] = String(object.keys[i]);
60216
60313
  }
60314
+ if (object.exactMatch != null)
60315
+ message.exactMatch = Boolean(object.exactMatch);
60217
60316
  return message;
60218
60317
  };
60219
60318
 
@@ -60232,8 +60331,10 @@ const vertexvis = $root.vertexvis = (() => {
60232
60331
  let object = {};
60233
60332
  if (options.arrays || options.defaults)
60234
60333
  object.keys = [];
60235
- if (options.defaults)
60334
+ if (options.defaults) {
60236
60335
  object.valueFilter = "";
60336
+ object.exactMatch = false;
60337
+ }
60237
60338
  if (message.valueFilter != null && message.hasOwnProperty("valueFilter"))
60238
60339
  object.valueFilter = message.valueFilter;
60239
60340
  if (message.keys && message.keys.length) {
@@ -60241,6 +60342,8 @@ const vertexvis = $root.vertexvis = (() => {
60241
60342
  for (let j = 0; j < message.keys.length; ++j)
60242
60343
  object.keys[j] = message.keys[j];
60243
60344
  }
60345
+ if (message.exactMatch != null && message.hasOwnProperty("exactMatch"))
60346
+ object.exactMatch = message.exactMatch;
60244
60347
  return object;
60245
60348
  };
60246
60349
 
@@ -87998,11 +88101,11 @@ const mapPlanarAngle = mapper.defineMapper(mapper.read(mapper.getProp('angleInRa
87998
88101
  plane1,
87999
88102
  plane2,
88000
88103
  }));
88001
- const mapMinimumDistance = mapper.defineMapper(mapper.read(mapper.getProp('distance'), mapper.mapRequiredProp('closestPoint1', fromPbVector3f), mapper.mapRequiredProp('closestPoint2', fromPbVector3f)), ([distance, closestPoint1, closestPoint2]) => ({
88104
+ const mapMinimumDistance = mapper.defineMapper(mapper.read(mapper.getProp('distance'), mapper.mapRequiredProp('closestPoint1', fromPbVector3f), mapper.mapRequiredProp('closestPoint2', fromPbVector3f)), ([distance, point1, point2]) => ({
88002
88105
  type: 'minimum-distance',
88003
88106
  distance,
88004
- closestPoint1,
88005
- closestPoint2,
88107
+ point1,
88108
+ point2,
88006
88109
  }));
88007
88110
  const mapSurfaceArea = mapper.defineMapper(mapper.read(mapper.getProp('area')), ([area]) => ({
88008
88111
  type: 'surface-area',
@@ -88013,7 +88116,7 @@ const mapPlanarAngleFromResult = mapper.mapProp('planarAngle', mapper.ifDefined(
88013
88116
  const mapMinimumDistanceFromResult = mapper.mapProp('minimumDistance', mapper.ifDefined(mapMinimumDistance));
88014
88117
  const mapSurfaceAreaFromResult = mapper.mapProp('totalSurfaceArea', mapper.ifDefined(mapSurfaceArea));
88015
88118
  const mapMeasurementResult = mapper.compose(mapper.pickFirst(mapPlanarDistanceFromResult, mapPlanarAngleFromResult, mapMinimumDistanceFromResult, mapSurfaceAreaFromResult), mapper.required('Result field'));
88016
- const mapMeasureResponse = mapper.defineMapper(mapper.read(mapper.mapRequiredProp('outcome', mapper.mapRequiredProp('resultsList', mapper.mapArray(mapMeasurementResult)))), ([results]) => ({ results }));
88119
+ const mapMeasureResponse = mapper.defineMapper(mapper.read(mapper.mapRequiredProp('outcome', mapper.mapRequiredProp('resultsList', mapper.mapArray(mapMeasurementResult))), mapper.mapRequiredProp('outcome', mapper.getProp('isApproximate'))), ([results, isApproximate]) => ({ results, isApproximate }));
88017
88120
  const mapMeasureResponseOrThrow = mapper.ifInvalidThrow(mapMeasureResponse);
88018
88121
 
88019
88122
  /**
@@ -88026,7 +88129,7 @@ class MeasurementController {
88026
88129
  this.client = client;
88027
88130
  this.jwtProvider = jwtProvider;
88028
88131
  this.deviceId = deviceId;
88029
- this.results = Promise.resolve([]);
88132
+ this.outcome = Promise.resolve(undefined);
88030
88133
  }
88031
88134
  /**
88032
88135
  * Registers an entity to measure and performs a measurement if this entity
@@ -88046,7 +88149,7 @@ class MeasurementController {
88046
88149
  clearEntities() {
88047
88150
  return this.performMeasurement(() => {
88048
88151
  this.model.clearEntities();
88049
- this.model.clearResults();
88152
+ this.model.clearOutcome();
88050
88153
  return true;
88051
88154
  });
88052
88155
  }
@@ -88079,28 +88182,32 @@ class MeasurementController {
88079
88182
  this.measureAndUpdateModel(entities);
88080
88183
  this.highlightEntities(previous, entities);
88081
88184
  }
88082
- return this.results;
88185
+ return this.outcome;
88083
88186
  }
88084
88187
  measureAndUpdateModel(entities) {
88085
88188
  if (entities.length > 0) {
88086
- this.results = this.measureEntities().then((outcome) => {
88087
- this.model.replaceResultsWithOutcome(outcome);
88088
- return this.model.getResults();
88189
+ this.outcome = this.measureEntities(entities).then((outcome) => {
88190
+ this.model.setOutcome(outcome);
88191
+ return this.model.getOutcome();
88089
88192
  });
88090
88193
  }
88091
88194
  else {
88092
- this.results = Promise.resolve([]);
88195
+ this.outcome = Promise.resolve(undefined);
88093
88196
  }
88094
88197
  }
88095
- async measureEntities() {
88096
- const entities = this.model.getEntities().map((e) => e.toProto());
88097
- const res = await requestUnary(async (handler) => {
88098
- const meta = await createMetadata(this.jwtProvider, this.deviceId);
88099
- const req = new scene_view_api_pb.MeasureRequest();
88100
- req.setEntitiesList(entities);
88101
- this.client.measure(req, meta, handler);
88102
- });
88103
- return mapMeasureResponseOrThrow(res.toObject());
88198
+ async measureEntities(entities) {
88199
+ if (entities.length > 0) {
88200
+ const res = await requestUnary(async (handler) => {
88201
+ const meta = await createMetadata(this.jwtProvider, this.deviceId);
88202
+ const req = new scene_view_api_pb.MeasureRequest();
88203
+ req.setEntitiesList(entities.map((e) => e.toProto()));
88204
+ this.client.measure(req, meta, handler);
88205
+ });
88206
+ return mapMeasureResponseOrThrow(res.toObject());
88207
+ }
88208
+ else {
88209
+ return undefined;
88210
+ }
88104
88211
  }
88105
88212
  async highlightEntities(previous, entities) {
88106
88213
  await requestUnary(async (handler) => {
@@ -88153,6 +88260,7 @@ class MeasurementEntity {
88153
88260
  return entity;
88154
88261
  }
88155
88262
  }
88263
+
88156
88264
  /**
88157
88265
  * A model representing the state of measurement.
88158
88266
  *
@@ -88167,8 +88275,8 @@ class MeasurementModel {
88167
88275
  constructor() {
88168
88276
  this.entities = new Set();
88169
88277
  this.results = new Set();
88170
- this.resultsChanged = new EventDispatcher();
88171
88278
  this.entitiesChanged = new EventDispatcher();
88279
+ this.outcomeChanged = new EventDispatcher();
88172
88280
  }
88173
88281
  /**
88174
88282
  * Registers an entity to be measured with the model.
@@ -88186,24 +88294,6 @@ class MeasurementModel {
88186
88294
  return false;
88187
88295
  }
88188
88296
  }
88189
- /**
88190
- * Adds a measurement result to the model.
88191
- *
88192
- * Emits a _result changed_ event.
88193
- *
88194
- * @param result A result to add.
88195
- * @returns `true` if the result has been added.
88196
- */
88197
- addResult(result) {
88198
- if (!this.results.has(result)) {
88199
- this.results.add(result);
88200
- this.resultsChanged.emit(this.getResults());
88201
- return true;
88202
- }
88203
- else {
88204
- return false;
88205
- }
88206
- }
88207
88297
  /**
88208
88298
  * Clears all registered entities from the model.
88209
88299
  */
@@ -88211,23 +88301,23 @@ class MeasurementModel {
88211
88301
  this.entities.forEach((e) => this.removeEntity(e));
88212
88302
  }
88213
88303
  /**
88214
- * Clears all the measurement results from the model.
88215
- *
88216
- * Emits a _result changed_ event.
88304
+ * Clears the outcome containing the results of a measurement.
88217
88305
  */
88218
- clearResults() {
88219
- this.results.forEach((r) => this.removeResult(r));
88306
+ clearOutcome() {
88307
+ this.setOutcome(undefined);
88220
88308
  }
88221
88309
  /**
88222
- * Replaces all the results in the model with the results from an outcome.
88310
+ * Sets the outcome containing the results of a measurement.
88223
88311
  *
88224
- * Emits a _result changed_ event.
88312
+ * Emits a _outcome changed_ event.
88225
88313
  *
88226
- * @param outcome The outcome that contains the new results.
88314
+ * @param outcome The outcome containing results.
88227
88315
  */
88228
- replaceResultsWithOutcome(outcome) {
88229
- this.clearResults();
88230
- outcome.results.forEach((r) => this.addResult(r));
88316
+ setOutcome(outcome) {
88317
+ if (!objects.isEqual(this.outcome, outcome)) {
88318
+ this.outcome = outcome;
88319
+ this.outcomeChanged.emit(outcome);
88320
+ }
88231
88321
  }
88232
88322
  /**
88233
88323
  * Returns all the entities registered with the model.
@@ -88235,6 +88325,12 @@ class MeasurementModel {
88235
88325
  getEntities() {
88236
88326
  return Array.from(this.entities);
88237
88327
  }
88328
+ /**
88329
+ * Returns the outcome that contains the results of a measurement.
88330
+ */
88331
+ getOutcome() {
88332
+ return this.outcome;
88333
+ }
88238
88334
  /**
88239
88335
  * Returns all the measurement results of the model.
88240
88336
  */
@@ -88257,23 +88353,6 @@ class MeasurementModel {
88257
88353
  return false;
88258
88354
  }
88259
88355
  }
88260
- /**
88261
- * Removes a measurement result from the model.
88262
- *
88263
- * Emits a _result changed_ event.
88264
- *
88265
- * @param result The result to remove.
88266
- */
88267
- removeResult(result) {
88268
- if (this.results.has(result)) {
88269
- this.results.delete(result);
88270
- this.resultsChanged.emit(this.getResults());
88271
- return true;
88272
- }
88273
- else {
88274
- return false;
88275
- }
88276
- }
88277
88356
  /**
88278
88357
  * Sets the set of entities to be measured with the model.
88279
88358
  *
@@ -88287,14 +88366,14 @@ class MeasurementModel {
88287
88366
  return true;
88288
88367
  }
88289
88368
  /**
88290
- * Registers an event listener that will be invoked when the model's
88291
- * measurement results change.
88369
+ * Registers an event listener that will be invoked when the model's outcome
88370
+ * changes.
88292
88371
  *
88293
88372
  * @param listener The listener to add.
88294
88373
  * @returns A disposable that can be used to remove the listener.
88295
88374
  */
88296
- onResultsChanged(listener) {
88297
- return this.resultsChanged.on(listener);
88375
+ onOutcomeChanged(listener) {
88376
+ return this.outcomeChanged.on(listener);
88298
88377
  }
88299
88378
  /**
88300
88379
  * Registers an event listener that will be invoked when the model's
@@ -88308,40 +88387,86 @@ class MeasurementModel {
88308
88387
  }
88309
88388
  }
88310
88389
 
88311
- function summarizeResults(results) {
88312
- return results.reduce((summary, result) => {
88313
- switch (result.type) {
88314
- case 'minimum-distance':
88315
- return Object.assign(Object.assign({}, summary), summarizeMinDistanceResult(result));
88316
- case 'planar-angle':
88317
- return Object.assign(Object.assign({}, summary), summarizeFromPlanarAngleResult(result));
88318
- case 'planar-distance':
88319
- return Object.assign(Object.assign({}, summary), summarizePlanarDistanceResult(result));
88320
- case 'surface-area':
88321
- return Object.assign(Object.assign({}, summary), summarizeSurfaceAreaResult(result));
88390
+ class MeasurementOverlayManager {
88391
+ constructor() {
88392
+ this.overlays = new Map();
88393
+ this.overlaysChanged = new EventDispatcher();
88394
+ }
88395
+ addLineFromResult(result) {
88396
+ return this.addLine(result.point1, result.point2);
88397
+ }
88398
+ addLine(start, end) {
88399
+ const id = uuid.create();
88400
+ const overlay = {
88401
+ type: 'line',
88402
+ id: id,
88403
+ start,
88404
+ end,
88405
+ dispose: () => this.remove(id),
88406
+ };
88407
+ this.addOverlay(overlay);
88408
+ return overlay;
88409
+ }
88410
+ addDistanceVectorFromResult(result) {
88411
+ return this.addDistanceVector(result.point1, result.point2);
88412
+ }
88413
+ addDistanceVector(start, end) {
88414
+ const id = uuid.create();
88415
+ const v = vector3.subtract(start, end);
88416
+ const ze = vector3.add(start, vector3.create(0, 0, -v.z));
88417
+ const z = { start, end: ze };
88418
+ const ye = vector3.add(ze, vector3.create(0, -v.y, 0));
88419
+ const y = { start: ze, end: ye };
88420
+ const xe = vector3.add(ye, vector3.create(-v.x, 0, 0));
88421
+ const x = { start: ye, end: xe };
88422
+ const overlay = {
88423
+ type: 'distance-vector',
88424
+ id,
88425
+ x,
88426
+ y,
88427
+ z,
88428
+ dispose: () => this.remove(id),
88429
+ };
88430
+ this.addOverlay(overlay);
88431
+ return overlay;
88432
+ }
88433
+ addOverlay(overlay) {
88434
+ if (!this.overlays.has(overlay.id)) {
88435
+ this.overlays.set(overlay.id, overlay);
88436
+ this.overlaysChanged.emit(this.getOverlays());
88322
88437
  }
88323
- }, {});
88324
- }
88325
- function summarizeMinDistanceResult(result) {
88326
- const distanceVector = vector3.subtract(result.closestPoint1, result.closestPoint2);
88327
- return {
88328
- minDistance: result.distance,
88329
- distanceVector,
88330
- };
88331
- }
88332
- function summarizePlanarDistanceResult(result) {
88333
- return {
88334
- parallelDistance: result.distance,
88335
- };
88336
- }
88337
- function summarizeFromPlanarAngleResult(result) {
88338
- return {
88339
- angle: result.angle,
88340
- };
88438
+ }
88439
+ getOverlays() {
88440
+ return Array.from(this.overlays.values());
88441
+ }
88442
+ remove(id) {
88443
+ if (this.overlays.has(id)) {
88444
+ this.overlays.delete(id);
88445
+ this.overlaysChanged.emit(this.getOverlays());
88446
+ return true;
88447
+ }
88448
+ else {
88449
+ return false;
88450
+ }
88451
+ }
88452
+ onOverlaysChanged(listener) {
88453
+ return this.overlaysChanged.on(listener);
88454
+ }
88341
88455
  }
88342
- function summarizeSurfaceAreaResult(result) {
88456
+
88457
+ /**
88458
+ * Constructs a new measurement result from the given points.
88459
+ *
88460
+ * @param point1 A starting point.
88461
+ * @param point2 An ending point.
88462
+ * @returns A new measurement result.
88463
+ */
88464
+ function makeMinimumDistanceResult(point1, point2) {
88343
88465
  return {
88344
- area: result.area,
88466
+ type: 'minimum-distance',
88467
+ point1,
88468
+ point2,
88469
+ distance: vector3.distance(point1, point2),
88345
88470
  };
88346
88471
  }
88347
88472
 
@@ -97360,21 +97485,21 @@ let SceneTreeTableHeader = class extends HTMLElement$1 {
97360
97485
  /**
97361
97486
  * Lower case as a function.
97362
97487
  */
97363
- function lowerCase(str) {
97488
+ function lowerCase$1(str) {
97364
97489
  return str.toLowerCase();
97365
97490
  }
97366
97491
 
97367
97492
  // Support camel case ("camelCase" -> "camel Case" and "CAMELCase" -> "CAMEL Case").
97368
- var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];
97493
+ var DEFAULT_SPLIT_REGEXP$1 = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];
97369
97494
  // Remove all non-word characters.
97370
- var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;
97495
+ var DEFAULT_STRIP_REGEXP$1 = /[^A-Z0-9]+/gi;
97371
97496
  /**
97372
97497
  * Normalize the string into something other libraries can manipulate easier.
97373
97498
  */
97374
- function noCase(input, options) {
97499
+ function noCase$1(input, options) {
97375
97500
  if (options === void 0) { options = {}; }
97376
- var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d;
97377
- var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0");
97501
+ var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP$1 : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP$1 : _b, _c = options.transform, transform = _c === void 0 ? lowerCase$1 : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d;
97502
+ var result = replace$1(replace$1(input, splitRegexp, "$1\0$2"), stripRegexp, "\0");
97378
97503
  var start = 0;
97379
97504
  var end = result.length;
97380
97505
  // Trim the delimiter from around the output string.
@@ -97388,7 +97513,7 @@ function noCase(input, options) {
97388
97513
  /**
97389
97514
  * Replace `re` in the input string with the replacement value.
97390
97515
  */
97391
- function replace(input, re, value) {
97516
+ function replace$1(input, re, value) {
97392
97517
  if (re instanceof RegExp)
97393
97518
  return input.replace(re, value);
97394
97519
  return re.reduce(function (input, re) { return input.replace(re, value); }, input);
@@ -97404,7 +97529,7 @@ function pascalCaseTransform(input, index) {
97404
97529
  }
97405
97530
  function pascalCase(input, options) {
97406
97531
  if (options === void 0) { options = {}; }
97407
- return noCase(input, __assign({ delimiter: "", transform: pascalCaseTransform }, options));
97532
+ return noCase$1(input, __assign$2({ delimiter: "", transform: pascalCaseTransform }, options));
97408
97533
  }
97409
97534
 
97410
97535
  function camelCaseTransform(input, index) {
@@ -97414,7 +97539,7 @@ function camelCaseTransform(input, index) {
97414
97539
  }
97415
97540
  function camelCase(input, options) {
97416
97541
  if (options === void 0) { options = {}; }
97417
- return pascalCase(input, __assign({ transform: camelCaseTransform }, options));
97542
+ return pascalCase(input, __assign$2({ transform: camelCaseTransform }, options));
97418
97543
  }
97419
97544
 
97420
97545
  const bindingRegEx = /{{(.+)}}/;
@@ -98373,8 +98498,9 @@ class FlyToPositionKeyInteraction {
98373
98498
  * the internal state of an interaction.
98374
98499
  */
98375
98500
  class InteractionApi {
98376
- constructor(stream, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter) {
98501
+ constructor(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter) {
98377
98502
  this.stream = stream;
98503
+ this.cursors = cursors;
98378
98504
  this.getConfig = getConfig;
98379
98505
  this.getScene = getScene;
98380
98506
  this.getFrame = getFrame;
@@ -98389,6 +98515,53 @@ class InteractionApi {
98389
98515
  this.longPress = this.longPress.bind(this);
98390
98516
  this.emitTapEvent = this.emitTapEvent.bind(this);
98391
98517
  }
98518
+ /**
98519
+ * Displays a cursor over the viewer with the given priority. Cursors with
98520
+ * higher priority will take precedence over cursors with lower priorities if
98521
+ * there's more than a single cursor added.
98522
+ *
98523
+ * @param cursor The cursor to add.
98524
+ * @param priority The priority of the cursor.
98525
+ * @returns A `Disposable` that can be used to remove the cursor.
98526
+ */
98527
+ addCursor(cursor, priority) {
98528
+ return this.cursors.add(cursor, priority);
98529
+ }
98530
+ /**
98531
+ * Returns a 3D point in world space for the given 2D point in viewport space.
98532
+ *
98533
+ * @param point A point in 2D viewport space to transform.
98534
+ * @returns A 3D point in world space.
98535
+ */
98536
+ async getWorldPointFromViewport(point) {
98537
+ const viewport = this.getViewport();
98538
+ const frame = this.getFrame();
98539
+ if (frame == null) {
98540
+ throw new Error('Cannot get world point. Frame is undefined.');
98541
+ }
98542
+ const depthBuffer = await frame.depthBuffer();
98543
+ return depthBuffer != null
98544
+ ? viewport.transformPointToWorldSpace(point, depthBuffer, 0.5)
98545
+ : undefined;
98546
+ }
98547
+ /**
98548
+ * Returns the entity at the given point in viewport space.
98549
+ *
98550
+ * @param point A point in viewport space.
98551
+ * @returns The entity that was found.
98552
+ */
98553
+ async getEntityTypeAtPoint(point) {
98554
+ var _a;
98555
+ const viewport = this.getViewport();
98556
+ const featureMap = await ((_a = this.getFrame()) === null || _a === void 0 ? void 0 : _a.featureMap());
98557
+ if (featureMap != null) {
98558
+ const framePt = viewport.transformPointToFrame(point, featureMap);
98559
+ return featureMap.getEntityType(framePt);
98560
+ }
98561
+ else {
98562
+ return EntityType.NO_GEOMETRY;
98563
+ }
98564
+ }
98392
98565
  /**
98393
98566
  * Generates a ray from the given point, in viewport coordinates.
98394
98567
  *
@@ -98549,8 +98722,8 @@ class InteractionApi {
98549
98722
  });
98550
98723
  }
98551
98724
  /**
98552
- * Performs a view all operation for the scene's bounding box, and requests a new image
98553
- * for the updated scene.
98725
+ * Performs a view all operation for the scene's bounding box, and requests a
98726
+ * new image for the updated scene.
98554
98727
  */
98555
98728
  async viewAll() {
98556
98729
  await this.getScene().camera().viewAll().render();
@@ -100800,7 +100973,7 @@ let Viewer = class extends HTMLElement$1 {
100800
100973
  if (this.stream == null) {
100801
100974
  throw new ComponentInitializationError('Cannot create interaction API. Component has not been initialized.');
100802
100975
  }
100803
- return new InteractionApi(this.stream, () => this.getResolvedConfig().interactions, () => this.createScene(), () => this.frame, () => this.viewport, this.tap, this.doubletap, this.longpress, this.interactionStarted, this.interactionFinished);
100976
+ return new InteractionApi(this.stream, this.stateMap.cursorManager, () => this.getResolvedConfig().interactions, () => this.createScene(), () => this.frame, () => this.viewport, this.tap, this.doubletap, this.longpress, this.interactionStarted, this.interactionFinished);
100804
100977
  }
100805
100978
  handleCursorChanged() {
100806
100979
  window.requestAnimationFrame(() => {
@@ -101534,7 +101707,7 @@ let ViewerDomRenderer = class extends HTMLElement$1 {
101534
101707
  /**
101535
101708
  * @ignore
101536
101709
  */
101537
- componentWillRender() {
101710
+ componentDidRender() {
101538
101711
  this.updateElements();
101539
101712
  }
101540
101713
  /**
@@ -103060,7 +103233,137 @@ let ViewerMarkupTool = class extends HTMLElement$1 {
103060
103233
  static get style() { return viewerMarkupToolCss; }
103061
103234
  };
103062
103235
 
103063
- const viewerMeasurementDetailsCss = ":host{display:flex;flex-direction:column;--viewer-measurement-details-x-color:red;--viewer-measurement-details-y-color:var(--green-500);--viewer-measurement-details-z-color:blue}.measurement-details-entry{display:flex;align-items:center}.measurement-details-entry-label{user-select:none;padding-right:0.25rem}.measurement-details-entry-label.x-label{color:var(--viewer-measurement-details-x-color)}.measurement-details-entry-label.y-label{color:var(--viewer-measurement-details-y-color)}.measurement-details-entry-label.z-label{color:var(--viewer-measurement-details-z-color)}.measurement-details-entry-label-superscript{font-size:0.6rem;position:relative;bottom:0.3em;line-height:initial}";
103236
+ /*! *****************************************************************************
103237
+ Copyright (c) Microsoft Corporation.
103238
+
103239
+ Permission to use, copy, modify, and/or distribute this software for any
103240
+ purpose with or without fee is hereby granted.
103241
+
103242
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
103243
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
103244
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
103245
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
103246
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
103247
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
103248
+ PERFORMANCE OF THIS SOFTWARE.
103249
+ ***************************************************************************** */
103250
+
103251
+ var __assign$1 = function() {
103252
+ __assign$1 = Object.assign || function __assign(t) {
103253
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
103254
+ s = arguments[i];
103255
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
103256
+ }
103257
+ return t;
103258
+ };
103259
+ return __assign$1.apply(this, arguments);
103260
+ };
103261
+
103262
+ /*! *****************************************************************************
103263
+ Copyright (c) Microsoft Corporation.
103264
+
103265
+ Permission to use, copy, modify, and/or distribute this software for any
103266
+ purpose with or without fee is hereby granted.
103267
+
103268
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
103269
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
103270
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
103271
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
103272
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
103273
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
103274
+ PERFORMANCE OF THIS SOFTWARE.
103275
+ ***************************************************************************** */
103276
+
103277
+ var __assign = function() {
103278
+ __assign = Object.assign || function __assign(t) {
103279
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
103280
+ s = arguments[i];
103281
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
103282
+ }
103283
+ return t;
103284
+ };
103285
+ return __assign.apply(this, arguments);
103286
+ };
103287
+
103288
+ /**
103289
+ * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt
103290
+ */
103291
+ /**
103292
+ * Lower case as a function.
103293
+ */
103294
+ function lowerCase(str) {
103295
+ return str.toLowerCase();
103296
+ }
103297
+
103298
+ // Support camel case ("camelCase" -> "camel Case" and "CAMELCase" -> "CAMEL Case").
103299
+ var DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];
103300
+ // Remove all non-word characters.
103301
+ var DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;
103302
+ /**
103303
+ * Normalize the string into something other libraries can manipulate easier.
103304
+ */
103305
+ function noCase(input, options) {
103306
+ if (options === void 0) { options = {}; }
103307
+ var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? " " : _d;
103308
+ var result = replace(replace(input, splitRegexp, "$1\0$2"), stripRegexp, "\0");
103309
+ var start = 0;
103310
+ var end = result.length;
103311
+ // Trim the delimiter from around the output string.
103312
+ while (result.charAt(start) === "\0")
103313
+ start++;
103314
+ while (result.charAt(end - 1) === "\0")
103315
+ end--;
103316
+ // Transform each token independently.
103317
+ return result.slice(start, end).split("\0").map(transform).join(delimiter);
103318
+ }
103319
+ /**
103320
+ * Replace `re` in the input string with the replacement value.
103321
+ */
103322
+ function replace(input, re, value) {
103323
+ if (re instanceof RegExp)
103324
+ return input.replace(re, value);
103325
+ return re.reduce(function (input, re) { return input.replace(re, value); }, input);
103326
+ }
103327
+
103328
+ function dotCase(input, options) {
103329
+ if (options === void 0) { options = {}; }
103330
+ return noCase(input, __assign({ delimiter: "." }, options));
103331
+ }
103332
+
103333
+ function paramCase(input, options) {
103334
+ if (options === void 0) { options = {}; }
103335
+ return dotCase(input, __assign$1({ delimiter: "-" }, options));
103336
+ }
103337
+
103338
+ const MeasurementDetailsEntry = (_a, children) => {
103339
+ var { label } = _a, props = __rest(_a, ["label"]);
103340
+ return (h("div", Object.assign({}, props, { class: "measurement-details-entry" }),
103341
+ h("div", { class: classnames('measurement-details-entry-label', paramCase(label)) },
103342
+ label,
103343
+ ":"),
103344
+ children));
103345
+ };
103346
+
103347
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
103348
+ const MinimumDistanceResultEntry = ({ result, formatter, overlays, onShowOverlay, onHideOverlay }) => {
103349
+ const v = vector3.subtract(result.point1, result.point2);
103350
+ return (h(Fragment, null,
103351
+ h(MeasurementDetailsEntry, { label: "Min Dist", onMouseEnter: () => onShowOverlay(overlays === null || overlays === void 0 ? void 0 : overlays.addLineFromResult(result)), onMouseLeave: onHideOverlay }, formatter(result.distance)),
103352
+ h(MeasurementDetailsEntry, { label: "X", onMouseEnter: () => onShowOverlay(overlays === null || overlays === void 0 ? void 0 : overlays.addDistanceVectorFromResult(result)), onMouseLeave: onHideOverlay }, formatter(v.x)),
103353
+ h(MeasurementDetailsEntry, { label: "Y", onMouseEnter: () => onShowOverlay(overlays === null || overlays === void 0 ? void 0 : overlays.addDistanceVectorFromResult(result)), onMouseLeave: onHideOverlay }, formatter(v.y)),
103354
+ h(MeasurementDetailsEntry, { label: "Z", onMouseEnter: () => onShowOverlay(overlays === null || overlays === void 0 ? void 0 : overlays.addDistanceVectorFromResult(result)), onMouseLeave: onHideOverlay }, formatter(v.z))));
103355
+ };
103356
+ const PlanarAngleResultEntry = ({ result, formatter }) => {
103357
+ return (h(MeasurementDetailsEntry, { label: "Angle" }, formatter(result.angle)));
103358
+ };
103359
+ const PlanarDistanceResultEntry = ({ result, formatter }) => {
103360
+ return (h(MeasurementDetailsEntry, { label: "Parallel Dist" }, formatter(result.distance)));
103361
+ };
103362
+ const SurfaceAreaResultEntry = ({ result, formatter }) => {
103363
+ return (h(MeasurementDetailsEntry, { label: "Area" }, formatter(result.area)));
103364
+ };
103365
+
103366
+ const viewerMeasurementDetailsCss = ":host{display:flex;flex-direction:column;--viewer-measurement-details-x-color:red;--viewer-measurement-details-y-color:var(--green-500);--viewer-measurement-details-z-color:blue}.measurement-details-entry{display:flex;align-items:center}.measurement-details-entry-label{user-select:none;padding-right:0.25rem}.measurement-details-entry-label.x{color:var(--viewer-measurement-details-x-color)}.measurement-details-entry-label.y{color:var(--viewer-measurement-details-y-color)}.measurement-details-entry-label.z{color:var(--viewer-measurement-details-z-color)}";
103064
103367
 
103065
103368
  let ViewerMeasurementDetails = class extends HTMLElement$1 {
103066
103369
  constructor() {
@@ -103085,106 +103388,121 @@ let ViewerMeasurementDetails = class extends HTMLElement$1 {
103085
103388
  * The number of fraction digits to display.
103086
103389
  */
103087
103390
  this.fractionalDigits = 2;
103088
- /**
103089
- * The current `MeasurementResult` displayed.
103090
- *
103091
- * @readonly
103092
- */
103093
103391
  this.results = [];
103392
+ this.isApproximate = false;
103094
103393
  this.distanceMeasurementUnits = new DistanceUnits(this.distanceUnits);
103095
103394
  this.angleMeasurementUnits = new AngleUnits(this.angleUnits);
103096
103395
  this.areaMeasurementUnits = new AreaUnits(this.distanceUnits);
103097
- this.handleResultsChange = (results) => {
103098
- this.results = results;
103099
- this.createSummary();
103396
+ this.handleShowOverlay = (overlay) => {
103397
+ this.overlay = overlay;
103100
103398
  };
103101
- this.formatDistance = (distance) => {
103102
- const realDistance = Math.abs(this.distanceMeasurementUnits.convertWorldValueToReal(distance));
103103
- if (this.distanceFormatter != null) {
103104
- return this.distanceFormatter(realDistance);
103105
- }
103106
- else {
103107
- const abbreviated = this.distanceMeasurementUnits.unit.abbreviatedName;
103108
- return realDistance == null
103109
- ? '---'
103110
- : `${realDistance.toFixed(this.fractionalDigits)} ${abbreviated}`;
103111
- }
103112
- };
103113
- this.formatAngle = (angleInRadians) => {
103114
- if (this.angleFormatter != null) {
103115
- return this.angleFormatter(angleInRadians);
103116
- }
103117
- else {
103118
- const value = this.angleMeasurementUnits
103119
- .convertTo(angleInRadians)
103120
- .toFixed(this.fractionalDigits);
103121
- return `${value} ${this.angleMeasurementUnits.unit.abbreviatedName}`;
103122
- }
103123
- };
103124
- this.formatArea = (area) => {
103125
- const realArea = this.areaMeasurementUnits.convertWorldValueToReal(area);
103126
- if (this.areaFormatter != null) {
103127
- return this.areaFormatter(area);
103128
- }
103129
- else {
103130
- const abbreviated = this.areaMeasurementUnits.unit.abbreviatedName;
103131
- return realArea == null
103132
- ? '---'
103133
- : `${realArea.toFixed(this.fractionalDigits)} ${abbreviated}`;
103134
- }
103135
- };
103136
- this.createSummary = () => {
103399
+ this.handleHideOverlay = () => {
103137
103400
  var _a;
103138
- const baseSummary = summarizeResults(this.results);
103139
- const hidden = (_a = this.hiddenDetails) !== null && _a !== void 0 ? _a : [];
103140
- this.summary = baseSummary;
103141
- this.visibleSummary = Object.keys(baseSummary)
103142
- .filter((k) => !hidden.includes(k))
103143
- .reduce((reducedSummary, key) => (Object.assign(Object.assign({}, reducedSummary), { [key]: baseSummary[key] })), {});
103401
+ (_a = this.overlay) === null || _a === void 0 ? void 0 : _a.dispose();
103402
+ };
103403
+ this.handleOutcomeChange = () => {
103404
+ this.updateStateFromModel();
103144
103405
  };
103145
103406
  }
103407
+ /**
103408
+ * @internal
103409
+ */
103146
103410
  connectedCallback() {
103147
- this.resultsChangeListener = this.measurementModel.onResultsChanged(this.handleResultsChange);
103148
- }
103149
- componentWillLoad() {
103150
- this.parseHiddenDetails();
103151
- }
103152
- componentWillUpdate() {
103153
- this.parseHiddenDetails();
103411
+ this.onOutcomeChangedHandler = this.measurementModel.onOutcomeChanged(this.handleOutcomeChange);
103412
+ this.updateStateFromModel();
103154
103413
  }
103414
+ /**
103415
+ * @internal
103416
+ */
103155
103417
  disconnectedCallback() {
103156
103418
  var _a;
103157
- (_a = this.resultsChangeListener) === null || _a === void 0 ? void 0 : _a.dispose();
103419
+ (_a = this.onOutcomeChangedHandler) === null || _a === void 0 ? void 0 : _a.dispose();
103158
103420
  }
103421
+ /**
103422
+ * @internal
103423
+ */
103159
103424
  handleDistanceUnitsChanged() {
103160
103425
  this.distanceMeasurementUnits = new DistanceUnits(this.distanceUnits);
103161
103426
  this.areaMeasurementUnits = new AreaUnits(this.distanceUnits);
103162
103427
  }
103428
+ /**
103429
+ * @internal
103430
+ */
103163
103431
  handleAngleUnitsChanged() {
103164
103432
  this.angleMeasurementUnits = new AngleUnits(this.angleUnits);
103165
103433
  }
103434
+ /**
103435
+ * @internal
103436
+ */
103166
103437
  handleMeasurementModelChanged() {
103167
103438
  var _a;
103168
- (_a = this.resultsChangeListener) === null || _a === void 0 ? void 0 : _a.dispose();
103169
- this.resultsChangeListener = this.measurementModel.onResultsChanged(this.handleResultsChange);
103439
+ (_a = this.onOutcomeChangedHandler) === null || _a === void 0 ? void 0 : _a.dispose();
103440
+ this.onOutcomeChangedHandler = this.measurementModel.onOutcomeChanged(this.handleOutcomeChange);
103441
+ this.updateStateFromModel();
103170
103442
  }
103171
- handleHiddenDetailsChanged() {
103172
- this.createSummary();
103443
+ /**
103444
+ * @internal
103445
+ */
103446
+ handleResultTypesChanged() {
103447
+ this.updateStateFromModel();
103173
103448
  }
103449
+ /**
103450
+ * @internal
103451
+ */
103174
103452
  render() {
103175
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
103176
- return this.visibleSummary != null ? (h(Host, null, ((_a = this.visibleSummary) === null || _a === void 0 ? void 0 : _a.angle) != null && (h("div", { class: "measurement-details-entry" }, h("div", { class: "measurement-details-entry-label" }, "Angle:"), this.formatAngle(this.visibleSummary.angle))), ((_b = this.visibleSummary) === null || _b === void 0 ? void 0 : _b.parallelDistance) != null && (h("div", { class: "measurement-details-entry" }, h("div", { class: "measurement-details-entry-label" }, "Parallel Dist:"), this.formatDistance(this.visibleSummary.parallelDistance))), ((_c = this.visibleSummary) === null || _c === void 0 ? void 0 : _c.minDistance) != null && (h("div", { class: "measurement-details-entry" }, h("div", { class: "measurement-details-entry-label" }, "Min Dist:"), this.formatDistance(this.visibleSummary.minDistance))), ((_d = this.visibleSummary) === null || _d === void 0 ? void 0 : _d.area) != null && (h("div", { class: "measurement-details-entry" }, h("div", { class: "measurement-details-entry-label" }, "Area:"), h("div", { innerHTML: this.formatArea(this.visibleSummary.area) }))), ((_f = (_e = this.visibleSummary) === null || _e === void 0 ? void 0 : _e.distanceVector) === null || _f === void 0 ? void 0 : _f.x) != null && (h("div", { class: "measurement-details-entry" }, h("div", { class: "measurement-details-entry-label x-label" }, "X:"), this.formatDistance((_g = this.visibleSummary.distanceVector) === null || _g === void 0 ? void 0 : _g.x))), ((_j = (_h = this.visibleSummary) === null || _h === void 0 ? void 0 : _h.distanceVector) === null || _j === void 0 ? void 0 : _j.y) != null && (h("div", { class: "measurement-details-entry" }, h("div", { class: "measurement-details-entry-label y-label" }, "Y:"), this.formatDistance((_k = this.visibleSummary.distanceVector) === null || _k === void 0 ? void 0 : _k.y))), ((_m = (_l = this.visibleSummary) === null || _l === void 0 ? void 0 : _l.distanceVector) === null || _m === void 0 ? void 0 : _m.z) != null && (h("div", { class: "measurement-details-entry" }, h("div", { class: "measurement-details-entry-label z-label" }, "Z:"), this.formatDistance((_o = this.visibleSummary.distanceVector) === null || _o === void 0 ? void 0 : _o.z))))) : (h(Host, null));
103453
+ return (h(Host, null, this.renderResult('planar-angle', (result) => (h(PlanarAngleResultEntry, { result: result, overlays: this.measurementOverlays, formatter: this.makeAngleFormatter(), onShowOverlay: this.handleShowOverlay, onHideOverlay: this.handleHideOverlay }))), this.renderResult('planar-distance', (result) => (h(PlanarDistanceResultEntry, { result: result, overlays: this.measurementOverlays, formatter: this.makeDistanceFormatter(), onShowOverlay: this.handleShowOverlay, onHideOverlay: this.handleHideOverlay }))), this.renderResult('surface-area', (result) => (h(SurfaceAreaResultEntry, { result: result, overlays: this.measurementOverlays, formatter: this.makeAreaFormatter(), onShowOverlay: this.handleShowOverlay, onHideOverlay: this.handleHideOverlay }))), this.renderResult('minimum-distance', (result) => (h(MinimumDistanceResultEntry, { result: result, overlays: this.measurementOverlays, formatter: this.makeDistanceFormatter(), onShowOverlay: this.handleShowOverlay, onHideOverlay: this.handleHideOverlay })))));
103177
103454
  }
103178
- parseHiddenDetails() {
103179
- if (this.hiddenDetailsJson != null) {
103180
- this.hiddenDetails = JSON.parse(this.hiddenDetailsJson);
103455
+ updateStateFromModel() {
103456
+ const isFilteredResultType = (result) => {
103457
+ var _a, _b;
103458
+ return (_b = (_a = this.resultTypes) === null || _a === void 0 ? void 0 : _a.includes(result.type)) !== null && _b !== void 0 ? _b : true;
103459
+ };
103460
+ const outcome = this.measurementModel.getOutcome();
103461
+ if (outcome != null) {
103462
+ this.results = outcome.results.filter(isFilteredResultType);
103463
+ this.isApproximate = outcome.isApproximate;
103464
+ }
103465
+ else {
103466
+ this.results = [];
103467
+ this.isApproximate = false;
103181
103468
  }
103182
103469
  }
103470
+ renderResult(type, render) {
103471
+ const result = this.getResultForType(type);
103472
+ return result != null ? render(result) : undefined;
103473
+ }
103474
+ getResultForType(type) {
103475
+ return this.results.find((result) => result.type === type);
103476
+ }
103477
+ makeDistanceFormatter() {
103478
+ return this.makeFormatter((value) => this.distanceMeasurementUnits.convertWorldValueToReal(value), this.distanceMeasurementUnits.unit, this.distanceFormatter);
103479
+ }
103480
+ makeAngleFormatter() {
103481
+ return this.makeFormatter((value) => this.angleMeasurementUnits.convertTo(value), this.angleMeasurementUnits.unit, this.angleFormatter);
103482
+ }
103483
+ makeAreaFormatter() {
103484
+ return this.makeFormatter((value) => this.areaMeasurementUnits.convertWorldValueToReal(value), this.areaMeasurementUnits.unit, this.areaFormatter);
103485
+ }
103486
+ makeFormatter(convert, units, customFormatter) {
103487
+ return (value) => {
103488
+ const v = convert(value);
103489
+ if (customFormatter != null) {
103490
+ return customFormatter(v);
103491
+ }
103492
+ else {
103493
+ return this.formatValue(v, units);
103494
+ }
103495
+ };
103496
+ }
103497
+ formatValue(value, unit) {
103498
+ const val = value.toFixed(this.fractionalDigits);
103499
+ return `${this.isApproximate ? '~' + val : val} ${unit.abbreviatedName}`;
103500
+ }
103183
103501
  static get watchers() { return {
103184
103502
  "distanceUnits": ["handleDistanceUnitsChanged"],
103185
103503
  "angleUnits": ["handleAngleUnitsChanged"],
103186
103504
  "measurementModel": ["handleMeasurementModelChanged"],
103187
- "hiddenDetails": ["handleHiddenDetailsChanged"]
103505
+ "resultTypes": ["handleResultTypesChanged"]
103188
103506
  }; }
103189
103507
  static get style() { return viewerMeasurementDetailsCss; }
103190
103508
  };
@@ -103547,21 +103865,10 @@ async function getHit(raycaster, pt) {
103547
103865
  return undefined;
103548
103866
  }
103549
103867
  function validMeasurement(start, end) {
103550
- return {
103551
- type: 'point-to-point',
103552
- start,
103553
- end,
103554
- distance: vector3.distance(start, end),
103555
- valid: true,
103556
- };
103868
+ return { start, end, distance: vector3.distance(start, end), valid: true };
103557
103869
  }
103558
103870
  function invalidMeasurement(start, end) {
103559
- return {
103560
- type: 'point-to-point',
103561
- start,
103562
- end,
103563
- valid: false,
103564
- };
103871
+ return { start, end, valid: false };
103565
103872
  }
103566
103873
 
103567
103874
  function translateWorldPtToViewport(pt, projectionViewMatrix, viewport) {
@@ -103656,6 +103963,11 @@ let ViewerMeasurementDistance = class extends HTMLElement$1 {
103656
103963
  this.__attachShadow();
103657
103964
  this.editBegin = createEvent(this, "editBegin", 7);
103658
103965
  this.editEnd = createEvent(this, "editEnd", 7);
103966
+ /**
103967
+ * Enables the display of axis reference lines between the start and end
103968
+ * point.
103969
+ */
103970
+ this.showAxisReferenceLines = false;
103659
103971
  /**
103660
103972
  * The distance, in pixels, between the mouse and nearest snappable edge. A
103661
103973
  * value of 0 disables snapping.
@@ -103700,6 +104012,7 @@ let ViewerMeasurementDistance = class extends HTMLElement$1 {
103700
104012
  this.stateMap = {};
103701
104013
  this.model = PointToPointInteractionModel.empty();
103702
104014
  this.controller = new PointToPointInteractionController(this.model);
104015
+ this.overlays = new MeasurementOverlayManager();
103703
104016
  this.measurementUnits = new DistanceUnits(this.units);
103704
104017
  this.isUserInteractingWithModel = false;
103705
104018
  this.handleFrameDrawn = () => {
@@ -103858,13 +104171,13 @@ let ViewerMeasurementDistance = class extends HTMLElement$1 {
103858
104171
  const { startPt, endPt, labelPt, indicatorPt, hideStart, hideEnd } = positions;
103859
104172
  const distance = this.formatDistance(this.distance);
103860
104173
  if (this.mode === 'edit') {
103861
- return (h(Host, null, h("div", { class: "measurement" }, 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') }))));
104174
+ return (h(Host, null, this.showAxisReferenceLines && (h("vertex-viewer-measurement-overlays", { measurementOverlays: this.overlays, viewer: this.viewer })), h("div", { class: "measurement" }, 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') }))));
103862
104175
  }
103863
104176
  else if (this.mode === 'replace') {
103864
- return (h(Host, null, h("div", { class: "measurement" }, h(DistanceMeasurementRenderer, { startPt: startPt, endPt: endPt, centerPt: labelPt, indicatorPt: indicatorPt, distance: distance, hideStartAnchor: hideStart, hideEndAnchor: hideEnd, anchorLabelOffset: this.anchorLabelOffset, lineCapLength: this.lineCapLength }))));
104177
+ return (h(Host, null, this.showAxisReferenceLines && (h("vertex-viewer-measurement-overlays", { measurementOverlays: this.overlays, viewer: this.viewer })), h("div", { class: "measurement" }, h(DistanceMeasurementRenderer, { startPt: startPt, endPt: endPt, centerPt: labelPt, indicatorPt: indicatorPt, distance: distance, hideStartAnchor: hideStart, hideEndAnchor: hideEnd, anchorLabelOffset: this.anchorLabelOffset, lineCapLength: this.lineCapLength }))));
103865
104178
  }
103866
104179
  else {
103867
- return (h(Host, null, h("div", { class: "measurement" }, 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" }))));
104180
+ return (h(Host, null, this.showAxisReferenceLines && (h("vertex-viewer-measurement-overlays", { measurementOverlays: this.overlays, viewer: this.viewer })), h("div", { class: "measurement" }, 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" }))));
103868
104181
  }
103869
104182
  }
103870
104183
  /**
@@ -103911,6 +104224,18 @@ let ViewerMeasurementDistance = class extends HTMLElement$1 {
103911
104224
  this.updateCamera();
103912
104225
  this.updateDepthBuffer();
103913
104226
  this.updateMeasurementPropsFromModel();
104227
+ this.updateOverlays();
104228
+ }
104229
+ updateOverlays() {
104230
+ var _a;
104231
+ (_a = this.overlay) === null || _a === void 0 ? void 0 : _a.dispose();
104232
+ if (this.showAxisReferenceLines &&
104233
+ this.interactionCount === 0 &&
104234
+ !this.invalid &&
104235
+ this.start != null &&
104236
+ this.end != null) {
104237
+ this.overlay = this.overlays.addDistanceVector(this.start, this.end);
104238
+ }
103914
104239
  }
103915
104240
  async setCursor(cursor) {
103916
104241
  var _a, _b;
@@ -104194,6 +104519,112 @@ function getPerpendicularLine(pt, angle, length) {
104194
104519
  return { start, end };
104195
104520
  }
104196
104521
 
104522
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
104523
+ const MeasurementOverlayView = ({ overlay, viewport, camera }) => {
104524
+ if (overlay.type === 'line') {
104525
+ return (h(LineOverlayView, { overlay: overlay, viewport: viewport, camera: camera }));
104526
+ }
104527
+ else {
104528
+ return (h(DistanceVectorOverlayView, { overlay: overlay, viewport: viewport, camera: camera }));
104529
+ }
104530
+ };
104531
+ const LineOverlayView = ({ overlay: { start, end }, camera, viewport }) => {
104532
+ const m = camera.projectionViewMatrix;
104533
+ const sw = viewport.transformWorldToViewport(start, m);
104534
+ const ew = viewport.transformWorldToViewport(end, m);
104535
+ return (h("vertex-viewer-measurement-line", { class: "measurement-line", start: sw, end: ew }));
104536
+ };
104537
+ const DistanceVectorOverlayView = ({ overlay: { x, y, z }, camera, viewport }) => {
104538
+ const m = camera.projectionViewMatrix;
104539
+ const xs = viewport.transformWorldToViewport(x.start, m);
104540
+ const xe = viewport.transformWorldToViewport(x.end, m);
104541
+ const ys = viewport.transformWorldToViewport(y.start, m);
104542
+ const ye = viewport.transformWorldToViewport(y.end, m);
104543
+ const zs = viewport.transformWorldToViewport(z.start, m);
104544
+ const ze = viewport.transformWorldToViewport(z.end, m);
104545
+ return (h(Fragment, null,
104546
+ h("vertex-viewer-measurement-line", { class: "measurement-line distance-vector-x", start: xs, end: xe }),
104547
+ h("vertex-viewer-measurement-line", { class: "measurement-line distance-vector-y", start: ys, end: ye }),
104548
+ h("vertex-viewer-measurement-line", { class: "measurement-line distance-vector-z", start: zs, end: ze })));
104549
+ };
104550
+
104551
+ const viewerMeasurementOverlaysCss = ":host{display:block;position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none;--viewer-measurement-overlays-x-axis-color:var(--x-axis-color);--viewer-measurement-overlays-y-axis-color:var(--y-axis-color);--viewer-measurement-overlays-z-axis-color:var(--z-axis-color)}.measurement-line{position:absolute;width:100%;height:100%}.measurement-line.distance-vector-x{--viewer-measurement-line-fill:var(\n --viewer-measurement-overlays-x-axis-color\n )}.measurement-line.distance-vector-y{--viewer-measurement-line-fill:var(\n --viewer-measurement-overlays-y-axis-color\n )}.measurement-line.distance-vector-z{--viewer-measurement-line-fill:var(\n --viewer-measurement-overlays-z-axis-color\n )}";
104552
+
104553
+ let ViewerMeasurementOverlays = class extends HTMLElement$1 {
104554
+ constructor() {
104555
+ super();
104556
+ this.__registerHost();
104557
+ this.__attachShadow();
104558
+ /**
104559
+ * The model that contains the overlays to present.
104560
+ */
104561
+ this.measurementOverlays = new MeasurementOverlayManager();
104562
+ this.overlays = [];
104563
+ this.updateCamera = () => {
104564
+ var _a, _b;
104565
+ this.camera = (_b = (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.frame) === null || _b === void 0 ? void 0 : _b.scene.camera;
104566
+ };
104567
+ }
104568
+ /**
104569
+ * @ignore
104570
+ */
104571
+ handleMeasurementOverlaysChanged() {
104572
+ this.removeModelListeners();
104573
+ this.addModelListeners();
104574
+ this.updateOverlays();
104575
+ }
104576
+ /**
104577
+ * @ignore
104578
+ */
104579
+ handleViewerChanged(newViewer, oldViewer) {
104580
+ this.removeViewerListeners(oldViewer);
104581
+ this.addViewerListeners();
104582
+ this.updateCamera();
104583
+ }
104584
+ /**
104585
+ * @ignore
104586
+ */
104587
+ componentWillLoad() {
104588
+ this.addModelListeners();
104589
+ this.addViewerListeners();
104590
+ this.updateOverlays();
104591
+ this.updateCamera();
104592
+ }
104593
+ addModelListeners() {
104594
+ this.onOverlaysChangedListener = this.measurementOverlays.onOverlaysChanged(() => this.updateOverlays());
104595
+ }
104596
+ removeModelListeners() {
104597
+ var _a;
104598
+ (_a = this.onOverlaysChangedListener) === null || _a === void 0 ? void 0 : _a.dispose();
104599
+ this.onOverlaysChangedListener = undefined;
104600
+ }
104601
+ addViewerListeners() {
104602
+ var _a;
104603
+ (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.addEventListener('frameReceived', this.updateCamera);
104604
+ }
104605
+ removeViewerListeners(viewer) {
104606
+ viewer === null || viewer === void 0 ? void 0 : viewer.removeEventListener('frameReceived', this.updateCamera);
104607
+ }
104608
+ updateOverlays() {
104609
+ this.overlays = this.measurementOverlays.getOverlays();
104610
+ }
104611
+ /**
104612
+ * @ignore
104613
+ */
104614
+ render() {
104615
+ return (h(Host, null, this.overlays.map((overlay) => {
104616
+ if (this.camera != null && this.viewer != null) {
104617
+ return (h(MeasurementOverlayView, { overlay: overlay, viewport: this.viewer.viewport, camera: this.camera }));
104618
+ }
104619
+ })));
104620
+ }
104621
+ static get watchers() { return {
104622
+ "measurementOverlays": ["handleMeasurementOverlaysChanged"],
104623
+ "viewer": ["handleViewerChanged"]
104624
+ }; }
104625
+ static get style() { return viewerMeasurementOverlaysCss; }
104626
+ };
104627
+
104197
104628
  // package: vertexvis.protobuf.sceneview.v1
104198
104629
  // file: sceneview/protos/scene_view_api.proto
104199
104630
 
@@ -104293,59 +104724,122 @@ SceneViewAPIClient.prototype.measure = function measure(requestMessage, metadata
104293
104724
 
104294
104725
  var SceneViewAPIClient_1 = SceneViewAPIClient;
104295
104726
 
104296
- class PreciseMeasurementInteractionHandler {
104297
- constructor(controller) {
104727
+ class ElementRectObserver {
104728
+ constructor() {
104729
+ this.observer = new ResizeObserver(() => this.measure());
104730
+ }
104731
+ observe(element) {
104732
+ this.element = element;
104733
+ this.observer.observe(element);
104734
+ this.measure();
104735
+ }
104736
+ disconnect() {
104737
+ this.element = undefined;
104738
+ this.observer.disconnect();
104739
+ }
104740
+ measure() {
104741
+ var _a;
104742
+ this.rect = (_a = this.element) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect();
104743
+ }
104744
+ }
104745
+
104746
+ class MeasurementInteractionHandler {
104747
+ constructor(controller, measurableEntityTypes) {
104748
+ this.rectObserver = new ElementRectObserver();
104749
+ this.handlePointerMove = async (event) => {
104750
+ if (await this.isMeasurableEntityUnderPointer(event)) {
104751
+ this.clearCursor();
104752
+ this.addCursor(measurementWithArrowCursor);
104753
+ }
104754
+ else {
104755
+ this.clearCursor();
104756
+ }
104757
+ };
104298
104758
  this.handlePointerDown = (event) => {
104299
- this.ifNoInteraction(event, () => {
104300
- this.ifInitialized(async ({ element, api }) => {
104301
- const pt = getMouseClientPosition(event, element.getBoundingClientRect());
104302
- const [hit] = await api.hitItems(pt);
104303
- if (hit != null) {
104304
- this.controller.addEntity(MeasurementEntity.fromHit(hit));
104305
- }
104306
- else {
104307
- this.controller.clearEntities();
104308
- }
104309
- });
104759
+ this.ifNoInteraction(event, async () => {
104760
+ if (await this.isMeasurableEntityUnderPointer(event)) {
104761
+ this.measureEntityUnderPointer(event);
104762
+ }
104763
+ else {
104764
+ this.controller.clearEntities();
104765
+ }
104310
104766
  });
104311
104767
  };
104312
104768
  this.controller = controller;
104769
+ this.measurableEntityTypes = measurableEntityTypes;
104770
+ }
104771
+ get elementRect() {
104772
+ return this.rectObserver.rect;
104313
104773
  }
104314
104774
  initialize(element, api) {
104315
104775
  this.element = element;
104316
104776
  this.api = api;
104777
+ this.rectObserver.observe(element);
104778
+ element.addEventListener('pointermove', this.handlePointerMove);
104317
104779
  element.addEventListener('pointerdown', this.handlePointerDown);
104318
104780
  }
104319
104781
  dispose() {
104782
+ var _a, _b, _c;
104783
+ this.rectObserver.disconnect();
104784
+ (_a = this.measurementInteraction) === null || _a === void 0 ? void 0 : _a.dispose();
104785
+ this.clearCursor();
104786
+ (_b = this.element) === null || _b === void 0 ? void 0 : _b.removeEventListener('pointermove', this.handlePointerMove);
104787
+ (_c = this.element) === null || _c === void 0 ? void 0 : _c.removeEventListener('pointerdown', this.handlePointerDown);
104788
+ this.element = undefined;
104789
+ this.api = undefined;
104790
+ }
104791
+ addCursor(cursor) {
104792
+ this.cursor = this.ifInitialized(({ api }) => api.addCursor(cursor));
104793
+ }
104794
+ clearCursor() {
104320
104795
  var _a;
104321
- (_a = this.element) === null || _a === void 0 ? void 0 : _a.removeEventListener('pointerdown', this.handlePointerDown);
104796
+ (_a = this.cursor) === null || _a === void 0 ? void 0 : _a.dispose();
104797
+ this.cursor = undefined;
104798
+ }
104799
+ async isMeasurableEntityUnderPointer(event) {
104800
+ var _a;
104801
+ const pt = getMouseClientPosition(event, this.elementRect);
104802
+ const type = await ((_a = this.api) === null || _a === void 0 ? void 0 : _a.getEntityTypeAtPoint(pt));
104803
+ return type != null && this.measurableEntityTypes.includes(type);
104804
+ }
104805
+ measureEntityUnderPointer(event) {
104806
+ this.ifInitialized(async ({ api }) => {
104807
+ const pt = getMouseClientPosition(event, this.elementRect);
104808
+ const [hit] = await api.hitItems(pt);
104809
+ if (hit != null) {
104810
+ this.controller.addEntity(MeasurementEntity.fromHit(hit));
104811
+ }
104812
+ else {
104813
+ this.controller.clearEntities();
104814
+ }
104815
+ });
104816
+ }
104817
+ ifInitialized(f) {
104818
+ if (this.element != null && this.api != null) {
104819
+ return f({ element: this.element, api: this.api });
104820
+ }
104821
+ else {
104822
+ throw new Error('Measurement interaction handler not initialized.');
104823
+ }
104322
104824
  }
104323
104825
  ifNoInteraction(event, f) {
104324
104826
  const startPos = point.create(event.clientX, event.clientY);
104325
104827
  let didInteract = false;
104326
- function handleMouseMove(event) {
104828
+ const handleMouseMove = (event) => {
104327
104829
  const pos = point.create(event.clientX, event.clientY);
104328
104830
  const dis = point.distance(startPos, pos);
104329
104831
  didInteract = dis > 2;
104330
- }
104331
- function handleMouseUp() {
104832
+ };
104833
+ const handleMouseUp = () => {
104332
104834
  window.removeEventListener('pointermove', handleMouseMove);
104333
104835
  window.removeEventListener('pointerup', handleMouseUp);
104334
104836
  if (!didInteract) {
104335
104837
  f();
104336
104838
  }
104337
- }
104839
+ };
104338
104840
  window.addEventListener('pointermove', handleMouseMove);
104339
104841
  window.addEventListener('pointerup', handleMouseUp);
104340
104842
  }
104341
- ifInitialized(f) {
104342
- if (this.element != null && this.api != null) {
104343
- return f({ element: this.element, api: this.api });
104344
- }
104345
- else {
104346
- throw new Error('Measurement interaction handler not initialized');
104347
- }
104348
- }
104349
104843
  }
104350
104844
 
104351
104845
  const viewerMeasurementPreciseCss = ":host{display:block;position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none}";
@@ -104355,36 +104849,80 @@ let ViewerMeasurementPrecise = class extends HTMLElement$1 {
104355
104849
  super();
104356
104850
  this.__registerHost();
104357
104851
  this.__attachShadow();
104852
+ /**
104853
+ * The model that contains the entities and outcomes from performing precise
104854
+ * measurements.
104855
+ */
104358
104856
  this.measurementModel = new MeasurementModel();
104857
+ /**
104858
+ * The manager that is responsible for measurement overlays to present by this
104859
+ * component.
104860
+ */
104861
+ this.measurementOverlays = new MeasurementOverlayManager();
104862
+ /**
104863
+ * @internal
104864
+ *
104865
+ * An internal property that can be used to opt-in to performing measurements
104866
+ * on other types of entities.
104867
+ */
104868
+ this.measurableEntityTypes = [EntityType.PRECISE_SURFACE];
104869
+ /**
104870
+ * The environment that will be used to request measurement results.
104871
+ */
104359
104872
  this.configEnv = 'platprod';
104360
- this.entities = [];
104361
- this.handleEntitiesChanged = () => {
104362
- this.updateEntities();
104363
- };
104873
+ this.overlays = [];
104364
104874
  }
104875
+ /**
104876
+ * @ignore
104877
+ */
104365
104878
  connectedCallback() {
104366
104879
  this.setupInteractionHandler();
104367
104880
  }
104881
+ /**
104882
+ * @ignore
104883
+ */
104368
104884
  componentWillLoad() {
104369
104885
  this.setupController();
104370
- this.setupInteractionHandler();
104371
104886
  this.setupModelListeners();
104887
+ this.setupInteractionHandler();
104372
104888
  }
104889
+ /**
104890
+ * @ignore
104891
+ */
104373
104892
  disconnectedCallback() {
104374
104893
  this.clearInteractionHandler();
104894
+ this.clearModelListeners();
104895
+ }
104896
+ /**
104897
+ * @ignore
104898
+ */
104899
+ handleMeasurableEntityTypesChanged() {
104900
+ this.setupInteractionHandler();
104375
104901
  }
104902
+ /**
104903
+ * @ignore
104904
+ */
104376
104905
  handleMeasurementControllerChanged() {
104377
104906
  this.setupInteractionHandler();
104378
104907
  }
104908
+ /**
104909
+ * @ignore
104910
+ */
104379
104911
  handleMeasurementModelChanged() {
104380
104912
  this.setupController();
104381
104913
  this.setupModelListeners();
104382
104914
  }
104915
+ /**
104916
+ * @ignore
104917
+ */
104383
104918
  handleViewerChanged() {
104384
104919
  this.setupInteractionHandler();
104385
104920
  }
104921
+ /**
104922
+ * @ignore
104923
+ */
104386
104924
  render() {
104387
- return h(Host, null);
104925
+ return (h(Host, null, h("vertex-viewer-measurement-overlays", { viewer: this.viewer, measurementOverlays: this.measurementOverlays })));
104388
104926
  }
104389
104927
  setupController() {
104390
104928
  var _a;
@@ -104402,24 +104940,23 @@ let ViewerMeasurementPrecise = class extends HTMLElement$1 {
104402
104940
  this.clearInteractionHandler();
104403
104941
  if (this.measurementController != null) {
104404
104942
  this.registeredInteractionHandler =
104405
- (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.registerInteractionHandler(new PreciseMeasurementInteractionHandler(this.measurementController));
104943
+ (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.registerInteractionHandler(new MeasurementInteractionHandler(this.measurementController, this.measurableEntityTypes));
104406
104944
  }
104407
104945
  }
104408
104946
  clearModelListeners() {
104409
- var _a;
104410
- (_a = this.onEntitiesChangedDisposable) === null || _a === void 0 ? void 0 : _a.dispose();
104411
- this.onEntitiesChangedDisposable = undefined;
104947
+ var _a, _b;
104948
+ (_a = this.onEntitiesChangedHandler) === null || _a === void 0 ? void 0 : _a.dispose();
104949
+ this.onEntitiesChangedHandler = undefined;
104950
+ (_b = this.onOverlaysChangedHandler) === null || _b === void 0 ? void 0 : _b.dispose();
104951
+ this.onOverlaysChangedHandler = undefined;
104412
104952
  }
104413
104953
  setupModelListeners() {
104414
- var _a;
104415
- this.clearModelListeners();
104416
- this.onEntitiesChangedDisposable = (_a = this.measurementModel) === null || _a === void 0 ? void 0 : _a.onEntitiesChanged(this.handleEntitiesChanged);
104417
- }
104418
- updateEntities() {
104419
- var _a, _b;
104420
- this.entities = (_b = (_a = this.measurementModel) === null || _a === void 0 ? void 0 : _a.getEntities()) !== null && _b !== void 0 ? _b : [];
104954
+ this.onOverlaysChangedHandler = this.measurementOverlays.onOverlaysChanged((overlays) => {
104955
+ this.overlays = overlays;
104956
+ });
104421
104957
  }
104422
104958
  static get watchers() { return {
104959
+ "measurableEntityTypes": ["handleMeasurableEntityTypesChanged"],
104423
104960
  "measurementController": ["handleMeasurementControllerChanged"],
104424
104961
  "measurementModel": ["handleMeasurementModelChanged"],
104425
104962
  "viewer": ["handleViewerChanged"]
@@ -104627,6 +105164,17 @@ let ViewerMeasurements = class extends HTMLElement$1 {
104627
105164
  * value of 0 disables snapping.
104628
105165
  */
104629
105166
  this.snapDistance = MEASUREMENT_SNAP_DISTANCE;
105167
+ /**
105168
+ * Enables the display of axis reference lines between the start and end
105169
+ * point of selected measurements.
105170
+ */
105171
+ this.showAxisReferenceLines = false;
105172
+ /**
105173
+ * The measurement model that will be updated with the selected measurement.
105174
+ * You can pass this to a <vertex-viewer-measurement-details> component to
105175
+ * display measurement outcomes.
105176
+ */
105177
+ this.measurementModel = new MeasurementModel();
104630
105178
  }
104631
105179
  /**
104632
105180
  * Adds a new measurement as a child to this component. A new measurement
@@ -104695,9 +105243,23 @@ let ViewerMeasurements = class extends HTMLElement$1 {
104695
105243
  * @ignore
104696
105244
  */
104697
105245
  async handleSelectedMeasurementIdChanged() {
105246
+ this.measurementModel.clearOutcome();
104698
105247
  const measurements = await this.getMeasurementElements();
104699
105248
  measurements.forEach((m) => {
104700
- m.mode = m.id === this.selectedMeasurementId ? 'edit' : '';
105249
+ if (m.id === this.selectedMeasurementId) {
105250
+ m.mode = 'edit';
105251
+ m.showAxisReferenceLines = this.showAxisReferenceLines;
105252
+ if (m.start != null && m.end != null) {
105253
+ this.measurementModel.setOutcome({
105254
+ isApproximate: true,
105255
+ results: [makeMinimumDistanceResult(m.start, m.end)],
105256
+ });
105257
+ }
105258
+ }
105259
+ else {
105260
+ m.mode = '';
105261
+ m.showAxisReferenceLines = false;
105262
+ }
104701
105263
  });
104702
105264
  }
104703
105265
  /**
@@ -104957,7 +105519,7 @@ const ViewCubeShadow = ({ length, }) => {
104957
105519
  h("div", { class: "cube-shadow-face" })));
104958
105520
  };
104959
105521
 
104960
- const viewerViewCubeCss = ":host{--viewer-view-cube-side-background:var(--white);--viewer-view-cube-side-background-hover:var(--blue-500);--viewer-view-cube-side-background-hover-opacity:0.25;--viewer-view-cube-side-border:1.5px solid var(--neutral-500);--viewer-view-cube-edge-length:12px;--viewer-view-cube-opacity:0.8;display:block;color:var(--neutral-700);width:80px;height:80px;margin:20px;position:relative;display:flex;align-items:center;justify-content:center;user-select:none}.renderer{position:unset;width:100%;height:100%;overflow:visible}.reference-point{width:5px;height:5px;border-radius:50%;background-color:black}.triad{pointer-events:none}.triad-axis{width:100%;height:1.5px;outline:1px solid transparent;transform:translateX(50%)}.triad-axis-x{background-color:#ea3324}.triad-axis-y{background-color:#4faf32}.triad-axis-z{background-color:#0000ff}.triad-label{font-family:Arial, Helvetica, sans-serif;font-size:0.6875rem}.triad-label-x{color:#ea3324}.triad-label-y{color:#4faf32}.triad-label-z{color:#0000ff}.cube{pointer-events:initial}.cube:hover .cube-side-face{opacity:1}.cube-side{backface-visibility:hidden;-webkit-backface-visibility:hidden}.cube-side-face{box-sizing:border-box;font-size:0.875rem;text-transform:uppercase;width:100%;height:100%;background-color:var(--viewer-view-cube-side-background);border:var(--viewer-view-cube-side-border);display:flex;align-items:center;justify-content:center;outline:1px solid transparent;opacity:var(--viewer-view-cube-opacity);transition:opacity 0.2s ease-in-out}.cube-side-face::before{content:'';position:absolute;left:calc(var(--viewer-view-cube-edge-length) - 4px);right:calc(var(--viewer-view-cube-edge-length) - 4px);top:calc(var(--viewer-view-cube-edge-length) - 4px);bottom:calc(var(--viewer-view-cube-edge-length) - 4px)}.cube-corner,.cube-edge{position:relative}.cube-corner-face,.cube-edge-face{position:absolute;backface-visibility:hidden;-webkit-backface-visibility:hidden}.cube-edge-face.top{top:0;left:var(--viewer-view-cube-edge-length);right:var(--viewer-view-cube-edge-length);height:var(--viewer-view-cube-edge-length)}.cube-edge-face.bottom{bottom:0;left:var(--viewer-view-cube-edge-length);right:var(--viewer-view-cube-edge-length);height:var(--viewer-view-cube-edge-length)}.cube-edge-face.left{left:0;top:var(--viewer-view-cube-edge-length);bottom:var(--viewer-view-cube-edge-length);width:var(--viewer-view-cube-edge-length)}.cube-edge-face.right{right:0;top:var(--viewer-view-cube-edge-length);bottom:var(--viewer-view-cube-edge-length);width:var(--viewer-view-cube-edge-length)}.cube-corner-face{width:var(--viewer-view-cube-edge-length);height:var(--viewer-view-cube-edge-length)}.cube-corner-face.top-left{top:0;left:0}.cube-corner-face.top-right{top:0;right:0}.cube-corner-face.bottom-right{bottom:0;right:0}.cube-corner-face.bottom-left{bottom:0;left:0}.cube-shadow{backface-visibility:hidden;-webkit-backface-visibility:hidden}.cube-shadow-face{position:absolute;left:4px;right:4px;top:4px;bottom:4px;background-color:black;opacity:0.12;filter:blur(4px)}.cube-corner .cube-corner-face,.cube-edge .cube-edge-face,.cube-side .cube-side-face::before{background:var(--viewer-view-cube-side-background-hover);opacity:0}.cube-corner:hover .cube-corner-face,.cube-edge:hover .cube-edge-face,.cube-side:hover .cube-side-face::before{opacity:var(--viewer-view-cube-side-background-hover-opacity)}.cube-corner.disabled,.cube-edge.disabled,.cube-side.disabled{pointer-events:none}";
105522
+ const viewerViewCubeCss = ":host{--viewer-view-cube-side-background:var(--white);--viewer-view-cube-side-background-hover:var(--blue-500);--viewer-view-cube-side-background-hover-opacity:0.25;--viewer-view-cube-side-border:1.5px solid var(--neutral-500);--viewer-view-cube-edge-length:12px;--viewer-view-cube-opacity:0.8;--viewer-view-cube-triad-x-axis-color:var(--x-axis-color);--viewer-view-cube-triad-y-axis-color:var(--y-axis-color);--viewer-view-cube-triad-z-axis-color:var(--z-axis-color);display:block;color:var(--neutral-700);width:80px;height:80px;margin:20px;position:relative;display:flex;align-items:center;justify-content:center;user-select:none}.renderer{position:unset;width:100%;height:100%;overflow:visible}.reference-point{width:5px;height:5px;border-radius:50%;background-color:black}.triad{pointer-events:none}.triad-axis{width:100%;height:1.5px;outline:1px solid transparent;transform:translateX(50%)}.triad-axis-x{background-color:#ea3324}.triad-axis-y{background-color:#4faf32}.triad-axis-z{background-color:#0000ff}.triad-label{font-family:Arial, Helvetica, sans-serif;font-size:0.6875rem}.triad-label-x{color:var(--viewer-view-cube-triad-x-axis-color)}.triad-label-y{color:var(--viewer-view-cube-triad-y-axis-color)}.triad-label-z{color:var(--viewer-view-cube-triad-z-axis-color)}.cube{pointer-events:initial}.cube:hover .cube-side-face{opacity:1}.cube-side{backface-visibility:hidden;-webkit-backface-visibility:hidden}.cube-side-face{box-sizing:border-box;font-size:0.875rem;text-transform:uppercase;width:100%;height:100%;background-color:var(--viewer-view-cube-side-background);border:var(--viewer-view-cube-side-border);display:flex;align-items:center;justify-content:center;outline:1px solid transparent;opacity:var(--viewer-view-cube-opacity);transition:opacity 0.2s ease-in-out}.cube-side-face::before{content:'';position:absolute;left:calc(var(--viewer-view-cube-edge-length) - 4px);right:calc(var(--viewer-view-cube-edge-length) - 4px);top:calc(var(--viewer-view-cube-edge-length) - 4px);bottom:calc(var(--viewer-view-cube-edge-length) - 4px)}.cube-corner,.cube-edge{position:relative}.cube-corner-face,.cube-edge-face{position:absolute;backface-visibility:hidden;-webkit-backface-visibility:hidden}.cube-edge-face.top{top:0;left:var(--viewer-view-cube-edge-length);right:var(--viewer-view-cube-edge-length);height:var(--viewer-view-cube-edge-length)}.cube-edge-face.bottom{bottom:0;left:var(--viewer-view-cube-edge-length);right:var(--viewer-view-cube-edge-length);height:var(--viewer-view-cube-edge-length)}.cube-edge-face.left{left:0;top:var(--viewer-view-cube-edge-length);bottom:var(--viewer-view-cube-edge-length);width:var(--viewer-view-cube-edge-length)}.cube-edge-face.right{right:0;top:var(--viewer-view-cube-edge-length);bottom:var(--viewer-view-cube-edge-length);width:var(--viewer-view-cube-edge-length)}.cube-corner-face{width:var(--viewer-view-cube-edge-length);height:var(--viewer-view-cube-edge-length)}.cube-corner-face.top-left{top:0;left:0}.cube-corner-face.top-right{top:0;right:0}.cube-corner-face.bottom-right{bottom:0;right:0}.cube-corner-face.bottom-left{bottom:0;left:0}.cube-shadow{backface-visibility:hidden;-webkit-backface-visibility:hidden}.cube-shadow-face{position:absolute;left:4px;right:4px;top:4px;bottom:4px;background-color:black;opacity:0.12;filter:blur(4px)}.cube-corner .cube-corner-face,.cube-edge .cube-edge-face,.cube-side .cube-side-face::before{background:var(--viewer-view-cube-side-background-hover);opacity:0}.cube-corner:hover .cube-corner-face,.cube-edge:hover .cube-edge-face,.cube-side:hover .cube-side-face::before{opacity:var(--viewer-view-cube-side-background-hover-opacity)}.cube-corner.disabled,.cube-edge.disabled,.cube-side.disabled{pointer-events:none}";
104961
105523
 
104962
105524
  let ViewerViewCube = class extends HTMLElement$1 {
104963
105525
  constructor() {
@@ -105107,12 +105669,13 @@ const VertexViewerMarkupArrow = /*@__PURE__*/proxyCustomElement(ViewerMarkupArro
105107
105669
  const VertexViewerMarkupCircle = /*@__PURE__*/proxyCustomElement(ViewerMarkupCircle, [1,"vertex-viewer-markup-circle",{"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"startPosition":[32],"editAnchor":[32],"resizeBounds":[32]}]);
105108
105670
  const VertexViewerMarkupFreeform = /*@__PURE__*/proxyCustomElement(ViewerMarkupFreeform, [1,"vertex-viewer-markup-freeform",{"points":[1040],"pointsJson":[1,"points"],"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"resizeStartPosition":[32],"editAnchor":[32],"resizeBounds":[32],"resizePoints":[32],"screenPoints":[32]}]);
105109
105671
  const VertexViewerMarkupTool = /*@__PURE__*/proxyCustomElement(ViewerMarkupTool, [1,"vertex-viewer-markup-tool",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"stateMap":[32]}]);
105110
- const VertexViewerMeasurementDetails = /*@__PURE__*/proxyCustomElement(ViewerMeasurementDetails, [1,"vertex-viewer-measurement-details",{"measurementModel":[16],"distanceUnits":[1,"distance-units"],"angleUnits":[1,"angle-units"],"fractionalDigits":[2,"fractional-digits"],"distanceFormatter":[16],"angleFormatter":[16],"areaFormatter":[16],"hiddenDetails":[1040],"hiddenDetailsJson":[1,"hidden-details"],"results":[1040],"summary":[1040],"visibleSummary":[1040]}]);
105111
- const VertexViewerMeasurementDistance = /*@__PURE__*/proxyCustomElement(ViewerMeasurementDistance, [1,"vertex-viewer-measurement-distance",{"start":[1040],"startJson":[1,"start"],"end":[1040],"endJson":[1,"end"],"distance":[1026],"snapDistance":[2,"snap-distance"],"units":[1],"fractionalDigits":[2,"fractional-digits"],"labelFormatter":[16],"anchorLabelOffset":[2,"anchor-label-offset"],"lineCapLength":[2,"line-cap-length"],"mode":[513],"interactingAnchor":[1537,"interacting-anchor"],"invalid":[1540],"camera":[16],"hitProvider":[16],"indicatorPt":[1040],"viewer":[16],"viewport":[32],"elementBounds":[32],"interactionCount":[32],"internalCamera":[32],"invalidateStateCounter":[32],"stateMap":[32]}]);
105672
+ const VertexViewerMeasurementDetails = /*@__PURE__*/proxyCustomElement(ViewerMeasurementDetails, [1,"vertex-viewer-measurement-details",{"measurementModel":[16],"measurementOverlays":[16],"distanceUnits":[1,"distance-units"],"angleUnits":[1,"angle-units"],"fractionalDigits":[2,"fractional-digits"],"distanceFormatter":[16],"angleFormatter":[16],"areaFormatter":[16],"resultTypes":[16],"results":[32],"isApproximate":[32],"overlay":[32],"distanceMeasurementUnits":[32],"angleMeasurementUnits":[32],"areaMeasurementUnits":[32]}]);
105673
+ const VertexViewerMeasurementDistance = /*@__PURE__*/proxyCustomElement(ViewerMeasurementDistance, [1,"vertex-viewer-measurement-distance",{"start":[1040],"startJson":[1,"start"],"end":[1040],"endJson":[1,"end"],"distance":[1026],"showAxisReferenceLines":[4,"show-axis-reference-lines"],"snapDistance":[2,"snap-distance"],"units":[1],"fractionalDigits":[2,"fractional-digits"],"labelFormatter":[16],"anchorLabelOffset":[2,"anchor-label-offset"],"lineCapLength":[2,"line-cap-length"],"mode":[513],"interactingAnchor":[1537,"interacting-anchor"],"invalid":[1540],"camera":[16],"hitProvider":[16],"indicatorPt":[1040],"viewer":[16],"viewport":[32],"elementBounds":[32],"interactionCount":[32],"internalCamera":[32],"invalidateStateCounter":[32],"stateMap":[32]}]);
105112
105674
  const VertexViewerMeasurementLine = /*@__PURE__*/proxyCustomElement(ViewerMeasurementLine, [1,"vertex-viewer-measurement-line",{"start":[16],"end":[16],"capLength":[2,"cap-length"],"pointerEvents":[1,"pointer-events"]}]);
105113
- const VertexViewerMeasurementPrecise = /*@__PURE__*/proxyCustomElement(ViewerMeasurementPrecise, [1,"vertex-viewer-measurement-precise",{"measurementModel":[16],"measurementController":[1040],"viewer":[16],"configEnv":[1,"config-env"],"config":[16],"entities":[32]}]);
105675
+ const VertexViewerMeasurementOverlays = /*@__PURE__*/proxyCustomElement(ViewerMeasurementOverlays, [1,"vertex-viewer-measurement-overlays",{"measurementOverlays":[16],"camera":[1040],"viewer":[16],"overlays":[32]}]);
105676
+ const VertexViewerMeasurementPrecise = /*@__PURE__*/proxyCustomElement(ViewerMeasurementPrecise, [1,"vertex-viewer-measurement-precise",{"measurementModel":[16],"measurementOverlays":[16],"measurementController":[1040],"measurableEntityTypes":[16],"viewer":[16],"configEnv":[1,"config-env"],"config":[16],"overlays":[32]}]);
105114
105677
  const VertexViewerMeasurementTool = /*@__PURE__*/proxyCustomElement(ViewerMeasurementTool, [1,"vertex-viewer-measurement-tool",{"distanceTemplateId":[1,"distance-template-id"],"tool":[1],"units":[1],"fractionalDigits":[2,"fractional-digits"],"disabled":[4],"viewer":[16],"isMeasuring":[1540,"is-measuring"],"snapDistance":[2,"snap-distance"],"stateMap":[32]}]);
105115
- const VertexViewerMeasurements = /*@__PURE__*/proxyCustomElement(ViewerMeasurements, [1,"vertex-viewer-measurements",{"distanceTemplateId":[1,"distance-template-id"],"tool":[1],"units":[1],"fractionalDigits":[2,"fractional-digits"],"disabled":[4],"viewer":[16],"selectedMeasurementId":[1025,"selected-measurement-id"],"snapDistance":[2,"snap-distance"]},[[0,"measureEnd","handleMeasureEnd"],[1,"pointerdown","handleMeasurementPointerDown"]]]);
105678
+ const VertexViewerMeasurements = /*@__PURE__*/proxyCustomElement(ViewerMeasurements, [1,"vertex-viewer-measurements",{"distanceTemplateId":[1,"distance-template-id"],"tool":[1],"units":[1],"fractionalDigits":[2,"fractional-digits"],"disabled":[4],"viewer":[16],"selectedMeasurementId":[1025,"selected-measurement-id"],"snapDistance":[2,"snap-distance"],"showAxisReferenceLines":[4,"show-axis-reference-lines"],"measurementModel":[16]},[[0,"measureEnd","handleMeasureEnd"],[1,"pointerdown","handleMeasurementPointerDown"]]]);
105116
105679
  const VertexViewerToolbar = /*@__PURE__*/proxyCustomElement(ViewerToolbar, [1,"vertex-viewer-toolbar",{"placement":[1],"direction":[1]}]);
105117
105680
  const VertexViewerToolbarGroup = /*@__PURE__*/proxyCustomElement(ViewerToolbarGroup, [1,"vertex-viewer-toolbar-group",{"direction":[1]}]);
105118
105681
  const VertexViewerViewCube = /*@__PURE__*/proxyCustomElement(ViewerViewCube, [1,"vertex-viewer-view-cube",{"xPositiveLabel":[1,"x-positive-label"],"xNegativeLabel":[1,"x-negative-label"],"yPositiveLabel":[1,"y-positive-label"],"yNegativeLabel":[1,"y-negative-label"],"zPositiveLabel":[1,"z-positive-label"],"zNegativeLabel":[1,"z-negative-label"],"standardViewsOff":[4,"standard-views-off"],"animationDuration":[2,"animation-duration"],"triadOff":[4,"triad-off"],"worldOrientation":[1040],"camera":[1040],"viewer":[16],"boxLength":[32],"triadPosition":[32]}]);
@@ -105144,6 +105707,7 @@ const defineCustomElements = (opts) => {
105144
105707
  VertexViewerMeasurementDetails,
105145
105708
  VertexViewerMeasurementDistance,
105146
105709
  VertexViewerMeasurementLine,
105710
+ VertexViewerMeasurementOverlays,
105147
105711
  VertexViewerMeasurementPrecise,
105148
105712
  VertexViewerMeasurementTool,
105149
105713
  VertexViewerMeasurements,
@@ -105158,4 +105722,4 @@ const defineCustomElements = (opts) => {
105158
105722
  }
105159
105723
  };
105160
105724
 
105161
- export { AngleUnits, AreaUnits, ArrowMarkup, CircleMarkup, colorMaterial as ColorMaterial, CursorManager, DistanceUnits, FreeformMarkup, loadableResource as LoadableResource, MeasurementController, MeasurementEntity, MeasurementModel, Frame as ReceivedFrame, FrameImage as ReceivedFrameImage, FrameScene as ReceivedFrameScene, FramePerspectiveCamera as ReceivedPerspectiveCamera, Scene, SynchronizedClock, VertexSceneTree, VertexSceneTreeSearch, VertexSceneTreeTableCell, VertexSceneTreeTableColumn, VertexSceneTreeTableHeader, VertexSceneTreeTableLayout, VertexSceneTreeTableResizeDivider, VertexSceneTreeToolbar, VertexSceneTreeToolbarGroup, VertexViewer, VertexViewerButton, VertexViewerDefaultToolbar, VertexViewerDomElement, VertexViewerDomGroup, VertexViewerDomRenderer, VertexViewerIcon, VertexViewerLayer, VertexViewerMarkup, VertexViewerMarkupArrow, VertexViewerMarkupCircle, VertexViewerMarkupFreeform, VertexViewerMarkupTool, VertexViewerMeasurementDetails, VertexViewerMeasurementDistance, VertexViewerMeasurementLine, VertexViewerMeasurementPrecise, VertexViewerMeasurementTool, VertexViewerMeasurements, VertexViewerToolbar, VertexViewerToolbarGroup, VertexViewerViewCube, Viewport, __awaiter as _, __generator as a, __spreadArray as b, createCommonjsModule as c, defineCustomElements, measurementCursor, summarizeResults };
105725
+ export { AngleUnits, AreaUnits, ArrowMarkup, CircleMarkup, colorMaterial as ColorMaterial, CursorManager, DistanceUnits, EntityType, FreeformMarkup, loadableResource as LoadableResource, MeasurementController, MeasurementEntity, MeasurementModel, MeasurementOverlayManager, Frame as ReceivedFrame, FrameImage as ReceivedFrameImage, FrameScene as ReceivedFrameScene, FramePerspectiveCamera as ReceivedPerspectiveCamera, Scene, SynchronizedClock, VertexSceneTree, VertexSceneTreeSearch, VertexSceneTreeTableCell, VertexSceneTreeTableColumn, VertexSceneTreeTableHeader, VertexSceneTreeTableLayout, VertexSceneTreeTableResizeDivider, VertexSceneTreeToolbar, VertexSceneTreeToolbarGroup, VertexViewer, VertexViewerButton, VertexViewerDefaultToolbar, VertexViewerDomElement, VertexViewerDomGroup, VertexViewerDomRenderer, VertexViewerIcon, VertexViewerLayer, VertexViewerMarkup, VertexViewerMarkupArrow, VertexViewerMarkupCircle, VertexViewerMarkupFreeform, VertexViewerMarkupTool, VertexViewerMeasurementDetails, VertexViewerMeasurementDistance, VertexViewerMeasurementLine, VertexViewerMeasurementOverlays, VertexViewerMeasurementPrecise, VertexViewerMeasurementTool, VertexViewerMeasurements, VertexViewerToolbar, VertexViewerToolbarGroup, VertexViewerViewCube, Viewport, __awaiter as _, __generator as a, __spreadArray as b, createCommonjsModule as c, defineCustomElements, makeMinimumDistanceResult, measurementCursor, measurementWithArrowCursor };