qwc2 2025.10.13 → 2025.10.14

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 (241) hide show
  1. package/actions/display.js +30 -1
  2. package/actions/editing.js +22 -1
  3. package/actions/layerinfo.js +13 -1
  4. package/actions/layers.js +213 -3
  5. package/actions/localConfig.js +58 -1
  6. package/actions/locale.js +21 -1
  7. package/actions/locate.js +26 -1
  8. package/actions/logging.js +10 -1
  9. package/actions/map.js +105 -2
  10. package/actions/measurement.js +12 -1
  11. package/actions/processNotifications.js +37 -1
  12. package/actions/redlining.js +18 -1
  13. package/actions/redliningPick.js +12 -1
  14. package/actions/search.js +12 -1
  15. package/actions/serviceinfo.js +12 -1
  16. package/actions/task.js +55 -3
  17. package/actions/theme.js +339 -19
  18. package/actions/windows.js +164 -5
  19. package/components/AppMenu.js +435 -3
  20. package/components/AttributeForm.js +928 -32
  21. package/components/AttributeTableWidget.js +1105 -13
  22. package/components/AutoEditForm.js +189 -3
  23. package/components/CoordinateDisplayer.js +78 -2
  24. package/components/EditComboField.js +190 -6
  25. package/components/EditUploadField.js +315 -3
  26. package/components/ExportSelection.js +203 -2
  27. package/components/FullscreenSwitcher.js +90 -3
  28. package/components/Icon.js +81 -2
  29. package/components/IdentifyViewer.js +1161 -6
  30. package/components/ImportLayer.js +718 -20
  31. package/components/LayerInfoWindow.js +145 -2
  32. package/components/LinkFeatureForm.js +246 -5
  33. package/components/MapButton.js +88 -2
  34. package/components/MapSelection.js +287 -8
  35. package/components/MessageBar.js +68 -2
  36. package/components/NumericInputWindow.js +359 -2
  37. package/components/PickFeature.js +266 -2
  38. package/components/PluginsContainer.js +227 -8
  39. package/components/PrintSelection.js +620 -49
  40. package/components/ProcessNotifications.js +104 -2
  41. package/components/QtDesignerForm.js +1137 -18
  42. package/components/ResizeableWindow.js +591 -8
  43. package/components/SearchBox.js +1307 -20
  44. package/components/ServiceInfoWindow.js +107 -2
  45. package/components/SideBar.js +204 -4
  46. package/components/StandardApp.js +381 -20
  47. package/components/Swipeable.js +15 -1
  48. package/components/TaskBar.js +85 -2
  49. package/components/ThemeLayersListWindow.js +216 -4
  50. package/components/ThemeList.js +381 -7
  51. package/components/Toolbar.js +106 -2
  52. package/components/WindowManager.js +178 -2
  53. package/components/map/OlLayer.js +257 -6
  54. package/components/map/OlMap.js +405 -5
  55. package/components/map/layers/BingLayer.js +31 -2
  56. package/components/map/layers/GoogleLayer.js +222 -19
  57. package/components/map/layers/GraticuleLayer.js +21 -1
  58. package/components/map/layers/ImageLayer.js +15 -1
  59. package/components/map/layers/MVTLayer.js +52 -2
  60. package/components/map/layers/OSMLayer.js +24 -2
  61. package/components/map/layers/OverlayLayer.js +55 -3
  62. package/components/map/layers/VectorLayer.js +173 -8
  63. package/components/map/layers/WFSLayer.js +220 -6
  64. package/components/map/layers/WMSLayer.js +180 -6
  65. package/components/map/layers/WMTSLayer.js +67 -3
  66. package/components/map/layers/XYZLayer.js +24 -2
  67. package/components/map/layers/index.js +28 -1
  68. package/components/map3d/EditDataset3D.js +190 -3
  69. package/components/map3d/HeightProfile3D.js +402 -3
  70. package/components/map3d/ImportObjects3D.js +162 -2
  71. package/components/map3d/Map3D.js +1304 -38
  72. package/components/map3d/MapControls3D.js +392 -7
  73. package/components/map3d/SearchField3D.js +183 -11
  74. package/components/map3d/View3DSwitcher.js +98 -2
  75. package/components/map3d/drawtool/CreateTool3D.js +174 -4
  76. package/components/map3d/drawtool/EditTool3D.js +590 -6
  77. package/components/map3d/drawtool/NumericInput3D.js +336 -4
  78. package/components/map3d/layers/GeoTIFFLayer3D.js +15 -1
  79. package/components/map3d/layers/VectorLayer3D.js +53 -2
  80. package/components/map3d/layers/WFSLayer3D.js +109 -3
  81. package/components/map3d/layers/WMSLayer3D.js +70 -2
  82. package/components/map3d/layers/WMTSLayer3D.js +27 -3
  83. package/components/map3d/layers/index.js +14 -1
  84. package/components/map3d/utils/FirstPersonControls3D.js +423 -16
  85. package/components/map3d/utils/MiscUtils3D.js +221 -13
  86. package/components/map3d/utils/OrbitControls3D.js +176 -5
  87. package/components/map3d/utils/Tiles3DStyle.js +238 -9
  88. package/components/share/ShareLink.js +54 -2
  89. package/components/share/ShareQRCode.js +62 -2
  90. package/components/share/ShareSocials.js +125 -3
  91. package/components/timeline/FixedTimeline.js +236 -5
  92. package/components/timeline/InfiniteTimeline.js +347 -8
  93. package/components/timeline/TimelineFeaturesSlider.js +439 -5
  94. package/components/widgets/AccordeonWidget.js +96 -2
  95. package/components/widgets/ButtonBar.js +124 -2
  96. package/components/widgets/ColorButton.js +201 -3
  97. package/components/widgets/ComboBox.js +166 -2
  98. package/components/widgets/CopyButton.js +110 -2
  99. package/components/widgets/DateTimeInput.js +100 -3
  100. package/components/widgets/EditableSelect.js +230 -3
  101. package/components/widgets/FileSelector.js +128 -4
  102. package/components/widgets/Input.js +124 -2
  103. package/components/widgets/InputContainer.js +96 -2
  104. package/components/widgets/LayerCatalogWidget.js +219 -3
  105. package/components/widgets/MenuButton.js +157 -1
  106. package/components/widgets/ModalDialog.js +64 -2
  107. package/components/widgets/NavBar.js +119 -2
  108. package/components/widgets/NumberInput.js +226 -4
  109. package/components/widgets/PopupMenu.js +72 -1
  110. package/components/widgets/Primitives.js +6 -1
  111. package/components/widgets/ReCaptchaWidget.js +55 -1
  112. package/components/widgets/SearchWidget.js +255 -2
  113. package/components/widgets/Spinner.js +44 -2
  114. package/components/widgets/SuggestionInput.js +77 -2
  115. package/components/widgets/TextInput.js +308 -2
  116. package/components/widgets/ToggleSwitch.js +85 -2
  117. package/components/widgets/VectorLayerPicker.js +85 -3
  118. package/libs/openlayers.js +225 -5
  119. package/package.json +1 -1
  120. package/plugins/API.js +358 -15
  121. package/plugins/AttributeTable.js +109 -3
  122. package/plugins/Authentication.js +130 -5
  123. package/plugins/BackgroundSwitcher.js +218 -4
  124. package/plugins/Bookmark.js +289 -3
  125. package/plugins/BottomBar.js +298 -4
  126. package/plugins/CookiePopup.js +67 -3
  127. package/plugins/Cyclomedia.js +442 -5
  128. package/plugins/Editing.js +497 -9
  129. package/plugins/FeatureForm.js +366 -4
  130. package/plugins/FeatureSearch.js +458 -3
  131. package/plugins/GeometryDigitizer.js +664 -7
  132. package/plugins/HeightProfile.js +763 -15
  133. package/plugins/Help.js +102 -3
  134. package/plugins/HomeButton.js +80 -3
  135. package/plugins/Identify.js +543 -5
  136. package/plugins/LayerCatalog.js +215 -4
  137. package/plugins/LayerTree.js +1194 -6
  138. package/plugins/LocateButton.js +94 -3
  139. package/plugins/Map.js +320 -16
  140. package/plugins/MapCompare.js +94 -3
  141. package/plugins/MapCopyright.js +127 -5
  142. package/plugins/MapExport.js +613 -20
  143. package/plugins/MapFilter.js +868 -12
  144. package/plugins/MapInfoTooltip.js +277 -3
  145. package/plugins/MapLegend.js +253 -4
  146. package/plugins/MapTip.js +290 -4
  147. package/plugins/Measure.js +220 -4
  148. package/plugins/NewsPopup.js +137 -3
  149. package/plugins/OverviewMap.js +167 -7
  150. package/plugins/Panoramax.js +340 -2
  151. package/plugins/Portal.js +199 -4
  152. package/plugins/Print.js +1231 -15
  153. package/plugins/Redlining.js +750 -6
  154. package/plugins/Reports.js +332 -3
  155. package/plugins/Routing.js +1278 -15
  156. package/plugins/ScratchDrawing.js +173 -5
  157. package/plugins/Settings.js +241 -4
  158. package/plugins/Share.js +198 -3
  159. package/plugins/StartupMarker.js +84 -4
  160. package/plugins/TaskButton.js +88 -3
  161. package/plugins/ThemeSwitcher.js +164 -4
  162. package/plugins/TimeManager.js +971 -10
  163. package/plugins/TopBar.js +300 -7
  164. package/plugins/TourGuide.js +213 -2
  165. package/plugins/ValueTool.js +419 -4
  166. package/plugins/View3D.js +519 -14
  167. package/plugins/ZoomButtons.js +165 -3
  168. package/plugins/map/EditingSupport.js +199 -7
  169. package/plugins/map/LocateSupport.js +260 -4
  170. package/plugins/map/MeasurementSupport.js +216 -8
  171. package/plugins/map/RedliningPickSupport.js +201 -7
  172. package/plugins/map/RedliningSupport.js +726 -17
  173. package/plugins/map/SnapInteraction.js +101 -1
  174. package/plugins/map/SnapSupport.js +210 -2
  175. package/plugins/map/SnappingSupport.js +356 -17
  176. package/plugins/map3d/BackgroundSwitcher3D.js +44 -3
  177. package/plugins/map3d/BottomBar3D.js +118 -3
  178. package/plugins/map3d/Compare3D.js +422 -8
  179. package/plugins/map3d/Draw3D.js +353 -6
  180. package/plugins/map3d/ExportObjects3D.js +393 -18
  181. package/plugins/map3d/HideObjects3D.js +313 -12
  182. package/plugins/map3d/Identify3D.js +283 -12
  183. package/plugins/map3d/LayerTree3D.js +323 -3
  184. package/plugins/map3d/MapCopyright3D.js +128 -5
  185. package/plugins/map3d/MapExport3D.js +590 -10
  186. package/plugins/map3d/MapLight3D.js +553 -6
  187. package/plugins/map3d/Measure3D.js +571 -20
  188. package/plugins/map3d/OverviewMap3D.js +169 -3
  189. package/plugins/map3d/Settings3D.js +73 -3
  190. package/plugins/map3d/TopBar3D.js +207 -9
  191. package/plugins/redlining/RedliningBufferSupport.js +206 -3
  192. package/reducers/display.js +34 -2
  193. package/reducers/editing.js +68 -3
  194. package/reducers/index.js +9 -1
  195. package/reducers/layerinfo.js +26 -2
  196. package/reducers/layers.js +456 -9
  197. package/reducers/localConfig.js +122 -2
  198. package/reducers/locale.js +38 -2
  199. package/reducers/locate.js +40 -2
  200. package/reducers/map.js +176 -5
  201. package/reducers/measurement.js +42 -2
  202. package/reducers/processNotifications.js +49 -2
  203. package/reducers/redlining.js +50 -2
  204. package/reducers/redliningPick.js +27 -2
  205. package/reducers/search.js +20 -1
  206. package/reducers/serviceinfo.js +25 -2
  207. package/reducers/task.js +45 -2
  208. package/reducers/theme.js +51 -2
  209. package/reducers/windows.js +203 -2
  210. package/scripts/dist.sh +1 -1
  211. package/scripts/gen-plugin-docs.js +152 -2
  212. package/scripts/makeIconkit.js +85 -6
  213. package/scripts/themesConfig.js +742 -40
  214. package/scripts/updateTranslations.js +251 -10
  215. package/selectors/searchproviders.js +44 -2
  216. package/stores/StandardStore.js +42 -2
  217. package/utils/ConfigUtils.js +84 -3
  218. package/utils/CoordinatesUtils.js +234 -23
  219. package/utils/DxfUtils.js +237 -11
  220. package/utils/EditingInterface.js +421 -87
  221. package/utils/EditingUtils.js +357 -13
  222. package/utils/ElevationInterface.js +83 -22
  223. package/utils/FeatureStyles.js +429 -5
  224. package/utils/IdentifyUtils.js +443 -7
  225. package/utils/ImageEditor.js +79 -9
  226. package/utils/LayerUtils.js +1516 -50
  227. package/utils/LocaleUtils.js +117 -7
  228. package/utils/MapUtils.js +241 -59
  229. package/utils/MeasureUtils.js +323 -2
  230. package/utils/MiscUtils.js +189 -11
  231. package/utils/PermaLinkUtils.js +429 -6
  232. package/utils/PluginStore.js +27 -1
  233. package/utils/ResourceRegistry.js +15 -1
  234. package/utils/RoutingInterface.js +307 -7
  235. package/utils/SearchProviders.js +722 -19
  236. package/utils/ServiceLayerUtils.js +669 -14
  237. package/utils/Signal.js +32 -2
  238. package/utils/ThemeUtils.js +341 -7
  239. package/utils/VectorLayerUtils.js +589 -15
  240. package/utils/expr_grammar/grammar.js +2239 -2
  241. package/utils/expr_grammar/test.js +65 -3
@@ -1,14 +1,428 @@
1
- function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
5
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
7
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
8
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
9
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
10
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
11
+ function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
12
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
13
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
14
+ function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
15
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
16
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
17
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
18
+ function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
19
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
20
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
21
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
22
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
23
+ /**
2
24
  * Copyright 2024 Sourcepole AG
3
25
  * All rights reserved.
4
26
  *
5
27
  * This source code is licensed under the BSD-style license found in the
6
28
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{Group,Plane,Raycaster,Vector2,Vector3}from"three";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{setCurrentTask}from"../../actions/task";import Icon from"../../components/Icon";import MessageBar from"../../components/MessageBar";import SideBar from"../../components/SideBar";import NumberInput from"../../components/widgets/NumberInput";import arrowModel from"../../resources/arrow.glb";import LocaleUtils from"../../utils/LocaleUtils";import"./style/Compare3D.css";/**
29
+ */
30
+
31
+ import React from 'react';
32
+ import { connect } from 'react-redux';
33
+ import PropTypes from 'prop-types';
34
+ import { Group, Plane, Raycaster, Vector2, Vector3 } from 'three';
35
+ import { GLTFLoader } from 'three/addons/loaders/GLTFLoader';
36
+ import { setCurrentTask } from '../../actions/task';
37
+ import Icon from '../../components/Icon';
38
+ import MessageBar from '../../components/MessageBar';
39
+ import SideBar from '../../components/SideBar';
40
+ import NumberInput from '../../components/widgets/NumberInput';
41
+ import arrowModel from '../../resources/arrow.glb';
42
+ import LocaleUtils from '../../utils/LocaleUtils';
43
+ import './style/Compare3D.css';
44
+
45
+ /**
8
46
  * Split-screen and compare objects in the 3D map.
9
- */var Compare3D=/*#__PURE__*/function(_React$Component){function Compare3D(){var _this;_classCallCheck(this,Compare3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Compare3D,[].concat(args));_defineProperty(_this,"state",{enabled:false,clippedObjects:{},planeX:0,planeY:0,planeA:0});_defineProperty(_this,"updateClippingPlane",function(){var point=new Vector3(_this.state.planeX,_this.state.planeY,0);var alpha=_this.state.planeA/180*Math.PI;var normal=new Vector3(Math.sin(alpha),Math.cos(alpha),0);var leftPlane=new Plane;var rightPlane=new Plane;leftPlane.setFromNormalAndCoplanarPoint(normal,point);rightPlane.setFromNormalAndCoplanarPoint(normal.multiplyScalar(-1),point);Object.entries(_this.state.clippedObjects).forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),objectId=_ref2[0],config=_ref2[1];var planes=[];if(config.left){planes.push(leftPlane)}if(config.right){planes.push(rightPlane)}if(objectId==="__terrain"){_this.props.sceneContext.map.clippingPlanes=planes}else{var object=_this.props.sceneContext.getSceneObject(objectId);object.clippingPlanes=planes;object.traverse(function(child){if(child.material){child.material.clippingPlanes=planes;child.material.clipShadows=true}})}});_this.props.sceneContext.scene.notifyChange();_this.positionArrows(_this.state.planeX,_this.state.planeY,_this.state.planeA)});_defineProperty(_this,"clearClippingPlane",function(){Object.keys(_this.state.clippedObjects).forEach(function(objectId){if(objectId==="__terrain"){_this.props.sceneContext.map.clippingPlanes=[]}else{var object=_this.props.sceneContext.getSceneObject(objectId);object.clippingPlanes=[];object.traverse(function(child){if(child.material){child.material.clippingPlanes=[];child.material.clipShadows=false}})}});if(_this.props.active){_this.disableArrows()}_this.props.sceneContext.scene.notifyChange()});_defineProperty(_this,"enableArrows",function(){_this.props.sceneContext.addSceneObject("__compareArrows",_this.arrows);_this.props.sceneContext.scene.view.controls.addEventListener("change",_this.centerArrowsInView);var renderer=_this.props.sceneContext.scene.renderer;renderer.domElement.addEventListener("pointerdown",_this.dragArrows);_this.centerArrowsInView()});_defineProperty(_this,"disableArrows",function(){var _this$props$sceneCont,_this$props$sceneCont2;(_this$props$sceneCont=_this.props.sceneContext.scene.view.controls)===null||_this$props$sceneCont===void 0||(_this$props$sceneCont2=_this$props$sceneCont.removeEventListener)===null||_this$props$sceneCont2===void 0||_this$props$sceneCont2.call(_this$props$sceneCont,"change",_this.centerArrowsInView);_this.props.sceneContext.removeSceneObject("__compareArrows");_this.props.sceneContext.scene.renderer.domElement.removeEventListener("pointerdown",_this.dragArrows)});_defineProperty(_this,"dragArrows",function(ev){var mousePos=function mousePos(event){var rect=event.target.getBoundingClientRect();var x=(event.clientX-rect.left)/rect.width*2-1;var y=-((event.clientY-rect.top)/rect.height)*2+1;return new Vector2(x,y)};var camera=_this.props.sceneContext.scene.view.camera;var raycaster=new Raycaster;raycaster.setFromCamera(mousePos(ev),camera);var intersects=raycaster.intersectObject(_this.arrows).length>0;if(!intersects){return}var plane=new Plane().setFromNormalAndCoplanarPoint(new Vector3(0,0,1),_this.arrows.position);var startPos=raycaster.ray.intersectPlane(plane,new Vector3);var planePos=new Vector2(_this.state.planeX,_this.state.planeY);var alpha=_this.state.planeA/180*Math.PI;var planeNormal=new Vector3(Math.sin(alpha),Math.cos(alpha),0);var moveArrows=function moveArrows(event){raycaster.setFromCamera(mousePos(event),camera);plane.setFromNormalAndCoplanarPoint(new Vector3(0,0,1),_this.arrows.position);var pos=raycaster.ray.intersectPlane(plane,new Vector3);var delta=planeNormal.clone().multiplyScalar(new Vector3().copy(pos.sub(startPos)).dot(planeNormal));_this.setState({planeX:planePos.x+delta.x,planeY:planePos.y+delta.y});_this.positionArrows(planePos.x+delta.x,planePos.y+delta.y,_this.state.planeA)};_this.props.sceneContext.scene.view.controls.enabled=false;ev.view.addEventListener("pointermove",moveArrows);ev.view.addEventListener("pointerup",function(){_this.props.sceneContext.scene.view.controls.enabled=true;ev.view.removeEventListener("pointermove",moveArrows)},{once:true})});_defineProperty(_this,"centerArrowsInView",function(){var _inter$point;var inter=_this.props.sceneContext.getSceneIntersection(0,0);var center=(_inter$point=inter===null||inter===void 0?void 0:inter.point)!==null&&_inter$point!==void 0?_inter$point:_this.props.sceneContext.scene.view.controls.target.clone();var alpha=_this.state.planeA/180*Math.PI;var dir=new Vector3(Math.cos(alpha),-Math.sin(alpha),0);var curPos=new Vector3(_this.state.planeX,_this.state.planeY,0);var newPos=curPos.add(dir.multiplyScalar(center.sub(curPos).dot(dir)));_this.setState({planeX:newPos.x,planeY:newPos.y});_this.positionArrows(newPos.x,newPos.y,_this.state.planeA)});_defineProperty(_this,"positionArrows",function(x,y,alpha){var _this$props$sceneCont3;var target=new Vector3(x,y,0);var distance=_this.props.sceneContext.scene.view.camera.position.distanceTo(target);var scale=Math.max(1,distance/200);var z=(_this$props$sceneCont3=_this.props.sceneContext.getTerrainHeightFromMap([x,y]))!==null&&_this$props$sceneCont3!==void 0?_this$props$sceneCont3:0;_this.arrows.position.x=target.x;_this.arrows.position.y=target.y;_this.arrows.position.z=z;_this.arrows.rotation.z=-alpha/180*Math.PI;_this.arrows.scale.set(scale,scale,scale);_this.arrows.updateMatrixWorld()});_defineProperty(_this,"renderBody",function(){var sceneContext=_this.props.sceneContext;var objects=_objectSpread({__terrain:{layertree:true,title:LocaleUtils.tr("map3d.terrain")}},sceneContext.sceneObjects);var objectIds=Object.keys(objects).filter(function(objectId){return objects[objectId].layertree});return/*#__PURE__*/React.createElement("div",{className:"compare3d-body",role:"body"},/*#__PURE__*/React.createElement("div",{className:"compare3d-title",onClick:_this.toggleCompare},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.enabled?"checked":"unchecked"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("compare3d.compare_objects"))),/*#__PURE__*/React.createElement("div",{className:"compare3d-objects"},["left","right"].map(function(section){var clipState=_this.state.clippedObjects;var toggleAllIcon="checked";var toggleAllValue=true;var toggleAllState=objectIds.reduce(function(res,id){var _clipState$id;return res+((_clipState$id=clipState[id])===null||_clipState$id===void 0?void 0:_clipState$id[section])},0);if(toggleAllState===objectIds.length){toggleAllIcon="unchecked";toggleAllValue=false}else if(toggleAllState>0){toggleAllIcon="tristate"}return/*#__PURE__*/React.createElement("div",{className:"compare3d-section",key:"compare-"+section},/*#__PURE__*/React.createElement("div",{className:"compare3d-item compare3d-item-toggleall",onClick:_this.state.enabled?function(){return _this.toggleAllObjects(section,objectIds,toggleAllValue)}:null,title:LocaleUtils.tr("compare3d.toggleall")},/*#__PURE__*/React.createElement(Icon,{className:"compare3d-item-checkbox",disabled:!_this.state.enabled,icon:toggleAllIcon}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("compare3d.toggleall"))),objectIds.map(function(objectId){var _objects$objectId$tit,_clipState$objectId,_objects$objectId$tit2;return/*#__PURE__*/React.createElement("div",{className:"compare3d-item",key:objectId,onClick:_this.state.enabled?function(){return _this.toggleObject(section,objectId)}:null,title:(_objects$objectId$tit=objects[objectId].title)!==null&&_objects$objectId$tit!==void 0?_objects$objectId$tit:objectId},/*#__PURE__*/React.createElement(Icon,{className:"compare3d-item-checkbox",disabled:!_this.state.enabled,icon:(_clipState$objectId=clipState[objectId])!==null&&_clipState$objectId!==void 0&&_clipState$objectId[section]?"unchecked":"checked"}),/*#__PURE__*/React.createElement("span",null,(_objects$objectId$tit2=objects[objectId].title)!==null&&_objects$objectId$tit2!==void 0?_objects$objectId$tit2:objectId))}))})),/*#__PURE__*/React.createElement("div",{className:"compare3d-title"},LocaleUtils.tr("compare3d.clipplane")),/*#__PURE__*/React.createElement("table",{className:"compare3d-planeconfig"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,"x"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.enabled,onChange:function onChange(x){return _this.setState({planeX:x})},value:_this.state.planeX}))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,"y"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.enabled,onChange:function onChange(y){return _this.setState({planeY:y})},value:_this.state.planeY}))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,"\u03B1"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{disabled:!_this.state.enabled,onChange:function onChange(a){return _this.setState({planeA:a})},suffix:"\xB0",value:_this.state.planeA}))))))});_defineProperty(_this,"toggleCompare",function(){_this.setState(function(state){var newState={enabled:!state.enabled};if(newState.enabled){// Position plane in current view
10
- newState.planeX=_this.props.sceneContext.scene.view.controls.target.x;newState.planeY=_this.props.sceneContext.scene.view.controls.target.y;newState.planeA=-_this.props.sceneContext.scene.view.controls.getAzimuthalAngle()/Math.PI*180+90}return newState})});_defineProperty(_this,"toggleObject",function(section,objectId){_this.setState(function(state){var _state$clippedObjects;return{clippedObjects:_objectSpread(_objectSpread({},state.clippedObjects),{},_defineProperty({},objectId,_objectSpread(_objectSpread({},state.clippedObjects[objectId]),{},_defineProperty({},section,!((_state$clippedObjects=state.clippedObjects[objectId])!==null&&_state$clippedObjects!==void 0&&_state$clippedObjects[section])))))}})});_defineProperty(_this,"toggleAllObjects",function(section,objectIds,value){_this.setState(function(state){return{clippedObjects:objectIds.reduce(function(res,objectId){return _objectSpread(_objectSpread({},res),{},_defineProperty({},objectId,_objectSpread(_objectSpread({},state.clippedObjects[objectId]),{},_defineProperty({},section,value))))},{})}})});return _this}_inherits(Compare3D,_React$Component);return _createClass(Compare3D,[{key:"componentDidMount",value:function componentDidMount(){var _this2=this;var loader=new GLTFLoader;loader.load(arrowModel,function(gltf){gltf.scene.traverse(function(object){if(object.isMesh){object.material.depthTest=false;// Ignores depth buffer
11
- object.material.depthWrite=false;// Prevents modifying depth buffer
12
- }});gltf.scene.renderOrder=9999999;// Ensures it is rendered last
13
- var leftArrow=gltf.scene.clone();leftArrow.position.y=-4;leftArrow.rotation.z=-0.5*Math.PI;var rightArrow=gltf.scene.clone();rightArrow.position.y=4;rightArrow.rotation.z=0.5*Math.PI;_this2.arrows=new Group;_this2.arrows.add(leftArrow);_this2.arrows.add(rightArrow)})}},{key:"componentWillUnmount",value:function componentWillUnmount(){this.clearClippingPlane();if(this.arrows){this.arrows.traverse(function(obj){var _obj$dispose;return(_obj$dispose=obj.dispose)===null||_obj$dispose===void 0?void 0:_obj$dispose.call(obj)})}}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.state.enabled&&this.props.active&&!prevProps.active){this.enableArrows()}else if(this.state.enabled&&!this.props.active&&prevProps.active){this.disableArrows()}if(this.state.enabled&&this.state!==prevState){if(this.props.active&&!prevState.enabled){this.enableArrows()}// Recompute clipping plane
14
- this.updateClippingPlane()}else if(!this.state.enabled&&prevState.enabled){this.clearClippingPlane()}if(this.props.sceneContext.sceneObjects!==prevProps.sceneContext.sceneObjects){var sceneObjects=this.props.sceneContext.sceneObjects;this.setState(function(state){return{clippedObjects:Object.fromEntries(Object.entries(state.clippedObjects).filter(function(_ref3){var _ref4=_slicedToArray(_ref3,2),objectId=_ref4[0],entry=_ref4[1];return objectId in sceneObjects}))}})}}},{key:"render",value:function render(){var _this3=this;return[/*#__PURE__*/React.createElement(SideBar,{icon:"layers",id:"Compare3D",key:"SideBar",title:LocaleUtils.tr("appmenu.items.Compare3D"),width:"20em"},function(){return{body:_this3.renderBody()}}),this.state.enabled?/*#__PURE__*/React.createElement(MessageBar,null,/*#__PURE__*/React.createElement("div",{role:"body"},LocaleUtils.tr("compare3d.info_message"),"\xA0",/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this3.props.setCurrentTask("Compare3D")}},LocaleUtils.tr("compare3d.modify")))):null]}}])}(React.Component);_defineProperty(Compare3D,"propTypes",{active:PropTypes.bool,sceneContext:PropTypes.object,setCurrentTask:PropTypes.func});export default connect(function(state){return{active:state.task.id==="Compare3D"}},{setCurrentTask:setCurrentTask})(Compare3D);
47
+ */
48
+ var Compare3D = /*#__PURE__*/function (_React$Component) {
49
+ function Compare3D() {
50
+ var _this;
51
+ _classCallCheck(this, Compare3D);
52
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
53
+ args[_key] = arguments[_key];
54
+ }
55
+ _this = _callSuper(this, Compare3D, [].concat(args));
56
+ _defineProperty(_this, "state", {
57
+ enabled: false,
58
+ clippedObjects: {},
59
+ planeX: 0,
60
+ planeY: 0,
61
+ planeA: 0
62
+ });
63
+ _defineProperty(_this, "updateClippingPlane", function () {
64
+ var point = new Vector3(_this.state.planeX, _this.state.planeY, 0);
65
+ var alpha = _this.state.planeA / 180 * Math.PI;
66
+ var normal = new Vector3(Math.sin(alpha), Math.cos(alpha), 0);
67
+ var leftPlane = new Plane();
68
+ var rightPlane = new Plane();
69
+ leftPlane.setFromNormalAndCoplanarPoint(normal, point);
70
+ rightPlane.setFromNormalAndCoplanarPoint(normal.multiplyScalar(-1), point);
71
+ Object.entries(_this.state.clippedObjects).forEach(function (_ref) {
72
+ var _ref2 = _slicedToArray(_ref, 2),
73
+ objectId = _ref2[0],
74
+ config = _ref2[1];
75
+ var planes = [];
76
+ if (config.left) {
77
+ planes.push(leftPlane);
78
+ }
79
+ if (config.right) {
80
+ planes.push(rightPlane);
81
+ }
82
+ if (objectId === "__terrain") {
83
+ _this.props.sceneContext.map.clippingPlanes = planes;
84
+ } else {
85
+ var object = _this.props.sceneContext.getSceneObject(objectId);
86
+ object.clippingPlanes = planes;
87
+ object.traverse(function (child) {
88
+ if (child.material) {
89
+ child.material.clippingPlanes = planes;
90
+ child.material.clipShadows = true;
91
+ }
92
+ });
93
+ }
94
+ });
95
+ _this.props.sceneContext.scene.notifyChange();
96
+ _this.positionArrows(_this.state.planeX, _this.state.planeY, _this.state.planeA);
97
+ });
98
+ _defineProperty(_this, "clearClippingPlane", function () {
99
+ Object.keys(_this.state.clippedObjects).forEach(function (objectId) {
100
+ if (objectId === "__terrain") {
101
+ _this.props.sceneContext.map.clippingPlanes = [];
102
+ } else {
103
+ var object = _this.props.sceneContext.getSceneObject(objectId);
104
+ object.clippingPlanes = [];
105
+ object.traverse(function (child) {
106
+ if (child.material) {
107
+ child.material.clippingPlanes = [];
108
+ child.material.clipShadows = false;
109
+ }
110
+ });
111
+ }
112
+ });
113
+ if (_this.props.active) {
114
+ _this.disableArrows();
115
+ }
116
+ _this.props.sceneContext.scene.notifyChange();
117
+ });
118
+ _defineProperty(_this, "enableArrows", function () {
119
+ _this.props.sceneContext.addSceneObject("__compareArrows", _this.arrows);
120
+ _this.props.sceneContext.scene.view.controls.addEventListener('change', _this.centerArrowsInView);
121
+ var renderer = _this.props.sceneContext.scene.renderer;
122
+ renderer.domElement.addEventListener("pointerdown", _this.dragArrows);
123
+ _this.centerArrowsInView();
124
+ });
125
+ _defineProperty(_this, "disableArrows", function () {
126
+ var _this$props$sceneCont, _this$props$sceneCont2;
127
+ (_this$props$sceneCont = _this.props.sceneContext.scene.view.controls) === null || _this$props$sceneCont === void 0 || (_this$props$sceneCont2 = _this$props$sceneCont.removeEventListener) === null || _this$props$sceneCont2 === void 0 || _this$props$sceneCont2.call(_this$props$sceneCont, 'change', _this.centerArrowsInView);
128
+ _this.props.sceneContext.removeSceneObject("__compareArrows");
129
+ _this.props.sceneContext.scene.renderer.domElement.removeEventListener("pointerdown", _this.dragArrows);
130
+ });
131
+ _defineProperty(_this, "dragArrows", function (ev) {
132
+ var mousePos = function mousePos(event) {
133
+ var rect = event.target.getBoundingClientRect();
134
+ var x = (event.clientX - rect.left) / rect.width * 2 - 1;
135
+ var y = -((event.clientY - rect.top) / rect.height) * 2 + 1;
136
+ return new Vector2(x, y);
137
+ };
138
+ var camera = _this.props.sceneContext.scene.view.camera;
139
+ var raycaster = new Raycaster();
140
+ raycaster.setFromCamera(mousePos(ev), camera);
141
+ var intersects = raycaster.intersectObject(_this.arrows).length > 0;
142
+ if (!intersects) {
143
+ return;
144
+ }
145
+ var plane = new Plane().setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), _this.arrows.position);
146
+ var startPos = raycaster.ray.intersectPlane(plane, new Vector3());
147
+ var planePos = new Vector2(_this.state.planeX, _this.state.planeY);
148
+ var alpha = _this.state.planeA / 180 * Math.PI;
149
+ var planeNormal = new Vector3(Math.sin(alpha), Math.cos(alpha), 0);
150
+ var moveArrows = function moveArrows(event) {
151
+ raycaster.setFromCamera(mousePos(event), camera);
152
+ plane.setFromNormalAndCoplanarPoint(new Vector3(0, 0, 1), _this.arrows.position);
153
+ var pos = raycaster.ray.intersectPlane(plane, new Vector3());
154
+ var delta = planeNormal.clone().multiplyScalar(new Vector3().copy(pos.sub(startPos)).dot(planeNormal));
155
+ _this.setState({
156
+ planeX: planePos.x + delta.x,
157
+ planeY: planePos.y + delta.y
158
+ });
159
+ _this.positionArrows(planePos.x + delta.x, planePos.y + delta.y, _this.state.planeA);
160
+ };
161
+ _this.props.sceneContext.scene.view.controls.enabled = false;
162
+ ev.view.addEventListener("pointermove", moveArrows);
163
+ ev.view.addEventListener("pointerup", function () {
164
+ _this.props.sceneContext.scene.view.controls.enabled = true;
165
+ ev.view.removeEventListener("pointermove", moveArrows);
166
+ }, {
167
+ once: true
168
+ });
169
+ });
170
+ _defineProperty(_this, "centerArrowsInView", function () {
171
+ var _inter$point;
172
+ var inter = _this.props.sceneContext.getSceneIntersection(0, 0);
173
+ var center = (_inter$point = inter === null || inter === void 0 ? void 0 : inter.point) !== null && _inter$point !== void 0 ? _inter$point : _this.props.sceneContext.scene.view.controls.target.clone();
174
+ var alpha = _this.state.planeA / 180 * Math.PI;
175
+ var dir = new Vector3(Math.cos(alpha), -Math.sin(alpha), 0);
176
+ var curPos = new Vector3(_this.state.planeX, _this.state.planeY, 0);
177
+ var newPos = curPos.add(dir.multiplyScalar(center.sub(curPos).dot(dir)));
178
+ _this.setState({
179
+ planeX: newPos.x,
180
+ planeY: newPos.y
181
+ });
182
+ _this.positionArrows(newPos.x, newPos.y, _this.state.planeA);
183
+ });
184
+ _defineProperty(_this, "positionArrows", function (x, y, alpha) {
185
+ var _this$props$sceneCont3;
186
+ var target = new Vector3(x, y, 0);
187
+ var distance = _this.props.sceneContext.scene.view.camera.position.distanceTo(target);
188
+ var scale = Math.max(1, distance / 200);
189
+ var z = (_this$props$sceneCont3 = _this.props.sceneContext.getTerrainHeightFromMap([x, y])) !== null && _this$props$sceneCont3 !== void 0 ? _this$props$sceneCont3 : 0;
190
+ _this.arrows.position.x = target.x;
191
+ _this.arrows.position.y = target.y;
192
+ _this.arrows.position.z = z;
193
+ _this.arrows.rotation.z = -alpha / 180 * Math.PI;
194
+ _this.arrows.scale.set(scale, scale, scale);
195
+ _this.arrows.updateMatrixWorld();
196
+ });
197
+ _defineProperty(_this, "renderBody", function () {
198
+ var sceneContext = _this.props.sceneContext;
199
+ var objects = _objectSpread({
200
+ __terrain: {
201
+ layertree: true,
202
+ title: LocaleUtils.tr("map3d.terrain")
203
+ }
204
+ }, sceneContext.sceneObjects);
205
+ var objectIds = Object.keys(objects).filter(function (objectId) {
206
+ return objects[objectId].layertree;
207
+ });
208
+ return /*#__PURE__*/React.createElement("div", {
209
+ className: "compare3d-body",
210
+ role: "body"
211
+ }, /*#__PURE__*/React.createElement("div", {
212
+ className: "compare3d-title",
213
+ onClick: _this.toggleCompare
214
+ }, /*#__PURE__*/React.createElement(Icon, {
215
+ icon: _this.state.enabled ? "checked" : "unchecked"
216
+ }), /*#__PURE__*/React.createElement("span", null, LocaleUtils.tr("compare3d.compare_objects"))), /*#__PURE__*/React.createElement("div", {
217
+ className: "compare3d-objects"
218
+ }, ["left", "right"].map(function (section) {
219
+ var clipState = _this.state.clippedObjects;
220
+ var toggleAllIcon = "checked";
221
+ var toggleAllValue = true;
222
+ var toggleAllState = objectIds.reduce(function (res, id) {
223
+ var _clipState$id;
224
+ return res + ((_clipState$id = clipState[id]) === null || _clipState$id === void 0 ? void 0 : _clipState$id[section]);
225
+ }, 0);
226
+ if (toggleAllState === objectIds.length) {
227
+ toggleAllIcon = "unchecked";
228
+ toggleAllValue = false;
229
+ } else if (toggleAllState > 0) {
230
+ toggleAllIcon = "tristate";
231
+ }
232
+ return /*#__PURE__*/React.createElement("div", {
233
+ className: "compare3d-section",
234
+ key: "compare-" + section
235
+ }, /*#__PURE__*/React.createElement("div", {
236
+ className: "compare3d-item compare3d-item-toggleall",
237
+ onClick: _this.state.enabled ? function () {
238
+ return _this.toggleAllObjects(section, objectIds, toggleAllValue);
239
+ } : null,
240
+ title: LocaleUtils.tr("compare3d.toggleall")
241
+ }, /*#__PURE__*/React.createElement(Icon, {
242
+ className: "compare3d-item-checkbox",
243
+ disabled: !_this.state.enabled,
244
+ icon: toggleAllIcon
245
+ }), /*#__PURE__*/React.createElement("span", null, LocaleUtils.tr("compare3d.toggleall"))), objectIds.map(function (objectId) {
246
+ var _objects$objectId$tit, _clipState$objectId, _objects$objectId$tit2;
247
+ return /*#__PURE__*/React.createElement("div", {
248
+ className: "compare3d-item",
249
+ key: objectId,
250
+ onClick: _this.state.enabled ? function () {
251
+ return _this.toggleObject(section, objectId);
252
+ } : null,
253
+ title: (_objects$objectId$tit = objects[objectId].title) !== null && _objects$objectId$tit !== void 0 ? _objects$objectId$tit : objectId
254
+ }, /*#__PURE__*/React.createElement(Icon, {
255
+ className: "compare3d-item-checkbox",
256
+ disabled: !_this.state.enabled,
257
+ icon: (_clipState$objectId = clipState[objectId]) !== null && _clipState$objectId !== void 0 && _clipState$objectId[section] ? "unchecked" : "checked"
258
+ }), /*#__PURE__*/React.createElement("span", null, (_objects$objectId$tit2 = objects[objectId].title) !== null && _objects$objectId$tit2 !== void 0 ? _objects$objectId$tit2 : objectId));
259
+ }));
260
+ })), /*#__PURE__*/React.createElement("div", {
261
+ className: "compare3d-title"
262
+ }, LocaleUtils.tr("compare3d.clipplane")), /*#__PURE__*/React.createElement("table", {
263
+ className: "compare3d-planeconfig"
264
+ }, /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, "x"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(NumberInput, {
265
+ disabled: !_this.state.enabled,
266
+ onChange: function onChange(x) {
267
+ return _this.setState({
268
+ planeX: x
269
+ });
270
+ },
271
+ value: _this.state.planeX
272
+ }))), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, "y"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(NumberInput, {
273
+ disabled: !_this.state.enabled,
274
+ onChange: function onChange(y) {
275
+ return _this.setState({
276
+ planeY: y
277
+ });
278
+ },
279
+ value: _this.state.planeY
280
+ }))), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, "\u03B1"), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement(NumberInput, {
281
+ disabled: !_this.state.enabled,
282
+ onChange: function onChange(a) {
283
+ return _this.setState({
284
+ planeA: a
285
+ });
286
+ },
287
+ suffix: "\xB0",
288
+ value: _this.state.planeA
289
+ }))))));
290
+ });
291
+ _defineProperty(_this, "toggleCompare", function () {
292
+ _this.setState(function (state) {
293
+ var newState = {
294
+ enabled: !state.enabled
295
+ };
296
+ if (newState.enabled) {
297
+ // Position plane in current view
298
+ newState.planeX = _this.props.sceneContext.scene.view.controls.target.x;
299
+ newState.planeY = _this.props.sceneContext.scene.view.controls.target.y;
300
+ newState.planeA = -_this.props.sceneContext.scene.view.controls.getAzimuthalAngle() / Math.PI * 180 + 90;
301
+ }
302
+ return newState;
303
+ });
304
+ });
305
+ _defineProperty(_this, "toggleObject", function (section, objectId) {
306
+ _this.setState(function (state) {
307
+ var _state$clippedObjects;
308
+ return {
309
+ clippedObjects: _objectSpread(_objectSpread({}, state.clippedObjects), {}, _defineProperty({}, objectId, _objectSpread(_objectSpread({}, state.clippedObjects[objectId]), {}, _defineProperty({}, section, !((_state$clippedObjects = state.clippedObjects[objectId]) !== null && _state$clippedObjects !== void 0 && _state$clippedObjects[section])))))
310
+ };
311
+ });
312
+ });
313
+ _defineProperty(_this, "toggleAllObjects", function (section, objectIds, value) {
314
+ _this.setState(function (state) {
315
+ return {
316
+ clippedObjects: objectIds.reduce(function (res, objectId) {
317
+ return _objectSpread(_objectSpread({}, res), {}, _defineProperty({}, objectId, _objectSpread(_objectSpread({}, state.clippedObjects[objectId]), {}, _defineProperty({}, section, value))));
318
+ }, {})
319
+ };
320
+ });
321
+ });
322
+ return _this;
323
+ }
324
+ _inherits(Compare3D, _React$Component);
325
+ return _createClass(Compare3D, [{
326
+ key: "componentDidMount",
327
+ value: function componentDidMount() {
328
+ var _this2 = this;
329
+ var loader = new GLTFLoader();
330
+ loader.load(arrowModel, function (gltf) {
331
+ gltf.scene.traverse(function (object) {
332
+ if (object.isMesh) {
333
+ object.material.depthTest = false; // Ignores depth buffer
334
+ object.material.depthWrite = false; // Prevents modifying depth buffer
335
+ }
336
+ });
337
+ gltf.scene.renderOrder = 9999999; // Ensures it is rendered last
338
+
339
+ var leftArrow = gltf.scene.clone();
340
+ leftArrow.position.y = -4;
341
+ leftArrow.rotation.z = -0.5 * Math.PI;
342
+ var rightArrow = gltf.scene.clone();
343
+ rightArrow.position.y = 4;
344
+ rightArrow.rotation.z = 0.5 * Math.PI;
345
+ _this2.arrows = new Group();
346
+ _this2.arrows.add(leftArrow);
347
+ _this2.arrows.add(rightArrow);
348
+ });
349
+ }
350
+ }, {
351
+ key: "componentWillUnmount",
352
+ value: function componentWillUnmount() {
353
+ this.clearClippingPlane();
354
+ if (this.arrows) {
355
+ this.arrows.traverse(function (obj) {
356
+ var _obj$dispose;
357
+ return (_obj$dispose = obj.dispose) === null || _obj$dispose === void 0 ? void 0 : _obj$dispose.call(obj);
358
+ });
359
+ }
360
+ }
361
+ }, {
362
+ key: "componentDidUpdate",
363
+ value: function componentDidUpdate(prevProps, prevState) {
364
+ if (this.state.enabled && this.props.active && !prevProps.active) {
365
+ this.enableArrows();
366
+ } else if (this.state.enabled && !this.props.active && prevProps.active) {
367
+ this.disableArrows();
368
+ }
369
+ if (this.state.enabled && this.state !== prevState) {
370
+ if (this.props.active && !prevState.enabled) {
371
+ this.enableArrows();
372
+ }
373
+ // Recompute clipping plane
374
+ this.updateClippingPlane();
375
+ } else if (!this.state.enabled && prevState.enabled) {
376
+ this.clearClippingPlane();
377
+ }
378
+ if (this.props.sceneContext.sceneObjects !== prevProps.sceneContext.sceneObjects) {
379
+ var sceneObjects = this.props.sceneContext.sceneObjects;
380
+ this.setState(function (state) {
381
+ return {
382
+ clippedObjects: Object.fromEntries(Object.entries(state.clippedObjects).filter(function (_ref3) {
383
+ var _ref4 = _slicedToArray(_ref3, 2),
384
+ objectId = _ref4[0],
385
+ entry = _ref4[1];
386
+ return objectId in sceneObjects;
387
+ }))
388
+ };
389
+ });
390
+ }
391
+ }
392
+ }, {
393
+ key: "render",
394
+ value: function render() {
395
+ var _this3 = this;
396
+ return [/*#__PURE__*/React.createElement(SideBar, {
397
+ icon: "layers",
398
+ id: "Compare3D",
399
+ key: "SideBar",
400
+ title: LocaleUtils.tr("appmenu.items.Compare3D"),
401
+ width: "20em"
402
+ }, function () {
403
+ return {
404
+ body: _this3.renderBody()
405
+ };
406
+ }), this.state.enabled ? /*#__PURE__*/React.createElement(MessageBar, null, /*#__PURE__*/React.createElement("div", {
407
+ role: "body"
408
+ }, LocaleUtils.tr("compare3d.info_message"), "\xA0", /*#__PURE__*/React.createElement("button", {
409
+ className: "button",
410
+ onClick: function onClick() {
411
+ return _this3.props.setCurrentTask("Compare3D");
412
+ }
413
+ }, LocaleUtils.tr("compare3d.modify")))) : null];
414
+ }
415
+ }]);
416
+ }(React.Component);
417
+ _defineProperty(Compare3D, "propTypes", {
418
+ active: PropTypes.bool,
419
+ sceneContext: PropTypes.object,
420
+ setCurrentTask: PropTypes.func
421
+ });
422
+ export default connect(function (state) {
423
+ return {
424
+ active: state.task.id === "Compare3D"
425
+ };
426
+ }, {
427
+ setCurrentTask: setCurrentTask
428
+ })(Compare3D);