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.
Files changed (91) hide show
  1. package/actions/localConfig.js +1 -1
  2. package/components/MessageBar.js +7 -0
  3. package/components/PluginsContainer.js +3 -2
  4. package/components/SideBar.js +3 -3
  5. package/components/StandardApp.js +2 -2
  6. package/components/TaskBar.js +2 -2
  7. package/components/map/OlMap.js +2 -2
  8. package/components/map3d/ImportObjects3D.js +1 -1
  9. package/components/map3d/Map3D.js +6 -6
  10. package/components/map3d/MapControls3D.js +2 -2
  11. package/components/map3d/SearchField3D.js +3 -3
  12. package/components/map3d/drawtool/NumericInput3D.js +3 -3
  13. package/components/map3d/layers/VectorLayer3D.js +1 -1
  14. package/components/map3d/style/MapControls3D.css +9 -16
  15. package/components/map3d/utils/MiscUtils3D.js +7 -2
  16. package/components/map3d/utils/OrbitControls3D.js +1 -4
  17. package/components/map3d/utils/Tiles3DStyle.js +4 -4
  18. package/components/style/AppMenu.css +2 -3
  19. package/components/style/IdentifyViewer.css +0 -6
  20. package/components/style/{TaskBar.css → MessageBar.css} +4 -4
  21. package/components/style/PluginsContainer.css +1 -1
  22. package/components/style/SearchBox.css +1 -2
  23. package/components/style/SideBar.css +11 -9
  24. package/components/style/WindowManager.css +0 -5
  25. package/icons/above_terr.svg +81 -0
  26. package/icons/above_zero.svg +80 -0
  27. package/package.json +1 -1
  28. package/plugins/API.js +1 -1
  29. package/plugins/AttributeTable.js +3 -3
  30. package/plugins/LayerTree.js +2 -2
  31. package/plugins/Map.js +4 -3
  32. package/plugins/MapCompare.js +1 -1
  33. package/plugins/MapCopyright.js +1 -1
  34. package/plugins/TourGuide.js +3 -1
  35. package/plugins/View3D.js +26 -20
  36. package/plugins/map/LocateSupport.js +3 -5
  37. package/plugins/map/style/LocateSupport.css +33 -0
  38. package/plugins/map3d/BackgroundSwitcher3D.js +1 -1
  39. package/plugins/map3d/BottomBar3D.js +3 -1
  40. package/plugins/map3d/Compare3D.js +4 -2
  41. package/plugins/map3d/Draw3D.js +4 -2
  42. package/plugins/map3d/ExportObjects3D.js +13 -12
  43. package/plugins/map3d/HideObjects3D.js +12 -8
  44. package/plugins/map3d/Identify3D.js +12 -7
  45. package/plugins/map3d/LayerTree3D.js +3 -1
  46. package/plugins/map3d/MapCopyright3D.js +11 -0
  47. package/plugins/map3d/MapExport3D.js +4 -2
  48. package/plugins/map3d/MapLight3D.js +11 -0
  49. package/plugins/map3d/Measure3D.js +4 -2
  50. package/plugins/map3d/OverviewMap3D.js +2 -2
  51. package/plugins/map3d/Settings3D.js +3 -1
  52. package/plugins/map3d/TopBar3D.js +9 -1
  53. package/plugins/style/Bookmark.css +1 -3
  54. package/plugins/style/Editing.css +1 -3
  55. package/plugins/style/FeatureSearch.css +1 -8
  56. package/plugins/style/LayerTree.css +3 -11
  57. package/plugins/style/MapCopyright.css +3 -3
  58. package/plugins/style/Portal.css +1 -1
  59. package/plugins/style/View3D.css +0 -4
  60. package/reducers/localConfig.js +1 -1
  61. package/scripts/gen-plugin-docs.js +2 -2
  62. package/selectors/searchproviders.js +3 -7
  63. package/static/translations/bg-BG.json +2 -0
  64. package/static/translations/ca-ES.json +2 -0
  65. package/static/translations/cs-CZ.json +2 -0
  66. package/static/translations/de-CH.json +3 -1
  67. package/static/translations/de-DE.json +3 -1
  68. package/static/translations/en-US.json +3 -1
  69. package/static/translations/es-ES.json +2 -0
  70. package/static/translations/fi-FI.json +2 -0
  71. package/static/translations/fr-FR.json +3 -1
  72. package/static/translations/hu-HU.json +2 -0
  73. package/static/translations/it-IT.json +3 -1
  74. package/static/translations/ja-JP.json +2 -0
  75. package/static/translations/nl-NL.json +2 -0
  76. package/static/translations/no-NO.json +2 -0
  77. package/static/translations/pl-PL.json +2 -0
  78. package/static/translations/pt-BR.json +2 -0
  79. package/static/translations/pt-PT.json +2 -0
  80. package/static/translations/ro-RO.json +2 -0
  81. package/static/translations/ru-RU.json +2 -0
  82. package/static/translations/sv-SE.json +2 -0
  83. package/static/translations/tr-TR.json +2 -0
  84. package/static/translations/tsconfig.json +2 -0
  85. package/static/translations/uk-UA.json +2 -0
  86. package/utils/SearchProviders.js +8 -3
  87. package/components/map/OlLocate.css +0 -56
  88. package/components/map/OlLocate.js +0 -17
  89. package/components/map3d/Map3DLight.js +0 -11
  90. package/plugins/style/AttributeTable.css +0 -6
  91. /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";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,"availableIn3D",true);_defineProperty(BottomBar3D,"propTypes",{sceneContext:PropTypes.object,setBottombarHeight:PropTypes.func});export default connect(function(){return{}},{setBottombarHeight:setBottombarHeight})(BottomBar3D);
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()}})}}])}(React.Component);_defineProperty(Compare3D,"availableIn3D",true);_defineProperty(Compare3D,"propTypes",{active:PropTypes.bool,sceneContext:PropTypes.object});export default connect(function(state){return{active:state.task.id==="Compare3D"}},{})(Compare3D);
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);
@@ -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";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
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,"availableIn3D",true);_defineProperty(Draw3D,"propTypes",{sceneContext:PropTypes.object});export{Draw3D as default};
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";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
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 batchidAttr=c.geometry.getAttribute("_batchid");if(!batchidAttr){// Not a tile
12
- 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 batches={};batchidAttr.array.forEach(function(batchId,idx){var _batches$batchId$posi,_batches$batchId$norm;if(!batches[batchId]){batches[batchId]={position:[],normal:[],color:colAttr?[]:null,colorStride:colStride,bbox:new Box3}}var pos=posAttr.array.slice(3*idx,3*idx+3);(_batches$batchId$posi=batches[batchId].position).push.apply(_batches$batchId$posi,_toConsumableArray(pos));var nor=norAttr.array.slice(3*idx,3*idx+3);(_batches$batchId$norm=batches[batchId].normal).push.apply(_batches$batchId$norm,_toConsumableArray(nor));if(colAttr){var _batches$batchId$colo;var col=colAttr.array.slice(colStride*idx,colStride*idx+colStride);(_batches$batchId$colo=batches[batchId].color).push.apply(_batches$batchId$colo,_toConsumableArray(col))}batches[batchId].bbox.expandByPoint(_construct(Vector3,_toConsumableArray(pos)).applyMatrix4(c.matrixWorld))});Object.entries(batches).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),batchId=_ref6[0],batch=_ref6[1];if(selectionBox.intersectsBox(batch.bbox)&&_this.bboxInExportPolygon(batch.bbox)){var _batchTableObject$use;// Get batch table object
13
- var batchTableObject=c;while(!batchTableObject.batchTable){batchTableObject=batchTableObject.parent}// Express coordinates wrt center of batch object bbox
14
- var prevPosition=new Vector3;c.matrixWorld.decompose(prevPosition,new Quaternion,new Vector3);var newPosition=new Vector3;batch.bbox.getCenter(newPosition);var offset=new Vector3().subVectors(newPosition,prevPosition);for(var i=0;i<batch.position.length/3;++i){batch.position[3*i+0]-=offset.x;batch.position[3*i+1]-=offset.y;batch.position[3*i+2]-=offset.z}// Construct mesh
15
- var material=new MeshStandardMaterial({color:16777215});var geometry=new BufferGeometry;geometry.setAttribute("position",new Float32BufferAttribute(batch.position,3));geometry.setAttribute("normal",new Float32BufferAttribute(batch.normal,3));if(batch.color){var _material$color;// geometry.setAttribute('color', new Float32BufferAttribute(batch.color, batch.colorStride));
16
- // material.vertexColors = batch.color !== null;
17
- // material.transparent = batch.colorStride === 4;
18
- (_material$color=material.color).set.apply(_material$color,_toConsumableArray(batch.color.slice(0,3)))}var mesh=new Mesh(geometry,material);mesh.applyMatrix4(c.matrixWorld.clone().multiply(new Matrix4().makeTranslation(offset)));// Include attribute from batch table
19
- var batchAttrs=batchTableObject.batchTable.getDataFromId(batchId);Object.assign(mesh.userData,batchAttrs);// Add label
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,"availableIn3D",true);_defineProperty(ExportObjects3D,"propTypes",{sceneContext:PropTypes.object,setCurrentTask:PropTypes.func});export default connect(function(state){return{theme:state.theme.current}},{setCurrentTask:setCurrentTask})(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";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){return/*#__PURE__*/React.createElement("div",{key:entry.object.uuid+entry.batchId,onMouseEnter:function onMouseEnter(){return _this.showHighlight(entry)},onMouseLeave:function onMouseLeave(){return _this.hideHighlight(entry)}},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("hideobjects3d.object")),/*#__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
8
- 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.hideTilePick(picks[0])}else{_this.hideObjectPick(picks[0])}});_defineProperty(_this,"hideTilePick",function(pick){var _rootObject$userData$;var batchidAttr=pick.object.geometry.getAttribute("_batchid");var posAttr=pick.object.geometry.getAttribute("position");var norAttr=pick.object.geometry.getAttribute("normal");var pickBatchId=batchidAttr.getX(pick.face.a);// Extract/shift batch geometry
9
- var pickPosition=[];var pickNormal=[];batchidAttr.array.forEach(function(batchId,idx){if(batchId===pickBatchId){pickPosition.push.apply(pickPosition,_toConsumableArray(posAttr.array.slice(3*idx,3*idx+3)));pickNormal.push.apply(pickNormal,_toConsumableArray(norAttr.array.slice(3*idx,3*idx+3)));posAttr.array[3*idx+2]-=100000}});posAttr.needsUpdate=true;_this.props.sceneContext.scene.notifyChange();// Hide label
10
- var rootObject=pick.object;while(!rootObject.batchTable){rootObject=rootObject.parent}var pickLabel=(_rootObject$userData$=rootObject.userData.tileLabels)===null||_rootObject$userData$===void 0?void 0:_rootObject$userData$[pickBatchId];if(pickLabel){pickLabel.labelObject.visible=false}// Create highlight geometry
11
- _this.storeHiddenObject(pick,pickPosition,pickNormal,null,pickBatchId)});_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
12
- _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 batchId=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,batchId:batchId,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 _rootObject$userData$2;var batchidAttr=entry.object.geometry.getAttribute("_batchid");var posAttr=entry.object.geometry.getAttribute("position");// Unshift batch geometry
13
- batchidAttr.array.forEach(function(batchId,idx){if(batchId===entry.batchId){posAttr.array[3*idx+2]+=100000}});posAttr.needsUpdate=true;// Restore label
14
- var rootObject=entry.object;while(!rootObject.batchTable){rootObject=rootObject.parent}var pickLabel=(_rootObject$userData$2=rootObject.userData.tileLabels)===null||_rootObject$userData$2===void 0?void 0:_rootObject$userData$2[entry.batchId];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,"availableIn3D",true);_defineProperty(HideObjects3D,"propTypes",{enabled:PropTypes.bool,sceneContext:PropTypes.object});export default connect(function(state){return{enabled:state.task.id==="HideObjects3D"}},{})(HideObjects3D);
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 ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
1
+ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}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";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
8
- 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 batchidAttr=pick.object.geometry.getAttribute("_batchid");if(!batchidAttr){return}var posAttr=pick.object.geometry.getAttribute("position");var norAttr=pick.object.geometry.getAttribute("normal");var pickBatchId=batchidAttr.getX(pick.face.a);// Extract batch geometry
9
- var pickPosition=[];var pickNormal=[];batchidAttr.array.forEach(function(batchId,idx){if(batchId===pickBatchId){pickPosition.push.apply(pickPosition,_toConsumableArray(posAttr.array.slice(3*idx,3*idx+3)));pickNormal.push.apply(pickNormal,_toConsumableArray(norAttr.array.slice(3*idx,3*idx+3)))}});// Add selection object
10
- _this.addHiglightGeometry(pick.object.matrixWorld,pickPosition,pickNormal);// Extract attributes from batch table and set pick attrs
11
- var batchTableObject=pick.object;while(!batchTableObject.batchTable){batchTableObject=batchTableObject.parent}var batchTable=batchTableObject.batchTable;var batchAttrs=batchTable.getDataFromId(pickBatchId);if(_this.props.sceneContext.options.tileInfoServiceUrl){var url=_this.props.sceneContext.options.tileInfoServiceUrl.replace("{tileset}",batchTableObject.userData.tilesetName).replace("{objectid}",batchAttrs[batchTableObject.userData.batchIdAttr]);axios.get(url).then(function(response){_this.setState({pickAttrs:_objectSpread(_objectSpread({},batchAttrs),response.data)})})["catch"](function(){_this.setState({pickAttrs:batchAttrs})})}else{_this.setState({pickAttrs:batchAttrs})}});_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
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,"availableIn3D",true);_defineProperty(Identify3D,"propTypes",{identifyEnabled:PropTypes.bool,sceneContext:PropTypes.object});export default connect(function(state){return{identifyEnabled:state.task.identifyEnabled}},{})(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";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,{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,"availableIn3D",true);_defineProperty(LayerTree3D,"propTypes",{sceneContext:PropTypes.object,setCurrentTask:PropTypes.func});export default connect(function(state){return{}},{setCurrentTask:setCurrentTask})(LayerTree3D);
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";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 __
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,"availableIn3D",true);_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);
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);