qwc2 2025.10.9 → 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,24 +1,399 @@
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 _construct(t,e,r){if(_isNativeReflectConstruct())return Reflect.construct.apply(null,arguments);var o=[null];o.push.apply(o,e);var p=new(t.bind.apply(t,o));return r&&_setPrototypeOf(p,r.prototype),p}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}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 _construct(t, e, r) { if (_isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); var o = [null]; o.push.apply(o, e); var p = new (t.bind.apply(t, o))(); return r && _setPrototypeOf(p, r.prototype), p; }
3
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
4
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
5
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
6
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
7
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
8
+ 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."); }
9
+ 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; } }
10
+ 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; }
11
+ 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; } }
12
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
13
+ function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
14
+ 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); } }
15
+ function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
16
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
17
+ 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); }
18
+ function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
19
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
20
+ function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
21
+ 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); }
22
+ function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
23
+ 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; }
24
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
25
+ 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); }
26
+ /**
2
27
  * Copyright 2025 Sourcepole AG
3
28
  * All rights reserved.
4
29
  *
5
30
  * This source code is licensed under the BSD-style license found in the
6
31
  * LICENSE file in the root directory of this source tree.
7
- */import React from"react";import{connect}from"react-redux";import ColorLayer from"@giro3d/giro3d/core/layer/ColorLayer";import DrawTool,{conditions}from"@giro3d/giro3d/interactions/DrawTool";import VectorSource from"@giro3d/giro3d/sources/VectorSource";import FileSaver from"file-saver";import ol from"openlayers";import pointInPolygon from"point-in-polygon";import PropTypes from"prop-types";import{Box3,BufferGeometry,Float32BufferAttribute,Group,Matrix4,Mesh,MeshStandardMaterial,Quaternion,Scene,Vector3}from"three";import{GLTFExporter}from"three/addons/exporters/GLTFExporter.js";import{setCurrentTask}from"../../actions/task";import SideBar from"../../components/SideBar";import{TileMeshHelper}from"../../components/map3d/utils/MiscUtils3D";import Spinner from"../../components/widgets/Spinner";import LocaleUtils from"../../utils/LocaleUtils";import VectorLayerUtils from"../../utils/VectorLayerUtils";/**
32
+ */
33
+
34
+ import React from 'react';
35
+ import { connect } from 'react-redux';
36
+ import ColorLayer from '@giro3d/giro3d/core/layer/ColorLayer';
37
+ import DrawTool, { conditions } from '@giro3d/giro3d/interactions/DrawTool';
38
+ import VectorSource from '@giro3d/giro3d/sources/VectorSource';
39
+ import FileSaver from 'file-saver';
40
+ import ol from 'openlayers';
41
+ import pointInPolygon from 'point-in-polygon';
42
+ import PropTypes from 'prop-types';
43
+ import { Box3, BufferGeometry, Float32BufferAttribute, Group, Matrix4, Mesh, MeshStandardMaterial, Quaternion, Scene, Vector3 } from 'three';
44
+ import { GLTFExporter } from 'three/addons/exporters/GLTFExporter.js';
45
+ import { setCurrentTask } from '../../actions/task';
46
+ import SideBar from '../../components/SideBar';
47
+ import { TileMeshHelper } from '../../components/map3d/utils/MiscUtils3D';
48
+ import Spinner from '../../components/widgets/Spinner';
49
+ import LocaleUtils from '../../utils/LocaleUtils';
50
+ import VectorLayerUtils from '../../utils/VectorLayerUtils';
51
+
52
+ /**
8
53
  * Export objects from the 3D map.
9
- */var ExportObjects3D=/*#__PURE__*/function(_React$Component){function ExportObjects3D(props){var _this;_classCallCheck(this,ExportObjects3D);_this=_callSuper(this,ExportObjects3D,[props]);_defineProperty(_this,"state",{selectedFormat:"model/gltf+json",exporting:false,exportPolygon:null});_defineProperty(_this,"onShow",function(){_this.abortController=new AbortController;_this.measureTool=new DrawTool({instance:_this.props.sceneContext.scene});_this.drawLayer=new ColorLayer({source:new VectorSource({data:[],format:new ol.format.GeoJSON,style:_this.featureStyleFunction})});_this.props.sceneContext.map.addLayer(_this.drawLayer);_this.restart()});_defineProperty(_this,"onHide",function(){_this.abortController.abort();_this.abortController=null;_this.measureTool.dispose();_this.measureTool=null;_this.props.sceneContext.map.removeLayer(_this.drawLayer,{dispose:true});_this.drawLayer=null;_this.setState({exporting:false,exportPolygon:null})});_defineProperty(_this,"formatChanged",function(ev){_this.setState({selectedFormat:ev.target.value})});_defineProperty(_this,"renderBody",function(){var exportDisabled=_this.state.exporting||_this.state.exportPolygon===null;var formatMap={"model/gltf+json":"GLTF"};return/*#__PURE__*/React.createElement("div",{className:"mapexport-body"},/*#__PURE__*/React.createElement("form",{onSubmit:_this.exportArea},/*#__PURE__*/React.createElement("table",{className:"options-table"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("mapexport.format")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{name:"FORMAT",onChange:_this.formatChanged,value:_this.state.selectedFormat},Object.entries(formatMap).map(function(_ref){var _ref2=_slicedToArray(_ref,2),format=_ref2[0],label=_ref2[1];return/*#__PURE__*/React.createElement("option",{key:format,value:format},label)})))))),/*#__PURE__*/React.createElement("div",{className:"button-bar"},/*#__PURE__*/React.createElement("button",{className:"button",disabled:exportDisabled,type:"submit"},_this.state.exporting?/*#__PURE__*/React.createElement("span",{className:"mapexport-wait"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("mapexport.wait")):LocaleUtils.tr("mapexport.submit")))))});_defineProperty(_this,"restart",function(){if(_this.abortController){_this.abortController.abort()}_this.abortController=new AbortController;var pick=function pick(e){return _this.props.sceneContext.scene.pickObjectsAt(e,{sortByDistance:true,where:[_this.props.sceneContext.getMap()]})};var options={signal:_this.abortController.signal,endCondition:conditions.doubleClick,pick:pick};_this.measureTool.createPolygon(options).then(_this.selectArea)["catch"](function(){})});_defineProperty(_this,"selectArea",function(polygon){if(polygon===null){_this.restart();return}_this.drawLayer.source.clear();var polyGeoJson=polygon.toGeoJSON();var feature=new ol.format.GeoJSON().readFeature(polyGeoJson,{dataProjection:"EPSG:4326",featureProjection:_this.props.sceneContext.mapCrs});_this.drawLayer.source.addFeature(feature);_this.props.sceneContext.scene.remove(polygon);_this.setState({exportPolygon:feature.getGeometry().getCoordinates()});// Setup for next selection
10
- _this.restart()});_defineProperty(_this,"featureStyleFunction",function(){return[new ol.style.Style({fill:new ol.style.Fill({color:[41,120,180,0.5]})}),new ol.style.Style({stroke:new ol.style.Stroke({color:[255,255,255],width:4})}),new ol.style.Style({stroke:new ol.style.Stroke({color:[41,120,180],width:1.5})})]});_defineProperty(_this,"exportArea",function(ev){ev.preventDefault();_this.setState({exporting:true});if(_this.state.selectedFormat==="model/gltf+json"){// Delay one loop to ensure exporting: true is set
11
- setTimeout(_this.exportToGltf,0)}});_defineProperty(_this,"exportToGltf",function(){var bbox=VectorLayerUtils.computeFeatureBBox({type:"Polygon",coordinates:_this.state.exportPolygon});// Create a bounding box in world space
12
- var selectionBox=new Box3().setFromPoints([new Vector3(bbox[0],bbox[1],0),new Vector3(bbox[2],bbox[3],8000)]);var exportGroup=new Group;exportGroup.rotation.set(-Math.PI/2,0,0);// GLTF is Y-UP
13
- Object.entries(_this.props.sceneContext.sceneObjects).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),objectId=_ref4[0],options=_ref4[1];if(!options.layertree||!options.visibility){return}var object=_this.props.sceneContext.getSceneObject(objectId);if(object.tiles){_this.addTileToExportGroup(object.tiles,exportGroup,selectionBox)}else{_this.addObjectToExportGroup(object,exportGroup,selectionBox)}});var exportScene=new Scene;exportScene.add(exportGroup);var exporter=new GLTFExporter;exporter.parse(exportScene,function(gltf){var blob=new Blob([JSON.stringify(gltf)],{type:"application/json"});FileSaver.saveAs(blob,"scene.gltf");_this.setState({exporting:false})})});_defineProperty(_this,"addTileToExportGroup",function(tiles,exportGroup,selectionBox){tiles.group.traverse(function(c){if(c.geometry){var bbox=c.geometry.boundingBox.clone().applyMatrix4(c.matrixWorld);if(!selectionBox.intersectsBox(bbox)){return}var posAttr=c.geometry.getAttribute("position");var norAttr=c.geometry.getAttribute("normal");var colAttr=c.geometry.getAttribute("color");var colStride=c.material.transparent?4:3;var helper=new TileMeshHelper(c);helper.getFeatureIds().forEach(function(featureId){var _helper$getTileUserDa;var feature={position:[],normal:[],color:colAttr?[]:null,colorStride:colStride,bbox:new Box3};helper.forEachFeatureTriangle(featureId,function(i0,i1,i2){var _feature$position,_feature$position2,_feature$position3;var pos1=posAttr.array.slice(3*i0,3*i0+3);var pos2=posAttr.array.slice(3*i1,3*i1+3);var pos3=posAttr.array.slice(3*i2,3*i2+3);(_feature$position=feature.position).push.apply(_feature$position,_toConsumableArray(pos1));(_feature$position2=feature.position).push.apply(_feature$position2,_toConsumableArray(pos2));(_feature$position3=feature.position).push.apply(_feature$position3,_toConsumableArray(pos3));feature.normal.push(norAttr.getX(i0),norAttr.getY(i0),norAttr.getZ(i0));feature.normal.push(norAttr.getX(i1),norAttr.getY(i1),norAttr.getZ(i1));feature.normal.push(norAttr.getX(i2),norAttr.getY(i2),norAttr.getZ(i2));if(colAttr){var _feature$color,_feature$color2,_feature$color3;(_feature$color=feature.color).push.apply(_feature$color,_toConsumableArray(colAttr.array.slice(colStride*i0,colStride*i0+colStride)));(_feature$color2=feature.color).push.apply(_feature$color2,_toConsumableArray(colAttr.array.slice(colStride*i1,colStride*i1+colStride)));(_feature$color3=feature.color).push.apply(_feature$color3,_toConsumableArray(colAttr.array.slice(colStride*i2,colStride*i2+colStride)))}feature.bbox.expandByPoint(_construct(Vector3,_toConsumableArray(pos1)).applyMatrix4(c.matrixWorld));feature.bbox.expandByPoint(_construct(Vector3,_toConsumableArray(pos2)).applyMatrix4(c.matrixWorld));feature.bbox.expandByPoint(_construct(Vector3,_toConsumableArray(pos3)).applyMatrix4(c.matrixWorld))});// Omit feature if not within selection
14
- if(!selectionBox.intersectsBox(feature.bbox)||!_this.bboxInExportPolygon(feature.bbox)){return}// Express coordinates wrt center of feature bbox
15
- var prevPosition=new Vector3;c.matrixWorld.decompose(prevPosition,new Quaternion,new Vector3);var newPosition=new Vector3;feature.bbox.getCenter(newPosition);var offset=new Vector3().subVectors(newPosition,prevPosition);for(var i=0;i<feature.position.length/3;++i){feature.position[3*i+0]-=offset.x;feature.position[3*i+1]-=offset.y;feature.position[3*i+2]-=offset.z}// Construct mesh
16
- var material=new MeshStandardMaterial({color:16777215});var geometry=new BufferGeometry;geometry.setAttribute("position",new Float32BufferAttribute(feature.position,3));geometry.setAttribute("normal",new Float32BufferAttribute(feature.normal,3));if(feature.color){var _material$color;// geometry.setAttribute('color', new Float32BufferAttribute(feature.color, feature.colorStride));
17
- // material.vertexColors = feature.color !== null;
18
- // material.transparent = feature.colorStride === 4;
19
- (_material$color=material.color).set.apply(_material$color,_toConsumableArray(feature.color.slice(0,3)))}var mesh=new Mesh(geometry,material);mesh.applyMatrix4(c.matrixWorld.clone().multiply(new Matrix4().makeTranslation(offset)));// Include attribute from feature properties table
20
- Object.assign(mesh.userData,helper.getFeatureProperties(featureId));// Add label
21
- var labelEntry=(_helper$getTileUserDa=helper.getTileUserData().tileLabels)===null||_helper$getTileUserDa===void 0?void 0:_helper$getTileUserDa[featureId];if(labelEntry){mesh.userData.label=labelEntry.label;mesh.userData.labelOffset=labelEntry.labelOffset}exportGroup.add(mesh)})}})});_defineProperty(_this,"addObjectToExportGroup",function(object,exportGroup,selectionBox){object.children.forEach(function(child){var objBox=new Box3().setFromObject(child);if(selectionBox.intersectsBox(objBox)&&_this.bboxInExportPolygon(objBox)){exportGroup.add(child.clone())}})});_defineProperty(_this,"bboxInExportPolygon",function(box3){var polygon=_this.state.exportPolygon[0];var _ref5=[box3.min.x,box3.min.y,box3.max.x,box3.max.y],xmin=_ref5[0],ymin=_ref5[1],xmax=_ref5[2],ymax=_ref5[3];function doLinesIntersect(p1,p2,p3,p4){// Helper function to check if two line segments (p1-p2 and p3-p4) intersect
22
- function ccw(A,B,C){return(C[1]-A[1])*(B[0]-A[0])>(B[1]-A[1])*(C[0]-A[0])}return ccw(p1,p3,p4)!==ccw(p2,p3,p4)&&ccw(p1,p2,p3)!==ccw(p1,p2,p4)}// Check if any bbox vertex is inside the polygon
23
- if(pointInPolygon([xmin,ymin],polygon)||pointInPolygon([xmax,ymin],polygon)||pointInPolygon([xmax,ymax],polygon)||pointInPolygon([xmax,ymin],polygon)){return true}// Check if any edge of the polygon intersects the bbox
24
- for(var i=0;i<polygon.length-1;i++){var _polygon$i=_slicedToArray(polygon[i],2),x1=_polygon$i[0],y1=_polygon$i[1];var _polygon=_slicedToArray(polygon[i+1],2),x2=_polygon[0],y2=_polygon[1];if(doLinesIntersect([x1,y1],[x2,y2],[xmin,ymin],[xmin,ymax])||doLinesIntersect([x1,y1],[x2,y2],[xmin,ymax],[xmax,ymax])||doLinesIntersect([x1,y1],[x2,y2],[xmax,ymax],[xmax,ymin])||doLinesIntersect([x1,y1],[x2,y2],[xmax,ymin],[xmin,ymin])){return true}}return false});_this.measureTool=null;_this.drawLayer=null;return _this}_inherits(ExportObjects3D,_React$Component);return _createClass(ExportObjects3D,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{extraClasses:"MapExport",icon:"export",id:"ExportObjects3D",onHide:this.onHide,onShow:this.onShow,title:LocaleUtils.tr("appmenu.items.ExportObjects3D"),width:"20em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(ExportObjects3D,"propTypes",{sceneContext:PropTypes.object,setCurrentTask:PropTypes.func});export default connect(function(state){return{theme:state.theme.current}},{setCurrentTask:setCurrentTask})(ExportObjects3D);
54
+ */
55
+ var ExportObjects3D = /*#__PURE__*/function (_React$Component) {
56
+ function ExportObjects3D(props) {
57
+ var _this;
58
+ _classCallCheck(this, ExportObjects3D);
59
+ _this = _callSuper(this, ExportObjects3D, [props]);
60
+ _defineProperty(_this, "state", {
61
+ selectedFormat: "model/gltf+json",
62
+ exporting: false,
63
+ exportPolygon: null
64
+ });
65
+ _defineProperty(_this, "onShow", function () {
66
+ _this.abortController = new AbortController();
67
+ _this.measureTool = new DrawTool({
68
+ instance: _this.props.sceneContext.scene
69
+ });
70
+ _this.drawLayer = new ColorLayer({
71
+ source: new VectorSource({
72
+ data: [],
73
+ format: new ol.format.GeoJSON(),
74
+ style: _this.featureStyleFunction
75
+ })
76
+ });
77
+ _this.props.sceneContext.map.addLayer(_this.drawLayer);
78
+ _this.restart();
79
+ });
80
+ _defineProperty(_this, "onHide", function () {
81
+ _this.abortController.abort();
82
+ _this.abortController = null;
83
+ _this.measureTool.dispose();
84
+ _this.measureTool = null;
85
+ _this.props.sceneContext.map.removeLayer(_this.drawLayer, {
86
+ dispose: true
87
+ });
88
+ _this.drawLayer = null;
89
+ _this.setState({
90
+ exporting: false,
91
+ exportPolygon: null
92
+ });
93
+ });
94
+ _defineProperty(_this, "formatChanged", function (ev) {
95
+ _this.setState({
96
+ selectedFormat: ev.target.value
97
+ });
98
+ });
99
+ _defineProperty(_this, "renderBody", function () {
100
+ var exportDisabled = _this.state.exporting || _this.state.exportPolygon === null;
101
+ var formatMap = {
102
+ "model/gltf+json": "GLTF"
103
+ };
104
+ return /*#__PURE__*/React.createElement("div", {
105
+ className: "mapexport-body"
106
+ }, /*#__PURE__*/React.createElement("form", {
107
+ onSubmit: _this.exportArea
108
+ }, /*#__PURE__*/React.createElement("table", {
109
+ className: "options-table"
110
+ }, /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, LocaleUtils.tr("mapexport.format")), /*#__PURE__*/React.createElement("td", null, /*#__PURE__*/React.createElement("select", {
111
+ name: "FORMAT",
112
+ onChange: _this.formatChanged,
113
+ value: _this.state.selectedFormat
114
+ }, Object.entries(formatMap).map(function (_ref) {
115
+ var _ref2 = _slicedToArray(_ref, 2),
116
+ format = _ref2[0],
117
+ label = _ref2[1];
118
+ return /*#__PURE__*/React.createElement("option", {
119
+ key: format,
120
+ value: format
121
+ }, label);
122
+ })))))), /*#__PURE__*/React.createElement("div", {
123
+ className: "button-bar"
124
+ }, /*#__PURE__*/React.createElement("button", {
125
+ className: "button",
126
+ disabled: exportDisabled,
127
+ type: "submit"
128
+ }, _this.state.exporting ? /*#__PURE__*/React.createElement("span", {
129
+ className: "mapexport-wait"
130
+ }, /*#__PURE__*/React.createElement(Spinner, null), " ", LocaleUtils.tr("mapexport.wait")) : LocaleUtils.tr("mapexport.submit")))));
131
+ });
132
+ _defineProperty(_this, "restart", function () {
133
+ if (_this.abortController) {
134
+ _this.abortController.abort();
135
+ }
136
+ _this.abortController = new AbortController();
137
+ var pick = function pick(e) {
138
+ return _this.props.sceneContext.scene.pickObjectsAt(e, {
139
+ sortByDistance: true,
140
+ where: [_this.props.sceneContext.getMap()]
141
+ });
142
+ };
143
+ var options = {
144
+ signal: _this.abortController.signal,
145
+ endCondition: conditions.doubleClick,
146
+ pick: pick
147
+ };
148
+ _this.measureTool.createPolygon(options).then(_this.selectArea)["catch"](function () {});
149
+ });
150
+ _defineProperty(_this, "selectArea", function (polygon) {
151
+ if (polygon === null) {
152
+ _this.restart();
153
+ return;
154
+ }
155
+ _this.drawLayer.source.clear();
156
+ var polyGeoJson = polygon.toGeoJSON();
157
+ var feature = new ol.format.GeoJSON().readFeature(polyGeoJson, {
158
+ dataProjection: "EPSG:4326",
159
+ featureProjection: _this.props.sceneContext.mapCrs
160
+ });
161
+ _this.drawLayer.source.addFeature(feature);
162
+ _this.props.sceneContext.scene.remove(polygon);
163
+ _this.setState({
164
+ exportPolygon: feature.getGeometry().getCoordinates()
165
+ });
166
+
167
+ // Setup for next selection
168
+ _this.restart();
169
+ });
170
+ _defineProperty(_this, "featureStyleFunction", function () {
171
+ return [new ol.style.Style({
172
+ fill: new ol.style.Fill({
173
+ color: [41, 120, 180, 0.5]
174
+ })
175
+ }), new ol.style.Style({
176
+ stroke: new ol.style.Stroke({
177
+ color: [255, 255, 255],
178
+ width: 4
179
+ })
180
+ }), new ol.style.Style({
181
+ stroke: new ol.style.Stroke({
182
+ color: [41, 120, 180],
183
+ width: 1.5
184
+ })
185
+ })];
186
+ });
187
+ _defineProperty(_this, "exportArea", function (ev) {
188
+ ev.preventDefault();
189
+ _this.setState({
190
+ exporting: true
191
+ });
192
+ if (_this.state.selectedFormat === "model/gltf+json") {
193
+ // Delay one loop to ensure exporting: true is set
194
+ setTimeout(_this.exportToGltf, 0);
195
+ }
196
+ });
197
+ _defineProperty(_this, "exportToGltf", function () {
198
+ var bbox = VectorLayerUtils.computeFeatureBBox({
199
+ type: "Polygon",
200
+ coordinates: _this.state.exportPolygon
201
+ });
202
+ // Create a bounding box in world space
203
+ var selectionBox = new Box3().setFromPoints([new Vector3(bbox[0], bbox[1], 0), new Vector3(bbox[2], bbox[3], 8000)]);
204
+ var exportGroup = new Group();
205
+ exportGroup.rotation.set(-Math.PI / 2, 0, 0); // GLTF is Y-UP
206
+
207
+ Object.entries(_this.props.sceneContext.sceneObjects).forEach(function (_ref3) {
208
+ var _ref4 = _slicedToArray(_ref3, 2),
209
+ objectId = _ref4[0],
210
+ options = _ref4[1];
211
+ if (!options.layertree || !options.visibility) {
212
+ return;
213
+ }
214
+ var object = _this.props.sceneContext.getSceneObject(objectId);
215
+ if (object.tiles) {
216
+ _this.addTileToExportGroup(object.tiles, exportGroup, selectionBox);
217
+ } else {
218
+ _this.addObjectToExportGroup(object, exportGroup, selectionBox);
219
+ }
220
+ });
221
+ var exportScene = new Scene();
222
+ exportScene.add(exportGroup);
223
+ var exporter = new GLTFExporter();
224
+ exporter.parse(exportScene, function (gltf) {
225
+ var blob = new Blob([JSON.stringify(gltf)], {
226
+ type: 'application/json'
227
+ });
228
+ FileSaver.saveAs(blob, "scene.gltf");
229
+ _this.setState({
230
+ exporting: false
231
+ });
232
+ });
233
+ });
234
+ _defineProperty(_this, "addTileToExportGroup", function (tiles, exportGroup, selectionBox) {
235
+ tiles.group.traverse(function (c) {
236
+ if (c.geometry) {
237
+ var bbox = c.geometry.boundingBox.clone().applyMatrix4(c.matrixWorld);
238
+ if (!selectionBox.intersectsBox(bbox)) {
239
+ return;
240
+ }
241
+ var posAttr = c.geometry.getAttribute('position');
242
+ var norAttr = c.geometry.getAttribute('normal');
243
+ var colAttr = c.geometry.getAttribute('color');
244
+ var colStride = c.material.transparent ? 4 : 3;
245
+ var helper = new TileMeshHelper(c);
246
+ helper.getFeatureIds().forEach(function (featureId) {
247
+ var _helper$getTileUserDa;
248
+ var feature = {
249
+ position: [],
250
+ normal: [],
251
+ color: colAttr ? [] : null,
252
+ colorStride: colStride,
253
+ bbox: new Box3()
254
+ };
255
+ helper.forEachFeatureTriangle(featureId, function (i0, i1, i2) {
256
+ var _feature$position, _feature$position2, _feature$position3;
257
+ var pos1 = posAttr.array.slice(3 * i0, 3 * i0 + 3);
258
+ var pos2 = posAttr.array.slice(3 * i1, 3 * i1 + 3);
259
+ var pos3 = posAttr.array.slice(3 * i2, 3 * i2 + 3);
260
+ (_feature$position = feature.position).push.apply(_feature$position, _toConsumableArray(pos1));
261
+ (_feature$position2 = feature.position).push.apply(_feature$position2, _toConsumableArray(pos2));
262
+ (_feature$position3 = feature.position).push.apply(_feature$position3, _toConsumableArray(pos3));
263
+ feature.normal.push(norAttr.getX(i0), norAttr.getY(i0), norAttr.getZ(i0));
264
+ feature.normal.push(norAttr.getX(i1), norAttr.getY(i1), norAttr.getZ(i1));
265
+ feature.normal.push(norAttr.getX(i2), norAttr.getY(i2), norAttr.getZ(i2));
266
+ if (colAttr) {
267
+ var _feature$color, _feature$color2, _feature$color3;
268
+ (_feature$color = feature.color).push.apply(_feature$color, _toConsumableArray(colAttr.array.slice(colStride * i0, colStride * i0 + colStride)));
269
+ (_feature$color2 = feature.color).push.apply(_feature$color2, _toConsumableArray(colAttr.array.slice(colStride * i1, colStride * i1 + colStride)));
270
+ (_feature$color3 = feature.color).push.apply(_feature$color3, _toConsumableArray(colAttr.array.slice(colStride * i2, colStride * i2 + colStride)));
271
+ }
272
+ feature.bbox.expandByPoint(_construct(Vector3, _toConsumableArray(pos1)).applyMatrix4(c.matrixWorld));
273
+ feature.bbox.expandByPoint(_construct(Vector3, _toConsumableArray(pos2)).applyMatrix4(c.matrixWorld));
274
+ feature.bbox.expandByPoint(_construct(Vector3, _toConsumableArray(pos3)).applyMatrix4(c.matrixWorld));
275
+ });
276
+
277
+ // Omit feature if not within selection
278
+ if (!selectionBox.intersectsBox(feature.bbox) || !_this.bboxInExportPolygon(feature.bbox)) {
279
+ return;
280
+ }
281
+
282
+ // Express coordinates wrt center of feature bbox
283
+ var prevPosition = new Vector3();
284
+ c.matrixWorld.decompose(prevPosition, new Quaternion(), new Vector3());
285
+ var newPosition = new Vector3();
286
+ feature.bbox.getCenter(newPosition);
287
+ var offset = new Vector3().subVectors(newPosition, prevPosition);
288
+ for (var i = 0; i < feature.position.length / 3; ++i) {
289
+ feature.position[3 * i + 0] -= offset.x;
290
+ feature.position[3 * i + 1] -= offset.y;
291
+ feature.position[3 * i + 2] -= offset.z;
292
+ }
293
+ // Construct mesh
294
+ var material = new MeshStandardMaterial({
295
+ color: 0xFFFFFF
296
+ });
297
+ var geometry = new BufferGeometry();
298
+ geometry.setAttribute('position', new Float32BufferAttribute(feature.position, 3));
299
+ geometry.setAttribute('normal', new Float32BufferAttribute(feature.normal, 3));
300
+ if (feature.color) {
301
+ var _material$color;
302
+ // geometry.setAttribute('color', new Float32BufferAttribute(feature.color, feature.colorStride));
303
+ // material.vertexColors = feature.color !== null;
304
+ // material.transparent = feature.colorStride === 4;
305
+ (_material$color = material.color).set.apply(_material$color, _toConsumableArray(feature.color.slice(0, 3)));
306
+ }
307
+ var mesh = new Mesh(geometry, material);
308
+ mesh.applyMatrix4(c.matrixWorld.clone().multiply(new Matrix4().makeTranslation(offset)));
309
+ // Include attribute from feature properties table
310
+ Object.assign(mesh.userData, helper.getFeatureProperties(featureId));
311
+ // Add label
312
+ var labelEntry = (_helper$getTileUserDa = helper.getTileUserData().tileLabels) === null || _helper$getTileUserDa === void 0 ? void 0 : _helper$getTileUserDa[featureId];
313
+ if (labelEntry) {
314
+ mesh.userData.label = labelEntry.label;
315
+ mesh.userData.labelOffset = labelEntry.labelOffset;
316
+ }
317
+ exportGroup.add(mesh);
318
+ });
319
+ }
320
+ });
321
+ });
322
+ _defineProperty(_this, "addObjectToExportGroup", function (object, exportGroup, selectionBox) {
323
+ object.children.forEach(function (child) {
324
+ var objBox = new Box3().setFromObject(child);
325
+ if (selectionBox.intersectsBox(objBox) && _this.bboxInExportPolygon(objBox)) {
326
+ exportGroup.add(child.clone());
327
+ }
328
+ });
329
+ });
330
+ _defineProperty(_this, "bboxInExportPolygon", function (box3) {
331
+ var polygon = _this.state.exportPolygon[0];
332
+ var _ref5 = [box3.min.x, box3.min.y, box3.max.x, box3.max.y],
333
+ xmin = _ref5[0],
334
+ ymin = _ref5[1],
335
+ xmax = _ref5[2],
336
+ ymax = _ref5[3];
337
+ function doLinesIntersect(p1, p2, p3, p4) {
338
+ // Helper function to check if two line segments (p1-p2 and p3-p4) intersect
339
+ function ccw(A, B, C) {
340
+ return (C[1] - A[1]) * (B[0] - A[0]) > (B[1] - A[1]) * (C[0] - A[0]);
341
+ }
342
+ return ccw(p1, p3, p4) !== ccw(p2, p3, p4) && ccw(p1, p2, p3) !== ccw(p1, p2, p4);
343
+ }
344
+
345
+ // Check if any bbox vertex is inside the polygon
346
+ if (pointInPolygon([xmin, ymin], polygon) || pointInPolygon([xmax, ymin], polygon) || pointInPolygon([xmax, ymax], polygon) || pointInPolygon([xmax, ymin], polygon)) {
347
+ return true;
348
+ }
349
+
350
+ // Check if any edge of the polygon intersects the bbox
351
+ for (var i = 0; i < polygon.length - 1; i++) {
352
+ var _polygon$i = _slicedToArray(polygon[i], 2),
353
+ x1 = _polygon$i[0],
354
+ y1 = _polygon$i[1];
355
+ var _polygon = _slicedToArray(polygon[i + 1], 2),
356
+ x2 = _polygon[0],
357
+ y2 = _polygon[1];
358
+ if (doLinesIntersect([x1, y1], [x2, y2], [xmin, ymin], [xmin, ymax]) || doLinesIntersect([x1, y1], [x2, y2], [xmin, ymax], [xmax, ymax]) || doLinesIntersect([x1, y1], [x2, y2], [xmax, ymax], [xmax, ymin]) || doLinesIntersect([x1, y1], [x2, y2], [xmax, ymin], [xmin, ymin])) {
359
+ return true;
360
+ }
361
+ }
362
+ return false;
363
+ });
364
+ _this.measureTool = null;
365
+ _this.drawLayer = null;
366
+ return _this;
367
+ }
368
+ _inherits(ExportObjects3D, _React$Component);
369
+ return _createClass(ExportObjects3D, [{
370
+ key: "render",
371
+ value: function render() {
372
+ var _this2 = this;
373
+ return /*#__PURE__*/React.createElement(SideBar, {
374
+ extraClasses: "MapExport",
375
+ icon: "export",
376
+ id: "ExportObjects3D",
377
+ onHide: this.onHide,
378
+ onShow: this.onShow,
379
+ title: LocaleUtils.tr("appmenu.items.ExportObjects3D"),
380
+ width: "20em"
381
+ }, function () {
382
+ return {
383
+ body: _this2.renderBody()
384
+ };
385
+ });
386
+ }
387
+ }]);
388
+ }(React.Component);
389
+ _defineProperty(ExportObjects3D, "propTypes", {
390
+ sceneContext: PropTypes.object,
391
+ setCurrentTask: PropTypes.func
392
+ });
393
+ export default connect(function (state) {
394
+ return {
395
+ theme: state.theme.current
396
+ };
397
+ }, {
398
+ setCurrentTask: setCurrentTask
399
+ })(ExportObjects3D);