@giro3d/piero 1.0.0-beta.1 → 1.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Components.cjs.js +2 -2
- package/dist/Components.cjs.js.map +1 -1
- package/dist/Components.es.js +2410 -1513
- package/dist/Components.es.js.map +1 -1
- package/dist/assets/piero.css +2 -2
- package/dist/index.cjs.js +5 -5
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +4420 -5626
- package/dist/index.es.js.map +1 -1
- package/dist/modules.cjs.js +2 -2
- package/dist/modules.cjs.js.map +1 -1
- package/dist/modules.es.js +944 -593
- package/dist/modules.es.js.map +1 -1
- package/dist/src/api/AnalysisApi.d.ts +15 -0
- package/dist/src/api/DatasetApi.d.ts +28 -0
- package/dist/src/api/NotificationApi.d.ts +10 -0
- package/dist/src/api/ViewApi.d.ts +4 -0
- package/dist/src/api/index.d.ts +2 -2
- package/dist/src/components/panels/AnalysisPanel.vue.d.ts +1 -1
- package/dist/src/components/panels/DatasetOrGroupItem.vue.d.ts +0 -2
- package/dist/src/components/panels/analysis/ToolWrapper.vue.d.ts +1 -6
- package/dist/src/context.d.ts +7 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/module.d.ts +4 -0
- package/dist/src/modules/ClippingBoxAnalysis.d.ts +18 -0
- package/dist/src/modules/CrossSectionAnalysis.d.ts +11 -0
- package/dist/src/modules/DownloadDataset.d.ts +12 -0
- package/dist/src/modules/FloodingPlaneAnalysis.d.ts +11 -0
- package/dist/src/modules/IFCLoader.d.ts +1 -0
- package/dist/src/modules/PLYLoader.d.ts +1 -0
- package/dist/src/modules/PotreeLoader.d.ts +1 -0
- package/dist/src/modules/Tour.d.ts +1 -0
- package/dist/src/{services/analysis → modules/clippingBoxAnalysis}/ClippingBoxManager.d.ts +9 -3
- package/dist/src/modules/clippingBoxAnalysis/store.d.ts +2268 -0
- package/dist/src/modules/crossSectionAnalysis/CrossSectionManager.d.ts +8 -0
- package/dist/src/modules/crossSectionAnalysis/store.d.ts +522 -0
- package/dist/src/modules/floodingPlaneAnalysis/FloodingPlaneManager.d.ts +9 -0
- package/dist/src/{types/FloodingPlane.d.ts → modules/floodingPlaneAnalysis/FloodingPlaneObject.d.ts} +2 -2
- package/dist/src/modules/floodingPlaneAnalysis/store.d.ts +16 -0
- package/dist/src/modules/index.d.ts +5 -1
- package/dist/src/services/Giro3DManager.d.ts +0 -2
- package/dist/src/services/Picker.d.ts +1 -1
- package/dist/src/stores/analysis.d.ts +19 -1569
- package/dist/src/stores/datasets.d.ts +23 -1
- package/dist/src/stores/modules.d.ts +5 -1
- package/dist/src/stores/modules.test.d.ts +1 -0
- package/dist/src/stores/notifications.d.ts +1 -0
- package/package.json +1 -1
- package/dist/src/components/charts/BarChart.vue.d.ts +0 -4
- package/dist/src/components/charts/DoughnutChart.vue.d.ts +0 -4
- package/dist/src/components/panels/LoadingIndicator.vue.d.ts +0 -6
- package/dist/src/components/panels/analysis/FloodingPlane.vue.d.ts +0 -2
- package/dist/src/services/AnalysisManager.d.ts +0 -10
- package/dist/src/services/analysis/CrossSectionManager.d.ts +0 -9
- package/dist/src/services/analysis/FloodingPlaneManager.d.ts +0 -11
- package/dist/src/stores/statistics.d.ts +0 -8
- /package/dist/src/{components/panels/analysis → modules/clippingBoxAnalysis}/ClippingBox.vue.d.ts +0 -0
- /package/dist/src/{components/panels/analysis → modules/crossSectionAnalysis}/CrossSection.vue.d.ts +0 -0
- /package/dist/src/{components/panels/analysis/Statistics.vue.d.ts → modules/floodingPlaneAnalysis/FloodingPlane.vue.d.ts} +0 -0
package/dist/modules.cjs.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var G=Object.defineProperty;var q=(m,i,t)=>i in m?G(m,i,{enumerable:!0,configurable:!0,writable:!0,value:t}):m[i]=t;var C=(m,i,t)=>q(m,typeof i!="symbol"?i+"":i,t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const H=require("@giro3d/giro3d/gui/EntityPanel"),B=require("openbim-components"),p=require("./Components.cjs.js"),V=require("@giro3d/giro3d/entities/Entity3D"),W=require("@giro3d/giro3d/gui/EntityInspector"),f=require("vue"),$=require("@giro3d/giro3d/entities/PointCloud"),Z=require("@giro3d/giro3d/sources/PotreeSource"),k=require("shepherd.js"),L=new p.Matrix4,Q={bbox:new p.MeshBasicMaterial({color:"#FFFF00",depthTest:!0,opacity:.2,transparent:!0}),selection:new p.MeshBasicMaterial({color:"#FF0000",depthTest:!1,opacity:.6,transparent:!0})},X=4186316022,J=781010003,K=2655215786,tt=3242617779,et=919958153,nt=1307041759,j=1451395588,U=1883228015,st=[j,U],ot=[X,J,K,tt,et,nt],Y=m=>p.isObject(m)&&m.isIFCPickResult,A=class A extends V{constructor(t){super(new p.Group);C(this,"isIfcEntity",!0);C(this,"isPickableFeatures",!0);C(this,"type","IfcEntity");C(this,"_classificationCache");C(this,"_components");C(this,"_fragmentBoundingBox");C(this,"_fragmentClassifier");C(this,"_fragmentManager");C(this,"_ifcSelection");C(this,"_indexMap");C(this,"_model");C(this,"_source");this._source=t,this._components=new B.Components,this._components.ui.enabled=!1,this._components.scene=new B.SimpleScene(this._components),this._components.renderer=new B.SimpleRenderer(this._components,document.createElement("div")),this._components.camera=new B.SimpleCamera(this._components),this._components.raycaster=new B.SimpleRaycaster(this._components),this._components.init(),this._ifcSelection={bbox:{},selection:{}},this._indexMap={},this._classificationCache=null,this._fragmentBoundingBox=null}clearHighlight(t="selection"){for(const e of Object.keys(this._ifcSelection[t])){const n=this._fragmentManager.list[e],o=n==null?void 0:n.fragments[t];o!=null&&o.mesh.removeFromParent()}this.notifyChange(this),this._ifcSelection[t]={}}getBoundingBoxById(t){this.clearHighlight("bbox"),this.highlightById(t,"bbox");const e=this._fragmentBoundingBox;if(e===null)throw new Error("Must call initClassification before getBoundingBoxById");const n=this._fragmentManager;e.reset();const o=this._ifcSelection.bbox;if(!Object.keys(o).length)return;for(const x of Object.keys(o)){const P=n.list[x].fragments.bbox;e.addMesh(P.mesh)}const s=e.get(),{y:d,z:g}=s.min,{y:_,z:r}=s.max;return s.min.y=-r,s.max.y=-g,s.min.z=d,s.max.z=_,s.translate(this._model.position),this.clearHighlight("bbox"),s}getClassification(){if(this._classificationCache===null)throw new Error("Must call initClassification before getClassification");return this._classificationCache}getProperties(t){const e=[],n=this._model.properties;if(!n)return[];for(const o of this._indexMap[t]){const s=n[o];if(s==null)continue;const{name:d}=B.IfcPropertiesUtils.getEntityName(n,o);if(d!==null){if(s.type===j){const g=B.IfcPropertiesUtils.getPsetProps(n,o);if(g!==null)for(const _ of g){if(n[_]==null)continue;const x=this.getProperty(_);x!==null&&e.push({parentName:d,...x})}}else if(s.type===U){const g=B.IfcPropertiesUtils.getQsetQuantities(n,o);if(g!==null)for(const _ of g){const{key:r}=B.IfcPropertiesUtils.getQuantityValue(n,_);if(r===null)continue;const x=this.getProperty(_);x!==null&&e.push({parentName:d,...x})}}}}return e}getProperty(t){const e=this._model.properties;if(e===void 0)return null;const{name:n}=B.IfcPropertiesUtils.getEntityName(e,t);if(n===null)return null;const{value:o}=B.IfcPropertiesUtils.getQuantityValue(e,t);return{name:n,value:o}}highlight(t,e,n){this._ifcSelection[t][e.uuid]=new Set;const o=parseInt(n,10);this._ifcSelection[t][e.uuid].add(n),this.addComposites(t,e,o),this.regenerate(t,e.uuid);const s=e.fragment.group;if(s){const d=s.data[o][0];for(let g=0;g<d.length;g++){const _=d[g],r=s.keyFragments[_],x=this._fragmentManager.list[r];r in this._ifcSelection[t]||(this._ifcSelection[t][r]=new Set),this._ifcSelection[t][r].add(n),this.addComposites(t,x.mesh,o),this.regenerate(t,r)}}this.notifyChange(this)}highlightById(t,e="selection"){for(const n of Object.keys(t)){n in this._ifcSelection[e]||(this._ifcSelection[e][n]=new Set);const o=this._fragmentManager.list[n],s=new Set;for(const d of t[n])this._ifcSelection[e][n].add(d),s.add(parseInt(d,10));for(const d of s)this.addComposites(e,o.mesh,d);this.regenerate(e,n)}this.notifyChange(this)}pick(t,e){return super.pick(t,e).map(n=>({...n,entity:this,features:n.features,isIFCPickResult:!0,object:n.object}))}pickFeaturesFrom(t){var n,o,s;const e=t.object;if(e.fragment!=null&&t.instanceId!=null&&t.face){const d=e.fragment.getVertexBlockID(e.geometry,t.face.a),g=(n=e.fragment.getItemID(t.instanceId,d))==null?void 0:n.replace(/\..*/,"");if(g&&((s=(o=e.fragment.group)==null?void 0:o.properties)==null?void 0:s[g])!=null){const r=e.fragment.group.properties[g],v=[{ifcProperties:this.getProperties(g),itemProperties:r}];return t.features=v,v}}return[]}async initClassification(){this._classificationCache=await this.regenerateClassification(["storeys","entities"]),this._classificationCache.length===0&&(this._classificationCache=await this.regenerateClassification(["entities"])),this._fragmentBoundingBox=await this._components.tools.get(B.FragmentBoundingBox)}async preprocess(){const t=await p.Fetcher.fetchArrayBuffer(this._source.url);this._fragmentManager=await this._components.tools.get(B.FragmentManager),this._fragmentClassifier=await this._components.tools.get(B.FragmentClassifier);const e=new B.FragmentIfcLoader(this._components);e.settings.webIfc.COORDINATE_TO_ORIGIN=!0,e.settings.webIfc.OPTIMIZE_PROFILES=!0;const n=new Uint8Array(t);this._model=await e.load(n,this._source.name),this._model.rotateX(Math.PI/2);const o=new p.Vector3;if(this._source.at)this._source.at.toVector3(o),this._model.position.copy(o);else{const d=this._model.coordinationMatrix.clone().invert();o.applyMatrix4(d),this._model.position.set(o.x,-o.z,o.y)}this._model.updateWorldMatrix(!0,!0),this._model.updateMatrix(),this._model.updateMatrixWorld(!0),this.initializeEntityIndexes(),this._fragmentClassifier.byStorey(this._model),this._fragmentClassifier.byEntity(this._model),await this.initClassification(),this.object3d.add(this._model),this.onObjectCreated(this._model);const s=p.Fetcher.getContext(this._source.url);p.fillObject3DUserData(this,{filename:s.filename}),this.notifyChange(this.object3d)}addComposites(t,e,n){this.addHighlightToFragment(t,e.fragment);const o=e.fragment.composites[n];if(o)for(let s=1;s<o;s++){const d=B.toCompositeID(n,s);this._ifcSelection[t][e.uuid].add(d)}}addHighlightToFragment(t,e){if(!(t in e.fragments)){const n=e.addFragment(t,[Q[t]]);e.blocks.count>1&&(n.setInstance(0,{ids:Array.from(e.ids),transform:L}),n.blocks.setVisibility(!1)),this._model.add(n.mesh),n.mesh.renderOrder=30,n.mesh.frustumCulled=!1,n.mesh.name=t,n.mesh.updateMatrixWorld(!0)}}initializeEntityIndexes(){this._indexMap={};const t=this._model.properties;if(t!==void 0)for(const e of ot)B.IfcPropertiesUtils.getRelationMap(t,e,(n,o)=>{const s=t[n];st.includes(s.type)||this.setEntityIndex(n);for(const d of o)this.setEntityIndex(d).add(n)})}regenerate(t,e){this.updateFragmentFill(t,e)}async regenerateClassification(t,e={}){const n=this._fragmentClassifier.get(),o=[],s=t[0],d=n[s];if(s==null||d==null)return o;for(const g of Object.keys(d)){const _={...e,[s]:[g]},r=await this._fragmentClassifier.find(_);if(Object.keys(r).length>0){const P=s[0].toUpperCase()+s.slice(1),S=await this.regenerateClassification(t.slice(1),_);o.push({children:S,fragments:r,name:g,treeItemName:P})}}return o}setEntityIndex(t){return t in this._indexMap||(this._indexMap[t]=new Set),this._indexMap[t]}updateFragmentFill(t,e){const n=this._ifcSelection[t][e],o=this._fragmentManager.list[e];if(o==null)return;const s=o.fragments[t];if(s==null)return;const d=o.mesh.parent;if(d==null)return;if(d.add(s.mesh),s.blocks.count>1)o.getInstance(0,L),s.setInstance(0,{ids:Array.from(o.ids),transform:L}),s.blocks.setVisibility(!0,n,!0);else{let _=0;for(const r of n){s.mesh.count=_+1;const{instanceID:x}=o.getInstanceAndBlockID(r);o.getInstance(x,L),s.setInstance(_,{ids:[r],transform:L}),_++}}}};C(A,"isIFCEntity",t=>p.isObject(t)&&t.isIfcEntity),C(A,"isIFCPickResult",t=>p.isObject(t)&&A.isIFCEntity(t.entity));let R=A;class it extends W{constructor(i,t,e){super(i,t,e,{visibility:!0})}}const rt={class:"d-flex"},at=["title"],ct=["id"],lt={class:"list-unstyled border-start"},ut=f.defineComponent({__name:"IfcSubtree",props:{classificationElement:{},ifcEntity:{}},setup(m){const i=m,t=p.MathUtils.generateUUID(),e=`#${t}`,n=f.ref(!1),o=p.useCameraStore(),s=p.useAnalysisStore();function d(){const r=i.ifcEntity.getBoundingBoxById(i.classificationElement.fragments);r&&!r.isEmpty()&&(s.setClippingBox(r),s.enableClippingBox(!0))}function g(){n.value=!0,i.ifcEntity.clearHighlight(),i.ifcEntity.highlightById(i.classificationElement.fragments),setTimeout(()=>n.value=!1,2e3)}function _(){const r=i.ifcEntity.getBoundingBoxById(i.classificationElement.fragments);r&&!r.isEmpty()&&o.lookTopDownAt(r)}return(r,x)=>{const v=f.resolveComponent("IfcSubtree",!0);return f.openBlock(),f.createElementBlock("div",null,[f.createElementVNode("div",rt,[f.createElementVNode("span",{class:f.normalizeClass(["border rounded px-1 py-0 fw-normal",n.value?"text-danger border-danger":"text-secondary border-secondary"]),title:r.classificationElement.treeItemName},f.toDisplayString(r.classificationElement.treeItemName),11,at),r.classificationElement.children.length>0?(f.openBlock(),f.createBlock(p.IconList,{key:0},{default:f.withCtx(()=>[f.createVNode(p.IconListButton,{title:"Expand group",icon:"bi-chevron-down","data-bs-toggle":"collapse","data-bs-target":e,"aria-controls":f.unref(t),"aria-expanded":"true"},null,8,["aria-controls"])]),_:1})):f.createCommentVNode("",!0),f.createVNode(p._sfc_main$2,{class:f.normalizeClass(["label",n.value?"text-danger-emphasis":"text-muted"]),text:r.classificationElement.name,title:`Zoom to ${r.classificationElement.name}`,onClick:_},null,8,["class","text","title"]),f.createVNode(p.IconList,{class:"ms-1"},{default:f.withCtx(()=>[f.createVNode(p.IconListButton,{title:"Highlight",icon:"bi-highlighter",onClick:g}),f.createVNode(p.IconListButton,{title:"Clip to",icon:"bi-bounding-box",onClick:d})]),_:1})]),r.classificationElement.children.length>0?(f.openBlock(),f.createElementBlock("div",{key:0,id:f.unref(t),class:"collapse show"},[f.createElementVNode("ul",lt,[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(r.classificationElement.children,(P,S)=>(f.openBlock(),f.createElementBlock("li",{key:S},[f.createVNode(v,{"ifc-entity":i.ifcEntity,"classification-element":P},null,8,["ifc-entity","classification-element"])]))),128))])],8,ct)):f.createCommentVNode("",!0)])}}}),dt=p._export_sfc(ut,[["__scopeId","data-v-c2ab888d"]]),ht={key:0},pt=f.defineComponent({__name:"IfcPropertyView",props:{dataset:{}},setup(m){const i=p.useDatasetStore(),t=m,e=p.refAndWatch(t.dataset,"isPreloaded");function n(){const s=o();return s==null?null:s.getClassification()}function o(){const s=i.getEntity(t.dataset);return s??null}return(s,d)=>f.unref(e)?(f.openBlock(),f.createElementBlock("div",ht,[f.createElementVNode("ul",null,[(f.openBlock(!0),f.createElementBlock(f.Fragment,null,f.renderList(n(),(g,_)=>(f.openBlock(),f.createElementBlock("li",{key:_},[f.createVNode(dt,{"ifc-entity":o(),"classification-element":g},null,8,["ifc-entity","classification-element"])]))),128))])])):f.createCommentVNode("",!0)}}),ft=p._export_sfc(pt,[["__scopeId","data-v-d2d82ae7"]]),mt=m=>{if(Y(m)){const i=m.object;if(i.fragment!=null&&m.face&&m.instanceId!=null){const t=i.fragment.getVertexBlockID(i.geometry,m.face.a),e=i.fragment.getItemID(m.instanceId,t).replace(/\..*/,"");return m.entity.highlight("selection",i,e),()=>m.entity.clearHighlight()}}return null},gt=m=>({name:m.filename,source:{url:m.file},type:"ifc",visible:!0}),yt=(m,i)=>{var g,_,r,x,v,P,S,N,a;if(!Y(m))return;const t=(g=m.features)==null?void 0:g.at(0);if(!t)return;i.has("IFC")||i.set("IFC",[]);const e=i.get("IFC"),{ifcProperties:n,itemProperties:o}=t,s="NULL",d=((_=o.Name)==null?void 0:_.value)??s;e.push({key:"Site",value:((x=(r=m.entity.object3d.userData)==null?void 0:r.dataset)==null?void 0:x.name)??s}),e.push({key:"IFCType",value:B.IfcCategoryMap[o.type]??s}),e.push({key:"Name",value:d}),e.push({key:"ID",value:o.expressID}),e.push({key:"GlobalId",value:((v=o.GlobalId)==null?void 0:v.value)??s}),((P=o.Description)==null?void 0:P.value)!=null&&e.push({key:"Description",value:o.Description.value}),((S=o.PredefinedType)==null?void 0:S.value)!=null&&e.push({key:"PredefinedType",value:o.PredefinedType.value}),((N=o.ObjectType)==null?void 0:N.value)!=null&&e.push({key:"ObjectType",value:o.ObjectType.value});for(const{name:u,parentName:l,value:c}of n)i.has(l)||i.set(l,[]),(a=i.get(l))==null||a.push({key:u,value:c})},bt=m=>{const i=m.dataset,t=i.config,e=p.getCoordinates(t.source.position??i.get("position")),n=new R({...t.source,at:e,name:i.name});return Promise.resolve(n)};class xt{constructor(){C(this,"name","IFC")}async initialize(i){i.datasets.registerDatasetType("ifc",{attributeExtractor:yt,entityBuilder:bt,fileExtensions:["ifc"],highlight:mt,icon:"bi-building",loader:gt,name:"IFC",propertyView:ft}),H.registerInspector("IfcEntity",it),await p.Fetcher.fetch("web-ifc.wasm").catch(t=>{console.warn("Could not load web-ifc.wasm",t)})}}const F=new p.Color;let wt=class extends p.Loader{constructor(i){super(i),this.propertyNameMapping={},this.customPropertyMapping={}}load(i,t,e,n){const o=this,s=new p.FileLoader(this.manager);s.setPath(this.path),s.setResponseType("arraybuffer"),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(i,function(d){try{t(o.parse(d))}catch(g){n?n(g):console.error(g),o.manager.itemError(i)}},e,n)}setPropertyNameMapping(i){this.propertyNameMapping=i}setCustomPropertyNameMapping(i){this.customPropertyMapping=i}parse(i){function t(a,u=0){const l=/^ply([\s\S]*)end_header(\r\n|\r|\n)/;let c="";const h=l.exec(a);h!==null&&(c=h[1]);const y={comments:[],elements:[],headerLength:u,objInfo:""},w=c.split(/\r\n|\r|\n/);let b;function M(T,E){const I={type:T[0]};return I.type==="list"?(I.name=T[3],I.countType=T[1],I.itemType=T[2]):I.name=T[1],I.name in E&&(I.name=E[I.name]),I}for(let T=0;T<w.length;T++){let E=w[T];if(E=E.trim(),E==="")continue;const I=E.split(/\s+/),z=I.shift();switch(E=I.join(" "),z){case"format":y.format=I[0],y.version=I[1];break;case"comment":y.comments.push(E);break;case"element":b!==void 0&&y.elements.push(b),b={},b.name=I[0],b.count=parseInt(I[1]),b.properties=[];break;case"property":b.properties.push(M(I,N.propertyNameMapping));break;case"obj_info":y.objInfo=E;break;default:console.log("unhandled",z,I)}}return b!==void 0&&y.elements.push(b),y}function e(a,u){switch(u){case"char":case"uchar":case"short":case"ushort":case"int":case"uint":case"int8":case"uint8":case"int16":case"uint16":case"int32":case"uint32":return parseInt(a);case"float":case"double":case"float32":case"float64":return parseFloat(a)}}function n(a,u){const l={};for(let c=0;c<a.length;c++){if(u.empty())return null;if(a[c].type==="list"){const h=[],y=e(u.next(),a[c].countType);for(let w=0;w<y;w++){if(u.empty())return null;h.push(e(u.next(),a[c].itemType))}l[a[c].name]=h}else l[a[c].name]=e(u.next(),a[c].type)}return l}function o(){const a={indices:[],vertices:[],normals:[],uvs:[],faceVertexUvs:[],colors:[],faceVertexColors:[]};for(const u of Object.keys(N.customPropertyMapping))a[u]=[];return a}function s(a){const u=a.map(c=>c.name);function l(c){for(let h=0,y=c.length;h<y;h++){const w=c[h];if(u.includes(w))return w}return null}return{attrX:l(["x","px","posx"])||"x",attrY:l(["y","py","posy"])||"y",attrZ:l(["z","pz","posz"])||"z",attrNX:l(["nx","normalx"]),attrNY:l(["ny","normaly"]),attrNZ:l(["nz","normalz"]),attrS:l(["s","u","texture_u","tx"]),attrT:l(["t","v","texture_v","ty"]),attrR:l(["red","diffuse_red","r","diffuse_r"]),attrG:l(["green","diffuse_green","g","diffuse_g"]),attrB:l(["blue","diffuse_blue","b","diffuse_b"])}}function d(a,u){const l=o(),c=/end_header\s+(\S[\s\S]*\S|\S)\s*$/;let h,y;(y=c.exec(a))!==null?h=y[1].split(/\s+/):h=[];const w=new _t(h);t:for(let b=0;b<u.elements.length;b++){const M=u.elements[b],T=s(M.properties);for(let E=0;E<M.count;E++){const I=n(M.properties,w);if(!I)break t;_(l,M.name,I,T)}}return g(l)}function g(a){let u=new p.BufferGeometry;a.indices.length>0&&u.setIndex(a.indices),u.setAttribute("position",new p.Float32BufferAttribute(a.vertices,3)),a.normals.length>0&&u.setAttribute("normal",new p.Float32BufferAttribute(a.normals,3)),a.uvs.length>0&&u.setAttribute("uv",new p.Float32BufferAttribute(a.uvs,2)),a.colors.length>0&&u.setAttribute("color",new p.Float32BufferAttribute(a.colors,3)),(a.faceVertexUvs.length>0||a.faceVertexColors.length>0)&&(u=u.toNonIndexed(),a.faceVertexUvs.length>0&&u.setAttribute("uv",new p.Float32BufferAttribute(a.faceVertexUvs,2)),a.faceVertexColors.length>0&&u.setAttribute("color",new p.Float32BufferAttribute(a.faceVertexColors,3)));for(const l of Object.keys(N.customPropertyMapping))a[l].length>0&&u.setAttribute(l,new p.Float32BufferAttribute(a[l],N.customPropertyMapping[l].length));return u.computeBoundingSphere(),u}function _(a,u,l,c){if(u==="vertex"){a.vertices.push(l[c.attrX],l[c.attrY],l[c.attrZ]),c.attrNX!==null&&c.attrNY!==null&&c.attrNZ!==null&&a.normals.push(l[c.attrNX],l[c.attrNY],l[c.attrNZ]),c.attrS!==null&&c.attrT!==null&&a.uvs.push(l[c.attrS],l[c.attrT]),c.attrR!==null&&c.attrG!==null&&c.attrB!==null&&(F.setRGB(l[c.attrR]/255,l[c.attrG]/255,l[c.attrB]/255,p.SRGBColorSpace),a.colors.push(F.r,F.g,F.b));for(const h of Object.keys(N.customPropertyMapping))for(const y of N.customPropertyMapping[h])a[h].push(l[y])}else if(u==="face"){const h=l.vertex_indices||l.vertex_index,y=l.texcoord;h.length===3?(a.indices.push(h[0],h[1],h[2]),y&&y.length===6&&(a.faceVertexUvs.push(y[0],y[1]),a.faceVertexUvs.push(y[2],y[3]),a.faceVertexUvs.push(y[4],y[5]))):h.length===4&&(a.indices.push(h[0],h[1],h[3]),a.indices.push(h[1],h[2],h[3])),c.attrR!==null&&c.attrG!==null&&c.attrB!==null&&(F.setRGB(l[c.attrR]/255,l[c.attrG]/255,l[c.attrB]/255,p.SRGBColorSpace),a.faceVertexColors.push(F.r,F.g,F.b),a.faceVertexColors.push(F.r,F.g,F.b),a.faceVertexColors.push(F.r,F.g,F.b))}}function r(a,u){const l={};let c=0;for(let h=0;h<u.length;h++){const y=u[h],w=y.valueReader;if(y.type==="list"){const b=[],M=y.countReader.read(a+c);c+=y.countReader.size;for(let T=0;T<M;T++)b.push(w.read(a+c)),c+=w.size;l[y.name]=b}else l[y.name]=w.read(a+c),c+=w.size}return[l,c]}function x(a,u,l){function c(h,y,w){switch(y){case"int8":case"char":return{read:b=>h.getInt8(b),size:1};case"uint8":case"uchar":return{read:b=>h.getUint8(b),size:1};case"int16":case"short":return{read:b=>h.getInt16(b,w),size:2};case"uint16":case"ushort":return{read:b=>h.getUint16(b,w),size:2};case"int32":case"int":return{read:b=>h.getInt32(b,w),size:4};case"uint32":case"uint":return{read:b=>h.getUint32(b,w),size:4};case"float32":case"float":return{read:b=>h.getFloat32(b,w),size:4};case"float64":case"double":return{read:b=>h.getFloat64(b,w),size:8}}}for(let h=0,y=a.length;h<y;h++){const w=a[h];w.type==="list"?(w.countReader=c(u,w.countType,l),w.valueReader=c(u,w.itemType,l)):w.valueReader=c(u,w.type,l)}}function v(a,u){const l=o(),c=u.format==="binary_little_endian",h=new DataView(a,u.headerLength);let y,w=0;for(let b=0;b<u.elements.length;b++){const M=u.elements[b],T=M.properties,E=s(T);x(T,h,c);for(let I=0;I<M.count;I++){y=r(w,T),w+=y[1];const z=y[0];_(l,M.name,z,E)}}return g(l)}function P(a){let u=0,l=!0,c="";const h=[],y=new TextDecoder().decode(a.subarray(0,5)),w=/^ply\r\n/.test(y);do{const b=String.fromCharCode(a[u++]);b!==`
|
|
2
|
-
`&&b!=="\r"?c+=b:(c==="end_header"&&(l=!1),c!==""&&(h.push(c),c=""))}while(l&&u<a.length);return w===!0&&u++,{headerText:h.join("\r")+"\r",headerLength:u}}let S;const N=this;if(i instanceof ArrayBuffer){const a=new Uint8Array(i),{headerText:u,headerLength:l}=P(a),c=t(u,l);if(c.format==="ascii"){const h=new TextDecoder().decode(a);S=d(h,c)}else S=v(i,c)}else S=d(i,t(i));return S}};class _t{constructor(i){this.arr=i,this.i=0}empty(){return this.i>=this.arr.length}next(){return this.arr[this.i++]}}const O=class O extends p.Mesh{constructor(){super(...arguments);C(this,"isPickableFeatures",!0);C(this,"isPlyMesh",!0)}pickFeaturesFrom(t){if(this.geometry.hasAttribute("color")&&t.face){const e=this.geometry.getAttribute("color").array,n=t.face,s=[{color:new p.Color(e[n.a*3],e[n.a*3+1],e[n.a*3+2])}];return t.features=s,s}return[]}};C(O,"isPlyMesh",t=>p.isObject(t)&&t.isPlyMesh),C(O,"isPlyPickResult",t=>p.isObject(t)&&O.isPlyMesh(t==null?void 0:t.object));let D=O;class Ct extends V{constructor(t){super(new p.Group);C(this,"isPlyEntity",!0);C(this,"source");this.source=t}async preprocess(){const t=await p.Fetcher.fetchArrayBuffer(this.source.url),e=this.source.at.as(this.source.featureProjection).toVector3(),o=new wt().parse(t),s=new p.MeshLambertMaterial({side:p.DoubleSide});o.hasAttribute("color")&&(s.vertexColors=!0),o.computeVertexNormals();const d=new D(o,s);d.name="plyModel",o.computeBoundingBox(),d.position.copy(e),d.updateWorldMatrix(!0,!0),this.object3d.add(d),this.onObjectCreated(d);const g=p.Fetcher.getContext(this.source.url);p.fillObject3DUserData(this,{filename:g.filename}),this.notifyChange(this.object3d)}}const It=m=>{const{dataset:i,instance:t}=m,e=i.config,n=p.getCoordinates(e.source.position??i.get("position")),o=new Ct({...e.source,at:n,featureProjection:t.referenceCrs});return Promise.resolve(o)},vt=(m,i)=>{var n;if(!D.isPlyPickResult(m))return;const t=(n=m.features)==null?void 0:n.at(0);if(!t)return;i.has("PLY")||i.set("PLY",[]),i.get("PLY").push({key:"Color",value:t.color})};class St{constructor(){C(this,"name","PLY")}initialize(i){i.datasets.registerDatasetType("ply",{attributeExtractor:vt,entityBuilder:It,icon:"bi-file-earmark-binary",name:"PLY"})}}const Pt=m=>{const i=m.dataset.config,t=new $({source:new Z({url:`${i.source.url}/${i.source.filename}`})});return p.fillObject3DUserData(t,{filename:i.source.url}),Promise.resolve(t)};class Tt{constructor(){C(this,"name","Potree")}initialize(i){i.datasets.registerDatasetType("potree",{entityBuilder:Pt,icon:"fg-multipoint",name:"Potree Point Cloud"})}}class Bt{constructor(){C(this,"name","Tour");C(this,"_camera",null);C(this,"_cameraCallback",null);C(this,"_context",null);C(this,"_tours",null)}initialize(i){this._context=i,i.events.addEventListener("ready",this.start.bind(this))}buildTours(){const i=this._camera,t=new k.Tour({tourName:"main",useModalOverlay:!0}),e=new k.Tour({tourName:"navigating",useModalOverlay:!0}),n=new k.Tour({tourName:"analyzing",useModalOverlay:!0}),o=[{action:()=>{var r;return(r=k.activeTour)==null?void 0:r.next()},text:"Next"},{action:()=>{var r;return(r=k.activeTour)==null?void 0:r.cancel()},secondary:!0,text:"Exit"}],s=()=>{var a,u;const r=(a=k.activeTour)==null?void 0:a.getCurrentStep(),x=r==null?void 0:r.getElement(),v=x==null?void 0:x.querySelector(".shepherd-text"),P=(u=k.activeTour)==null?void 0:u.steps;if(r==null||x==null||v==null||P==null)return;const S=document.createElement("div");S.className="progress mt-3",S.setAttribute("role","progressbar"),S.style.height="2px";const N=document.createElement("div");N.className="progress-bar bg-success",N.style.width=`${100*(P.indexOf(r)/P.length)}%`,S.appendChild(N),v.appendChild(S)},d=async(r,x)=>new Promise(v=>{const P=document.getElementById(r);if(P&&!P.classList.contains("active")&&P.click(),document.querySelector(x))return v(document.querySelector(x));const S=new MutationObserver(()=>{document.querySelector(x)&&(S.disconnect(),v(document.querySelector(x)))});S.observe(document.body,{childList:!0,subtree:!0})});t.addStep({buttons:[{action:()=>{var r;(r=k.activeTour)==null||r.complete(),e.show(0)},text:"Navigating"},{action:()=>{var r;(r=k.activeTour)==null||r.complete(),n.show(0)},text:"Analyzing data"},{action:()=>{var r;return(r=k.activeTour)==null?void 0:r.cancel()},secondary:!0,text:"Exit"}],cancelIcon:{enabled:!0,label:"Exit tutorial"},id:"example-step",text:"<p>Welcome to <strong>Piero</strong>, the Giro3D application.<br/>We can guide you through the different features.</p>",title:"Welcome!",when:{show:s}}),e.addStep({attachTo:{element:"#main-view",on:"bottom"},buttons:o,id:"view",text:"<p>This is the <b>main view</b>.</p><p>Giro3D natively supports a broad range of data sources, from 2D raster and vector data, to 3D point clouds and tilesets.</p><p>Piero adds support for CityJSON and IFC files.</p>",when:{show:s}}),e.addStep({attachTo:{element:"#main-view",on:"bottom"},buttons:o,id:"navigate",text:'<p>This application integrates <a href="https://github.com/yomotsu/camera-controls">camera-controls</a>, a camera control for three.js.</p><p><b>Click</b> to move the camera. <b>Right-click</b> to rotate around a point. <b>Scroll</b> to zoom in or out.</p>',when:{hide:()=>{this._cameraCallback&&i.removeEventListener("interaction-end",this._cameraCallback),this._cameraCallback=null},show:()=>{let r=0;this._cameraCallback=()=>{var x;r+=1,r>2&&((x=k.activeTour)==null||x.next())},i.addEventListener("interaction-end",this._cameraCallback),s()}}}),e.addStep({attachTo:{element:"#toolbar",on:"right"},beforeShowPromise:()=>d("toolbar-datasets","#datasets-drop-zone"),buttons:o,id:"toolbar-layers",text:"<p>Giro3D supports multiple datasets.</p><p>You can toggle datasets as you wish with the <b>Datasets</b> panel.</p>",when:{show:s}}),e.addStep({attachTo:{element:"#basemap-list",on:"right"},beforeShowPromise:()=>d("toolbar-datasets","#datasets-drop-zone"),buttons:o,id:"basemaps",text:"<p><b>Basemaps</b> are color and elevation layers that make the basic shape and aspect of the <b>Map</b>.</p>",when:{show:s}}),e.addStep({attachTo:{element:"#overlay-list",on:"right"},beforeShowPromise:()=>d("toolbar-datasets","#datasets-drop-zone"),buttons:o,id:"overlays",text:"<p><b>Overlays</b> are vector layers in various formats (WFS, GML, GeoJSON...).</p>",when:{show:s}}),e.addStep({attachTo:{element:"#dataset-list",on:"right"},beforeShowPromise:()=>d("toolbar-datasets","#datasets-drop-zone"),buttons:o,id:"layers",text:"<p>The <b>Datasets</b> panel contains all 3D objects in the scene.</><p>You can toggle their visibility and delete them.<p><p>Most objects leverage Giro3D's adaptive resolution to optimize their display.</p>",when:{show:s}}),e.addStep({attachTo:{element:"#datasets-drop-zone",on:"right"},beforeShowPromise:()=>d("toolbar-datasets","#datasets-drop-zone"),buttons:o,id:"adddata",text:"<p>You can add your own data from your computer by <b>dragging the file</b> into this page.</p><p>While you won't benefit from Giro3D's tiling mechanism, this can be a great way to quickly visualize datasets up to 100MB.</p><p>This application supports CityJSONs, IFCs, LAS/LAZs, CSV pointclouds, and simple GeoJSON features.</p>",when:{show:s}}),e.addStep({attachTo:{element:"#main-view",on:"bottom"},buttons:o,id:"attributes",text:"<p>By clicking on any feature on the map, you can see its <strong>Attribute table</strong>. Clickable features display a cursor when hovered.</p>",when:{show:s}}),e.addStep({attachTo:{element:"#search-place-autocomplete",on:"bottom"},buttons:[{action:()=>{var r;(r=k.activeTour)==null||r.complete(),n.show(0)},text:"Analyzing data"},{action:()=>{var r;return(r=k.activeTour)==null?void 0:r.complete()},secondary:!0,text:"Exit"}],id:"widgets",text:"Giro3D is highly extensible. Here we added a widget to search and navigate to locations based on the French address database.",when:{show:s}}),n.addStep({attachTo:{element:"#annotations-fieldset",on:"right"},beforeShowPromise:()=>d("toolbar-annotations","#annotations-fieldset"),buttons:o,id:"annotation",text:"<p>You can <strong>annotate</strong> any data displayed using Giro3D native tools.<br>Select the <strong>geometry</strong> of your annotation, and <strong>click</strong> on the scene to add points. <strong>Right-click</strong> to end the shape.</p>",when:{show:s}}),n.addStep({attachTo:{element:"#annotations-fieldset",on:"right"},beforeShowPromise:()=>d("toolbar-annotations","#annotations-fieldset"),buttons:o,id:"annotations",text:"You can download your annotations as GeoJSON files. You can also upload your own by dragging them into this panel.",when:{show:s}}),p.hasExperimentalFeature("measurements")&&n.addStep({attachTo:{element:"#panel-container",on:"right"},beforeShowPromise:()=>d("toolbar-measures","#measures-fieldset"),buttons:o,id:"measurements",text:"You can add <strong>measurements</strong> to easily get distances betwween objects.<br>Once started, moving the mouse will display the measure. <strong>Click</strong> to save the measurement. <strong>Right-click</strong> to end.",when:{show:s}}),n.addStep({attachTo:{element:"#panel-container",on:"right"},beforeShowPromise:()=>d("toolbar-analysis","#panel-container .card"),buttons:[{action:()=>{var r;return(r=k.activeTour)==null?void 0:r.complete()},text:"Done!"}],id:"analysis",text:"In the <strong>Analysis</strong> panel you'll find some advanced analysis tools.",when:{show:s}});const g=()=>{const r=new URL(document.URL);r.searchParams.delete("tourStep"),r.searchParams.set("tour","none"),window.history.replaceState({},"",r.toString())},_=r=>{const x=new URL(document.URL);let v="main";r.tour.id.startsWith("navigating")?v="navigating":r.tour.id.startsWith("analyzing")&&(v="analyzing"),x.searchParams.set("tour",v),x.searchParams.set("tourStep",r.step.id),window.history.replaceState({},"",x.toString())};return t.on("cancel",g),t.on("complete",g),t.on("show",_),e.on("cancel",g),e.on("complete",g),e.on("show",_),n.on("cancel",g),n.on("complete",g),n.on("show",_),{analyzingTour:n,mainTour:t,navigatingTour:e}}getTours(){return this._tours||(this._tours=this.buildTours()),this._tours}restart(){const{mainTour:i}=this.getTours();i.show(0)}start(){if(!this._context)throw new Error("module is not initialized");const{analyzingTour:i,mainTour:t,navigatingTour:e}=this.getTours();this._camera=this._context.view.getCameraController();const n=new URL(document.URL),o=n.searchParams.get("tour")??"main";if(o!=="none"){const s=n.searchParams.get("tourStep")??0;o==="navigating"?e.show(s):o==="analyzing"?i.show(s):t.show(s)}}}exports.IFCLoader=xt;exports.PLYLoader=St;exports.PotreeLoader=Tt;exports.Tour=Bt;
|
|
1
|
+
"use strict";var W=Object.defineProperty;var X=(c,t,e)=>t in c?W(c,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):c[t]=e;var y=(c,t,e)=>X(c,typeof t!="symbol"?t+"":t,e);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("./Components.cjs.js"),r=require("vue"),U=require("pinia"),Z=require("@giro3d/giro3d/core/geographic/Coordinates"),R=require("@giro3d/giro3d/entities/Entity3D"),Q=require("@giro3d/giro3d/gui/EntityPanel"),T=require("openbim-components"),J=require("@giro3d/giro3d/gui/EntityInspector"),K=require("@giro3d/giro3d/entities/PointCloud"),ee=require("@giro3d/giro3d/sources/PotreeSource"),F=require("shepherd.js"),Y=U.defineStore("crossSection",()=>{const c=r.ref(0),t=r.ref(new p.Vector3(0,0,0)),e=r.ref(!1);function o(n){e.value=n}function s(n){c.value=n}function i(n){t.value=n}return{center:t,enable:e,orientation:c,setCenter:i,setEnabled:o,setOrientation:s}}),te={class:"input-group mb-3"},ne={class:"input-group mb-3"},oe=["value"],se={class:"input-group mb-3"},ie=["value"],re={class:"input-group"},ae={class:"input-group"},le=["value"],ce=["value"],ue=r.defineComponent({__name:"CrossSection",setup(c){const t=Y();function e(i){t.setOrientation(i)}function o(i){const n=t.center.clone();n.setX(i),t.setCenter(n)}function s(i){const n=t.center.clone();n.setY(i),t.setCenter(n)}return(i,n)=>(r.openBlock(),r.createElementBlock("div",null,[r.createElementVNode("div",te,[r.createVNode(p._sfc_main,{"model-value":r.unref(t).enable,"onUpdate:modelValue":n[0]||(n[0]=l=>r.unref(t).setEnabled(l)),id:"cross-section-enable",title:"foo"},null,8,["model-value"]),n[5]||(n[5]=r.createElementVNode("label",{for:"cross-section-enable",class:"form-label"},"Enable cross section",-1))]),r.createElementVNode("div",ne,[n[6]||(n[6]=r.createElementVNode("label",{for:"plane-orientation-range",class:"form-label"},"Plane orientation (0-360°)",-1)),r.createElementVNode("input",{id:"plane-orientation-range",title:"Altitude",type:"range",class:"form-range",min:"0",step:"0.1",max:"360",value:r.unref(t).orientation,onInput:n[1]||(n[1]=l=>e(Number.parseFloat(l.target.value)))},null,40,oe)]),r.createElementVNode("div",se,[r.createElementVNode("input",{type:"number",class:"form-control",id:"plane-orientation-number",step:"0.1",value:r.unref(t).orientation,onInput:n[2]||(n[2]=l=>e(Number.parseFloat(l.target.value)))},null,40,ie)]),n[8]||(n[8]=r.createElementVNode("hr",null,null,-1)),r.createElementVNode("div",re,[n[7]||(n[7]=r.createElementVNode("label",{class:"form-label"},"Center (x, y)",-1)),r.createElementVNode("div",ae,[r.createElementVNode("input",{type:"number",class:"form-control",id:"plane-center-x",value:r.unref(t).center.x,onInput:n[3]||(n[3]=l=>o(Number.parseFloat(l.target.value)))},null,40,le),r.createElementVNode("input",{type:"number",class:"form-control",id:"plane-center-y",value:r.unref(t).center.y,onInput:n[4]||(n[4]=l=>s(Number.parseFloat(l.target.value)))},null,40,ce)])])]))}});class de{constructor(t){y(this,"_store",Y());this.context=t,t.events.addEventListener("ready",()=>{const e=t.configuration.default_crs,o=t.configuration.analysis.cross_section;this._store.setOrientation(o.orientation);const s=o.pivot,i=new Z(s.crs??e,s.x,s.y,0).as(e);this._store.setCenter(i.toVector3()),this._store.$onAction(({after:n,name:l})=>{n(()=>{switch(l){case"setCenter":case"setEnabled":case"setOrientation":this.updateCrossSection();break}})}),this.updateCrossSection()})}dispose(){}updateCrossSection(){const t=[];if(this._store.enable){const o=p.MathUtils.DEG2RAD*this._store.orientation,s=Math.cos(o),i=Math.sin(o),n=new p.Vector3(s,i,0),l=new p.Plane(n,0).distanceToPoint(this._store.center),b=new p.Plane(n,-l);t.push(b)}const e=this.context.view.getInstance();e.renderer.clippingPlanes=t;for(const o of this.context.view.getInstance().getEntities())R.isEntity3D(o)&&o.dispatchEvent({clippingPlanes:t,type:"clippingPlanes-property-changed"});e.notifyChange()}}class pe{constructor(){y(this,"id","builtin-cross-section-analysis");y(this,"name","Cross section");y(this,"_manager",null)}initialize(t){t.analysis.registerTool({component:ue,icon:"bi-circle-half",name:"Cross section"}),this._manager=new de(t)}}function z(c){if("url"in c.config&&typeof c.config.url=="string")return c.config.url;if("source"in c.config&&typeof c.config.source=="object"&&"url"in c.config.source&&typeof c.config.source.url=="string")return c.config.source.url}function he(c){return z(c)!=null}class fe{constructor(){y(this,"id","builtin-download-dataset");y(this,"name","Download dataset");y(this,"_context",null)}initialize(t){this._context=t,t.datasets.registerDatasetAction({action:this.download.bind(this),icon:"bi-download",predicate:he,title:"Download dataset"})}download(t){const e=z(t);if(e==null){console.warn("invalid");return}const o=this._context,s=new URL(e).pathname.split("/"),i=s[s.length-1];console.info(`download ${z(t)}`),p.Fetcher.fetch(e).then(n=>{if(!n.ok)throw new Error(`${n.status} ${n.statusText}`);return n.blob()}).then(n=>{p.Download.downloadBlob(n,i),o.notifications.pushNotification({level:"success",text:i,title:"Download successful"})}).catch(n=>{console.error(n);const l=n instanceof Error?n.message:"Download failed";o.notifications.pushNotification({level:"error",text:l,title:t.name})})}}const $=U.defineStore("floodingPlane",()=>{const c=r.ref(0),t=r.ref(!1);function e(){return c.value}function o(i){c.value=i}function s(i){t.value=i}return{enable:t,getHeight:e,setEnabled:s,setHeight:o}}),me={class:"input-group mb-3"},ge={class:"input-group mb-3"},ye=["value"],be={class:"input-group mb-3"},_e=["value"],we=r.defineComponent({__name:"FloodingPlane",setup(c){const t=$();function e(o){t.setHeight(o)}return(o,s)=>(r.openBlock(),r.createElementBlock(r.Fragment,null,[r.createElementVNode("div",me,[r.createVNode(p._sfc_main,{"model-value":r.unref(t).enable,"onUpdate:modelValue":s[0]||(s[0]=i=>r.unref(t).setEnabled(i)),id:"flooding-plane-enable",title:"foo"},null,8,["model-value"]),s[3]||(s[3]=r.createElementVNode("label",{for:"flooding-plane-enable",class:"form-label"},"Enable flooding plane",-1))]),r.createElementVNode("div",ge,[s[5]||(s[5]=r.createElementVNode("label",{for:"flooding-altitude-range",class:"form-label"},"Altitude",-1)),r.createElementVNode("input",{id:"flooding-altitude-range",title:"Altitude",type:"range",class:"form-range",min:"0",step:"0.1",max:"500",value:r.unref(t).getHeight(),onInput:s[1]||(s[1]=i=>e(Number.parseFloat(i.target.value)))},null,40,ye),r.createElementVNode("div",be,[r.createElementVNode("input",{type:"number",class:"form-control",id:"flooding-altitude-number",step:"0.1",value:r.unref(t).getHeight(),onInput:s[2]||(s[2]=i=>e(Number.parseFloat(i.target.value)))},null,40,_e),s[4]||(s[4]=r.createElementVNode("span",{class:"input-group-text"},"m",-1))])])],64))}});class ve{constructor(){y(this,"geometry");y(this,"material");y(this,"object3D");y(this,"_height");this.geometry=new p.PlaneGeometry(1,1,1,1),this.material=new p.MeshBasicMaterial({color:43690,opacity:.5,transparent:!0}),this.object3D=new p.Mesh(this.geometry,this.material),this.object3D.renderOrder=2,this.visible=!1,this._height=0}set height(t){this._height=t}get height(){return this._height}set visible(t){this.object3D.visible=t}get visible(){return this.object3D.visible}dispose(){this.object3D.removeFromParent(),this.geometry.dispose(),this.material.dispose()}setPosition(t,e,o,s,i){this.object3D.scale.set(s,i,1),this.object3D.position.set(t,e,o),this.object3D.updateMatrixWorld()}}class xe{constructor(t){y(this,"_context");y(this,"_plane");y(this,"_store",$());this._context=t,this._plane=null,t.events.addEventListener("ready",()=>{this._store.$onAction(({after:e,name:o})=>{e(()=>{switch(o){case"setEnabled":this.updatePlane();break;case"setHeight":this.updatePlane();break}})})})}dispose(){this._plane&&(this._context.view.getInstance().remove(this._plane.object3D),this._plane.dispose())}async updatePlane(){this._plane||(this._plane=new ve,await this._context.view.getInstance().add(this._plane.object3D));const t=this._context.view.getBoundingBox(),e=t.getCenter(new p.Vector3),o=t.getSize(new p.Vector3);this._plane.visible=this._store.enable,this._plane.setPosition(e.x,e.y,this._store.getHeight(),o.x,o.y),this._context.view.getInstance().notifyChange()}}class Ce{constructor(){y(this,"id","builtin-flooding-plane-analysis");y(this,"name","Flooding plane");y(this,"_manager",null)}initialize(t){t.analysis.registerTool({component:we,icon:"bi-layers-half",name:"Flooding plane"}),this._manager=new xe(t)}}const D=new p.Matrix4,Ie={bbox:new p.MeshBasicMaterial({color:"#FFFF00",depthTest:!0,opacity:.2,transparent:!0}),selection:new p.MeshBasicMaterial({color:"#FF0000",depthTest:!1,opacity:.6,transparent:!0})},Pe=4186316022,Se=781010003,Ee=2655215786,Te=3242617779,Be=919958153,Ne=1307041759,G=1451395588,q=1883228015,Fe=[G,q],ke=[Pe,Se,Ee,Te,Be,Ne],H=c=>p.isObject(c)&&c.isIFCPickResult,A=class A extends R{constructor(e){super(new p.Group);y(this,"isIfcEntity",!0);y(this,"isPickableFeatures",!0);y(this,"type","IfcEntity");y(this,"_classificationCache");y(this,"_components");y(this,"_fragmentBoundingBox");y(this,"_fragmentClassifier");y(this,"_fragmentManager");y(this,"_ifcSelection");y(this,"_indexMap");y(this,"_model");y(this,"_source");this._source=e,this._components=new T.Components,this._components.ui.enabled=!1,this._components.scene=new T.SimpleScene(this._components),this._components.renderer=new T.SimpleRenderer(this._components,document.createElement("div")),this._components.camera=new T.SimpleCamera(this._components),this._components.raycaster=new T.SimpleRaycaster(this._components),this._components.init(),this._ifcSelection={bbox:{},selection:{}},this._indexMap={},this._classificationCache=null,this._fragmentBoundingBox=null}clearHighlight(e="selection"){for(const o of Object.keys(this._ifcSelection[e])){const s=this._fragmentManager.list[o],i=s==null?void 0:s.fragments[e];i!=null&&i.mesh.removeFromParent()}this.notifyChange(this),this._ifcSelection[e]={}}getBoundingBoxById(e){this.clearHighlight("bbox"),this.highlightById(e,"bbox");const o=this._fragmentBoundingBox;if(o===null)throw new Error("Must call initClassification before getBoundingBoxById");const s=this._fragmentManager;o.reset();const i=this._ifcSelection.bbox;if(!Object.keys(i).length)return;for(const g of Object.keys(i)){const S=s.list[g].fragments.bbox;o.addMesh(S.mesh)}const n=o.get(),{y:l,z:b}=n.min,{y:x,z:d}=n.max;return n.min.y=-d,n.max.y=-b,n.min.z=l,n.max.z=x,n.translate(this._model.position),this.clearHighlight("bbox"),n}getClassification(){if(this._classificationCache===null)throw new Error("Must call initClassification before getClassification");return this._classificationCache}getProperties(e){const o=[],s=this._model.properties;if(!s)return[];for(const i of this._indexMap[e]){const n=s[i];if(n==null)continue;const{name:l}=T.IfcPropertiesUtils.getEntityName(s,i);if(l!==null){if(n.type===G){const b=T.IfcPropertiesUtils.getPsetProps(s,i);if(b!==null)for(const x of b){if(s[x]==null)continue;const g=this.getProperty(x);g!==null&&o.push({parentName:l,...g})}}else if(n.type===q){const b=T.IfcPropertiesUtils.getQsetQuantities(s,i);if(b!==null)for(const x of b){const{key:d}=T.IfcPropertiesUtils.getQuantityValue(s,x);if(d===null)continue;const g=this.getProperty(x);g!==null&&o.push({parentName:l,...g})}}}}return o}getProperty(e){const o=this._model.properties;if(o===void 0)return null;const{name:s}=T.IfcPropertiesUtils.getEntityName(o,e);if(s===null)return null;const{value:i}=T.IfcPropertiesUtils.getQuantityValue(o,e);return{name:s,value:i}}highlight(e,o,s){this._ifcSelection[e][o.uuid]=new Set;const i=parseInt(s,10);this._ifcSelection[e][o.uuid].add(s),this.addComposites(e,o,i),this.regenerate(e,o.uuid);const n=o.fragment.group;if(n){const l=n.data[i][0];for(let b=0;b<l.length;b++){const x=l[b],d=n.keyFragments[x],g=this._fragmentManager.list[d];d in this._ifcSelection[e]||(this._ifcSelection[e][d]=new Set),this._ifcSelection[e][d].add(s),this.addComposites(e,g.mesh,i),this.regenerate(e,d)}}this.notifyChange(this)}highlightById(e,o="selection"){for(const s of Object.keys(e)){s in this._ifcSelection[o]||(this._ifcSelection[o][s]=new Set);const i=this._fragmentManager.list[s],n=new Set;for(const l of e[s])this._ifcSelection[o][s].add(l),n.add(parseInt(l,10));for(const l of n)this.addComposites(o,i.mesh,l);this.regenerate(o,s)}this.notifyChange(this)}pick(e,o){return super.pick(e,o).map(s=>({...s,entity:this,features:s.features,isIFCPickResult:!0,object:s.object}))}pickFeaturesFrom(e){var s,i,n;const o=e.object;if(o.fragment!=null&&e.instanceId!=null&&e.face){const l=o.fragment.getVertexBlockID(o.geometry,e.face.a),b=(s=o.fragment.getItemID(e.instanceId,l))==null?void 0:s.replace(/\..*/,"");if(b&&((n=(i=o.fragment.group)==null?void 0:i.properties)==null?void 0:n[b])!=null){const d=o.fragment.group.properties[b],I=[{ifcProperties:this.getProperties(b),itemProperties:d}];return e.features=I,I}}return[]}async initClassification(){this._classificationCache=await this.regenerateClassification(["storeys","entities"]),this._classificationCache.length===0&&(this._classificationCache=await this.regenerateClassification(["entities"])),this._fragmentBoundingBox=await this._components.tools.get(T.FragmentBoundingBox)}async preprocess(){const e=await p.Fetcher.fetchArrayBuffer(this._source.url);this._fragmentManager=await this._components.tools.get(T.FragmentManager),this._fragmentClassifier=await this._components.tools.get(T.FragmentClassifier);const o=new T.FragmentIfcLoader(this._components);o.settings.webIfc.COORDINATE_TO_ORIGIN=!0,o.settings.webIfc.OPTIMIZE_PROFILES=!0;const s=new Uint8Array(e);this._model=await o.load(s,this._source.name),this._model.rotateX(Math.PI/2);const i=new p.Vector3;if(this._source.at)this._source.at.toVector3(i),this._model.position.copy(i);else{const l=this._model.coordinationMatrix.clone().invert();i.applyMatrix4(l),this._model.position.set(i.x,-i.z,i.y)}this._model.updateWorldMatrix(!0,!0),this._model.updateMatrix(),this._model.updateMatrixWorld(!0),this.initializeEntityIndexes(),this._fragmentClassifier.byStorey(this._model),this._fragmentClassifier.byEntity(this._model),await this.initClassification(),this.object3d.add(this._model),this.onObjectCreated(this._model);const n=p.Fetcher.getContext(this._source.url);p.fillObject3DUserData(this,{filename:n.filename}),this.notifyChange(this.object3d)}addComposites(e,o,s){this.addHighlightToFragment(e,o.fragment);const i=o.fragment.composites[s];if(i)for(let n=1;n<i;n++){const l=T.toCompositeID(s,n);this._ifcSelection[e][o.uuid].add(l)}}addHighlightToFragment(e,o){if(!(e in o.fragments)){const s=o.addFragment(e,[Ie[e]]);o.blocks.count>1&&(s.setInstance(0,{ids:Array.from(o.ids),transform:D}),s.blocks.setVisibility(!1)),this._model.add(s.mesh),s.mesh.renderOrder=30,s.mesh.frustumCulled=!1,s.mesh.name=e,s.mesh.updateMatrixWorld(!0)}}initializeEntityIndexes(){this._indexMap={};const e=this._model.properties;if(e!==void 0)for(const o of ke)T.IfcPropertiesUtils.getRelationMap(e,o,(s,i)=>{const n=e[s];Fe.includes(n.type)||this.setEntityIndex(s);for(const l of i)this.setEntityIndex(l).add(s)})}regenerate(e,o){this.updateFragmentFill(e,o)}async regenerateClassification(e,o={}){const s=this._fragmentClassifier.get(),i=[],n=e[0],l=s[n];if(n==null||l==null)return i;for(const b of Object.keys(l)){const x={...o,[n]:[b]},d=await this._fragmentClassifier.find(x);if(Object.keys(d).length>0){const S=n[0].toUpperCase()+n.slice(1),P=await this.regenerateClassification(e.slice(1),x);i.push({children:P,fragments:d,name:b,treeItemName:S})}}return i}setEntityIndex(e){return e in this._indexMap||(this._indexMap[e]=new Set),this._indexMap[e]}updateFragmentFill(e,o){const s=this._ifcSelection[e][o],i=this._fragmentManager.list[o];if(i==null)return;const n=i.fragments[e];if(n==null)return;const l=i.mesh.parent;if(l==null)return;if(l.add(n.mesh),n.blocks.count>1)i.getInstance(0,D),n.setInstance(0,{ids:Array.from(i.ids),transform:D}),n.blocks.setVisibility(!0,s,!0);else{let x=0;for(const d of s){n.mesh.count=x+1;const{instanceID:g}=i.getInstanceAndBlockID(d);i.getInstance(g,D),n.setInstance(x,{ids:[d],transform:D}),x++}}}};y(A,"isIFCEntity",e=>p.isObject(e)&&e.isIfcEntity),y(A,"isIFCPickResult",e=>p.isObject(e)&&A.isIFCEntity(e.entity));let j=A;class Me extends J{constructor(t,e,o){super(t,e,o,{visibility:!0})}}const De={class:"d-flex"},Ae=["title"],Ve=["id"],Le={class:"list-unstyled border-start"},Oe=r.defineComponent({__name:"IfcSubtree",props:{classificationElement:{},ifcEntity:{}},setup(c){const t=c,e=p.MathUtils.generateUUID(),o=`#${e}`,s=r.ref(!1),i=p.useCameraStore(),l=p.useModuleStore().getModule(p.moduleId);function b(){if(l==null){console.warn("Cannot clip IFC element, ClippingBoxAnalysis module is not present");return}const g=t.ifcEntity.getBoundingBoxById(t.classificationElement.fragments);g&&!g.isEmpty()&&l.setClippingBox(g)}function x(){s.value=!0,t.ifcEntity.clearHighlight(),t.ifcEntity.highlightById(t.classificationElement.fragments),setTimeout(()=>s.value=!1,2e3)}function d(){const g=t.ifcEntity.getBoundingBoxById(t.classificationElement.fragments);g&&!g.isEmpty()&&i.lookTopDownAt(g)}return(g,I)=>{const S=r.resolveComponent("IfcSubtree",!0);return r.openBlock(),r.createElementBlock("div",null,[r.createElementVNode("div",De,[r.createElementVNode("span",{class:r.normalizeClass(["border rounded px-1 py-0 fw-normal",s.value?"text-danger border-danger":"text-secondary border-secondary"]),title:g.classificationElement.treeItemName},r.toDisplayString(g.classificationElement.treeItemName),11,Ae),g.classificationElement.children.length>0?(r.openBlock(),r.createBlock(p.IconList,{key:0},{default:r.withCtx(()=>[r.createVNode(p.IconListButton,{title:"Expand group",icon:"bi-chevron-down","data-bs-toggle":"collapse","data-bs-target":o,"aria-controls":r.unref(e),"aria-expanded":"true"},null,8,["aria-controls"])]),_:1})):r.createCommentVNode("",!0),r.createVNode(p._sfc_main$3,{class:r.normalizeClass(["label",s.value?"text-danger-emphasis":"text-muted"]),text:g.classificationElement.name,title:`Zoom to ${g.classificationElement.name}`,onClick:d},null,8,["class","text","title"]),r.createVNode(p.IconList,{class:"ms-1"},{default:r.withCtx(()=>[r.createVNode(p.IconListButton,{title:"Highlight",icon:"bi-highlighter",onClick:x}),r.unref(l)!=null?(r.openBlock(),r.createBlock(p.IconListButton,{key:0,title:"Clip to",icon:"bi-bounding-box",onClick:b})):r.createCommentVNode("",!0)]),_:1})]),g.classificationElement.children.length>0?(r.openBlock(),r.createElementBlock("div",{key:0,id:r.unref(e),class:"collapse show"},[r.createElementVNode("ul",Le,[(r.openBlock(!0),r.createElementBlock(r.Fragment,null,r.renderList(g.classificationElement.children,(P,B)=>(r.openBlock(),r.createElementBlock("li",{key:B},[r.createVNode(S,{"ifc-entity":t.ifcEntity,"classification-element":P},null,8,["ifc-entity","classification-element"])]))),128))])],8,Ve)):r.createCommentVNode("",!0)])}}}),ze=p._export_sfc(Oe,[["__scopeId","data-v-804ca598"]]),je={key:0},Re=r.defineComponent({__name:"IfcPropertyView",props:{dataset:{}},setup(c){const t=p.useDatasetStore(),e=c,o=p.refAndWatch(e.dataset,"isPreloaded");function s(){const n=i();return n==null?null:n.getClassification()}function i(){const n=t.getEntity(e.dataset);return n??null}return(n,l)=>r.unref(o)?(r.openBlock(),r.createElementBlock("div",je,[r.createElementVNode("ul",null,[(r.openBlock(!0),r.createElementBlock(r.Fragment,null,r.renderList(s(),(b,x)=>(r.openBlock(),r.createElementBlock("li",{key:x},[r.createVNode(ze,{"ifc-entity":i(),"classification-element":b},null,8,["ifc-entity","classification-element"])]))),128))])])):r.createCommentVNode("",!0)}}),Ue=p._export_sfc(Re,[["__scopeId","data-v-d2d82ae7"]]),Ye=c=>{if(H(c)){const t=c.object;if(t.fragment!=null&&c.face&&c.instanceId!=null){const e=t.fragment.getVertexBlockID(t.geometry,c.face.a),o=t.fragment.getItemID(c.instanceId,e).replace(/\..*/,"");return c.entity.highlight("selection",t,o),()=>c.entity.clearHighlight()}}return null},$e=c=>({name:c.filename,source:{url:c.file},type:"ifc",visible:!0}),Ge=(c,t)=>{var b,x,d,g,I,S,P,B,a;if(!H(c))return;const e=(b=c.features)==null?void 0:b.at(0);if(!e)return;t.has("IFC")||t.set("IFC",[]);const o=t.get("IFC"),{ifcProperties:s,itemProperties:i}=e,n="NULL",l=((x=i.Name)==null?void 0:x.value)??n;o.push({key:"Site",value:((g=(d=c.entity.object3d.userData)==null?void 0:d.dataset)==null?void 0:g.name)??n}),o.push({key:"IFCType",value:T.IfcCategoryMap[i.type]??n}),o.push({key:"Name",value:l}),o.push({key:"ID",value:i.expressID}),o.push({key:"GlobalId",value:((I=i.GlobalId)==null?void 0:I.value)??n}),((S=i.Description)==null?void 0:S.value)!=null&&o.push({key:"Description",value:i.Description.value}),((P=i.PredefinedType)==null?void 0:P.value)!=null&&o.push({key:"PredefinedType",value:i.PredefinedType.value}),((B=i.ObjectType)==null?void 0:B.value)!=null&&o.push({key:"ObjectType",value:i.ObjectType.value});for(const{name:f,parentName:h,value:u}of s)t.has(h)||t.set(h,[]),(a=t.get(h))==null||a.push({key:f,value:u})},qe=c=>{const t=c.dataset,e=t.config,o=p.getCoordinates(e.source.position??t.get("position")),s=new j({...e.source,at:o,name:t.name});return Promise.resolve(s)};class He{constructor(){y(this,"id","builtin-ifc-loader");y(this,"name","IFC")}async initialize(t){t.datasets.registerDatasetType("ifc",{attributeExtractor:Ge,entityBuilder:qe,fileExtensions:["ifc"],highlight:Ye,icon:"bi-building",loader:$e,name:"IFC",propertyView:Ue}),Q.registerInspector("IfcEntity",Me),await p.Fetcher.fetch("web-ifc.wasm").catch(e=>{console.warn("Could not load web-ifc.wasm",e)})}}const k=new p.Color;let We=class extends p.Loader{constructor(t){super(t),this.propertyNameMapping={},this.customPropertyMapping={}}load(t,e,o,s){const i=this,n=new p.FileLoader(this.manager);n.setPath(this.path),n.setResponseType("arraybuffer"),n.setRequestHeader(this.requestHeader),n.setWithCredentials(this.withCredentials),n.load(t,function(l){try{e(i.parse(l))}catch(b){s?s(b):console.error(b),i.manager.itemError(t)}},o,s)}setPropertyNameMapping(t){this.propertyNameMapping=t}setCustomPropertyNameMapping(t){this.customPropertyMapping=t}parse(t){function e(a,f=0){const h=/^ply([\s\S]*)end_header(\r\n|\r|\n)/;let u="";const m=h.exec(a);m!==null&&(u=m[1]);const _={comments:[],elements:[],headerLength:f,objInfo:""},v=u.split(/\r\n|\r|\n/);let w;function M(E,N){const C={type:E[0]};return C.type==="list"?(C.name=E[3],C.countType=E[1],C.itemType=E[2]):C.name=E[1],C.name in N&&(C.name=N[C.name]),C}for(let E=0;E<v.length;E++){let N=v[E];if(N=N.trim(),N==="")continue;const C=N.split(/\s+/),L=C.shift();switch(N=C.join(" "),L){case"format":_.format=C[0],_.version=C[1];break;case"comment":_.comments.push(N);break;case"element":w!==void 0&&_.elements.push(w),w={},w.name=C[0],w.count=parseInt(C[1]),w.properties=[];break;case"property":w.properties.push(M(C,B.propertyNameMapping));break;case"obj_info":_.objInfo=N;break;default:console.log("unhandled",L,C)}}return w!==void 0&&_.elements.push(w),_}function o(a,f){switch(f){case"char":case"uchar":case"short":case"ushort":case"int":case"uint":case"int8":case"uint8":case"int16":case"uint16":case"int32":case"uint32":return parseInt(a);case"float":case"double":case"float32":case"float64":return parseFloat(a)}}function s(a,f){const h={};for(let u=0;u<a.length;u++){if(f.empty())return null;if(a[u].type==="list"){const m=[],_=o(f.next(),a[u].countType);for(let v=0;v<_;v++){if(f.empty())return null;m.push(o(f.next(),a[u].itemType))}h[a[u].name]=m}else h[a[u].name]=o(f.next(),a[u].type)}return h}function i(){const a={indices:[],vertices:[],normals:[],uvs:[],faceVertexUvs:[],colors:[],faceVertexColors:[]};for(const f of Object.keys(B.customPropertyMapping))a[f]=[];return a}function n(a){const f=a.map(u=>u.name);function h(u){for(let m=0,_=u.length;m<_;m++){const v=u[m];if(f.includes(v))return v}return null}return{attrX:h(["x","px","posx"])||"x",attrY:h(["y","py","posy"])||"y",attrZ:h(["z","pz","posz"])||"z",attrNX:h(["nx","normalx"]),attrNY:h(["ny","normaly"]),attrNZ:h(["nz","normalz"]),attrS:h(["s","u","texture_u","tx"]),attrT:h(["t","v","texture_v","ty"]),attrR:h(["red","diffuse_red","r","diffuse_r"]),attrG:h(["green","diffuse_green","g","diffuse_g"]),attrB:h(["blue","diffuse_blue","b","diffuse_b"])}}function l(a,f){const h=i(),u=/end_header\s+(\S[\s\S]*\S|\S)\s*$/;let m,_;(_=u.exec(a))!==null?m=_[1].split(/\s+/):m=[];const v=new Xe(m);e:for(let w=0;w<f.elements.length;w++){const M=f.elements[w],E=n(M.properties);for(let N=0;N<M.count;N++){const C=s(M.properties,v);if(!C)break e;x(h,M.name,C,E)}}return b(h)}function b(a){let f=new p.BufferGeometry;a.indices.length>0&&f.setIndex(a.indices),f.setAttribute("position",new p.Float32BufferAttribute(a.vertices,3)),a.normals.length>0&&f.setAttribute("normal",new p.Float32BufferAttribute(a.normals,3)),a.uvs.length>0&&f.setAttribute("uv",new p.Float32BufferAttribute(a.uvs,2)),a.colors.length>0&&f.setAttribute("color",new p.Float32BufferAttribute(a.colors,3)),(a.faceVertexUvs.length>0||a.faceVertexColors.length>0)&&(f=f.toNonIndexed(),a.faceVertexUvs.length>0&&f.setAttribute("uv",new p.Float32BufferAttribute(a.faceVertexUvs,2)),a.faceVertexColors.length>0&&f.setAttribute("color",new p.Float32BufferAttribute(a.faceVertexColors,3)));for(const h of Object.keys(B.customPropertyMapping))a[h].length>0&&f.setAttribute(h,new p.Float32BufferAttribute(a[h],B.customPropertyMapping[h].length));return f.computeBoundingSphere(),f}function x(a,f,h,u){if(f==="vertex"){a.vertices.push(h[u.attrX],h[u.attrY],h[u.attrZ]),u.attrNX!==null&&u.attrNY!==null&&u.attrNZ!==null&&a.normals.push(h[u.attrNX],h[u.attrNY],h[u.attrNZ]),u.attrS!==null&&u.attrT!==null&&a.uvs.push(h[u.attrS],h[u.attrT]),u.attrR!==null&&u.attrG!==null&&u.attrB!==null&&(k.setRGB(h[u.attrR]/255,h[u.attrG]/255,h[u.attrB]/255,p.SRGBColorSpace),a.colors.push(k.r,k.g,k.b));for(const m of Object.keys(B.customPropertyMapping))for(const _ of B.customPropertyMapping[m])a[m].push(h[_])}else if(f==="face"){const m=h.vertex_indices||h.vertex_index,_=h.texcoord;m.length===3?(a.indices.push(m[0],m[1],m[2]),_&&_.length===6&&(a.faceVertexUvs.push(_[0],_[1]),a.faceVertexUvs.push(_[2],_[3]),a.faceVertexUvs.push(_[4],_[5]))):m.length===4&&(a.indices.push(m[0],m[1],m[3]),a.indices.push(m[1],m[2],m[3])),u.attrR!==null&&u.attrG!==null&&u.attrB!==null&&(k.setRGB(h[u.attrR]/255,h[u.attrG]/255,h[u.attrB]/255,p.SRGBColorSpace),a.faceVertexColors.push(k.r,k.g,k.b),a.faceVertexColors.push(k.r,k.g,k.b),a.faceVertexColors.push(k.r,k.g,k.b))}}function d(a,f){const h={};let u=0;for(let m=0;m<f.length;m++){const _=f[m],v=_.valueReader;if(_.type==="list"){const w=[],M=_.countReader.read(a+u);u+=_.countReader.size;for(let E=0;E<M;E++)w.push(v.read(a+u)),u+=v.size;h[_.name]=w}else h[_.name]=v.read(a+u),u+=v.size}return[h,u]}function g(a,f,h){function u(m,_,v){switch(_){case"int8":case"char":return{read:w=>m.getInt8(w),size:1};case"uint8":case"uchar":return{read:w=>m.getUint8(w),size:1};case"int16":case"short":return{read:w=>m.getInt16(w,v),size:2};case"uint16":case"ushort":return{read:w=>m.getUint16(w,v),size:2};case"int32":case"int":return{read:w=>m.getInt32(w,v),size:4};case"uint32":case"uint":return{read:w=>m.getUint32(w,v),size:4};case"float32":case"float":return{read:w=>m.getFloat32(w,v),size:4};case"float64":case"double":return{read:w=>m.getFloat64(w,v),size:8}}}for(let m=0,_=a.length;m<_;m++){const v=a[m];v.type==="list"?(v.countReader=u(f,v.countType,h),v.valueReader=u(f,v.itemType,h)):v.valueReader=u(f,v.type,h)}}function I(a,f){const h=i(),u=f.format==="binary_little_endian",m=new DataView(a,f.headerLength);let _,v=0;for(let w=0;w<f.elements.length;w++){const M=f.elements[w],E=M.properties,N=n(E);g(E,m,u);for(let C=0;C<M.count;C++){_=d(v,E),v+=_[1];const L=_[0];x(h,M.name,L,N)}}return b(h)}function S(a){let f=0,h=!0,u="";const m=[],_=new TextDecoder().decode(a.subarray(0,5)),v=/^ply\r\n/.test(_);do{const w=String.fromCharCode(a[f++]);w!==`
|
|
2
|
+
`&&w!=="\r"?u+=w:(u==="end_header"&&(h=!1),u!==""&&(m.push(u),u=""))}while(h&&f<a.length);return v===!0&&f++,{headerText:m.join("\r")+"\r",headerLength:f}}let P;const B=this;if(t instanceof ArrayBuffer){const a=new Uint8Array(t),{headerText:f,headerLength:h}=S(a),u=e(f,h);if(u.format==="ascii"){const m=new TextDecoder().decode(a);P=l(m,u)}else P=I(t,u)}else P=l(t,e(t));return P}};class Xe{constructor(t){this.arr=t,this.i=0}empty(){return this.i>=this.arr.length}next(){return this.arr[this.i++]}}const V=class V extends p.Mesh{constructor(){super(...arguments);y(this,"isPickableFeatures",!0);y(this,"isPlyMesh",!0)}pickFeaturesFrom(e){if(this.geometry.hasAttribute("color")&&e.face){const o=this.geometry.getAttribute("color").array,s=e.face,n=[{color:new p.Color(o[s.a*3],o[s.a*3+1],o[s.a*3+2])}];return e.features=n,n}return[]}};y(V,"isPlyMesh",e=>p.isObject(e)&&e.isPlyMesh),y(V,"isPlyPickResult",e=>p.isObject(e)&&V.isPlyMesh(e==null?void 0:e.object));let O=V;class Ze extends R{constructor(e){super(new p.Group);y(this,"isPlyEntity",!0);y(this,"source");this.source=e}async preprocess(){const e=await p.Fetcher.fetchArrayBuffer(this.source.url),o=this.source.at.as(this.source.featureProjection).toVector3(),i=new We().parse(e),n=new p.MeshLambertMaterial({side:p.DoubleSide});i.hasAttribute("color")&&(n.vertexColors=!0),i.computeVertexNormals();const l=new O(i,n);l.name="plyModel",i.computeBoundingBox(),l.position.copy(o),l.updateWorldMatrix(!0,!0),this.object3d.add(l),this.onObjectCreated(l);const b=p.Fetcher.getContext(this.source.url);p.fillObject3DUserData(this,{filename:b.filename}),this.notifyChange(this.object3d)}}const Qe=c=>{const{dataset:t,instance:e}=c,o=t.config,s=p.getCoordinates(o.source.position??t.get("position")),i=new Ze({...o.source,at:s,featureProjection:e.referenceCrs});return Promise.resolve(i)},Je=(c,t)=>{var s;if(!O.isPlyPickResult(c))return;const e=(s=c.features)==null?void 0:s.at(0);if(!e)return;t.has("PLY")||t.set("PLY",[]),t.get("PLY").push({key:"Color",value:e.color})};class Ke{constructor(){y(this,"id","builtin-ply-loader");y(this,"name","PLY")}initialize(t){t.datasets.registerDatasetType("ply",{attributeExtractor:Je,entityBuilder:Qe,icon:"bi-file-earmark-binary",name:"PLY"})}}const et=c=>{const t=c.dataset.config,e=new K({source:new ee({url:`${t.source.url}/${t.source.filename}`})});return p.fillObject3DUserData(e,{filename:t.source.url}),Promise.resolve(e)};class tt{constructor(){y(this,"id","builtin-potree-loader");y(this,"name","Potree")}initialize(t){t.datasets.registerDatasetType("potree",{entityBuilder:et,icon:"fg-multipoint",name:"Potree Point Cloud"})}}class nt{constructor(){y(this,"id","builtin-tour");y(this,"name","Tour");y(this,"_camera",null);y(this,"_cameraCallback",null);y(this,"_context",null);y(this,"_tours",null)}initialize(t){this._context=t,t.events.addEventListener("ready",this.start.bind(this))}buildTours(){const t=this._camera,e=new F.Tour({tourName:"main",useModalOverlay:!0}),o=new F.Tour({tourName:"navigating",useModalOverlay:!0}),s=new F.Tour({tourName:"analyzing",useModalOverlay:!0}),i=[{action:()=>{var d;return(d=F.activeTour)==null?void 0:d.next()},text:"Next"},{action:()=>{var d;return(d=F.activeTour)==null?void 0:d.cancel()},secondary:!0,text:"Exit"}],n=()=>{var a,f;const d=(a=F.activeTour)==null?void 0:a.getCurrentStep(),g=d==null?void 0:d.getElement(),I=g==null?void 0:g.querySelector(".shepherd-text"),S=(f=F.activeTour)==null?void 0:f.steps;if(d==null||g==null||I==null||S==null)return;const P=document.createElement("div");P.className="progress mt-3",P.setAttribute("role","progressbar"),P.style.height="2px";const B=document.createElement("div");B.className="progress-bar bg-success",B.style.width=`${100*(S.indexOf(d)/S.length)}%`,P.appendChild(B),I.appendChild(P)},l=async(d,g)=>new Promise(I=>{const S=document.getElementById(d);if(S&&!S.classList.contains("active")&&S.click(),document.querySelector(g))return I(document.querySelector(g));const P=new MutationObserver(()=>{document.querySelector(g)&&(P.disconnect(),I(document.querySelector(g)))});P.observe(document.body,{childList:!0,subtree:!0})});e.addStep({buttons:[{action:()=>{var d;(d=F.activeTour)==null||d.complete(),o.show(0)},text:"Navigating"},{action:()=>{var d;(d=F.activeTour)==null||d.complete(),s.show(0)},text:"Analyzing data"},{action:()=>{var d;return(d=F.activeTour)==null?void 0:d.cancel()},secondary:!0,text:"Exit"}],cancelIcon:{enabled:!0,label:"Exit tutorial"},id:"example-step",text:"<p>Welcome to <strong>Piero</strong>, the Giro3D application.<br/>We can guide you through the different features.</p>",title:"Welcome!",when:{show:n}}),o.addStep({attachTo:{element:"#main-view",on:"bottom"},buttons:i,id:"view",text:"<p>This is the <b>main view</b>.</p><p>Giro3D natively supports a broad range of data sources, from 2D raster and vector data, to 3D point clouds and tilesets.</p><p>Piero adds support for CityJSON and IFC files.</p>",when:{show:n}}),o.addStep({attachTo:{element:"#main-view",on:"bottom"},buttons:i,id:"navigate",text:'<p>This application integrates <a href="https://github.com/yomotsu/camera-controls">camera-controls</a>, a camera control for three.js.</p><p><b>Click</b> to move the camera. <b>Right-click</b> to rotate around a point. <b>Scroll</b> to zoom in or out.</p>',when:{hide:()=>{this._cameraCallback&&t.removeEventListener("interaction-end",this._cameraCallback),this._cameraCallback=null},show:()=>{let d=0;this._cameraCallback=()=>{var g;d+=1,d>2&&((g=F.activeTour)==null||g.next())},t.addEventListener("interaction-end",this._cameraCallback),n()}}}),o.addStep({attachTo:{element:"#toolbar",on:"right"},beforeShowPromise:()=>l("toolbar-datasets","#datasets-drop-zone"),buttons:i,id:"toolbar-layers",text:"<p>Giro3D supports multiple datasets.</p><p>You can toggle datasets as you wish with the <b>Datasets</b> panel.</p>",when:{show:n}}),o.addStep({attachTo:{element:"#basemap-list",on:"right"},beforeShowPromise:()=>l("toolbar-datasets","#datasets-drop-zone"),buttons:i,id:"basemaps",text:"<p><b>Basemaps</b> are color and elevation layers that make the basic shape and aspect of the <b>Map</b>.</p>",when:{show:n}}),o.addStep({attachTo:{element:"#overlay-list",on:"right"},beforeShowPromise:()=>l("toolbar-datasets","#datasets-drop-zone"),buttons:i,id:"overlays",text:"<p><b>Overlays</b> are vector layers in various formats (WFS, GML, GeoJSON...).</p>",when:{show:n}}),o.addStep({attachTo:{element:"#dataset-list",on:"right"},beforeShowPromise:()=>l("toolbar-datasets","#datasets-drop-zone"),buttons:i,id:"layers",text:"<p>The <b>Datasets</b> panel contains all 3D objects in the scene.</><p>You can toggle their visibility and delete them.<p><p>Most objects leverage Giro3D's adaptive resolution to optimize their display.</p>",when:{show:n}}),o.addStep({attachTo:{element:"#datasets-drop-zone",on:"right"},beforeShowPromise:()=>l("toolbar-datasets","#datasets-drop-zone"),buttons:i,id:"adddata",text:"<p>You can add your own data from your computer by <b>dragging the file</b> into this page.</p><p>While you won't benefit from Giro3D's tiling mechanism, this can be a great way to quickly visualize datasets up to 100MB.</p><p>This application supports CityJSONs, IFCs, LAS/LAZs, CSV pointclouds, and simple GeoJSON features.</p>",when:{show:n}}),o.addStep({attachTo:{element:"#main-view",on:"bottom"},buttons:i,id:"attributes",text:"<p>By clicking on any feature on the map, you can see its <strong>Attribute table</strong>. Clickable features display a cursor when hovered.</p>",when:{show:n}}),o.addStep({attachTo:{element:"#search-place-autocomplete",on:"bottom"},buttons:[{action:()=>{var d;(d=F.activeTour)==null||d.complete(),s.show(0)},text:"Analyzing data"},{action:()=>{var d;return(d=F.activeTour)==null?void 0:d.complete()},secondary:!0,text:"Exit"}],id:"widgets",text:"Giro3D is highly extensible. Here we added a widget to search and navigate to locations based on the French address database.",when:{show:n}}),s.addStep({attachTo:{element:"#annotations-fieldset",on:"right"},beforeShowPromise:()=>l("toolbar-annotations","#annotations-fieldset"),buttons:i,id:"annotation",text:"<p>You can <strong>annotate</strong> any data displayed using Giro3D native tools.<br>Select the <strong>geometry</strong> of your annotation, and <strong>click</strong> on the scene to add points. <strong>Right-click</strong> to end the shape.</p>",when:{show:n}}),s.addStep({attachTo:{element:"#annotations-fieldset",on:"right"},beforeShowPromise:()=>l("toolbar-annotations","#annotations-fieldset"),buttons:i,id:"annotations",text:"You can download your annotations as GeoJSON files. You can also upload your own by dragging them into this panel.",when:{show:n}}),p.hasExperimentalFeature("measurements")&&s.addStep({attachTo:{element:"#panel-container",on:"right"},beforeShowPromise:()=>l("toolbar-measures","#measures-fieldset"),buttons:i,id:"measurements",text:"You can add <strong>measurements</strong> to easily get distances betwween objects.<br>Once started, moving the mouse will display the measure. <strong>Click</strong> to save the measurement. <strong>Right-click</strong> to end.",when:{show:n}}),s.addStep({attachTo:{element:"#panel-container",on:"right"},beforeShowPromise:()=>l("toolbar-analysis","#panel-container .card"),buttons:[{action:()=>{var d;return(d=F.activeTour)==null?void 0:d.complete()},text:"Done!"}],id:"analysis",text:"In the <strong>Analysis</strong> panel you'll find some advanced analysis tools.",when:{show:n}});const b=()=>{const d=new URL(document.URL);d.searchParams.delete("tourStep"),d.searchParams.set("tour","none"),window.history.replaceState({},"",d.toString())},x=d=>{const g=new URL(document.URL);let I="main";d.tour.id.startsWith("navigating")?I="navigating":d.tour.id.startsWith("analyzing")&&(I="analyzing"),g.searchParams.set("tour",I),g.searchParams.set("tourStep",d.step.id),window.history.replaceState({},"",g.toString())};return e.on("cancel",b),e.on("complete",b),e.on("show",x),o.on("cancel",b),o.on("complete",b),o.on("show",x),s.on("cancel",b),s.on("complete",b),s.on("show",x),{analyzingTour:s,mainTour:e,navigatingTour:o}}getTours(){return this._tours||(this._tours=this.buildTours()),this._tours}restart(){const{mainTour:t}=this.getTours();t.show(0)}start(){if(!this._context)throw new Error("module is not initialized");const{analyzingTour:t,mainTour:e,navigatingTour:o}=this.getTours();this._camera=this._context.view.getCameraController();const s=new URL(document.URL),i=s.searchParams.get("tour")??"main";if(i!=="none"){const n=s.searchParams.get("tourStep")??0;i==="navigating"?o.show(n):i==="analyzing"?t.show(n):e.show(n)}}}exports.ClippingBoxAnalysis=p.ClippingBoxAnalysis;exports.CrossSectionAnalysis=pe;exports.DownloadDataset=fe;exports.FloodingPlaneAnalysis=Ce;exports.IFCLoader=He;exports.PLYLoader=Ke;exports.PotreeLoader=tt;exports.Tour=nt;
|
|
3
3
|
//# sourceMappingURL=modules.cjs.js.map
|