qwc2 2025.8.14 → 2025.8.21
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/localConfig.js +1 -1
- package/components/MessageBar.js +7 -0
- package/components/PluginsContainer.js +3 -2
- package/components/SideBar.js +3 -3
- package/components/StandardApp.js +2 -2
- package/components/TaskBar.js +2 -2
- package/components/map/OlMap.js +2 -2
- package/components/map3d/ImportObjects3D.js +1 -1
- package/components/map3d/Map3D.js +6 -6
- package/components/map3d/MapControls3D.js +2 -2
- package/components/map3d/SearchField3D.js +3 -3
- package/components/map3d/drawtool/NumericInput3D.js +3 -3
- package/components/map3d/layers/VectorLayer3D.js +1 -1
- package/components/map3d/style/MapControls3D.css +9 -16
- package/components/map3d/utils/MiscUtils3D.js +7 -2
- package/components/map3d/utils/OrbitControls3D.js +1 -4
- package/components/map3d/utils/Tiles3DStyle.js +4 -4
- package/components/style/AppMenu.css +2 -3
- package/components/style/IdentifyViewer.css +0 -6
- package/components/style/{TaskBar.css → MessageBar.css} +4 -4
- package/components/style/PluginsContainer.css +1 -1
- package/components/style/SearchBox.css +1 -2
- package/components/style/SideBar.css +11 -9
- package/components/style/WindowManager.css +0 -5
- package/icons/above_terr.svg +81 -0
- package/icons/above_zero.svg +80 -0
- package/package.json +1 -1
- package/plugins/API.js +1 -1
- package/plugins/AttributeTable.js +3 -3
- package/plugins/LayerTree.js +2 -2
- package/plugins/Map.js +4 -3
- package/plugins/MapCompare.js +1 -1
- package/plugins/MapCopyright.js +1 -1
- package/plugins/TourGuide.js +3 -1
- package/plugins/View3D.js +26 -20
- package/plugins/map/LocateSupport.js +3 -5
- package/plugins/map/style/LocateSupport.css +33 -0
- package/plugins/map3d/BackgroundSwitcher3D.js +1 -1
- package/plugins/map3d/BottomBar3D.js +3 -1
- package/plugins/map3d/Compare3D.js +4 -2
- package/plugins/map3d/Draw3D.js +4 -2
- package/plugins/map3d/ExportObjects3D.js +13 -12
- package/plugins/map3d/HideObjects3D.js +12 -8
- package/plugins/map3d/Identify3D.js +12 -7
- package/plugins/map3d/LayerTree3D.js +3 -1
- package/plugins/map3d/MapCopyright3D.js +11 -0
- package/plugins/map3d/MapExport3D.js +4 -2
- package/plugins/map3d/MapLight3D.js +11 -0
- package/plugins/map3d/Measure3D.js +4 -2
- package/plugins/map3d/OverviewMap3D.js +2 -2
- package/plugins/map3d/Settings3D.js +3 -1
- package/plugins/map3d/TopBar3D.js +9 -1
- package/plugins/style/Bookmark.css +1 -3
- package/plugins/style/Editing.css +1 -3
- package/plugins/style/FeatureSearch.css +1 -8
- package/plugins/style/LayerTree.css +3 -11
- package/plugins/style/MapCopyright.css +3 -3
- package/plugins/style/Portal.css +1 -1
- package/plugins/style/View3D.css +0 -4
- package/reducers/localConfig.js +1 -1
- package/scripts/gen-plugin-docs.js +2 -2
- package/selectors/searchproviders.js +3 -7
- package/static/translations/bg-BG.json +2 -0
- package/static/translations/ca-ES.json +2 -0
- package/static/translations/cs-CZ.json +2 -0
- package/static/translations/de-CH.json +3 -1
- package/static/translations/de-DE.json +3 -1
- package/static/translations/en-US.json +3 -1
- package/static/translations/es-ES.json +2 -0
- package/static/translations/fi-FI.json +2 -0
- package/static/translations/fr-FR.json +3 -1
- package/static/translations/hu-HU.json +2 -0
- package/static/translations/it-IT.json +3 -1
- package/static/translations/ja-JP.json +2 -0
- package/static/translations/nl-NL.json +2 -0
- package/static/translations/no-NO.json +2 -0
- package/static/translations/pl-PL.json +2 -0
- package/static/translations/pt-BR.json +2 -0
- package/static/translations/pt-PT.json +2 -0
- package/static/translations/ro-RO.json +2 -0
- package/static/translations/ru-RU.json +2 -0
- package/static/translations/sv-SE.json +2 -0
- package/static/translations/tr-TR.json +2 -0
- package/static/translations/tsconfig.json +2 -0
- package/static/translations/uk-UA.json +2 -0
- package/utils/SearchProviders.js +8 -3
- package/components/map/OlLocate.css +0 -56
- package/components/map/OlLocate.js +0 -17
- package/components/map3d/Map3DLight.js +0 -11
- package/plugins/style/AttributeTable.css +0 -6
- /package/{components/map3d/style/Map3DLight.css → plugins/map3d/style/MapLight3D.css} +0 -0
|
@@ -4,4 +4,6 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* 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{setBottombarHeight}from"../../actions/windows";import CoordinatesUtils from"../../utils/CoordinatesUtils";import"./style/BottomBar3D.css"
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{setBottombarHeight}from"../../actions/windows";import CoordinatesUtils from"../../utils/CoordinatesUtils";import"./style/BottomBar3D.css";/**
|
|
8
|
+
* Bottom bar of the 3D map, displaying coordinates, projection, etc.
|
|
9
|
+
*/var BottomBar3D=/*#__PURE__*/function(_React$Component){function BottomBar3D(){var _this;_classCallCheck(this,BottomBar3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,BottomBar3D,[].concat(args));_defineProperty(_this,"state",{cursorPosition:null,progress:0});_defineProperty(_this,"scheduleGetCursorPosition",function(ev){var rect=ev.currentTarget.getBoundingClientRect();var x=(ev.clientX-rect.left)/rect.width*2-1;var y=-(ev.clientY-rect.top)/rect.height*2+1;clearTimeout(_this.cursorPositionTimeout);_this.cursorPositionTimeout=setTimeout(function(){return _this.getCursorPosition(x,y)},150)});_defineProperty(_this,"getCursorPosition",function(x,y){var intersection=_this.props.sceneContext.getSceneIntersection(x,y);if(intersection){var p=intersection.point;_this.setState({cursorPosition:[p.x,p.y,p.z]})}});_defineProperty(_this,"storeHeight",function(el){if(el){_this.props.setBottombarHeight(el.clientHeight)}});return _this}_inherits(BottomBar3D,_React$Component);return _createClass(BottomBar3D,[{key:"componentDidMount",value:function componentDidMount(){var _this2=this;this.props.sceneContext.scene.viewport.addEventListener("mousemove",this.scheduleGetCursorPosition);this.props.sceneContext.scene.addEventListener("update-end",function(){_this2.setState({progress:Math.round(_this2.props.sceneContext.scene.progress*100)+"%"})})}},{key:"componentWillUnmount",value:function componentWillUnmount(){clearTimeout(this.cursorPositionTimeout)}},{key:"render",value:function render(){return/*#__PURE__*/React.createElement("div",{className:"map3d-bottombar",ref:this.storeHeight},/*#__PURE__*/React.createElement("div",{className:"map3d-bottombar-progress"},/*#__PURE__*/React.createElement("div",{className:"map3d-bottombar-progressbar",style:{width:this.state.progress}}),/*#__PURE__*/React.createElement("div",{className:"map3d-bottombar-progress-label"},this.state.progress)),/*#__PURE__*/React.createElement("div",{className:"map3d-bottombar-spacer"}),/*#__PURE__*/React.createElement("div",{className:"map3d-bottombar-position"},(this.state.cursorPosition||[]).map(function(x){return x.toFixed(0)}).join(" ")),/*#__PURE__*/React.createElement("div",{className:"map3d-bottombar-projection"},this.props.sceneContext.mapCrs?CoordinatesUtils.getAvailableCRS()[this.props.sceneContext.mapCrs].label:""),/*#__PURE__*/React.createElement("div",{className:"map3d-bottombar-spacer"}))}}])}(React.Component);_defineProperty(BottomBar3D,"propTypes",{sceneContext:PropTypes.object,setBottombarHeight:PropTypes.func});export default connect(function(){return{}},{setBottombarHeight:setBottombarHeight})(BottomBar3D);
|
|
@@ -4,9 +4,11 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* 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 Icon from"../../components/Icon";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";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
|
|
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";/**
|
|
8
|
+
* 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
|
|
8
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
|
|
9
11
|
object.material.depthWrite=false;// Prevents modifying depth buffer
|
|
10
12
|
}});gltf.scene.renderOrder=9999999;// Ensures it is rendered last
|
|
11
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
|
|
12
|
-
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",title:LocaleUtils.tr("appmenu.items.Compare3D"),width:"20em"},function(){return{body:_this3.renderBody()}})}
|
|
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);
|
package/plugins/map3d/Draw3D.js
CHANGED
|
@@ -4,7 +4,9 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import PropTypes from"prop-types";import{Group}from"three";import{v4 as uuidv4}from"uuid";import Icon from"../../components/Icon";import TaskBar from"../../components/TaskBar";import CreateTool3D from"../../components/map3d/drawtool/CreateTool3D";import EditTool3D from"../../components/map3d/drawtool/EditTool3D";import ButtonBar from"../../components/widgets/ButtonBar";import LocaleUtils from"../../utils/LocaleUtils"
|
|
7
|
+
*/import React from"react";import PropTypes from"prop-types";import{Group}from"three";import{v4 as uuidv4}from"uuid";import Icon from"../../components/Icon";import TaskBar from"../../components/TaskBar";import CreateTool3D from"../../components/map3d/drawtool/CreateTool3D";import EditTool3D from"../../components/map3d/drawtool/EditTool3D";import ButtonBar from"../../components/widgets/ButtonBar";import LocaleUtils from"../../utils/LocaleUtils";/**
|
|
8
|
+
* Draw objects in the 3D map.
|
|
9
|
+
*/var Draw3D=/*#__PURE__*/function(_React$Component){function Draw3D(){var _this;_classCallCheck(this,Draw3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Draw3D,[].concat(args));_defineProperty(_this,"state",{action:null,baseSize:10,color:[255,105,0,1],geomType:null,drawGroupId:"",selectedObject:null});_defineProperty(_this,"onShow",function(){_this.ensureDrawGroup();_this.setState({action:"Pick"})});_defineProperty(_this,"onHide",function(){// Remove empty draw groups
|
|
8
10
|
Object.entries(_this.props.sceneContext.sceneObjects).filter(function(_ref){var _ref2=_slicedToArray(_ref,2),objectId=_ref2[0],options=_ref2[1];return options.drawGroup===true}).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),objectId=_ref4[0],options=_ref4[1];var object=_this.props.sceneContext.getSceneObject(objectId);if(object.children.length===0){_this.props.sceneContext.removeSceneObject(objectId)}});_this.setState({selectedObject:null})});_defineProperty(_this,"ensureDrawGroup",function(){// Ensure a draw group is present
|
|
9
11
|
var drawGroup=Object.entries(_this.props.sceneContext.sceneObjects).find(function(_ref5){var _ref6=_slicedToArray(_ref5,2),key=_ref6[0],options=_ref6[1];return options.drawGroup===true});if(drawGroup===undefined){_this.addDrawGroup(LocaleUtils.tr("draw3d.drawings"))}else{_this.props.sceneContext.updateSceneObject(drawGroup[0],{visibility:true});_this.setState({drawGroupId:drawGroup[0]})}});_defineProperty(_this,"createDrawGroup",function(){var message=LocaleUtils.tr("draw3d.newgroupprompt");// eslint-disable-next-line
|
|
10
|
-
var name=prompt(message);if(name){_this.addDrawGroup(name)}});_defineProperty(_this,"addDrawGroup",function(name){var objectId=uuidv4();var options={drawGroup:true,layertree:true,title:name};_this.props.sceneContext.addSceneObject(objectId,new Group,options);_this.setState({drawGroupId:objectId})});_defineProperty(_this,"renderBody",function(){var activeButton=_this.state.action==="Create"?_this.state.geomType:_this.state.action;var drawButtons=[{key:"Cuboid",tooltip:LocaleUtils.tr("draw3d.cuboid"),icon:"cuboid",data:{action:"Create",geomType:"Cuboid"}},{key:"Wedge",tooltip:LocaleUtils.tr("draw3d.wedge"),icon:"wedge",data:{action:"Create",geomType:"Wedge"}},{key:"Cylinder",tooltip:LocaleUtils.tr("draw3d.cylinder"),icon:"cylinder",data:{action:"Create",geomType:"Cylinder"}},[{key:"Pyramid",tooltip:LocaleUtils.tr("draw3d.pyramid"),icon:"pyramid",data:{action:"Create",geomType:"Pyramid"}},{key:"Sphere",tooltip:LocaleUtils.tr("draw3d.sphere"),icon:"sphere",data:{action:"Create",geomType:"Sphere"}},{key:"Cone",tooltip:LocaleUtils.tr("draw3d.cone"),icon:"cone",data:{action:"Create",geomType:"Cone"}}]];var editButtons=[{key:"Pick",tooltip:LocaleUtils.tr("draw3d.pick"),icon:"nodetool",data:{action:"Pick",geomType:null}},{key:"Delete",tooltip:LocaleUtils.tr("draw3d.delete"),icon:"trash",data:{action:"Delete",geomType:null},disabled:!_this.state.selectedObject}];var drawGroups=Object.entries(_this.props.sceneContext.sceneObjects).filter(function(_ref7){var _ref8=_slicedToArray(_ref7,2),key=_ref8[0],entry=_ref8[1];return entry.drawGroup===true});return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"redlining-controlsbar"},/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.layer")),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setActiveDrawGroup(ev.target.value)},value:_this.state.drawGroupId},drawGroups.map(function(_ref9){var _ref10=_slicedToArray(_ref9,2),objectId=_ref10[0],options=_ref10[1];return/*#__PURE__*/React.createElement("option",{key:objectId,value:objectId},options.title)})),/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.createDrawGroup},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})))),/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.draw")),/*#__PURE__*/React.createElement(ButtonBar,{active:activeButton,buttons:drawButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}})),/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.edit")),/*#__PURE__*/React.createElement(ButtonBar,{active:activeButton,buttons:editButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}}))),_this.renderControl())});_defineProperty(_this,"renderControl",function(){if(_this.state.action==="Create"){return/*#__PURE__*/React.createElement(CreateTool3D,{baseSize:_this.state.baseSize,baseSizeChanged:function baseSizeChanged(baseSize){return _this.setState({baseSize:baseSize})},color:_this.state.color,colorChanged:function colorChanged(color){return _this.setState({color:color})},drawGroupId:_this.state.drawGroupId,geomType:_this.state.geomType,objectCreated:_this.objectCreated,sceneContext:_this.props.sceneContext})}else if(_this.state.action==="Pick"){return/*#__PURE__*/React.createElement(EditTool3D,{color:_this.state.color,colorChanged:function colorChanged(color){return _this.setState({color:color})},drawGroupId:_this.state.drawGroupId,objectPicked:_this.objectPicked,sceneContext:_this.props.sceneContext,selectedObject:_this.state.selectedObject})}return null});_defineProperty(_this,"setActiveDrawGroup",function(drawGroupId){_this.props.sceneContext.updateSceneObject(drawGroupId,{visibility:true});_this.setState({drawGroupId:drawGroupId,selectedObject:null})});_defineProperty(_this,"actionChanged",function(data){if(data.action==="Delete"){_this.deleteSelectedObject()}else{_this.setState({action:data.action,geomType:data.geomType,selectedObject:null})}});_defineProperty(_this,"deleteSelectedObject",function(){var group=_this.props.sceneContext.getSceneObject(_this.state.drawGroupId);var parent=null;group.traverse(function(c){if(c===_this.state.selectedObject){parent=c.parent}});if(parent){parent.remove(_this.state.selectedObject);while(parent.parent&&!parent.isMesh&&parent.children.length===0&&parent!==group){var grandparent=parent.parent;grandparent.remove(parent);parent=grandparent}if(group.children.length===0){_this.props.sceneContext.removeSceneObject(_this.state.drawGroupId,function(){_this.ensureDrawGroup()})}_this.setState({action:"Pick",geomType:null,selectedObject:null});_this.props.sceneContext.scene.notifyChange()}});_defineProperty(_this,"objectCreated",function(object){_this.setState({action:"Pick",geomType:null,selectedObject:object})});_defineProperty(_this,"objectPicked",function(object){_this.setState({selectedObject:object})});return _this}_inherits(Draw3D,_React$Component);return _createClass(Draw3D,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(TaskBar,{onHide:this.onHide,onShow:this.onShow,task:"Draw3D"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(Draw3D,"
|
|
12
|
+
var name=prompt(message);if(name){_this.addDrawGroup(name)}});_defineProperty(_this,"addDrawGroup",function(name){var objectId=uuidv4();var options={drawGroup:true,layertree:true,title:name};_this.props.sceneContext.addSceneObject(objectId,new Group,options);_this.setState({drawGroupId:objectId})});_defineProperty(_this,"renderBody",function(){var activeButton=_this.state.action==="Create"?_this.state.geomType:_this.state.action;var drawButtons=[{key:"Cuboid",tooltip:LocaleUtils.tr("draw3d.cuboid"),icon:"cuboid",data:{action:"Create",geomType:"Cuboid"}},{key:"Wedge",tooltip:LocaleUtils.tr("draw3d.wedge"),icon:"wedge",data:{action:"Create",geomType:"Wedge"}},{key:"Cylinder",tooltip:LocaleUtils.tr("draw3d.cylinder"),icon:"cylinder",data:{action:"Create",geomType:"Cylinder"}},[{key:"Pyramid",tooltip:LocaleUtils.tr("draw3d.pyramid"),icon:"pyramid",data:{action:"Create",geomType:"Pyramid"}},{key:"Sphere",tooltip:LocaleUtils.tr("draw3d.sphere"),icon:"sphere",data:{action:"Create",geomType:"Sphere"}},{key:"Cone",tooltip:LocaleUtils.tr("draw3d.cone"),icon:"cone",data:{action:"Create",geomType:"Cone"}}]];var editButtons=[{key:"Pick",tooltip:LocaleUtils.tr("draw3d.pick"),icon:"nodetool",data:{action:"Pick",geomType:null}},{key:"Delete",tooltip:LocaleUtils.tr("draw3d.delete"),icon:"trash",data:{action:"Delete",geomType:null},disabled:!_this.state.selectedObject}];var drawGroups=Object.entries(_this.props.sceneContext.sceneObjects).filter(function(_ref7){var _ref8=_slicedToArray(_ref7,2),key=_ref8[0],entry=_ref8[1];return entry.drawGroup===true});return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"redlining-controlsbar"},/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.layer")),/*#__PURE__*/React.createElement("div",{className:"controlgroup"},/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setActiveDrawGroup(ev.target.value)},value:_this.state.drawGroupId},drawGroups.map(function(_ref9){var _ref10=_slicedToArray(_ref9,2),objectId=_ref10[0],options=_ref10[1];return/*#__PURE__*/React.createElement("option",{key:objectId,value:objectId},options.title)})),/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.createDrawGroup},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})))),/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.draw")),/*#__PURE__*/React.createElement(ButtonBar,{active:activeButton,buttons:drawButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}})),/*#__PURE__*/React.createElement("div",{className:"redlining-groupcontrol"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.edit")),/*#__PURE__*/React.createElement(ButtonBar,{active:activeButton,buttons:editButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}}))),_this.renderControl())});_defineProperty(_this,"renderControl",function(){if(_this.state.action==="Create"){return/*#__PURE__*/React.createElement(CreateTool3D,{baseSize:_this.state.baseSize,baseSizeChanged:function baseSizeChanged(baseSize){return _this.setState({baseSize:baseSize})},color:_this.state.color,colorChanged:function colorChanged(color){return _this.setState({color:color})},drawGroupId:_this.state.drawGroupId,geomType:_this.state.geomType,objectCreated:_this.objectCreated,sceneContext:_this.props.sceneContext})}else if(_this.state.action==="Pick"){return/*#__PURE__*/React.createElement(EditTool3D,{color:_this.state.color,colorChanged:function colorChanged(color){return _this.setState({color:color})},drawGroupId:_this.state.drawGroupId,objectPicked:_this.objectPicked,sceneContext:_this.props.sceneContext,selectedObject:_this.state.selectedObject})}return null});_defineProperty(_this,"setActiveDrawGroup",function(drawGroupId){_this.props.sceneContext.updateSceneObject(drawGroupId,{visibility:true});_this.setState({drawGroupId:drawGroupId,selectedObject:null})});_defineProperty(_this,"actionChanged",function(data){if(data.action==="Delete"){_this.deleteSelectedObject()}else{_this.setState({action:data.action,geomType:data.geomType,selectedObject:null})}});_defineProperty(_this,"deleteSelectedObject",function(){var group=_this.props.sceneContext.getSceneObject(_this.state.drawGroupId);var parent=null;group.traverse(function(c){if(c===_this.state.selectedObject){parent=c.parent}});if(parent){parent.remove(_this.state.selectedObject);while(parent.parent&&!parent.isMesh&&parent.children.length===0&&parent!==group){var grandparent=parent.parent;grandparent.remove(parent);parent=grandparent}if(group.children.length===0){_this.props.sceneContext.removeSceneObject(_this.state.drawGroupId,function(){_this.ensureDrawGroup()})}_this.setState({action:"Pick",geomType:null,selectedObject:null});_this.props.sceneContext.scene.notifyChange()}});_defineProperty(_this,"objectCreated",function(object){_this.setState({action:"Pick",geomType:null,selectedObject:object})});_defineProperty(_this,"objectPicked",function(object){_this.setState({selectedObject:object})});return _this}_inherits(Draw3D,_React$Component);return _createClass(Draw3D,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(TaskBar,{onHide:this.onHide,onShow:this.onShow,task:"Draw3D"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(Draw3D,"propTypes",{sceneContext:PropTypes.object});export{Draw3D as default};
|
|
@@ -4,20 +4,21 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* 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 Spinner from"../../components/widgets/Spinner";import LocaleUtils from"../../utils/LocaleUtils";import VectorLayerUtils from"../../utils/VectorLayerUtils"
|
|
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";/**
|
|
8
|
+
* 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
|
|
8
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
|
|
9
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
|
|
10
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
|
|
11
|
-
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
|
|
12
|
-
|
|
13
|
-
var
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
// material.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
var
|
|
20
|
-
var labelEntry=(_batchTableObject$use=batchTableObject.userData.tileLabels)===null||_batchTableObject$use===void 0?void 0:_batchTableObject$use[batchId];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 _ref7=[box3.min.x,box3.min.y,box3.max.x,box3.max.y],xmin=_ref7[0],ymin=_ref7[1],xmax=_ref7[2],ymax=_ref7[3];function doLinesIntersect(p1,p2,p3,p4){// Helper function to check if two line segments (p1-p2 and p3-p4) intersect
|
|
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
|
|
21
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
|
|
22
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
|
|
23
|
-
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,"
|
|
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);
|
|
@@ -4,11 +4,15 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{BufferGeometry,Float32BufferAttribute,Mesh,MeshStandardMaterial,Raycaster,Vector2}from"three";import Icon from"../../components/Icon";import SideBar from"../../components/SideBar";import LocaleUtils from"../../utils/LocaleUtils";import"./style/HideObjects3D.css"
|
|
8
|
-
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
var
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{BufferAttribute,BufferGeometry,Float32BufferAttribute,Mesh,MeshStandardMaterial,Raycaster,Vector2}from"three";import Icon from"../../components/Icon";import SideBar from"../../components/SideBar";import{TileMeshHelper}from"../../components/map3d/utils/MiscUtils3D";import LocaleUtils from"../../utils/LocaleUtils";import"./style/HideObjects3D.css";/**
|
|
8
|
+
* Hide objects in the 3D map.
|
|
9
|
+
*/var HideObjects3D=/*#__PURE__*/function(_React$Component){function HideObjects3D(){var _this;_classCallCheck(this,HideObjects3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,HideObjects3D,[].concat(args));_defineProperty(_this,"state",{hiddenObjects:[]});_defineProperty(_this,"renderBody",function(){return/*#__PURE__*/React.createElement("div",{className:"hideobjects3d-body"},isEmpty(_this.state.hiddenObjects)?/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("hideobjects3d.clickonmap")):/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"hideobjects3d-list"},_this.state.hiddenObjects.map(function(entry){var _ref;return/*#__PURE__*/React.createElement("div",{key:entry.object.uuid+entry.featureId,onMouseEnter:function onMouseEnter(){return _this.showHighlight(entry)},onMouseLeave:function onMouseLeave(){return _this.hideHighlight(entry)}},/*#__PURE__*/React.createElement("span",null,(_ref=LocaleUtils.tr("hideobjects3d.object")+" "+entry.featureId)!==null&&_ref!==void 0?_ref:""),/*#__PURE__*/React.createElement(Icon,{icon:"eye",onClick:function onClick(){return _this.restoreObject(entry)},title:LocaleUtils.tr("hideobjects3d.restore")}))})),/*#__PURE__*/React.createElement("div",{className:"hideobjects3d-restorebutton"},/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.restoreAll},LocaleUtils.tr("hideobjects3d.restoreall")))))});_defineProperty(_this,"clear",function(){_this.setState({pickAttrs:null});_this.props.sceneContext.removeSceneObject("__identify3d_highlight")});_defineProperty(_this,"pickOnRelease",function(ev){if(ev.button!==0){return}ev.view.addEventListener("pointerup",_this.pick,{once:true});ev.view.addEventListener("pointermove",function(){ev.view.removeEventListener("pointerup",_this.pick)},{once:true})});_defineProperty(_this,"pick",function(ev){if(_this.props.enabled!==true){return}_this.clear();// Setup raycaster
|
|
10
|
+
var raycaster=new Raycaster;raycaster.firstHitOnly=true;var camera=_this.props.sceneContext.scene.view.camera;var rect=ev.target.getBoundingClientRect();var x=(ev.clientX-rect.left)/rect.width*2-1;var y=-((ev.clientY-rect.top)/rect.height)*2+1;raycaster.setFromCamera(new Vector2(x,y),camera);var picks=[];Object.entries(_this.props.sceneContext.sceneObjects).forEach(function(_ref2){var _object$tiles;var _ref3=_slicedToArray(_ref2,2),objId=_ref3[0],options=_ref3[1];if(!options.layertree||!options.visibility){return}var object=_this.props.sceneContext.getSceneObject(objId);if((_object$tiles=object.tiles)!==null&&_object$tiles!==void 0&&_object$tiles.raycast){var intersections=[];object.tiles.raycast(raycaster,intersections);intersections.forEach(function(entry){entry.isTilePick=true});picks.push.apply(picks,intersections)}else{picks.push.apply(picks,_toConsumableArray(raycaster.intersectObjects([object],true)))}});picks.sort(function(a,b){return a.distance-b.distance});if(isEmpty(picks)){return}else if(picks[0].isTilePick){_this.hideTilePick(picks[0])}else{_this.hideObjectPick(picks[0])}});_defineProperty(_this,"hideTilePick",function(pick){var _helper$getTileUserDa;var posAttr=pick.object.geometry.getAttribute("position");var norAttr=pick.object.geometry.getAttribute("normal");// Ensure geometry is indexed
|
|
11
|
+
if(!pick.object.geometry.index){var indices=new Uint32Array(posAttr.count);for(var i=0;i<posAttr.count;i++){indices[i]=i}pick.object.geometry.setIndex(new BufferAttribute(indices,1))}if(!pick.object.userData.originalIndex){pick.object.userData.originalIndex=pick.object.geometry.index.array.slice();pick.object.userData.hiddenIds=[]}var helper=new TileMeshHelper(pick.object);var pickFeatureId=helper.getFeatureId(pick.face);// Extract feature geometry
|
|
12
|
+
var pickPosition=[];var pickNormal=[];helper.forEachFeatureTriangle(pickFeatureId,function(i0,i1,i2){pickPosition.push(posAttr.getX(i0),posAttr.getY(i0),posAttr.getZ(i0));pickPosition.push(posAttr.getX(i1),posAttr.getY(i1),posAttr.getZ(i1));pickPosition.push(posAttr.getX(i2),posAttr.getY(i2),posAttr.getZ(i2));pickNormal.push(norAttr.getX(i0),norAttr.getY(i0),norAttr.getZ(i0));pickNormal.push(norAttr.getX(i1),norAttr.getY(i1),norAttr.getZ(i1));pickNormal.push(norAttr.getX(i2),norAttr.getY(i2),norAttr.getZ(i2))});// Filter indices
|
|
13
|
+
var filteredIndices=pick.object.geometry.index.array.filter(function(idx){return helper.featureIdAttr.getX(idx)!==pickFeatureId});pick.object.geometry.setIndex(new BufferAttribute(new Uint32Array(filteredIndices),1));// Hide label
|
|
14
|
+
var pickLabel=(_helper$getTileUserDa=helper.getTileUserData().tileLabels)===null||_helper$getTileUserDa===void 0?void 0:_helper$getTileUserDa[pickFeatureId];if(pickLabel){pickLabel.labelObject.visible=false}_this.props.sceneContext.scene.notifyChange();// Store hidden object metadata
|
|
15
|
+
_this.storeHiddenObject(pick,pickPosition,pickNormal,null,pickFeatureId)});_defineProperty(_this,"hideObjectPick",function(pick){pick.object.visible=false;_this.props.sceneContext.scene.notifyChange();var posAttr=pick.object.geometry.getAttribute("position");var norAttr=pick.object.geometry.getAttribute("normal");var index=pick.object.geometry.getIndex();// Create highlight geometry
|
|
16
|
+
_this.storeHiddenObject(pick,posAttr.array,norAttr.array,index)});_defineProperty(_this,"storeHiddenObject",function(pick,position,normal){var index=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var featureId=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;var material=new MeshStandardMaterial({color:16711680});var geometry=new BufferGeometry;geometry.setAttribute("position",new Float32BufferAttribute(position,3));geometry.setAttribute("normal",new Float32BufferAttribute(normal,3));geometry.setIndex(index);var mesh=new Mesh(geometry,material);mesh.receiveShadow=true;mesh.applyMatrix4(pick.object.matrixWorld);mesh.updateMatrixWorld();_this.setState(function(state){return{hiddenObjects:[].concat(_toConsumableArray(state.hiddenObjects),[{object:pick.object,isTileObject:pick.isTilePick,featureId:featureId,highlight:mesh}])}})});_defineProperty(_this,"showHighlight",function(entry){_this.props.sceneContext.addSceneObject(entry.highlight.uuid,entry.highlight)});_defineProperty(_this,"hideHighlight",function(entry){_this.props.sceneContext.removeSceneObject(entry.highlight.uuid)});_defineProperty(_this,"restoreObject",function(entry){if(entry.isTileObject){var _helper$getTileUserDa2;var helper=new TileMeshHelper(entry.object);// Re-add filtered indices
|
|
17
|
+
var filteredIndices=entry.object.userData.originalIndex.filter(function(i){return helper.featureIdAttr.getX(i)===entry.featureId});var combined=new Uint32Array(entry.object.geometry.index.array.length+filteredIndices.length);combined.set(entry.object.geometry.index.array,0);combined.set(new Uint32Array(filteredIndices),entry.object.geometry.index.array.length);entry.object.geometry.setIndex(new BufferAttribute(combined,1));// Restore label
|
|
18
|
+
var pickLabel=(_helper$getTileUserDa2=helper.getTileUserData().tileLabels)===null||_helper$getTileUserDa2===void 0?void 0:_helper$getTileUserDa2[entry.featureId];if(pickLabel){pickLabel.labelObject.visible=true}}else{entry.object.visible=true}_this.hideHighlight(entry);_this.props.sceneContext.scene.notifyChange();_this.setState(function(state){return{hiddenObjects:state.hiddenObjects.filter(function(x){return x!==entry})}})});_defineProperty(_this,"restoreAll",function(){_toConsumableArray(_this.state.hiddenObjects).forEach(_this.restoreObject)});return _this}_inherits(HideObjects3D,_React$Component);return _createClass(HideObjects3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.sceneContext.scene.viewport.addEventListener("pointerdown",this.pickOnRelease)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _prevProps$sceneConte;if(this.props.sceneContext.scene!==((_prevProps$sceneConte=prevProps.sceneContext)===null||_prevProps$sceneConte===void 0?void 0:_prevProps$sceneConte.scene)){this.setState({hiddenObjects:[]})}}},{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{icon:"eye",id:"HideObjects3D",title:LocaleUtils.tr("appmenu.items.HideObjects3D"),width:"20em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(HideObjects3D,"propTypes",{enabled:PropTypes.bool,sceneContext:PropTypes.object});export default connect(function(state){return{enabled:state.task.id==="HideObjects3D"}},{})(HideObjects3D);
|
|
@@ -1,13 +1,18 @@
|
|
|
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
|
|
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 _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)}/**
|
|
2
2
|
* Copyright 2024 Sourcepole AG
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{BufferGeometry,Float32BufferAttribute,Mesh,MeshStandardMaterial,Raycaster,Vector2}from"three";import ResizeableWindow from"../../components/ResizeableWindow";import LocaleUtils from"../../utils/LocaleUtils";import"../../components/style/IdentifyViewer.css"
|
|
8
|
-
|
|
9
|
-
var
|
|
10
|
-
_this.
|
|
11
|
-
var
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{BufferGeometry,Float32BufferAttribute,Mesh,MeshStandardMaterial,Raycaster,Vector2}from"three";import ResizeableWindow from"../../components/ResizeableWindow";import{TileMeshHelper}from"../../components/map3d/utils/MiscUtils3D";import LocaleUtils from"../../utils/LocaleUtils";import"../../components/style/IdentifyViewer.css";/**
|
|
8
|
+
* Query attributes of objects in the 3D map.
|
|
9
|
+
*/var Identify3D=/*#__PURE__*/function(_React$Component){function Identify3D(){var _this;_classCallCheck(this,Identify3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Identify3D,[].concat(args));_defineProperty(_this,"state",{pickAttrs:null});_defineProperty(_this,"clear",function(){_this.setState({pickAttrs:null});_this.props.sceneContext.removeSceneObject("__identify3d_highlight")});_defineProperty(_this,"identifyOnRelease",function(ev){if(ev.button!==0){return}ev.view.addEventListener("pointerup",_this.identify,{once:true});ev.view.addEventListener("pointermove",function(){ev.view.removeEventListener("pointerup",_this.identify)},{once:true})});_defineProperty(_this,"identify",function(ev){if(_this.props.identifyEnabled!==true){return}_this.clear();// Setup raycaster
|
|
10
|
+
var raycaster=new Raycaster;raycaster.firstHitOnly=true;var camera=_this.props.sceneContext.scene.view.camera;var rect=ev.target.getBoundingClientRect();var x=(ev.clientX-rect.left)/rect.width*2-1;var y=-((ev.clientY-rect.top)/rect.height)*2+1;raycaster.setFromCamera(new Vector2(x,y),camera);var picks=[];Object.entries(_this.props.sceneContext.sceneObjects).forEach(function(_ref){var _object$tiles;var _ref2=_slicedToArray(_ref,2),objId=_ref2[0],options=_ref2[1];if(!options.layertree||!options.visibility){return}var object=_this.props.sceneContext.getSceneObject(objId);if((_object$tiles=object.tiles)!==null&&_object$tiles!==void 0&&_object$tiles.raycast){var intersections=[];object.tiles.raycast(raycaster,intersections);intersections.forEach(function(entry){entry.isTilePick=true});picks.push.apply(picks,intersections)}else{picks.push.apply(picks,_toConsumableArray(raycaster.intersectObjects([object],true)))}});picks.sort(function(a,b){return a.distance-b.distance});if(isEmpty(picks)){return}else if(picks[0].isTilePick){_this.identifyTilePick(picks[0])}else{_this.identifyObjectPick(picks[0])}});_defineProperty(_this,"identifyTilePick",function(pick){var posAttr=pick.object.geometry.getAttribute("position");var norAttr=pick.object.geometry.getAttribute("normal");var helper=new TileMeshHelper(pick.object);if(!helper.isValid()){return}var pickFeatureId=helper.getFeatureId(pick.face);var featureAttrs=helper.getFeatureProperties(pickFeatureId);// Extract feature geometry
|
|
11
|
+
var pickPosition=[];var pickNormal=[];helper.forEachFeatureTriangle(pickFeatureId,function(i0,i1,i2){pickPosition.push(posAttr.getX(i0),posAttr.getY(i0),posAttr.getZ(i0));pickPosition.push(posAttr.getX(i1),posAttr.getY(i1),posAttr.getZ(i1));pickPosition.push(posAttr.getX(i2),posAttr.getY(i2),posAttr.getZ(i2));pickNormal.push(norAttr.getX(i0),norAttr.getY(i0),norAttr.getZ(i0));pickNormal.push(norAttr.getX(i1),norAttr.getY(i1),norAttr.getZ(i1));pickNormal.push(norAttr.getX(i2),norAttr.getY(i2),norAttr.getZ(i2))});// Add selection object
|
|
12
|
+
_this.addHiglightGeometry(pick.object.matrixWorld,pickPosition,pickNormal);// Gather extra attributes
|
|
13
|
+
if(_this.props.tileInfoServiceUrl){var _helper$getTileUserDa=helper.getTileUserData(),tilesetName=_helper$getTileUserDa.tilesetName,featureIdAttr=_helper$getTileUserDa.featureIdAttr;var url=_this.props.tileInfoServiceUrl.replace("{tileset}",tilesetName).replace("{objectid}",featureAttrs[featureIdAttr]);axios.get(url).then(function(response){response.data.forEach(function(attr){if(attr.name in featureAttrs&&featureAttrs[attr.name]===attr.value){// Use attribute alias
|
|
14
|
+
delete featureAttrs[attr.name]}featureAttrs[attr.alias]=attr.value});_this.setState({pickAttrs:featureAttrs})})["catch"](function(){_this.setState({pickAttrs:featureAttrs})})}else{_this.setState({pickAttrs:featureAttrs})}});_defineProperty(_this,"identifyObjectPick",function(pick){var posAttr=pick.object.geometry.getAttribute("position");var norAttr=pick.object.geometry.getAttribute("normal");var index=pick.object.geometry.getIndex();// Add selection object
|
|
12
15
|
_this.addHiglightGeometry(pick.object.matrixWorld,posAttr.array,norAttr.array,index);// Set pick attrs
|
|
13
|
-
_this.setState({pickAttrs:pick.object.userData})});_defineProperty(_this,"addHiglightGeometry",function(matrixWorld,position,normal){var index=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var material=new MeshStandardMaterial({color:16711680});var geometry=new BufferGeometry;geometry.setAttribute("position",new Float32BufferAttribute(position,3));geometry.setAttribute("normal",new Float32BufferAttribute(normal,3));geometry.setIndex(index);var mesh=new Mesh(geometry,material);mesh.applyMatrix4(matrixWorld);mesh.updateMatrixWorld();mesh.receiveShadow=true;_this.props.sceneContext.addSceneObject("__identify3d_highlight",mesh)});return _this}_inherits(Identify3D,_React$Component);return _createClass(Identify3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.sceneContext.scene.viewport.addEventListener("pointerdown",this.identifyOnRelease)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(!this.props.identifyEnabled&&prevProps.identifyEnabled){this.clear()}}},{key:"render",value:function render(){if(this.state.pickAttrs===null){return null}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:"left",icon:"info-sign",initialHeight:320,initialWidth:240,initialX:0,initialY:0,initiallyDocked:true,onClose:this.clear,title:LocaleUtils.tr("identify.title")},/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},isEmpty(this.state.pickAttrs)?/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.noattributes"))):/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},/*#__PURE__*/React.createElement("table",{className:"attribute-list"},/*#__PURE__*/React.createElement("tbody",null,Object.entries(this.state.pickAttrs).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],value=_ref4[1];return/*#__PURE__*/React.createElement("tr",{key:key},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title"},/*#__PURE__*/React.createElement("i",null,key)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},value))}))))))}}])}(React.Component);_defineProperty(Identify3D,"
|
|
16
|
+
_this.setState({pickAttrs:pick.object.userData})});_defineProperty(_this,"addHiglightGeometry",function(matrixWorld,position,normal){var index=arguments.length>3&&arguments[3]!==undefined?arguments[3]:null;var material=new MeshStandardMaterial({color:16711680});var geometry=new BufferGeometry;geometry.setAttribute("position",new Float32BufferAttribute(position,3));geometry.setAttribute("normal",new Float32BufferAttribute(normal,3));geometry.setIndex(index);var mesh=new Mesh(geometry,material);mesh.applyMatrix4(matrixWorld);mesh.updateMatrixWorld();mesh.receiveShadow=true;_this.props.sceneContext.addSceneObject("__identify3d_highlight",mesh)});return _this}_inherits(Identify3D,_React$Component);return _createClass(Identify3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.sceneContext.scene.viewport.addEventListener("pointerdown",this.identifyOnRelease)}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(!this.props.identifyEnabled&&prevProps.identifyEnabled){this.clear()}}},{key:"render",value:function render(){if(this.state.pickAttrs===null){return null}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:"left",icon:"info-sign",initialHeight:320,initialWidth:240,initialX:0,initialY:0,initiallyDocked:true,onClose:this.clear,title:LocaleUtils.tr("identify.title")},/*#__PURE__*/React.createElement("div",{className:"identify-body",role:"body"},isEmpty(this.state.pickAttrs)?/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("i",null,LocaleUtils.tr("identify.noattributes"))):/*#__PURE__*/React.createElement("div",{className:"identify-result-box"},/*#__PURE__*/React.createElement("table",{className:"attribute-list"},/*#__PURE__*/React.createElement("tbody",null,Object.entries(this.state.pickAttrs).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],value=_ref4[1];return/*#__PURE__*/React.createElement("tr",{key:key},/*#__PURE__*/React.createElement("td",{className:"identify-attr-title"},/*#__PURE__*/React.createElement("i",null,key)),/*#__PURE__*/React.createElement("td",{className:"identify-attr-value"},value.toString()))}))))))}}])}(React.Component);_defineProperty(Identify3D,"propTypes",{identifyEnabled:PropTypes.bool,sceneContext:PropTypes.object,/** URL to service for querying additional tile information.
|
|
17
|
+
* Can contain the `{tileset}` and `{objectid}` placeholders.
|
|
18
|
+
* Expected to return a JSON dict with attributes.*/tileInfoServiceUrl:PropTypes.string});export default connect(function(state){return{identifyEnabled:state.task.identifyEnabled}},{})(Identify3D);
|
|
@@ -4,4 +4,6 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import classNames from"classnames";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{setCurrentTask}from"../../actions/task";import Icon from"../../components/Icon";import SideBar from"../../components/SideBar";import ImportObjects3D from"../../components/map3d/ImportObjects3D";import NumberInput from"../../components/widgets/NumberInput";import LocaleUtils from"../../utils/LocaleUtils";import"./style/LayerTree3D.css"
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import classNames from"classnames";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{setCurrentTask}from"../../actions/task";import Icon from"../../components/Icon";import SideBar from"../../components/SideBar";import ImportObjects3D from"../../components/map3d/ImportObjects3D";import NumberInput from"../../components/widgets/NumberInput";import LocaleUtils from"../../utils/LocaleUtils";import"./style/LayerTree3D.css";/**
|
|
8
|
+
* Layer and object tree for the 3D map
|
|
9
|
+
*/var LayerTree3D=/*#__PURE__*/function(_React$Component){function LayerTree3D(){var _this;_classCallCheck(this,LayerTree3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,LayerTree3D,[].concat(args));_defineProperty(_this,"state",{activestylemenu:null,activemenu:null,importvisible:false});_defineProperty(_this,"renderBody",function(){var sceneContext=_this.props.sceneContext;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"layertree3d-layers"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.objects")),Object.entries(sceneContext.sceneObjects).map(function(_ref){var _ref2=_slicedToArray(_ref,2),objectId=_ref2[0],entry=_ref2[1];return _this.renderLayerEntry(objectId,entry,sceneContext.updateSceneObject,true)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-section"},LocaleUtils.tr("layertree3d.layers")),Object.entries(sceneContext.colorLayers).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],entry=_ref4[1];return _this.renderLayerEntry(layerId,entry,sceneContext.updateColorLayer,false)}),/*#__PURE__*/React.createElement("div",{className:"layertree3d-option",onClick:function onClick(){return _this.setState(function(state){return{importvisible:!state.importvisible}})}},/*#__PURE__*/React.createElement(Icon,{icon:_this.state.importvisible?"collapse":"expand"})," ",LocaleUtils.tr("layertree3d.importobjects"))),_this.state.importvisible?/*#__PURE__*/React.createElement(ImportObjects3D,{importedTilesBaseUrl:_this.props.importedTilesBaseUrl,sceneContext:_this.props.sceneContext}):null)});_defineProperty(_this,"renderLayerEntry",function(entryId,entry,updateCallback,isObject){var _entry$title,_entry$title2;if(entry.layertree===false){return null}var classes=classNames({"layertree3d-item":true,"layertree3d-item-disabled":!entry.visibility});var styleMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activestylemenu===entryId});var optMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activemenu===entryId});return/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-container",key:entryId},/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-checkbox",icon:entry.visibility?"checked":"unchecked",onClick:function onClick(){return updateCallback(entryId,{visibility:!entry.visibility})}}),/*#__PURE__*/React.createElement("span",{className:"layertree3d-item-title",title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:entryId},(_entry$title2=entry.title)!==null&&_entry$title2!==void 0?_entry$title2:entryId),Object.keys(entry.styles||{}).length>1?/*#__PURE__*/React.createElement(Icon,{className:styleMenuClasses,icon:"paint",onClick:function onClick(){return _this.layerStyleMenuToggled(entryId)}}):null,entry.drawGroup||entry.imported?/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-remove",icon:"trash",onClick:function onClick(){return _this.props.sceneContext.removeSceneObject(entryId)}}):null,/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(entryId)}})),_this.state.activemenu===entryId?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},isObject?/*#__PURE__*/React.createElement(Icon,{icon:"zoom",onClick:function onClick(){return _this.props.sceneContext.zoomToObject(entryId)},title:LocaleUtils.tr("layertree3d.zoomtoobject")}):null,entry.imported?/*#__PURE__*/React.createElement(Icon,{icon:"draw",onClick:function onClick(){return _this.editObject(entryId)}}):null,/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}),/*#__PURE__*/React.createElement("input",{className:"layertree3d-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return updateCallback(entryId,{opacity:parseInt(ev.target.value,10)})},step:"1",type:"range",value:entry.opacity})),entry.extrusionHeight!==undefined?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},/*#__PURE__*/React.createElement("span",null,"Extrude:"),/*#__PURE__*/React.createElement(React.Fragment,null,"\xA0"),/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return updateCallback(entryId,{extrusionHeight:ev.target.value==="__value"?0:ev.target.value})},value:typeof entry.extrusionHeight==="string"?entry.extrusionHeight:"__value"},/*#__PURE__*/React.createElement("option",{value:"__value"},LocaleUtils.tr("layertree3d.customheight")),(entry.fields||[]).map(function(field){return/*#__PURE__*/React.createElement("option",{key:field,value:field},field)})),typeof entry.extrusionHeight!=="string"?/*#__PURE__*/React.createElement(NumberInput,{max:500,min:0,onChange:function onChange(h){return updateCallback(entryId,{extrusionHeight:h})},value:entry.extrusionHeight}):null):null):null,_this.state.activestylemenu===entryId?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-stylemenu"},Object.keys(entry.styles).map(function(name){return/*#__PURE__*/React.createElement("div",{key:name,onClick:function onClick(){return updateCallback(entryId,{style:name})}},/*#__PURE__*/React.createElement(Icon,{icon:entry.style===name?"radio_checked":"radio_unchecked"}),/*#__PURE__*/React.createElement("div",null,name))})):null,!isEmpty(entry.sublayers)?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-sublayers"},entry.sublayers.map(function(sublayer,idx){return _this.renderSublayer(sublayer,entryId,updateCallback,[idx],entry.visibility)})):null)});_defineProperty(_this,"renderSublayer",function(sublayer,entryId,updateCallback,path,parentVisible){var key=entryId+":"+path.join(":");var classes=classNames({"layertree3d-item":true,"layertree3d-item-disabled":!parentVisible||!sublayer.visibility});var optMenuClasses=classNames({"layertree3d-item-menubutton":true,"layertree3d-item-menubutton-active":_this.state.activemenu===key});return/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-container",key:key},/*#__PURE__*/React.createElement("div",{className:classes},/*#__PURE__*/React.createElement(Icon,{className:"layertree3d-item-checkbox",icon:sublayer.visibility?"checked":"unchecked",onClick:function onClick(){return updateCallback(entryId,{visibility:!sublayer.visibility},path)},sublayer:"layertree3d-item-checkbox"}),/*#__PURE__*/React.createElement("span",{className:"layertree3d-item-title",title:sublayer.title},sublayer.title),/*#__PURE__*/React.createElement(Icon,{className:optMenuClasses,icon:"cog",onClick:function onClick(){return _this.layerMenuToggled(key)}})),_this.state.activemenu===key?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu"},/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-optionsmenu-row"},/*#__PURE__*/React.createElement(Icon,{icon:"transparency"}),/*#__PURE__*/React.createElement("input",{className:"layertree3d-item-transparency-slider",max:"255",min:"0",onChange:function onChange(ev){return updateCallback(entryId,{opacity:parseInt(ev.target.value,10)},path)},step:"1",type:"range",value:sublayer.opacity}))):null,!isEmpty(sublayer.sublayers)?/*#__PURE__*/React.createElement("div",{className:"layertree3d-item-sublayers"},sublayer.sublayers.map(function(child,idx){return _this.renderSublayer(child,entryId,updateCallback,[].concat(_toConsumableArray(path),[idx]),parentVisible&&sublayer.visibility)})):null)});_defineProperty(_this,"layerStyleMenuToggled",function(entryId){_this.setState(function(state){return{activestylemenu:state.activestylemenu===entryId?null:entryId}})});_defineProperty(_this,"layerMenuToggled",function(entryId){_this.setState(function(state){return{activemenu:state.activemenu===entryId?null:entryId}})});_defineProperty(_this,"editObject",function(objectId){_this.props.sceneContext.zoomToObject(objectId);_this.props.setCurrentTask("EditDataset3D",null,null,{objectId:objectId})});return _this}_inherits(LayerTree3D,_React$Component);return _createClass(LayerTree3D,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{icon:"layers",id:"LayerTree3D",title:LocaleUtils.tr("appmenu.items.LayerTree3D"),width:"20em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(LayerTree3D,"propTypes",{/** Base URL of imported tile sets. */importedTilesBaseUrl:PropTypes.string,sceneContext:PropTypes.object,setCurrentTask:PropTypes.func});_defineProperty(LayerTree3D,"defaultProps",{importedTilesBaseUrl:":/"});export default connect(function(state){return{}},{setCurrentTask:setCurrentTask})(LayerTree3D);
|
|
@@ -0,0 +1,11 @@
|
|
|
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 _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 _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 _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 _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 _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 _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 _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)}/**
|
|
2
|
+
* Copyright 2016-2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import ReactDOM from"react-dom";import DOMPurify from"dompurify";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{MapContainerPortalContext}from"../../components/PluginsContainer";import LocaleUtils from"../../utils/LocaleUtils";import"../style/MapCopyright.css";/**
|
|
8
|
+
* Displays layer attributions in the bottom right corner of the 3D map.
|
|
9
|
+
*/var MapCopyright3D=/*#__PURE__*/function(_React$Component){function MapCopyright3D(){var _this;_classCallCheck(this,MapCopyright3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,MapCopyright3D,[].concat(args));_defineProperty(_this,"state",{currentCopyrights:{}});_defineProperty(_this,"layerNames",function(layers){if(!_this.props.prefixCopyrightsWithLayerNames){return""}else{return layers.map(function(layer){return layer.titleMsgId?LocaleUtils.tr(layer.titleMsgId):layer.title}).join(", ")+": "}});return _this}_inherits(MapCopyright3D,_React$Component);return _createClass(MapCopyright3D,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.sceneContext.baseLayers!==prevProps.sceneContext.baseLayers||this.props.sceneContext.colorLayers!==prevProps.sceneContext.colorLayers){var layers=this.props.sceneContext.baseLayers.concat(this.props.sceneContext.colorLayers);var copyrights=layers.reduce(function(res,layer){if(layer.attribution&&layer.attribution.Title){var _res$key;var key=layer.attribution.OnlineResource||layer.attribution.Title;res[key]={title:layer.attribution.OnlineResource?layer.attribution.Title:null,layers:[].concat(_toConsumableArray(((_res$key=res[key])===null||_res$key===void 0?void 0:_res$key.layers)||[]),[layer])}}return res},{});this.setState({currentCopyrights:copyrights})}}},{key:"render",value:function render(){var _this2=this;// If attribution has both url and label, "key" is the url and "value.title" the label.
|
|
10
|
+
// If it only has a label, "key" is the label and "value" is null.
|
|
11
|
+
var copyrights=Object.entries(this.state.currentCopyrights).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];if(value.title){return/*#__PURE__*/React.createElement("span",{key:key},/*#__PURE__*/React.createElement("a",{href:key,rel:"noreferrer",target:"_blank"},_this2.layerNames(value.layers)+value.title))}else{return/*#__PURE__*/React.createElement("span",{key:key},_this2.layerNames(value.layers),/*#__PURE__*/React.createElement("span",{dangerouslySetInnerHTML:{__html:DOMPurify.sanitize(key)}}))}});if(isEmpty(copyrights)){return null}return/*#__PURE__*/ReactDOM.createPortal(/*#__PURE__*/React.createElement("div",{className:"MapCopyright MapCopyright3D"},copyrights),this.context)}}])}(React.Component);_defineProperty(MapCopyright3D,"contextType",MapContainerPortalContext);_defineProperty(MapCopyright3D,"propTypes",{/** Whether to prepend the layer name to the attribution string. */prefixCopyrightsWithLayerNames:PropTypes.bool,sceneContext:PropTypes.object,/** Whether to only display the attribution of the theme, omitting external layers. */showThemeCopyrightOnly:PropTypes.bool});export{MapCopyright3D as default};
|
|
@@ -4,11 +4,13 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
|
|
|
4
4
|
*
|
|
5
5
|
* This source code is licensed under the BSD-style license found in the
|
|
6
6
|
* LICENSE file in the root directory of this source tree.
|
|
7
|
-
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import FileSaver from"file-saver";import formDataEntries from"formdata-json";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{SRGBColorSpace,Vector2,WebGLRenderTarget}from"three";import utif from"utif";import{setCurrentTask}from"../../actions/task";import ExportSelection from"../../components/ExportSelection";import Icon from"../../components/Icon";import SideBar from"../../components/SideBar";import NumberInput from"../../components/widgets/NumberInput";import Spinner from"../../components/widgets/Spinner";import LocaleUtils from"../../utils/LocaleUtils";import MiscUtils from"../../utils/MiscUtils";import"../style/MapExport.css"
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import FileSaver from"file-saver";import formDataEntries from"formdata-json";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{SRGBColorSpace,Vector2,WebGLRenderTarget}from"three";import utif from"utif";import{setCurrentTask}from"../../actions/task";import ExportSelection from"../../components/ExportSelection";import Icon from"../../components/Icon";import SideBar from"../../components/SideBar";import NumberInput from"../../components/widgets/NumberInput";import Spinner from"../../components/widgets/Spinner";import LocaleUtils from"../../utils/LocaleUtils";import MiscUtils from"../../utils/MiscUtils";import"../style/MapExport.css";/**
|
|
8
|
+
* Export the 3D map image to raster formats.
|
|
9
|
+
*/var MapExport3D=/*#__PURE__*/function(_React$Component){function MapExport3D(){var _this;_classCallCheck(this,MapExport3D);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,MapExport3D,[].concat(args));_defineProperty(_this,"state",MapExport3D.defaultState);_defineProperty(_this,"onShow",function(){var _this$props$theme;var rect=_this.props.sceneContext.scene.domElement.getBoundingClientRect();var frame={x:0.125*rect.width,y:0.125*rect.height,width:0.75*rect.width,height:0.75*rect.height};if(!isEmpty((_this$props$theme=_this.props.theme)===null||_this$props$theme===void 0?void 0:_this$props$theme.print)){var _ref,_this$props$theme$pri,_this$props$theme$pri2,_this$props$theme$pri3;var layouts=_this.props.theme.print.filter(function(l){return l.map}).sort(function(a,b){return a.name.split("/").pop().localeCompare(b.name.split("/").pop(),undefined,{numeric:true})});var exportDpi=(_ref=(_this$props$theme$pri=(_this$props$theme$pri2=_this.props.theme.printResolutions)===null||_this$props$theme$pri2===void 0?void 0:_this$props$theme$pri2.find(function(x){return x===300}))!==null&&_this$props$theme$pri!==void 0?_this$props$theme$pri:(_this$props$theme$pri3=_this.props.theme.printResolutions)===null||_this$props$theme$pri3===void 0?void 0:_this$props$theme$pri3[0])!==null&&_ref!==void 0?_ref:300;_this.setState({layouts:layouts,exportDpi:exportDpi,frame:frame})}else{_this.setState({layouts:[],frame:frame})}});_defineProperty(_this,"onHide",function(){_this.setState(MapExport3D.defaultState)});_defineProperty(_this,"formatChanged",function(ev){var layout="";var frameRatio=null;if(ev.target.value==="application/pdf"){layout=_this.state.layouts.find(function(l){return l["default"]})||_this.state.layouts[0];frameRatio=layout.map.height/layout.map.width}_this.setState(function(state){return{selectedFormat:ev.target.value,layout:layout,frameRatio:frameRatio}})});_defineProperty(_this,"layoutChanged",function(ev){var layout=_this.props.theme.print.find(function(item){return item.name===ev.target.value});var frameRatio=layout.map.height/layout.map.width;_this.setState(function(state){return{layout:layout,frameRatio:frameRatio,height:Math.round(state.width*frameRatio)}})});_defineProperty(_this,"renderBody",function(){var _this$state$layout,_this$state$layout2,_this$state$layout3;var formatMap={"image/jpeg":"JPEG","image/png":"PNG","image/tiff":"TIFF","application/pdf":"PDF"};var exportDisabled=_this.state.exporting||_this.state.width===0||_this.state.selectedFormat==="application/pdf"&&!_this.state.layout;var mapName=((_this$state$layout=_this.state.layout)===null||_this$state$layout===void 0||(_this$state$layout=_this$state$layout.map)===null||_this$state$layout===void 0?void 0:_this$state$layout.name)||"";var resolutionChooser=null;if(_this.state.selectedFormat==="application/pdf"){if(!isEmpty(_this.props.theme.printResolutions)){resolutionChooser=/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({exportDpi:ev.target.value})},value:_this.state.exportDpi},_this.props.theme.printResolutions.map(function(res){return/*#__PURE__*/React.createElement("option",{disabled:isEmpty(_this.state.layouts),key:res,value:res},res," dpi")}))}else{resolutionChooser=/*#__PURE__*/React.createElement(NumberInput,{decimals:0,max:500,min:50,onChange:function onChange(val){return _this.setState({exportDpi:val})},suffix:" dpi",value:_this.state.exportDpi})}}else{resolutionChooser=/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({exportScaleFactor:ev.target.value})},value:_this.state.exportScaleFactor},[100,150,200,250,300,350,400,450,500].map(function(res){return/*#__PURE__*/React.createElement("option",{key:res,value:res},res,"%")}))}return/*#__PURE__*/React.createElement("div",{className:"mapexport-body"},/*#__PURE__*/React.createElement("form",{onSubmit:_this["export"]},/*#__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(_ref2){var _ref3=_slicedToArray(_ref2,2),format=_ref3[0],label=_ref3[1];return/*#__PURE__*/React.createElement("option",{key:format,value:format},label)})))),_this.state.selectedFormat==="application/pdf"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("print.layout")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.layoutChanged,value:_this.state.layout.name},_this.state.layouts.map(function(item){return/*#__PURE__*/React.createElement("option",{key:item.name,value:item.name},item.name.split("/").pop())})))):null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("mapexport.resolution")),/*#__PURE__*/React.createElement("td",null,resolutionChooser)),_this.state.selectedFormat==="application/pdf"?(((_this$state$layout2=_this.state.layout)===null||_this$state$layout2===void 0?void 0:_this$state$layout2.labels)||[]).map(function(label){var _this$props$theme$pri4;// Omit labels which start with __
|
|
8
10
|
if(label.startsWith("__")){return null}var opts=_objectSpread({rows:1,name:label.toUpperCase()},(_this$props$theme$pri4=_this.props.theme.printLabelConfig)===null||_this$props$theme$pri4===void 0?void 0:_this$props$theme$pri4[label]);return _this.renderPrintLabelField(label,opts)}):null)),_this.state.selectedFormat==="application/pdf"?/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("input",{name:"TEMPLATE",type:"hidden",value:((_this$state$layout3=_this.state.layout)===null||_this$state$layout3===void 0?void 0:_this$state$layout3.name)||""}),/*#__PURE__*/React.createElement("input",{name:"csrf_token",type:"hidden",value:MiscUtils.getCsrfToken()}),/*#__PURE__*/React.createElement("input",{name:mapName+":extent",readOnly:true,type:"hidden",value:"0,0,0,0"}),/*#__PURE__*/React.createElement("input",{name:"SERVICE",readOnly:true,type:"hidden",value:"WMS"}),/*#__PURE__*/React.createElement("input",{name:"VERSION",readOnly:true,type:"hidden",value:_this.props.theme.version}),/*#__PURE__*/React.createElement("input",{name:"REQUEST",readOnly:true,type:"hidden",value:"GetPrint"}),/*#__PURE__*/React.createElement("input",{name:"TRANSPARENT",readOnly:true,type:"hidden",value:"true"}),/*#__PURE__*/React.createElement("input",{name:"SRS",readOnly:true,type:"hidden",value:_this.props.theme.mapCrs}),/*#__PURE__*/React.createElement("input",{name:"LAYERS",readOnly:true,type:"hidden",value:""}),/*#__PURE__*/React.createElement("input",{name:mapName+":LAYERS",readOnly:true,type:"hidden",value:""})):null,/*#__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,"onFrameChanged",function(frame){var x=frame.x,y=frame.y,width=frame.width,height=frame.height;_this.setState({frame:{x:x,y:y,width:width,height:height}})});_defineProperty(_this,"takeScreenshot",function(scale,window){var renderer=_this.props.sceneContext.scene.renderer;var scene=_this.props.sceneContext.scene.scene;var camera=_this.props.sceneContext.scene.view.camera;var originalSize=renderer.getSize(new Vector2);var originalRenderTarget=renderer.getRenderTarget();var renderWidth=Math.round(originalSize.x*scale);var renderHeight=Math.round(originalSize.y*scale);var winX=Math.round(window.x*scale);var winY=Math.round(window.y*scale);var winWidth=Math.round(window.width*scale);var winHeight=Math.round(window.height*scale);// Render to high-resolution offscreen target
|
|
9
11
|
var renderTarget=new WebGLRenderTarget(renderWidth,renderHeight,{colorSpace:SRGBColorSpace});renderer.setSize(renderWidth,renderHeight);renderer.setPixelRatio(1);// important! avoid devicePixelRatio scaling
|
|
10
12
|
renderer.setRenderTarget(renderTarget);renderer.render(scene,camera);renderer.setRenderTarget(null);// Read the pixels from the render target and write to offscreen canvas
|
|
11
13
|
var readBuffer=new Uint8Array(renderWidth*renderHeight*4);renderer.readRenderTargetPixels(renderTarget,0,0,renderWidth,renderHeight,readBuffer);var canvas=document.createElement("canvas");canvas.width=winWidth;canvas.height=winHeight;var context=canvas.getContext("2d");var imageData=context.createImageData(winWidth,winHeight);for(var y=0;y<winHeight;y++){var srcRow=(winX+(renderHeight-1-winY-y)*renderWidth)*4;var destRow=y*winWidth*4;imageData.data.set(readBuffer.subarray(srcRow,srcRow+winWidth*4),destRow)}context.putImageData(imageData,0,0);// Restore original renderer target
|
|
12
14
|
renderer.setSize(originalSize.x,originalSize.y);renderer.setPixelRatio(window.devicePixelRatio);renderer.setRenderTarget(originalRenderTarget);renderer.render(scene,camera);return{canvas:canvas,imageData:imageData}});_defineProperty(_this,"export",function(ev){ev.preventDefault();if(!_this.state.frame||_this.state.frame.width<=0||_this.state.frame.height<=0){return}var form=ev.target;var exportScale=_this.state.exportScaleFactor/100;if(_this.state.selectedFormat==="application/pdf"){var mapWidthMM=_this.state.layout.map.width;var exportWidthPx=_this.state.width;exportScale=Math.min(5,_this.state.exportDpi/(exportWidthPx*25.4/mapWidthMM))}_this.setState({exporting:true});var _this$takeScreenshot=_this.takeScreenshot(exportScale,_this.state.frame),canvas=_this$takeScreenshot.canvas,context=_this$takeScreenshot.context;if(_this.state.selectedFormat==="application/pdf"){canvas.toBlob(function(blob){blob.arrayBuffer().then(function(imgBuffer){return _this.exportToPdf(form,imgBuffer)})},"image/png")}else if(_this.state.selectedFormat==="image/tiff"){var imageData=context.getImageData(0,0,canvas.width,canvas.height);var blob=new Blob([utif.encodeImage(imageData.data,canvas.width,canvas.height)],{type:"image/tiff"});FileSaver.saveAs(blob,"export."+_this.state.selectedFormat.replace(/.*\//,""));_this.setState({exporting:false})}else{canvas.toBlob(function(blob){FileSaver.saveAs(blob,"export."+_this.state.selectedFormat.replace(/.*\//,""));_this.setState({exporting:false})},_this.state.selectedFormat)}});_defineProperty(_this,"renderPrintLabelField",function(label,opts){var defaultValue=opts.defaultValue||"";var autopopulated=false;if(label===_this.props.theme.printLabelForSearchResult){defaultValue=_this.getSearchMarkerLabel();autopopulated=true}else if(label===_this.props.theme.printLabelForAttribution){defaultValue=_this.getAttributionLabel();autopopulated=true}if(autopopulated&&_this.props.hideAutopopulatedFields){return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("input",{defaultValue:defaultValue,name:opts.name,type:"hidden"})))}else{if(opts.options){return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",null,MiscUtils.capitalizeFirst(label)),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{defaultValue:defaultValue,name:opts.name},opts.options.map(function(value){return/*#__PURE__*/React.createElement("option",{key:value,value:value},value)}))))}else{var style={};if(opts.rows||opts.cols){style.resize="none"}if(opts.cols){style.width="initial"}return/*#__PURE__*/React.createElement("tr",{key:"label."+label},/*#__PURE__*/React.createElement("td",null,MiscUtils.capitalizeFirst(label)),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("textarea",_extends({},opts,{defaultValue:defaultValue,readOnly:autopopulated,style:style}))))}}});_defineProperty(_this,"getSearchMarkerLabel",function(){// TODO
|
|
13
15
|
return""});_defineProperty(_this,"getAttributionLabel",function(){// TODO
|
|
14
|
-
return""});return _this}_inherits(MapExport3D,_React$Component);return _createClass(MapExport3D,[{key:"render",value:function render(){var _this2=this;var minMaxTooltip=this.state.minimized?LocaleUtils.tr("print.maximize"):LocaleUtils.tr("print.minimize");var minMaxIcon=this.state.minimized?"chevron-down":"chevron-up";var extraTitlebarContent=/*#__PURE__*/React.createElement(Icon,{className:"mapexport-minimize-maximize",icon:minMaxIcon,onClick:function onClick(){return _this2.setState(function(state){return{minimized:!state.minimized}})},title:minMaxTooltip});return/*#__PURE__*/React.createElement(SideBar,{extraClasses:"MapExport",extraTitlebarContent:extraTitlebarContent,icon:"rasterexport",id:"MapExport3D",onShow:this.onShow,title:LocaleUtils.tr("appmenu.items.MapExport3D"),width:"20em"},function(){return{body:_this2.renderBody(),extra:/*#__PURE__*/React.createElement(ExportSelection,{frame:_this2.state.frame,frameRatio:_this2.state.frameRatio,mapElement:_this2.props.sceneContext.scene.domElement,onFrameChanged:_this2.onFrameChanged})}})}},{key:"exportToPdf",value:function(){var _exportToPdf=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(form,imgBuffer){var formData,data,config,response,_yield$import,PDFDocument,doc,page,pngImage,x,y,width,height,pdfData,blob;return _regeneratorRuntime().wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:formData=_objectSpread(_objectSpread({},formDataEntries(new FormData(form))),Object.fromEntries((this.props.theme.extraPrintParameters||"").split("&").filter(Boolean).map(function(entry){return entry.split("=")})));data=Object.entries(formData).map(function(pair){return pair.map(function(entry){return encodeURIComponent(entry).replace(/%20/g,"+")}).join("=")}).join("&");config={headers:{"Content-Type":"application/x-www-form-urlencoded"},responseType:"arraybuffer"};_context.next=5;return axios.post(this.props.theme.printUrl,data,config);case 5:response=_context.sent;if(!response){_context.next=31;break}_context.next=9;return import("pdf-lib");case 9:_yield$import=_context.sent;PDFDocument=_yield$import.PDFDocument;_context.next=13;return PDFDocument.load(response.data);case 13:doc=_context.sent;page=doc.getPages()[0];_context.next=17;return doc.embedPng(imgBuffer);case 17:pngImage=_context.sent;x=this.state.layout.map.x*2.8346;y=this.state.layout.map.y*2.8346;width=this.state.layout.map.width*2.8346;height=this.state.layout.map.height*2.8346;page.drawImage(pngImage,{x:x,y:y,width:width,height:height});_context.next=25;return doc.save();case 25:pdfData=_context.sent;blob=new Blob([pdfData],{type:"application/pdf"});FileSaver.saveAs(blob,this.state.layout.name+".pdf");this.setState({exporting:false});_context.next=33;break;case 31:/* eslint-disable-next-line */alert("Print failed");this.setState({exporting:false});case 33:case"end":return _context.stop()}},_callee,this)}));function exportToPdf(_x,_x2){return _exportToPdf.apply(this,arguments)}return exportToPdf}()}])}(React.Component);_defineProperty(MapExport3D,"
|
|
16
|
+
return""});return _this}_inherits(MapExport3D,_React$Component);return _createClass(MapExport3D,[{key:"render",value:function render(){var _this2=this;var minMaxTooltip=this.state.minimized?LocaleUtils.tr("print.maximize"):LocaleUtils.tr("print.minimize");var minMaxIcon=this.state.minimized?"chevron-down":"chevron-up";var extraTitlebarContent=/*#__PURE__*/React.createElement(Icon,{className:"mapexport-minimize-maximize",icon:minMaxIcon,onClick:function onClick(){return _this2.setState(function(state){return{minimized:!state.minimized}})},title:minMaxTooltip});return/*#__PURE__*/React.createElement(SideBar,{extraClasses:"MapExport",extraTitlebarContent:extraTitlebarContent,icon:"rasterexport",id:"MapExport3D",onShow:this.onShow,title:LocaleUtils.tr("appmenu.items.MapExport3D"),width:"20em"},function(){return{body:_this2.renderBody(),extra:/*#__PURE__*/React.createElement(ExportSelection,{frame:_this2.state.frame,frameRatio:_this2.state.frameRatio,mapElement:_this2.props.sceneContext.scene.domElement,onFrameChanged:_this2.onFrameChanged})}})}},{key:"exportToPdf",value:function(){var _exportToPdf=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(form,imgBuffer){var formData,data,config,response,_yield$import,PDFDocument,doc,page,pngImage,x,y,width,height,pdfData,blob;return _regeneratorRuntime().wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:formData=_objectSpread(_objectSpread({},formDataEntries(new FormData(form))),Object.fromEntries((this.props.theme.extraPrintParameters||"").split("&").filter(Boolean).map(function(entry){return entry.split("=")})));data=Object.entries(formData).map(function(pair){return pair.map(function(entry){return encodeURIComponent(entry).replace(/%20/g,"+")}).join("=")}).join("&");config={headers:{"Content-Type":"application/x-www-form-urlencoded"},responseType:"arraybuffer"};_context.next=5;return axios.post(this.props.theme.printUrl,data,config);case 5:response=_context.sent;if(!response){_context.next=31;break}_context.next=9;return import("pdf-lib");case 9:_yield$import=_context.sent;PDFDocument=_yield$import.PDFDocument;_context.next=13;return PDFDocument.load(response.data);case 13:doc=_context.sent;page=doc.getPages()[0];_context.next=17;return doc.embedPng(imgBuffer);case 17:pngImage=_context.sent;x=this.state.layout.map.x*2.8346;y=this.state.layout.map.y*2.8346;width=this.state.layout.map.width*2.8346;height=this.state.layout.map.height*2.8346;page.drawImage(pngImage,{x:x,y:y,width:width,height:height});_context.next=25;return doc.save();case 25:pdfData=_context.sent;blob=new Blob([pdfData],{type:"application/pdf"});FileSaver.saveAs(blob,this.state.layout.name+".pdf");this.setState({exporting:false});_context.next=33;break;case 31:/* eslint-disable-next-line */alert("Print failed");this.setState({exporting:false});case 33:case"end":return _context.stop()}},_callee,this)}));function exportToPdf(_x,_x2){return _exportToPdf.apply(this,arguments)}return exportToPdf}()}])}(React.Component);_defineProperty(MapExport3D,"propTypes",{hideAutopopulatedFields:PropTypes.bool,sceneContext:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object});_defineProperty(MapExport3D,"defaultState",{minimized:false,layouts:[],selectedFormat:"image/jpeg",layout:"",frame:null,frameRatio:null,exporting:false,exportScaleFactor:100,exportDpi:300});export default connect(function(state){return{theme:state.theme.current}},{setCurrentTask:setCurrentTask})(MapExport3D);
|