qwc2 2025.4.14 → 2025.4.22

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 (44) hide show
  1. package/components/AttributeTableWidget.js +1 -1
  2. package/components/AutoEditForm.js +1 -1
  3. package/components/EditUploadField.js +2 -2
  4. package/components/QtDesignerForm.js +1 -1
  5. package/components/WindowManager.js +1 -1
  6. package/components/map3d/ExportObjects3D.js +6 -3
  7. package/components/map3d/Identify3D.js +4 -4
  8. package/components/map3d/Map3D.js +9 -8
  9. package/components/map3d/Measure3D.js +7 -5
  10. package/components/map3d/style/Map3D.css +9 -0
  11. package/components/map3d/style/SearchField3D.css +4 -3
  12. package/components/map3d/utils/Tiles3DStyle.js +11 -1
  13. package/package.json +4 -3
  14. package/plugins/Bookmark.js +1 -1
  15. package/plugins/HeightProfile.js +9 -8
  16. package/plugins/MapInfoTooltip.js +5 -3
  17. package/plugins/View3D.js +29 -4
  18. package/reducers/layers.js +2 -1
  19. package/scripts/dist.sh +7 -1
  20. package/static/translations/bg-BG.json +1 -0
  21. package/static/translations/ca-ES.json +1 -0
  22. package/static/translations/cs-CZ.json +1 -0
  23. package/static/translations/de-CH.json +1 -0
  24. package/static/translations/de-DE.json +1 -0
  25. package/static/translations/en-US.json +1 -0
  26. package/static/translations/es-ES.json +1 -0
  27. package/static/translations/fi-FI.json +1 -0
  28. package/static/translations/fr-FR.json +1 -0
  29. package/static/translations/hu-HU.json +1 -0
  30. package/static/translations/it-IT.json +1 -0
  31. package/static/translations/ja-JP.json +1 -0
  32. package/static/translations/nl-NL.json +1 -0
  33. package/static/translations/no-NO.json +1 -0
  34. package/static/translations/pl-PL.json +1 -0
  35. package/static/translations/pt-BR.json +1 -0
  36. package/static/translations/pt-PT.json +1 -0
  37. package/static/translations/ro-RO.json +1 -0
  38. package/static/translations/ru-RU.json +1 -0
  39. package/static/translations/sv-SE.json +1 -0
  40. package/static/translations/tr-TR.json +1 -0
  41. package/static/translations/tsconfig.json +1 -0
  42. package/utils/EditingInterface.js +4 -1
  43. package/utils/ElevationInterface.js +25 -0
  44. package/utils/ServiceLayerUtils.js +2 -2
@@ -6,7 +6,7 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
6
6
  * LICENSE file in the root directory of this source tree.
7
7
  */import React from"react";import{connect}from"react-redux";import FileSaver from"file-saver";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{LayerRole,addLayerFeatures,removeLayer}from"../actions/layers";import{zoomToExtent,zoomToPoint}from"../actions/map";import{setCurrentTask,setCurrentTaskBlocked}from"../actions/task";import EditComboField,{KeyValCache}from"../components/EditComboField";import EditUploadField from"../components/EditUploadField";import Icon from"../components/Icon";import NavBar from"../components/widgets/NavBar";import NumberInput from"../components/widgets/NumberInput";import ReCaptchaWidget from"../components/widgets/ReCaptchaWidget";import Spinner from"../components/widgets/Spinner";import TextInput from"../components/widgets/TextInput";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import{ExpressionFeatureCache,parseExpression,getFeatureTemplate}from"../utils/EditingUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import"./style/AttributeTableWidget.css";var AttributeTableWidget=/*#__PURE__*/function(_React$Component){function AttributeTableWidget(props){var _this;_classCallCheck(this,AttributeTableWidget);_this=_callSuper(this,AttributeTableWidget,[props]);_defineProperty(_this,"renderSortIndicator",function(field){if(_this.state.sortField&&_this.state.sortField.field===field){return/*#__PURE__*/React.createElement(Icon,{icon:_this.state.sortField.dir>0?"chevron-down":"chevron-up"})}else{return null}});_defineProperty(_this,"renderColumnResizeHandle",function(col,pos){return/*#__PURE__*/React.createElement("span",{className:"attribtable-table-"+pos+"draghandle",onMouseDown:function onMouseDown(ev){return _this.resizeTable(ev,col,true)}})});_defineProperty(_this,"renderRowResizeHandle",function(row,pos){return/*#__PURE__*/React.createElement("span",{className:"attribtable-table-"+pos+"draghandle",onMouseDown:function onMouseDown(ev){return _this.resizeTable(ev,row,false)}})});_defineProperty(_this,"changeSelectedLayer",function(value){_this.setState({selectedLayer:value})});_defineProperty(_this,"reload",function(){var layerName=arguments.length>0&&arguments[0]!==undefined?arguments[0]:null;_this.setState(function(state){var _this$props$filter$fi;var selectedLayer=layerName||state.selectedLayer;KeyValCache.clear();ExpressionFeatureCache.clear();var bbox=_this.state.limitToExtent?_this.props.mapBbox.bounds:null;_this.props.iface.getFeatures(_this.editLayerId(selectedLayer),_this.props.mapCrs,function(result){if(result){var features=result.features||[];_this.setState(function(state2){return{loading:false,features:features,filteredSortedFeatures:_this.filteredSortedFeatures(features,state2),loadedLayer:selectedLayer}})}else{// eslint-disable-next-line
8
8
  alert(LocaleUtils.tr("attribtable.loadfailed"));_this.setState({loading:false,features:[],filteredSortedFeatures:[],loadedLayer:""})}},bbox,(_this$props$filter$fi=_this.props.filter.filterParams)===null||_this$props$filter$fi===void 0?void 0:_this$props$filter$fi[selectedLayer],_this.props.filter.filterGeom);return _objectSpread(_objectSpread({},AttributeTableWidget.defaultState),{},{loading:true,selectedLayer:selectedLayer,limitToExtent:state.limitToExtent})})});_defineProperty(_this,"sortBy",function(field){var newState={};if(_this.state.sortField&&_this.state.sortField.field===field){newState={sortField:{field:field,dir:-_this.state.sortField.dir}}}else{newState={sortField:{field:field,dir:1}}}newState.filteredSortedFeatures=_this.filteredSortedFeatures(_this.state.features,_objectSpread(_objectSpread({},_this.state),newState));_this.setState(newState)});_defineProperty(_this,"editLayerId",function(layerId){if(_this.props.theme&&_this.props.theme.editConfig&&_this.props.theme.editConfig[layerId]){return _this.props.theme.editConfig[layerId].editDataset||layerId}return layerId});_defineProperty(_this,"renderField",function(currentEditConfig,field,featureidx,filteredIndex,fielddisabled){var feature=_this.state.features[featureidx];var value=feature.properties[field.id];if(value===undefined||value===null){value=""}var updateField=function updateField(fieldid,val){var emptynull=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;return _this.updateField(featureidx,filteredIndex,fieldid,val,emptynull)};var constraints=field.constraints||{};var disabled=constraints.readOnly||fielddisabled;var input=null;if(field.type==="boolean"||field.type==="bool"){input=/*#__PURE__*/React.createElement("input",_extends({name:field.id},constraints,{checked:value,disabled:disabled,onChange:function onChange(ev){return updateField(field.id,ev.target.checked)},type:"checkbox"}))}else if(constraints.values||constraints.keyvalrel){var filterExpr=null;if(field.filterExpression){var mapPrefix=(currentEditConfig.editDataset.match(/^[^.]+\./)||[""])[0];filterExpr=parseExpression(field.filterExpression,feature,_this.props.iface,mapPrefix,_this.props.mapCrs,function(){return _this.setState({reevaluate:+new Date})},true)}input=/*#__PURE__*/React.createElement(EditComboField,{editIface:_this.props.iface,fieldId:field.id,filterExpr:filterExpr,keyvalrel:constraints.keyvalrel,name:field.id,readOnly:constraints.readOnly||disabled,required:constraints.required,updateField:updateField,value:value,values:constraints.values})}else if(field.type==="number"){var _constraints$prec,_constraints$step;var precision=(_constraints$prec=constraints.prec)!==null&&_constraints$prec!==void 0?_constraints$prec:0;var step=(_constraints$step=constraints.step)!==null&&_constraints$step!==void 0?_constraints$step:1;input=/*#__PURE__*/React.createElement(NumberInput,{decimals:precision,disabled:disabled,max:constraints.max,min:constraints.min,name:field.id,onChange:function onChange(v){return updateField(field.id,v,true)},readOnly:constraints.readOnly,required:constraints.required,step:step,value:value})}else if(field.type==="date"){// Truncate time portion of ISO date string
9
- value=value.substr(0,10);input=/*#__PURE__*/React.createElement("input",_extends({disabled:disabled,name:field.id,type:field.type},constraints,{onChange:function onChange(ev){return updateField(field.id,ev.target.value,true)},value:value}))}else if(field.type==="file"){return/*#__PURE__*/React.createElement(EditUploadField,{constraints:constraints,dataset:_this.editLayerId(_this.state.selectedLayer),disabled:disabled,fieldId:field.id,name:field.id,showThumbnails:false,updateField:updateField,updateFile:function updateFile(fieldId,data){_this.changedFiles[fieldId]=data},value:value})}else if(field.type==="text"){var _feature$properties$f;if(((_feature$properties$f=feature.properties[field.id])!==null&&_feature$properties$f!==void 0?_feature$properties$f:null)===null){var _ConfigUtils$getConfi;value=(_ConfigUtils$getConfi=ConfigUtils.getConfigProp("editTextNullValue"))!==null&&_ConfigUtils$getConfi!==void 0?_ConfigUtils$getConfi:""}var updateTextField=function updateTextField(val){if(val!==value){var textNullValue=ConfigUtils.getConfigProp("editTextNullValue");updateField(field.id,textNullValue!==undefined&&val===textNullValue?null:val)}};var addLinkAnchors=ConfigUtils.getConfigProp("editingAddLinkAnchors")!==false;var editTextNullValue=ConfigUtils.getConfigProp("editTextNullValue");input=/*#__PURE__*/React.createElement(TextInput,{addLinkAnchors:addLinkAnchors,clearValue:editTextNullValue,disabled:disabled,multiline:constraints.multiline,name:field.id,onChange:updateTextField,required:constraints.required,value:value})}else{input=/*#__PURE__*/React.createElement("input",_extends({disabled:disabled,name:field.id,type:field.type},constraints,{onChange:function onChange(ev){return updateField(field.id,ev.target.value)},value:value}))}return input});_defineProperty(_this,"addFeature",function(){var editConfig=_this.props.theme.editConfig||{};var currentEditConfig=editConfig[_this.state.loadedLayer];if(!currentEditConfig){return}var hasGeometry=(currentEditConfig||{}).geomType!==null;if(!_this.props.allowAddForGeometryLayers&&hasGeometry){// eslint-disable-next-line
9
+ value=value.substr(0,10);input=/*#__PURE__*/React.createElement("input",_extends({disabled:disabled,name:field.id,type:field.type},constraints,{onChange:function onChange(ev){return updateField(field.id,ev.target.value,true)},value:value}))}else if(field.type==="file"){return/*#__PURE__*/React.createElement(EditUploadField,{constraints:constraints,dataset:_this.editLayerId(_this.state.selectedLayer),disabled:disabled,fieldId:field.id,iface:_this.props.iface,name:field.id,showThumbnails:false,updateField:updateField,updateFile:function updateFile(fieldId,data){_this.changedFiles[fieldId]=data},value:value})}else if(field.type==="text"){var _feature$properties$f;if(((_feature$properties$f=feature.properties[field.id])!==null&&_feature$properties$f!==void 0?_feature$properties$f:null)===null){var _ConfigUtils$getConfi;value=(_ConfigUtils$getConfi=ConfigUtils.getConfigProp("editTextNullValue"))!==null&&_ConfigUtils$getConfi!==void 0?_ConfigUtils$getConfi:""}var updateTextField=function updateTextField(val){if(val!==value){var textNullValue=ConfigUtils.getConfigProp("editTextNullValue");updateField(field.id,textNullValue!==undefined&&val===textNullValue?null:val)}};var addLinkAnchors=ConfigUtils.getConfigProp("editingAddLinkAnchors")!==false;var editTextNullValue=ConfigUtils.getConfigProp("editTextNullValue");input=/*#__PURE__*/React.createElement(TextInput,{addLinkAnchors:addLinkAnchors,clearValue:editTextNullValue,disabled:disabled,multiline:constraints.multiline,name:field.id,onChange:updateTextField,required:constraints.required,value:value})}else{input=/*#__PURE__*/React.createElement("input",_extends({disabled:disabled,name:field.id,type:field.type},constraints,{onChange:function onChange(ev){return updateField(field.id,ev.target.value)},value:value}))}return input});_defineProperty(_this,"addFeature",function(){var editConfig=_this.props.theme.editConfig||{};var currentEditConfig=editConfig[_this.state.loadedLayer];if(!currentEditConfig){return}var hasGeometry=(currentEditConfig||{}).geomType!==null;if(!_this.props.allowAddForGeometryLayers&&hasGeometry){// eslint-disable-next-line
10
10
  alert(LocaleUtils.tr("attribtable.geomnoadd"));return}var featureSkel={type:"Feature",geometry:null,properties:currentEditConfig.fields.reduce(function(res,field){if(field.id!=="id"){res[field.id]=field.type==="text"?"":null}return res},{})};var mapPrefix=(currentEditConfig.editDataset.match(/^[^.]+\./)||[""])[0];getFeatureTemplate(currentEditConfig,featureSkel,_this.props.iface,mapPrefix,_this.props.mapCrs,function(feature){_this.setState(function(state){return{features:[].concat(_toConsumableArray(state.features),[feature]),filteredSortedFeatures:[].concat(_toConsumableArray(state.filteredSortedFeatures),[_objectSpread(_objectSpread({},feature),{},{originalIndex:state.features.length})]),filterVal:"",currentPage:Math.floor(state.features.length/state.pageSize),changedFeatureIdx:state.filteredSortedFeatures.length,newFeature:true}});_this.props.setCurrentTaskBlocked(true,LocaleUtils.tr("editing.unsavedchanged"))})});_defineProperty(_this,"deleteSelectedFeatured",function(){_this.setState(function(state){var features=state.filteredSortedFeatures.filter(function(feature){return state.selectedFeatures[feature.id]===true});features.forEach(function(feature){_this.props.iface.deleteFeature(_this.editLayerId(state.selectedLayer),feature.id,function(success){_this.setState(function(state2){var newState={deleteTask:_objectSpread(_objectSpread({},state2.deleteTask),{},{pending:state2.deleteTask.pending.filter(function(entry){return entry!==feature.id}),failed:success?state2.deleteTask.failed:[].concat(_toConsumableArray(state2.deleteTask.failed),[feature.id]),deleted:!success?state2.deleteTask.deleted:[].concat(_toConsumableArray(state2.deleteTask.deleted),[feature.id])})};if(isEmpty(newState.deleteTask.pending)){newState.features=state.features.filter(function(f){return!newState.deleteTask.deleted.includes(f.id)});newState.filteredSortedFeatures=_this.filteredSortedFeatures(newState.features,state);if(!isEmpty(newState.deleteTask.failed)){// eslint-disable-next-line
11
11
  alert(LocaleUtils.tr("attribtable.deletefailed"))}newState.deleteTask=null;newState.currentPage=Math.floor((newState.features.length-1)/state.pageSize);newState.selectedFeatures={};newState.confirmDelete=false}return newState})},state.captchaResponse)});return{deleteTask:{pending:features.map(function(feature){return feature.id}),failed:[],deleted:[]}}})});_defineProperty(_this,"updateField",function(featureidx,filteredIdx,fieldid,value,emptynull){_this.props.setCurrentTaskBlocked(true,LocaleUtils.tr("editing.unsavedchanged"));_this.setState(function(state){value=value===""&&emptynull?null:value;var newFeatures=_toConsumableArray(state.features);newFeatures[featureidx]=_objectSpread({},newFeatures[featureidx]);newFeatures[featureidx].properties=_objectSpread(_objectSpread({},newFeatures[featureidx].properties),{},_defineProperty({},fieldid,value));var newfilteredSortedFeatures=_toConsumableArray(state.filteredSortedFeatures);newfilteredSortedFeatures[filteredIdx]=_objectSpread({},newfilteredSortedFeatures[filteredIdx]);newfilteredSortedFeatures[filteredIdx].properties=_objectSpread(_objectSpread({},newfilteredSortedFeatures[filteredIdx].properties),{},_defineProperty({},fieldid,value));var originalFeatureProps=state.originalFeatureProps||_objectSpread({},state.features[featureidx].properties);return{features:newFeatures,filteredSortedFeatures:newfilteredSortedFeatures,changedFeatureIdx:featureidx,originalFeatureProps:originalFeatureProps}})});_defineProperty(_this,"commit",function(){var feature=_objectSpread(_objectSpread({},_this.state.features[_this.state.changedFeatureIdx]),{},{crs:{type:"name",properties:{name:CoordinatesUtils.toOgcUrnCrs(_this.props.mapCrs)}}});var featureData=new FormData;featureData.set("feature",JSON.stringify(feature));Object.entries(_this.changedFiles).forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],value=_ref2[1];return featureData.set("file:"+key,value)});if(_this.state.captchaResponse){featureData.set("g-recaptcha-response",_this.state.captchaResponse)}if(_this.state.newFeature){_this.props.iface.addFeatureMultipart(_this.editLayerId(_this.state.selectedLayer),featureData,function(success,result){return _this.featureCommited(success,result)})}else{_this.props.iface.editFeatureMultipart(_this.editLayerId(_this.state.loadedLayer),feature.id,featureData,function(success,result){return _this.featureCommited(success,result)})}});_defineProperty(_this,"featureCommited",function(success,result){if(!success){// eslint-disable-next-line
12
12
  alert(result)}else{_this.changedFiles={};_this.setState(function(state){var newFeatures=_toConsumableArray(state.features);newFeatures[state.changedFeatureIdx]=result;return{features:newFeatures,filteredSortedFeatures:_this.filteredSortedFeatures(newFeatures,state),changedFeatureIdx:null,originalFeatureProps:null,newFeature:false}})}_this.props.setCurrentTaskBlocked(false)});_defineProperty(_this,"discard",function(){var newFeatures=_toConsumableArray(_this.state.features);if(_this.state.newFeature){newFeatures.splice(_this.state.changedFeatureIdx,1)}else{var featureidx=_this.state.changedFeatureIdx;newFeatures[featureidx]=_objectSpread({},newFeatures[featureidx]);newFeatures[featureidx].properties=_this.state.originalFeatureProps}_this.changedFiles={};_this.setState(function(state){return{features:newFeatures,filteredSortedFeatures:_this.filteredSortedFeatures(newFeatures,state),changedFeatureIdx:null,originalFeatureProps:null,newFeature:false}});_this.props.setCurrentTaskBlocked(false)});_defineProperty(_this,"highlightFeatures",function(){var features=[];if(_this.state.highlightedFeature){features.push(_this.state.highlightedFeature)}else if(_this.state.filterVal){features.push.apply(features,_toConsumableArray(Object.values(_this.state.filteredSortedFeatures)))}var layer={id:"__attributetablehighlight",role:LayerRole.SELECTION};_this.props.addLayerFeatures(layer,features.map(function(f){return{id:f.id,geometry:f.geometry}}),true)});_defineProperty(_this,"zoomToSelection",function(){var collection={type:"FeatureCollection",features:_this.state.filteredSortedFeatures.filter(function(feature){return _this.state.selectedFeatures[feature.id]===true&&feature.geometry})};if(!isEmpty(collection.features)){if(collection.features.length===1&&collection.features[0].geometry.type==="Point"){var zoom=MapUtils.computeZoom(_this.props.mapScales,_this.props.zoomLevel);_this.props.zoomToPoint(collection.features[0].geometry.coordinates,zoom,_this.props.mapCrs)}else{_this.props.zoomToExtent(VectorLayerUtils.computeFeatureBBox(collection),_this.props.mapCrs)}}});_defineProperty(_this,"switchToFormEditMode",function(){var editConfig=_this.props.theme.editConfig||{};var currentEditConfig=editConfig[_this.state.loadedLayer];var hasGeometry=(currentEditConfig||{}).geomType!==null;if(!hasGeometry){// eslint-disable-next-line
@@ -5,4 +5,4 @@ function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof
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
7
  */import React from"react";import omit from"lodash.omit";import PropTypes from"prop-types";import EditComboField from"./EditComboField";import EditUploadField from"./EditUploadField";import NumberInput from"./widgets/NumberInput";import ToggleSwitch from"./widgets/ToggleSwitch";import"./style/AutoEditForm.css";var AutoEditForm=/*#__PURE__*/function(_React$Component){function AutoEditForm(){var _this;_classCallCheck(this,AutoEditForm);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,AutoEditForm,[].concat(args));_defineProperty(_this,"renderField",function(field){var multiline=(field.constraints||{}).multiline;var constraints=omit(field.constraints||{},["multiline"]);var readOnly=_this.props.readOnly||constraints.readOnly;var value=(_this.props.values||{})[field.id];if(value===undefined||value===null){value=""}var input=null;var title=field.name+":";if(field.type==="boolean"||field.type==="bool"){if(_this.props.touchFriendly){var boolvalue=value==="1"||value==="on"||value==="true"||value===true;input=/*#__PURE__*/React.createElement(ToggleSwitch,_extends({name:field.id},constraints,{active:boolvalue,onChange:function onChange(active){return _this.props.updateField(field.id,active)}}))}else{title=/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",_extends({name:field.id},constraints,{checked:value,onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.checked)},type:"checkbox"})),field.name)}}else if(constraints.values||constraints.keyvalrel){input=/*#__PURE__*/React.createElement("span",{className:"input-frame"},/*#__PURE__*/React.createElement(EditComboField,{editIface:_this.props.iface,fieldId:field.id,keyvalrel:constraints.keyvalrel,name:field.id,readOnly:readOnly,required:constraints.required,updateField:_this.props.updateField,value:value,values:constraints.values}))}else if(field.type==="number"){var precision=constraints.step>0?Math.ceil(-Math.log10(constraints.step)):6;input=/*#__PURE__*/React.createElement(NumberInput,{decimals:precision,max:constraints.max,min:constraints.min,mobile:true,name:field.id,onChange:function onChange(nr){return _this.props.updateField(field.id,nr)},readOnly:readOnly,required:constraints.required,value:value})}else if(field.type==="date"){// Truncate time portion of ISO date string
8
- value=value.substr(0,10);input=/*#__PURE__*/React.createElement("span",{className:"input-frame"},/*#__PURE__*/React.createElement("input",_extends({name:field.id,type:field.type},constraints,{onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.value)},value:value})))}else if(field.type==="text"){if(multiline){input=/*#__PURE__*/React.createElement("textarea",{name:field.id,onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.value)},readOnly:readOnly,required:constraints.required,value:value})}else{input=/*#__PURE__*/React.createElement("span",{className:"input-frame"},/*#__PURE__*/React.createElement("input",{name:field.id,onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.value)},readOnly:readOnly,required:constraints.required,type:field.type,value:value}))}}else if(field.type==="file"){input=/*#__PURE__*/React.createElement(EditUploadField,{constraints:constraints,dataset:_this.props.editLayerId,fieldId:field.id,name:field.id,updateField:_this.props.updateField,value:value})}else{input=/*#__PURE__*/React.createElement("span",{className:"input-frame"},/*#__PURE__*/React.createElement("input",_extends({name:field.id,type:field.type},constraints,{onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.value)},value:value})))}return/*#__PURE__*/React.createElement("tr",{key:field.id},/*#__PURE__*/React.createElement("td",{colSpan:input?1:2,title:field.name},title),input?/*#__PURE__*/React.createElement("td",null,input):null)});return _this}_inherits(AutoEditForm,_React$Component);return _createClass(AutoEditForm,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement("table",{className:"AutoEditForm"},/*#__PURE__*/React.createElement("tbody",null,(this.props.fields||[]).map(function(field){return _this2.renderField(field)})))}}])}(React.Component);_defineProperty(AutoEditForm,"propTypes",{editLayerId:PropTypes.string,fields:PropTypes.array,iface:PropTypes.object,readOnly:PropTypes.bool,touchFriendly:PropTypes.bool,updateField:PropTypes.func,values:PropTypes.object});export{AutoEditForm as default};
8
+ value=value.substr(0,10);input=/*#__PURE__*/React.createElement("span",{className:"input-frame"},/*#__PURE__*/React.createElement("input",_extends({name:field.id,type:field.type},constraints,{onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.value)},value:value})))}else if(field.type==="text"){if(multiline){input=/*#__PURE__*/React.createElement("textarea",{name:field.id,onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.value)},readOnly:readOnly,required:constraints.required,value:value})}else{input=/*#__PURE__*/React.createElement("span",{className:"input-frame"},/*#__PURE__*/React.createElement("input",{name:field.id,onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.value)},readOnly:readOnly,required:constraints.required,type:field.type,value:value}))}}else if(field.type==="file"){input=/*#__PURE__*/React.createElement(EditUploadField,{constraints:constraints,dataset:_this.props.editLayerId,fieldId:field.id,iface:_this.props.iface,name:field.id,updateField:_this.props.updateField,value:value})}else{input=/*#__PURE__*/React.createElement("span",{className:"input-frame"},/*#__PURE__*/React.createElement("input",_extends({name:field.id,type:field.type},constraints,{onChange:function onChange(ev){return _this.props.updateField(field.id,ev.target.value)},value:value})))}return/*#__PURE__*/React.createElement("tr",{key:field.id},/*#__PURE__*/React.createElement("td",{colSpan:input?1:2,title:field.name},title),input?/*#__PURE__*/React.createElement("td",null,input):null)});return _this}_inherits(AutoEditForm,_React$Component);return _createClass(AutoEditForm,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement("table",{className:"AutoEditForm"},/*#__PURE__*/React.createElement("tbody",null,(this.props.fields||[]).map(function(field){return _this2.renderField(field)})))}}])}(React.Component);_defineProperty(AutoEditForm,"propTypes",{editLayerId:PropTypes.string,fields:PropTypes.array,iface:PropTypes.object,readOnly:PropTypes.bool,touchFriendly:PropTypes.bool,updateField:PropTypes.func,values:PropTypes.object});export{AutoEditForm as default};
@@ -4,5 +4,5 @@ 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 mime from"mime-to-extensions";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import ConfigUtils from"../utils/ConfigUtils";import{showImageEditor}from"../utils/ImageEditor";import LocaleUtils from"../utils/LocaleUtils";import Icon from"./Icon";import ButtonBar from"./widgets/ButtonBar";import ModalDialog from"./widgets/ModalDialog";import"./style/EditUploadField.css";var EditUploadField=/*#__PURE__*/function(_React$Component){function EditUploadField(props){var _this;_classCallCheck(this,EditUploadField);_this=_callSuper(this,EditUploadField,[props]);_defineProperty(_this,"state",{camera:false,imageData:null,imageFilename:null});_defineProperty(_this,"fileSelected",function(ev){if(ev.target.files[0].type.startsWith("image/")){var reader=new FileReader;reader.readAsDataURL(ev.target.files[0]);reader.onload=function(){_this.setState({imageData:reader.result,imageFilename:ev.target.files[0].name});_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(reader.result)],ev.target.files[0].name,{type:ev.target.files[0].type}));_this.props.updateField(_this.props.fieldId,"")}}else{_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,ev.target.files[0])}});_defineProperty(_this,"enableCamera",function(){_this.setState({camera:true})});_defineProperty(_this,"disableCamera",function(){_this.disableMediaStream();_this.setState({camera:false})});_defineProperty(_this,"renderCaptureFrame",function(){return/*#__PURE__*/React.createElement(ModalDialog,{icon:"camera",onClose:_this.disableCamera,title:LocaleUtils.tr("editing.takepicture")},/*#__PURE__*/React.createElement("video",{className:"edit-capture-frame",ref:_this.activateMediaStream}),/*#__PURE__*/React.createElement("div",{className:"edit-capture-controls"},/*#__PURE__*/React.createElement(Icon,{icon:"camera",onClick:_this.capturePicture})))});_defineProperty(_this,"capturePicture",function(){if(_this.cameraStream){var width=_this.videoElement.videoWidth;var height=_this.videoElement.videoHeight;var canvas=document.createElement("canvas");canvas.width=width;canvas.height=height;var context=canvas.getContext("2d");context.drawImage(_this.videoElement,0,0,width,height);var imageData=canvas.toDataURL("image/jpeg");_this.setState({imageData:imageData,imageFilename:uuidv1()+".jpg"});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(imageData)],uuidv1()+".jpg",{type:"image/jpeg"}))}_this.disableCamera()});_defineProperty(_this,"imageButtonClicked",function(action){if(action==="Draw"){var fileValue=_this.props.value.startsWith("attachment:")?_this.props.value.replace(/attachment:\/\//,""):"";var fileType=mime.lookup(fileValue);var editServiceUrl=ConfigUtils.getConfigProp("editServiceUrl");var fileUrl=editServiceUrl+_this.props.dataset+"/attachment?file="+encodeURIComponent(fileValue);var imageData=fileType&&fileType.startsWith("image/")?fileUrl:_this.state.imageData;showImageEditor(imageData,function(newImageData){_this.setState({imageData:newImageData,imageFilename:fileValue.replace(/.*\//,"")});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(newImageData)],uuidv1()+".jpg",{type:"image/jpeg"}))})}else if(action==="Clear"){_this.clearImage()}});_defineProperty(_this,"clearImage",function(){_this.setState({imageData:null,imageFilename:null});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,null)});_defineProperty(_this,"activateMediaStream",function(el){if(_this.state.camera&&!_this.cameraStream){var constraints={video:{width:{ideal:4096},height:{ideal:2160}}};navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream){_this.cameraStream=mediaStream;el.srcObject=mediaStream;el.play();_this.videoElement=el})["catch"](function(err){// eslint-disable-next-line
8
- console.warn("Unable to access camera: "+err)})}});_defineProperty(_this,"disableMediaStream",function(){if(_this.cameraStream){_this.cameraStream.getTracks()[0].stop();_this.cameraStream=null;_this.videoElement=null}});_defineProperty(_this,"download",function(href,filename){var a=document.createElement("a");a.href=href;a.target="_blank";a.setAttribute("download",filename);a.click()});_defineProperty(_this,"dataUriToBlob",function(dataUri){var parts=dataUri.split(",");var byteString=parts[0].indexOf("base64")>=0?atob(parts[1]):decodeURI(parts[1]);var mimeString=parts[0].split(":")[1].split(";")[0];var ia=new Uint8Array(byteString.length);for(var i=0;i<byteString.length;i++){ia[i]=byteString.charCodeAt(i)}return new Blob([ia],{type:mimeString})});_this.cameraStream=null;_this.videoElement=null;_this.portal=document.createElement("div");document.body.appendChild(_this.portal);return _this}_inherits(EditUploadField,_React$Component);return _createClass(EditUploadField,[{key:"componentWillUnmount",value:function componentWillUnmount(){this.disableMediaStream()}},{key:"render",value:function render(){var _this2=this;var fileValue=this.props.value.startsWith("attachment:")?this.props.value.replace(/attachment:\/\//,""):"";var fileType=mime.lookup(fileValue);var editServiceUrl=ConfigUtils.getConfigProp("editServiceUrl");var fileUrl=editServiceUrl+this.props.dataset+"/attachment?file="+encodeURIComponent(fileValue);var constraints=_objectSpread(_objectSpread({},this.props.constraints),{},{accept:(this.props.constraints.accept||"").split(",").map(function(ext){return mime.lookup(ext)}).join(",")});var mediaSupport="mediaDevices"in navigator&&constraints.accept.split(",").includes("image/jpeg");var imageData=fileType&&fileType.startsWith("image/")?fileUrl:this.state.imageData;if(imageData){if(this.props.showThumbnails){var extension=fileValue?fileValue.replace(/^.*\./,""):"jpg";var imagebuttons=[{key:"Draw",icon:"paint",tooltip:LocaleUtils.tr("editing.paint"),disabled:this.props.disabled},{key:"Clear",icon:"clear",tooltip:LocaleUtils.tr("editing.clearpicture"),disabled:this.props.disabled}];return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field-image"},/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this2.download(imageData,_this2.props.fieldId+"."+extension)},src:imageData}),this.state.imageData?/*#__PURE__*/React.createElement("input",{"data-filename":this.state.imageFilename,name:this.props.name,type:"hidden",value:this.state.imageData}):null,!this.props.report?/*#__PURE__*/React.createElement(ButtonBar,{buttons:imagebuttons,onClick:this.imageButtonClicked,tooltipPos:"top"}):null)}else{var _extension=fileValue?fileValue.replace(/^.*\./,""):"jpg";return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field edit-upload-field-imagelink"+(this.props.disabled?" edit-upload-field-disabled":"")},fileValue?/*#__PURE__*/React.createElement("a",{href:fileUrl,rel:"noreferrer",target:"_blank"},fileValue.replace(/.*\//,"")):/*#__PURE__*/React.createElement("a",{href:"#",onClick:function onClick(ev){_this2.download(imageData,_this2.state.imageFilename);ev.preventDefault()},rel:"noreferrer",target:"_blank"},this.state.imageFilename),/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this2.download(imageData,_this2.props.fieldId+"."+_extension)},src:imageData}),this.props.report?null:/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.props.disabled?null:this.clearImage}))}}else if(fileValue){return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field edit-upload-field-imagelink"+(this.props.disabled?" edit-upload-field-disabled":"")},/*#__PURE__*/React.createElement("a",{href:fileUrl,rel:"noreferrer",target:"_blank"},fileValue.replace(/.*\//,"")),this.props.report?null:/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.props.disabled?null:this.clearImage}))}else if(!this.props.report){return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field-input"+(this.props.disabled?" edit-upload-field-input-disabled":"")},/*#__PURE__*/React.createElement("input",_extends({disabled:this.props.disabled,name:this.props.name,type:"file"},constraints,{onChange:this.fileSelected})),mediaSupport?/*#__PURE__*/React.createElement(Icon,{icon:"camera",onClick:this.props.disabled?null:this.enableCamera}):null,this.state.camera?this.renderCaptureFrame():null)}else{return null}}}])}(React.Component);_defineProperty(EditUploadField,"propTypes",{constraints:PropTypes.object,dataset:PropTypes.string,disabled:PropTypes.bool,fieldId:PropTypes.string,name:PropTypes.string,report:PropTypes.bool,showThumbnails:PropTypes.bool,updateField:PropTypes.func,updateFile:PropTypes.func,value:PropTypes.string});_defineProperty(EditUploadField,"defaultProps",{showThumbnails:true,updateFile:function updateFile(){}});export{EditUploadField as default};
7
+ */import React from"react";import mime from"mime-to-extensions";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import{showImageEditor}from"../utils/ImageEditor";import LocaleUtils from"../utils/LocaleUtils";import Icon from"./Icon";import ButtonBar from"./widgets/ButtonBar";import ModalDialog from"./widgets/ModalDialog";import"./style/EditUploadField.css";var EditUploadField=/*#__PURE__*/function(_React$Component){function EditUploadField(props){var _this;_classCallCheck(this,EditUploadField);_this=_callSuper(this,EditUploadField,[props]);_defineProperty(_this,"state",{camera:false,imageData:null,imageFilename:null});_defineProperty(_this,"fileSelected",function(ev){if(ev.target.files[0].type.startsWith("image/")){var reader=new FileReader;reader.readAsDataURL(ev.target.files[0]);reader.onload=function(){_this.setState({imageData:reader.result,imageFilename:ev.target.files[0].name});_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(reader.result)],ev.target.files[0].name,{type:ev.target.files[0].type}));_this.props.updateField(_this.props.fieldId,"")}}else{_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,ev.target.files[0])}});_defineProperty(_this,"enableCamera",function(){_this.setState({camera:true})});_defineProperty(_this,"disableCamera",function(){_this.disableMediaStream();_this.setState({camera:false})});_defineProperty(_this,"renderCaptureFrame",function(){return/*#__PURE__*/React.createElement(ModalDialog,{icon:"camera",onClose:_this.disableCamera,title:LocaleUtils.tr("editing.takepicture")},/*#__PURE__*/React.createElement("video",{className:"edit-capture-frame",ref:_this.activateMediaStream}),/*#__PURE__*/React.createElement("div",{className:"edit-capture-controls"},/*#__PURE__*/React.createElement(Icon,{icon:"camera",onClick:_this.capturePicture})))});_defineProperty(_this,"capturePicture",function(){if(_this.cameraStream){var width=_this.videoElement.videoWidth;var height=_this.videoElement.videoHeight;var canvas=document.createElement("canvas");canvas.width=width;canvas.height=height;var context=canvas.getContext("2d");context.drawImage(_this.videoElement,0,0,width,height);var imageData=canvas.toDataURL("image/jpeg");_this.setState({imageData:imageData,imageFilename:uuidv1()+".jpg"});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(imageData)],uuidv1()+".jpg",{type:"image/jpeg"}))}_this.disableCamera()});_defineProperty(_this,"imageButtonClicked",function(action){if(action==="Draw"){var fileValue=_this.props.value.startsWith("attachment:")?_this.props.value.replace(/attachment:\/\//,""):"";var fileType=mime.lookup(fileValue);var fileUrl=_this.props.iface.resolveAttachmentUrl(_this.props.dataset,fileValue);var imageData=fileType&&fileType.startsWith("image/")?fileUrl:_this.state.imageData;showImageEditor(imageData,function(newImageData){_this.setState({imageData:newImageData,imageFilename:fileValue.replace(/.*\//,"")});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,new File([_this.dataUriToBlob(newImageData)],uuidv1()+".jpg",{type:"image/jpeg"}))})}else if(action==="Clear"){_this.clearImage()}});_defineProperty(_this,"clearImage",function(){_this.setState({imageData:null,imageFilename:null});_this.props.updateField(_this.props.fieldId,"");_this.props.updateFile(_this.props.fieldId,null)});_defineProperty(_this,"activateMediaStream",function(el){if(_this.state.camera&&!_this.cameraStream){var constraints={video:{width:{ideal:4096},height:{ideal:2160}}};navigator.mediaDevices.getUserMedia(constraints).then(function(mediaStream){_this.cameraStream=mediaStream;el.srcObject=mediaStream;el.play();_this.videoElement=el})["catch"](function(err){// eslint-disable-next-line
8
+ console.warn("Unable to access camera: "+err)})}});_defineProperty(_this,"disableMediaStream",function(){if(_this.cameraStream){_this.cameraStream.getTracks()[0].stop();_this.cameraStream=null;_this.videoElement=null}});_defineProperty(_this,"download",function(href,filename){var a=document.createElement("a");a.href=href;a.target="_blank";a.setAttribute("download",filename);a.click()});_defineProperty(_this,"dataUriToBlob",function(dataUri){var parts=dataUri.split(",");var byteString=parts[0].indexOf("base64")>=0?atob(parts[1]):decodeURI(parts[1]);var mimeString=parts[0].split(":")[1].split(";")[0];var ia=new Uint8Array(byteString.length);for(var i=0;i<byteString.length;i++){ia[i]=byteString.charCodeAt(i)}return new Blob([ia],{type:mimeString})});_this.cameraStream=null;_this.videoElement=null;_this.portal=document.createElement("div");document.body.appendChild(_this.portal);return _this}_inherits(EditUploadField,_React$Component);return _createClass(EditUploadField,[{key:"componentWillUnmount",value:function componentWillUnmount(){this.disableMediaStream()}},{key:"render",value:function render(){var _this2=this;var fileValue=this.props.value.startsWith("attachment:")?this.props.value.replace(/attachment:\/\//,""):"";var fileType=mime.lookup(fileValue);var fileUrl=this.props.iface.resolveAttachmentUrl(this.props.dataset,fileValue);var constraints=_objectSpread(_objectSpread({},this.props.constraints),{},{accept:(this.props.constraints.accept||"").split(",").map(function(ext){return mime.lookup(ext)}).join(",")});var mediaSupport="mediaDevices"in navigator&&constraints.accept.split(",").includes("image/jpeg");var imageData=fileType&&fileType.startsWith("image/")?fileUrl:this.state.imageData;if(imageData){if(this.props.showThumbnails){var extension=fileValue?fileValue.replace(/^.*\./,""):"jpg";var imagebuttons=[{key:"Draw",icon:"paint",tooltip:LocaleUtils.tr("editing.paint"),disabled:this.props.disabled},{key:"Clear",icon:"clear",tooltip:LocaleUtils.tr("editing.clearpicture"),disabled:this.props.disabled}];return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field-image"},/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this2.download(imageData,_this2.props.fieldId+"."+extension)},src:imageData}),this.state.imageData?/*#__PURE__*/React.createElement("input",{"data-filename":this.state.imageFilename,name:this.props.name,type:"hidden",value:this.state.imageData}):null,!this.props.report?/*#__PURE__*/React.createElement(ButtonBar,{buttons:imagebuttons,onClick:this.imageButtonClicked,tooltipPos:"top"}):null)}else{var _extension=fileValue?fileValue.replace(/^.*\./,""):"jpg";return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field edit-upload-field-imagelink"+(this.props.disabled?" edit-upload-field-disabled":"")},fileValue?/*#__PURE__*/React.createElement("a",{href:fileUrl,rel:"noreferrer",target:"_blank"},fileValue.replace(/.*\//,"")):/*#__PURE__*/React.createElement("a",{href:"#",onClick:function onClick(ev){_this2.download(imageData,_this2.state.imageFilename);ev.preventDefault()},rel:"noreferrer",target:"_blank"},this.state.imageFilename),/*#__PURE__*/React.createElement("img",{onClick:function onClick(){return _this2.download(imageData,_this2.props.fieldId+"."+_extension)},src:imageData}),this.props.report?null:/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.props.disabled?null:this.clearImage}))}}else if(fileValue){return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field edit-upload-field-imagelink"+(this.props.disabled?" edit-upload-field-disabled":"")},/*#__PURE__*/React.createElement("a",{href:fileUrl,rel:"noreferrer",target:"_blank"},fileValue.replace(/.*\//,"")),this.props.report?null:/*#__PURE__*/React.createElement(Icon,{icon:"clear",onClick:this.props.disabled?null:this.clearImage}))}else if(!this.props.report){return/*#__PURE__*/React.createElement("span",{className:"edit-upload-field-input"+(this.props.disabled?" edit-upload-field-input-disabled":"")},/*#__PURE__*/React.createElement("input",_extends({disabled:this.props.disabled,name:this.props.name,type:"file"},constraints,{onChange:this.fileSelected})),mediaSupport?/*#__PURE__*/React.createElement(Icon,{icon:"camera",onClick:this.props.disabled?null:this.enableCamera}):null,this.state.camera?this.renderCaptureFrame():null)}else{return null}}}])}(React.Component);_defineProperty(EditUploadField,"propTypes",{constraints:PropTypes.object,dataset:PropTypes.string,disabled:PropTypes.bool,fieldId:PropTypes.string,iface:PropTypes.object,name:PropTypes.string,report:PropTypes.bool,showThumbnails:PropTypes.bool,updateField:PropTypes.func,updateFile:PropTypes.func,value:PropTypes.string});_defineProperty(EditUploadField,"defaultProps",{showThumbnails:true,updateFile:function updateFile(){}});export{EditUploadField as default};
@@ -16,7 +16,7 @@ preprocessor: function(formData, feature, callback)
16
16
  */export function registerFormPreprocessor(editLayerId,preprocessor){FormPreprocessors[editLayerId]=preprocessor}export function removeFormPreprocessor(editLayerId){delete FormPreprocessors[editLayerId]}var hFitWidgets=["QLabel","QCheckBox","QRadioButton","Line","QDateTimeEdit","QDateEdit","QTimeEdit"];var vFitWidgets=["QLabel","QCheckBox","QRadioButton","Line","QDateTimeEdit","QDateEdit","QTimeEdit","QPushButton","QComboBox","QLineEdit","QSpinBox","QDoubleSpinBox","QSlider"];var QtDesignerForm=/*#__PURE__*/function(_React$Component){function QtDesignerForm(props){var _this;_classCallCheck(this,QtDesignerForm);_this=_callSuper(this,QtDesignerForm,[props]);_defineProperty(_this,"state",{reevaluate:0});_defineProperty(_this,"renderLayout",function(layout,feature,dataset,updateField){var nametransform=arguments.length>4&&arguments[4]!==undefined?arguments[4]:function(name){return name};var visible=arguments.length>5&&arguments[5]!==undefined?arguments[5]:true;var containerClass="";var itemStyle=function itemStyle(){return{}};var sortKey=function sortKey(item,idx){return idx};var containerStyle={};if(!layout){return null}else if(layout["class"]==="QGridLayout"||layout["class"]==="QFormLayout"){containerClass="qt-designer-layout-grid";containerStyle={gridTemplateColumns:_this.computeLayoutColumns(layout.item).join(" "),gridTemplateRows:_this.computeLayoutRows(layout.item).join(" ")};itemStyle=function itemStyle(item){return{gridArea:1+parseInt(item.row,10)+"/"+(1+parseInt(item.column,10))+"/ span "+parseInt(item.rowspan||1,10)+"/ span "+parseInt(item.colspan||1,10)}};sortKey=function sortKey(item){return item.row}}else if(layout["class"]==="QVBoxLayout"){containerClass="qt-designer-layout-grid";itemStyle=function itemStyle(item,idx){return{gridArea:1+idx+"/1/ span 1/ span 1"}};sortKey=function sortKey(item,idx){return idx}}else if(layout["class"]==="QHBoxLayout"){containerClass="qt-designer-layout-grid";containerStyle={gridTemplateColumns:_this.computeLayoutColumns(layout.item,true).join(" ")};itemStyle=function itemStyle(item,idx){return{gridArea:"1/"+(1+idx)+"/ span 1/ span 1"}};sortKey=function sortKey(item,idx){return idx}}else{return null}if(!visible){containerStyle.display="none"}if(layout.item.find(function(item){return item.spacer&&(item.spacer.property||{}).orientation==="Qt::Vertical"})){containerStyle.height="100%"}return/*#__PURE__*/React.createElement("div",{className:containerClass,key:layout.name,style:containerStyle},layout.item.sort(function(a,b){return sortKey(a)-sortKey(b)}).map(function(item,idx){var child=null;if(item.widget){child=_this.renderWidget(item.widget,feature,dataset,updateField,nametransform)}else if(item.layout){child=_this.renderLayout(item.layout,feature,dataset,updateField,nametransform)}else if(item.spacer){child=/*#__PURE__*/React.createElement("div",null)}else{return null}return/*#__PURE__*/React.createElement("div",{key:"i"+idx,style:itemStyle(item,idx)},child)}))});_defineProperty(_this,"computeLayoutColumns",function(items){var useIndex=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var columns=[];var hasAuto=false;var hasSpacer=items.find(function(item){var _item$spacer;return((_item$spacer=item.spacer)===null||_item$spacer===void 0||(_item$spacer=_item$spacer.property)===null||_item$spacer===void 0?void 0:_item$spacer.orientation)==="Qt::Horizontal"});items.forEach(function(item,index){var _item$spacer2,_item$widget;var col=useIndex?index:parseInt(item.column,10)||0;var colSpan=useIndex?1:parseInt(item.colspan,10)||1;if(((_item$spacer2=item.spacer)===null||_item$spacer2===void 0||(_item$spacer2=_item$spacer2.property)===null||_item$spacer2===void 0?void 0:_item$spacer2.orientation)==="Qt::Horizontal"){columns[col]="auto";hasAuto=true}else if(!hasSpacer&&!hFitWidgets.includes((_item$widget=item.widget)===null||_item$widget===void 0?void 0:_item$widget["class"])&&colSpan===1){columns[col]="auto";hasAuto=true}else{var _columns$col;columns[col]=(_columns$col=columns[col])!==null&&_columns$col!==void 0?_columns$col:null;// Placeholder replaced by fit-content below
17
17
  }});var fit="fit-content("+Math.round(1/columns.length*100)+"%)";for(var col=0;col<columns.length;++col){columns[col]=hasAuto?columns[col]||fit:"auto"}return columns});_defineProperty(_this,"computeLayoutRows",function(items){var useIndex=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;var rows=[];var hasSpacer=items.find(function(item){var _item$spacer3;return((_item$spacer3=item.spacer)===null||_item$spacer3===void 0||(_item$spacer3=_item$spacer3.property)===null||_item$spacer3===void 0?void 0:_item$spacer3.orientation)==="Qt::Vertical"});items.forEach(function(item,index){var _item$spacer4,_item$widget2,_item$widget2$startsW,_item$widget$layout,_item$widget3,_item$widget5;var row=useIndex?index:parseInt(item.row,10)||0;var rowSpan=useIndex?1:parseInt(item.rowspan,10)||1;if(((_item$spacer4=item.spacer)===null||_item$spacer4===void 0||(_item$spacer4=_item$spacer4.property)===null||_item$spacer4===void 0?void 0:_item$spacer4.orientation)==="Qt::Vertical"||(_item$widget2=item.widget)!==null&&_item$widget2!==void 0&&(_item$widget2=_item$widget2.name)!==null&&_item$widget2!==void 0&&(_item$widget2$startsW=_item$widget2.startsWith)!==null&&_item$widget2$startsW!==void 0&&_item$widget2$startsW.call(_item$widget2,"nrel_")){rows[row]="auto"}else if((_item$widget$layout=(_item$widget3=item.widget)===null||_item$widget3===void 0?void 0:_item$widget3.layout)!==null&&_item$widget$layout!==void 0?_item$widget$layout:item.layout){var _item$widget4,_item$layout;rows[row]=(_item$widget4=item.widget)!==null&&_item$widget4!==void 0&&(_item$widget4=_item$widget4.layout)!==null&&_item$widget4!==void 0&&_item$widget4.verticalFill||(_item$layout=item.layout)!==null&&_item$layout!==void 0&&_item$layout.verticalFill?"auto":null;// Placeholder replaced by fit-content below
18
18
  }else if(!hasSpacer&&!vFitWidgets.includes((_item$widget5=item.widget)===null||_item$widget5===void 0?void 0:_item$widget5["class"])&&rowSpan===1){rows[row]="auto"}else{var _rows$row;rows[row]=(_rows$row=rows[row])!==null&&_rows$row!==void 0?_rows$row:null;// Placeholder replaced by fit-content below
19
- }});var fit="fit-content("+Math.round(1/rows.length*100)+"%)";for(var row=0;row<rows.length;++row){rows[row]=rows[row]||fit}return rows});_defineProperty(_this,"renderWidget",function(widget,feature,dataset,updateField){var _widget$name,_this$props$fields$wi;var nametransform=arguments.length>4&&arguments[4]!==undefined?arguments[4]:function(name){return name};var disabled=arguments.length>5&&arguments[5]!==undefined?arguments[5]:false;var value=(_widget$name=(feature.properties||{})[widget.name])!==null&&_widget$name!==void 0?_widget$name:"";var prop=widget.property||{};if(String(prop.visible)==="false"){return null}var attr=widget.attribute||{};var fieldConstraints=((_this$props$fields$wi=_this.props.fields[widget.name])===null||_this$props$fields$wi===void 0?void 0:_this$props$fields$wi.constraints)||{};var inputConstraints={};inputConstraints.readOnly=_this.props.readOnly||String(prop.readOnly)==="true"||String(prop.enabled)==="false"||fieldConstraints.readOnly===true||disabled;inputConstraints.required=!inputConstraints.readOnly&&(String(prop.required)==="true"||String(fieldConstraints.required)==="true");inputConstraints.placeholder=prop.placeholderText||fieldConstraints.placeholder||"";var fontProps=prop.font||{};var fontStyle={fontWeight:String(fontProps.bold)==="true"?"bold":"normal",fontStyle:String(fontProps.italic)==="true"?"italic":"normal",textDecoration:[String(fontProps.underline)==="true"?"underline":"",String(fontProps.strikeout)==="true"?"line-through":""].join(" "),fontSize:Math.round((fontProps.pointsize||9)/9*100)+"%",textAlign:"left"};if(prop.alignment){if(prop.alignment.includes("Qt::AlignRight")){fontStyle.textAlign="right"}else if(prop.alignment.includes("Qt::AlignCenter")){fontStyle.textAlign="center"}}var elname=undefined;if(widget.name.startsWith("ext__")){updateField=null;value=_this.state.formData.externalFields[widget.name.slice(5)];inputConstraints.readOnly=true}else{elname=nametransform(widget.name)}if(widget["class"]==="QLabel"){if(widget.name.startsWith("img__")){var _widget$name$split$;value=(_widget$name$split$=(feature.properties||[])[widget.name.split("__")[1]])!==null&&_widget$name$split$!==void 0?_widget$name$split$:widget.property.text;return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-image"},/*#__PURE__*/React.createElement("a",{href:value,rel:"noreferrer",target:"_blank"},/*#__PURE__*/React.createElement("img",{src:value})))}else{var text=widget.name.startsWith("ext__")?value:widget.property.text;return/*#__PURE__*/React.createElement("div",{style:fontStyle},text)}}else if(widget["class"]==="Line"){var _widget$property;var linetype=((_widget$property=widget.property)===null||_widget$property===void 0?void 0:_widget$property.orientation)==="Qt::Vertical"?"vline":"hline";return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-"+linetype})}else if(widget["class"]==="QFrame"){return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-container"},/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-frame"},widget.name.startsWith("nrel__")?_this.renderNRelation(widget):_this.renderLayout(widget.layout,feature,dataset,updateField,nametransform)))}else if(widget["class"]==="QGroupBox"){if(widget.property.visibilityExpression){var exprResult=parseExpression(widget.property.visibilityExpression,feature,_this.props.iface,_this.props.mapPrefix,_this.props.mapCrs,function(){return _this.setState({reevaluate:+new Date})});if(exprResult===false||exprResult===0){return null}}return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-container"},/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-frame-title",style:fontStyle},prop.title),/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-frame"},widget.name.startsWith("nrel__")?_this.renderNRelation(widget):_this.renderLayout(widget.layout,feature,dataset,updateField,nametransform)))}else if(widget["class"]==="QTabWidget"){if(isEmpty(widget.widget)){return null}var activetab=_this.state.activetabs[widget.name]||widget.widget[0].name;var tabs=widget.widget.map(function(tab){return{key:tab.name,label:tab.attribute.title}});return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-container"},/*#__PURE__*/React.createElement(ButtonBar,{active:activetab,buttons:tabs,className:"qt-designer-form-tabbar",onClick:function onClick(key){return _this.setState(function(state){return{activetabs:_objectSpread(_objectSpread({},state.activetabs),{},_defineProperty({},widget.name,key))}})}}),/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-frame"},widget.widget.filter(function(child){return child.layout}).map(function(child){return _this.renderLayout(child.layout,feature,dataset,updateField,nametransform,child.name===activetab)})))}else if(widget["class"]==="QTextEdit"||widget["class"]==="QTextBrowser"||widget["class"]==="QPlainTextEdit"){var _feature$properties$w,_feature$properties;if(((_feature$properties$w=(_feature$properties=feature.properties)===null||_feature$properties===void 0?void 0:_feature$properties[widget.name])!==null&&_feature$properties$w!==void 0?_feature$properties$w:null)===null){var _ConfigUtils$getConfi;value=(_ConfigUtils$getConfi=ConfigUtils.getConfigProp("editTextNullValue"))!==null&&_ConfigUtils$getConfi!==void 0?_ConfigUtils$getConfi:""}if(_this.props.report){return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-textarea"},value)}else{var addLinkAnchors=ConfigUtils.getConfigProp("editingAddLinkAnchors")!==false;return/*#__PURE__*/React.createElement(TextInput,_extends({addLinkAnchors:addLinkAnchors,multiline:true,name:elname,onChange:function onChange(val){return updateField(widget.name,val)}},inputConstraints,{style:fontStyle,value:value}))}}else if(widget["class"]==="QLineEdit"){if(widget.name.endsWith("__upload")){var _feature$properties2;var fieldId=widget.name.replace(/__upload/,"");var uploadValue=((_feature$properties2=feature.properties)===null||_feature$properties2===void 0?void 0:_feature$properties2[fieldId])||"";var uploadElName=elname.replace(/__upload/,"");var constraints={accept:prop.text||"",required:inputConstraints.required};return/*#__PURE__*/React.createElement(EditUploadField,{constraints:constraints,dataset:dataset,disabled:inputConstraints.readOnly,fieldId:fieldId,name:uploadElName,report:_this.props.report,updateField:updateField,value:uploadValue})}else{var _feature$properties$w2,_feature$properties3;if(fieldConstraints.prec!==undefined&&typeof value==="number"){value=value.toFixed(fieldConstraints.prec)}else if(((_feature$properties$w2=(_feature$properties3=feature.properties)===null||_feature$properties3===void 0?void 0:_feature$properties3[widget.name])!==null&&_feature$properties$w2!==void 0?_feature$properties$w2:null)===null){var _ConfigUtils$getConfi2;value=(_ConfigUtils$getConfi2=ConfigUtils.getConfigProp("editTextNullValue"))!==null&&_ConfigUtils$getConfi2!==void 0?_ConfigUtils$getConfi2:""}if(_this.props.report){return/*#__PURE__*/React.createElement("div",{style:fontStyle},value||inputConstraints.placeholder)}else{var _addLinkAnchors=ConfigUtils.getConfigProp("editingAddLinkAnchors")!==false;var editTextNullValue=ConfigUtils.getConfigProp("editTextNullValue");return/*#__PURE__*/React.createElement(TextInput,_extends({addLinkAnchors:_addLinkAnchors,clearValue:editTextNullValue,name:elname,onChange:function onChange(val){return updateField(widget.name,val)}},inputConstraints,{style:fontStyle,value:value}))}}}else if(widget["class"]==="QCheckBox"||widget["class"]==="QRadioButton"){var _this$props$feature$p;var type=widget["class"]==="QCheckBox"?"checkbox":"radio";var inGroup=attr.buttonGroup;var checked=inGroup?((_this$props$feature$p=_this.props.feature.properties)===null||_this$props$feature$p===void 0?void 0:_this$props$feature$p[_this.groupOrName(widget)])===widget.name:value;return/*#__PURE__*/React.createElement("label",{style:fontStyle},/*#__PURE__*/React.createElement("input",_extends({checked:checked,disabled:inputConstraints.readOnly,name:nametransform(_this.groupOrName(widget)),onChange:function onChange(ev){return updateField(_this.groupOrName(widget),inGroup?widget.name:ev.target.checked)}},inputConstraints,{type:type,value:widget.name})),widget.property.text)}else if(widget["class"]==="QComboBox"){var parts=widget.name.split("__");if((parts.length===5||parts.length===6)&&parts[0]==="kvrel"){var _this$props$fields$at,_attrname,_this$props$fields$at2;// kvrel__attrname__datatable__keyfield__valuefield
19
+ }});var fit="fit-content("+Math.round(1/rows.length*100)+"%)";for(var row=0;row<rows.length;++row){rows[row]=rows[row]||fit}return rows});_defineProperty(_this,"renderWidget",function(widget,feature,dataset,updateField){var _widget$name,_this$props$fields$wi;var nametransform=arguments.length>4&&arguments[4]!==undefined?arguments[4]:function(name){return name};var disabled=arguments.length>5&&arguments[5]!==undefined?arguments[5]:false;var value=(_widget$name=(feature.properties||{})[widget.name])!==null&&_widget$name!==void 0?_widget$name:"";var prop=widget.property||{};if(String(prop.visible)==="false"){return null}var attr=widget.attribute||{};var fieldConstraints=((_this$props$fields$wi=_this.props.fields[widget.name])===null||_this$props$fields$wi===void 0?void 0:_this$props$fields$wi.constraints)||{};var inputConstraints={};inputConstraints.readOnly=_this.props.readOnly||String(prop.readOnly)==="true"||String(prop.enabled)==="false"||fieldConstraints.readOnly===true||disabled;inputConstraints.required=!inputConstraints.readOnly&&(String(prop.required)==="true"||String(fieldConstraints.required)==="true");inputConstraints.placeholder=prop.placeholderText||fieldConstraints.placeholder||"";var fontProps=prop.font||{};var fontStyle={fontWeight:String(fontProps.bold)==="true"?"bold":"normal",fontStyle:String(fontProps.italic)==="true"?"italic":"normal",textDecoration:[String(fontProps.underline)==="true"?"underline":"",String(fontProps.strikeout)==="true"?"line-through":""].join(" "),fontSize:Math.round((fontProps.pointsize||9)/9*100)+"%",textAlign:"left"};if(prop.alignment){if(prop.alignment.includes("Qt::AlignRight")){fontStyle.textAlign="right"}else if(prop.alignment.includes("Qt::AlignCenter")){fontStyle.textAlign="center"}}var elname=undefined;if(widget.name.startsWith("ext__")){updateField=null;value=_this.state.formData.externalFields[widget.name.slice(5)];inputConstraints.readOnly=true}else{elname=nametransform(widget.name)}if(widget["class"]==="QLabel"){if(widget.name.startsWith("img__")){var _widget$name$split$;value=(_widget$name$split$=(feature.properties||[])[widget.name.split("__")[1]])!==null&&_widget$name$split$!==void 0?_widget$name$split$:widget.property.text;return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-image"},/*#__PURE__*/React.createElement("a",{href:value,rel:"noreferrer",target:"_blank"},/*#__PURE__*/React.createElement("img",{src:value})))}else{var text=widget.name.startsWith("ext__")?value:widget.property.text;return/*#__PURE__*/React.createElement("div",{style:fontStyle},text)}}else if(widget["class"]==="Line"){var _widget$property;var linetype=((_widget$property=widget.property)===null||_widget$property===void 0?void 0:_widget$property.orientation)==="Qt::Vertical"?"vline":"hline";return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-"+linetype})}else if(widget["class"]==="QFrame"){return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-container"},/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-frame"},widget.name.startsWith("nrel__")?_this.renderNRelation(widget):_this.renderLayout(widget.layout,feature,dataset,updateField,nametransform)))}else if(widget["class"]==="QGroupBox"){if(widget.property.visibilityExpression){var exprResult=parseExpression(widget.property.visibilityExpression,feature,_this.props.iface,_this.props.mapPrefix,_this.props.mapCrs,function(){return _this.setState({reevaluate:+new Date})});if(exprResult===false||exprResult===0){return null}}return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-container"},/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-frame-title",style:fontStyle},prop.title),/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-frame"},widget.name.startsWith("nrel__")?_this.renderNRelation(widget):_this.renderLayout(widget.layout,feature,dataset,updateField,nametransform)))}else if(widget["class"]==="QTabWidget"){if(isEmpty(widget.widget)){return null}var activetab=_this.state.activetabs[widget.name]||widget.widget[0].name;var tabs=widget.widget.map(function(tab){return{key:tab.name,label:tab.attribute.title}});return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-container"},/*#__PURE__*/React.createElement(ButtonBar,{active:activetab,buttons:tabs,className:"qt-designer-form-tabbar",onClick:function onClick(key){return _this.setState(function(state){return{activetabs:_objectSpread(_objectSpread({},state.activetabs),{},_defineProperty({},widget.name,key))}})}}),/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-frame"},widget.widget.filter(function(child){return child.layout}).map(function(child){return _this.renderLayout(child.layout,feature,dataset,updateField,nametransform,child.name===activetab)})))}else if(widget["class"]==="QTextEdit"||widget["class"]==="QTextBrowser"||widget["class"]==="QPlainTextEdit"){var _feature$properties$w,_feature$properties;if(((_feature$properties$w=(_feature$properties=feature.properties)===null||_feature$properties===void 0?void 0:_feature$properties[widget.name])!==null&&_feature$properties$w!==void 0?_feature$properties$w:null)===null){var _ConfigUtils$getConfi;value=(_ConfigUtils$getConfi=ConfigUtils.getConfigProp("editTextNullValue"))!==null&&_ConfigUtils$getConfi!==void 0?_ConfigUtils$getConfi:""}if(_this.props.report){return/*#__PURE__*/React.createElement("div",{className:"qt-designer-form-textarea"},value)}else{var addLinkAnchors=ConfigUtils.getConfigProp("editingAddLinkAnchors")!==false;return/*#__PURE__*/React.createElement(TextInput,_extends({addLinkAnchors:addLinkAnchors,multiline:true,name:elname,onChange:function onChange(val){return updateField(widget.name,val)}},inputConstraints,{style:fontStyle,value:value}))}}else if(widget["class"]==="QLineEdit"){if(widget.name.endsWith("__upload")){var _feature$properties2;var fieldId=widget.name.replace(/__upload/,"");var uploadValue=((_feature$properties2=feature.properties)===null||_feature$properties2===void 0?void 0:_feature$properties2[fieldId])||"";var uploadElName=elname.replace(/__upload/,"");var constraints={accept:prop.text||"",required:inputConstraints.required};return/*#__PURE__*/React.createElement(EditUploadField,{constraints:constraints,dataset:dataset,disabled:inputConstraints.readOnly,fieldId:fieldId,iface:_this.props.iface,name:uploadElName,report:_this.props.report,updateField:updateField,value:uploadValue})}else{var _feature$properties$w2,_feature$properties3;if(fieldConstraints.prec!==undefined&&typeof value==="number"){value=value.toFixed(fieldConstraints.prec)}else if(((_feature$properties$w2=(_feature$properties3=feature.properties)===null||_feature$properties3===void 0?void 0:_feature$properties3[widget.name])!==null&&_feature$properties$w2!==void 0?_feature$properties$w2:null)===null){var _ConfigUtils$getConfi2;value=(_ConfigUtils$getConfi2=ConfigUtils.getConfigProp("editTextNullValue"))!==null&&_ConfigUtils$getConfi2!==void 0?_ConfigUtils$getConfi2:""}if(_this.props.report){return/*#__PURE__*/React.createElement("div",{style:fontStyle},value||inputConstraints.placeholder)}else{var _addLinkAnchors=ConfigUtils.getConfigProp("editingAddLinkAnchors")!==false;var editTextNullValue=ConfigUtils.getConfigProp("editTextNullValue");return/*#__PURE__*/React.createElement(TextInput,_extends({addLinkAnchors:_addLinkAnchors,clearValue:editTextNullValue,name:elname,onChange:function onChange(val){return updateField(widget.name,val)}},inputConstraints,{style:fontStyle,value:value}))}}}else if(widget["class"]==="QCheckBox"||widget["class"]==="QRadioButton"){var _this$props$feature$p;var type=widget["class"]==="QCheckBox"?"checkbox":"radio";var inGroup=attr.buttonGroup;var checked=inGroup?((_this$props$feature$p=_this.props.feature.properties)===null||_this$props$feature$p===void 0?void 0:_this$props$feature$p[_this.groupOrName(widget)])===widget.name:value;return/*#__PURE__*/React.createElement("label",{style:fontStyle},/*#__PURE__*/React.createElement("input",_extends({checked:checked,disabled:inputConstraints.readOnly,name:nametransform(_this.groupOrName(widget)),onChange:function onChange(ev){return updateField(_this.groupOrName(widget),inGroup?widget.name:ev.target.checked)}},inputConstraints,{type:type,value:widget.name})),widget.property.text)}else if(widget["class"]==="QComboBox"){var parts=widget.name.split("__");if((parts.length===5||parts.length===6)&&parts[0]==="kvrel"){var _this$props$fields$at,_attrname,_this$props$fields$at2;// kvrel__attrname__datatable__keyfield__valuefield
20
20
  // kvrel__reltablename__attrname__datatable__keyfield__valuefield
21
21
  var count=parts.length;var attrname=parts.slice(1,count-3).join("__");var comboFieldConstraints=((_this$props$fields$at=_this.props.fields[attrname])===null||_this$props$fields$at===void 0?void 0:_this$props$fields$at.constraints)||{};value=(_attrname=(feature.properties||[])[attrname])!==null&&_attrname!==void 0?_attrname:"";var _fieldId=parts.slice(1,count-3).join("__");var keyvalrel=_this.props.mapPrefix+parts[count-3]+":"+parts[count-2]+":"+parts[count-1];var filterExpr=null;if((_this$props$fields$at2=_this.props.fields[attrname])!==null&&_this$props$fields$at2!==void 0&&_this$props$fields$at2.filterExpression){filterExpr=parseExpression(_this.props.fields[attrname].filterExpression,feature,_this.props.iface,_this.props.mapPrefix,_this.props.mapCrs,function(){return _this.setState({reevaluate:+new Date})},true)}return/*#__PURE__*/React.createElement(EditComboField,{editIface:_this.props.iface,fieldId:_fieldId,filterExpr:filterExpr,key:_fieldId,keyvalrel:keyvalrel,name:nametransform(attrname),placeholder:inputConstraints.placeholder,readOnly:inputConstraints.readOnly||comboFieldConstraints.readOnly,required:inputConstraints.required||comboFieldConstraints.required,style:fontStyle,updateField:updateField,value:value})}else{var values=MiscUtils.ensureArray(widget.item||[]).map(function(item){var _item$property$value;return{label:item.property.text,value:(_item$property$value=item.property.value)!==null&&_item$property$value!==void 0?_item$property$value:item.property.text}});return/*#__PURE__*/React.createElement(EditComboField,{editIface:_this.props.iface,fieldId:widget.name,key:widget.name,name:elname,placeholder:inputConstraints.placeholder,readOnly:inputConstraints.readOnly||inputConstraints.readOnly,required:inputConstraints.required||inputConstraints.required,style:fontStyle,updateField:updateField,value:value,values:values})}}else if(widget["class"]==="QSpinBox"||widget["class"]==="QDoubleSpinBox"||widget["class"]==="QSlider"){var _prop$minimum,_prop$maximum,_ref,_prop$singleStep,_prop$decimals;var floatConstraint=function floatConstraint(x){var f=parseFloat(x);return isNaN(f)?undefined:f};var min=floatConstraint((_prop$minimum=prop.minimum)!==null&&_prop$minimum!==void 0?_prop$minimum:fieldConstraints.min);var max=floatConstraint((_prop$maximum=prop.maximum)!==null&&_prop$maximum!==void 0?_prop$maximum:fieldConstraints.max);var step=(_ref=(_prop$singleStep=prop.singleStep)!==null&&_prop$singleStep!==void 0?_prop$singleStep:fieldConstraints.step)!==null&&_ref!==void 0?_ref:1;var precision=(_prop$decimals=prop.decimals)!==null&&_prop$decimals!==void 0?_prop$decimals:0;if(widget["class"]==="QSlider"){return/*#__PURE__*/React.createElement("input",_extends({max:max,min:min,name:elname,onChange:function onChange(ev){return updateField(widget.name,ev.target.value)}},inputConstraints,{size:5,step:step,style:fontStyle,type:"range",value:value}))}else{var _feature$properties$w3,_feature$properties4;value=(_feature$properties$w3=(_feature$properties4=feature.properties)===null||_feature$properties4===void 0?void 0:_feature$properties4[widget.name])!==null&&_feature$properties$w3!==void 0?_feature$properties$w3:null;return/*#__PURE__*/React.createElement(NumberInput,_extends({decimals:precision,max:max,min:min,name:elname,onChange:function onChange(val){return updateField(widget.name,val)}},inputConstraints,{step:step,style:fontStyle,value:value}))}}else if(widget["class"]==="QDateEdit"){var _min=prop.minimumDate?_this.dateConstraint(prop.minimumDate):"1600-01-01";var _max=prop.maximumDate?_this.dateConstraint(prop.maximumDate):"9999-12-31";return/*#__PURE__*/React.createElement("input",_extends({max:_max,min:_min,name:elname,onChange:function onChange(ev){return updateField(widget.name,ev.target.value)}},inputConstraints,{style:fontStyle,type:"date",value:value}))}else if(widget["class"]==="QTimeEdit"){return/*#__PURE__*/React.createElement("input",_extends({name:elname,onChange:function onChange(ev){return updateField(widget.name,ev.target.value)}},inputConstraints,{style:fontStyle,type:"time",value:value}))}else if(widget["class"]==="QDateTimeEdit"){var _min2=prop.minimumDate?_this.dateConstraint(prop.minimumDate):"1600-01-01";var _max2=prop.maximumDate?_this.dateConstraint(prop.maximumDate):"9999-12-31";return/*#__PURE__*/React.createElement(DateTimeInput,{maxDate:_max2,minDate:_min2,name:elname,onChange:function onChange(val){return updateField(widget.name,val)},readOnly:inputConstraints.readOnly,required:inputConstraints.required,style:fontStyle,value:value})}else if(widget["class"]==="QWidget"){if(widget.name.startsWith("nrel__")){return _this.renderNRelation(widget)}else if(widget.name.startsWith("ext__")){return value}else{return _this.renderLayout(widget.layout,feature,dataset,updateField,nametransform)}}else if(widget["class"]==="QPushButton"){if(widget.name.startsWith("btn__")&&widget.onClick){return/*#__PURE__*/React.createElement("button",{className:"button",disabled:inputConstraints.readOnly,onClick:function onClick(){return widget.onClick(_this.props.setFormBusy)},type:"button"},widget.property.text)}else if(widget.name.startsWith("featurelink__")){var _parts=widget.name.split("__");// featurelink__layer__attrname
22
22
  // featurelink__layer__reltable__attrname
@@ -4,4 +4,4 @@ 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{closeWindow,closeAllWindows,NotificationType}from"../actions/windows";import LocaleUtils from"../utils/LocaleUtils";import Icon from"./Icon";import ResizeableWindow from"./ResizeableWindow";import"./style/WindowManager.css";var WindowManager=/*#__PURE__*/function(_React$Component){function WindowManager(){var _this;_classCallCheck(this,WindowManager);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,WindowManager,[].concat(args));_defineProperty(_this,"renderIframeDialog",function(key,data){var extraControls=[];if(_this.boolVal(data.options.print,true)!==false){extraControls.push({icon:"print",callback:function callback(){return _this.printIframe(key)}})}var dockable=_this.boolVal(data.options.dockable)!==false;var docked=_this.boolVal(data.options.docked)!==false;var splitScreenWhenDocked=_this.boolVal(data.options.splitScreenWhenDocked)!==false;return/*#__PURE__*/React.createElement(ResizeableWindow,{baseZIndex:data.options.zIndex||10,dockable:dockable||docked,extraControls:extraControls,icon:data.options.icon||"",initialHeight:data.options.h||480,initialWidth:data.options.w||640,initiallyDocked:docked,key:key,onClose:function onClose(){return _this.closeWindow(key)},splitScreenWhenDocked:splitScreenWhenDocked,title:LocaleUtils.tr(data.options.title||"windows."+key)},/*#__PURE__*/React.createElement("iframe",{className:"windows-iframe-dialog-body",name:key,role:"body",src:data.url}))});_defineProperty(_this,"renderNotification",function(key,data){var className="windows-notification-info";if(data.notificationType===NotificationType.WARN){className="windows-notification-warn"}else if(data.notificationType===NotificationType.ERROR){className="windows-notification-error"}return/*#__PURE__*/React.createElement("div",{className:className,key:key},/*#__PURE__*/React.createElement("div",null,data.text),/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{icon:"remove",onClick:function onClick(){return _this.closeWindow(key)},size:"large"})))});_defineProperty(_this,"closeWindow",function(key){_this.props.closeWindow(key)});_defineProperty(_this,"printIframe",function(key){if(window.frames[key]){window.frames[key].focus();window.frames[key].print()}});_defineProperty(_this,"boolVal",function(value){var delft=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(value===undefined||value===null){return delft}var textVal=(""+value).toLowerCase();if(textVal===""){return delft}return["0","false"].includes(textVal)?false:true});_defineProperty(_this,"get",function(obj,key,deflt){if(obj[key]===undefined){return deflt}return obj[key]});return _this}_inherits(WindowManager,_React$Component);return _createClass(WindowManager,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.currentTheme!==prevProps.currentTheme){this.props.closeAllWindows()}}},{key:"render",value:function render(){var _this2=this;var notificationIndex=0;return[].concat(_toConsumableArray(Object.entries(this.props.windows).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],data=_ref2[1];if(data.type==="iframedialog"){return _this2.renderIframeDialog(key,data)}return null})),[/*#__PURE__*/React.createElement("div",{className:"windows-notification-container",key:"notifications-container"},Object.entries(this.props.windows).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],data=_ref4[1];if(data.type==="notification"){return _this2.renderNotification(key,data,notificationIndex++)}else{return null}}))])}}])}(React.Component);_defineProperty(WindowManager,"propTypes",{closeAllWindows:PropTypes.func,closeWindow:PropTypes.func,currentTheme:PropTypes.object,windows:PropTypes.object});var selector=function selector(state){return{windows:state.windows.entries,currentTheme:state.theme.current}};export default connect(selector,{closeWindow:closeWindow,closeAllWindows:closeAllWindows})(WindowManager);
7
+ */import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{closeWindow,closeAllWindows,NotificationType}from"../actions/windows";import LocaleUtils from"../utils/LocaleUtils";import Icon from"./Icon";import ResizeableWindow from"./ResizeableWindow";import"./style/WindowManager.css";var WindowManager=/*#__PURE__*/function(_React$Component){function WindowManager(){var _this;_classCallCheck(this,WindowManager);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,WindowManager,[].concat(args));_defineProperty(_this,"renderIframeDialog",function(key,data){var extraControls=[];if(_this.boolVal(data.options.print,true)!==false){extraControls.push({icon:"print",callback:function callback(){return _this.printIframe(key)}})}var dockable=["left","right","top","bottom"].includes(data.options.dockable)?data.options.dockable:_this.boolVal(data.options.dockable);var docked=_this.boolVal(data.options.docked)!==false;var splitScreenWhenDocked=_this.boolVal(data.options.splitScreenWhenDocked)!==false;return/*#__PURE__*/React.createElement(ResizeableWindow,{baseZIndex:data.options.zIndex||10,dockable:dockable||docked,extraControls:extraControls,icon:data.options.icon||"",initialHeight:data.options.h||480,initialWidth:data.options.w||640,initiallyDocked:docked,key:key,onClose:function onClose(){return _this.closeWindow(key)},splitScreenWhenDocked:splitScreenWhenDocked,title:LocaleUtils.tr(data.options.title||"windows."+key)},/*#__PURE__*/React.createElement("iframe",{className:"windows-iframe-dialog-body",name:key,role:"body",src:data.url}))});_defineProperty(_this,"renderNotification",function(key,data){var className="windows-notification-info";if(data.notificationType===NotificationType.WARN){className="windows-notification-warn"}else if(data.notificationType===NotificationType.ERROR){className="windows-notification-error"}return/*#__PURE__*/React.createElement("div",{className:className,key:key},/*#__PURE__*/React.createElement("div",null,data.text),/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{icon:"remove",onClick:function onClick(){return _this.closeWindow(key)},size:"large"})))});_defineProperty(_this,"closeWindow",function(key){_this.props.closeWindow(key)});_defineProperty(_this,"printIframe",function(key){if(window.frames[key]){window.frames[key].focus();window.frames[key].print()}});_defineProperty(_this,"boolVal",function(value){var delft=arguments.length>1&&arguments[1]!==undefined?arguments[1]:false;if(value===undefined||value===null){return delft}var textVal=(""+value).toLowerCase();if(textVal===""){return delft}return["0","false"].includes(textVal)?false:true});_defineProperty(_this,"get",function(obj,key,deflt){if(obj[key]===undefined){return deflt}return obj[key]});return _this}_inherits(WindowManager,_React$Component);return _createClass(WindowManager,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){if(this.props.currentTheme!==prevProps.currentTheme){this.props.closeAllWindows()}}},{key:"render",value:function render(){var _this2=this;var notificationIndex=0;return[].concat(_toConsumableArray(Object.entries(this.props.windows).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],data=_ref2[1];if(data.type==="iframedialog"){return _this2.renderIframeDialog(key,data)}return null})),[/*#__PURE__*/React.createElement("div",{className:"windows-notification-container",key:"notifications-container"},Object.entries(this.props.windows).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],data=_ref4[1];if(data.type==="notification"){return _this2.renderNotification(key,data,notificationIndex++)}else{return null}}))])}}])}(React.Component);_defineProperty(WindowManager,"propTypes",{closeAllWindows:PropTypes.func,closeWindow:PropTypes.func,currentTheme:PropTypes.object,windows:PropTypes.object});var selector=function selector(state){return{windows:state.windows.entries,currentTheme:state.theme.current}};export default connect(selector,{closeWindow:closeWindow,closeAllWindows:closeAllWindows})(WindowManager);
@@ -4,13 +4,16 @@ 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 LocaleUtils from"../../utils/LocaleUtils";import VectorLayerUtils from"../../utils/VectorLayerUtils";import SideBar from"../SideBar";import Spinner from"../widgets/Spinner";import Tiles3DStyle from"./utils/Tiles3DStyle";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",minimized:false,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});_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 LocaleUtils from"../../utils/LocaleUtils";import VectorLayerUtils from"../../utils/VectorLayerUtils";import SideBar from"../SideBar";import Spinner from"../widgets/Spinner";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",minimized:false,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});_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
8
  _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();if(_this.state.selectedFormat==="model/gltf+json"){_this.exportToGltf()}});_defineProperty(_this,"exportToGltf",function(){_this.setState({exporting:true});var bbox=VectorLayerUtils.computeFeatureBBox({type:"Polygon",coordinates:_this.state.exportPolygon});// Create a bounding box in world space
9
9
  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
10
- 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.applyMatrix4(c.matrixWorld);if(!selectionBox.intersectsBox(bbox)){return}var batchidAttr=c.geometry.getAttribute("_batchid");var posAttr=c.geometry.getAttribute("position");var norAttr=c.geometry.getAttribute("normal");var batches={};batchidAttr.array.forEach(function(batchId,idx){var _batches$batchId$posi,_batches$batchId$norm;if(!batches[batchId]){batches[batchId]={position:[],normal:[],bbox:new Box3}}var pos=posAttr.array.slice(3*idx,3*idx+3);var nor=norAttr.array.slice(3*idx,3*idx+3);(_batches$batchId$posi=batches[batchId].position).push.apply(_batches$batchId$posi,_toConsumableArray(pos));(_batches$batchId$norm=batches[batchId].normal).push.apply(_batches$batchId$norm,_toConsumableArray(nor));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)){// Get batch table object
10
+ 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.applyMatrix4(c.matrixWorld);if(!selectionBox.intersectsBox(bbox)){return}var batchidAttr=c.geometry.getAttribute("_batchid");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)){// Get batch table object
11
11
  var batchTableObject=c;while(!batchTableObject.batchTable){batchTableObject=batchTableObject.parent}// Express coordinates wrt center of batch object bbox
12
12
  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
13
- var material=new MeshStandardMaterial({color:Tiles3DStyle.getBatchColor(batchTableObject,batchId)});var geometry=new BufferGeometry;geometry.setAttribute("position",new Float32BufferAttribute(batch.position,3));geometry.setAttribute("normal",new Float32BufferAttribute(batch.normal,3));var mesh=new Mesh(geometry,material);mesh.applyMatrix4(c.matrixWorld.clone().multiply(new Matrix4().makeTranslation(offset)));// Include attribute from batch table
13
+ 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));
14
+ // material.vertexColors = batch.color !== null;
15
+ // material.transparent = batch.colorStride === 4;
16
+ (_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
14
17
  Object.assign(mesh.userData,batchTableObject.batchTable.getDataFromId(batchId));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
15
18
  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
16
19
  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
@@ -1,13 +1,13 @@
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)}/**
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)}/**
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 isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{BufferGeometry,Float32BufferAttribute,Mesh,MeshStandardMaterial,Raycaster,Vector2}from"three";import LocaleUtils from"../../utils/LocaleUtils";import ResizeableWindow from"../ResizeableWindow";import"../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("mouseup",_this.identify,{once:true});ev.view.addEventListener("mousemove",function(){ev.view.removeEventListener("mouseup",_this.identify)},{once:true})});_defineProperty(_this,"identify",function(ev){if(_this.props.identifyEnabled!==true){return}_this.clear();// Setup raycaster
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 LocaleUtils from"../../utils/LocaleUtils";import ResizeableWindow from"../ResizeableWindow";import"../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("mouseup",_this.identify,{once:true});ev.view.addEventListener("mousemove",function(){ev.view.removeEventListener("mouseup",_this.identify)},{once:true})});_defineProperty(_this,"identify",function(ev){if(_this.props.identifyEnabled!==true){return}_this.clear();// Setup raycaster
8
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");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
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
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;_this.setState({pickAttrs:batchTable.getDataFromId(pickBatchId)})});_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
11
+ var batchTableObject=pick.object;while(!batchTableObject.batchTable){batchTableObject=batchTableObject.parent}var batchTable=batchTableObject.batchTable;var batchAttrs=batchTable.getDataFromId(pickBatchId);if(_this.props.tileInfoServiceUrl){var url=_this.props.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
12
12
  _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("mousedown",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,"propTypes",{identifyEnabled:PropTypes.bool,sceneContext:PropTypes.object});export default connect(function(state){return{identifyEnabled:state.task.identifyEnabled}},{})(Identify3D);
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("mousedown",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,"propTypes",{identifyEnabled:PropTypes.bool,sceneContext:PropTypes.object,tileInfoServiceUrl:PropTypes.string});export default connect(function(state){return{identifyEnabled:state.task.identifyEnabled}},{})(Identify3D);
@@ -4,26 +4,27 @@ 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 Instance from"@giro3d/giro3d/core/Instance.js";import Coordinates from"@giro3d/giro3d/core/geographic/Coordinates";import Extent from"@giro3d/giro3d/core/geographic/Extent.js";import ElevationLayer from"@giro3d/giro3d/core/layer/ElevationLayer.js";import FeatureCollection from"@giro3d/giro3d/entities/FeatureCollection.js";import Map from"@giro3d/giro3d/entities/Map.js";import Tiles3D from"@giro3d/giro3d/entities/Tiles3D.js";import Inspector from"@giro3d/giro3d/gui/Inspector.js";import GeoTIFFSource from"@giro3d/giro3d/sources/GeoTIFFSource.js";import{fromUrl}from"geotiff";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{Vector2,CubeTextureLoader,Group,Raycaster,Mesh}from"three";import{GLTFExporter}from"three/addons/exporters/GLTFExporter.js";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../../actions/layers";import{setCurrentTask}from"../../actions/task";import{BackgroundSwitcher}from"../../plugins/BackgroundSwitcher";import ConfigUtils from"../../utils/ConfigUtils";import CoordinatesUtils from"../../utils/CoordinatesUtils";import{registerPermalinkDataStoreHook,unregisterPermalinkDataStoreHook,UrlParams}from"../../utils/PermaLinkUtils";import BottomBar3D from"./BottomBar3D";import Compare3D from"./Compare3D";import Draw3D from"./Draw3D";import ExportObjects3D from"./ExportObjects3D";import HideObjects3D from"./HideObjects3D";import Identify3D from"./Identify3D";import LayerTree3D from"./LayerTree3D";import Map3DLight from"./Map3DLight";import MapControls3D from"./MapControls3D";import MapExport3D from"./MapExport3D";import Measure3D from"./Measure3D";import OverviewMap3D from"./OverviewMap3D";import TopBar3D from"./TopBar3D";import View3DSwitcher from"./View3DSwitcher";import LayerRegistry from"./layers/index";import Tiles3DStyle from"./utils/Tiles3DStyle";import"./style/Map3D.css";var UnloadWrapper=/*#__PURE__*/function(_React$Component){function UnloadWrapper(){var _this;_classCallCheck(this,UnloadWrapper);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,UnloadWrapper,[].concat(args));_defineProperty(_this,"onUnload",function(el){if(!el){_this.props.onUnload(_this.props.sceneId)}});return _this}_inherits(UnloadWrapper,_React$Component);return _createClass(UnloadWrapper,[{key:"render",value:function render(){return/*#__PURE__*/React.createElement("div",null,this.props.children,/*#__PURE__*/React.createElement("span",{ref:this.onUnload}))}}])}(React.Component);_defineProperty(UnloadWrapper,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),onUnload:PropTypes.func,sceneId:PropTypes.string});var Map3D=/*#__PURE__*/function(_React$Component2){function Map3D(props){var _this2;_classCallCheck(this,Map3D);_this2=_callSuper(this,Map3D,[props]);_defineProperty(_this2,"state",{sceneContext:_objectSpread(_objectSpread({},Map3D.defaultSceneState),{},{addLayer:function addLayer(layer){},getLayer:function getLayer(layerId){},removeLayer:function removeLayer(layerId){},updateColorLayer:function updateColorLayer(layerId,options){},addSceneObject:function addSceneObject(objectId,object){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{}},getSceneObject:function getSceneObject(objectId){},removeSceneObject:function removeSceneObject(objectId){},updateSceneObject:function updateSceneObject(objectId,options){},getMap:function getMap(){},setViewToExtent:function setViewToExtent(bounds,angle){},getTerrainHeightFromDTM:function getTerrainHeightFromDTM(scenePos){},getTerrainHeightFromMap:function getTerrainHeightFromMap(scenePos){},getSceneIntersection:function getSceneIntersection(x,y){}}),sceneId:null});_defineProperty(_this2,"applyBaseLayer",function(){var baseLayer=_this2.state.sceneContext.baseLayers.find(function(e){return e.visibility===true});_this2.removeLayer("__baselayer");if(!baseLayer){return}var layerCreator=LayerRegistry[baseLayer.type];if(layerCreator!==null&&layerCreator!==void 0&&layerCreator.create3d){var layer3d=layerCreator.create3d(baseLayer,_this2.state.sceneContext.mapCrs);_this2.addLayer("__baselayer",layer3d);_this2.map.insertLayerAfter(layer3d,null)}});_defineProperty(_this2,"setBaseLayer",function(layer,visibility){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{baseLayers:state.sceneContext.baseLayers.map(function(entry){return _objectSpread(_objectSpread({},entry),{},{visibility:entry.name===layer.name?visibility:false})})})}})});_defineProperty(_this2,"collectColorLayers",function(prevColorLayers){return _this2.props.layers.reduce(function(colorLayers,layer){var _prevOptions$visibili,_prevOptions$opacity,_prevOptions$extrusio;if(layer.role!==LayerRole.THEME&&layer.role!==LayerRole.USERLAYER){return colorLayers}var layerCreator=LayerRegistry[layer.type];if(!layerCreator||!layerCreator.create3d){return colorLayers}var prevOptions=prevColorLayers[layer.uuid];colorLayers[layer.uuid]=_objectSpread(_objectSpread({},layer),{},{visibility:(_prevOptions$visibili=prevOptions===null||prevOptions===void 0?void 0:prevOptions.visibility)!==null&&_prevOptions$visibili!==void 0?_prevOptions$visibili:false,opacity:(_prevOptions$opacity=prevOptions===null||prevOptions===void 0?void 0:prevOptions.opacity)!==null&&_prevOptions$opacity!==void 0?_prevOptions$opacity:255,extrusionHeight:(_prevOptions$extrusio=prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)!==null&&_prevOptions$extrusio!==void 0?_prevOptions$extrusio:["vector","wfs"].includes(layer.type)?0:undefined});return colorLayers},{})});_defineProperty(_this2,"applyColorLayerUpdates",function(colorLayers,prevColorLayers){// Add-update new layers
7
+ */import React from"react";import{connect}from"react-redux";import Instance from"@giro3d/giro3d/core/Instance.js";import Coordinates from"@giro3d/giro3d/core/geographic/Coordinates";import Extent from"@giro3d/giro3d/core/geographic/Extent.js";import ElevationLayer from"@giro3d/giro3d/core/layer/ElevationLayer.js";import FeatureCollection from"@giro3d/giro3d/entities/FeatureCollection.js";import Map from"@giro3d/giro3d/entities/Map.js";import Tiles3D from"@giro3d/giro3d/entities/Tiles3D.js";import Inspector from"@giro3d/giro3d/gui/Inspector.js";import GeoTIFFSource from"@giro3d/giro3d/sources/GeoTIFFSource.js";import axios from"axios";import{fromUrl}from"geotiff";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{Vector2,CubeTextureLoader,Group,Raycaster,Mesh}from"three";import{GLTFExporter}from"three/addons/exporters/GLTFExporter.js";import{GLTFLoader}from"three/addons/loaders/GLTFLoader";import{v4 as uuidv4}from"uuid";import{LayerRole}from"../../actions/layers";import{setCurrentTask}from"../../actions/task";import{BackgroundSwitcher}from"../../plugins/BackgroundSwitcher";import ConfigUtils from"../../utils/ConfigUtils";import CoordinatesUtils from"../../utils/CoordinatesUtils";import MiscUtils from"../../utils/MiscUtils";import{registerPermalinkDataStoreHook,unregisterPermalinkDataStoreHook,UrlParams}from"../../utils/PermaLinkUtils";import BottomBar3D from"./BottomBar3D";import Compare3D from"./Compare3D";import Draw3D from"./Draw3D";import ExportObjects3D from"./ExportObjects3D";import HideObjects3D from"./HideObjects3D";import Identify3D from"./Identify3D";import LayerTree3D from"./LayerTree3D";import Map3DLight from"./Map3DLight";import MapControls3D from"./MapControls3D";import MapExport3D from"./MapExport3D";import Measure3D from"./Measure3D";import OverviewMap3D from"./OverviewMap3D";import TopBar3D from"./TopBar3D";import View3DSwitcher from"./View3DSwitcher";import LayerRegistry from"./layers/index";import Tiles3DStyle from"./utils/Tiles3DStyle";import"./style/Map3D.css";var UnloadWrapper=/*#__PURE__*/function(_React$Component){function UnloadWrapper(){var _this;_classCallCheck(this,UnloadWrapper);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,UnloadWrapper,[].concat(args));_defineProperty(_this,"onUnload",function(el){if(!el){_this.props.onUnload(_this.props.sceneId)}});return _this}_inherits(UnloadWrapper,_React$Component);return _createClass(UnloadWrapper,[{key:"render",value:function render(){return/*#__PURE__*/React.createElement("div",null,this.props.children,/*#__PURE__*/React.createElement("span",{ref:this.onUnload}))}}])}(React.Component);_defineProperty(UnloadWrapper,"propTypes",{children:PropTypes.oneOfType([PropTypes.node,PropTypes.func]),onUnload:PropTypes.func,sceneId:PropTypes.string});var Map3D=/*#__PURE__*/function(_React$Component2){function Map3D(props){var _this2;_classCallCheck(this,Map3D);_this2=_callSuper(this,Map3D,[props]);_defineProperty(_this2,"state",{sceneContext:_objectSpread(_objectSpread({},Map3D.defaultSceneState),{},{addLayer:function addLayer(layer){},getLayer:function getLayer(layerId){},removeLayer:function removeLayer(layerId){},updateColorLayer:function updateColorLayer(layerId,options){},addSceneObject:function addSceneObject(objectId,object){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{}},getSceneObject:function getSceneObject(objectId){},removeSceneObject:function removeSceneObject(objectId){},updateSceneObject:function updateSceneObject(objectId,options){},getMap:function getMap(){},setViewToExtent:function setViewToExtent(bounds,angle){},getTerrainHeightFromDTM:function getTerrainHeightFromDTM(scenePos){},getTerrainHeightFromMap:function getTerrainHeightFromMap(scenePos){},getSceneIntersection:function getSceneIntersection(x,y){}}),sceneId:null});_defineProperty(_this2,"applyBaseLayer",function(){var baseLayer=_this2.state.sceneContext.baseLayers.find(function(e){return e.visibility===true});_this2.removeLayer("__baselayer");if(!baseLayer){return}var layerCreator=LayerRegistry[baseLayer.type];if(layerCreator!==null&&layerCreator!==void 0&&layerCreator.create3d){var layer3d=layerCreator.create3d(baseLayer,_this2.state.sceneContext.mapCrs);_this2.addLayer("__baselayer",layer3d);_this2.map.insertLayerAfter(layer3d,null)}});_defineProperty(_this2,"setBaseLayer",function(layer,visibility){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{baseLayers:state.sceneContext.baseLayers.map(function(entry){return _objectSpread(_objectSpread({},entry),{},{visibility:entry.name===layer.name?visibility:false})})})}})});_defineProperty(_this2,"collectColorLayers",function(prevColorLayers){return _this2.props.layers.reduce(function(colorLayers,layer){var _prevOptions$visibili,_prevOptions$opacity,_prevOptions$extrusio;if(layer.role!==LayerRole.THEME&&layer.role!==LayerRole.USERLAYER){return colorLayers}var layerCreator=LayerRegistry[layer.type];if(!layerCreator||!layerCreator.create3d){return colorLayers}var prevOptions=prevColorLayers[layer.uuid];colorLayers[layer.uuid]=_objectSpread(_objectSpread({},layer),{},{visibility:(_prevOptions$visibili=prevOptions===null||prevOptions===void 0?void 0:prevOptions.visibility)!==null&&_prevOptions$visibili!==void 0?_prevOptions$visibili:false,opacity:(_prevOptions$opacity=prevOptions===null||prevOptions===void 0?void 0:prevOptions.opacity)!==null&&_prevOptions$opacity!==void 0?_prevOptions$opacity:255,extrusionHeight:(_prevOptions$extrusio=prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)!==null&&_prevOptions$extrusio!==void 0?_prevOptions$extrusio:["vector","wfs"].includes(layer.type)?0:undefined});return colorLayers},{})});_defineProperty(_this2,"applyColorLayerUpdates",function(colorLayers,prevColorLayers){// Add-update new layers
8
8
  var layerBelow=_this2.getLayer("__baselayer");Object.entries(colorLayers).reverse().forEach(function(_ref){var _ref2=_slicedToArray(_ref,2),layerId=_ref2[0],options=_ref2[1];var prevOptions=prevColorLayers[layerId];var layerCreator=LayerRegistry[options.type];var mapLayer=_this2.getLayer(layerId);if(mapLayer){layerCreator.update3d(mapLayer.source,options,prevOptions,_this2.state.sceneContext.mapCrs)}else{mapLayer=layerCreator.create3d(options,_this2.state.sceneContext.mapCrs);_this2.addLayer(layerId,mapLayer)}_this2.map.insertLayerAfter(mapLayer,layerBelow);mapLayer.visible=options.visibility;mapLayer.opacity=options.opacity/255;layerBelow=mapLayer;if(options.extrusionHeight>0){_this2.createUpdateExtrudedLayer(mapLayer,options,options.features!==(prevOptions===null||prevOptions===void 0?void 0:prevOptions.features))}else if((prevOptions===null||prevOptions===void 0?void 0:prevOptions.extrusionHeight)>0){_this2.removeExtrudedLayer(options.uuid)}});// Remove old layers
9
9
  Object.entries(prevColorLayers).forEach(function(_ref3){var _ref4=_slicedToArray(_ref3,2),layerId=_ref4[0],options=_ref4[1];if(!(layerId in colorLayers)){if(options.extrusionHeight){_this2.removeExtrudedLayer(options.uuid)}_this2.removeLayer(layerId)}});_this2.instance.notifyChange(_this2.map)});_defineProperty(_this2,"createUpdateExtrudedLayer",function(mapLayer,options){var _options$features,_options$features$red;var forceCreate=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var bounds=options.bbox.bounds;var extent=new Extent(options.bbox.crs,bounds[0],bounds[2],bounds[1],bounds[3]);var objId=options.uuid+":extruded";var makeColor=function makeColor(c){if(Array.isArray(c)){return c[0]<<16|c[1]<<8|c[2]}else if(typeof c==="string"){return parseInt(c.replace("#",""),16)}else{return c}};var obj=_this2.objectMap[objId];if(!obj||forceCreate){var _options$color;if(obj){_this2.instance.remove(obj)}var layercolor=makeColor((_options$color=options.color)!==null&&_options$color!==void 0?_options$color:"#FF0000");obj=new FeatureCollection({source:mapLayer.source.source,extent:extent,elevation:function elevation(feature){var coordinates=feature.getGeometry().getCoordinates();while(Array.isArray(coordinates[0])){coordinates=coordinates[0]}return coordinates[2]||_this2.getTerrainHeightFromMap(coordinates)||0},extrusionOffset:function extrusionOffset(){return obj.userData.extrusionHeight},style:function style(feature){var _obj$userData$feature,_obj$userData$feature2;return(_obj$userData$feature=(_obj$userData$feature2=obj.userData.featureStyles)===null||_obj$userData$feature2===void 0?void 0:_obj$userData$feature2[feature.getId()])!==null&&_obj$userData$feature!==void 0?_obj$userData$feature:{fill:{color:layercolor,shading:true}}}});obj.castShadow=true;obj.receiveShadow=true;_this2.instance.add(obj);_this2.objectMap[objId]=obj}obj.userData.extrusionHeight=options.extrusionHeight;obj.userData.featureStyles=(_options$features=options.features)===null||_options$features===void 0||(_options$features$red=_options$features.reduce)===null||_options$features$red===void 0?void 0:_options$features$red.call(_options$features,function(res,feature){return _objectSpread(_objectSpread({},res),{},_defineProperty({},feature.id,{fill:{color:makeColor(feature.styleOptions.fillColor),shading:true}}))},{});obj.traverse(function(mesh){mesh.castShadow=true;mesh.receiveShadow=true});obj.opacity=mapLayer.opacity;obj.visible=mapLayer.visible;obj.updateStyles()});_defineProperty(_this2,"removeExtrudedLayer",function(layerId){var objId=layerId+":extruded";if(_this2.objectMap[objId]){_this2.instance.remove(_this2.objectMap[objId]);delete _this2.objectMap[objId]}_this2.instance.notifyChange()});_defineProperty(_this2,"applySceneObjectUpdates",function(sceneObjects){Object.entries(sceneObjects).forEach(function(_ref5){var _ref6=_slicedToArray(_ref5,2),objectId=_ref6[0],options=_ref6[1];var object=_this2.objectMap[objectId];object.visible=options.visibility&&options.opacity>0;if(object.opacity!==undefined){object.opacity=options.opacity/255}else{object.traverse(function(child){if(child instanceof Mesh){child.material.transparent=options.opacity<255;child.material.opacity=options.opacity/255;child.material.needsUpdate=true}})}_this2.instance.notifyChange(object)})});_defineProperty(_this2,"addLayer",function(layerId,layer){layer.userData.layerId=layerId;_this2.map.addLayer(layer)});_defineProperty(_this2,"getLayer",function(layerId){var _this2$map$getLayers$;return(_this2$map$getLayers$=_this2.map.getLayers(function(l){return l.userData.layerId===layerId})[0])!==null&&_this2$map$getLayers$!==void 0?_this2$map$getLayers$:null});_defineProperty(_this2,"removeLayer",function(layerId){_this2.map.getLayers(function(l){return l.userData.layerId===layerId}).forEach(function(layer){_this2.map.removeLayer(layer,{dispose:true})})});_defineProperty(_this2,"updateColorLayer",function(layerId,options){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{colorLayers:_objectSpread(_objectSpread({},state.sceneContext.colorLayers),{},_defineProperty({},layerId,_objectSpread(_objectSpread({},state.sceneContext.colorLayers[layerId]),options)))})}})});_defineProperty(_this2,"addSceneObject",function(objectId,object){var options=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{};_this2.sceneObjectGroup.add(object);_this2.objectMap[objectId]=object;_this2.setState(function(state){var objectState=_objectSpread({visibility:true,opacity:255,layertree:false},options);return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:_objectSpread(_objectSpread({},state.sceneContext.sceneObjects),{},_defineProperty({},objectId,objectState))})}})});_defineProperty(_this2,"getSceneObject",function(objectId){return _this2.objectMap[objectId]});_defineProperty(_this2,"removeSceneObject",function(objectId){if(!_this2.objectMap[objectId]){return}_this2.sceneObjectGroup.remove(_this2.objectMap[objectId]);delete _this2.objectMap[objectId];_this2.setState(function(state){var newSceneObjects=_objectSpread({},state.sceneContext.sceneObjects);delete newSceneObjects[objectId];return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:newSceneObjects})}})});_defineProperty(_this2,"updateSceneObject",function(objectId,options){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:_objectSpread(_objectSpread({},state.sceneContext.sceneObjects),{},_defineProperty({},objectId,_objectSpread(_objectSpread({},state.sceneContext.sceneObjects[objectId]),options)))})}})});_defineProperty(_this2,"getMap",function(){return _this2.map});_defineProperty(_this2,"setupContainer",function(el){if(el){_this2.container=el;_this2.setupInstance()}});_defineProperty(_this2,"setupInstance",function(){var _this2$props$theme$ma,_this2$props$theme$ma2,_this2$props$theme$ma3,_this2$props$theme$ma6,_this2$props$theme$ma7;if(_this2.instance){_this2.disposeInstance()}var projection=_this2.props.theme.mapCrs;// Setup instance
10
10
  _this2.instance=new Instance({target:_this2.container,crs:projection,renderer:{clearColor:0,preserveDrawingBuffer:true}});_this2.sceneObjectGroup=new Group;_this2.instance.add(_this2.sceneObjectGroup);// Setup map
11
11
  var bounds=CoordinatesUtils.reprojectBbox(_this2.props.theme.initialBbox.bounds,_this2.props.theme.initialBbox.crs,projection);var extent=new Extent(projection,bounds[0],bounds[2],bounds[1],bounds[3]);_this2.map=new Map({extent:extent,backgroundColor:"white"});_this2.instance.add(_this2.map);// Setup camera
12
12
  var center=extent.center();_this2.instance.view.camera.position.set(center.x,center.y,0.5*(extent.east-extent.west));// Skybox
13
13
  var cubeTextureLoader=new CubeTextureLoader;cubeTextureLoader.setPath(ConfigUtils.getAssetsPath()+"/3d/skybox/");var cubeTexture=cubeTextureLoader.load(["px.jpg","nx.jpg","py.jpg","ny.jpg","pz.jpg","nz.jpg"]);_this2.instance.scene.background=cubeTexture;// Setup elevation
14
- var demUrl=(_this2$props$theme$ma=(_this2$props$theme$ma2=_this2.props.theme.map3d)===null||_this2$props$theme$ma2===void 0||(_this2$props$theme$ma2=_this2$props$theme$ma2.dtm)===null||_this2$props$theme$ma2===void 0?void 0:_this2$props$theme$ma2.url)!==null&&_this2$props$theme$ma!==void 0?_this2$props$theme$ma:"";if(demUrl.startsWith(":")){demUrl=location.href.split("?")[0]+ConfigUtils.getAssetsPath()+demUrl.substr(1)}var demCrs=((_this2$props$theme$ma3=_this2.props.theme.map3d)===null||_this2$props$theme$ma3===void 0||(_this2$props$theme$ma3=_this2$props$theme$ma3.dtm)===null||_this2$props$theme$ma3===void 0?void 0:_this2$props$theme$ma3.crs)||"EPSG:3857";if(demUrl){var _this2$props$theme$ma4,_this2$props$theme$ma5;var demSource=new GeoTIFFSource({url:demUrl,crs:demCrs});var demMin=(_this2$props$theme$ma4=_this2.props.theme.map3d.dtm.min)!==null&&_this2$props$theme$ma4!==void 0?_this2$props$theme$ma4:undefined;var demMax=(_this2$props$theme$ma5=_this2.props.theme.map3d.dtm.max)!==null&&_this2$props$theme$ma5!==void 0?_this2$props$theme$ma5:undefined;var elevationLayer=new ElevationLayer({name:"dem",extent:extent,source:demSource,minmax:demMin!==undefined&&demMax!==undefined?{demMin:demMin,demMax:demMax}:undefined});_this2.addLayer("__dtm",elevationLayer)}// Collect baselayers
14
+ var demUrl=MiscUtils.resolveAssetsPath((_this2$props$theme$ma=(_this2$props$theme$ma2=_this2.props.theme.map3d)===null||_this2$props$theme$ma2===void 0||(_this2$props$theme$ma2=_this2$props$theme$ma2.dtm)===null||_this2$props$theme$ma2===void 0?void 0:_this2$props$theme$ma2.url)!==null&&_this2$props$theme$ma!==void 0?_this2$props$theme$ma:"");var demCrs=((_this2$props$theme$ma3=_this2.props.theme.map3d)===null||_this2$props$theme$ma3===void 0||(_this2$props$theme$ma3=_this2$props$theme$ma3.dtm)===null||_this2$props$theme$ma3===void 0?void 0:_this2$props$theme$ma3.crs)||"EPSG:3857";if(demUrl){var _this2$props$theme$ma4,_this2$props$theme$ma5;var demSource=new GeoTIFFSource({url:demUrl,crs:demCrs});var demMin=(_this2$props$theme$ma4=_this2.props.theme.map3d.dtm.min)!==null&&_this2$props$theme$ma4!==void 0?_this2$props$theme$ma4:undefined;var demMax=(_this2$props$theme$ma5=_this2.props.theme.map3d.dtm.max)!==null&&_this2$props$theme$ma5!==void 0?_this2$props$theme$ma5:undefined;var elevationLayer=new ElevationLayer({name:"dem",extent:extent,source:demSource,minmax:demMin!==undefined&&demMax!==undefined?{demMin:demMin,demMax:demMax}:undefined});_this2.addLayer("__dtm",elevationLayer)}// Collect baselayers
15
15
  var visibleBaseLayer=null;var baseLayers=(((_this2$props$theme$ma6=_this2.props.theme.map3d)===null||_this2$props$theme$ma6===void 0?void 0:_this2$props$theme$ma6.basemaps)||[]).map(function(e){var baseLayer=_objectSpread(_objectSpread({},_this2.props.layers.find(function(bl){return bl.name===e.name})),{},{visibility:e.visibility===true});if(baseLayer.visibility){visibleBaseLayer=baseLayer}return baseLayer});if(visibleBaseLayer){_this2.setBaseLayer(visibleBaseLayer,true)}// Collect color layers
16
16
  var colorLayers=_this2.collectColorLayers([]);// Add 3d tiles
17
- _this2.objectMap={};var sceneObjects={};(((_this2$props$theme$ma7=_this2.props.theme.map3d)===null||_this2$props$theme$ma7===void 0?void 0:_this2$props$theme$ma7.tiles3d)||[]).forEach(function(entry){var _entry$title;var tilesUrl=entry.url;if(tilesUrl.startsWith(":")){tilesUrl=location.href.split("?")[0]+ConfigUtils.getAssetsPath()+tilesUrl.substr(1)}var tiles=new Tiles3D({url:tilesUrl});tiles.tiles.addEventListener("load-model",function(_ref7){var scene=_ref7.scene;return Tiles3DStyle.applyDeclarativeStyle(scene,entry)});tiles.castShadow=true;tiles.receiveShadow=true;tiles.userData.layertree=true;_this2.instance.add(tiles);_this2.objectMap[entry.name]=tiles;sceneObjects[entry.name]={visibility:true,opacity:255,layertree:true,title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:entry.name}});_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{scene:_this2.instance,map:_this2.map,mapCrs:projection,dtmUrl:demUrl,dtmCrs:demCrs,baseLayers:baseLayers,colorLayers:colorLayers,sceneObjects:sceneObjects}),sceneId:uuidv4()}});// Inspector
18
- if(["1","true"].includes((UrlParams.getParam("inspector")||"").toLowerCase())){_this2.inspector=new Inspector(_this2.container.previousElementSibling,_this2.instance)}});_defineProperty(_this2,"disposeInstance",function(){if(_this2.inspector){_this2.inspector.detach()}_this2.map.dispose({disposeLayers:true});Object.values(_this2.objectMap).forEach(function(object){_this2.instance.remove(object)});_this2.instance.dispose();_this2.inspector=null;_this2.map=null;_this2.objectMap={};_this2.sceneObjectGroup=null;_this2.instance=null;_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),Map3D.defaultSceneState)}});_this2.props.setCurrentTask(null)});_defineProperty(_this2,"onUnload",function(key){// Ensure scene has not already been disposed
17
+ _this2.objectMap={};var sceneObjects={};(((_this2$props$theme$ma7=_this2.props.theme.map3d)===null||_this2$props$theme$ma7===void 0?void 0:_this2$props$theme$ma7.tiles3d)||[]).forEach(function(entry){if(entry.tilesetStyleUrl){axios.get(MiscUtils.resolveAssetsPath(entry.tilesetStyleUrl)).then(function(response){_this2.add3dTiles(_objectSpread(_objectSpread({},entry),{},{tilesetStyle:response.data}))})["catch"](function(){/* eslint-disable-next-line */console.warn("Failed to load tilset style");_this2.add3dTiles(entry)})}else{// Delay one cycle, to ensure setState below executed
18
+ setTimeout(function(){_this2.add3dTiles(entry)},0)}});_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{scene:_this2.instance,map:_this2.map,mapCrs:projection,dtmUrl:demUrl,dtmCrs:demCrs,baseLayers:baseLayers,colorLayers:colorLayers,sceneObjects:sceneObjects}),sceneId:uuidv4()}});// Inspector
19
+ if(["1","true"].includes((UrlParams.getParam("inspector")||"").toLowerCase())){_this2.inspector=new Inspector(_this2.container.previousElementSibling,_this2.instance)}});_defineProperty(_this2,"add3dTiles",function(entry){var tiles=new Tiles3D({url:MiscUtils.resolveAssetsPath(entry.url),errorTarget:32});tiles.tiles.addEventListener("load-model",function(_ref7){var _entry$idAttr;var scene=_ref7.scene;scene.userData.tilesetName=entry.name;scene.userData.batchIdAttr=(_entry$idAttr=entry.idAttr)!==null&&_entry$idAttr!==void 0?_entry$idAttr:"id";Tiles3DStyle.handleModelLoad(scene,entry)});tiles.tiles.addEventListener("tile-visibility-change",function(_ref8){var scene=_ref8.scene,visible=_ref8.visible;Tiles3DStyle.handleTileVisibilityChange(scene,visible)});tiles.castShadow=true;tiles.receiveShadow=true;tiles.userData.layertree=true;_this2.instance.add(tiles);_this2.objectMap[entry.name]=tiles;_this2.setState(function(state){var _entry$title;var objectState={visibility:true,opacity:255,layertree:true,title:(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:entry.name};return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{sceneObjects:_objectSpread(_objectSpread({},state.sceneContext.sceneObjects),{},_defineProperty({},entry.name,objectState))})}})});_defineProperty(_this2,"disposeInstance",function(){if(_this2.inspector){_this2.inspector.detach()}_this2.map.dispose({disposeLayers:true});Object.values(_this2.objectMap).forEach(function(object){_this2.instance.remove(object)});_this2.instance.dispose();_this2.inspector=null;_this2.map=null;_this2.objectMap={};_this2.sceneObjectGroup=null;_this2.instance=null;_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),Map3D.defaultSceneState)}});_this2.props.setCurrentTask(null)});_defineProperty(_this2,"onUnload",function(key){// Ensure scene has not already been disposed
19
20
  if(_this2.state.sceneId===key){_this2.disposeInstance()}});_defineProperty(_this2,"setupControls",function(instance){_this2.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{setViewToExtent:instance===null||instance===void 0?void 0:instance.setViewToExtent})}},_this2.props.onMapInitialized)});_defineProperty(_this2,"getTerrainHeightFromDTM",function(scenePos){var returnArray=true;if(!Array.isArray(scenePos[0])){returnArray=false;scenePos=[scenePos]}var dtmPos=scenePos.map(function(p){return CoordinatesUtils.reproject(p,_this2.state.sceneContext.mapCrs,_this2.state.sceneContext.dtmCrs)});var dtmExt=[Infinity,Infinity,-Infinity,-Infinity];dtmPos.forEach(function(p){dtmExt[0]=Math.min(dtmExt[0],p[0]);dtmExt[1]=Math.min(dtmExt[1],p[1]);dtmExt[2]=Math.max(dtmExt[2],p[0]);dtmExt[3]=Math.max(dtmExt[3],p[1])});return new Promise(function(resolve){fromUrl(_this2.state.sceneContext.dtmUrl).then(function(tiff){tiff.getImage().then(function(image){var _image$fileDirectory=image.fileDirectory,ModelTiepoint=_image$fileDirectory.ModelTiepoint,ModelPixelScale=_image$fileDirectory.ModelPixelScale;// Extract scale and tiepoint values
20
- var _ref8=[ModelPixelScale[0],ModelPixelScale[1]],scaleX=_ref8[0],scaleY=_ref8[1];var _ref9=[ModelTiepoint[3],ModelTiepoint[4]],tiepointX=_ref9[0],tiepointY=_ref9[1];// Tiepoint world coordinates
21
+ var _ref9=[ModelPixelScale[0],ModelPixelScale[1]],scaleX=_ref9[0],scaleY=_ref9[1];var _ref10=[ModelTiepoint[3],ModelTiepoint[4]],tiepointX=_ref10[0],tiepointY=_ref10[1];// Tiepoint world coordinates
21
22
  // Calculate pixel indices (rounded to nearest integers)
22
23
  var minPixelX=Math.round((dtmExt[0]-tiepointX)/scaleX);var minPixelY=Math.round((tiepointY-dtmExt[3])/scaleY);// Inverted Y-axis in image
23
24
  var maxPixelY=Math.round((tiepointY-dtmExt[1])/scaleY)+1;// Inverted Y-axis in image
24
25
  var maxPixelX=Math.round((dtmExt[2]-tiepointX)/scaleX)+1;var width=maxPixelX-minPixelX;var height=maxPixelY-minPixelY;image.readRasters({window:[minPixelX,minPixelY,maxPixelX,maxPixelY]}).then(function(raster){if(!returnArray){resolve(raster[0][0])}else{var h=dtmPos.map(function(p){var x=Math.round((p[0]-dtmExt[0])/(dtmExt[2]-dtmExt[0])*(width-1));var y=Math.round((1-(p[1]-dtmExt[1])/(dtmExt[3]-dtmExt[1]))*(height-1));return raster[0][x+y*width]});resolve(h)}})})})})});_defineProperty(_this2,"getTerrainHeightFromMap",function(scenePos){var _elevationResult$samp;var coordinates=new Coordinates(_this2.state.sceneContext.mapCrs,scenePos[0],scenePos[1],0);var elevationResult=_this2.state.sceneContext.map.getElevation({coordinates:coordinates});elevationResult.samples.sort(function(a,b){return b.resolution-a.resolution});return(_elevationResult$samp=elevationResult.samples[0])===null||_elevationResult$samp===void 0?void 0:_elevationResult$samp.elevation});_defineProperty(_this2,"getSceneIntersection",function(x,y){var objects=arguments.length>2&&arguments[2]!==undefined?arguments[2]:true;var raycaster=new Raycaster;var camera=_this2.instance.view.camera;raycaster.setFromCamera(new Vector2(x,y),camera);// Query object intersection
25
- var intersectionObjects=objects?Object.entries(_this2.state.sceneContext.sceneObjects).map(function(_ref10){var _ref11=_slicedToArray(_ref10,2),objId=_ref11[0],options=_ref11[1];if(options.layertree&&options.visibility){var _obj$tiles$group,_obj$tiles;var obj=_this2.objectMap[objId];return(_obj$tiles$group=(_obj$tiles=obj.tiles)===null||_obj$tiles===void 0?void 0:_obj$tiles.group)!==null&&_obj$tiles$group!==void 0?_obj$tiles$group:obj}return null}).filter(Boolean):null;var objInter=objects?raycaster.intersectObjects(intersectionObjects,true)[0]:undefined;// Query highest resolution terrain tile (i.e. tile with no children)
26
+ var intersectionObjects=objects?Object.entries(_this2.state.sceneContext.sceneObjects).map(function(_ref11){var _ref12=_slicedToArray(_ref11,2),objId=_ref12[0],options=_ref12[1];if(options.layertree&&options.visibility){var _obj$tiles$group,_obj$tiles;var obj=_this2.objectMap[objId];return(_obj$tiles$group=(_obj$tiles=obj.tiles)===null||_obj$tiles===void 0?void 0:_obj$tiles.group)!==null&&_obj$tiles$group!==void 0?_obj$tiles$group:obj}return null}).filter(Boolean):null;var objInter=objects?raycaster.intersectObjects(intersectionObjects,true)[0]:undefined;// Query highest resolution terrain tile (i.e. tile with no children)
26
27
  var terrInter=raycaster.intersectObjects([_this2.map.object3d]).filter(function(result){return result.object.children.length===0})[0];// Return closest result
27
- if(objInter&&terrInter){return objInter.distance<terrInter.distance?objInter:terrInter}return objInter!==null&&objInter!==void 0?objInter:terrInter});_defineProperty(_this2,"redrawScene",function(ev){var width=ev.target.innerWidth;var height=ev.target.innerHeight;_this2.instance.renderer.setSize(width,height);_this2.instance.view.camera.aspect=width/height;_this2.instance.view.camera.updateProjectionMatrix();_this2.instance.renderer.render(_this2.instance.scene,_this2.instance.view.camera)});_defineProperty(_this2,"setViewToExtent",function(bounds,rotation){_this2.state.sceneContext.setViewToExtent(bounds,rotation)});_defineProperty(_this2,"store3dState",function(){var promises=Object.entries(_this2.state.sceneContext.sceneObjects).map(function(_ref12){var _ref13=_slicedToArray(_ref12,2),objectId=_ref13[0],entry=_ref13[1];if(!entry.layertree){return null}return new Promise(function(resolve){if(entry.drawGroup){var exporter=new GLTFExporter;exporter.parse(_this2.state.sceneContext.getSceneObject(objectId),function(result){resolve({id:objectId,options:entry,data:result})})}else{resolve({id:objectId,options:entry})}})}).filter(Boolean);return new Promise(function(resolve){Promise.all(promises).then(function(objects){var cameraPos=_this2.state.sceneContext.scene.view.camera.position;var target=_this2.state.sceneContext.scene.view.controls.target;var layers=Object.entries(_this2.state.sceneContext.colorLayers).map(function(_ref14){var _ref15=_slicedToArray(_ref14,2),layerId=_ref15[0],options=_ref15[1];return{id:layerId,options:{visibility:options.visibility,opacity:options.opacity,extrusionHeight:options.extrusionHeight}}});resolve({objects:objects,colorLayers:layers,cameraPos:[cameraPos.x,cameraPos.y,cameraPos.z],center:[target.x,target.y,target.z]})})})});_defineProperty(_this2,"restore3dState",function(data){if(isEmpty(data)){return}(data.objects||[]).forEach(function(item){if(item.data){var loader=new GLTFLoader;loader.parse(item.data,ConfigUtils.getAssetsPath(),function(gltf){gltf.scene.traverse(function(obj){if(obj.isMesh){obj.castShadow=true;obj.receiveShadow=true}});_this2.state.sceneContext.addSceneObject(item.id,gltf.scene,item.options)})}else if(item.id in _this2.state.sceneContext.sceneObjects){_this2.state.sceneContext.updateSceneObject(item.id,item.options)}});(data.colorLayers||[]).forEach(function(item){if(item.id in _this2.state.sceneContext.colorLayers){_this2.state.sceneContext.updateColorLayer(item.id,item.options)}});if(data.cameraPos&&data.center){var cameraPos=_this2.state.sceneContext.scene.view.camera.position;cameraPos.x=data.cameraPos[0];cameraPos.y=data.cameraPos[1];cameraPos.z=data.cameraPos[2];var controlsTarget=_this2.state.sceneContext.scene.view.controls.target;controlsTarget.x=data.center[0];controlsTarget.y=data.center[1];controlsTarget.z=data.center[2]}_this2.state.sceneContext.scene.notifyChange()});_this2.container=null;_this2.inspector=null;_this2.instance=null;_this2.map=null;_this2.sceneObjectGroup=null;_this2.objectMap={};_this2.state.sceneContext.addLayer=_this2.addLayer;_this2.state.sceneContext.getLayer=_this2.getLayer;_this2.state.sceneContext.removeLayer=_this2.removeLayer;_this2.state.sceneContext.updateColorLayer=_this2.updateColorLayer;_this2.state.sceneContext.addSceneObject=_this2.addSceneObject;_this2.state.sceneContext.getSceneObject=_this2.getSceneObject;_this2.state.sceneContext.removeSceneObject=_this2.removeSceneObject;_this2.state.sceneContext.updateSceneObject=_this2.updateSceneObject;_this2.state.sceneContext.getMap=_this2.getMap;_this2.state.sceneContext.getTerrainHeightFromDTM=_this2.getTerrainHeightFromDTM;_this2.state.sceneContext.getTerrainHeightFromMap=_this2.getTerrainHeightFromMap;_this2.state.sceneContext.getSceneIntersection=_this2.getSceneIntersection;registerPermalinkDataStoreHook("map3d",_this2.store3dState);return _this2}_inherits(Map3D,_React$Component2);return _createClass(Map3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.innerRef(this)}},{key:"componentWillUnmount",value:function componentWillUnmount(){unregisterPermalinkDataStoreHook("map3d")}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this3=this;if(this.props.theme!==prevProps.theme){this.setupInstance()}else if(this.props.layers!==prevProps.layers){this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{colorLayers:_this3.collectColorLayers(state.sceneContext.colorLayers)})}})}// Update map layers
28
+ if(objInter&&terrInter){return objInter.distance<terrInter.distance?objInter:terrInter}return objInter!==null&&objInter!==void 0?objInter:terrInter});_defineProperty(_this2,"redrawScene",function(ev){var width=ev.target.innerWidth;var height=ev.target.innerHeight;_this2.instance.renderer.setSize(width,height);_this2.instance.view.camera.aspect=width/height;_this2.instance.view.camera.updateProjectionMatrix();_this2.instance.renderer.render(_this2.instance.scene,_this2.instance.view.camera)});_defineProperty(_this2,"setViewToExtent",function(bounds,rotation){_this2.state.sceneContext.setViewToExtent(bounds,rotation)});_defineProperty(_this2,"store3dState",function(){var promises=Object.entries(_this2.state.sceneContext.sceneObjects).map(function(_ref13){var _ref14=_slicedToArray(_ref13,2),objectId=_ref14[0],entry=_ref14[1];if(!entry.layertree){return null}return new Promise(function(resolve){if(entry.drawGroup){var exporter=new GLTFExporter;exporter.parse(_this2.state.sceneContext.getSceneObject(objectId),function(result){resolve({id:objectId,options:entry,data:result})})}else{resolve({id:objectId,options:entry})}})}).filter(Boolean);return new Promise(function(resolve){Promise.all(promises).then(function(objects){var cameraPos=_this2.state.sceneContext.scene.view.camera.position;var target=_this2.state.sceneContext.scene.view.controls.target;var layers=Object.entries(_this2.state.sceneContext.colorLayers).map(function(_ref15){var _ref16=_slicedToArray(_ref15,2),layerId=_ref16[0],options=_ref16[1];return{id:layerId,options:{visibility:options.visibility,opacity:options.opacity,extrusionHeight:options.extrusionHeight}}});resolve({objects:objects,colorLayers:layers,cameraPos:[cameraPos.x,cameraPos.y,cameraPos.z],center:[target.x,target.y,target.z]})})})});_defineProperty(_this2,"restore3dState",function(data){if(isEmpty(data)){return}(data.objects||[]).forEach(function(item){if(item.data){var loader=new GLTFLoader;loader.parse(item.data,ConfigUtils.getAssetsPath(),function(gltf){gltf.scene.traverse(function(obj){if(obj.isMesh){obj.castShadow=true;obj.receiveShadow=true}});_this2.state.sceneContext.addSceneObject(item.id,gltf.scene,item.options)})}else if(item.id in _this2.state.sceneContext.sceneObjects){_this2.state.sceneContext.updateSceneObject(item.id,item.options)}});(data.colorLayers||[]).forEach(function(item){if(item.id in _this2.state.sceneContext.colorLayers){_this2.state.sceneContext.updateColorLayer(item.id,item.options)}});if(data.cameraPos&&data.center){var cameraPos=_this2.state.sceneContext.scene.view.camera.position;cameraPos.x=data.cameraPos[0];cameraPos.y=data.cameraPos[1];cameraPos.z=data.cameraPos[2];var controlsTarget=_this2.state.sceneContext.scene.view.controls.target;controlsTarget.x=data.center[0];controlsTarget.y=data.center[1];controlsTarget.z=data.center[2]}_this2.state.sceneContext.scene.notifyChange()});_this2.container=null;_this2.inspector=null;_this2.instance=null;_this2.map=null;_this2.sceneObjectGroup=null;_this2.objectMap={};_this2.state.sceneContext.addLayer=_this2.addLayer;_this2.state.sceneContext.getLayer=_this2.getLayer;_this2.state.sceneContext.removeLayer=_this2.removeLayer;_this2.state.sceneContext.updateColorLayer=_this2.updateColorLayer;_this2.state.sceneContext.addSceneObject=_this2.addSceneObject;_this2.state.sceneContext.getSceneObject=_this2.getSceneObject;_this2.state.sceneContext.removeSceneObject=_this2.removeSceneObject;_this2.state.sceneContext.updateSceneObject=_this2.updateSceneObject;_this2.state.sceneContext.getMap=_this2.getMap;_this2.state.sceneContext.getTerrainHeightFromDTM=_this2.getTerrainHeightFromDTM;_this2.state.sceneContext.getTerrainHeightFromMap=_this2.getTerrainHeightFromMap;_this2.state.sceneContext.getSceneIntersection=_this2.getSceneIntersection;registerPermalinkDataStoreHook("map3d",_this2.store3dState);return _this2}_inherits(Map3D,_React$Component2);return _createClass(Map3D,[{key:"componentDidMount",value:function componentDidMount(){this.props.innerRef(this)}},{key:"componentWillUnmount",value:function componentWillUnmount(){unregisterPermalinkDataStoreHook("map3d")}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this3=this;if(this.props.theme!==prevProps.theme){this.setupInstance()}else if(this.props.layers!==prevProps.layers){this.setState(function(state){return{sceneContext:_objectSpread(_objectSpread({},state.sceneContext),{},{colorLayers:_this3.collectColorLayers(state.sceneContext.colorLayers)})}})}// Update map layers
28
29
  if(this.state.sceneContext.baseLayers!==prevState.sceneContext.baseLayers){this.applyBaseLayer()}if(this.state.sceneContext.colorLayers!==prevState.sceneContext.colorLayers){this.applyColorLayerUpdates(this.state.sceneContext.colorLayers,prevState.sceneContext.colorLayers)}// Update scene objects
29
- if(this.state.sceneContext.sceneObjects!==prevState.sceneContext.sceneObjects){this.applySceneObjectUpdates(this.state.sceneContext.sceneObjects)}}},{key:"render",value:function render(){var baseLayer=this.state.sceneContext.baseLayers.find(function(l){return l.visibility===true});var style={marginTop:this.props.mapMargins.top,marginRight:this.props.mapMargins.right,marginBottom:this.props.mapMargins.bottom,marginLeft:this.props.mapMargins.left};return/*#__PURE__*/React.createElement("div",{className:"map3d-body"},/*#__PURE__*/React.createElement("div",{className:"map3d-inspector"}),/*#__PURE__*/React.createElement("div",{className:"map3d-map",onMouseDown:this.stopAnimations,ref:this.setupContainer,style:style}),/*#__PURE__*/React.createElement(View3DSwitcher,{position:2}),this.state.sceneContext.scene?/*#__PURE__*/React.createElement(UnloadWrapper,{key:this.state.sceneId,onUnload:this.onUnload,sceneId:this.state.sceneId},/*#__PURE__*/React.createElement(MapControls3D,{onControlsSet:this.setupControls,sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(BackgroundSwitcher,{changeLayerVisibility:this.setBaseLayer,layers:this.state.sceneContext.baseLayers,mapMargins:this.props.mapMargins}),/*#__PURE__*/React.createElement(TopBar3D,{options:this.props.options,sceneContext:this.state.sceneContext,searchProviders:this.props.searchProviders}),/*#__PURE__*/React.createElement(LayerTree3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(BottomBar3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(OverviewMap3D,{baseLayer:baseLayer,sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Map3DLight,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Measure3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Identify3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Compare3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Draw3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(MapExport3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(ExportObjects3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(HideObjects3D,{sceneContext:this.state.sceneContext})):null)}}])}(React.Component);_defineProperty(Map3D,"propTypes",{innerRef:PropTypes.func,layers:PropTypes.array,mapMargins:PropTypes.object,onMapInitialized:PropTypes.func,options:PropTypes.object,searchProviders:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object});_defineProperty(Map3D,"defaultProps",{geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true},options:{searchMinScaleDenom:1000}});_defineProperty(Map3D,"defaultSceneState",{scene:null,map:null,mapCrs:null,dtmUrl:null,dtmCrs:null,baseLayers:[],colorLayers:{},sceneObjects:{}});export default connect(function(state){return{mapMargins:state.windows.mapMargins,theme:state.theme.current,layers:state.layers.flat}},{setCurrentTask:setCurrentTask})(Map3D);
30
+ if(this.state.sceneContext.sceneObjects!==prevState.sceneContext.sceneObjects){this.applySceneObjectUpdates(this.state.sceneContext.sceneObjects)}}},{key:"render",value:function render(){var baseLayer=this.state.sceneContext.baseLayers.find(function(l){return l.visibility===true});var style={marginTop:this.props.mapMargins.top,marginRight:this.props.mapMargins.right,marginBottom:this.props.mapMargins.bottom,marginLeft:this.props.mapMargins.left};return/*#__PURE__*/React.createElement("div",{className:"map3d-body"},/*#__PURE__*/React.createElement("div",{className:"map3d-inspector"}),/*#__PURE__*/React.createElement("div",{className:"map3d-map",onMouseDown:this.stopAnimations,ref:this.setupContainer,style:style}),/*#__PURE__*/React.createElement(View3DSwitcher,{position:2}),this.state.sceneContext.scene?/*#__PURE__*/React.createElement(UnloadWrapper,{key:this.state.sceneId,onUnload:this.onUnload,sceneId:this.state.sceneId},/*#__PURE__*/React.createElement(MapControls3D,{onControlsSet:this.setupControls,sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(BackgroundSwitcher,{changeLayerVisibility:this.setBaseLayer,layers:this.state.sceneContext.baseLayers,mapMargins:this.props.mapMargins}),/*#__PURE__*/React.createElement(TopBar3D,{options:this.props.options,sceneContext:this.state.sceneContext,searchProviders:this.props.searchProviders}),/*#__PURE__*/React.createElement(LayerTree3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(BottomBar3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(OverviewMap3D,{baseLayer:baseLayer,sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Map3DLight,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Measure3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Identify3D,{sceneContext:this.state.sceneContext,tileInfoServiceUrl:this.props.options.tileInfoServiceUrl}),/*#__PURE__*/React.createElement(Compare3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(Draw3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(MapExport3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(ExportObjects3D,{sceneContext:this.state.sceneContext}),/*#__PURE__*/React.createElement(HideObjects3D,{sceneContext:this.state.sceneContext})):null)}}])}(React.Component);_defineProperty(Map3D,"propTypes",{innerRef:PropTypes.func,layers:PropTypes.array,mapMargins:PropTypes.object,onMapInitialized:PropTypes.func,options:PropTypes.object,searchProviders:PropTypes.object,setCurrentTask:PropTypes.func,theme:PropTypes.object});_defineProperty(Map3D,"defaultProps",{geometry:{initialWidth:600,initialHeight:800,initialX:0,initialY:0,initiallyDocked:true},options:{searchMinScaleDenom:1000}});_defineProperty(Map3D,"defaultSceneState",{scene:null,map:null,mapCrs:null,dtmUrl:null,dtmCrs:null,baseLayers:[],colorLayers:{},sceneObjects:{}});export default connect(function(state){return{mapMargins:state.windows.mapMargins,theme:state.theme.current,layers:state.layers.flat}},{setCurrentTask:setCurrentTask})(Map3D);