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.
- package/actions/display.js +30 -1
- package/actions/editing.js +22 -1
- package/actions/layerinfo.js +13 -1
- package/actions/layers.js +213 -3
- package/actions/localConfig.js +58 -1
- package/actions/locale.js +21 -1
- package/actions/locate.js +26 -1
- package/actions/logging.js +10 -1
- package/actions/map.js +105 -2
- package/actions/measurement.js +12 -1
- package/actions/processNotifications.js +37 -1
- package/actions/redlining.js +18 -1
- package/actions/redliningPick.js +12 -1
- package/actions/search.js +12 -1
- package/actions/serviceinfo.js +12 -1
- package/actions/task.js +55 -3
- package/actions/theme.js +339 -19
- package/actions/windows.js +164 -5
- package/components/AppMenu.js +435 -3
- package/components/AttributeForm.js +928 -32
- package/components/AttributeTableWidget.js +1105 -13
- package/components/AutoEditForm.js +189 -3
- package/components/CoordinateDisplayer.js +78 -2
- package/components/EditComboField.js +190 -6
- package/components/EditUploadField.js +315 -3
- package/components/ExportSelection.js +203 -2
- package/components/FullscreenSwitcher.js +90 -3
- package/components/Icon.js +81 -2
- package/components/IdentifyViewer.js +1161 -6
- package/components/ImportLayer.js +718 -20
- package/components/LayerInfoWindow.js +145 -2
- package/components/LinkFeatureForm.js +246 -5
- package/components/MapButton.js +88 -2
- package/components/MapSelection.js +287 -8
- package/components/MessageBar.js +68 -2
- package/components/NumericInputWindow.js +359 -2
- package/components/PickFeature.js +266 -2
- package/components/PluginsContainer.js +227 -8
- package/components/PrintSelection.js +620 -49
- package/components/ProcessNotifications.js +104 -2
- package/components/QtDesignerForm.js +1137 -18
- package/components/ResizeableWindow.js +591 -8
- package/components/SearchBox.js +1307 -20
- package/components/ServiceInfoWindow.js +107 -2
- package/components/SideBar.js +204 -4
- package/components/StandardApp.js +381 -20
- package/components/Swipeable.js +15 -1
- package/components/TaskBar.js +85 -2
- package/components/ThemeLayersListWindow.js +216 -4
- package/components/ThemeList.js +381 -7
- package/components/Toolbar.js +106 -2
- package/components/WindowManager.js +178 -2
- package/components/map/OlLayer.js +257 -6
- package/components/map/OlMap.js +405 -5
- package/components/map/layers/BingLayer.js +31 -2
- package/components/map/layers/GoogleLayer.js +222 -19
- package/components/map/layers/GraticuleLayer.js +21 -1
- package/components/map/layers/ImageLayer.js +15 -1
- package/components/map/layers/MVTLayer.js +52 -2
- package/components/map/layers/OSMLayer.js +24 -2
- package/components/map/layers/OverlayLayer.js +55 -3
- package/components/map/layers/VectorLayer.js +173 -8
- package/components/map/layers/WFSLayer.js +220 -6
- package/components/map/layers/WMSLayer.js +180 -6
- package/components/map/layers/WMTSLayer.js +67 -3
- package/components/map/layers/XYZLayer.js +24 -2
- package/components/map/layers/index.js +28 -1
- package/components/map3d/EditDataset3D.js +190 -3
- package/components/map3d/HeightProfile3D.js +402 -3
- package/components/map3d/ImportObjects3D.js +162 -2
- package/components/map3d/Map3D.js +1304 -38
- package/components/map3d/MapControls3D.js +392 -7
- package/components/map3d/SearchField3D.js +183 -11
- package/components/map3d/View3DSwitcher.js +98 -2
- package/components/map3d/drawtool/CreateTool3D.js +174 -4
- package/components/map3d/drawtool/EditTool3D.js +590 -6
- package/components/map3d/drawtool/NumericInput3D.js +336 -4
- package/components/map3d/layers/GeoTIFFLayer3D.js +15 -1
- package/components/map3d/layers/VectorLayer3D.js +53 -2
- package/components/map3d/layers/WFSLayer3D.js +109 -3
- package/components/map3d/layers/WMSLayer3D.js +70 -2
- package/components/map3d/layers/WMTSLayer3D.js +27 -3
- package/components/map3d/layers/index.js +14 -1
- package/components/map3d/utils/FirstPersonControls3D.js +423 -16
- package/components/map3d/utils/MiscUtils3D.js +221 -13
- package/components/map3d/utils/OrbitControls3D.js +176 -5
- package/components/map3d/utils/Tiles3DStyle.js +238 -9
- package/components/share/ShareLink.js +54 -2
- package/components/share/ShareQRCode.js +62 -2
- package/components/share/ShareSocials.js +125 -3
- package/components/timeline/FixedTimeline.js +236 -5
- package/components/timeline/InfiniteTimeline.js +347 -8
- package/components/timeline/TimelineFeaturesSlider.js +439 -5
- package/components/widgets/AccordeonWidget.js +96 -2
- package/components/widgets/ButtonBar.js +124 -2
- package/components/widgets/ColorButton.js +201 -3
- package/components/widgets/ComboBox.js +166 -2
- package/components/widgets/CopyButton.js +110 -2
- package/components/widgets/DateTimeInput.js +100 -3
- package/components/widgets/EditableSelect.js +230 -3
- package/components/widgets/FileSelector.js +128 -4
- package/components/widgets/Input.js +124 -2
- package/components/widgets/InputContainer.js +96 -2
- package/components/widgets/LayerCatalogWidget.js +219 -3
- package/components/widgets/MenuButton.js +157 -1
- package/components/widgets/ModalDialog.js +64 -2
- package/components/widgets/NavBar.js +119 -2
- package/components/widgets/NumberInput.js +226 -4
- package/components/widgets/PopupMenu.js +72 -1
- package/components/widgets/Primitives.js +6 -1
- package/components/widgets/ReCaptchaWidget.js +55 -1
- package/components/widgets/SearchWidget.js +255 -2
- package/components/widgets/Spinner.js +44 -2
- package/components/widgets/SuggestionInput.js +77 -2
- package/components/widgets/TextInput.js +308 -2
- package/components/widgets/ToggleSwitch.js +85 -2
- package/components/widgets/VectorLayerPicker.js +85 -3
- package/libs/openlayers.js +225 -5
- package/package.json +1 -1
- package/plugins/API.js +358 -15
- package/plugins/AttributeTable.js +109 -3
- package/plugins/Authentication.js +130 -5
- package/plugins/BackgroundSwitcher.js +218 -4
- package/plugins/Bookmark.js +289 -3
- package/plugins/BottomBar.js +298 -4
- package/plugins/CookiePopup.js +67 -3
- package/plugins/Cyclomedia.js +442 -5
- package/plugins/Editing.js +497 -9
- package/plugins/FeatureForm.js +366 -4
- package/plugins/FeatureSearch.js +458 -3
- package/plugins/GeometryDigitizer.js +664 -7
- package/plugins/HeightProfile.js +763 -15
- package/plugins/Help.js +102 -3
- package/plugins/HomeButton.js +80 -3
- package/plugins/Identify.js +543 -5
- package/plugins/LayerCatalog.js +215 -4
- package/plugins/LayerTree.js +1194 -6
- package/plugins/LocateButton.js +94 -3
- package/plugins/Map.js +320 -16
- package/plugins/MapCompare.js +94 -3
- package/plugins/MapCopyright.js +127 -5
- package/plugins/MapExport.js +613 -20
- package/plugins/MapFilter.js +868 -12
- package/plugins/MapInfoTooltip.js +277 -3
- package/plugins/MapLegend.js +253 -4
- package/plugins/MapTip.js +290 -4
- package/plugins/Measure.js +220 -4
- package/plugins/NewsPopup.js +137 -3
- package/plugins/OverviewMap.js +167 -7
- package/plugins/Panoramax.js +340 -2
- package/plugins/Portal.js +199 -4
- package/plugins/Print.js +1231 -15
- package/plugins/Redlining.js +750 -6
- package/plugins/Reports.js +332 -3
- package/plugins/Routing.js +1278 -15
- package/plugins/ScratchDrawing.js +173 -5
- package/plugins/Settings.js +241 -4
- package/plugins/Share.js +198 -3
- package/plugins/StartupMarker.js +84 -4
- package/plugins/TaskButton.js +88 -3
- package/plugins/ThemeSwitcher.js +164 -4
- package/plugins/TimeManager.js +971 -10
- package/plugins/TopBar.js +300 -7
- package/plugins/TourGuide.js +213 -2
- package/plugins/ValueTool.js +419 -4
- package/plugins/View3D.js +519 -14
- package/plugins/ZoomButtons.js +165 -3
- package/plugins/map/EditingSupport.js +199 -7
- package/plugins/map/LocateSupport.js +260 -4
- package/plugins/map/MeasurementSupport.js +216 -8
- package/plugins/map/RedliningPickSupport.js +201 -7
- package/plugins/map/RedliningSupport.js +726 -17
- package/plugins/map/SnapInteraction.js +101 -1
- package/plugins/map/SnapSupport.js +210 -2
- package/plugins/map/SnappingSupport.js +356 -17
- package/plugins/map3d/BackgroundSwitcher3D.js +44 -3
- package/plugins/map3d/BottomBar3D.js +118 -3
- package/plugins/map3d/Compare3D.js +422 -8
- package/plugins/map3d/Draw3D.js +353 -6
- package/plugins/map3d/ExportObjects3D.js +393 -18
- package/plugins/map3d/HideObjects3D.js +313 -12
- package/plugins/map3d/Identify3D.js +283 -12
- package/plugins/map3d/LayerTree3D.js +323 -3
- package/plugins/map3d/MapCopyright3D.js +128 -5
- package/plugins/map3d/MapExport3D.js +590 -10
- package/plugins/map3d/MapLight3D.js +553 -6
- package/plugins/map3d/Measure3D.js +571 -20
- package/plugins/map3d/OverviewMap3D.js +169 -3
- package/plugins/map3d/Settings3D.js +73 -3
- package/plugins/map3d/TopBar3D.js +207 -9
- package/plugins/redlining/RedliningBufferSupport.js +206 -3
- package/reducers/display.js +34 -2
- package/reducers/editing.js +68 -3
- package/reducers/index.js +9 -1
- package/reducers/layerinfo.js +26 -2
- package/reducers/layers.js +456 -9
- package/reducers/localConfig.js +122 -2
- package/reducers/locale.js +38 -2
- package/reducers/locate.js +40 -2
- package/reducers/map.js +176 -5
- package/reducers/measurement.js +42 -2
- package/reducers/processNotifications.js +49 -2
- package/reducers/redlining.js +50 -2
- package/reducers/redliningPick.js +27 -2
- package/reducers/search.js +20 -1
- package/reducers/serviceinfo.js +25 -2
- package/reducers/task.js +45 -2
- package/reducers/theme.js +51 -2
- package/reducers/windows.js +203 -2
- package/scripts/dist.sh +1 -1
- package/scripts/gen-plugin-docs.js +152 -2
- package/scripts/makeIconkit.js +85 -6
- package/scripts/themesConfig.js +742 -40
- package/scripts/updateTranslations.js +251 -10
- package/selectors/searchproviders.js +44 -2
- package/stores/StandardStore.js +42 -2
- package/utils/ConfigUtils.js +84 -3
- package/utils/CoordinatesUtils.js +234 -23
- package/utils/DxfUtils.js +237 -11
- package/utils/EditingInterface.js +421 -87
- package/utils/EditingUtils.js +357 -13
- package/utils/ElevationInterface.js +83 -22
- package/utils/FeatureStyles.js +429 -5
- package/utils/IdentifyUtils.js +443 -7
- package/utils/ImageEditor.js +79 -9
- package/utils/LayerUtils.js +1516 -50
- package/utils/LocaleUtils.js +117 -7
- package/utils/MapUtils.js +241 -59
- package/utils/MeasureUtils.js +323 -2
- package/utils/MiscUtils.js +189 -11
- package/utils/PermaLinkUtils.js +429 -6
- package/utils/PluginStore.js +27 -1
- package/utils/ResourceRegistry.js +15 -1
- package/utils/RoutingInterface.js +307 -7
- package/utils/SearchProviders.js +722 -19
- package/utils/ServiceLayerUtils.js +669 -14
- package/utils/Signal.js +32 -2
- package/utils/ThemeUtils.js +341 -7
- package/utils/VectorLayerUtils.js +589 -15
- package/utils/expr_grammar/grammar.js +2239 -2
- 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?
|
|
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
|
-
*/
|
|
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
|
-
*/
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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);
|