@bimdata/viewer 2.18.0-beta.21 → 2.18.0-beta.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.
|
@@ -90645,7 +90645,7 @@ export {
|
|
|
90645
90645
|
|
|
90646
90646
|
gl_FragColor = vec4(composed, sceneSample.a);
|
|
90647
90647
|
}
|
|
90648
|
-
`,depthTest:!1,depthWrite:!1,transparent:!1}),this.fsQuad=new j0(this.combineMaterial),this._drawingBufferSize=new _E(1,1)}setSize(e,t){this.isolatedDepthTarget.setSize(e,t),this.isolatedColorTarget.setSize(e,t)}syncRenderTargetSize(e,t){let n=t?.width??t?.texture?.image?.width,r=t?.height??t?.texture?.image?.height,i=Number.isFinite(n)?n:0,a=Number.isFinite(r)?r:0;(i<=0||a<=0)&&(e.getDrawingBufferSize(this._drawingBufferSize),i=this._drawingBufferSize.x,a=this._drawingBufferSize.y),i=Math.max(1,Math.floor(i)),a=Math.max(1,Math.floor(a)),(this.isolatedDepthTarget.width!==i||this.isolatedDepthTarget.height!==a)&&this.setSize(i,a)}render(e,t,n){let r=this.world.camera?.three,i=this.world.scene?.three;if(!r||!i)return;this.syncRenderTargetSize(e,n);let a=e.autoClear,o=i.overrideMaterial,s=this.isolatedScene.overrideMaterial,c=this.isolatedScene.background,l=this.isolatedScene.environment,u=this.isolatedScene.fog,d=e.getClearColor(new VE),f=e.getClearAlpha(),p=[];try{e.autoClear=!0,this.isolatedScene.overrideMaterial=this.depthMaterial,this.isolatedScene.background=null,this.isolatedScene.environment=i.environment??null,this.isolatedScene.fog=i.fog??null,e.setRenderTarget(this.isolatedDepthTarget),e.setClearColor(16777215,1),e.clear(!0,!0,!0),e.render(this.isolatedScene,r),this.isolatedScene.overrideMaterial=s,i.traverse(e=>{if(!e?.isLight)return;let t=e.clone();t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.matrixWorld.copy(e.matrixWorld),this.isolatedScene.add(t),p.push(t)}),e.setRenderTarget(this.isolatedColorTarget),e.setClearColor(0,0),e.clear(!0,!0,!0),e.render(this.isolatedScene,r),this.combineMaterial.uniforms.tDiffuse.value=n.texture,this.combineMaterial.uniforms.tIsoDepth.value=this.isolatedDepthTarget.texture,this.combineMaterial.uniforms.tIsoColor.value=this.isolatedColorTarget.texture,e.autoClear=!1,e.setRenderTarget(this.renderToScreen?null:t),this.fsQuad.render(e)}finally{for(let e of p)e.removeFromParent();this.isolatedScene.overrideMaterial=s,this.isolatedScene.background=c,this.isolatedScene.environment=l,this.isolatedScene.fog=u,i.overrideMaterial=o,e.setClearColor(d,f),e.autoClear=a}}dispose(){this.fsQuad.dispose(),this.combineMaterial.dispose(),this.depthMaterial.dispose(),this.isolatedDepthTarget.dispose(),this.isolatedColorTarget.dispose()}};function tXn(e){let{fragments:t,components:n,world:r,OBF:i,$viewer:a}=e,o=n.get(i.Outliner),s=!1,c={},l=Promise.resolve(),u=null,d=null,f=null,p=null,m=null,h=null,g=new Map,_=new UE,v=new Set,y=new Map,b=!1,x=(e=[])=>{v.clear();for(let t of e)v.add(t)},S=()=>{s||=(r.renderer?.postproduction&&(r.renderer.postproduction.enabled=!0),o.world=r,o.enabled=!0,o.create(c6,{fillOpacity:0,priority:$Yn}),o.configure(c6,{fillOpacity:0,priority:$Yn}),!0)},C=e=>{let t=c[e];return!!(t&&t.size>0)},w=e=>{C(e)&&ue()},T=(e,t)=>{if(!e||!t?.onViewUpdated||y.has(e))return;let n=()=>{w(e)};t.onViewUpdated.add(n),y.set(e,{model:t,callback:n})},E=e=>{let t=y.get(e);t&&(t.model?.onViewUpdated?.remove?.(t.callback),y.delete(e))},D=()=>{for(let[e,n]of t.list)T(e,n);p||(p=({key:e,value:t})=>{T(e,t)},t.list.onItemSet.add(p)),m||(m=e=>{E(e)},t.list.onItemDeleted.add(m))},ee=(e,t)=>{let n=null;try{n=t.outlinePass}catch{n=null}return n&&e.passes.includes(n)?n:e.passes.find(e=>e.constructor?.name===`OutputPass`)??null},te=()=>{if(!u)return;let e=r.renderer?.postproduction,t=e?.composer;if(!t)return;let n=ee(t,e),i=t.passes.indexOf(u);if(i!==-1){if((t.passes[i+1]??null)===n)return;t.removePass(u)}let a=n?t.passes.indexOf(n):-1;a===-1?t.addPass(u):t.insertPass(u,a)},ne=()=>{let e=r.renderer;!e||!e.postproduction||(e.postproduction.enabled=!0,u||(u=new eXn(r,_),u.enabled=!1,d=({x:e,y:t})=>{u?.setSize(Math.max(1,e),Math.max(1,t))},e.onResize.add(d),f=()=>{u?.enabled&&te()},e.onBeforeUpdate.add(f)),te())},re=e=>{let t={};for(let[n,r]of Object.entries(e??{})){let e=r instanceof Set?r:new Set(r);e.size>0&&(t[n]=e)}return t},ie=()=>{for(let e of Object.values(c))if(e.size>0)return!0;return!1},ae=e=>{if(!e||!e.fragments)return!1;let t=e.fragments.modelId,n=c[t];return!!(n&&n.has(e.localId))},oe=(e,t)=>{for(let t of e.values())for(let e of t)e.removeFromParent();e.clear(),t&&t.clear()},se=()=>{oe(g,_)},ce=(e,t,n,r)=>{let i=e.geometry;if(!i)return null;let a=Array.isArray(e.material)?e.material.filter(Boolean):[e.material].filter(Boolean);if(a.length===0)return null;let o=e=>a.length===1?0:Math.max(0,Math.min(Number.isInteger(e)?e:0,a.length-1)),s=new yD;s.attributes=i.attributes,i.index&&s.setIndex(i.index),s.boundingBox=i.boundingBox,s.boundingSphere=i.boundingSphere;let c=i.index?.array?.length??i.index?.count??0,l=c>0?c:i.getAttribute(`position`)?.count??0,u=i.groups?.length>0?i.groups:[{start:0,count:l,materialIndex:0}],d=Math.min(t.position?.length??0,t.size?.length??0);for(let e=0;e<d;e+=1){let n=Math.max(0,t.position[e]??0),r=t.size[e]??0,i=r===4294967295?Math.max(0,l-n):Math.max(0,r);if(i===0)continue;let a=n+i,c=!1;for(let e of u){let t=Math.max(0,e.start??0),r=e.count===1/0?Math.max(0,l-t):Math.max(0,e.count??0);if(r===0)continue;let i=t+r,u=Math.max(n,t),d=Math.min(a,i)-u;if(d<=0)continue;let f=o(e.materialIndex??0);s.addGroup(u,d,f),c=!0}c||s.addGroup(n,i,0)}let f=new OD(s,a);return f.matrixAutoUpdate=!1,f.matrixWorldAutoUpdate=!1,f.frustumCulled=!1,f.matrixWorld.copy(e.matrixWorld),f.userData.isolatedPick={modelId:n,localId:r},f},le=async e=>{let n=g,r=new Map,i=Object.entries(e);for(let[e,a]of i){let i=t.list.get(e);if(i)for(let t of a){let a;try{a=await i.getItemDrawChunks([t])}catch{continue}if(!a?.length)continue;let o=`${e}:${t}`,s=new Set;for(let n of a){let r=i.tiles.get(n.tileId);if(!r)continue;let a=ce(r,n,e,t);a&&(a.renderOrder=40,_.add(a),s.add(a))}if(s.size===0)continue;r.set(o,s);let c=n.get(o);if(c){for(let e of c)e.removeFromParent();n.delete(o)}}}for(let e of n.values())for(let t of e)t.removeFromParent();g=r},ue=()=>{if(b)return;b=!0;let t=async()=>{b=!1,ie()&&(await le(c),e.requestRender())};l=l.then(t,t)},de=async n=>{let r=c;c=n;let i=Object.keys(n).length>0;u&&(u.enabled=i),Object.keys(r).length>0&&s&&await o.removeItems(r,c6),i?(ne(),u.enabled=!0,await le(n)):se(),i?(S(),await o.addItems(n,c6)):s&&o.clean(c6),await t.core.update(!0),e.requestRender()},fe=async(e=[],n=!0)=>{let r=[...new Set(e)];if(n&&a.state.selectedObjects.length>0){let e=new Set(r),t=a.state.selectedObjectsUuids.filter(t=>e.has(t));t.length>0&&a.state.deselectObjectsByUuids(t)}let i=await t.guidsToModelIdMap(r),o=re(i);return l=l.then(async()=>{await de(o),x(r)},async()=>{await de(o),x(r)}),l},pe=async()=>{let e={};return l=l.then(async()=>{await de(e),x()},async()=>{await de(e),x()}),l},me={isolate:fe,clear:pe,isolatedUuids:v,isPickResultExcludedFromPrimaryPick(e){return ie()&&!ae(e)}};return D(),h=XYn({$viewer:a,onIsolationChanged:async({isolatedUuids:e,isolatedAwayUuids:t})=>{if(t.length===0||e.length===0){await pe();return}await fe(e,!1)}}),{destroy(){h&&=(h(),null);for(let e of[...y.keys()])E(e);p&&=(t.list.onItemSet.remove(p),null),m&&=(t.list.onItemDeleted.remove(m),null);let e=r.renderer;e&&d&&e.onResize.remove(d),d=null,e&&f&&e.onBeforeUpdate.remove(f),f=null,u&&=(e?.postproduction?.composer?.removePass(u),u.dispose(),null),se()},extension:me}}var l6=`select`,nXn=20;function rXn(e){let{fragments:t,$viewer:n,OBC:r,OBF:i,components:a,world:o}=e,s=a.get(i.Outliner),c=!1,l=new VE(6878522),u=new VE(6878522),d=.15,f=1,p=()=>{c||=(o.renderer.postproduction.enabled=!0,s.world=o,s.enabled=!0,s.create(l6,{color:l,fillColor:u,fillOpacity:d,thickness:f,priority:nXn}),!0)},m=()=>{c&&s.configure(l6,{color:l,fillColor:u,fillOpacity:d,thickness:f,priority:nXn})},h={},g=async(n,i=`add`)=>{if(i!==`add`&&i!==`remove`)throw TypeError(`[BIMDataViewer - 3D Fragments - select] Invalid action, expected 'add' or 'remove', got `+i);let a=await t.guidsToModelIdMap(n);i===`add`?(r.ModelIdMapUtils.add(h,a),p(),await s.addItems(a,l6)):(r.ModelIdMapUtils.remove(h,a),await s.removeItems(a,l6)),await t.core.update(!0),e.requestRender()},_=e=>e.map(e=>e.uuid).filter(Boolean),v=Promise.resolve(),y=e=>(v=v.then(e,e),v),b=({key:e,value:t})=>{let n=o.renderer?.postproduction?.outlinePass;if(n&&t?.tiles)for(let[,e]of t.tiles)n.detachOutlinedTile(e);s._tileListeners?.get(e)?.(),s._tileListeners?.delete(e);let r=h[e];if(!r)return;let i={[e]:new Set(r)};delete h[e],y(()=>s.removeItems(i,l6))};t.list.onBeforeDelete.add(b);let x=[n.state.hub.on(`objects-selected`,({objects:e})=>{let t=e.filter(e=>e.visible);y(()=>g(_(t),`add`))}),n.state.hub.on(`objects-deselected`,({objects:e})=>{y(()=>g(_(e),`remove`))}),n.state.hub.on(`objects-hidden`,({objects:e})=>{let t=e.filter(e=>e.selected);y(()=>g(_(t),`remove`))}),n.state.hub.on(`objects-shown`,({objects:e})=>{let t=e.filter(e=>e.selected);y(()=>g(_(t),`add`))})],S=!0,C=e.onPick(async({pickResult:e,event:r})=>{if(!S)return;let i=!r.shiftKey;if(!e){i&&n.state.deselectObjects(n.state.selectedObjects.map(e=>e.id));return}let{fragments:a,localId:o}=e,s={[a.modelId]:new Set([o])},c=(await t.modelIdMapToGuids(s))[0];if(!c)return;let l=n.state.getObjectsByUuids([c])[0];l&&(l.selected?n.state.deselectObjects([l.id]):n.state.selectObjects([l.id],{exclusive:i}))});return{destroy(){C(),t.list.onBeforeDelete.remove(b),s.clean(l6),s.remove(l6),x.forEach(e=>n.state.hub.off(e))},extension:{get selectOnClick(){return S},set selectOnClick(e){S=e},get color(){return l},set color(e){l=e,m()},get fillColor(){return u},set fillColor(e){u=e,m()},get fillOpacity(){return d},set fillOpacity(e){d=e,m()},get thickness(){return f},set thickness(e){f=e,m()}}}}function iXn(e){let{fragments:t,$viewer:n,OBC:r,components:i}=e,a=i.get(r.Hider),o=async n=>{let r;r=Array.isArray(n)?await t.guidsToModelIdMap(n):n,await a.set(!0,r),await t.core.update(!0),e.requestRender()},s=async n=>{let r;r=Array.isArray(n)?await t.guidsToModelIdMap(n):n,await a.set(!1,r),await t.core.update(!0),e.requestRender()},c=e=>e.map(e=>e.uuid).filter(Boolean),l=[n.state.hub.on(`objects-shown`,({objects:e})=>o(c(e))),n.state.hub.on(`objects-hidden`,({objects:e})=>s(c(e)))];return{destroy(){l.forEach(e=>n.state.hub.off(e))},extension:{show:o,hide:s}}}function aXn(e){let{fragments:t,$viewer:n}=e,r=Promise.resolve(),i=e=>(r=r.then(e,e),r),a=e=>e.map(e=>e.uuid).filter(Boolean),o=e=>Object.keys(e||{}).length>0,s=async e=>Array.isArray(e)?t.guidsToModelIdMap(e):e||{},c=e=>(e instanceof Set?[...e]:[...new Set(e||[])]).filter(e=>Number.isFinite(e)),l=e=>e instanceof VE?e:new VE(e),u=async(n,r)=>{if(r==null)return d(n);let i=await s(n);if(!o(i))return;let a=[],u=l(r);for(let[e,n]of Object.entries(i)){let r=t.list.get(e);if(!r)continue;let i=c(n);i.length!==0&&a.push(r.setColor(i,u))}await Promise.all(a),await t.core.update(!0),e.requestRender()},d=async n=>{let r=await s(n);if(!o(r))return;let i=[];for(let[e,n]of Object.entries(r)){let r=t.list.get(e);if(!r)continue;let a=c(n);a.length!==0&&i.push(r.resetColor(a))}await Promise.all(i),await t.core.update(!0),e.requestRender()},f=[n.state.hub.on(`objects-colorized`,({objects:e,color:t})=>{let n=a(e);n.length&&i(()=>t==null?d(n):u(n,t))})];return{destroy(){f.forEach(e=>n.state.hub.off(e))},extension:{colorize:(e,t)=>i(()=>u(e,t)),resetColorize:e=>i(()=>d(e))}}}var oXn=e=>{if(e.length===0)return null;if(e.length===1)return e[0].clone();if(e.length===2)return e[0].clone().add(e[1]).multiplyScalar(.5);let t=e[0],n=new L,r=0;for(let i=1;i+1<e.length;i+=1){let a=e[i],o=e[i+1],s=.5*a.clone().sub(t).cross(o.clone().sub(t)).length();if(!Number.isFinite(s)||s<=1e-6)continue;let c=t.clone().add(a).add(o).multiplyScalar(1/3);n.addScaledVector(c,s),r+=s}if(r<=1e-6){let t=new L;return e.forEach(e=>t.add(e)),t.multiplyScalar(1/e.length)}return n.multiplyScalar(1/r)},sXn=(e,t=[])=>{let n=e?.facePoints;if(!n||n.length<3)return null;let r=[];for(let e=0;e+2<n.length;e+=3){let t=n[e],i=n[e+1],a=n[e+2];!Number.isFinite(t)||!Number.isFinite(i)||!Number.isFinite(a)||r.push(new L(t,i,a))}if(r.length===0)return null;let i=gWt(r,t);return i.length===0?null:oXn(i)};function cXn(e){let t=lXn(e),n=uXn(e);return{destroy(){t(),n()}}}function lXn(e){let{$viewer:t}=e,n=e,r=()=>{let e=t.state.selectedObjects.map(e=>e.uuid);if(e.length!==0)return n.isolate(e)},i=()=>{if(n.isolatedUuids.size!==0)return n.clear()},a=t.shortcutManager.getDefaultShortcuts(()=>t.localContext.loadedModels.flatMap(e=>e.objects)),o=a.map(e=>e.name);return[...a,{name:`isolate`,key:`I`,execute:r},{name:`reintegrate`,key:`U`,execute:i},{name:`fitview`,key:`F`,execute:()=>e.fitView(t.state.selectedObjects.map(e=>e.uuid))}].forEach(e=>t.localContext.registerShortcut(e)),()=>{[...o,`isolate`,`reintegrate`,`fitview`].forEach(e=>t.localContext.unregisterShortcut(e))}}function uXn(e){let t=new AbortController;return e.$viewer.localContext.el.addEventListener(`contextmenu`,async t=>{let n=e.$viewer.contextMenu;if(n){t.stopPropagation(),t.preventDefault();try{await dXn(e,t)}catch(e){console.error(`[BIMDataViewer - 3D Fragments] Context menu setup error:`,e)}n.open(t)}},{signal:t.signal}),()=>t.abort()}async function dXn(e,t){let{$viewer:n}=e,r=e,i=n.contextMenu,a=n.state.selectedObjects.map(e=>e.uuid);[...i.getDefaultCommands({objects:n.localContext.loadedModels.flatMap(e=>e.objects),context:n.localContext}),{get label(){return n.i18n.$t(`global.fit_view`)},picto:`F`,execute:()=>e.fitView(n.state.selectedObjects.map(e=>e.uuid))}].map(e=>i.registerContextCommand(e)),a.length>0&&i.registerContextCommand({name:`isolate`,get group(){return i.groupPositions.visibility},position:4,get label(){return n.i18n.$t(`context_menu.isolate`)},picto:`I`,execute:()=>r.isolate(a)}),r.isolatedUuids.size>0&&i.registerContextCommand({name:`reintegrate`,get group(){return i.groupPositions.visibility},position:5,get label(){return n.i18n.$t(`context_menu.reintegrate`)},picto:`U`,execute:()=>r.clear()}),a.length>0&&i.registerContextCommand({name:`colorize`,get group(){return i.groupPositions.visibility},position:6,get label(){return n.i18n.$t(`viewer3d.context_menu.colorize`)},component:oPt}),n.state.colorizedObjects.length>0&&i.registerContextCommand({name:`reset_color`,get group(){return i.groupPositions.visibility},position:7,get label(){return n.i18n.$t(`viewer3d.context_menu.reset_color`)},execute:()=>{let e=n.state.colorizedObjectsIds;e.length!==0&&n.state.colorizeObjects(e,null)}});let o=await fXn(e,t);if(o?.point&&(o?.face||o?.normal)){let t=pXn(o),r=sXn(o,bWt(e.world?.renderer?.three))??o.point.clone();i.registerContextCommand({get label(){return n.i18n.$t(`context_menu.align_to_face`)},execute:()=>yXn(e,r,t)})}}async function fXn(e,t){try{return(await e.raycastAll(t,{includeUnpickable:!0}))[0]??null}catch{return null}}function pXn(e){let t=new L;if(e.face?.normal&&e.object){t.copy(e.face.normal);let n=new yE().getNormalMatrix(e.object.matrixWorld);return t.applyMatrix3(n).normalize(),t}return e.normal?.isVector3?e.normal.clone().normalize():new L(0,1,0)}var mXn=new L(0,1,0),hXn=new L(0,0,1),gXn=.015,_Xn=.99;async function vXn(e){let t=e.world?.camera?.controls,n=OWt(e);if(n)return n;try{let t=await e.world?.camera?.getItemsBounding?.();if(t?.center)return t.center.clone()}catch{}return t?.getTarget(new L)??new L}async function yXn(e,t,n){let r=e.world?.camera?.controls,i=e.world?.camera?.three;if(!r||!i)return;let a=await vXn(e);await r.setFocalOffset(0,0,0,!1);let o=Math.abs(n.dot(mXn))>_Xn?n.clone().addScaledVector(hXn,gXn).normalize():n.clone(),s=Math.max(i.position.distanceTo(a),.1),c=a.clone(),l=a.clone().addScaledVector(o,s),u=t.clone().sub(a),d=u.sub(o.clone().multiplyScalar(u.dot(o))),f=l.clone().add(d),p=c.clone().add(d);i.up.copy(mXn),await r.setLookAt(f.x,f.y,f.z,p.x,p.y,p.z,!1),await r.setFocalOffset(0,0,0,!1),e.requestRender?.()}function bXn(e){let{world:t,fragments:n}=e,r=async(e=[])=>{if(e?.length===0)return Array.from(n.list.values()).map(e=>e?.box).filter(e=>e instanceof XE&&!e.isEmpty());let t=await n.guidsToModelIdMap(e);return n.getBBoxes(t)},i=async n=>{if(!n.length)return;let r=DWt(e,n);if(!ek(r))return;let i=new pD;r.getBoundingSphere(i),await t.camera.controls.fitToSphere(i,!0)};return{extension:{fitView:async(e=[])=>{let t=await r(e);await i(t)}}}}function xXn(e,t={}){let n=Array.isArray(t.materialByCategory)?t.materialByCategory.filter(e=>e?.material&&e.category instanceof RegExp):[],r=[],i=[];return{async apply(){r=[],i=[];for(let{category:t,material:a}of n){let n=await e.getItemsOfCategories([t]),o=Object.values(n).flat();o.length&&(a.color&&(await e.setColor(o,new VE(a.color)),r.push(...o)),typeof a.opacity==`number`&&(await e.setOpacity(o,a.opacity),i.push(...o)))}r=[...new Set(r)],i=[...new Set(i)]},async clear(){r.length&&await e.resetColor(r),i.length&&await e.resetOpacity(i),r=[],i=[]},dispose(){e.tiles.onItemSet.remove(onTileSet)}}}function SXn(e){let{fragments:t,world:n,$viewer:r}=e,i=!0;return{extension:{load:async a=>{if(!a.fragments_file)throw Error(`Model "${a.name}" does not have a fragments file.`);await e.waitUntilIsReady();let o=await(await fetch(a.fragments_file)).arrayBuffer(),s=await t.core.load(o,{modelId:String(a.id),camera:n.camera.three,onProgress:({progress:e,stage:t,modelId:n})=>{console.log(`Model ${n} loading stage: ${t}, progress: ${(e*100).toFixed(2)}%`)}});return await xXn(s,{materialByCategory:[{category:/^IFCSPACE$/i,material:{color:`#0000FF`,opacity:.15}}]}).apply(),s.getClippingPlanesEvent=()=>n.renderer.three.clippingPlanes,r.localContext.hub.emit(`3d-model-loaded`,{model:a}),i&&=(e.fitView(),!1),s},unload:async n=>{await e.waitUntilIsReady();try{if(!t.list.has(String(n.id)))return console.warn(`Model with id "${n.id}" not found in fragments list.`),!1}catch{return!1}return await t.core.disposeModel(String(n.id)),e.fragments.list.size===0&&(i=!0),r.localContext.hub.emit(`3d-model-unloaded`,{model:n}),!0}}}}function CXn(e){let{world:t}=e,n=co(`perspective`),r=()=>{n.value=t.camera.projection.current===`Perspective`?`perspective`:`ortho`,t.renderer?.postproduction&&t.renderer.postproduction.updateCamera(),e.requestRender()};return t.camera.projection.onChanged.add(r),{extension:{get projection(){return n.value},set projection(r){if(r!==`perspective`&&r!==`ortho`){console.warn(`Invalid projection value: ${r}`);return}e.isReady&&(n.value=r,r===`perspective`?(t.camera.projection.set(`Perspective`),t.camera.three.updateProjectionMatrix()):t.camera.projection.set(`Orthographic`))}},destroy(){t.camera.projection.onChanged.remove(r)}}}var wXn=class{constructor({id:e,clipper:t,point:n,normal:r,scaleMode:i=`camera`,fixedScale:a=new _E(1,1),controlSize:o=1,activeEnabled:s=!0,visualState:c=null,controlAxisDirection:l=null,wireframeMode:u=`triangles`}){this.id=e,this.type=`default`,this._clipper=t,this._shown=!0,this._controlShown=!1,this._widgetsVisible=!0,this._active=!1,this._hovered=!1,this._scaleMode=i,this._fixedScale=a.clone(),this._activeEnabled=s,this._visualState=c,this._controlAxisDirection=l,this._wireframeMode=u;let d=t._planeMaterial.clone();this._mesh=new OD(new fO(1),d),this._mesh.renderOrder=2,this._mesh.userData.isSectionPlaneController=!0,this._mesh.userData.isSectionPlaneSurface=!0,this._anchor=new RE,this._anchor.position.copy(n),this._anchor.lookAt(n.clone().add(r)),this._mesh.position.z=.01,this._anchor.add(this._mesh);let f=this._createWireframeGeometry(this._wireframeMode),p=new WD({color:t._planeMaterial.color.getHex(),opacity:.8,transparent:!0,depthTest:!0,depthWrite:!1});this._wireframe=new qD(f,p),this._wireframe.renderOrder=2,this._wireframe.position.z=.012,this._anchor.add(this._wireframe),this._threePlane=new PD().setFromNormalAndCoplanarPoint(r,n),this._normal=r.clone().normalize(),this._controls=new fxn(t.world.camera.three,t.world.renderer.three.domElement),this._onCameraChange=()=>{this._controls.camera=t.world.camera.three,this._updateScale()},t.world.camera.projection.onChanged.add(this._onCameraChange),this._controls.attach(this._anchor),this._controls.setSpace(`local`),this._controls.setSize(o),this._controls.showX=!1,this._controls.showY=!1,this._controls.enabled=!1,this._controls.visible=!1,this._controls.getHelper().visible=!1,this._controls.getHelper().renderOrder=3,this._controls.getHelper().userData.isSectionPlaneControlHandle=!0,this._controls.getHelper().userData.sectionPlaneId=this.id,this._controls.getHelper().traverse(e=>{e.userData.isSectionPlaneController=!0,e.userData.sectionPlaneId=this.id,e.renderOrder=3;let t=e.tag!==`picker`&&e.tag!==`helper`,n=Array.isArray(e.material)?e.material:[e.material];if(t)for(let e of n)e&&(e.depthTest=!1,e.depthWrite=!1,e.transparent=!0);t&&(e.userData.isSectionPlaneControlHandle=!0)}),this._pruneOppositeControlDirection(),this._onChange=()=>{this._syncFromAnchor()},this._onDraggingChanged=e=>{this._clipper.world.camera.enabled=!e.value},this._controls.addEventListener(`change`,this._onChange),this._controls.addEventListener(`dragging-changed`,this._onDraggingChanged),this._onCameraUpdate=()=>{this._updateScale(),this._clipper.requestRender()},this._scaleMode===`camera`&&this._clipper.world.camera.controls?.addEventListener(`update`,this._onCameraUpdate),t._widgetOverlayScene.add(this._anchor),t._widgetOverlayScene.add(this._controls.getHelper()),t._registerPlaneMesh(this._mesh,this),this._applyVisualState(),this._updateScale()}get shown(){return this._shown}get three(){return this._threePlane}get controlShown(){return this._controlShown}get widgetsVisible(){return this._widgetsVisible}get widgetPosition(){return this._anchor.position}get location(){return this._anchor.position}get position(){return this._anchor.position}get direction(){return this._normal}get active(){return this._active}setActive(e){if(!this._activeEnabled)return;let t=!!e;this._active!==t&&(this._active=t,this._applyVisualState(),this._clipper.requestRender())}setWireframeMode(e){if(e!==`triangles`&&e!==`edges`)throw TypeError(`wireframe mode must be 'triangles' or 'edges'`);this._wireframeMode!==e&&(this._wireframeMode=e,this._wireframe.geometry.dispose(),this._wireframe.geometry=this._createWireframeGeometry(e),this._clipper.requestRender())}setHovered(e){let t=!!e;this._hovered!==t&&(this._hovered=t,this._applyVisualState(),this._clipper.requestRender())}setVisualStateDefinition(e){this._visualState=e,this._applyVisualState(),this._clipper.requestRender()}setControlColor(e){let t=this._controls.getHelper();t&&(t.traverse(t=>{if(!(t.tag!==`picker`&&t.tag!==`helper`))return;let n=Array.isArray(t.material)?t.material:[t.material];for(let t of n)t?.color&&t.color.setHex(e)}),this._clipper.requestRender())}setFixedScale(e,t){this._fixedScale.set(e,t),this._updateScale(),this._clipper.requestRender()}setScaleMode(e){if(e!==`camera`&&e!==`fixed`)throw TypeError(`scale mode must be 'camera' or 'fixed'`);this._scaleMode!==e&&(this._scaleMode===`camera`&&this._clipper.world.camera.controls?.removeEventListener(`update`,this._onCameraUpdate),this._scaleMode=e,this._scaleMode===`camera`&&this._clipper.world.camera.controls?.addEventListener(`update`,this._onCameraUpdate),this._updateScale(),this._clipper.requestRender())}show(){this._shown||(this._shown=!0,this._updateWidgetVisibility(),this._clipper.emit(`shown`,{plane:this}),this._clipper.applyClippingPlanes(),this._clipper.requestRender())}hide(){this._shown&&(this._shown=!1,this.hideControl(),this._updateWidgetVisibility(),this._clipper.activeSectionPlane===this&&this._clipper.setActivePlane(null),this._clipper.emit(`hidden`,{plane:this}),this._clipper.applyClippingPlanes(),this._clipper.requestRender())}showControl(){this._controlShown||(this._controlShown=!0,this._updateWidgetVisibility(),this._clipper.emit(`controls-shown`,{plane:this}),this._clipper.requestRender())}hideControl(){this._controlShown&&(this._controlShown=!1,this._updateWidgetVisibility(),this._clipper.emit(`controls-hidden`,{plane:this}),this._clipper.requestRender())}setWidgetsVisible(e){let t=!!e;this._widgetsVisible!==t&&(this._widgetsVisible=t,this._updateWidgetVisibility(),this._clipper.requestRender())}destroy(){this.hideControl(),this._controls.removeEventListener(`change`,this._onChange),this._controls.removeEventListener(`dragging-changed`,this._onDraggingChanged),this._controls.detach(),this._clipper.world.camera.controls?.removeEventListener(`update`,this._onCameraUpdate),this._clipper.world.camera.projection.onChanged.remove(this._onCameraChange),this._anchor.removeFromParent(),this._controls.getHelper().removeFromParent(),this._controls.dispose(),this._clipper._unregisterPlaneMesh(this._mesh),this._mesh.geometry.dispose(),this._mesh.material.dispose(),this._wireframe.geometry.dispose(),this._wireframe.material.dispose(),this._clipper.onSectionPlaneDestroyed(this)}getWorldNormal(e=new L){return e.set(0,0,1).applyQuaternion(this._anchor.quaternion).normalize()}setPositionAlongAxis(e,t,n){this._anchor.position.copy(e).addScaledVector(t,n),this._syncFromAnchor()}setWidgetPosition(e){if(!(e instanceof L))throw TypeError(`position must be a THREE.Vector3`);this._anchor.position.copy(e),this._anchor.updateWorldMatrix(!0,!1),this._updateScale(),this._clipper.requestRender()}setFromPointNormalAndTangent(e,t,n){if(!(e instanceof L)||!(t instanceof L)||!(n instanceof L))throw TypeError(`point, normal and tangent must be THREE.Vector3 instances`);let r=t.clone().normalize();if(r.lengthSq()<1e-10)return;let i=n.clone().sub(r.clone().multiplyScalar(n.dot(r)));if(i.lengthSq()<1e-10){let e=Math.abs(r.z)<.95?new L(0,0,1):new L(0,1,0);i=e.sub(r.clone().multiplyScalar(e.dot(r)))}i.normalize();let a=r.clone().cross(i).normalize();i=a.clone().cross(r).normalize();let o=new OE().makeBasis(i,a,r),s=new vE().setFromRotationMatrix(o);this._anchor.position.copy(e),this._anchor.quaternion.copy(s),this._normal.copy(r),this._threePlane.setFromNormalAndCoplanarPoint(this._normal,this._anchor.position),this._anchor.updateWorldMatrix(!0,!1),this._updateScale(),this._clipper.requestRender()}_applyVisualState(){let e=this._mesh.material;if(!e)return;let t=this._clipper._planeMaterial.color.getHex(),n=this._clipper._planeMaterial.opacity,r=this._active&&this._hovered?`activeHovered`:this._active?`active`:this._hovered?`hovered`:`idle`,i=this._visualState?.[r]??null,a=this._visualState?.idle??null,o=i?.color??a?.color??t,s=i?.opacity??a?.opacity??n;if(!this._visualState){let e=this._clipper._planeMaterial.color.clone();this._active&&this._hovered?(e.offsetHSL(.025,.35,.28),s=n+.52):this._active?(e.offsetHSL(.015,.3,.18),s=n+.4):this._hovered&&(e.offsetHSL(0,.22,.12),s=n+.22),o=e.getHex()}e.color.setHex(o),e.opacity=Math.min(.92,s),this._wireframe&&this._wireframe.material.color.setHex(o)}_updateScale(){if(this._scaleMode===`fixed`){this._mesh.scale.set(this._fixedScale.x,this._fixedScale.y,1),this._wireframe.scale.set(this._fixedScale.x,this._fixedScale.y,1);return}let e=this._clipper.world.camera.three,t;if(e instanceof AO)t=(e.top-e.bottom)/e.zoom;else if(e instanceof kO){let n=new L;e.getWorldPosition(n),t=this._anchor.position.distanceTo(n)*Math.min(1.9*Math.tan(Math.PI*e.fov/360)/e.zoom,7)}else return;let n=t*this._controls.size/4*(this._clipper._planeVisualSizeMultiplier??1.5);this._mesh.scale.set(n,n,n),this._wireframe.scale.set(n,n,n)}_createWireframeGeometry(e){let t=[-.5,-.5,0,.5,-.5,0,.5,-.5,0,.5,.5,0,.5,.5,0,-.5,.5,0,-.5,.5,0,-.5,-.5,0],n=e===`edges`?t:t.concat([-.5,-.5,0,0,0,0,.5,-.5,0,0,0,0,.5,.5,0,0,0,0,-.5,.5,0,0,0,0]),r=new yD;return r.setAttribute(`position`,new uD(new Float32Array(n),3)),r}_pruneOppositeControlDirection(){if(!this._controlAxisDirection)return;let e=this._controlAxisDirection.axis,t=e.toLowerCase(),n=this._controlAxisDirection.direction,r=this._controls.getHelper(),i=[],a=new L;r.traverse(r=>{if(r.name!==e||!r.geometry||(r.geometry.computeBoundingBox?.(),!r.geometry.boundingBox))return;r.geometry.boundingBox.getCenter(a);let o=a[t];typeof o==`number`&&(n>0&&o<-1e-4||n<0&&o>1e-4)&&i.push(r)});for(let e of i)e.removeFromParent()}_syncFromAnchor(){this._anchor.updateWorldMatrix(!0,!1);let e=this.getWorldNormal();this._normal.copy(e),this._threePlane.setFromNormalAndCoplanarPoint(e,this._anchor.position),this._updateScale(),this._clipper.applyClippingPlanes(),this._clipper.requestRender()}_updateWidgetVisibility(){let e=this._shown&&this._widgetsVisible,t=this._controlShown&&this._widgetsVisible;this._mesh.visible=e,this._wireframe.visible=e,this._controls.enabled=t,this._controls.visible=t,this._controls.getHelper().visible=t}},TXn=class{constructor({components:e,OBF:t,world:n,requestRender:r,styleName:i,groupName:a,createFillsMaterial:o,createLinesMaterial:s}){this._components=e,this._OBF=t,this._world=n,this._requestRender=r,this._styleName=i,this._groupName=a,this._createFillsMaterial=o??(()=>new ED({color:16727326,transparent:!1,opacity:1,side:2,depthWrite:!1,polygonOffset:!0,polygonOffsetFactor:-2,polygonOffsetUnits:-2})),this._createLinesMaterial=s??(()=>new rW({color:`black`,linewidth:2})),this._edgesById=new Map,this._updateQueue=Promise.resolve(),this._revision=0}_getClipStyler(){try{let e=this._components.get(this._OBF.ClipStyler);return e?(e.world=this._world,e):null}catch{return null}}_ensureClipStyle(){let e=this._getClipStyler();return e?(e.styles.get(this._styleName)||e.styles.set(this._styleName,{fillsMaterial:this._createFillsMaterial(),linesMaterial:this._createLinesMaterial()}),e):null}_clearEdges(e=this._getClipStyler()){if(!e){this._edgesById.clear();return}for(let t of this._edgesById.keys())e.list.delete(t);this._edgesById.clear()}clear(){this._revision+=1,this._clearEdges(),this._requestRender()}_enqueue(e){return this._updateQueue=this._updateQueue.then(e,e),this._updateQueue}enqueueUpdate({entries:e,enabled:t}){let n=++this._revision;return this._enqueue(async()=>{if(n!==this._revision)return;let r=this._ensureClipStyle();if(this._clearEdges(r),!t||!e?.length){if(n!==this._revision)return;this._requestRender();return}if(r){for(let{id:t,plane:i}of e){if(n!==this._revision)return;let e=r.create(i,{id:t,world:this._world,items:{[this._groupName]:{style:this._styleName}}});if(e.visible=!0,await e.update(),n!==this._revision){r.list.delete(t);return}this._edgesById.set(t,e)}n===this._revision&&this._requestRender()}})}setFillColor(e){let t=String(e??``).replace(/^#/,``).trim();if(!/^[0-9a-fA-F]{6}$/.test(t))return;let n=this._ensureClipStyle();if(!n)return;let r=n.styles.get(this._styleName);r?.fillsMaterial&&(r.fillsMaterial.color.set(`#${t}`),this._requestRender())}destroy(){let e=this._getClipStyler();e&&e.styles.delete(this._styleName),this.clear()}},EXn=`section-plane-cap-style`,DXn=`section-plane-cap-group`,OXn=()=>new ED({color:16727326,transparent:!1,opacity:1,side:2,depthWrite:!1,polygonOffset:!0,polygonOffsetFactor:-2,polygonOffsetUnits:-2}),kXn=()=>new rW({color:`black`,linewidth:2}),AXn=class extends TXn{constructor({components:e,OBF:t,world:n,requestRender:r}){super({components:e,OBF:t,world:n,requestRender:r,styleName:EXn,groupName:DXn,createFillsMaterial:OXn,createLinesMaterial:kXn})}enqueueUpdate(e,t){let n=(e??[]).reduce((e,t)=>(!t?.id||!t?.three||e.push({id:`section-plane-cap-${t.id}`,plane:t.three}),e),[]);return super.enqueueUpdate({entries:n,enabled:t})}},jXn={color:4034751,opacity:.07},MXn={idle:{color:4034751,opacity:.07},hovered:{color:4034751,opacity:.24},active:{color:2648469,opacity:.26},activeHovered:{color:2054789,opacity:.32}},NXn=Symbol(`section-plane-owner`),PXn=class extends MYn{constructor(e){let{world:t,components:n,OBC:r,OBF:i,fragments:a}=e,o=e.requestRender.bind(e);super({world:t,requestRender:o,respectSceneDepth:!0}),this.fragmentsInstance=e;let s=n.get(r.Raycasters);this._caster=s.get(t),this._enabled=!1,this._fragments=a,this._showIntersections=!0,this._widgetsVisible=!0,this._capsVisible=!1,this._widgetMoveModifier=e=>!!e?.ctrlKey,this._planes=[],this._activeSectionPlane=null,this._hoveredPlane=null,this._hoveredWidgetType=null,this._id=0,this._offPick=null,this._lastPick=null,this._coreUpdateRequested=!1,this._coreUpdateInFlight=!1,this._intersectionGroup=new zE,this._intersectionGroup.renderOrder=4,this._widgetOverlayScene.add(this._intersectionGroup),this._intersectionMaterial=new bO({color:16773222,transparent:!0,opacity:.95,dashSize:.35,gapSize:.2,depthTest:!1,depthWrite:!1}),this._planeByMesh=new Map,this._surfaceDrag=null,this._eventAbortController=null,this._capsManager=i?.ClipStyler?new AXn({components:n,OBF:i,world:t,requestRender:o}):null,this._onPointerMove=e=>{if(this._surfaceDrag){if(e.pointerId!==this._surfaceDrag.pointerId)return;if(e.preventDefault(),this._surfaceDrag.mode===`widget`){let t=this._intersectPointerWithThreePlane(e,this._surfaceDrag.plane.three);if(!t)return;this._surfaceDrag.plane.setWidgetPosition(t.sub(this._surfaceDrag.pointerOffset));return}let t=this._computeLineParameterFromPointerEvent(e,this._surfaceDrag.startPosition,this._surfaceDrag.axis);if(typeof t!=`number`)return;let n=t-this._surfaceDrag.startParameter;this._surfaceDrag.plane.setPositionAlongAxis(this._surfaceDrag.startPosition,this._surfaceDrag.axis,n);return}let t=this._getWidgetHitFromPointerEvent(e),n=t?.plane??null,r=t?.type??null;n===this._hoveredPlane&&r===this._hoveredWidgetType||(this._hoveredPlane?.setHovered(!1),this._hoveredPlane=n,this._hoveredWidgetType=r,this._hoveredPlane?.setHovered(!0),this._applyCursor())},this._onPointerDown=e=>{if(e.button!==0)return;let t=this._getPlaneHitFromPointerEvent(e);if(!t)return;if(this.setActivePlane(t),this._widgetMoveModifier(e)){let n=this._intersectPointerWithThreePlane(e,t.three);if(!n)return;this._surfaceDrag={mode:`widget`,pointerId:e.pointerId,plane:t,pointerOffset:n.sub(t.widgetPosition.clone())},this.world.camera.enabled=!1;let r=this.world.renderer?.three?.domElement;r?.setPointerCapture?.(e.pointerId),r&&(r.style.cursor=`crosshair`),e.preventDefault(),e.stopPropagation();return}let n=t._anchor.position.clone(),r=t.getWorldNormal(),i=this._computeLineParameterFromPointerEvent(e,n,r);if(typeof i!=`number`)return;this._surfaceDrag={mode:`plane`,pointerId:e.pointerId,plane:t,axis:r,startPosition:n,startParameter:i},this.world.camera.enabled=!1;let a=this.world.renderer?.three?.domElement;a?.setPointerCapture?.(e.pointerId),a&&(a.style.cursor=`grabbing`),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation?.()},this._onPointerUp=e=>{!this._surfaceDrag||e.pointerId!==this._surfaceDrag.pointerId||this._endSurfaceDrag(e.pointerId)},this._onPointerLeave=()=>{this._hoveredPlane?.setHovered(!1),this._hoveredPlane=null,this._hoveredWidgetType=null,this._applyCursor()},this._eventAbortController=new AbortController;let{signal:c}=this._eventAbortController,l=this.world.renderer?.three?.domElement;l?.addEventListener(`pointerdown`,this._onPointerDown,{signal:c}),l?.addEventListener(`pointermove`,this._onPointerMove,{signal:c}),l?.addEventListener(`pointerleave`,this._onPointerLeave,{signal:c}),window.addEventListener(`pointerup`,this._onPointerUp,{signal:c}),window.addEventListener(`pointercancel`,this._onPointerUp,{signal:c}),this._offPick=this.fragmentsInstance.onPick(async({event:e})=>{let t=this._getPlaneHitFromPointerEvent(e);if(t){this.emit(`plane-clicked`,{plane:t});return}else this._activeSectionPlane&&this.setActivePlane(null);if(!this._enabled)return;let n=await this._pickSurfaceFromEvent(e);n&&(this._lastPick=n,await this.addSectionPlane({showControl:!0}),this.disable())}),this._planeMaterial=new ED({color:jXn.color,side:2,transparent:!0,opacity:jXn.opacity,depthTest:!1,depthWrite:!1})}_requestCoreRaycastUpdate(){this._coreUpdateRequested=!0,!this._coreUpdateInFlight&&(this._coreUpdateInFlight=!0,Promise.resolve().then(async()=>{try{for(;this._coreUpdateRequested;)this._coreUpdateRequested=!1,await this._fragments.core.update(!0);this.requestRender()}catch(e){console.warn(`[BIMDataViewer - 3D Fragments - section-planes] Failed to update raycast state after clipping change.`,e)}finally{this._coreUpdateInFlight=!1}}))}get enabled(){return this._enabled}set enabled(e){e?this.enable():this.disable()}get sectionPlanes(){return this._planes}get widgetsVisible(){return this._widgetsVisible}set widgetsVisible(e){let t=!!e;if(this._widgetsVisible!==t){this._widgetsVisible=t;for(let e of this._planes)e.setWidgetsVisible(t);this._updateIntersectionLines(),this.requestRender()}}get widgetMoveModifier(){return this._widgetMoveModifier}set widgetMoveModifier(e){if(typeof e!=`function`)throw TypeError(`widgetMoveModifier must be a function`);this._widgetMoveModifier=e}get capsVisible(){return this._capsVisible}set capsVisible(e){let t=!!e;this._capsVisible!==t&&(this._capsVisible=t,this._updateCaps())}get showIntersections(){return this._showIntersections}set showIntersections(e){let t=!!e;this._showIntersections!==t&&(this._showIntersections=t,this._updateIntersectionLines(),this.requestRender())}get activeSectionPlane(){return this._activeSectionPlane}_getPlaneById(e){return e?this._planes.find(t=>t.id===e)??null:null}_registerPlaneMesh(e,t){this._planeByMesh.set(e,t)}_unregisterPlaneMesh(e){this._planeByMesh.delete(e)}setMaterial(e=null){if(!e){this._planeMaterial.color.setHex(jXn.color),this._planeMaterial.opacity=jXn.opacity;return}let{color:t,opacity:n}=e;typeof t==`number`&&this._planeMaterial.color.setHex(t),typeof n==`number`&&(this._planeMaterial.opacity=n);for(let e of this._planes)e._applyVisualState();this.requestRender()}enable(){this._enabled=!0}disable(){this._enabled=!1}async addSectionPlane(e={}){let t=e.point instanceof L;if(t!==e.normal instanceof L)throw TypeError(`point and normal must be provided together`);let n=t?{point:e.point.clone(),normal:e.normal.clone().normalize()}:this._lastPick;if(!n)return null;let r=new wXn({id:`section-plane-${++this._id}`,clipper:this,point:n.point,normal:n.normal,visualState:MXn});return r.three[NXn]=this,r.setWidgetsVisible(this._widgetsVisible),this._planes.push(r),this.applyClippingPlanes(),this.requestRender(),this._lastPick=null,this.emit(`created`,{plane:r}),this.setActivePlane(r),r}setActivePlane(e){let t=e&&this._planes.includes(e)?e:null;if(this._activeSectionPlane===t)return;let n=this._activeSectionPlane;n?.setActive(!1),this._activeSectionPlane=t,t?.setActive(!0),this.hideAllControls(),t?.shown&&t.showControl(),this.emit(`active-changed`,{plane:t,previousPlane:n}),this.requestRender()}removeSectionPlane(e){return!e||!this._planes.includes(e)?!1:(e.destroy(),!0)}onSectionPlaneDestroyed(e){this._activeSectionPlane===e&&this.setActivePlane(null),this._hoveredPlane===e&&(this._hoveredPlane=null);let t=this._planes.indexOf(e);t!==-1&&(this._planes.splice(t,1),this.emit(`deleted`,{plane:e}),this.applyClippingPlanes(),this.requestRender())}applyClippingPlanes(){let e=this.world.renderer?.three;if(!e)return;let t=this._planes.filter(e=>e.shown).map(e=>e.three),n=[...(Array.isArray(e.clippingPlanes)?e.clippingPlanes:[]).filter(e=>e?.[NXn]!==this),...t].filter((e,t,n)=>n.indexOf(e)===t);e.localClippingEnabled=n.length>0,e.clippingPlanes=n,this.world.renderer?.updateClippingPlanes(),this._requestCoreRaycastUpdate(),this._updateIntersectionLines(),this._updateCaps()}hideAllControls(){for(let e of this._planes)e.hideControl()}destroy(){this.disable();for(let e of[...this._planes])e.destroy();this._hoveredPlane=null,this._hoveredWidgetType=null,this._activeSectionPlane=null;let e=this.world.renderer?.three?.domElement;this._endSurfaceDrag(),this._eventAbortController?.abort(),this._eventAbortController=null,e&&(e.style.cursor=``),this._offPick?.(),this._offPick=null,this.destroyOverlayLayer(),this._clearIntersectionLines(),this._intersectionGroup.removeFromParent(),this._intersectionMaterial.dispose(),this._capsManager?.destroy(),this.clear(),this._planeMaterial.dispose()}_updateCaps(){this._capsManager?.enqueueUpdate(this._planes.filter(e=>e.shown),this._capsVisible)}setCapsColor(e){this._capsManager?.setFillColor(e)}async _pickSurfaceFromEvent(e){let t=this.world.renderer?.three?.domElement;if(!t)return null;let n=t.getBoundingClientRect(),r={x:(e.clientX-n.left)/n.width*2-1,y:-((e.clientY-n.top)/n.height)*2+1},i=await this._caster.castRay({position:r});if(!i?.point)return null;let a=null;if(i.normal)a=i.normal.clone();else if(i.face?.normal&&i.object){let e=new yE().getNormalMatrix(i.object.matrixWorld);a=i.face.normal.clone().applyMatrix3(e)}return a?(a.normalize().negate(),{point:i.point.clone(),normal:a}):null}_getPlaneHitFromPointerEvent(e){let t=this._getWidgetHitFromPointerEvent(e);return!t||t.type!==`plane`?null:t.plane}_getWidgetHitFromPointerEvent(e){if(!this.world.renderer?.three?.domElement||this._widgetOverlayScene.children.length===0||!this._setPointerFromEvent(e))return null;let t=this._widgetRaycaster.intersectObject(this._widgetOverlayScene,!0),n=null;for(let e of t){let t=e.object;if(t.userData.isSectionPlaneIntersectionLine||!t.visible)continue;let r=Array.isArray(t.material)?t.material:[t.material],i=r.some(e=>e&&e.visible!==!1);if(r.length>0&&!i)continue;if(t.userData.isSectionPlaneControlHandle){let e=this._getPlaneById(t.userData.sectionPlaneId);if(e?.controlShown)return{type:`control`,plane:e};continue}let a=this._planeByMesh.get(t);!n&&a?.shown&&(n={type:`plane`,plane:a})}return n}_computeLineParameterFromPointerEvent(e,t,n){if(!this._setPointerFromEvent(e))return null;let r=this._widgetRaycaster.ray.origin,i=this._widgetRaycaster.ray.direction,a=n.clone().normalize(),o=r.clone().sub(t),s=i.dot(a),c=i.dot(o),l=a.dot(o),u=1-s*s;return Math.abs(u)<1e-5?null:(l-s*c)/u}_endSurfaceDrag(e=null){if(!this._surfaceDrag||e!==null&&e!==this._surfaceDrag.pointerId)return;let t=this._surfaceDrag.pointerId;this._surfaceDrag=null,this.world.camera.enabled=!0,(this.world.renderer?.three?.domElement)?.releasePointerCapture?.(t),this._applyCursor()}_applyCursor(){let e=this.world.renderer?.three?.domElement;if(e){if(this._surfaceDrag){e.style.cursor=this._surfaceDrag.mode===`widget`?`crosshair`:`grabbing`;return}if(this._hoveredWidgetType===`control`){e.style.cursor=`move`;return}if(this._hoveredWidgetType===`plane`){e.style.cursor=`grab`;return}e.style.cursor=``}}_clearIntersectionLines(){for(;this._intersectionGroup.children.length>0;){let e=this._intersectionGroup.children[0];e.removeFromParent(),e.geometry?.dispose?.()}}_updateIntersectionLines(){if(this._clearIntersectionLines(),!this._showIntersections||!this._widgetsVisible)return;let e=this._planes.filter(e=>e.shown);if(e.length<2)return;let t=e.reduce((e,t)=>Math.max(e,t?._mesh?.scale?.x??0),0),n=Math.max(8,t*2);for(let t=0;t<e.length-1;t++){let r=e[t].three,i=r.normal.clone(),a=r.constant;for(let r=t+1;r<e.length;r++){let t=e[r].three,o=t.normal.clone(),s=t.constant,c=new L().crossVectors(i,o),l=c.lengthSq();if(l<1e-8)continue;c.normalize();let u=-a,d=-s,f=new L().copy(o).multiplyScalar(u).addScaledVector(i,-d).cross(new L().crossVectors(i,o)).divideScalar(l),p=f.clone().addScaledVector(c,-n),m=f.clone().addScaledVector(c,n),h=new KD(new yD().setFromPoints([p,m]),this._intersectionMaterial);h.computeLineDistances(),h.renderOrder=4,h.userData.isSectionPlaneIntersectionLine=!0,this._intersectionGroup.add(h)}}}},FXn={color:13386786,opacity:.3},IXn=[`silver`,`grey`,`darkgray`],LXn=e=>`#${e.toString(16).padStart(6,`0`)}`,RXn=e=>({idle:{color:e,opacity:.1},hovered:{color:e,opacity:.24},active:{color:e,opacity:.3},activeHovered:{color:e,opacity:.36}});function zXn(e){let t=new PXn(e),n=new AbortController,r=new Map,i=new Map,a=new Map,o=lo(null),s=e=>{let t=a.get(e);if(t)return t;let n=LXn(J_({excludedHexColors:Array.from(a.values()).map(e=>Number.parseInt(e.slice(1),16)).filter(e=>Number.isFinite(e)),excludeTooBright:!0,excludeTooDark:!0,excludedNames:IXn}));return a.set(e,n),n},c=(e,t)=>{let n=Number.parseInt(t.slice(1),16);e.setVisualStateDefinition(RXn(n)),e.setControlColor?.(n)},l=e=>{let n=s(e);c(e,n);let a=Ya({id:e.id,shown:e.shown,controlsShown:e.controlShown,active:e.active,color:n,get location(){return e.location},get position(){return e.position},get direction(){return e.direction},show:()=>{e.show()},hide:()=>{e.hide()},delete:()=>t.removeSectionPlane(e),showControl:()=>{t.hideAllControls(),e.showControl()},hideControl:()=>{e.hideControl()}});return r.set(e,a),i.set(a,e),a},u=e=>{if(e)return r.get(e)??l(e)},d=e=>{for(let[t,n]of r.entries())n.active=t===e;o.value=e?u(e)??null:null},f=e=>{if(e==null){t.setActivePlane(null);return}let n=i.get(e)??e;t.setActivePlane(n)},p=Ya([]);for(let e of t.sectionPlanes)p.push(u(e));t.on(`created`,({plane:e})=>{let t=u(e);t&&(p.includes(t)||p.push(t))},{abortSignal:n.signal}),t.on(`deleted`,({plane:e})=>{let t=r.get(e);if(!t)return;a.delete(e),r.delete(e),i.delete(t);let n=p.indexOf(t);n!==-1&&p.splice(n,1),o.value===t&&(o.value=null)},{abortSignal:n.signal}),t.on(`shown`,({plane:e})=>{let t=u(e);t&&(t.shown=!0)},{abortSignal:n.signal}),t.on(`hidden`,({plane:e})=>{let t=u(e);t&&(t.shown=!1)},{abortSignal:n.signal}),t.on(`controls-shown`,({plane:e})=>{let t=u(e);t&&(t.controlsShown=!0)},{abortSignal:n.signal}),t.on(`controls-hidden`,({plane:e})=>{let t=u(e);t&&(t.controlsShown=!1)},{abortSignal:n.signal}),t.on(`plane-clicked`,({plane:e})=>{f(e)},{abortSignal:n.signal}),t.on(`active-changed`,({plane:e})=>{d(e??null)},{abortSignal:n.signal}),d(t.activeSectionPlane??null);let m=Ds(()=>e.$viewer.localContext.loadedModels,()=>{t.sectionPlanes.slice().forEach(e=>{e.destroy()})}),h=()=>{t.enabled=!0,t.applyClippingPlanes(),e.highlightMaterial=FXn},g=()=>{t.enabled=!1,e.highlightMaterial=null},_={get enabled(){return t.enabled},enableSection:h,disableSection:g,addSectionPlane:e=>t.addSectionPlane(e),removeSectionPlane:e=>i.has(e)?t.removeSectionPlane(i.get(e)):t.removeSectionPlane(e),deleteSectionPlane(e){return _.removeSectionPlane(e)},sectionPlanes:p,get activeSectionPlane(){return o.value},set activeSectionPlane(e){f(e)},get showIntersections(){return t.showIntersections},set showIntersections(e){t.showIntersections=e},get widgetsVisible(){return t.widgetsVisible},set widgetsVisible(e){t.widgetsVisible=e},get capsVisible(){return t.capsVisible},set capsVisible(e){t.capsVisible=e},toggleSectionCaps(e){t.capsVisible=e},setSectionCapsColor(e){t.setCapsColor(e)},get widgetMoveModifier(){return t.widgetMoveModifier},set widgetMoveModifier(e){t.widgetMoveModifier=e}};return{destroy(){m(),n.abort(),g(),t.destroy()},extension:_}}var BXn=.02,VXn=.01,HXn=.1,UXn=`section-box-cap`,WXn={x1:new L(-1,0,0),x2:new L(1,0,0),y1:new L(0,-1,0),y2:new L(0,1,0),z1:new L(0,0,-1),z2:new L(0,0,1)},u6=(e,t,n,r)=>{let i=t.clone().applyMatrix4(n),a=e.clone().applyMatrix3(r).normalize(),o=new PD;return o.setFromNormalAndCoplanarPoint(a,i),o},GXn=(e,t=null)=>{let{min:n,max:r}=e;if(!t)return[new PD(new L(-1,0,0),r.x),new PD(new L(1,0,0),-n.x),new PD(new L(0,-1,0),r.y),new PD(new L(0,1,0),-n.y),new PD(new L(0,0,-1),r.z),new PD(new L(0,0,1),-n.z)];let i=new yE().getNormalMatrix(t);return[u6(new L(-1,0,0),new L(r.x,0,0),t,i),u6(new L(1,0,0),new L(n.x,0,0),t,i),u6(new L(0,-1,0),new L(0,r.y,0),t,i),u6(new L(0,1,0),new L(0,n.y,0),t,i),u6(new L(0,0,-1),new L(0,0,r.z),t,i),u6(new L(0,0,1),new L(0,0,n.z),t,i)]},KXn=e=>{let t=new L;e.getSize(t);let n=Math.max(t.x,t.y,t.z),r=Math.max(n*BXn,VXn);return e.clone().expandByScalar(r)},qXn=()=>new ED({color:16727326,transparent:!1,opacity:1,side:2,depthWrite:!1,polygonOffset:!0,polygonOffsetFactor:-2,polygonOffsetUnits:-2}),JXn=()=>new rW({color:`black`,linewidth:2}),YXn=class extends TXn{constructor({components:e,OBF:t,world:n,requestRender:r}){super({components:e,OBF:t,world:n,requestRender:r,styleName:UXn,groupName:`all`,createFillsMaterial:qXn,createLinesMaterial:JXn})}enqueueUpdate(e,t){let n=[`x1`,`x2`,`y1`,`y2`,`z1`,`z2`],r=(e?.clippingPlanes??[]).reduce((e,t,r)=>(t&&e.push({id:`section-box-cap-${n[r]??r}`,plane:t}),e),[]);return super.enqueueUpdate({entries:r,enabled:t})}},XXn=class extends MYn{constructor({world:e,requestRender:t,axisNormals:n,getSectionBox:r,isEditEnabled:i,isWidgetVisible:a,isOverlayVisible:o,getPlaneSizeMultiplier:s,getPlaneVisualState:c,onBoundsChange:l}){super({world:e,requestRender:t,respectSceneDepth:!0}),this._axisNormals=n,this._getSectionBox=r,this._isEditEnabled=i,this._isWidgetVisible=a,this._isOverlayVisible=o,this._getPlaneSizeMultiplier=s,this._getPlaneVisualState=c,this._onBoundsChange=l,this._widgets=new Map,this._widgetByMesh=new Map,this._widgetById=new Map,this._hoveredWidget=null,this._hoveredWidgetType=null,this._isSyncingFromBounds=!1,this._surfaceDrag=null,this._eventAbortController=null,this._planeMaterial=new ED({color:4034751,side:2,transparent:!0,opacity:.07,depthTest:!1,depthWrite:!1}),this._clipperAdapter={world:e,requestRender:t,_planeMaterial:this._planeMaterial,_widgetOverlayScene:this._widgetOverlayScene,_registerPlaneMesh:()=>{},_unregisterPlaneMesh:()=>{},emit:()=>{},activeSectionPlane:null,setActivePlane:()=>{},applyClippingPlanes:()=>{this._onWidgetPlaneChanged()},onSectionPlaneDestroyed:()=>{}},this._eventAbortController=new AbortController;let{signal:u}=this._eventAbortController,d=this.world.renderer?.three?.domElement;d?.addEventListener(`pointerdown`,e=>this._onPointerDown(e),{signal:u}),d?.addEventListener(`pointermove`,e=>this._onPointerMove(e),{signal:u}),d?.addEventListener(`pointerleave`,()=>this._onPointerLeave(),{signal:u}),window.addEventListener(`pointerup`,e=>this._onPointerUp(e),{signal:u}),window.addEventListener(`pointercancel`,e=>this._onPointerUp(e),{signal:u})}_getFaceScale(e,t){let n=e.getSize(new L),r=this._getPlaneSizeMultiplier();return t===`x1`||t===`x2`?new _E(n.y*r,n.z*r):t===`y1`||t===`y2`?new _E(n.x*r,n.z*r):new _E(n.x*r,n.y*r)}_getFaceCenter(e,t){let n=e.getCenter(new L);return t===`x1`?new L(e.min.x,n.y,n.z):t===`x2`?new L(e.max.x,n.y,n.z):t===`y1`?new L(n.x,e.min.y,n.z):t===`y2`?new L(n.x,e.max.y,n.z):t===`z1`?new L(n.x,n.y,e.min.z):new L(n.x,n.y,e.max.z)}_toWorldPoint(e,t){return t?t.localToWorldPoint(e):e}_toWorldNormal(e,t){return t?t.localToWorldDirection(e):e}_getFaceTangent(e,t){let n=null;return n=e===`x1`||e===`x2`?new L(0,1,0):new L(1,0,0),this._toWorldNormal(n,t).normalize()}_createWidget(e,t,n){let r=this._getFaceCenter(t,e),i=this._toWorldPoint(r,n),a=this._toWorldNormal(this._axisNormals[e].clone(),n),o=this._getFaceTangent(e,n),s=new wXn({id:`section-box-plane-${e}`,clipper:this._clipperAdapter,point:i,normal:a,scaleMode:`fixed`,fixedScale:this._getFaceScale(t,e),controlSize:.7,activeEnabled:!1,visualState:this._getPlaneVisualState(),controlAxisDirection:{axis:`Z`,direction:1},wireframeMode:`edges`});return s.setFromPointNormalAndTangent(i,a,o),s.show(),s.showControl(),this._widgets.set(e,s),this._widgetByMesh.set(s._mesh,s),this._widgetById.set(s.id,s),s}_updateWidget(e,t,n){let r=this._widgets.get(e)??this._createWidget(e,t,n),i=this._getFaceCenter(t,e),a=this._toWorldPoint(i,n),o=this._toWorldNormal(this._axisNormals[e].clone(),n),s=this._getFaceTangent(e,n);r.setFromPointNormalAndTangent(a,o,s);let c=this._getFaceScale(t,e);r.setFixedScale(c.x,c.y),r.setVisualStateDefinition(this._getPlaneVisualState())}_getWidgetHitFromPointerEvent(e){if(!this._isOverlayVisible()||!this._setPointerFromEvent(e))return null;let t=this._widgetRaycaster.intersectObject(this._widgetOverlayScene,!0),n=null;for(let e of t){let t=e.object;if(!t.visible)continue;let r=Array.isArray(t.material)?t.material:[t.material],i=r.some(e=>e&&e.visible!==!1);if(r.length>0&&!i)continue;if(t.userData.isSectionPlaneControlHandle){let e=this._widgetById.get(t.userData.sectionPlaneId);if(e?.controlShown)return{type:`control`,plane:e};continue}let a=this._widgetByMesh.get(t);!n&&a?.shown&&(n={type:`plane`,plane:a})}return n}_getPlaneHitFromPointerEvent(e){let t=this._getWidgetHitFromPointerEvent(e);return!t||t.type!==`plane`?null:t.plane}_computeLineParameterFromPointerEvent(e,t,n){if(!this._setPointerFromEvent(e))return null;let r=this._widgetRaycaster.ray.origin,i=this._widgetRaycaster.ray.direction,a=n.clone().normalize(),o=r.clone().sub(t),s=i.dot(a),c=i.dot(o),l=a.dot(o),u=1-s*s;return Math.abs(u)<1e-5?null:(l-s*c)/u}_applyCursor(){let e=this.world.renderer?.three?.domElement;if(e){if(!this._isOverlayVisible()){e.style.cursor=``;return}if(this._surfaceDrag){e.style.cursor=`grabbing`;return}if(this._hoveredWidgetType===`control`){e.style.cursor=`move`;return}if(this._hoveredWidgetType===`plane`){e.style.cursor=`grab`;return}e.style.cursor=``}}_onPointerDown(e){if(e.button!==0||!this._isEditEnabled()||!this._isOverlayVisible())return;let t=this._getPlaneHitFromPointerEvent(e);if(!t)return;let n=t.widgetPosition.clone(),r=t.getWorldNormal(),i=this._computeLineParameterFromPointerEvent(e,n,r);typeof i==`number`&&(this._surfaceDrag={pointerId:e.pointerId,plane:t,axis:r,startPosition:n,startParameter:i},this.world.camera.enabled=!1,(this.world.renderer?.three?.domElement)?.setPointerCapture?.(e.pointerId),this._applyCursor(),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation?.())}_onPointerMove(e){if(this._surfaceDrag){if(e.pointerId!==this._surfaceDrag.pointerId)return;e.preventDefault();let t=this._computeLineParameterFromPointerEvent(e,this._surfaceDrag.startPosition,this._surfaceDrag.axis);if(typeof t!=`number`)return;let n=t-this._surfaceDrag.startParameter;this._surfaceDrag.plane.setPositionAlongAxis(this._surfaceDrag.startPosition,this._surfaceDrag.axis,n);return}if(!this._isWidgetVisible()||!this._isOverlayVisible()){this._clearHoveredWidget(),this._hoveredWidgetType=null,this._applyCursor();return}let t=this._getWidgetHitFromPointerEvent(e),n=t?.plane??null,r=t?.type??null;n===this._hoveredWidget&&r===this._hoveredWidgetType||(this._hoveredWidget?.setHovered(!1),this._hoveredWidget=n,this._hoveredWidgetType=r,this._hoveredWidget?.setHovered(!0),this._applyCursor())}_onPointerUp(e){if(!this._surfaceDrag||e.pointerId!==this._surfaceDrag.pointerId)return;let t=this._surfaceDrag.pointerId;this._surfaceDrag=null,this.world.camera.enabled=!0,(this.world.renderer?.three?.domElement)?.releasePointerCapture?.(t),this._applyCursor()}_onPointerLeave(){this._clearHoveredWidget(),this._hoveredWidgetType=null,this._applyCursor()}_clearHoveredWidget(){this._hoveredWidget&&=(this._hoveredWidget.setHovered(!1),null)}_applyWidgetsVisibility(){let e=this._isWidgetVisible()&&this._isOverlayVisible(),t=this._isEditEnabled()&&e;for(let n of this._widgets.values())n.setWidgetsVisible(e),(!e||!t)&&n.setHovered(!1),e&&t?n.showControl():n.hideControl();this.requestRender()}_onWidgetPlaneChanged(){if(this._isSyncingFromBounds)return;let e=this._getSectionBox(),t=e?.bounds;if(!t)return;let n=t.clone(),r=(t,n)=>{let r=this._widgets.get(t)?.widgetPosition;return r?e?e.worldToLocalPoint(r):r:n},i=r(`x1`,new L(t.min.x,0,0)).x,a=r(`x2`,new L(t.max.x,0,0)).x,o=r(`y1`,new L(0,t.min.y,0)).y,s=r(`y2`,new L(0,t.max.y,0)).y,c=r(`z1`,new L(0,0,t.min.z)).z,l=r(`z2`,new L(0,0,t.max.z)).z,u=(e,t,n,r)=>{let i=e,a=t;return a>=i+.1||(Math.abs(e-n)>Math.abs(t-r)?i=a-HXn:a=i+HXn),{min:i,max:a}},d=u(i,a,t.min.x,t.max.x),f=u(o,s,t.min.y,t.max.y),p=u(c,l,t.min.z,t.max.z);n.min.x=d.min,n.max.x=d.max,n.min.y=f.min,n.max.y=f.max,n.min.z=p.min,n.max.z=p.max,this._onBoundsChange(n)}update(e){if(!e)return;let t=this._getSectionBox();if(t){this._clipperAdapter._planeVisualSizeMultiplier=this._getPlaneSizeMultiplier(),this._isSyncingFromBounds=!0;for(let n of Object.keys(this._axisNormals))this._updateWidget(n,e,t);this._isSyncingFromBounds=!1,this._applyWidgetsVisibility()}}clear(){this._clearHoveredWidget(),this._hoveredWidgetType=null;for(let e of this._widgets.values())e.destroy();this._widgets.clear(),this._widgetByMesh.clear(),this._widgetById.clear()}setHandleEditEnabled(){this._applyWidgetsVisibility()}setWidgetVisible(){this._applyWidgetsVisibility()}destroy(){let e=this.world.renderer?.three?.domElement;this._eventAbortController?.abort(),this._eventAbortController=null,e&&(e.style.cursor=``),this.clear(),this._planeMaterial.dispose(),this.destroyOverlayLayer()}},ZXn=e=>e.normal.clone().multiplyScalar(-e.constant),QXn=e=>({get location(){return ZXn(e)},get position(){return ZXn(e)},get direction(){return e.normal}}),$Xn=class{constructor({uuid:e,bounds:t,frame:n=null,boxVisible:r=!0,widgetVisible:i=!0,overlayVisible:a=!0,onVisibilityChange:o=null,onClear:s}){this.id=e,this.uuid=e,this.bounds=t,this.frame=n?.clone?.()??new OE,this.inverseFrame=this.frame.clone().invert(),this.clippingPlanes=[],this._boxVisible=co(r),this._widgetVisible=co(i),this._overlayVisible=co(a),this._onVisibilityChange=o,this._onClear=s,this._planes=[]}setFrame(e){this.frame.copy(e),this.inverseFrame.copy(e).invert()}localToWorldPoint(e){return e.clone().applyMatrix4(this.frame)}worldToLocalPoint(e){return e.clone().applyMatrix4(this.inverseFrame)}localToWorldDirection(e){let t=new yE().getNormalMatrix(this.frame);return e.clone().applyMatrix3(t).normalize()}getWorldBounds(){let e=[new L(this.bounds.min.x,this.bounds.min.y,this.bounds.min.z),new L(this.bounds.min.x,this.bounds.min.y,this.bounds.max.z),new L(this.bounds.min.x,this.bounds.max.y,this.bounds.min.z),new L(this.bounds.min.x,this.bounds.max.y,this.bounds.max.z),new L(this.bounds.max.x,this.bounds.min.y,this.bounds.min.z),new L(this.bounds.max.x,this.bounds.min.y,this.bounds.max.z),new L(this.bounds.max.x,this.bounds.max.y,this.bounds.min.z),new L(this.bounds.max.x,this.bounds.max.y,this.bounds.max.z)];for(let t of e)t.applyMatrix4(this.frame);return new XE().setFromPoints(e)}get shown(){return this._boxVisible.value}get widgetVisible(){return this._widgetVisible.value}get overlayVisible(){return this._overlayVisible.value}get planes(){return this._planes}show(){let e=!this._boxVisible.value||!this._widgetVisible.value||!this._overlayVisible.value;this._boxVisible.value=!0,this._widgetVisible.value=!0,this._overlayVisible.value=!0,e&&this._onVisibilityChange?.()}hide(){let e=this._boxVisible.value||this._widgetVisible.value||this._overlayVisible.value;this._boxVisible.value=!1,this._widgetVisible.value=!1,this._overlayVisible.value=!1,e&&this._onVisibilityChange?.()}setOverlayVisible(e){let t=!!e;this._overlayVisible.value!==t&&(this._overlayVisible.value=t,this._onVisibilityChange?.())}clear(){this._onClear()}setBounds(e){this.bounds.copy(e)}syncClippingPlanes(){let e=GXn(this.bounds,this.frame);if(this.clippingPlanes.length===0)return this.clippingPlanes=e,this._planes=e.map(e=>QXn(e)),this.clippingPlanes;for(let t=0;t<e.length;t++)this.clippingPlanes[t].normal.copy(e[t].normal),this.clippingPlanes[t].constant=e[t].constant;return this.clippingPlanes}},eZn={color:13386786,opacity:.3},tZn=12e3,nZn=24,d6=new L(0,1,0),rZn=new L(1,0,0),iZn=new L(0,0,1),aZn=(e,t,n)=>{let r=e.clone().normalize(),i=n.clone().normalize(),a=t.clone().normalize();if(r.lengthSq()<1e-10||a.lengthSq()<1e-10||i.lengthSq()<1e-10)return null;let o=i.clone().cross(r).normalize();return o.lengthSq()<1e-10?null:{x:o.clone().cross(i).normalize(),y:o,z:i.clone()}},oZn=(e,t)=>new OE().makeBasis(t.x,t.y,t.z).setPosition(e),sZn=e=>{let t=e.clone();return t.y=0,t.lengthSq()<1e-10?null:t.normalize()},cZn=e=>{if(!e?.length)return null;let t=new L;for(let n of e)t.add(n);return t.multiplyScalar(1/e.length),t},lZn=e=>{let t=cZn(e);if(!t)return null;let n=0,r=0,i=0;for(let a of e){let e=a.x-t.x,o=a.z-t.z;n+=e*e,r+=e*o,i+=o*o}if(n+i<1e-10)return null;let a=.5*Math.atan2(2*r,n-i);return new L(Math.cos(a),0,Math.sin(a)).normalize()},uZn=(e,t=null)=>{let n=cZn(e);if(!n)return null;let r=t?.clone?.().normalize?.()??lZn(e);if(!r||r.lengthSq()<1e-10)return oZn(n,{x:rZn.clone(),y:d6.clone(),z:iZn.clone()});let i=d6.clone().cross(r).normalize();if(i.lengthSq()<1e-10)return oZn(n,{x:rZn.clone(),y:d6.clone(),z:iZn.clone()});let a=aZn(i,d6,r);return a?(a.y.copy(d6),a.x.copy(d6).cross(a.z).normalize(),a.z.copy(a.x).cross(d6).negate().normalize(),oZn(n,a)):oZn(n,{x:rZn.clone(),y:d6.clone(),z:iZn.clone()})},dZn=(e,t)=>{if(!e.length)return null;let n=t.clone().invert(),r=new XE;for(let t of e){let e=t.clone().applyMatrix4(n);r.expandByPoint(e)}return r};function fZn(e){let{fragments:t,world:n,components:r,OBF:i,$viewer:a}=e,o=null,s=!1,c=!0,l=!1,u=!0,d=!0,f=1,p={idle:{color:4034751,opacity:.07},hovered:{color:4034751,opacity:.24}},m=`shiftKey`,h=()=>n.renderer?.three,g=lo(null),_=()=>{g.value=o},v=new YXn({components:r,OBF:i,world:n,requestRender:e.requestRender.bind(e)}),y=()=>{o&&(u=o.widgetVisible,d=o.overlayVisible)},b=()=>{if(!o)return;let e=h();if(!e)return;o.syncClippingPlanes();let t=o.shown?o.clippingPlanes:[],r=Array.isArray(e.clippingPlanes)?e.clippingPlanes:[],i=o.clippingPlanes,a=[...r.filter(e=>!i.includes(e)),...t].filter((e,t,n)=>n.indexOf(e)===t);e.localClippingEnabled=a.length>0,e.clippingPlanes=a,n.renderer?.updateClippingPlanes()},x=new XXn({world:n,requestRender:e.requestRender.bind(e),axisNormals:WXn,getSectionBox:()=>o,isEditEnabled:()=>c,isWidgetVisible:()=>o?.widgetVisible??u,isOverlayVisible:()=>o?.overlayVisible??d,getPlaneSizeMultiplier:()=>f,getPlaneVisualState:()=>p,onBoundsChange:t=>{o&&(o.setBounds(t),b(),v.enqueueUpdate(o,l),x.update(o.bounds),e.requestRender())}}),S=()=>{if(o){if(o.shown){x.update(o.bounds),v.enqueueUpdate(o,l);return}v.clear(),x.setWidgetVisible()}},C=async()=>{y(),x.setWidgetVisible(),b(),S(),_(),await e.fragments.core.update(!0),e.requestRender()},w=async()=>{let t=o;o=null,_(),v.clear(),x.clear();let r=h();if(r){let e=t?.clippingPlanes??[],i=(Array.isArray(r.clippingPlanes)?r.clippingPlanes:[]).filter(t=>!e.includes(t));r.clippingPlanes=i,r.localClippingEnabled=i.length>0,n.renderer?.updateClippingPlanes()}await e.fragments.core.update(!0),e.requestRender()},T=(e,t=`section-box`,n=null)=>{if(!(e instanceof XE))throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] createSectionBoxFromBounds(bounds) expects a THREE.Box3.`);return e.isEmpty()?(w(),!1):(o&&w(),h()?(o=new $Xn({uuid:t,bounds:e.clone(),frame:n,boxVisible:!0,widgetVisible:!0,overlayVisible:d,onVisibilityChange:C,onClear:w}),b(),S(),_(),!0):!1)},E=async(e,t)=>{let n=[],a;try{a=r.get(i.Mesher)}catch{return n}if(!a?.get)return n;let o;try{o=await a.get(e)}catch{return n}if(!o?.entries)return n;for(let[,e]of o.entries())if(e?.entries){for(let[,r]of e.entries())if(Array.isArray(r))for(let e of r){if(n.length>=t)return n;let r=(e?.geometry)?.getAttribute?.(`position`);if(!r||!r.array||r.count<=0)continue;e.updateMatrixWorld?.(!0);let i=e.matrixWorld,a=Math.max(1,t-n.length),o=Math.min(256,r.count,a),s=Math.max(1,Math.floor(r.count/o));for(let e=0;e<r.count&&n.length<t;e+=s){let t=new L().fromBufferAttribute(r,e);t.applyMatrix4(i),n.push(t)}}}return n},D=async(e,n=tZn)=>{let r=[],i=await E(e,n);if(r.push(...i),r.length>=Math.min(nZn,n))return r;let a=Object.entries(e);if(a.length===0||n<=0)return r;for(let[e,i]of a){let a=t.list.get(e);if(!a)continue;let o=i instanceof Set?[...i]:[...new Set(i)];if(o.length)for(let e of o){if(r.length>=n)break;let t;try{t=await a.getItemDrawChunks([e])}catch{continue}if(t?.length)for(let e of t){if(r.length>=n)break;let t=a.tiles.get(e.tileId),i=t?.geometry,o=i?.getAttribute?.(`position`);if(!t||!o)continue;let s=i.index?.array??null,c=Math.min(e.position?.length??0,e.size?.length??0);for(let i=0;i<c&&!(r.length>=n);i+=1){let a=e.position[i]??0,c=e.size[i]??0,l=s?s.length:o.count,u=Math.min(l-a,c===4294967295?l-a:c);if(!Number.isFinite(u)||u<=0)continue;let d=Math.max(1,n-r.length),f=Math.max(1,Math.floor(u/Math.min(64,u,d)));for(let e=a;e<a+u&&r.length<n;e+=f){let n=s?s[e]:e;if(n==null||n>=o.count||!o.array)continue;let i=new L().fromBufferAttribute(o,n);i.applyMatrix4(t.matrixWorld),r.push(i)}}}}}return r},ee=(e,t)=>uZn(t,sZn(e)),te=async(e,t=null)=>{let n=await D(e);if(n.length<3)return null;let r=null;if(t&&(r=ee(t,n)),r||=uZn(n),!r)return null;let i=dZn(n,r);return!i||i.isEmpty()?null:{bounds:i,frame:r}},ne=async(e,n={})=>{if(!Array.isArray(e))throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] createSectionBoxFromUuids(uuids) expects an array of uuids.`);let r=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(Boolean);if(r.length===0)return w(),!1;let i=await t.guidsToModelIdMap(r);if(!Object.values(i).some(e=>e.size>0))return w(),!1;let a=await te(i,n.normal??null);if(a){let e=KXn(a.bounds);return T(e,r[0],a.frame)}let o=await t.getBBoxes(i);if(!o.length)return w(),!1;let s=new XE;if(o.forEach(e=>s.union(e)),s.isEmpty())return w(),!1;let c=KXn(s);return T(c,r[0])},re=async(e,t={})=>{if(typeof e!=`string`||e.trim()===``)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] createSectionBoxOn(uuid) expects a non-empty string uuid.`);return ne([e],t)},ie=e.onPick(async({pickResult:e})=>{if(!s||!e)return;let{fragments:n,localId:r,normal:i}=e,a={[n.modelId]:new Set([r])},[o]=await t.modelIdMapToGuids(a);o&&await re(o,{normal:i?.clone?.()??null})&&(s=!1)}),ae=Ds(()=>a.localContext.loadedModels,()=>{w()}),oe={createSectionBoxOn:re,createSectionBoxOnSelection:ne,createSectionBoxFromBounds:T,clearSectionBox:w,enableSectionBox(){s=!0,e.highlightMaterial=eZn},disableSectionBox(){s=!1,e.highlightMaterial=null},get sectionBoxEnabled(){return s},showSectionBoxWidget(){if(!o){u=!0,d=!0;return}o?.show()},hideSectionBoxWidget(){if(!o){u=!1,d=!1;return}o?.hide()},get sectionBoxWidgetVisible(){return o?.widgetVisible??u},set sectionBoxWidgetVisible(e){if(typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxWidgetVisible must be a boolean.`);e?oe.showSectionBoxWidget():oe.hideSectionBoxWidget()},get sectionBoxOverlayVisible(){return o?.overlayVisible??d},set sectionBoxOverlayVisible(e){if(typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxOverlayVisible must be a boolean.`);if(!o){d=e;return}o.setOverlayVisible(e)},get sectionBox(){return g.value},toggleSectionBoxEdition(e){if(e!==void 0&&typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] toggleSectionBoxEdition(value) expects a boolean when provided.`);return c=e??!c,x.setHandleEditEnabled(),c},get sectionBoxEditEnabled(){return c},set sectionBoxEditEnabled(e){if(typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxEditEnabled must be a boolean.`);oe.toggleSectionBoxEdition(e)},toggleSectionBoxCaps(e){if(e!==void 0&&typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] toggleSectionBoxCaps(value) expects a boolean when provided.`);return l=e??!l,o&&S(),l},setSectionBoxCapsColor(e){v.setFillColor(e)},get sectionBoxCapsEnabled(){return l},set sectionBoxCapsEnabled(e){if(typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxCapsEnabled must be a boolean.`);l=e,o&&S()},get sectionBoxPlaneSizeMultiplier(){return f},set sectionBoxPlaneSizeMultiplier(e){if(typeof e!=`number`||!Number.isFinite(e)||e<=0)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxPlaneSizeMultiplier must be a positive number.`);f=e,o&&x.update(o.bounds)},get sectionBoxPlaneVisualState(){return{idle:{...p.idle},hovered:{...p.hovered}}},set sectionBoxPlaneVisualState(e){let t=e?.idle,n=e?.hovered;if(!t||!n)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxPlaneVisualState must define idle and hovered states.`);let r=(e,t)=>{let n=e?.color,r=e?.opacity;if(typeof n!=`number`||!Number.isFinite(n))throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] ${t}.color must be a number.`);if(typeof r!=`number`||!Number.isFinite(r))throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] ${t}.opacity must be a number.`);return{color:n,opacity:Math.max(0,Math.min(1,r))}};p={idle:r(t,`idle`),hovered:r(n,`hovered`)},o&&x.update(o.bounds)},get sectionBoxBounds(){return o?.getWorldBounds()??null},get sectionBoxPivotModifier(){return m},set sectionBoxPivotModifier(e){if(e!==`shiftKey`&&e!==`altKey`&&e!==`ctrlKey`&&e!==`metaKey`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxPivotModifier must be one of: shiftKey, altKey, ctrlKey, metaKey.`);m=e}};return{destroy(){ae(),ie?.(),x.destroy(),v.destroy(),w()},extension:oe}}var pZn={COLOR:0,PEN:1,PEN_SHADOWS:2,COLOR_PEN:3,COLOR_SHADOWS:4,COLOR_PEN_SHADOWS:5};function mZn(e){let{world:t}=e,n=co(!1),r=co(!1),i=co(!1),a=!1,o=e=>{if(a||!e)return;let t;try{t=e.edgesPass}catch{return}!t.xray&&t._overrideMaterial&&(t._overrideMaterial.side=0),a=!0},s=()=>{if(!t.renderer)throw Error(`Renderer is not initialized yet.`);return t.renderer},c=()=>n.value&&r.value?pZn.COLOR_PEN_SHADOWS:n.value?pZn.COLOR_PEN:r.value?pZn.COLOR_SHADOWS:pZn.COLOR,l=()=>{let t=s().postproduction,a=c();if(!(n.value||r.value||i.value)){if(t.excludedObjectsEnabled=!1,!t.enabled){e.requestRender();return}t.style=a,e.requestRender();return}t.enabled=!0,o(t),t.smaaEnabled=i.value,t.excludedObjectsEnabled=r.value,t.edgesPass.color?.set&&t.edgesPass.color.set(0),t.edgesPass.width=1,t.edgesPass.depthBiasStrength=0,typeof t.aoPass.updateGtaoMaterial==`function`&&t.aoPass.updateGtaoMaterial(t.defaultAoParameters),t.style=a,e.requestRender()};return l(),{extension:{get postproductionEdgesEnabled(){return n.value},set postproductionEdgesEnabled(e){n.value=!!e,l()},get postproductionAmbientOcclusionEnabled(){return r.value},set postproductionAmbientOcclusionEnabled(e){r.value=!!e,l()},get postproductionSmaaEnabled(){return i.value},set postproductionSmaaEnabled(e){i.value=!!e,l()},get postproductionSettings(){return{edgesEnabled:n.value,ambientOcclusionEnabled:r.value,smaaEnabled:i.value}},setPostproductionSettings:(e={})=>{typeof e.edgesEnabled==`boolean`&&(n.value=e.edgesEnabled),typeof e.ambientOcclusionEnabled==`boolean`&&(r.value=e.ambientOcclusionEnabled),typeof e.smaaEnabled==`boolean`&&(i.value=e.smaaEnabled),l()}}}}var f6=1e-4,hZn=1e-4,gZn=({x:e,y:t,z:n})=>({x:-e,y:-t,z:-n}),_Zn=e=>{if(!Array.isArray(e)||e.length!==6)return null;let t={minX:null,maxX:null,minY:null,maxY:null,minZ:null,maxZ:null},n=e=>{let t=new L(e.x,e.y,e.z).normalize();return Math.abs(t.x-1)<=f6&&Math.abs(t.y)<=f6&&Math.abs(t.z)<=f6?`minX`:Math.abs(t.x+1)<=f6&&Math.abs(t.y)<=f6&&Math.abs(t.z)<=f6?`maxX`:Math.abs(t.y-1)<=f6&&Math.abs(t.x)<=f6&&Math.abs(t.z)<=f6?`minY`:Math.abs(t.y+1)<=f6&&Math.abs(t.x)<=f6&&Math.abs(t.z)<=f6?`maxY`:Math.abs(t.z-1)<=f6&&Math.abs(t.x)<=f6&&Math.abs(t.y)<=f6?`minZ`:Math.abs(t.z+1)<=f6&&Math.abs(t.x)<=f6&&Math.abs(t.y)<=f6?`maxZ`:null};for(let r of e){let e=n(r.direction);if(!e||t[e]!==null)return null;e===`minX`||e===`maxX`?t[e]=r.location.x:e===`minY`||e===`maxY`?t[e]=r.location.y:t[e]=r.location.z}let{minX:r,maxX:i,minY:a,maxY:o,minZ:s,maxZ:c}=t;return[r,i,a,o,s,c].some(e=>e===null)||r>=i-f6||a>=o-f6||s>=c-f6?null:new XE(new L(r,a,s),new L(i,o,c))},vZn=e=>{if(!Array.isArray(e)||e.length!==6)return null;let t=e.map(({location:e,direction:t})=>{let n=new L(t.x,t.y,t.z).normalize(),r=new L(e.x,e.y,e.z);return new PD().setFromNormalAndCoplanarPoint(n,r)}),n=[,,,,,,].fill(!1),r=[];for(let e=0;e<6;e++){if(n[e])continue;let i=!1;for(let a=e+1;a<6;a++)if(!n[a]&&t[e].normal.dot(t[a].normal)<-.9999){r.push([t[e],t[a]]),n[e]=!0,n[a]=!0,i=!0;break}if(!i)return null}if(r.length!==3)return null;let i=r.map(([e])=>e.normal.clone());for(let e=0;e<3;e++)for(let t=e+1;t<3;t++)if(Math.abs(i[e].dot(i[t]))>hZn*10)return null;let a=[[0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]],o=null;for(let[e,t,n]of a)if(i[e].clone().cross(i[t]).dot(i[n])>1-hZn*10){o=[e,t,n];break}if(!o)return null;let[s,c,l]=o,u=i[s].clone(),d=i[c].clone(),f=i[l].clone(),[p,m]=r[s],[h,g]=r[c],[_,v]=r[l],y=(-p.constant+m.constant)/2,b=(-h.constant+g.constant)/2,x=(-_.constant+v.constant)/2,S=new L().addScaledVector(u,y).addScaledVector(d,b).addScaledVector(f,x),C=new OE().makeBasis(u,d,f).setPosition(S),w=(p.constant+m.constant)/2,T=(h.constant+g.constant)/2,E=(_.constant+v.constant)/2;return w<f6||T<f6||E<f6?null:{bounds:new XE(new L(-Math.abs(w),-Math.abs(T),-Math.abs(E)),new L(Math.abs(w),Math.abs(T),Math.abs(E))),frame:C}},yZn=e=>{e.clearSectionBox?.(),e.sectionPlanes.slice().forEach(t=>{e.deleteSectionPlane?.(t)})},bZn=async({fragments:e,clippingPlanes:t,toYup:n})=>{if(!Array.isArray(t)||t.length===0)return;e.widgetsVisible=!1,e.sectionBoxOverlayVisible=!1;let r=t.map(e=>({location:n(e.location),direction:gZn(n(e.direction))})),i=_Zn(r);if(i){e.createSectionBoxFromBounds?.(i,`viewpoint-section-box`),e.sectionBoxOverlayVisible=!1;return}let a=vZn(r);if(a){e.createSectionBoxFromBounds?.(a.bounds,`viewpoint-section-box`,a.frame),e.sectionBoxOverlayVisible=!1;return}for(let t of r)await e.addSectionPlane({point:new L(t.location.x,t.location.y,t.location.z),normal:new L(t.direction.x,t.direction.y,t.direction.z)});e.widgetsVisible=!1};function xZn(e){let{components:t,world:n,OBC:r,$viewer:i}=e,a=t.get(r.Viewpoints);a.world=n;let o=e=>{let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)},s=({x:e,y:t,z:n})=>({x:e,y:-n,z:t}),c=({x:e,y:t,z:n})=>({x:e,y:n,z:-t}),l=({x:e,y:t,z:n})=>({x:-e,y:-t,z:-n}),u=()=>i.localContext.pluginComponentInstances.get(`viewer3d-fragments-parameters`),d=()=>{let e=u();return e&&typeof e.ifcSpaces==`boolean`?e.ifcSpaces:!0},f=async()=>{let t={},n=p();for(let[r,i]of e.fragments.list.entries()){let e=Number(r);if(!n.has(e)&&!n.has(r))continue;let{IFCSPACE:a}=await i.getItemsOfCategories([/IFCSPACE/]);a?.length&&(t[r]=a)}return t},p=()=>new Set(i.localContext.loadedModelIds),m=()=>{let e=p();return i.state.objects.filter(t=>e.has(t.model?.id))},h=e=>Array.from(new Set(e.map(e=>e.uuid).filter(Boolean))),g=e=>{let t=e.filter(e=>!!e.uuid),n=new Set(h(t.filter(e=>e.visible))),r=h(t.filter(e=>!e.visible));return n.size<r.length?{default_visibility:!1,exceptions:Array.from(n).map(e=>({ifc_guid:e,authoring_tool_id:null}))}:{default_visibility:!0,exceptions:r.map(e=>({ifc_guid:e,authoring_tool_id:null}))}};return{extension:{getViewpoint:async()=>{let t=a.create();t.title=`My Viewpoint`,await t.updateCamera();let r=t.toJSON(),i=m(),o=h(i.filter(e=>e.selected)),c=g(i),u=r.components?.visibility?.view_setup_hints;if(r.components={...r.components??{},selection:o.map(e=>({ifc_guid:e,authoring_tool_id:null})),visibility:{...c,view_setup_hints:{...u??{},spaces_visible:d()}}},r.perspective_camera&&(r.perspective_camera.camera_view_point=s(r.perspective_camera.camera_view_point),r.perspective_camera.camera_direction=s(r.perspective_camera.camera_direction),r.perspective_camera.camera_up_vector=s(r.perspective_camera.camera_up_vector)),r.orthogonal_camera){r.orthogonal_camera.camera_view_point=s(r.orthogonal_camera.camera_view_point),r.orthogonal_camera.camera_direction=s(r.orthogonal_camera.camera_direction),r.orthogonal_camera.camera_up_vector=s(r.orthogonal_camera.camera_up_vector);let e=n.camera.threeOrtho;e.zoom&&e.zoom!==1&&(r.orthogonal_camera.view_to_world_scale=(e.top-e.bottom)/e.zoom)}let f=e,_=f.sectionPlanes.some(e=>e.shown),v=!!f.sectionBox?.shown;if(_||v){let e=[];if(v){let t=f.sectionBox;e.push(...t.planes)}else e.push(...f.sectionPlanes.filter(e=>e.shown));r.clipping_planes=e.map(e=>({location:s(e.location),direction:l(s(e.direction))}))}return r.originating_system=`ifc3d`,r.models=Array.from(p()),r},setViewpoint:async t=>{t=JSON.parse(JSON.stringify(t)),t.perspective_camera&&(t.perspective_camera.camera_view_point=c(t.perspective_camera.camera_view_point),t.perspective_camera.camera_direction=c(t.perspective_camera.camera_direction),t.perspective_camera.camera_up_vector=c(t.perspective_camera.camera_up_vector)),t.orthogonal_camera&&(t.orthogonal_camera.camera_view_point=c(t.orthogonal_camera.camera_view_point),t.orthogonal_camera.camera_direction=c(t.orthogonal_camera.camera_direction),t.orthogonal_camera.camera_up_vector=c(t.orthogonal_camera.camera_up_vector));let r=e;yZn(r),await bZn({fragments:r,clippingPlanes:t.clipping_planes,toYup:c});let o=a.create(t);if(await n.camera.controls.setFocalOffset(0,0,0),await o.go({transition:!1}),t.orthogonal_camera?.view_to_world_scale!=null){let e=n.camera.threeOrtho,r=t.orthogonal_camera.view_to_world_scale,i=e.top-e.bottom;if(r>0&&i>0){let e=i/r;Number.isFinite(e)&&e>0&&await n.camera.controls.zoomTo(e,!1)}}try{let e=await n.camera.getItemsBounding();n.camera.controls.setOrbitPoint(e.center.x,e.center.y,e.center.z)}catch{n.camera.controls.setOrbitPoint(0,0,0)}if(IMt(i,t),t.components?.visibility?.view_setup_hints?.spaces_visible===!1){let t=await f();Object.keys(t).length>0&&await e.hide(t)}},getSnapshot:async()=>{let e=a.create();await e.takeSnapshot();let t=a.snapshots.get(e.snapshot);return{snapshot_type:`png`,snapshot_data:`data:image/png;base64,${o(t)}`}}},destroy(){}}}function SZn(e){let{components:t,world:n,$viewer:r,OBC:i}=e,a=t.get(i.Raycasters).get(n),o=n.renderer.three.domElement,s=null,c=async e=>{e.preventDefault(),e.stopPropagation();let t=await a.castRay();if(!t)return;let n=t.point.x,i=t.point.z,o=t.point.y,c=await t.fragments.getGuidsByLocalIds([t.localId]),l=r.state.getObjectsByUuids(c)[0],u=r.localContext.loadedModels;s({x:n,y:i,z:o,object:l,models:u})},l=co(!1),u=t=>{if(!t||typeof t!=`function`)throw TypeError(`[BIMDataViewer - Viewer3DFragments - Annotation] A callback function must be provided to start annotation mode.`);d(),l.value=!0,s=t,e.selectOnClick=!1,o.addEventListener(`pointerdown`,c),o.style.cursor=`add`},d=()=>{l.value=!1,s=null,e.selectOnClick=!0,o.removeEventListener(`pointerdown`,c),o.style.cursor=`default`};return{extension:{get annotationMode(){return l.value},startAnnotationMode:u,stopAnnotationMode:d},destroy(){d()}}}var CZn=[`POINT`,`LINE`,`FACE`],wZn={POINT:0,LINE:1,FACE:2},TZn={0:`POINT`,1:`LINE`,2:`FACE`},EZn={POINT:`vertex`,LINE:`edge`,FACE:`surface`,NONE:`noSurface`},p6=e=>`#${e.getHexString()}`,m6=e=>new VE(e),h6=(e,t,n=new L)=>n.copy(e).sub(t),DZn=(e,t=null)=>{let n=new L;if(e?.face?.normal&&e?.object){n.copy(e.face.normal);let t=e.object.matrixWorld;if(e.instanceId!=null&&e.object.isInstancedMesh){let n=new OE;e.object.getMatrixAt(e.instanceId,n),t=new OE().multiplyMatrices(e.object.matrixWorld,n)}let r=new yE().getNormalMatrix(t);return n.applyMatrix3(r).normalize(),n}return e?.normal?.isVector3&&e.normal.lengthSq()>1e-12?(n.copy(e.normal).normalize(),n):t?(t.getWorldDirection(n).negate().normalize(),n):new L(0,1,0)},OZn=(e,t,n)=>{let r=e.clone().project(t),i=n.getBoundingClientRect();return{x:(r.x+1)*.5*i.width,y:(1-(r.y+1)*.5)*i.height}},kZn=(e,t)=>{let n=t.getBoundingClientRect();return{x:(e.clientX-n.left)/n.width*2-1,y:-((e.clientY-n.top)/n.height)*2+1}},g6=(...e)=>Array.from(new Set(e.filter(Boolean).map(String))),AZn=(e,t,n=1e6)=>{let r=[],i=new Map,a=e=>Math.round(e*n),o=e=>`${a(e.x)}:${a(e.y)}:${a(e.z)}`,s=new Map;e.forEach((e,t)=>{let n=o(e);if(!i.has(n)){let t=r.length;i.set(n,t),r.push(e.clone())}s.set(t,i.get(n))});let c=t.map(e=>s.get(e)).filter(e=>Number.isInteger(e)),l=Math.floor(c.length/3);return{vertices:r,indices:c.slice(0,l*3)}},jZn=(e,t)=>{let n=new Map,r=(e,t)=>{if(e===t)return;let r=`${Math.min(e,t)}:${Math.max(e,t)}`,i=n.get(r);if(!i){n.set(r,{a:e,b:t,count:1});return}i.count+=1};for(let e=0;e+2<t.length;e+=3){let n=t[e],i=t[e+1],a=t[e+2];r(n,i),r(i,a),r(a,n)}return Array.from(n.values()).filter(e=>e.count===1).map(t=>[e[t.a],e[t.b]])},MZn=(e,t,{eps:n=1e-6,orthogonalityDeg:r=60}={})=>{if(!Array.isArray(t)||t.length<2)return null;let i=[];for(let[r,a]of t){if(!r||!a)continue;let t=a.clone().sub(r),o=t.clone().sub(e.clone().multiplyScalar(t.dot(e))),s=o.length();s<=n||i.push({dir:o.multiplyScalar(1/s),length:s})}if(i.length<2)return null;let a=null,o=-1/0;for(let e of i){let t=0;for(let n of i)t+=n.length*Math.abs(e.dir.dot(n.dir));t>o&&(o=t,a=e.dir)}if(!a)return null;let s=Math.cos(gE.degToRad(r)),c=0;for(let e of i)Math.abs(a.dot(e.dir))<=s&&(c+=e.length);return c<=n?null:a.clone().normalize()},NZn=class{constructor({components:e,world:t,OBC:n,requestRender:r}){let i=e.get(n.Raycasters);this.caster=i.get(t),this.world=t,this.requestRender=r}async pickFromEvent(e){let t=kZn(e,this.world.renderer.three.domElement);return this.pickAtPosition(t)}async pickAtPosition(e){let t=CZn.map(e=>wZn[e]).filter(e=>Number.isInteger(e)),n=await this.caster.castRay({position:e,snappingClasses:t});if(!n)return null;let r=TZn[n.snappingClass]??this.#e(n)??`NONE`,i=this.world.camera.three,a=this.world.renderer.three.domElement;return{hit:n,snapName:r,point:n.point.clone(),normal:DZn(n,i),screen:OZn(n.point,i,a),modelId:n.fragments?.modelId??null}}#e(e){return e?.snappedEdgeP1&&e?.snappedEdgeP2?`LINE`:Array.isArray(e?.facePoints)&&e.facePoints.length>=9?`FACE`:null}requestFrame(){this.requestRender()}},PZn={pointer:XNt,vertex:qNt,edge:KNt,surface:JNt,noSurface:YNt},FZn=class{constructor(e){this.domElement=e,this.cursorMode=`overlay`,this.cursorStyle=`url("${XNt}") 16 16, auto`;let t=document.createElement(`img`);t.style.width=`28px`,t.style.height=`28px`,t.style.position=`absolute`,t.style.pointerEvents=`none`,t.style.transform=`translate(-50%, -50%)`,t.style.display=`none`,e.parentNode.insertBefore(t,e),this.img=t,this.visible=!1}show(){this.img.style.display=this.cursorMode===`crosshair`?`none`:`block`,this.domElement.style.cursor=this.cursorStyle,this.visible=!0}hide(){this.img.style.display=`none`,this.domElement.style.cursor=`default`,this.visible=!1}useCrosshairCursor(){this.cursorMode=`crosshair`,this.cursorStyle=`crosshair`,this.visible&&(this.img.style.display=`none`,this.domElement.style.cursor=this.cursorStyle)}useOverlayCursor(){this.cursorMode=`overlay`,this.cursorStyle=`url("${XNt}") 16 16, auto`,this.visible&&(this.img.style.display=`block`,this.domElement.style.cursor=this.cursorStyle)}update(e){if(!this.visible)return;if(this.cursorMode===`crosshair`){this.img.style.display=`none`;return}if(!e){this.img.style.left=`-9999px`,this.img.style.top=`-9999px`,this.img.src=YNt;return}let t=PZn[PZn[EZn[e.snapName]]?EZn[e.snapName]:`noSurface`];this.img.src=t,this.img.style.left=`${e.screen.x}px`,this.img.style.top=`${e.screen.y}px`}destroy(){this.hide(),this.img.remove()}},IZn=1e-8,LZn=new L(1,0,0),RZn=new L(0,1,0),zZn=new L(0,0,1),_6=e=>e?.isVector3&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z),v6=(e,t)=>!_6(e)||e.lengthSq()<=IZn?t.clone():e.clone().normalize(),BZn=(e,t)=>{let n=new L().crossVectors(t,e);if(!_6(n)||n.lengthSq()<=IZn){let t=Math.abs(RZn.dot(e))>.98?LZn:RZn;n=new L().crossVectors(t,e)}return v6(n,zZn)},y6=({tip:e,inwardDirection:t,planeNormal:n,arrowLength:r,minArrowLength:i=.01,diagonalBlend:a=.85})=>{if(!_6(e))return[];let o=v6(t,LZn),s=BZn(o,v6(n,RZn)),c=Math.max(Number.isFinite(r)?r:0,i),l=e.clone().add(s.clone().multiplyScalar(c)),u=e.clone().add(s.clone().multiplyScalar(-c)),d=v6(o.clone().add(s.clone().multiplyScalar(a)),o),f=v6(o.clone().add(s.clone().multiplyScalar(-a)),o),p=e.clone().add(d.multiplyScalar(c*Math.SQRT2)),m=e.clone().add(f.multiplyScalar(c*Math.SQRT2)),h=[e.clone(),l,e.clone(),u,e.clone(),p,e.clone(),m];return h.every(_6)?h:[]},VZn=e=>!Array.isArray(e)||e.length===0||e.length%2!=0?!1:e.every(_6),HZn=(e,t={})=>{let n=document.createElement(`canvas`),r=n.getContext(`2d`),{strokeColor:i=null,strokeWidth:a=0}=t;r.font=`700 120px Arial`;let o=r.measureText(e),s=Math.max(256,Math.ceil(o.width+32));n.width=s,n.height=256,r.font=`700 120px Arial`,r.textAlign=`center`,r.textBaseline=`middle`,r.clearRect(0,0,s,256),i&&a>0&&(r.lineJoin=`round`,r.strokeStyle=i,r.lineWidth=a,r.strokeText(e,s/2,256/2)),r.fillStyle=`rgba(255, 255, 255, 1)`,r.fillText(e,s/2,256/2);let c=new _Rt(n);return c.colorSpace=YT,c.needsUpdate=!0,c.minFilter=NT,c.magFilter=NT,{texture:c,aspect:s/256}},b6=({content:e,size:t,color:n,strokeColor:r,strokeWidth:i})=>{let a=new zE,{texture:o,aspect:s}=HZn(e,{strokeColor:r,strokeWidth:i}),c=new fO(Math.max(t*2.2,t*1.2*s),t*1.2),l=Math.max(t*.015,.001),u=()=>new ED({map:o,color:n,side:0,transparent:!0,depthTest:!0,depthWrite:!1,alphaTest:.15}),d=new OD(c,u());d.position.z=l;let f=new OD(c.clone(),u());return f.rotateY(Math.PI),f.position.z=-l,a.add(d,f),a.renderOrder=15,a},x6=({group:e,direction:t,up:n,normal:r,position:i})=>{let a=new OE().makeBasis(t.clone().normalize(),n.clone().normalize(),r.clone().normalize());e.quaternion.setFromRotationMatrix(a),e.position.copy(i)},UZn=new L(0,1,0),WZn=new L(0,0,0),GZn=class{constructor(e,t,n,r=[]){this.plugin=e,this.group=new zE,this.material=new rW({color:m6(e.defaultColor),linewidth:e.lineWidth,depthTest:!0,depthWrite:!1,transparent:!1}),this.#e(),this.geometry=new nW,this.line=new dW(this.geometry,this.material),this.line.visible=!1,this.line.renderOrder=10,this.group.add(this.line),this._p1=t.clone(),this._p2=t.clone(),this._startNormal=n.clone().normalize(),this._currentNormal=n.clone().normalize(),this._length=0,this._visible=!0,this._text=null,this.modelIds=g6(...r),this.group.position.copy(this._p1),(this.plugin.overlayScene||this.plugin.world.scene.three).add(this.group)}move(e,t){this._p2.copy(e),this._currentNormal.copy(t).normalize();let n=this._p1,r=WZn,i=h6(this._p2,n);this.group.position.copy(n);let a=new L().subVectors(this._p2,this._p1),o=a.length();if(this._length=o,o<=1e-6){this.line.visible=!1,this.#n();return}this.#e();let s=a.clone().normalize(),c=s.clone().negate(),l=Math.abs(s.dot(UZn))>.9,u=Math.max(o*(l?.08:.05),.03),d=this._startNormal.clone().normalize(),f=new L().crossVectors(d,s).normalize();if(f.lengthSq()<=1e-8){let e=new L;this.plugin.world.camera.three.getWorldDirection(e),f=new L().crossVectors(s,e).normalize()}let p=UZn.clone().sub(s.clone().multiplyScalar(UZn.dot(s)));p.lengthSq()>1e-8&&f.dot(p)<0&&f.negate();let m=o*this.plugin.arrowSizeRatio,h=d.clone().multiplyScalar(this.plugin.surfaceOffset),g=y6({tip:r,inwardDirection:s,planeNormal:d,arrowLength:m}).map(e=>e.clone().add(h)),_=y6({tip:i,inwardDirection:c,planeNormal:d,arrowLength:m}).map(e=>e.clone().add(h)),v=[r.clone().add(h),i.clone().add(h),...g,..._];if(!VZn(v)){this.line.visible=!1,this.#n();return}let y=[];v.forEach(e=>{y.push(e.x,e.y,e.z)}),this.geometry.setPositions(y),this.line.visible=!0;let b=i.clone().multiplyScalar(.5).add(h),x=f.clone().sub(s.clone().multiplyScalar(f.dot(s)));x.lengthSq()<=1e-8&&(x=f.clone()),x.normalize();let S=new L().crossVectors(s,x).normalize();S.dot(d)<0&&(S.negate(),x=new L().crossVectors(S,s).normalize());let C=b.clone().add(x.clone().multiplyScalar(u));this.#t(`${o.toFixed(2)} m`,o,s,x,S,C)}#e(){let e=this.plugin.world.renderer.three.domElement;this.material.resolution.set(e.clientWidth,e.clientHeight)}#t(e,t,n,r,i,a){this.#n();let o=Math.max(.04,t*this.plugin.textSizeRatio);this._text=b6({content:e,size:o,color:this.material.color}),x6({group:this._text,direction:n,up:r,normal:i,position:a}),this.group.add(this._text)}#n(){this._text&&=(this.group.remove(this._text),this._text.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.dispose())}),null)}destroy(){this.#n(),this.geometry.dispose(),this.material.dispose(),this.group.removeFromParent(),this.plugin.measurements=this.plugin.measurements.filter(e=>e!==this),this.plugin.fragmentsInstance.requestRender()}get length(){return this.visible?this._length:0}get visible(){return this._visible}set visible(e){this._visible=!!e,this.group.visible=this._visible}get color(){return p6(this.material.color)}set color(e=this.plugin.defaultColor){let t=m6(e);this.material.color.copy(t),this._text&&this._text.traverse(e=>{e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.color?.copy(t))})}},KZn=class{constructor(e,t,n,r={}){this.fragmentsInstance=e,this.world=e.world,this.overlayScene=e.overlayScene,this.snapPicker=t,this.cursorOverlay=n,this.arrowSizeRatio=r.arrowSizeRatio??.04,this.lineWidth=r.lineWidth??2,this.textSizeRatio=r.textSizeRatio??.1,this.offsetRatio=r.offsetRatio??.003,this.surfaceOffset=r.surfaceOffset??.003,this.defaultColor=r.defaultColor??`#ffffff`,this.measurements=[],this.measurementEndCallbacks={},this.measurementEndCallbackId=0,this.control=new qZn(this)}on(e,t){if(e===`measurementEnd`)return this.measurementEndCallbacks[this.measurementEndCallbackId++]=t,this.measurementEndCallbackId}off(e){this.measurementEndCallbacks[e]=null}destroy(){this.control.deactivate(),this.control.destroy(),this.measurements.slice().forEach(e=>e.destroy()),this.measurements.length=0}},qZn=class{constructor(e){this.plugin=e,this.currentMeasurement=null,this.lastSnap=null,this.mouseDown=!1,this.dragging=!1,this.activated=!1,this.onPointerMove=this.onPointerMove.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerUp=this.onPointerUp.bind(this)}async onPointerMove(e){e.preventDefault(),this.mouseDown&&(this.dragging=!0),this.lastSnap=await this.plugin.snapPicker.pickFromEvent(e),this.plugin.cursorOverlay.update(this.lastSnap),this.currentMeasurement&&this.lastSnap&&(this.currentMeasurement.move(this.lastSnap.point,this.lastSnap.normal),this.plugin.snapPicker.requestFrame())}onPointerDown(e){e.button===0&&(this.mouseDown=!0)}onPointerUp(e){if(e.button!==0)return;this.mouseDown=!1;let t=this.dragging;if(this.dragging=!1,!(t||!this.lastSnap)){if(this.currentMeasurement){this.currentMeasurement.move(this.lastSnap.point,this.lastSnap.normal),this.plugin.measurements.push(this.currentMeasurement),Object.values(this.plugin.measurementEndCallbacks).forEach(e=>{e?.(this.currentMeasurement)}),this.currentMeasurement=null;return}this.currentMeasurement=new GZn(this.plugin,this.lastSnap.point,this.lastSnap.normal,[this.lastSnap.modelId])}}activate(){if(this.activated)return;let e=this.plugin.world.renderer.three.domElement;this.plugin.cursorOverlay.show(),e.addEventListener(`pointermove`,this.onPointerMove),e.addEventListener(`pointerdown`,this.onPointerDown),document.addEventListener(`pointerup`,this.onPointerUp),this.activated=!0}deactivate(){if(!this.activated)return;let e=this.plugin.world.renderer.three.domElement;e.removeEventListener(`pointermove`,this.onPointerMove),e.removeEventListener(`pointerdown`,this.onPointerDown),document.removeEventListener(`pointerup`,this.onPointerUp),this.currentMeasurement?.destroy(),this.currentMeasurement=null,this.lastSnap=null,this.dragging=!1,this.mouseDown=!1,this.plugin.cursorOverlay.hide(),this.activated=!1}destroy(){}},JZn=new L(0,0,0),YZn=class{constructor(e,t,n,r,i=[],a=null){this.plugin=e,this.group=new zE,this.linesMaterial=new rW({color:m6(e.defaultColor),linewidth:e.lineWidth,depthTest:!0,depthWrite:!1,transparent:!1}),this.arcMaterial=this.linesMaterial.clone(),this.#n(),this.lineGeometry=new nW,this.arcGeometry=new _Qt,this.lines=new dW(this.lineGeometry,this.linesMaterial),this.arc=new vQt(this.arcGeometry,this.arcMaterial),this.lines.visible=!1,this.arc.visible=!1,this.group.add(this.lines,this.arc),this._p1=t.clone(),this._p2=n.clone(),this._p3=r.clone(),this._normalHint=a?.clone?.().normalize?.()||null,this._angle=0,this._visible=!0,this._text=null,this.modelIds=g6(...i),this.group.position.copy(this._p2),(this.plugin.overlayScene||this.plugin.world.scene.three).add(this.group),this.update(t,n,r,a)}update(e,t,n,r=null){this._p1.copy(e),this._p2.copy(t),this._p3.copy(n),r?.isVector3&&(this._normalHint=r.clone().normalize());let i=this._p2,a=h6(this._p1,i),o=JZn,s=h6(this._p3,i);this.group.position.copy(i);let c=a.clone().sub(o),l=s.clone().sub(o);this.#n();let u=this._normalHint?.isVector3?this._normalHint.clone().normalize():new L(0,1,0);if(c.lengthSq()>1e-6&&l.lengthSq()<=1e-6){this._angle=0,this.arc.visible=!1;let e=c.length()*this.plugin.arrowSizeRatio,t=c.clone().normalize(),n=u.lengthSq()>1e-8?u:new L(0,1,0);this.#t([o,a,...y6({tip:a,inwardDirection:t.clone().negate(),planeNormal:n,arrowLength:e})]),this.#r();return}if(c.lengthSq()<=1e-6||l.lengthSq()<=1e-6){this._angle=0,this.lines.visible=!1,this.arc.visible=!1,this.#r();return}let d=c.clone().normalize(),f=l.clone().normalize(),p=d.angleTo(f);this._angle=gE.radToDeg(p);let m=new L().crossVectors(d,f),h=m.lengthSq()>1e-8?m.clone().normalize():u;h.lengthSq()<=1e-8&&(h=new L(0,1,0)),d.clone().applyAxisAngle(h,p).dot(f)<.999&&(h=h.clone().negate());let g=(u.lengthSq()>1e-8?u:h).clone().multiplyScalar(this.plugin.surfaceOffset),_=c.length(),v=l.length(),y=_*this.plugin.arrowSizeRatio,b=v*this.plugin.arrowSizeRatio,x=[o.clone().add(g),a.clone().add(g),o.clone().add(g),s.clone().add(g),...y6({tip:a,inwardDirection:d.clone().negate(),planeNormal:h,arrowLength:y}).map(e=>e.clone().add(g)),...y6({tip:s,inwardDirection:f.clone().negate(),planeNormal:h,arrowLength:b}).map(e=>e.clone().add(g))];this.#t(x);let S=Math.min(c.length(),l.length())*.35;if(m.lengthSq()<=1e-8){this.arc.visible=!1,this.#r();return}let C=[];for(let e=0;e<=24;e++){let t=e/24*p,n=d.clone().applyAxisAngle(h,t);C.push(o.clone().add(n.multiplyScalar(S)).add(g))}this.arcGeometry.setPositions(C.flatMap(e=>[e.x,e.y,e.z])),this.arc.visible=!0;let w=d.clone().applyAxisAngle(h,p*.5),T=o.clone().add(w.multiplyScalar(S*1.45)).add(g),E=h.clone().cross(w).normalize();this.#e(`${this._angle.toFixed(2)}°`,S,w,E,h,T)}#e(e,t,n,r,i,a){this.#r(),this._text=b6({content:e,size:Math.max(t*this.plugin.textSizeRatio,.03),color:this.linesMaterial.color}),x6({group:this._text,direction:n,up:r,normal:i,position:a}),this.group.add(this._text)}#t(e){if(!VZn(e)){this.lines.visible=!1;return}let t=e.flatMap(e=>[e.x,e.y,e.z]);this.lineGeometry.setPositions(t),this.lines.visible=t.length>0}#n(){let e=this.plugin.world.renderer.three.domElement;this.linesMaterial.resolution.set(e.clientWidth,e.clientHeight),this.arcMaterial.resolution.set(e.clientWidth,e.clientHeight)}#r(){this._text&&=(this.group.remove(this._text),this._text.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.dispose())}),null)}destroy(){this.#r(),this.lineGeometry.dispose(),this.arcGeometry.dispose(),this.linesMaterial.dispose(),this.arcMaterial.dispose(),this.group.removeFromParent(),this.plugin.measurements=this.plugin.measurements.filter(e=>e!==this),this.plugin.fragmentsInstance.requestRender()}get angle(){return this.visible?this._angle:0}get visible(){return this._visible}set visible(e){this._visible=!!e,this.group.visible=this._visible}get color(){return p6(this.linesMaterial.color)}set color(e=this.plugin.defaultColor){let t=m6(e);this.linesMaterial.color.copy(t),this.arcMaterial.color.copy(t),this._text&&this._text.traverse(e=>{e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.color?.copy(t))})}},XZn=class{constructor(e,t,n,r={}){this.fragmentsInstance=e,this.world=e.world,this.overlayScene=e.overlayScene,this.snapPicker=t,this.cursorOverlay=n,this.textSizeRatio=r.textSizeRatio??.28,this.arrowSizeRatio=r.arrowSizeRatio??.04,this.lineWidth=r.lineWidth??2,this.surfaceOffset=r.surfaceOffset??.003,this.defaultColor=r.defaultColor??`#ffffff`,this.measurements=[],this.measurementEndCallbacks={},this.measurementEndCallbackId=0,this.control=new ZZn(this)}on(e,t){if(e===`measurementEnd`)return this.measurementEndCallbacks[this.measurementEndCallbackId++]=t,this.measurementEndCallbackId}off(e){this.measurementEndCallbacks[e]=null}destroy(){this.control.deactivate(),this.control.destroy(),this.measurements.slice().forEach(e=>e.destroy()),this.measurements.length=0}},ZZn=class{constructor(e){this.plugin=e,this.points=[],this.normals=[],this.modelIds=[],this.previewMeasurement=null,this.lastSnap=null,this.mouseDown=!1,this.dragging=!1,this.activated=!1,this.onPointerMove=this.onPointerMove.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerUp=this.onPointerUp.bind(this)}async onPointerMove(e){e.preventDefault(),this.mouseDown&&(this.dragging=!0),this.lastSnap=await this.plugin.snapPicker.pickFromEvent(e),this.plugin.cursorOverlay.update(this.lastSnap),!(!this.lastSnap||this.points.length===0)&&(this.points.length===1?this.#e(this.points[0],this.lastSnap.point,this.lastSnap.point):this.points.length===2&&this.#e(this.points[0],this.points[1],this.lastSnap.point),this.plugin.snapPicker.requestFrame())}onPointerDown(e){e.button===0&&(this.mouseDown=!0)}onPointerUp(e){if(e.button!==0)return;this.mouseDown=!1;let t=this.dragging;if(this.dragging=!1,t||!this.lastSnap||(this.points.push(this.lastSnap.point.clone()),this.normals.push(this.lastSnap.normal.clone()),this.modelIds.push(this.lastSnap.modelId),this.points.length<3))return;this.previewMeasurement?.destroy(),this.previewMeasurement=null;let n=new YZn(this.plugin,this.points[0],this.points[1],this.points[2],this.modelIds,this.normals[1]||this.normals[0]||this.lastSnap.normal);this.plugin.measurements.push(n),Object.values(this.plugin.measurementEndCallbacks).forEach(e=>{e?.(n)}),this.points=[],this.normals=[],this.modelIds=[]}#e(e,t,n){let r=this.points.length===1?this.lastSnap?.normal||this.normals[0]:this.normals[1]||this.normals[0]||this.lastSnap?.normal;if(!this.previewMeasurement){this.previewMeasurement=new YZn(this.plugin,e,t,n,this.modelIds,r);return}this.previewMeasurement.update(e,t,n,r)}activate(){if(this.activated)return;let e=this.plugin.world.renderer.three.domElement;this.plugin.cursorOverlay.show(),e.addEventListener(`pointermove`,this.onPointerMove),e.addEventListener(`pointerdown`,this.onPointerDown),document.addEventListener(`pointerup`,this.onPointerUp),this.activated=!0}deactivate(){if(!this.activated)return;let e=this.plugin.world.renderer.three.domElement;e.removeEventListener(`pointermove`,this.onPointerMove),e.removeEventListener(`pointerdown`,this.onPointerDown),document.removeEventListener(`pointerup`,this.onPointerUp),this.previewMeasurement?.destroy(),this.previewMeasurement=null,this.points=[],this.normals=[],this.modelIds=[],this.lastSnap=null,this.mouseDown=!1,this.dragging=!1,this.plugin.cursorOverlay.hide(),this.activated=!1}destroy(){}},QZn=new L(0,0,0),$Zn=new L(0,1,0),eQn=.9,tQn=class{constructor(e,t){this.plugin=e,this.group=new zE,this.material=new WD({color:m6(e.defaultColor),depthTest:!1,transparent:!0}),this.sphereMaterial=new ED({color:m6(e.defaultColor),depthTest:!1,transparent:!0}),this.sphereGeometry=new pO(.03,12,12),this.fromSphere=new OD(this.sphereGeometry,this.sphereMaterial),this.toSphere=new OD(this.sphereGeometry,this.sphereMaterial),this.lineGeometry=new yD,this.line=new KD(this.lineGeometry,this.material),this.fromSphere.raycast=()=>{},this.toSphere.raycast=()=>{},this.line.raycast=()=>{},this.toSphere.visible=!1,this.line.visible=!1,this.group.add(this.fromSphere,this.toSphere,this.line),this._length=0,this._visible=!0,this._text=null,this._textContent=null,this._localTo=null,this._isVertical=!1,this._consecutiveMisses=0,this._showRequestId=0,this._destroyed=!1,this.modelIds=g6(t.modelId),this.group.position.copy(t.point),this.plugin.world.scene.three.add(this.group),this._onCameraUpdate=()=>{this._isVertical&&this.#n()},this._cameraControls=this.plugin.world.camera.controls??null,this._cameraControls?.addEventListener?.(`update`,this._onCameraUpdate)}async show(e,t=()=>!0){let n=++this._showRequestId,r=e.point.clone(),i=e.normal.clone().normalize(),a=this.plugin.world.camera.three.position.clone().sub(r);i.dot(a)<0&&i.negate();let o=await this.plugin.castNormalRay(r,i,e.hit);if(n!==this._showRequestId||this._destroyed||!t())return;if(!o){this._consecutiveMisses+=1,this._consecutiveMisses>=2&&(this.#e(),this.plugin.fragmentsInstance.requestRender());return}this._consecutiveMisses=0,this.modelIds=g6(e.modelId,o.fragments?.modelId),this.group.position.copy(r),this.fromSphere.position.copy(QZn);let s=h6(o.point,r);this._localTo=s.clone(),this._length=s.length(),this.toSphere.position.copy(s),this.lineGeometry.setFromPoints([QZn,s]),this.toSphere.visible=!0,this.line.visible=!0,this.#t(),this.plugin.fragmentsInstance.requestRender()}#e(){this._length=0,this._localTo=null,this.toSphere.visible=!1,this.line.visible=!1,this.#a()}#t(){let e=`${this._length.toFixed(2)} m`;e!==this._textContent&&(this.#a(),this._text=b6({content:e,size:Math.max(.04,this._length*this.plugin.textSizeRatio),color:this.material.color}),this._textContent=e,this.group.add(this._text)),this.#n()}#n(){if(!this._text||!this._localTo)return;let e=this._localTo.clone().normalize(),t=this._localTo.clone().multiplyScalar(.5);this._isVertical=Math.abs(e.dot($Zn))>eQn;let n=new L,r=new L;this._isVertical?this.#r(e,t,n,r):this.#i(e,n,r);let i=Math.max(this._length*.05,.03),a=t.addScaledVector(n,i);x6({group:this._text,direction:e,up:n,normal:r,position:a})}#r(e,t,n,r){let i=this.plugin.world.camera.three,a=i.position.clone().sub(this.group.position).sub(t);r.copy(a).addScaledVector(e,-a.dot(e)),r.lengthSq()<1e-10&&(r.copy(new L(0,1,0).cross(e)),r.lengthSq()<1e-10&&r.copy(new L(1,0,0).cross(e))),r.normalize(),n.crossVectors(r,e).normalize();let o=e.clone().applyQuaternion(i.quaternion.clone().invert());(Math.abs(o.x)>1e-4?o.x>0:o.y>0)||(n.negate(),e.negate())}#i(e,t,n){t.copy($Zn).addScaledVector(e,-e.dot($Zn)).normalize(),n.crossVectors(e,t).normalize()}#a(){this._text&&(this.group.remove(this._text),this._text.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.dispose())}),this._text=null,this._textContent=null)}destroy(){this._destroyed=!0,this._showRequestId++,this._cameraControls?.removeEventListener?.(`update`,this._onCameraUpdate),this._cameraControls=null,this.#a(),this.lineGeometry.dispose(),this.material.dispose(),this.sphereMaterial.dispose(),this.sphereGeometry.dispose(),this.group.removeFromParent(),this.plugin.measurements=this.plugin.measurements.filter(e=>e!==this),this.plugin.fragmentsInstance.requestRender()}get length(){return this.visible?this._length:0}get visible(){return this._visible}set visible(e){this._visible=!!e,this.group.visible=this._visible}get color(){return p6(this.material.color)}set color(e=this.plugin.defaultColor){let t=m6(e);this.material.color.copy(t),this.sphereMaterial.color.copy(t),this._text&&this._text.traverse(e=>{e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.color?.copy(t))})}},nQn=class{constructor(e,t,n,r={}){this.fragmentsInstance=e,this.world=e.world,this.fragments=e.fragments;let i=e.components.get(e.OBC.Raycasters);this.caster=i.get(this.world),this.textSizeRatio=r.textSizeRatio??.1,this.defaultColor=r.defaultColor??`#ffffff`,this.measurements=[],this.measurementEndCallbacks={},this.measurementEndCallbackId=0,this.control=new rQn(this)}on(e,t){if(e===`measurementEnd`)return this.measurementEndCallbacks[this.measurementEndCallbackId++]=t,this.measurementEndCallbackId}off(e){this.measurementEndCallbacks[e]=null}async castNormalRay(e,t,n,r=.02){let i=n?.fragments?.modelId,a=n?.localId;if(i==null||a==null)return null;let o=e.clone().addScaledVector(t,.005);return(await this.fragmentsInstance.raycastFromRay(o,t)).find(t=>e.distanceTo(t.point)<r?!1:!(String(t.fragments?.modelId)===String(i)&&t.localId===a))??null}destroy(){this.control.deactivate(),this.measurements.slice().forEach(e=>e.destroy()),this.measurements.length=0}},rQn=class{constructor(e){this.plugin=e,this.currentMeasurement=null,this.lastSnap=null,this.activated=!1,this.pointerMoveRequestId=0,this.mouseDown=!1,this.dragging=!1,this.pointerDownPosition=null,this.dragThreshold=4,this.consecutiveInvalidHits=0,this.onPointerMove=this.onPointerMove.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerUp=this.onPointerUp.bind(this)}async onPointerMove(e){e.preventDefault();let t=++this.pointerMoveRequestId;if(this.mouseDown&&this.pointerDownPosition){let t=e.clientX-this.pointerDownPosition.x,n=e.clientY-this.pointerDownPosition.y;t*t+n*n>this.dragThreshold*this.dragThreshold&&(this.dragging=!0)}if(this.dragging)return;let n=kZn(e,this.plugin.world.renderer.three.domElement),r=await this.plugin.caster.castRay({position:n});if(t===this.pointerMoveRequestId){if(this.lastSnap=r?{hit:r,point:r.point.clone(),normal:DZn(r,this.plugin.world.camera.three),modelId:r.fragments?.modelId??null}:null,!this.lastSnap){this.consecutiveInvalidHits+=1,this.consecutiveInvalidHits>=2&&(this.currentMeasurement?.destroy(),this.currentMeasurement=null,this.plugin.fragmentsInstance.requestRender());return}this.consecutiveInvalidHits=0,this.currentMeasurement||=new tQn(this.plugin,this.lastSnap),await this.currentMeasurement.show(this.lastSnap,()=>t===this.pointerMoveRequestId),t===this.pointerMoveRequestId&&this.plugin.fragmentsInstance.requestRender()}}onPointerDown(e){e.button===0&&(this.mouseDown=!0,this.dragging=!1,this.pointerDownPosition={x:e.clientX,y:e.clientY})}onPointerUp(e){if(e.button!==0)return;this.mouseDown=!1;let t=this.dragging;this.dragging=!1,this.pointerDownPosition=null,!(t||!this.currentMeasurement)&&(this.currentMeasurement.length<=0||(this.plugin.measurements.push(this.currentMeasurement),Object.values(this.plugin.measurementEndCallbacks).forEach(e=>{e?.(this.currentMeasurement)}),this.currentMeasurement=null))}activate(){if(this.activated)return;let e=this.plugin.world.renderer.three.domElement;e.addEventListener(`pointermove`,this.onPointerMove),e.addEventListener(`pointerdown`,this.onPointerDown),document.addEventListener(`pointerup`,this.onPointerUp),this.activated=!0}deactivate(){if(!this.activated)return;this.pointerMoveRequestId++;let e=this.plugin.world.renderer.three.domElement;e.removeEventListener(`pointermove`,this.onPointerMove),e.removeEventListener(`pointerdown`,this.onPointerDown),document.removeEventListener(`pointerup`,this.onPointerUp),this.currentMeasurement?.destroy(),this.currentMeasurement=null,this.lastSnap=null,this.mouseDown=!1,this.dragging=!1,this.pointerDownPosition=null,this.consecutiveInvalidHits=0,this.activated=!1}},S6=new L(0,1,0),iQn=new L(0,0,1),aQn=new L(1,0,0),C6=1e-6,oQn=class{constructor(e,t){this.plugin=e,this.group=new zE,this.material=new rW({color:m6(e.defaultColor),linewidth:e.lineWidth,depthTest:!0,depthWrite:!1,transparent:!1}),this.#u(),this.geometry=new nW,this.lines=new dW(this.geometry,this.material),this.lines.renderOrder=10,this.group.add(this.lines),this._visible=!0,this._texts=[],this.modelIds=g6(t.modelId),this.perimeter=0,this.valid=!1,(this.plugin.overlayScene||this.plugin.world.scene.three).add(this.group),this.#e(t)}update(e){this.modelIds=g6(e.modelId),this.#e(e),this.plugin.fragmentsInstance.requestRender()}#e(e){this.#d(),this.valid=!1;let t=this.#t(e);if(!t){this.lines.visible=!1;return}let{vertices:n,boundaryEdges:r}=t;if(!r.length){this.lines.visible=!1;return}let i=e.normal.clone().normalize(),a=e.point.clone(),o=this.#i(n,a);this.group.position.copy(o);let{horizontalAxis:s,verticalAxis:c}=this.#a(i,r),{origin:l,boundarySegments2D:u,point2D:d}=this.#o(n,r,a,s,c),f=this.#s(d,new _E(0,1),u),p=this.#s(d,new _E(0,-1),u),m=this.#s(d,new _E(1,0),u),h=this.#s(d,new _E(-1,0),u),g=e=>l.clone().add(s.clone().multiplyScalar(e.x)).add(c.clone().multiplyScalar(e.y)),_=f?g(f.point):null,v=p?g(p.point):null,y=m?g(m.point):null,b=h?g(h.point):null,x=i.clone().multiplyScalar(this.plugin.surfaceOffset),S=[],C=[];this.perimeter=0;let w=new Set;for(let[e,t]of r){let n=e.distanceTo(t);if(n<=C6)continue;this.perimeter+=n;let r=`${n.toFixed(2)} m`;w.add(r);let i=a.clone().sub(e.clone().add(t).multiplyScalar(.5));S.push([e,t,r,i])}if(_&&v){let e=`${v.distanceTo(_).toFixed(2)} m`;C.push([v,_,e,null])}else _?C.push([a,_,`${a.distanceTo(_).toFixed(2)} m`,null]):v&&C.push([a,v,`${a.distanceTo(v).toFixed(2)} m`,null]);if(y&&b){let e=`${b.distanceTo(y).toFixed(2)} m`;C.push([b,y,e,null])}else y?C.push([a,y,`${a.distanceTo(y).toFixed(2)} m`,null]):b&&C.push([a,b,`${a.distanceTo(b).toFixed(2)} m`,null]);let T=new Set;C.forEach(([,,e])=>{w.has(e)&&T.add(e)});let E=S.map(e=>({segment:e,kind:`edge`})).concat(C.map(e=>({segment:e,kind:`center`})));if(!E.length){this.lines.visible=!1;return}let D=[];E.forEach(({segment:[e,t,n,r],kind:a})=>{let s=h6(e,o).add(x),c=h6(t,o).add(x);D.push(s.x,s.y,s.z,c.x,c.y,c.z),a===`edge`&&T.has(n)||this.#c(s,c,i,n,r)}),this.#u(),this.geometry.setPositions(D),this.lines.visible=!0,this.valid=!0}#t(e){let t=this.#n(e);if(t)return t;let n=this.#r(e),r=[],i=[];if(n)r=n.vertices,i=n.indices;else return null;if(i.length||(i=Array.from({length:r.length},(e,t)=>t)),i.length<3)return null;let a=AZn(r,i);if(!a.indices.length)return null;let o=jZn(a.vertices,a.indices);return{vertices:a.vertices,boundaryEdges:o}}#n(e){let t=SYn(e);if(!t)return null;let{vertices:n,indices:r}=t,i=AZn(n,r);if(!i.indices.length)return null;let a=jZn(i.vertices,i.indices);return{vertices:i.vertices,boundaryEdges:a}}#r(e){let t=CYn(e);if(!t)return null;let{vertices:n,indices:r}=t,i=AZn(n,r);if(!i.indices.length)return null;let a=jZn(i.vertices,i.indices);return{vertices:i.vertices,boundaryEdges:a,indices:i.indices}}#i(e,t){if(!e?.length)return t.clone();let n=new XE;return e.forEach(e=>n.expandByPoint(e)),n.isEmpty()?t.clone():n.getCenter(new L)}#a(e,t=[]){let n=MZn(e,t,{eps:C6});if(!n&&(n=S6.clone().sub(e.clone().multiplyScalar(S6.dot(e))),n.lengthSq()<=C6)){let t=iQn.clone().sub(e.clone().multiplyScalar(iQn.dot(e))),r=aQn.clone().sub(e.clone().multiplyScalar(aQn.dot(e)));n=t.lengthSq()>=r.lengthSq()?t:r}n.normalize();let r=new L().crossVectors(n,e).normalize();r.lengthSq()<=C6&&(r=aQn.clone().sub(e.clone().multiplyScalar(aQn.dot(e))).normalize());let i=this.plugin.world.camera.three.up.clone().normalize(),a=i.clone().sub(e.clone().multiplyScalar(i.dot(e)));return a.lengthSq()>C6&&n.dot(a.normalize())<0&&(n.negate(),r.negate()),{horizontalAxis:r,verticalAxis:n}}#o(e,t,n,r,i){let a=e[0].clone(),o=e=>{let t=e.clone().sub(a);return new _E(t.dot(r),t.dot(i))};return{origin:a,boundarySegments2D:t.map(([e,t])=>[o(e),o(t)]),point2D:o(n)}}#s(e,t,n){let r=(e,t)=>e.x*t.y-e.y*t.x,i=null;for(let[a,o]of n){let n=o.clone().sub(a),s=r(t,n);if(Math.abs(s)<=C6)continue;let c=a.clone().sub(e),l=r(c,n)/s,u=r(c,t)/s;if(l<C6||u<-1e-6||u>1.000001)continue;let d=e.clone().add(t.clone().multiplyScalar(l));(!i||l<i.distance)&&(i={distance:l,point:d})}return i}#c(e,t,n,r,i=null){let a=t.clone().sub(e),o=a.length();if(o<=C6)return;let{direction:s,up:c,offsetUp:l}=this.#l(a,n,i),u=b6({content:r,size:Math.max(.035,o*this.plugin.textSizeRatio),color:this.material.color,strokeColor:`rgba(0, 0, 0, 0.95)`,strokeWidth:12}),d=e.clone().add(t).multiplyScalar(.5),f=Math.max(.02,o*.03);x6({group:u,direction:s,up:c,normal:n,position:d.clone().add(l.clone().multiplyScalar(f))}),this._texts.push(u),this.group.add(u)}#l(e,t,n=null){let r=t.clone().normalize(),i=e.clone().sub(r.clone().multiplyScalar(e.dot(r)));i.lengthSq()<=C6&&(i=S6.clone().sub(r.clone().multiplyScalar(S6.dot(r))),i.lengthSq()<=C6&&(i=iQn.clone().sub(r.clone().multiplyScalar(iQn.dot(r))))),i.normalize();let a=new L().crossVectors(r,i);a.lengthSq()<=C6&&(a=S6.clone().sub(r.clone().multiplyScalar(S6.dot(r)))),a.normalize(),i=new L().crossVectors(a,r).normalize(),a=new L().crossVectors(r,i).normalize();let o=a.clone();if(n?.isVector3){let e=n.clone().sub(r.clone().multiplyScalar(n.dot(r))).sub(i.clone().multiplyScalar(n.dot(i)));e.lengthSq()>C6&&(e.normalize(),o.dot(e)<0&&o.negate())}let s=this.plugin.world.camera.three.up.clone().normalize(),c=s.clone().sub(r.clone().multiplyScalar(s.dot(r))).sub(i.clone().multiplyScalar(s.dot(i)));return c.lengthSq()>C6&&a.dot(c.normalize())<0&&(a.negate(),i.negate()),{direction:i,up:a,offsetUp:o}}#u(){let e=this.plugin.world.renderer.three.domElement;this.material.resolution.set(e.clientWidth,e.clientHeight)}#d(){this._texts.forEach(e=>{this.group.remove(e),e.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.dispose())})}),this._texts=[]}destroy(){this.#d(),this.geometry.dispose(),this.material.dispose(),this.group.removeFromParent(),this.plugin.measurements=this.plugin.measurements.filter(e=>e!==this),this.plugin.fragmentsInstance.requestRender()}get visible(){return this._visible}set visible(e){this._visible=!!e,this.group.visible=this._visible,this.plugin.fragmentsInstance.requestRender()}get color(){return p6(this.material.color)}set color(e=this.plugin.defaultColor){let t=m6(e);this.material.color.copy(t),this._texts.forEach(e=>{e.traverse(e=>{e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.color?.copy(t))})}),this.plugin.fragmentsInstance.requestRender()}},sQn=class{constructor(e,t,n,r={}){this.fragmentsInstance=e,this.world=e.world,this.overlayScene=e.overlayScene,this.components=e.components,this.OBC=e.OBC,this.cursorOverlay=n;let i=this.components.get(this.OBC.Raycasters);this.caster=i.get(this.world),this.defaultColor=r.defaultColor??`#ffffff`,this.lineWidth=r.lineWidth??2,this.textSizeRatio=r.textSizeRatio??.08,this.surfaceOffset=r.surfaceOffset??.003,this.measurements=[],this.measurementEndCallbacks={},this.measurementEndCallbackId=0,this.previousHighlightOnHover=null,this.hoverSuspended=!1,this.control=new cQn(this)}on(e,t){if(e===`measurementEnd`)return this.measurementEndCallbacks[this.measurementEndCallbackId++]=t,this.measurementEndCallbackId}off(e){this.measurementEndCallbacks[e]=null}destroy(){this.control.deactivate(),this.measurements.slice().forEach(e=>e.destroy()),this.measurements.length=0}},cQn=class{constructor(e){this.plugin=e,this.lastHit=null,this.currentMeasurement=null,this.mouseDown=!1,this.dragging=!1,this.pointerDownPosition=null,this.dragThreshold=4,this.activated=!1,this.pointerMoveRequestId=0,this.consecutiveInvalidHits=0,this.onPointerMove=this.onPointerMove.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerUp=this.onPointerUp.bind(this)}clearPreview(){this.lastHit=null,this.plugin.cursorOverlay.update(null),this.currentMeasurement?.destroy(),this.currentMeasurement=null}async onPointerMove(e){e.preventDefault();let t=++this.pointerMoveRequestId;if(this.mouseDown&&this.pointerDownPosition){let t=e.clientX-this.pointerDownPosition.x,n=e.clientY-this.pointerDownPosition.y;t*t+n*n>this.dragThreshold*this.dragThreshold&&(this.dragging=!0)}let n=kZn(e,this.plugin.world.renderer.three.domElement),r=await this.plugin.caster.castRay({position:n,snappingClasses:[wZn.FACE]});if(!this.activated||t!==this.pointerMoveRequestId)return;if(!this.#e(r)){this.consecutiveInvalidHits+=1,this.consecutiveInvalidHits>=2&&this.clearPreview();return}this.consecutiveInvalidHits=0,this.lastHit={hit:r,facePoints:r.facePoints??null,faceIndices:r.faceIndices??r.faceIndexes??r.indices??null,point:r.point.clone(),normal:DZn(r,this.plugin.world.camera.three),modelId:r.fragments?.modelId??null};let i=OZn(r.point,this.plugin.world.camera.three,this.plugin.world.renderer.three.domElement);if(this.plugin.cursorOverlay.update({snapName:`FACE`,screen:i}),this.currentMeasurement?this.currentMeasurement.update(this.lastHit):this.currentMeasurement=new oQn(this.plugin,this.lastHit),!this.currentMeasurement.valid){this.currentMeasurement.destroy(),this.currentMeasurement=null;return}this.plugin.fragmentsInstance.requestRender()}onPointerDown(e){e.button===0&&(this.mouseDown=!0,this.dragging=!1,this.pointerDownPosition={x:e.clientX,y:e.clientY})}onPointerUp(e){if(e.button!==0)return;this.mouseDown=!1;let t=this.dragging;if(this.dragging=!1,this.pointerDownPosition=null,t||!this.currentMeasurement||!this.currentMeasurement.valid)return;let n=this.currentMeasurement;if(this.currentMeasurement=null,!n.valid){n.destroy();return}this.plugin.measurements.push(n),Object.values(this.plugin.measurementEndCallbacks).forEach(e=>{e?.(n)}),this.plugin.fragmentsInstance.requestRender()}activate(){if(this.activated)return;let e=this.plugin.world.renderer.three.domElement;!this.plugin.hoverSuspended&&typeof this.plugin.fragmentsInstance.suspendHoverHighlight==`function`&&(this.plugin.fragmentsInstance.suspendHoverHighlight(`face-measurement`),this.plugin.hoverSuspended=!0),typeof this.plugin.fragmentsInstance.highlightOnHover==`boolean`&&(this.plugin.previousHighlightOnHover=this.plugin.fragmentsInstance.highlightOnHover,this.plugin.fragmentsInstance.highlightOnHover=!1),this.plugin.cursorOverlay.useCrosshairCursor(),this.plugin.cursorOverlay.show(),e.addEventListener(`pointermove`,this.onPointerMove),e.addEventListener(`pointerdown`,this.onPointerDown),document.addEventListener(`pointerup`,this.onPointerUp),this.activated=!0}deactivate(){if(!this.activated)return;let e=this.plugin.world.renderer.three.domElement;e.removeEventListener(`pointermove`,this.onPointerMove),e.removeEventListener(`pointerdown`,this.onPointerDown),document.removeEventListener(`pointerup`,this.onPointerUp),this.pointerMoveRequestId+=1,this.consecutiveInvalidHits=0,this.clearPreview(),this.mouseDown=!1,this.dragging=!1,this.pointerDownPosition=null,this.plugin.cursorOverlay.hide(),this.plugin.cursorOverlay.useOverlayCursor(),this.plugin.hoverSuspended&&typeof this.plugin.fragmentsInstance.resumeHoverHighlight==`function`&&(this.plugin.fragmentsInstance.resumeHoverHighlight(`face-measurement`),this.plugin.hoverSuspended=!1),this.plugin.previousHighlightOnHover!==null&&(this.plugin.fragmentsInstance.highlightOnHover=this.plugin.previousHighlightOnHover,this.plugin.previousHighlightOnHover=null),this.activated=!1}#e(e){if(!e)return!1;if(e.facePoints?.length>=9)return!0;let t=e.object?.geometry?.attributes?.position,n=e.faceIndices??e.faceIndexes??e.indices??null;return!!(t&&n?.length>=3&&e.point)}},lQn=new L(0,1,0),uQn=new L(0,0,1),dQn=new L(1,0,0),w6=1e-6,fQn=({colorA:e,colorB:t,opacity:n,stripeWidth:r})=>new vO({uniforms:{uOrigin:{value:new L},uAxisX:{value:new L(1,0,0)},uAxisY:{value:new L(0,1,0)},uStripeWidth:{value:r},uColorA:{value:e.clone()},uColorB:{value:t.clone()},uOpacity:{value:n}},vertexShader:`
|
|
90648
|
+
`,depthTest:!1,depthWrite:!1,transparent:!1}),this.fsQuad=new j0(this.combineMaterial),this._drawingBufferSize=new _E(1,1)}setSize(e,t){this.isolatedDepthTarget.setSize(e,t),this.isolatedColorTarget.setSize(e,t)}syncRenderTargetSize(e,t){let n=t?.width??t?.texture?.image?.width,r=t?.height??t?.texture?.image?.height,i=Number.isFinite(n)?n:0,a=Number.isFinite(r)?r:0;(i<=0||a<=0)&&(e.getDrawingBufferSize(this._drawingBufferSize),i=this._drawingBufferSize.x,a=this._drawingBufferSize.y),i=Math.max(1,Math.floor(i)),a=Math.max(1,Math.floor(a)),(this.isolatedDepthTarget.width!==i||this.isolatedDepthTarget.height!==a)&&this.setSize(i,a)}render(e,t,n){let r=this.world.camera?.three,i=this.world.scene?.three;if(!r||!i)return;this.syncRenderTargetSize(e,n);let a=e.autoClear,o=i.overrideMaterial,s=this.isolatedScene.overrideMaterial,c=this.isolatedScene.background,l=this.isolatedScene.environment,u=this.isolatedScene.fog,d=e.getClearColor(new VE),f=e.getClearAlpha(),p=[];try{e.autoClear=!0,this.isolatedScene.overrideMaterial=this.depthMaterial,this.isolatedScene.background=null,this.isolatedScene.environment=i.environment??null,this.isolatedScene.fog=i.fog??null,e.setRenderTarget(this.isolatedDepthTarget),e.setClearColor(16777215,1),e.clear(!0,!0,!0),e.render(this.isolatedScene,r),this.isolatedScene.overrideMaterial=s,i.traverse(e=>{if(!e?.isLight)return;let t=e.clone();t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.matrixWorld.copy(e.matrixWorld),this.isolatedScene.add(t),p.push(t)}),e.setRenderTarget(this.isolatedColorTarget),e.setClearColor(0,0),e.clear(!0,!0,!0),e.render(this.isolatedScene,r),this.combineMaterial.uniforms.tDiffuse.value=n.texture,this.combineMaterial.uniforms.tIsoDepth.value=this.isolatedDepthTarget.texture,this.combineMaterial.uniforms.tIsoColor.value=this.isolatedColorTarget.texture,e.autoClear=!1,e.setRenderTarget(this.renderToScreen?null:t),this.fsQuad.render(e)}finally{for(let e of p)e.removeFromParent();this.isolatedScene.overrideMaterial=s,this.isolatedScene.background=c,this.isolatedScene.environment=l,this.isolatedScene.fog=u,i.overrideMaterial=o,e.setClearColor(d,f),e.autoClear=a}}dispose(){this.fsQuad.dispose(),this.combineMaterial.dispose(),this.depthMaterial.dispose(),this.isolatedDepthTarget.dispose(),this.isolatedColorTarget.dispose()}};function tXn(e){let{fragments:t,components:n,world:r,OBF:i,$viewer:a}=e,o=n.get(i.Outliner),s=!1,c={},l=Promise.resolve(),u=null,d=null,f=null,p=null,m=null,h=null,g=new Map,_=new UE,v=new Set,y=new Map,b=!1,x=(e=[])=>{v.clear();for(let t of e)v.add(t)},S=()=>{s||=(r.renderer?.postproduction&&(r.renderer.postproduction.enabled=!0),o.world=r,o.enabled=!0,o.create(c6,{fillOpacity:0,priority:$Yn}),o.configure(c6,{fillOpacity:0,priority:$Yn}),!0)},C=e=>{let t=c[e];return!!(t&&t.size>0)},w=e=>{C(e)&&ue()},T=(e,t)=>{if(!e||!t?.onViewUpdated||y.has(e))return;let n=()=>{w(e)};t.onViewUpdated.add(n),y.set(e,{model:t,callback:n})},E=e=>{let t=y.get(e);t&&(t.model?.onViewUpdated?.remove?.(t.callback),y.delete(e))},D=()=>{for(let[e,n]of t.list)T(e,n);p||(p=({key:e,value:t})=>{T(e,t)},t.list.onItemSet.add(p)),m||(m=e=>{E(e)},t.list.onItemDeleted.add(m))},ee=(e,t)=>{let n=null;try{n=t.outlinePass}catch{n=null}return n&&e.passes.includes(n)?n:e.passes.find(e=>e.constructor?.name===`OutputPass`)??null},te=()=>{if(!u)return;let e=r.renderer?.postproduction,t=e?.composer;if(!t)return;let n=ee(t,e),i=t.passes.indexOf(u);if(i!==-1){if((t.passes[i+1]??null)===n)return;t.removePass(u)}let a=n?t.passes.indexOf(n):-1;a===-1?t.addPass(u):t.insertPass(u,a)},ne=()=>{let e=r.renderer;!e||!e.postproduction||(e.postproduction.enabled=!0,u||(u=new eXn(r,_),u.enabled=!1,d=({x:e,y:t})=>{u?.setSize(Math.max(1,e),Math.max(1,t))},e.onResize.add(d),f=()=>{u?.enabled&&te()},e.onBeforeUpdate.add(f)),te())},re=e=>{let t={};for(let[n,r]of Object.entries(e??{})){let e=r instanceof Set?r:new Set(r);e.size>0&&(t[n]=e)}return t},ie=()=>{for(let e of Object.values(c))if(e.size>0)return!0;return!1},ae=e=>{if(!e||!e.fragments)return!1;let t=e.fragments.modelId,n=c[t];return!!(n&&n.has(e.localId))},oe=(e,t)=>{for(let t of e.values())for(let e of t)e.removeFromParent();e.clear(),t&&t.clear()},se=()=>{oe(g,_)},ce=(e,t,n,r)=>{let i=e.geometry;if(!i)return null;let a=Array.isArray(e.material)?e.material.filter(Boolean):[e.material].filter(Boolean);if(a.length===0)return null;let o=e=>a.length===1?0:Math.max(0,Math.min(Number.isInteger(e)?e:0,a.length-1)),s=new yD;s.attributes=i.attributes,i.index&&s.setIndex(i.index),s.boundingBox=i.boundingBox,s.boundingSphere=i.boundingSphere;let c=i.index?.array?.length??i.index?.count??0,l=c>0?c:i.getAttribute(`position`)?.count??0,u=i.groups?.length>0?i.groups:[{start:0,count:l,materialIndex:0}],d=Math.min(t.position?.length??0,t.size?.length??0);for(let e=0;e<d;e+=1){let n=Math.max(0,t.position[e]??0),r=t.size[e]??0,i=r===4294967295?Math.max(0,l-n):Math.max(0,r);if(i===0)continue;let a=n+i,c=!1;for(let e of u){let t=Math.max(0,e.start??0),r=e.count===1/0?Math.max(0,l-t):Math.max(0,e.count??0);if(r===0)continue;let i=t+r,u=Math.max(n,t),d=Math.min(a,i)-u;if(d<=0)continue;let f=o(e.materialIndex??0);s.addGroup(u,d,f),c=!0}c||s.addGroup(n,i,0)}let f=new OD(s,a);return f.matrixAutoUpdate=!1,f.matrixWorldAutoUpdate=!1,f.frustumCulled=!1,f.matrixWorld.copy(e.matrixWorld),f.userData.isolatedPick={modelId:n,localId:r},f},le=async e=>{let n=g,r=new Map,i=Object.entries(e);for(let[e,a]of i){let i=t.list.get(e);if(i)for(let t of a){let a;try{a=await i.getItemDrawChunks([t])}catch{continue}if(!a?.length)continue;let o=`${e}:${t}`,s=new Set;for(let n of a){let r=i.tiles.get(n.tileId);if(!r)continue;let a=ce(r,n,e,t);a&&(a.renderOrder=40,_.add(a),s.add(a))}if(s.size===0)continue;r.set(o,s);let c=n.get(o);if(c){for(let e of c)e.removeFromParent();n.delete(o)}}}for(let e of n.values())for(let t of e)t.removeFromParent();g=r},ue=()=>{if(b)return;b=!0;let t=async()=>{b=!1,ie()&&(await le(c),e.requestRender())};l=l.then(t,t)},de=async n=>{let r=c;c=n;let i=Object.keys(n).length>0;u&&(u.enabled=i),Object.keys(r).length>0&&s&&await o.removeItems(r,c6),i?(ne(),u.enabled=!0,await le(n)):se(),i?(S(),await o.addItems(n,c6)):s&&o.clean(c6),await t.core.update(!0),e.requestRender()},fe=async(e=[],n=!0)=>{let r=[...new Set(e)];if(n&&a.state.selectedObjects.length>0){let e=new Set(r),t=a.state.selectedObjectsUuids.filter(t=>e.has(t));t.length>0&&a.state.deselectObjectsByUuids(t)}let i=await t.guidsToModelIdMap(r),o=re(i);return l=l.then(async()=>{await de(o),x(r)},async()=>{await de(o),x(r)}),l},pe=async()=>{let e={};return l=l.then(async()=>{await de(e),x()},async()=>{await de(e),x()}),l},me={isolate:fe,clear:pe,isolatedUuids:v,isPickResultExcludedFromPrimaryPick(e){return ie()&&!ae(e)}};return D(),h=XYn({$viewer:a,onIsolationChanged:async({isolatedUuids:e,isolatedAwayUuids:t})=>{if(t.length===0||e.length===0){await pe();return}await fe(e,!1)}}),{destroy(){h&&=(h(),null);for(let e of[...y.keys()])E(e);p&&=(t.list.onItemSet.remove(p),null),m&&=(t.list.onItemDeleted.remove(m),null);let e=r.renderer;e&&d&&e.onResize.remove(d),d=null,e&&f&&e.onBeforeUpdate.remove(f),f=null,u&&=(e?.postproduction?.composer?.removePass(u),u.dispose(),null),se()},extension:me}}var l6=`select`,nXn=20;function rXn(e){let{fragments:t,$viewer:n,OBC:r,OBF:i,components:a,world:o}=e,s=a.get(i.Outliner),c=!1,l=new VE(6878522),u=new VE(6878522),d=.15,f=1,p=()=>{c||=(o.renderer.postproduction.enabled=!0,s.world=o,s.enabled=!0,s.create(l6,{color:l,fillColor:u,fillOpacity:d,thickness:f,priority:nXn}),!0)},m=()=>{c&&s.configure(l6,{color:l,fillColor:u,fillOpacity:d,thickness:f,priority:nXn})},h={},g=async(n,i=`add`)=>{if(i!==`add`&&i!==`remove`)throw TypeError(`[BIMDataViewer - 3D Fragments - select] Invalid action, expected 'add' or 'remove', got `+i);let a=await t.guidsToModelIdMap(n);i===`add`?(r.ModelIdMapUtils.add(h,a),p(),await s.addItems(a,l6)):(r.ModelIdMapUtils.remove(h,a),await s.removeItems(a,l6)),await t.core.update(!0),e.requestRender()},_=e=>e.map(e=>e.uuid).filter(Boolean),v=Promise.resolve(),y=e=>(v=v.then(e,e),v),b=({key:e,value:t})=>{let r=o.renderer?.postproduction?.outlinePass;if(r&&t?.tiles)for(let[,e]of t.tiles)r.detachOutlinedTile(e);s._tileListeners?.get(e)?.(),s._tileListeners?.delete(e);let i=h[e];if(!i)return;let a={[e]:new Set(i)};delete h[e],y(()=>s.removeItems(a,l6));let c=n.state.selectedObjects.filter(t=>String(t.model?.id)===e);c.length>0&&n.state.deselectObjects(c.map(e=>e.id))};t.list.onBeforeDelete.add(b);let x=e=>{let t=e.modelId,r=n.state.selectedObjects.filter(e=>String(e.model?.id)===t&&e.visible);r.length!==0&&y(()=>g(_(r),`add`))};t.core.onModelLoaded.add(x);let S=[n.state.hub.on(`objects-selected`,({objects:e})=>{let t=e.filter(e=>e.visible);y(()=>g(_(t),`add`))}),n.state.hub.on(`objects-deselected`,({objects:e})=>{y(()=>g(_(e),`remove`))}),n.state.hub.on(`objects-hidden`,({objects:e})=>{let t=e.filter(e=>e.selected);y(()=>g(_(t),`remove`))}),n.state.hub.on(`objects-shown`,({objects:e})=>{let t=e.filter(e=>e.selected);y(()=>g(_(t),`add`))})],C=!0,w=e.onPick(async({pickResult:e,event:r})=>{if(!C)return;let i=!r.shiftKey;if(!e){i&&n.state.deselectObjects(n.state.selectedObjects.map(e=>e.id));return}let{fragments:a,localId:o}=e,s={[a.modelId]:new Set([o])},c=(await t.modelIdMapToGuids(s))[0];if(!c)return;let l=n.state.getObjectsByUuids([c])[0];l&&(l.selected?n.state.deselectObjects([l.id]):n.state.selectObjects([l.id],{exclusive:i}))});return{destroy(){w(),t.list.onBeforeDelete.remove(b),t.core.onModelLoaded.remove(x),s.clean(l6),s.remove(l6),S.forEach(e=>n.state.hub.off(e))},extension:{get selectOnClick(){return C},set selectOnClick(e){C=e},get color(){return l},set color(e){l=e,m()},get fillColor(){return u},set fillColor(e){u=e,m()},get fillOpacity(){return d},set fillOpacity(e){d=e,m()},get thickness(){return f},set thickness(e){f=e,m()}}}}function iXn(e){let{fragments:t,$viewer:n,OBC:r,components:i}=e,a=i.get(r.Hider),o=async n=>{let r;r=Array.isArray(n)?await t.guidsToModelIdMap(n):n,await a.set(!0,r),await t.core.update(!0),e.requestRender()},s=async n=>{let r;r=Array.isArray(n)?await t.guidsToModelIdMap(n):n,await a.set(!1,r),await t.core.update(!0),e.requestRender()},c=e=>e.map(e=>e.uuid).filter(Boolean),l=e=>{let t=e.modelId,r=n.state.unvisibleObjects.filter(e=>String(e.model?.id)===t);r.length!==0&&s(c(r))};t.core.onModelLoaded.add(l);let u=[n.state.hub.on(`objects-shown`,({objects:e})=>o(c(e))),n.state.hub.on(`objects-hidden`,({objects:e})=>s(c(e)))];return{destroy(){t.core.onModelLoaded.remove(l),u.forEach(e=>n.state.hub.off(e))},extension:{show:o,hide:s}}}function aXn(e){let{fragments:t,$viewer:n}=e,r=Promise.resolve(),i=e=>(r=r.then(e,e),r),a=e=>e.map(e=>e.uuid).filter(Boolean),o=e=>Object.keys(e||{}).length>0,s=async e=>Array.isArray(e)?t.guidsToModelIdMap(e):e||{},c=e=>(e instanceof Set?[...e]:[...new Set(e||[])]).filter(e=>Number.isFinite(e)),l=e=>e instanceof VE?e:new VE(e),u=async(n,r)=>{if(r==null)return d(n);let i=await s(n);if(!o(i))return;let a=[],u=l(r);for(let[e,n]of Object.entries(i)){let r=t.list.get(e);if(!r)continue;let i=c(n);i.length!==0&&a.push(r.setColor(i,u))}await Promise.all(a),await t.core.update(!0),e.requestRender()},d=async n=>{let r=await s(n);if(!o(r))return;let i=[];for(let[e,n]of Object.entries(r)){let r=t.list.get(e);if(!r)continue;let a=c(n);a.length!==0&&i.push(r.resetColor(a))}await Promise.all(i),await t.core.update(!0),e.requestRender()},f=[n.state.hub.on(`objects-colorized`,({objects:e,color:t})=>{let n=a(e);n.length&&i(()=>t==null?d(n):u(n,t))})];return{destroy(){f.forEach(e=>n.state.hub.off(e))},extension:{colorize:(e,t)=>i(()=>u(e,t)),resetColorize:e=>i(()=>d(e))}}}var oXn=e=>{if(e.length===0)return null;if(e.length===1)return e[0].clone();if(e.length===2)return e[0].clone().add(e[1]).multiplyScalar(.5);let t=e[0],n=new L,r=0;for(let i=1;i+1<e.length;i+=1){let a=e[i],o=e[i+1],s=.5*a.clone().sub(t).cross(o.clone().sub(t)).length();if(!Number.isFinite(s)||s<=1e-6)continue;let c=t.clone().add(a).add(o).multiplyScalar(1/3);n.addScaledVector(c,s),r+=s}if(r<=1e-6){let t=new L;return e.forEach(e=>t.add(e)),t.multiplyScalar(1/e.length)}return n.multiplyScalar(1/r)},sXn=(e,t=[])=>{let n=e?.facePoints;if(!n||n.length<3)return null;let r=[];for(let e=0;e+2<n.length;e+=3){let t=n[e],i=n[e+1],a=n[e+2];!Number.isFinite(t)||!Number.isFinite(i)||!Number.isFinite(a)||r.push(new L(t,i,a))}if(r.length===0)return null;let i=gWt(r,t);return i.length===0?null:oXn(i)};function cXn(e){let t=lXn(e),n=uXn(e);return{destroy(){t(),n()}}}function lXn(e){let{$viewer:t}=e,n=e,r=()=>{let e=t.state.selectedObjects.map(e=>e.uuid);if(e.length!==0)return n.isolate(e)},i=()=>{if(n.isolatedUuids.size!==0)return n.clear()},a=t.shortcutManager.getDefaultShortcuts(()=>t.localContext.loadedModels.flatMap(e=>e.objects)),o=a.map(e=>e.name);return[...a,{name:`isolate`,key:`I`,execute:r},{name:`reintegrate`,key:`U`,execute:i},{name:`fitview`,key:`F`,execute:()=>e.fitView(t.state.selectedObjects.map(e=>e.uuid))}].forEach(e=>t.localContext.registerShortcut(e)),()=>{[...o,`isolate`,`reintegrate`,`fitview`].forEach(e=>t.localContext.unregisterShortcut(e))}}function uXn(e){let t=new AbortController;return e.$viewer.localContext.el.addEventListener(`contextmenu`,async t=>{let n=e.$viewer.contextMenu;if(n){t.stopPropagation(),t.preventDefault();try{await dXn(e,t)}catch(e){console.error(`[BIMDataViewer - 3D Fragments] Context menu setup error:`,e)}n.open(t)}},{signal:t.signal}),()=>t.abort()}async function dXn(e,t){let{$viewer:n}=e,r=e,i=n.contextMenu,a=n.state.selectedObjects.map(e=>e.uuid);[...i.getDefaultCommands({objects:n.localContext.loadedModels.flatMap(e=>e.objects),context:n.localContext}),{get label(){return n.i18n.$t(`global.fit_view`)},picto:`F`,execute:()=>e.fitView(n.state.selectedObjects.map(e=>e.uuid))}].map(e=>i.registerContextCommand(e)),a.length>0&&i.registerContextCommand({name:`isolate`,get group(){return i.groupPositions.visibility},position:4,get label(){return n.i18n.$t(`context_menu.isolate`)},picto:`I`,execute:()=>r.isolate(a)}),r.isolatedUuids.size>0&&i.registerContextCommand({name:`reintegrate`,get group(){return i.groupPositions.visibility},position:5,get label(){return n.i18n.$t(`context_menu.reintegrate`)},picto:`U`,execute:()=>r.clear()}),a.length>0&&i.registerContextCommand({name:`colorize`,get group(){return i.groupPositions.visibility},position:6,get label(){return n.i18n.$t(`viewer3d.context_menu.colorize`)},component:oPt}),n.state.colorizedObjects.length>0&&i.registerContextCommand({name:`reset_color`,get group(){return i.groupPositions.visibility},position:7,get label(){return n.i18n.$t(`viewer3d.context_menu.reset_color`)},execute:()=>{let e=n.state.colorizedObjectsIds;e.length!==0&&n.state.colorizeObjects(e,null)}});let o=await fXn(e,t);if(o?.point&&(o?.face||o?.normal)){let t=pXn(o),r=sXn(o,bWt(e.world?.renderer?.three))??o.point.clone();i.registerContextCommand({get label(){return n.i18n.$t(`context_menu.align_to_face`)},execute:()=>yXn(e,r,t)})}}async function fXn(e,t){try{return(await e.raycastAll(t,{includeUnpickable:!0}))[0]??null}catch{return null}}function pXn(e){let t=new L;if(e.face?.normal&&e.object){t.copy(e.face.normal);let n=new yE().getNormalMatrix(e.object.matrixWorld);return t.applyMatrix3(n).normalize(),t}return e.normal?.isVector3?e.normal.clone().normalize():new L(0,1,0)}var mXn=new L(0,1,0),hXn=new L(0,0,1),gXn=.015,_Xn=.99;async function vXn(e){let t=e.world?.camera?.controls,n=OWt(e);if(n)return n;try{let t=await e.world?.camera?.getItemsBounding?.();if(t?.center)return t.center.clone()}catch{}return t?.getTarget(new L)??new L}async function yXn(e,t,n){let r=e.world?.camera?.controls,i=e.world?.camera?.three;if(!r||!i)return;let a=await vXn(e);await r.setFocalOffset(0,0,0,!1);let o=Math.abs(n.dot(mXn))>_Xn?n.clone().addScaledVector(hXn,gXn).normalize():n.clone(),s=Math.max(i.position.distanceTo(a),.1),c=a.clone(),l=a.clone().addScaledVector(o,s),u=t.clone().sub(a),d=u.sub(o.clone().multiplyScalar(u.dot(o))),f=l.clone().add(d),p=c.clone().add(d);i.up.copy(mXn),await r.setLookAt(f.x,f.y,f.z,p.x,p.y,p.z,!1),await r.setFocalOffset(0,0,0,!1),e.requestRender?.()}function bXn(e){let{world:t,fragments:n}=e,r=async(e=[])=>{if(e?.length===0)return Array.from(n.list.values()).map(e=>e?.box).filter(e=>e instanceof XE&&!e.isEmpty());let t=await n.guidsToModelIdMap(e);return n.getBBoxes(t)},i=async n=>{if(!n.length)return;let r=DWt(e,n);if(!ek(r))return;let i=new pD;r.getBoundingSphere(i),await t.camera.controls.fitToSphere(i,!0)};return{extension:{fitView:async(e=[])=>{let t=await r(e);await i(t)}}}}function xXn(e,t={}){let n=Array.isArray(t.materialByCategory)?t.materialByCategory.filter(e=>e?.material&&e.category instanceof RegExp):[],r=[],i=[];return{async apply(){r=[],i=[];for(let{category:t,material:a}of n){let n=await e.getItemsOfCategories([t]),o=Object.values(n).flat();o.length&&(a.color&&(await e.setColor(o,new VE(a.color)),r.push(...o)),typeof a.opacity==`number`&&(await e.setOpacity(o,a.opacity),i.push(...o)))}r=[...new Set(r)],i=[...new Set(i)]},async clear(){r.length&&await e.resetColor(r),i.length&&await e.resetOpacity(i),r=[],i=[]},dispose(){e.tiles.onItemSet.remove(onTileSet)}}}function SXn(e){let{fragments:t,world:n,$viewer:r}=e,i=!0;return{extension:{load:async a=>{if(!a.fragments_file)throw Error(`Model "${a.name}" does not have a fragments file.`);await e.waitUntilIsReady();let o=await(await fetch(a.fragments_file)).arrayBuffer(),s=await t.core.load(o,{modelId:String(a.id),camera:n.camera.three,onProgress:({progress:e,stage:t,modelId:n})=>{console.log(`Model ${n} loading stage: ${t}, progress: ${(e*100).toFixed(2)}%`)}});return await xXn(s,{materialByCategory:[{category:/^IFCSPACE$/i,material:{color:`#0000FF`,opacity:.15}}]}).apply(),s.getClippingPlanesEvent=()=>n.renderer.three.clippingPlanes,r.localContext.hub.emit(`3d-model-loaded`,{model:a}),i&&=(e.fitView(),!1),s},unload:async n=>{await e.waitUntilIsReady();try{if(!t.list.has(String(n.id)))return console.warn(`Model with id "${n.id}" not found in fragments list.`),!1}catch{return!1}return await t.core.disposeModel(String(n.id)),e.fragments.list.size===0&&(i=!0),r.localContext.hub.emit(`3d-model-unloaded`,{model:n}),!0}}}}function CXn(e){let{world:t}=e,n=co(`perspective`),r=()=>{n.value=t.camera.projection.current===`Perspective`?`perspective`:`ortho`,t.renderer?.postproduction&&t.renderer.postproduction.updateCamera(),e.requestRender()};return t.camera.projection.onChanged.add(r),{extension:{get projection(){return n.value},set projection(r){if(r!==`perspective`&&r!==`ortho`){console.warn(`Invalid projection value: ${r}`);return}e.isReady&&(n.value=r,r===`perspective`?(t.camera.projection.set(`Perspective`),t.camera.three.updateProjectionMatrix()):t.camera.projection.set(`Orthographic`))}},destroy(){t.camera.projection.onChanged.remove(r)}}}var wXn=class{constructor({id:e,clipper:t,point:n,normal:r,scaleMode:i=`camera`,fixedScale:a=new _E(1,1),controlSize:o=1,activeEnabled:s=!0,visualState:c=null,controlAxisDirection:l=null,wireframeMode:u=`triangles`}){this.id=e,this.type=`default`,this._clipper=t,this._shown=!0,this._controlShown=!1,this._widgetsVisible=!0,this._active=!1,this._hovered=!1,this._scaleMode=i,this._fixedScale=a.clone(),this._activeEnabled=s,this._visualState=c,this._controlAxisDirection=l,this._wireframeMode=u;let d=t._planeMaterial.clone();this._mesh=new OD(new fO(1),d),this._mesh.renderOrder=2,this._mesh.userData.isSectionPlaneController=!0,this._mesh.userData.isSectionPlaneSurface=!0,this._anchor=new RE,this._anchor.position.copy(n),this._anchor.lookAt(n.clone().add(r)),this._mesh.position.z=.01,this._anchor.add(this._mesh);let f=this._createWireframeGeometry(this._wireframeMode),p=new WD({color:t._planeMaterial.color.getHex(),opacity:.8,transparent:!0,depthTest:!0,depthWrite:!1});this._wireframe=new qD(f,p),this._wireframe.renderOrder=2,this._wireframe.position.z=.012,this._anchor.add(this._wireframe),this._threePlane=new PD().setFromNormalAndCoplanarPoint(r,n),this._normal=r.clone().normalize(),this._controls=new fxn(t.world.camera.three,t.world.renderer.three.domElement),this._onCameraChange=()=>{this._controls.camera=t.world.camera.three,this._updateScale()},t.world.camera.projection.onChanged.add(this._onCameraChange),this._controls.attach(this._anchor),this._controls.setSpace(`local`),this._controls.setSize(o),this._controls.showX=!1,this._controls.showY=!1,this._controls.enabled=!1,this._controls.visible=!1,this._controls.getHelper().visible=!1,this._controls.getHelper().renderOrder=3,this._controls.getHelper().userData.isSectionPlaneControlHandle=!0,this._controls.getHelper().userData.sectionPlaneId=this.id,this._controls.getHelper().traverse(e=>{e.userData.isSectionPlaneController=!0,e.userData.sectionPlaneId=this.id,e.renderOrder=3;let t=e.tag!==`picker`&&e.tag!==`helper`,n=Array.isArray(e.material)?e.material:[e.material];if(t)for(let e of n)e&&(e.depthTest=!1,e.depthWrite=!1,e.transparent=!0);t&&(e.userData.isSectionPlaneControlHandle=!0)}),this._pruneOppositeControlDirection(),this._onChange=()=>{this._syncFromAnchor()},this._onDraggingChanged=e=>{this._clipper.world.camera.enabled=!e.value},this._controls.addEventListener(`change`,this._onChange),this._controls.addEventListener(`dragging-changed`,this._onDraggingChanged),this._onCameraUpdate=()=>{this._updateScale(),this._clipper.requestRender()},this._scaleMode===`camera`&&this._clipper.world.camera.controls?.addEventListener(`update`,this._onCameraUpdate),t._widgetOverlayScene.add(this._anchor),t._widgetOverlayScene.add(this._controls.getHelper()),t._registerPlaneMesh(this._mesh,this),this._applyVisualState(),this._updateScale()}get shown(){return this._shown}get three(){return this._threePlane}get controlShown(){return this._controlShown}get widgetsVisible(){return this._widgetsVisible}get widgetPosition(){return this._anchor.position}get location(){return this._anchor.position}get position(){return this._anchor.position}get direction(){return this._normal}get active(){return this._active}setActive(e){if(!this._activeEnabled)return;let t=!!e;this._active!==t&&(this._active=t,this._applyVisualState(),this._clipper.requestRender())}setWireframeMode(e){if(e!==`triangles`&&e!==`edges`)throw TypeError(`wireframe mode must be 'triangles' or 'edges'`);this._wireframeMode!==e&&(this._wireframeMode=e,this._wireframe.geometry.dispose(),this._wireframe.geometry=this._createWireframeGeometry(e),this._clipper.requestRender())}setHovered(e){let t=!!e;this._hovered!==t&&(this._hovered=t,this._applyVisualState(),this._clipper.requestRender())}setVisualStateDefinition(e){this._visualState=e,this._applyVisualState(),this._clipper.requestRender()}setControlColor(e){let t=this._controls.getHelper();t&&(t.traverse(t=>{if(!(t.tag!==`picker`&&t.tag!==`helper`))return;let n=Array.isArray(t.material)?t.material:[t.material];for(let t of n)t?.color&&t.color.setHex(e)}),this._clipper.requestRender())}setFixedScale(e,t){this._fixedScale.set(e,t),this._updateScale(),this._clipper.requestRender()}setScaleMode(e){if(e!==`camera`&&e!==`fixed`)throw TypeError(`scale mode must be 'camera' or 'fixed'`);this._scaleMode!==e&&(this._scaleMode===`camera`&&this._clipper.world.camera.controls?.removeEventListener(`update`,this._onCameraUpdate),this._scaleMode=e,this._scaleMode===`camera`&&this._clipper.world.camera.controls?.addEventListener(`update`,this._onCameraUpdate),this._updateScale(),this._clipper.requestRender())}show(){this._shown||(this._shown=!0,this._updateWidgetVisibility(),this._clipper.emit(`shown`,{plane:this}),this._clipper.applyClippingPlanes(),this._clipper.requestRender())}hide(){this._shown&&(this._shown=!1,this.hideControl(),this._updateWidgetVisibility(),this._clipper.activeSectionPlane===this&&this._clipper.setActivePlane(null),this._clipper.emit(`hidden`,{plane:this}),this._clipper.applyClippingPlanes(),this._clipper.requestRender())}showControl(){this._controlShown||(this._controlShown=!0,this._updateWidgetVisibility(),this._clipper.emit(`controls-shown`,{plane:this}),this._clipper.requestRender())}hideControl(){this._controlShown&&(this._controlShown=!1,this._updateWidgetVisibility(),this._clipper.emit(`controls-hidden`,{plane:this}),this._clipper.requestRender())}setWidgetsVisible(e){let t=!!e;this._widgetsVisible!==t&&(this._widgetsVisible=t,this._updateWidgetVisibility(),this._clipper.requestRender())}destroy(){this.hideControl(),this._controls.removeEventListener(`change`,this._onChange),this._controls.removeEventListener(`dragging-changed`,this._onDraggingChanged),this._controls.detach(),this._clipper.world.camera.controls?.removeEventListener(`update`,this._onCameraUpdate),this._clipper.world.camera.projection.onChanged.remove(this._onCameraChange),this._anchor.removeFromParent(),this._controls.getHelper().removeFromParent(),this._controls.dispose(),this._clipper._unregisterPlaneMesh(this._mesh),this._mesh.geometry.dispose(),this._mesh.material.dispose(),this._wireframe.geometry.dispose(),this._wireframe.material.dispose(),this._clipper.onSectionPlaneDestroyed(this)}getWorldNormal(e=new L){return e.set(0,0,1).applyQuaternion(this._anchor.quaternion).normalize()}setPositionAlongAxis(e,t,n){this._anchor.position.copy(e).addScaledVector(t,n),this._syncFromAnchor()}setWidgetPosition(e){if(!(e instanceof L))throw TypeError(`position must be a THREE.Vector3`);this._anchor.position.copy(e),this._anchor.updateWorldMatrix(!0,!1),this._updateScale(),this._clipper.requestRender()}setFromPointNormalAndTangent(e,t,n){if(!(e instanceof L)||!(t instanceof L)||!(n instanceof L))throw TypeError(`point, normal and tangent must be THREE.Vector3 instances`);let r=t.clone().normalize();if(r.lengthSq()<1e-10)return;let i=n.clone().sub(r.clone().multiplyScalar(n.dot(r)));if(i.lengthSq()<1e-10){let e=Math.abs(r.z)<.95?new L(0,0,1):new L(0,1,0);i=e.sub(r.clone().multiplyScalar(e.dot(r)))}i.normalize();let a=r.clone().cross(i).normalize();i=a.clone().cross(r).normalize();let o=new OE().makeBasis(i,a,r),s=new vE().setFromRotationMatrix(o);this._anchor.position.copy(e),this._anchor.quaternion.copy(s),this._normal.copy(r),this._threePlane.setFromNormalAndCoplanarPoint(this._normal,this._anchor.position),this._anchor.updateWorldMatrix(!0,!1),this._updateScale(),this._clipper.requestRender()}_applyVisualState(){let e=this._mesh.material;if(!e)return;let t=this._clipper._planeMaterial.color.getHex(),n=this._clipper._planeMaterial.opacity,r=this._active&&this._hovered?`activeHovered`:this._active?`active`:this._hovered?`hovered`:`idle`,i=this._visualState?.[r]??null,a=this._visualState?.idle??null,o=i?.color??a?.color??t,s=i?.opacity??a?.opacity??n;if(!this._visualState){let e=this._clipper._planeMaterial.color.clone();this._active&&this._hovered?(e.offsetHSL(.025,.35,.28),s=n+.52):this._active?(e.offsetHSL(.015,.3,.18),s=n+.4):this._hovered&&(e.offsetHSL(0,.22,.12),s=n+.22),o=e.getHex()}e.color.setHex(o),e.opacity=Math.min(.92,s),this._wireframe&&this._wireframe.material.color.setHex(o)}_updateScale(){if(this._scaleMode===`fixed`){this._mesh.scale.set(this._fixedScale.x,this._fixedScale.y,1),this._wireframe.scale.set(this._fixedScale.x,this._fixedScale.y,1);return}let e=this._clipper.world.camera.three,t;if(e instanceof AO)t=(e.top-e.bottom)/e.zoom;else if(e instanceof kO){let n=new L;e.getWorldPosition(n),t=this._anchor.position.distanceTo(n)*Math.min(1.9*Math.tan(Math.PI*e.fov/360)/e.zoom,7)}else return;let n=t*this._controls.size/4*(this._clipper._planeVisualSizeMultiplier??1.5);this._mesh.scale.set(n,n,n),this._wireframe.scale.set(n,n,n)}_createWireframeGeometry(e){let t=[-.5,-.5,0,.5,-.5,0,.5,-.5,0,.5,.5,0,.5,.5,0,-.5,.5,0,-.5,.5,0,-.5,-.5,0],n=e===`edges`?t:t.concat([-.5,-.5,0,0,0,0,.5,-.5,0,0,0,0,.5,.5,0,0,0,0,-.5,.5,0,0,0,0]),r=new yD;return r.setAttribute(`position`,new uD(new Float32Array(n),3)),r}_pruneOppositeControlDirection(){if(!this._controlAxisDirection)return;let e=this._controlAxisDirection.axis,t=e.toLowerCase(),n=this._controlAxisDirection.direction,r=this._controls.getHelper(),i=[],a=new L;r.traverse(r=>{if(r.name!==e||!r.geometry||(r.geometry.computeBoundingBox?.(),!r.geometry.boundingBox))return;r.geometry.boundingBox.getCenter(a);let o=a[t];typeof o==`number`&&(n>0&&o<-1e-4||n<0&&o>1e-4)&&i.push(r)});for(let e of i)e.removeFromParent()}_syncFromAnchor(){this._anchor.updateWorldMatrix(!0,!1);let e=this.getWorldNormal();this._normal.copy(e),this._threePlane.setFromNormalAndCoplanarPoint(e,this._anchor.position),this._updateScale(),this._clipper.applyClippingPlanes(),this._clipper.requestRender()}_updateWidgetVisibility(){let e=this._shown&&this._widgetsVisible,t=this._controlShown&&this._widgetsVisible;this._mesh.visible=e,this._wireframe.visible=e,this._controls.enabled=t,this._controls.visible=t,this._controls.getHelper().visible=t}},TXn=class{constructor({components:e,OBF:t,world:n,requestRender:r,styleName:i,groupName:a,createFillsMaterial:o,createLinesMaterial:s}){this._components=e,this._OBF=t,this._world=n,this._requestRender=r,this._styleName=i,this._groupName=a,this._createFillsMaterial=o??(()=>new ED({color:16727326,transparent:!1,opacity:1,side:2,depthWrite:!1,polygonOffset:!0,polygonOffsetFactor:-2,polygonOffsetUnits:-2})),this._createLinesMaterial=s??(()=>new rW({color:`black`,linewidth:2})),this._edgesById=new Map,this._updateQueue=Promise.resolve(),this._revision=0}_getClipStyler(){try{let e=this._components.get(this._OBF.ClipStyler);return e?(e.world=this._world,e):null}catch{return null}}_ensureClipStyle(){let e=this._getClipStyler();return e?(e.styles.get(this._styleName)||e.styles.set(this._styleName,{fillsMaterial:this._createFillsMaterial(),linesMaterial:this._createLinesMaterial()}),e):null}_clearEdges(e=this._getClipStyler()){if(!e){this._edgesById.clear();return}for(let t of this._edgesById.keys())e.list.delete(t);this._edgesById.clear()}clear(){this._revision+=1,this._clearEdges(),this._requestRender()}_enqueue(e){return this._updateQueue=this._updateQueue.then(e,e),this._updateQueue}enqueueUpdate({entries:e,enabled:t}){let n=++this._revision;return this._enqueue(async()=>{if(n!==this._revision)return;let r=this._ensureClipStyle();if(this._clearEdges(r),!t||!e?.length){if(n!==this._revision)return;this._requestRender();return}if(r){for(let{id:t,plane:i}of e){if(n!==this._revision)return;let e=r.create(i,{id:t,world:this._world,items:{[this._groupName]:{style:this._styleName}}});if(e.visible=!0,await e.update(),n!==this._revision){r.list.delete(t);return}this._edgesById.set(t,e)}n===this._revision&&this._requestRender()}})}setFillColor(e){let t=String(e??``).replace(/^#/,``).trim();if(!/^[0-9a-fA-F]{6}$/.test(t))return;let n=this._ensureClipStyle();if(!n)return;let r=n.styles.get(this._styleName);r?.fillsMaterial&&(r.fillsMaterial.color.set(`#${t}`),this._requestRender())}destroy(){let e=this._getClipStyler();e&&e.styles.delete(this._styleName),this.clear()}},EXn=`section-plane-cap-style`,DXn=`section-plane-cap-group`,OXn=()=>new ED({color:16727326,transparent:!1,opacity:1,side:2,depthWrite:!1,polygonOffset:!0,polygonOffsetFactor:-2,polygonOffsetUnits:-2}),kXn=()=>new rW({color:`black`,linewidth:2}),AXn=class extends TXn{constructor({components:e,OBF:t,world:n,requestRender:r}){super({components:e,OBF:t,world:n,requestRender:r,styleName:EXn,groupName:DXn,createFillsMaterial:OXn,createLinesMaterial:kXn})}enqueueUpdate(e,t){let n=(e??[]).reduce((e,t)=>(!t?.id||!t?.three||e.push({id:`section-plane-cap-${t.id}`,plane:t.three}),e),[]);return super.enqueueUpdate({entries:n,enabled:t})}},jXn={color:4034751,opacity:.07},MXn={idle:{color:4034751,opacity:.07},hovered:{color:4034751,opacity:.24},active:{color:2648469,opacity:.26},activeHovered:{color:2054789,opacity:.32}},NXn=Symbol(`section-plane-owner`),PXn=class extends MYn{constructor(e){let{world:t,components:n,OBC:r,OBF:i,fragments:a}=e,o=e.requestRender.bind(e);super({world:t,requestRender:o,respectSceneDepth:!0}),this.fragmentsInstance=e;let s=n.get(r.Raycasters);this._caster=s.get(t),this._enabled=!1,this._fragments=a,this._showIntersections=!0,this._widgetsVisible=!0,this._capsVisible=!1,this._widgetMoveModifier=e=>!!e?.ctrlKey,this._planes=[],this._activeSectionPlane=null,this._hoveredPlane=null,this._hoveredWidgetType=null,this._id=0,this._offPick=null,this._lastPick=null,this._coreUpdateRequested=!1,this._coreUpdateInFlight=!1,this._intersectionGroup=new zE,this._intersectionGroup.renderOrder=4,this._widgetOverlayScene.add(this._intersectionGroup),this._intersectionMaterial=new bO({color:16773222,transparent:!0,opacity:.95,dashSize:.35,gapSize:.2,depthTest:!1,depthWrite:!1}),this._planeByMesh=new Map,this._surfaceDrag=null,this._eventAbortController=null,this._capsManager=i?.ClipStyler?new AXn({components:n,OBF:i,world:t,requestRender:o}):null,this._onPointerMove=e=>{if(this._surfaceDrag){if(e.pointerId!==this._surfaceDrag.pointerId)return;if(e.preventDefault(),this._surfaceDrag.mode===`widget`){let t=this._intersectPointerWithThreePlane(e,this._surfaceDrag.plane.three);if(!t)return;this._surfaceDrag.plane.setWidgetPosition(t.sub(this._surfaceDrag.pointerOffset));return}let t=this._computeLineParameterFromPointerEvent(e,this._surfaceDrag.startPosition,this._surfaceDrag.axis);if(typeof t!=`number`)return;let n=t-this._surfaceDrag.startParameter;this._surfaceDrag.plane.setPositionAlongAxis(this._surfaceDrag.startPosition,this._surfaceDrag.axis,n);return}let t=this._getWidgetHitFromPointerEvent(e),n=t?.plane??null,r=t?.type??null;n===this._hoveredPlane&&r===this._hoveredWidgetType||(this._hoveredPlane?.setHovered(!1),this._hoveredPlane=n,this._hoveredWidgetType=r,this._hoveredPlane?.setHovered(!0),this._applyCursor())},this._onPointerDown=e=>{if(e.button!==0)return;let t=this._getPlaneHitFromPointerEvent(e);if(!t)return;if(this.setActivePlane(t),this._widgetMoveModifier(e)){let n=this._intersectPointerWithThreePlane(e,t.three);if(!n)return;this._surfaceDrag={mode:`widget`,pointerId:e.pointerId,plane:t,pointerOffset:n.sub(t.widgetPosition.clone())},this.world.camera.enabled=!1;let r=this.world.renderer?.three?.domElement;r?.setPointerCapture?.(e.pointerId),r&&(r.style.cursor=`crosshair`),e.preventDefault(),e.stopPropagation();return}let n=t._anchor.position.clone(),r=t.getWorldNormal(),i=this._computeLineParameterFromPointerEvent(e,n,r);if(typeof i!=`number`)return;this._surfaceDrag={mode:`plane`,pointerId:e.pointerId,plane:t,axis:r,startPosition:n,startParameter:i},this.world.camera.enabled=!1;let a=this.world.renderer?.three?.domElement;a?.setPointerCapture?.(e.pointerId),a&&(a.style.cursor=`grabbing`),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation?.()},this._onPointerUp=e=>{!this._surfaceDrag||e.pointerId!==this._surfaceDrag.pointerId||this._endSurfaceDrag(e.pointerId)},this._onPointerLeave=()=>{this._hoveredPlane?.setHovered(!1),this._hoveredPlane=null,this._hoveredWidgetType=null,this._applyCursor()},this._eventAbortController=new AbortController;let{signal:c}=this._eventAbortController,l=this.world.renderer?.three?.domElement;l?.addEventListener(`pointerdown`,this._onPointerDown,{signal:c}),l?.addEventListener(`pointermove`,this._onPointerMove,{signal:c}),l?.addEventListener(`pointerleave`,this._onPointerLeave,{signal:c}),window.addEventListener(`pointerup`,this._onPointerUp,{signal:c}),window.addEventListener(`pointercancel`,this._onPointerUp,{signal:c}),this._offPick=this.fragmentsInstance.onPick(async({event:e})=>{let t=this._getPlaneHitFromPointerEvent(e);if(t){this.emit(`plane-clicked`,{plane:t});return}else this._activeSectionPlane&&this.setActivePlane(null);if(!this._enabled)return;let n=await this._pickSurfaceFromEvent(e);n&&(this._lastPick=n,await this.addSectionPlane({showControl:!0}),this.disable())}),this._planeMaterial=new ED({color:jXn.color,side:2,transparent:!0,opacity:jXn.opacity,depthTest:!1,depthWrite:!1})}_requestCoreRaycastUpdate(){this._coreUpdateRequested=!0,!this._coreUpdateInFlight&&(this._coreUpdateInFlight=!0,Promise.resolve().then(async()=>{try{for(;this._coreUpdateRequested;)this._coreUpdateRequested=!1,await this._fragments.core.update(!0);this.requestRender()}catch(e){console.warn(`[BIMDataViewer - 3D Fragments - section-planes] Failed to update raycast state after clipping change.`,e)}finally{this._coreUpdateInFlight=!1}}))}get enabled(){return this._enabled}set enabled(e){e?this.enable():this.disable()}get sectionPlanes(){return this._planes}get widgetsVisible(){return this._widgetsVisible}set widgetsVisible(e){let t=!!e;if(this._widgetsVisible!==t){this._widgetsVisible=t;for(let e of this._planes)e.setWidgetsVisible(t);this._updateIntersectionLines(),this.requestRender()}}get widgetMoveModifier(){return this._widgetMoveModifier}set widgetMoveModifier(e){if(typeof e!=`function`)throw TypeError(`widgetMoveModifier must be a function`);this._widgetMoveModifier=e}get capsVisible(){return this._capsVisible}set capsVisible(e){let t=!!e;this._capsVisible!==t&&(this._capsVisible=t,this._updateCaps())}get showIntersections(){return this._showIntersections}set showIntersections(e){let t=!!e;this._showIntersections!==t&&(this._showIntersections=t,this._updateIntersectionLines(),this.requestRender())}get activeSectionPlane(){return this._activeSectionPlane}_getPlaneById(e){return e?this._planes.find(t=>t.id===e)??null:null}_registerPlaneMesh(e,t){this._planeByMesh.set(e,t)}_unregisterPlaneMesh(e){this._planeByMesh.delete(e)}setMaterial(e=null){if(!e){this._planeMaterial.color.setHex(jXn.color),this._planeMaterial.opacity=jXn.opacity;return}let{color:t,opacity:n}=e;typeof t==`number`&&this._planeMaterial.color.setHex(t),typeof n==`number`&&(this._planeMaterial.opacity=n);for(let e of this._planes)e._applyVisualState();this.requestRender()}enable(){this._enabled=!0}disable(){this._enabled=!1}async addSectionPlane(e={}){let t=e.point instanceof L;if(t!==e.normal instanceof L)throw TypeError(`point and normal must be provided together`);let n=t?{point:e.point.clone(),normal:e.normal.clone().normalize()}:this._lastPick;if(!n)return null;let r=new wXn({id:`section-plane-${++this._id}`,clipper:this,point:n.point,normal:n.normal,visualState:MXn});return r.three[NXn]=this,r.setWidgetsVisible(this._widgetsVisible),this._planes.push(r),this.applyClippingPlanes(),this.requestRender(),this._lastPick=null,this.emit(`created`,{plane:r}),this.setActivePlane(r),r}setActivePlane(e){let t=e&&this._planes.includes(e)?e:null;if(this._activeSectionPlane===t)return;let n=this._activeSectionPlane;n?.setActive(!1),this._activeSectionPlane=t,t?.setActive(!0),this.hideAllControls(),t?.shown&&t.showControl(),this.emit(`active-changed`,{plane:t,previousPlane:n}),this.requestRender()}removeSectionPlane(e){return!e||!this._planes.includes(e)?!1:(e.destroy(),!0)}onSectionPlaneDestroyed(e){this._activeSectionPlane===e&&this.setActivePlane(null),this._hoveredPlane===e&&(this._hoveredPlane=null);let t=this._planes.indexOf(e);t!==-1&&(this._planes.splice(t,1),this.emit(`deleted`,{plane:e}),this.applyClippingPlanes(),this.requestRender())}applyClippingPlanes(){let e=this.world.renderer?.three;if(!e)return;let t=this._planes.filter(e=>e.shown).map(e=>e.three),n=[...(Array.isArray(e.clippingPlanes)?e.clippingPlanes:[]).filter(e=>e?.[NXn]!==this),...t].filter((e,t,n)=>n.indexOf(e)===t);e.localClippingEnabled=n.length>0,e.clippingPlanes=n,this.world.renderer?.updateClippingPlanes(),this._requestCoreRaycastUpdate(),this._updateIntersectionLines(),this._updateCaps()}hideAllControls(){for(let e of this._planes)e.hideControl()}destroy(){this.disable();for(let e of[...this._planes])e.destroy();this._hoveredPlane=null,this._hoveredWidgetType=null,this._activeSectionPlane=null;let e=this.world.renderer?.three?.domElement;this._endSurfaceDrag(),this._eventAbortController?.abort(),this._eventAbortController=null,e&&(e.style.cursor=``),this._offPick?.(),this._offPick=null,this.destroyOverlayLayer(),this._clearIntersectionLines(),this._intersectionGroup.removeFromParent(),this._intersectionMaterial.dispose(),this._capsManager?.destroy(),this.clear(),this._planeMaterial.dispose()}_updateCaps(){this._capsManager?.enqueueUpdate(this._planes.filter(e=>e.shown),this._capsVisible)}setCapsColor(e){this._capsManager?.setFillColor(e)}async _pickSurfaceFromEvent(e){let t=this.world.renderer?.three?.domElement;if(!t)return null;let n=t.getBoundingClientRect(),r={x:(e.clientX-n.left)/n.width*2-1,y:-((e.clientY-n.top)/n.height)*2+1},i=await this._caster.castRay({position:r});if(!i?.point)return null;let a=null;if(i.normal)a=i.normal.clone();else if(i.face?.normal&&i.object){let e=new yE().getNormalMatrix(i.object.matrixWorld);a=i.face.normal.clone().applyMatrix3(e)}return a?(a.normalize().negate(),{point:i.point.clone(),normal:a}):null}_getPlaneHitFromPointerEvent(e){let t=this._getWidgetHitFromPointerEvent(e);return!t||t.type!==`plane`?null:t.plane}_getWidgetHitFromPointerEvent(e){if(!this.world.renderer?.three?.domElement||this._widgetOverlayScene.children.length===0||!this._setPointerFromEvent(e))return null;let t=this._widgetRaycaster.intersectObject(this._widgetOverlayScene,!0),n=null;for(let e of t){let t=e.object;if(t.userData.isSectionPlaneIntersectionLine||!t.visible)continue;let r=Array.isArray(t.material)?t.material:[t.material],i=r.some(e=>e&&e.visible!==!1);if(r.length>0&&!i)continue;if(t.userData.isSectionPlaneControlHandle){let e=this._getPlaneById(t.userData.sectionPlaneId);if(e?.controlShown)return{type:`control`,plane:e};continue}let a=this._planeByMesh.get(t);!n&&a?.shown&&(n={type:`plane`,plane:a})}return n}_computeLineParameterFromPointerEvent(e,t,n){if(!this._setPointerFromEvent(e))return null;let r=this._widgetRaycaster.ray.origin,i=this._widgetRaycaster.ray.direction,a=n.clone().normalize(),o=r.clone().sub(t),s=i.dot(a),c=i.dot(o),l=a.dot(o),u=1-s*s;return Math.abs(u)<1e-5?null:(l-s*c)/u}_endSurfaceDrag(e=null){if(!this._surfaceDrag||e!==null&&e!==this._surfaceDrag.pointerId)return;let t=this._surfaceDrag.pointerId;this._surfaceDrag=null,this.world.camera.enabled=!0,(this.world.renderer?.three?.domElement)?.releasePointerCapture?.(t),this._applyCursor()}_applyCursor(){let e=this.world.renderer?.three?.domElement;if(e){if(this._surfaceDrag){e.style.cursor=this._surfaceDrag.mode===`widget`?`crosshair`:`grabbing`;return}if(this._hoveredWidgetType===`control`){e.style.cursor=`move`;return}if(this._hoveredWidgetType===`plane`){e.style.cursor=`grab`;return}e.style.cursor=``}}_clearIntersectionLines(){for(;this._intersectionGroup.children.length>0;){let e=this._intersectionGroup.children[0];e.removeFromParent(),e.geometry?.dispose?.()}}_updateIntersectionLines(){if(this._clearIntersectionLines(),!this._showIntersections||!this._widgetsVisible)return;let e=this._planes.filter(e=>e.shown);if(e.length<2)return;let t=e.reduce((e,t)=>Math.max(e,t?._mesh?.scale?.x??0),0),n=Math.max(8,t*2);for(let t=0;t<e.length-1;t++){let r=e[t].three,i=r.normal.clone(),a=r.constant;for(let r=t+1;r<e.length;r++){let t=e[r].three,o=t.normal.clone(),s=t.constant,c=new L().crossVectors(i,o),l=c.lengthSq();if(l<1e-8)continue;c.normalize();let u=-a,d=-s,f=new L().copy(o).multiplyScalar(u).addScaledVector(i,-d).cross(new L().crossVectors(i,o)).divideScalar(l),p=f.clone().addScaledVector(c,-n),m=f.clone().addScaledVector(c,n),h=new KD(new yD().setFromPoints([p,m]),this._intersectionMaterial);h.computeLineDistances(),h.renderOrder=4,h.userData.isSectionPlaneIntersectionLine=!0,this._intersectionGroup.add(h)}}}},FXn={color:13386786,opacity:.3},IXn=[`silver`,`grey`,`darkgray`],LXn=e=>`#${e.toString(16).padStart(6,`0`)}`,RXn=e=>({idle:{color:e,opacity:.1},hovered:{color:e,opacity:.24},active:{color:e,opacity:.3},activeHovered:{color:e,opacity:.36}});function zXn(e){let t=new PXn(e),n=new AbortController,r=new Map,i=new Map,a=new Map,o=lo(null),s=e=>{let t=a.get(e);if(t)return t;let n=LXn(J_({excludedHexColors:Array.from(a.values()).map(e=>Number.parseInt(e.slice(1),16)).filter(e=>Number.isFinite(e)),excludeTooBright:!0,excludeTooDark:!0,excludedNames:IXn}));return a.set(e,n),n},c=(e,t)=>{let n=Number.parseInt(t.slice(1),16);e.setVisualStateDefinition(RXn(n)),e.setControlColor?.(n)},l=e=>{let n=s(e);c(e,n);let a=Ya({id:e.id,shown:e.shown,controlsShown:e.controlShown,active:e.active,color:n,get location(){return e.location},get position(){return e.position},get direction(){return e.direction},show:()=>{e.show()},hide:()=>{e.hide()},delete:()=>t.removeSectionPlane(e),showControl:()=>{t.hideAllControls(),e.showControl()},hideControl:()=>{e.hideControl()}});return r.set(e,a),i.set(a,e),a},u=e=>{if(e)return r.get(e)??l(e)},d=e=>{for(let[t,n]of r.entries())n.active=t===e;o.value=e?u(e)??null:null},f=e=>{if(e==null){t.setActivePlane(null);return}let n=i.get(e)??e;t.setActivePlane(n)},p=Ya([]);for(let e of t.sectionPlanes)p.push(u(e));t.on(`created`,({plane:e})=>{let t=u(e);t&&(p.includes(t)||p.push(t))},{abortSignal:n.signal}),t.on(`deleted`,({plane:e})=>{let t=r.get(e);if(!t)return;a.delete(e),r.delete(e),i.delete(t);let n=p.indexOf(t);n!==-1&&p.splice(n,1),o.value===t&&(o.value=null)},{abortSignal:n.signal}),t.on(`shown`,({plane:e})=>{let t=u(e);t&&(t.shown=!0)},{abortSignal:n.signal}),t.on(`hidden`,({plane:e})=>{let t=u(e);t&&(t.shown=!1)},{abortSignal:n.signal}),t.on(`controls-shown`,({plane:e})=>{let t=u(e);t&&(t.controlsShown=!0)},{abortSignal:n.signal}),t.on(`controls-hidden`,({plane:e})=>{let t=u(e);t&&(t.controlsShown=!1)},{abortSignal:n.signal}),t.on(`plane-clicked`,({plane:e})=>{f(e)},{abortSignal:n.signal}),t.on(`active-changed`,({plane:e})=>{d(e??null)},{abortSignal:n.signal}),d(t.activeSectionPlane??null);let m=Ds(()=>e.$viewer.localContext.loadedModels,()=>{t.sectionPlanes.slice().forEach(e=>{e.destroy()})}),h=()=>{t.enabled=!0,t.applyClippingPlanes(),e.highlightMaterial=FXn},g=()=>{t.enabled=!1,e.highlightMaterial=null},_={get enabled(){return t.enabled},enableSection:h,disableSection:g,addSectionPlane:e=>t.addSectionPlane(e),removeSectionPlane:e=>i.has(e)?t.removeSectionPlane(i.get(e)):t.removeSectionPlane(e),deleteSectionPlane(e){return _.removeSectionPlane(e)},sectionPlanes:p,get activeSectionPlane(){return o.value},set activeSectionPlane(e){f(e)},get showIntersections(){return t.showIntersections},set showIntersections(e){t.showIntersections=e},get widgetsVisible(){return t.widgetsVisible},set widgetsVisible(e){t.widgetsVisible=e},get capsVisible(){return t.capsVisible},set capsVisible(e){t.capsVisible=e},toggleSectionCaps(e){t.capsVisible=e},setSectionCapsColor(e){t.setCapsColor(e)},get widgetMoveModifier(){return t.widgetMoveModifier},set widgetMoveModifier(e){t.widgetMoveModifier=e}};return{destroy(){m(),n.abort(),g(),t.destroy()},extension:_}}var BXn=.02,VXn=.01,HXn=.1,UXn=`section-box-cap`,WXn={x1:new L(-1,0,0),x2:new L(1,0,0),y1:new L(0,-1,0),y2:new L(0,1,0),z1:new L(0,0,-1),z2:new L(0,0,1)},u6=(e,t,n,r)=>{let i=t.clone().applyMatrix4(n),a=e.clone().applyMatrix3(r).normalize(),o=new PD;return o.setFromNormalAndCoplanarPoint(a,i),o},GXn=(e,t=null)=>{let{min:n,max:r}=e;if(!t)return[new PD(new L(-1,0,0),r.x),new PD(new L(1,0,0),-n.x),new PD(new L(0,-1,0),r.y),new PD(new L(0,1,0),-n.y),new PD(new L(0,0,-1),r.z),new PD(new L(0,0,1),-n.z)];let i=new yE().getNormalMatrix(t);return[u6(new L(-1,0,0),new L(r.x,0,0),t,i),u6(new L(1,0,0),new L(n.x,0,0),t,i),u6(new L(0,-1,0),new L(0,r.y,0),t,i),u6(new L(0,1,0),new L(0,n.y,0),t,i),u6(new L(0,0,-1),new L(0,0,r.z),t,i),u6(new L(0,0,1),new L(0,0,n.z),t,i)]},KXn=e=>{let t=new L;e.getSize(t);let n=Math.max(t.x,t.y,t.z),r=Math.max(n*BXn,VXn);return e.clone().expandByScalar(r)},qXn=()=>new ED({color:16727326,transparent:!1,opacity:1,side:2,depthWrite:!1,polygonOffset:!0,polygonOffsetFactor:-2,polygonOffsetUnits:-2}),JXn=()=>new rW({color:`black`,linewidth:2}),YXn=class extends TXn{constructor({components:e,OBF:t,world:n,requestRender:r}){super({components:e,OBF:t,world:n,requestRender:r,styleName:UXn,groupName:`all`,createFillsMaterial:qXn,createLinesMaterial:JXn})}enqueueUpdate(e,t){let n=[`x1`,`x2`,`y1`,`y2`,`z1`,`z2`],r=(e?.clippingPlanes??[]).reduce((e,t,r)=>(t&&e.push({id:`section-box-cap-${n[r]??r}`,plane:t}),e),[]);return super.enqueueUpdate({entries:r,enabled:t})}},XXn=class extends MYn{constructor({world:e,requestRender:t,axisNormals:n,getSectionBox:r,isEditEnabled:i,isWidgetVisible:a,isOverlayVisible:o,getPlaneSizeMultiplier:s,getPlaneVisualState:c,onBoundsChange:l}){super({world:e,requestRender:t,respectSceneDepth:!0}),this._axisNormals=n,this._getSectionBox=r,this._isEditEnabled=i,this._isWidgetVisible=a,this._isOverlayVisible=o,this._getPlaneSizeMultiplier=s,this._getPlaneVisualState=c,this._onBoundsChange=l,this._widgets=new Map,this._widgetByMesh=new Map,this._widgetById=new Map,this._hoveredWidget=null,this._hoveredWidgetType=null,this._isSyncingFromBounds=!1,this._surfaceDrag=null,this._eventAbortController=null,this._planeMaterial=new ED({color:4034751,side:2,transparent:!0,opacity:.07,depthTest:!1,depthWrite:!1}),this._clipperAdapter={world:e,requestRender:t,_planeMaterial:this._planeMaterial,_widgetOverlayScene:this._widgetOverlayScene,_registerPlaneMesh:()=>{},_unregisterPlaneMesh:()=>{},emit:()=>{},activeSectionPlane:null,setActivePlane:()=>{},applyClippingPlanes:()=>{this._onWidgetPlaneChanged()},onSectionPlaneDestroyed:()=>{}},this._eventAbortController=new AbortController;let{signal:u}=this._eventAbortController,d=this.world.renderer?.three?.domElement;d?.addEventListener(`pointerdown`,e=>this._onPointerDown(e),{signal:u}),d?.addEventListener(`pointermove`,e=>this._onPointerMove(e),{signal:u}),d?.addEventListener(`pointerleave`,()=>this._onPointerLeave(),{signal:u}),window.addEventListener(`pointerup`,e=>this._onPointerUp(e),{signal:u}),window.addEventListener(`pointercancel`,e=>this._onPointerUp(e),{signal:u})}_getFaceScale(e,t){let n=e.getSize(new L),r=this._getPlaneSizeMultiplier();return t===`x1`||t===`x2`?new _E(n.y*r,n.z*r):t===`y1`||t===`y2`?new _E(n.x*r,n.z*r):new _E(n.x*r,n.y*r)}_getFaceCenter(e,t){let n=e.getCenter(new L);return t===`x1`?new L(e.min.x,n.y,n.z):t===`x2`?new L(e.max.x,n.y,n.z):t===`y1`?new L(n.x,e.min.y,n.z):t===`y2`?new L(n.x,e.max.y,n.z):t===`z1`?new L(n.x,n.y,e.min.z):new L(n.x,n.y,e.max.z)}_toWorldPoint(e,t){return t?t.localToWorldPoint(e):e}_toWorldNormal(e,t){return t?t.localToWorldDirection(e):e}_getFaceTangent(e,t){let n=null;return n=e===`x1`||e===`x2`?new L(0,1,0):new L(1,0,0),this._toWorldNormal(n,t).normalize()}_createWidget(e,t,n){let r=this._getFaceCenter(t,e),i=this._toWorldPoint(r,n),a=this._toWorldNormal(this._axisNormals[e].clone(),n),o=this._getFaceTangent(e,n),s=new wXn({id:`section-box-plane-${e}`,clipper:this._clipperAdapter,point:i,normal:a,scaleMode:`fixed`,fixedScale:this._getFaceScale(t,e),controlSize:.7,activeEnabled:!1,visualState:this._getPlaneVisualState(),controlAxisDirection:{axis:`Z`,direction:1},wireframeMode:`edges`});return s.setFromPointNormalAndTangent(i,a,o),s.show(),s.showControl(),this._widgets.set(e,s),this._widgetByMesh.set(s._mesh,s),this._widgetById.set(s.id,s),s}_updateWidget(e,t,n){let r=this._widgets.get(e)??this._createWidget(e,t,n),i=this._getFaceCenter(t,e),a=this._toWorldPoint(i,n),o=this._toWorldNormal(this._axisNormals[e].clone(),n),s=this._getFaceTangent(e,n);r.setFromPointNormalAndTangent(a,o,s);let c=this._getFaceScale(t,e);r.setFixedScale(c.x,c.y),r.setVisualStateDefinition(this._getPlaneVisualState())}_getWidgetHitFromPointerEvent(e){if(!this._isOverlayVisible()||!this._setPointerFromEvent(e))return null;let t=this._widgetRaycaster.intersectObject(this._widgetOverlayScene,!0),n=null;for(let e of t){let t=e.object;if(!t.visible)continue;let r=Array.isArray(t.material)?t.material:[t.material],i=r.some(e=>e&&e.visible!==!1);if(r.length>0&&!i)continue;if(t.userData.isSectionPlaneControlHandle){let e=this._widgetById.get(t.userData.sectionPlaneId);if(e?.controlShown)return{type:`control`,plane:e};continue}let a=this._widgetByMesh.get(t);!n&&a?.shown&&(n={type:`plane`,plane:a})}return n}_getPlaneHitFromPointerEvent(e){let t=this._getWidgetHitFromPointerEvent(e);return!t||t.type!==`plane`?null:t.plane}_computeLineParameterFromPointerEvent(e,t,n){if(!this._setPointerFromEvent(e))return null;let r=this._widgetRaycaster.ray.origin,i=this._widgetRaycaster.ray.direction,a=n.clone().normalize(),o=r.clone().sub(t),s=i.dot(a),c=i.dot(o),l=a.dot(o),u=1-s*s;return Math.abs(u)<1e-5?null:(l-s*c)/u}_applyCursor(){let e=this.world.renderer?.three?.domElement;if(e){if(!this._isOverlayVisible()){e.style.cursor=``;return}if(this._surfaceDrag){e.style.cursor=`grabbing`;return}if(this._hoveredWidgetType===`control`){e.style.cursor=`move`;return}if(this._hoveredWidgetType===`plane`){e.style.cursor=`grab`;return}e.style.cursor=``}}_onPointerDown(e){if(e.button!==0||!this._isEditEnabled()||!this._isOverlayVisible())return;let t=this._getPlaneHitFromPointerEvent(e);if(!t)return;let n=t.widgetPosition.clone(),r=t.getWorldNormal(),i=this._computeLineParameterFromPointerEvent(e,n,r);typeof i==`number`&&(this._surfaceDrag={pointerId:e.pointerId,plane:t,axis:r,startPosition:n,startParameter:i},this.world.camera.enabled=!1,(this.world.renderer?.three?.domElement)?.setPointerCapture?.(e.pointerId),this._applyCursor(),e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation?.())}_onPointerMove(e){if(this._surfaceDrag){if(e.pointerId!==this._surfaceDrag.pointerId)return;e.preventDefault();let t=this._computeLineParameterFromPointerEvent(e,this._surfaceDrag.startPosition,this._surfaceDrag.axis);if(typeof t!=`number`)return;let n=t-this._surfaceDrag.startParameter;this._surfaceDrag.plane.setPositionAlongAxis(this._surfaceDrag.startPosition,this._surfaceDrag.axis,n);return}if(!this._isWidgetVisible()||!this._isOverlayVisible()){this._clearHoveredWidget(),this._hoveredWidgetType=null,this._applyCursor();return}let t=this._getWidgetHitFromPointerEvent(e),n=t?.plane??null,r=t?.type??null;n===this._hoveredWidget&&r===this._hoveredWidgetType||(this._hoveredWidget?.setHovered(!1),this._hoveredWidget=n,this._hoveredWidgetType=r,this._hoveredWidget?.setHovered(!0),this._applyCursor())}_onPointerUp(e){if(!this._surfaceDrag||e.pointerId!==this._surfaceDrag.pointerId)return;let t=this._surfaceDrag.pointerId;this._surfaceDrag=null,this.world.camera.enabled=!0,(this.world.renderer?.three?.domElement)?.releasePointerCapture?.(t),this._applyCursor()}_onPointerLeave(){this._clearHoveredWidget(),this._hoveredWidgetType=null,this._applyCursor()}_clearHoveredWidget(){this._hoveredWidget&&=(this._hoveredWidget.setHovered(!1),null)}_applyWidgetsVisibility(){let e=this._isWidgetVisible()&&this._isOverlayVisible(),t=this._isEditEnabled()&&e;for(let n of this._widgets.values())n.setWidgetsVisible(e),(!e||!t)&&n.setHovered(!1),e&&t?n.showControl():n.hideControl();this.requestRender()}_onWidgetPlaneChanged(){if(this._isSyncingFromBounds)return;let e=this._getSectionBox(),t=e?.bounds;if(!t)return;let n=t.clone(),r=(t,n)=>{let r=this._widgets.get(t)?.widgetPosition;return r?e?e.worldToLocalPoint(r):r:n},i=r(`x1`,new L(t.min.x,0,0)).x,a=r(`x2`,new L(t.max.x,0,0)).x,o=r(`y1`,new L(0,t.min.y,0)).y,s=r(`y2`,new L(0,t.max.y,0)).y,c=r(`z1`,new L(0,0,t.min.z)).z,l=r(`z2`,new L(0,0,t.max.z)).z,u=(e,t,n,r)=>{let i=e,a=t;return a>=i+.1||(Math.abs(e-n)>Math.abs(t-r)?i=a-HXn:a=i+HXn),{min:i,max:a}},d=u(i,a,t.min.x,t.max.x),f=u(o,s,t.min.y,t.max.y),p=u(c,l,t.min.z,t.max.z);n.min.x=d.min,n.max.x=d.max,n.min.y=f.min,n.max.y=f.max,n.min.z=p.min,n.max.z=p.max,this._onBoundsChange(n)}update(e){if(!e)return;let t=this._getSectionBox();if(t){this._clipperAdapter._planeVisualSizeMultiplier=this._getPlaneSizeMultiplier(),this._isSyncingFromBounds=!0;for(let n of Object.keys(this._axisNormals))this._updateWidget(n,e,t);this._isSyncingFromBounds=!1,this._applyWidgetsVisibility()}}clear(){this._clearHoveredWidget(),this._hoveredWidgetType=null;for(let e of this._widgets.values())e.destroy();this._widgets.clear(),this._widgetByMesh.clear(),this._widgetById.clear()}setHandleEditEnabled(){this._applyWidgetsVisibility()}setWidgetVisible(){this._applyWidgetsVisibility()}destroy(){let e=this.world.renderer?.three?.domElement;this._eventAbortController?.abort(),this._eventAbortController=null,e&&(e.style.cursor=``),this.clear(),this._planeMaterial.dispose(),this.destroyOverlayLayer()}},ZXn=e=>e.normal.clone().multiplyScalar(-e.constant),QXn=e=>({get location(){return ZXn(e)},get position(){return ZXn(e)},get direction(){return e.normal}}),$Xn=class{constructor({uuid:e,bounds:t,frame:n=null,boxVisible:r=!0,widgetVisible:i=!0,overlayVisible:a=!0,onVisibilityChange:o=null,onClear:s}){this.id=e,this.uuid=e,this.bounds=t,this.frame=n?.clone?.()??new OE,this.inverseFrame=this.frame.clone().invert(),this.clippingPlanes=[],this._boxVisible=co(r),this._widgetVisible=co(i),this._overlayVisible=co(a),this._onVisibilityChange=o,this._onClear=s,this._planes=[]}setFrame(e){this.frame.copy(e),this.inverseFrame.copy(e).invert()}localToWorldPoint(e){return e.clone().applyMatrix4(this.frame)}worldToLocalPoint(e){return e.clone().applyMatrix4(this.inverseFrame)}localToWorldDirection(e){let t=new yE().getNormalMatrix(this.frame);return e.clone().applyMatrix3(t).normalize()}getWorldBounds(){let e=[new L(this.bounds.min.x,this.bounds.min.y,this.bounds.min.z),new L(this.bounds.min.x,this.bounds.min.y,this.bounds.max.z),new L(this.bounds.min.x,this.bounds.max.y,this.bounds.min.z),new L(this.bounds.min.x,this.bounds.max.y,this.bounds.max.z),new L(this.bounds.max.x,this.bounds.min.y,this.bounds.min.z),new L(this.bounds.max.x,this.bounds.min.y,this.bounds.max.z),new L(this.bounds.max.x,this.bounds.max.y,this.bounds.min.z),new L(this.bounds.max.x,this.bounds.max.y,this.bounds.max.z)];for(let t of e)t.applyMatrix4(this.frame);return new XE().setFromPoints(e)}get shown(){return this._boxVisible.value}get widgetVisible(){return this._widgetVisible.value}get overlayVisible(){return this._overlayVisible.value}get planes(){return this._planes}show(){let e=!this._boxVisible.value||!this._widgetVisible.value||!this._overlayVisible.value;this._boxVisible.value=!0,this._widgetVisible.value=!0,this._overlayVisible.value=!0,e&&this._onVisibilityChange?.()}hide(){let e=this._boxVisible.value||this._widgetVisible.value||this._overlayVisible.value;this._boxVisible.value=!1,this._widgetVisible.value=!1,this._overlayVisible.value=!1,e&&this._onVisibilityChange?.()}setOverlayVisible(e){let t=!!e;this._overlayVisible.value!==t&&(this._overlayVisible.value=t,this._onVisibilityChange?.())}clear(){this._onClear()}setBounds(e){this.bounds.copy(e)}syncClippingPlanes(){let e=GXn(this.bounds,this.frame);if(this.clippingPlanes.length===0)return this.clippingPlanes=e,this._planes=e.map(e=>QXn(e)),this.clippingPlanes;for(let t=0;t<e.length;t++)this.clippingPlanes[t].normal.copy(e[t].normal),this.clippingPlanes[t].constant=e[t].constant;return this.clippingPlanes}},eZn={color:13386786,opacity:.3},tZn=12e3,nZn=24,d6=new L(0,1,0),rZn=new L(1,0,0),iZn=new L(0,0,1),aZn=(e,t,n)=>{let r=e.clone().normalize(),i=n.clone().normalize(),a=t.clone().normalize();if(r.lengthSq()<1e-10||a.lengthSq()<1e-10||i.lengthSq()<1e-10)return null;let o=i.clone().cross(r).normalize();return o.lengthSq()<1e-10?null:{x:o.clone().cross(i).normalize(),y:o,z:i.clone()}},oZn=(e,t)=>new OE().makeBasis(t.x,t.y,t.z).setPosition(e),sZn=e=>{let t=e.clone();return t.y=0,t.lengthSq()<1e-10?null:t.normalize()},cZn=e=>{if(!e?.length)return null;let t=new L;for(let n of e)t.add(n);return t.multiplyScalar(1/e.length),t},lZn=e=>{let t=cZn(e);if(!t)return null;let n=0,r=0,i=0;for(let a of e){let e=a.x-t.x,o=a.z-t.z;n+=e*e,r+=e*o,i+=o*o}if(n+i<1e-10)return null;let a=.5*Math.atan2(2*r,n-i);return new L(Math.cos(a),0,Math.sin(a)).normalize()},uZn=(e,t=null)=>{let n=cZn(e);if(!n)return null;let r=t?.clone?.().normalize?.()??lZn(e);if(!r||r.lengthSq()<1e-10)return oZn(n,{x:rZn.clone(),y:d6.clone(),z:iZn.clone()});let i=d6.clone().cross(r).normalize();if(i.lengthSq()<1e-10)return oZn(n,{x:rZn.clone(),y:d6.clone(),z:iZn.clone()});let a=aZn(i,d6,r);return a?(a.y.copy(d6),a.x.copy(d6).cross(a.z).normalize(),a.z.copy(a.x).cross(d6).negate().normalize(),oZn(n,a)):oZn(n,{x:rZn.clone(),y:d6.clone(),z:iZn.clone()})},dZn=(e,t)=>{if(!e.length)return null;let n=t.clone().invert(),r=new XE;for(let t of e){let e=t.clone().applyMatrix4(n);r.expandByPoint(e)}return r};function fZn(e){let{fragments:t,world:n,components:r,OBF:i,$viewer:a}=e,o=null,s=!1,c=!0,l=!1,u=!0,d=!0,f=1,p={idle:{color:4034751,opacity:.07},hovered:{color:4034751,opacity:.24}},m=`shiftKey`,h=()=>n.renderer?.three,g=lo(null),_=()=>{g.value=o},v=new YXn({components:r,OBF:i,world:n,requestRender:e.requestRender.bind(e)}),y=()=>{o&&(u=o.widgetVisible,d=o.overlayVisible)},b=()=>{if(!o)return;let e=h();if(!e)return;o.syncClippingPlanes();let t=o.shown?o.clippingPlanes:[],r=Array.isArray(e.clippingPlanes)?e.clippingPlanes:[],i=o.clippingPlanes,a=[...r.filter(e=>!i.includes(e)),...t].filter((e,t,n)=>n.indexOf(e)===t);e.localClippingEnabled=a.length>0,e.clippingPlanes=a,n.renderer?.updateClippingPlanes()},x=new XXn({world:n,requestRender:e.requestRender.bind(e),axisNormals:WXn,getSectionBox:()=>o,isEditEnabled:()=>c,isWidgetVisible:()=>o?.widgetVisible??u,isOverlayVisible:()=>o?.overlayVisible??d,getPlaneSizeMultiplier:()=>f,getPlaneVisualState:()=>p,onBoundsChange:t=>{o&&(o.setBounds(t),b(),v.enqueueUpdate(o,l),x.update(o.bounds),e.requestRender())}}),S=()=>{if(o){if(o.shown){x.update(o.bounds),v.enqueueUpdate(o,l);return}v.clear(),x.setWidgetVisible()}},C=async()=>{y(),x.setWidgetVisible(),b(),S(),_(),await e.fragments.core.update(!0),e.requestRender()},w=async()=>{let t=o;o=null,_(),v.clear(),x.clear();let r=h();if(r){let e=t?.clippingPlanes??[],i=(Array.isArray(r.clippingPlanes)?r.clippingPlanes:[]).filter(t=>!e.includes(t));r.clippingPlanes=i,r.localClippingEnabled=i.length>0,n.renderer?.updateClippingPlanes()}await e.fragments.core.update(!0),e.requestRender()},T=(e,t=`section-box`,n=null)=>{if(!(e instanceof XE))throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] createSectionBoxFromBounds(bounds) expects a THREE.Box3.`);return e.isEmpty()?(w(),!1):(o&&w(),h()?(o=new $Xn({uuid:t,bounds:e.clone(),frame:n,boxVisible:!0,widgetVisible:!0,overlayVisible:d,onVisibilityChange:C,onClear:w}),b(),S(),_(),!0):!1)},E=async(e,t)=>{let n=[],a;try{a=r.get(i.Mesher)}catch{return n}if(!a?.get)return n;let o;try{o=await a.get(e)}catch{return n}if(!o?.entries)return n;for(let[,e]of o.entries())if(e?.entries){for(let[,r]of e.entries())if(Array.isArray(r))for(let e of r){if(n.length>=t)return n;let r=(e?.geometry)?.getAttribute?.(`position`);if(!r||!r.array||r.count<=0)continue;e.updateMatrixWorld?.(!0);let i=e.matrixWorld,a=Math.max(1,t-n.length),o=Math.min(256,r.count,a),s=Math.max(1,Math.floor(r.count/o));for(let e=0;e<r.count&&n.length<t;e+=s){let t=new L().fromBufferAttribute(r,e);t.applyMatrix4(i),n.push(t)}}}return n},D=async(e,n=tZn)=>{let r=[],i=await E(e,n);if(r.push(...i),r.length>=Math.min(nZn,n))return r;let a=Object.entries(e);if(a.length===0||n<=0)return r;for(let[e,i]of a){let a=t.list.get(e);if(!a)continue;let o=i instanceof Set?[...i]:[...new Set(i)];if(o.length)for(let e of o){if(r.length>=n)break;let t;try{t=await a.getItemDrawChunks([e])}catch{continue}if(t?.length)for(let e of t){if(r.length>=n)break;let t=a.tiles.get(e.tileId),i=t?.geometry,o=i?.getAttribute?.(`position`);if(!t||!o)continue;let s=i.index?.array??null,c=Math.min(e.position?.length??0,e.size?.length??0);for(let i=0;i<c&&!(r.length>=n);i+=1){let a=e.position[i]??0,c=e.size[i]??0,l=s?s.length:o.count,u=Math.min(l-a,c===4294967295?l-a:c);if(!Number.isFinite(u)||u<=0)continue;let d=Math.max(1,n-r.length),f=Math.max(1,Math.floor(u/Math.min(64,u,d)));for(let e=a;e<a+u&&r.length<n;e+=f){let n=s?s[e]:e;if(n==null||n>=o.count||!o.array)continue;let i=new L().fromBufferAttribute(o,n);i.applyMatrix4(t.matrixWorld),r.push(i)}}}}}return r},ee=(e,t)=>uZn(t,sZn(e)),te=async(e,t=null)=>{let n=await D(e);if(n.length<3)return null;let r=null;if(t&&(r=ee(t,n)),r||=uZn(n),!r)return null;let i=dZn(n,r);return!i||i.isEmpty()?null:{bounds:i,frame:r}},ne=async(e,n={})=>{if(!Array.isArray(e))throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] createSectionBoxFromUuids(uuids) expects an array of uuids.`);let r=e.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(Boolean);if(r.length===0)return w(),!1;let i=await t.guidsToModelIdMap(r);if(!Object.values(i).some(e=>e.size>0))return w(),!1;let a=await te(i,n.normal??null);if(a){let e=KXn(a.bounds);return T(e,r[0],a.frame)}let o=await t.getBBoxes(i);if(!o.length)return w(),!1;let s=new XE;if(o.forEach(e=>s.union(e)),s.isEmpty())return w(),!1;let c=KXn(s);return T(c,r[0])},re=async(e,t={})=>{if(typeof e!=`string`||e.trim()===``)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] createSectionBoxOn(uuid) expects a non-empty string uuid.`);return ne([e],t)},ie=e.onPick(async({pickResult:e})=>{if(!s||!e)return;let{fragments:n,localId:r,normal:i}=e,a={[n.modelId]:new Set([r])},[o]=await t.modelIdMapToGuids(a);o&&await re(o,{normal:i?.clone?.()??null})&&(s=!1)}),ae=Ds(()=>a.localContext.loadedModels,()=>{w()}),oe={createSectionBoxOn:re,createSectionBoxOnSelection:ne,createSectionBoxFromBounds:T,clearSectionBox:w,enableSectionBox(){s=!0,e.highlightMaterial=eZn},disableSectionBox(){s=!1,e.highlightMaterial=null},get sectionBoxEnabled(){return s},showSectionBoxWidget(){if(!o){u=!0,d=!0;return}o?.show()},hideSectionBoxWidget(){if(!o){u=!1,d=!1;return}o?.hide()},get sectionBoxWidgetVisible(){return o?.widgetVisible??u},set sectionBoxWidgetVisible(e){if(typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxWidgetVisible must be a boolean.`);e?oe.showSectionBoxWidget():oe.hideSectionBoxWidget()},get sectionBoxOverlayVisible(){return o?.overlayVisible??d},set sectionBoxOverlayVisible(e){if(typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxOverlayVisible must be a boolean.`);if(!o){d=e;return}o.setOverlayVisible(e)},get sectionBox(){return g.value},toggleSectionBoxEdition(e){if(e!==void 0&&typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] toggleSectionBoxEdition(value) expects a boolean when provided.`);return c=e??!c,x.setHandleEditEnabled(),c},get sectionBoxEditEnabled(){return c},set sectionBoxEditEnabled(e){if(typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxEditEnabled must be a boolean.`);oe.toggleSectionBoxEdition(e)},toggleSectionBoxCaps(e){if(e!==void 0&&typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] toggleSectionBoxCaps(value) expects a boolean when provided.`);return l=e??!l,o&&S(),l},setSectionBoxCapsColor(e){v.setFillColor(e)},get sectionBoxCapsEnabled(){return l},set sectionBoxCapsEnabled(e){if(typeof e!=`boolean`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxCapsEnabled must be a boolean.`);l=e,o&&S()},get sectionBoxPlaneSizeMultiplier(){return f},set sectionBoxPlaneSizeMultiplier(e){if(typeof e!=`number`||!Number.isFinite(e)||e<=0)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxPlaneSizeMultiplier must be a positive number.`);f=e,o&&x.update(o.bounds)},get sectionBoxPlaneVisualState(){return{idle:{...p.idle},hovered:{...p.hovered}}},set sectionBoxPlaneVisualState(e){let t=e?.idle,n=e?.hovered;if(!t||!n)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxPlaneVisualState must define idle and hovered states.`);let r=(e,t)=>{let n=e?.color,r=e?.opacity;if(typeof n!=`number`||!Number.isFinite(n))throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] ${t}.color must be a number.`);if(typeof r!=`number`||!Number.isFinite(r))throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] ${t}.opacity must be a number.`);return{color:n,opacity:Math.max(0,Math.min(1,r))}};p={idle:r(t,`idle`),hovered:r(n,`hovered`)},o&&x.update(o.bounds)},get sectionBoxBounds(){return o?.getWorldBounds()??null},get sectionBoxPivotModifier(){return m},set sectionBoxPivotModifier(e){if(e!==`shiftKey`&&e!==`altKey`&&e!==`ctrlKey`&&e!==`metaKey`)throw TypeError(`[BIMDataViewer - 3D Fragments - section-box] sectionBoxPivotModifier must be one of: shiftKey, altKey, ctrlKey, metaKey.`);m=e}};return{destroy(){ae(),ie?.(),x.destroy(),v.destroy(),w()},extension:oe}}var pZn={COLOR:0,PEN:1,PEN_SHADOWS:2,COLOR_PEN:3,COLOR_SHADOWS:4,COLOR_PEN_SHADOWS:5};function mZn(e){let{world:t}=e,n=co(!1),r=co(!1),i=co(!1),a=!1,o=e=>{if(a||!e)return;let t;try{t=e.edgesPass}catch{return}!t.xray&&t._overrideMaterial&&(t._overrideMaterial.side=0),a=!0},s=()=>{if(!t.renderer)throw Error(`Renderer is not initialized yet.`);return t.renderer},c=()=>n.value&&r.value?pZn.COLOR_PEN_SHADOWS:n.value?pZn.COLOR_PEN:r.value?pZn.COLOR_SHADOWS:pZn.COLOR,l=()=>{let t=s().postproduction,a=c();if(!(n.value||r.value||i.value)){if(t.excludedObjectsEnabled=!1,!t.enabled){e.requestRender();return}t.style=a,e.requestRender();return}t.enabled=!0,o(t),t.smaaEnabled=i.value,t.excludedObjectsEnabled=r.value,t.edgesPass.color?.set&&t.edgesPass.color.set(0),t.edgesPass.width=1,t.edgesPass.depthBiasStrength=0,typeof t.aoPass.updateGtaoMaterial==`function`&&t.aoPass.updateGtaoMaterial(t.defaultAoParameters),t.style=a,e.requestRender()};return l(),{extension:{get postproductionEdgesEnabled(){return n.value},set postproductionEdgesEnabled(e){n.value=!!e,l()},get postproductionAmbientOcclusionEnabled(){return r.value},set postproductionAmbientOcclusionEnabled(e){r.value=!!e,l()},get postproductionSmaaEnabled(){return i.value},set postproductionSmaaEnabled(e){i.value=!!e,l()},get postproductionSettings(){return{edgesEnabled:n.value,ambientOcclusionEnabled:r.value,smaaEnabled:i.value}},setPostproductionSettings:(e={})=>{typeof e.edgesEnabled==`boolean`&&(n.value=e.edgesEnabled),typeof e.ambientOcclusionEnabled==`boolean`&&(r.value=e.ambientOcclusionEnabled),typeof e.smaaEnabled==`boolean`&&(i.value=e.smaaEnabled),l()}}}}var f6=1e-4,hZn=1e-4,gZn=({x:e,y:t,z:n})=>({x:-e,y:-t,z:-n}),_Zn=e=>{if(!Array.isArray(e)||e.length!==6)return null;let t={minX:null,maxX:null,minY:null,maxY:null,minZ:null,maxZ:null},n=e=>{let t=new L(e.x,e.y,e.z).normalize();return Math.abs(t.x-1)<=f6&&Math.abs(t.y)<=f6&&Math.abs(t.z)<=f6?`minX`:Math.abs(t.x+1)<=f6&&Math.abs(t.y)<=f6&&Math.abs(t.z)<=f6?`maxX`:Math.abs(t.y-1)<=f6&&Math.abs(t.x)<=f6&&Math.abs(t.z)<=f6?`minY`:Math.abs(t.y+1)<=f6&&Math.abs(t.x)<=f6&&Math.abs(t.z)<=f6?`maxY`:Math.abs(t.z-1)<=f6&&Math.abs(t.x)<=f6&&Math.abs(t.y)<=f6?`minZ`:Math.abs(t.z+1)<=f6&&Math.abs(t.x)<=f6&&Math.abs(t.y)<=f6?`maxZ`:null};for(let r of e){let e=n(r.direction);if(!e||t[e]!==null)return null;e===`minX`||e===`maxX`?t[e]=r.location.x:e===`minY`||e===`maxY`?t[e]=r.location.y:t[e]=r.location.z}let{minX:r,maxX:i,minY:a,maxY:o,minZ:s,maxZ:c}=t;return[r,i,a,o,s,c].some(e=>e===null)||r>=i-f6||a>=o-f6||s>=c-f6?null:new XE(new L(r,a,s),new L(i,o,c))},vZn=e=>{if(!Array.isArray(e)||e.length!==6)return null;let t=e.map(({location:e,direction:t})=>{let n=new L(t.x,t.y,t.z).normalize(),r=new L(e.x,e.y,e.z);return new PD().setFromNormalAndCoplanarPoint(n,r)}),n=[,,,,,,].fill(!1),r=[];for(let e=0;e<6;e++){if(n[e])continue;let i=!1;for(let a=e+1;a<6;a++)if(!n[a]&&t[e].normal.dot(t[a].normal)<-.9999){r.push([t[e],t[a]]),n[e]=!0,n[a]=!0,i=!0;break}if(!i)return null}if(r.length!==3)return null;let i=r.map(([e])=>e.normal.clone());for(let e=0;e<3;e++)for(let t=e+1;t<3;t++)if(Math.abs(i[e].dot(i[t]))>hZn*10)return null;let a=[[0,1,2],[0,2,1],[1,0,2],[1,2,0],[2,0,1],[2,1,0]],o=null;for(let[e,t,n]of a)if(i[e].clone().cross(i[t]).dot(i[n])>1-hZn*10){o=[e,t,n];break}if(!o)return null;let[s,c,l]=o,u=i[s].clone(),d=i[c].clone(),f=i[l].clone(),[p,m]=r[s],[h,g]=r[c],[_,v]=r[l],y=(-p.constant+m.constant)/2,b=(-h.constant+g.constant)/2,x=(-_.constant+v.constant)/2,S=new L().addScaledVector(u,y).addScaledVector(d,b).addScaledVector(f,x),C=new OE().makeBasis(u,d,f).setPosition(S),w=(p.constant+m.constant)/2,T=(h.constant+g.constant)/2,E=(_.constant+v.constant)/2;return w<f6||T<f6||E<f6?null:{bounds:new XE(new L(-Math.abs(w),-Math.abs(T),-Math.abs(E)),new L(Math.abs(w),Math.abs(T),Math.abs(E))),frame:C}},yZn=e=>{e.clearSectionBox?.(),e.sectionPlanes.slice().forEach(t=>{e.deleteSectionPlane?.(t)})},bZn=async({fragments:e,clippingPlanes:t,toYup:n})=>{if(!Array.isArray(t)||t.length===0)return;e.widgetsVisible=!1,e.sectionBoxOverlayVisible=!1;let r=t.map(e=>({location:n(e.location),direction:gZn(n(e.direction))})),i=_Zn(r);if(i){e.createSectionBoxFromBounds?.(i,`viewpoint-section-box`),e.sectionBoxOverlayVisible=!1;return}let a=vZn(r);if(a){e.createSectionBoxFromBounds?.(a.bounds,`viewpoint-section-box`,a.frame),e.sectionBoxOverlayVisible=!1;return}for(let t of r)await e.addSectionPlane({point:new L(t.location.x,t.location.y,t.location.z),normal:new L(t.direction.x,t.direction.y,t.direction.z)});e.widgetsVisible=!1};function xZn(e){let{components:t,world:n,OBC:r,$viewer:i}=e,a=t.get(r.Viewpoints);a.world=n;let o=e=>{let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)},s=({x:e,y:t,z:n})=>({x:e,y:-n,z:t}),c=({x:e,y:t,z:n})=>({x:e,y:n,z:-t}),l=({x:e,y:t,z:n})=>({x:-e,y:-t,z:-n}),u=()=>i.localContext.pluginComponentInstances.get(`viewer3d-fragments-parameters`),d=()=>{let e=u();return e&&typeof e.ifcSpaces==`boolean`?e.ifcSpaces:!0},f=async()=>{let t={},n=p();for(let[r,i]of e.fragments.list.entries()){let e=Number(r);if(!n.has(e)&&!n.has(r))continue;let{IFCSPACE:a}=await i.getItemsOfCategories([/IFCSPACE/]);a?.length&&(t[r]=a)}return t},p=()=>new Set(i.localContext.loadedModelIds),m=()=>{let e=p();return i.state.objects.filter(t=>e.has(t.model?.id))},h=e=>Array.from(new Set(e.map(e=>e.uuid).filter(Boolean))),g=e=>{let t=e.filter(e=>!!e.uuid),n=new Set(h(t.filter(e=>e.visible))),r=h(t.filter(e=>!e.visible));return n.size<r.length?{default_visibility:!1,exceptions:Array.from(n).map(e=>({ifc_guid:e,authoring_tool_id:null}))}:{default_visibility:!0,exceptions:r.map(e=>({ifc_guid:e,authoring_tool_id:null}))}};return{extension:{getViewpoint:async()=>{let t=a.create();t.title=`My Viewpoint`,await t.updateCamera();let r=t.toJSON(),i=m(),o=h(i.filter(e=>e.selected)),c=g(i),u=r.components?.visibility?.view_setup_hints;if(r.components={...r.components??{},selection:o.map(e=>({ifc_guid:e,authoring_tool_id:null})),visibility:{...c,view_setup_hints:{...u??{},spaces_visible:d()}}},r.perspective_camera&&(r.perspective_camera.camera_view_point=s(r.perspective_camera.camera_view_point),r.perspective_camera.camera_direction=s(r.perspective_camera.camera_direction),r.perspective_camera.camera_up_vector=s(r.perspective_camera.camera_up_vector)),r.orthogonal_camera){r.orthogonal_camera.camera_view_point=s(r.orthogonal_camera.camera_view_point),r.orthogonal_camera.camera_direction=s(r.orthogonal_camera.camera_direction),r.orthogonal_camera.camera_up_vector=s(r.orthogonal_camera.camera_up_vector);let e=n.camera.threeOrtho;e.zoom&&e.zoom!==1&&(r.orthogonal_camera.view_to_world_scale=(e.top-e.bottom)/e.zoom)}let f=e,_=f.sectionPlanes.some(e=>e.shown),v=!!f.sectionBox?.shown;if(_||v){let e=[];if(v){let t=f.sectionBox;e.push(...t.planes)}else e.push(...f.sectionPlanes.filter(e=>e.shown));r.clipping_planes=e.map(e=>({location:s(e.location),direction:l(s(e.direction))}))}return r.originating_system=`ifc3d`,r.models=Array.from(p()),r},setViewpoint:async t=>{t=JSON.parse(JSON.stringify(t)),t.perspective_camera&&(t.perspective_camera.camera_view_point=c(t.perspective_camera.camera_view_point),t.perspective_camera.camera_direction=c(t.perspective_camera.camera_direction),t.perspective_camera.camera_up_vector=c(t.perspective_camera.camera_up_vector)),t.orthogonal_camera&&(t.orthogonal_camera.camera_view_point=c(t.orthogonal_camera.camera_view_point),t.orthogonal_camera.camera_direction=c(t.orthogonal_camera.camera_direction),t.orthogonal_camera.camera_up_vector=c(t.orthogonal_camera.camera_up_vector));let r=e;yZn(r),await bZn({fragments:r,clippingPlanes:t.clipping_planes,toYup:c});let o=a.create(t);if(await n.camera.controls.setFocalOffset(0,0,0),await o.go({transition:!1}),t.orthogonal_camera?.view_to_world_scale!=null){let e=n.camera.threeOrtho,r=t.orthogonal_camera.view_to_world_scale,i=e.top-e.bottom;if(r>0&&i>0){let e=i/r;Number.isFinite(e)&&e>0&&await n.camera.controls.zoomTo(e,!1)}}try{let e=await n.camera.getItemsBounding();n.camera.controls.setOrbitPoint(e.center.x,e.center.y,e.center.z)}catch{n.camera.controls.setOrbitPoint(0,0,0)}if(IMt(i,t),t.components?.visibility?.view_setup_hints?.spaces_visible===!1){let t=await f();Object.keys(t).length>0&&await e.hide(t)}},getSnapshot:async()=>{let e=a.create();await e.takeSnapshot();let t=a.snapshots.get(e.snapshot);return{snapshot_type:`png`,snapshot_data:`data:image/png;base64,${o(t)}`}}},destroy(){}}}function SZn(e){let{components:t,world:n,$viewer:r,OBC:i}=e,a=t.get(i.Raycasters).get(n),o=n.renderer.three.domElement,s=null,c=async e=>{e.preventDefault(),e.stopPropagation();let t=await a.castRay();if(!t)return;let n=t.point.x,i=t.point.z,o=t.point.y,c=await t.fragments.getGuidsByLocalIds([t.localId]),l=r.state.getObjectsByUuids(c)[0],u=r.localContext.loadedModels;s({x:n,y:i,z:o,object:l,models:u})},l=co(!1),u=t=>{if(!t||typeof t!=`function`)throw TypeError(`[BIMDataViewer - Viewer3DFragments - Annotation] A callback function must be provided to start annotation mode.`);d(),l.value=!0,s=t,e.selectOnClick=!1,o.addEventListener(`pointerdown`,c),o.style.cursor=`add`},d=()=>{l.value=!1,s=null,e.selectOnClick=!0,o.removeEventListener(`pointerdown`,c),o.style.cursor=`default`};return{extension:{get annotationMode(){return l.value},startAnnotationMode:u,stopAnnotationMode:d},destroy(){d()}}}var CZn=[`POINT`,`LINE`,`FACE`],wZn={POINT:0,LINE:1,FACE:2},TZn={0:`POINT`,1:`LINE`,2:`FACE`},EZn={POINT:`vertex`,LINE:`edge`,FACE:`surface`,NONE:`noSurface`},p6=e=>`#${e.getHexString()}`,m6=e=>new VE(e),h6=(e,t,n=new L)=>n.copy(e).sub(t),DZn=(e,t=null)=>{let n=new L;if(e?.face?.normal&&e?.object){n.copy(e.face.normal);let t=e.object.matrixWorld;if(e.instanceId!=null&&e.object.isInstancedMesh){let n=new OE;e.object.getMatrixAt(e.instanceId,n),t=new OE().multiplyMatrices(e.object.matrixWorld,n)}let r=new yE().getNormalMatrix(t);return n.applyMatrix3(r).normalize(),n}return e?.normal?.isVector3&&e.normal.lengthSq()>1e-12?(n.copy(e.normal).normalize(),n):t?(t.getWorldDirection(n).negate().normalize(),n):new L(0,1,0)},OZn=(e,t,n)=>{let r=e.clone().project(t),i=n.getBoundingClientRect();return{x:(r.x+1)*.5*i.width,y:(1-(r.y+1)*.5)*i.height}},kZn=(e,t)=>{let n=t.getBoundingClientRect();return{x:(e.clientX-n.left)/n.width*2-1,y:-((e.clientY-n.top)/n.height)*2+1}},g6=(...e)=>Array.from(new Set(e.filter(Boolean).map(String))),AZn=(e,t,n=1e6)=>{let r=[],i=new Map,a=e=>Math.round(e*n),o=e=>`${a(e.x)}:${a(e.y)}:${a(e.z)}`,s=new Map;e.forEach((e,t)=>{let n=o(e);if(!i.has(n)){let t=r.length;i.set(n,t),r.push(e.clone())}s.set(t,i.get(n))});let c=t.map(e=>s.get(e)).filter(e=>Number.isInteger(e)),l=Math.floor(c.length/3);return{vertices:r,indices:c.slice(0,l*3)}},jZn=(e,t)=>{let n=new Map,r=(e,t)=>{if(e===t)return;let r=`${Math.min(e,t)}:${Math.max(e,t)}`,i=n.get(r);if(!i){n.set(r,{a:e,b:t,count:1});return}i.count+=1};for(let e=0;e+2<t.length;e+=3){let n=t[e],i=t[e+1],a=t[e+2];r(n,i),r(i,a),r(a,n)}return Array.from(n.values()).filter(e=>e.count===1).map(t=>[e[t.a],e[t.b]])},MZn=(e,t,{eps:n=1e-6,orthogonalityDeg:r=60}={})=>{if(!Array.isArray(t)||t.length<2)return null;let i=[];for(let[r,a]of t){if(!r||!a)continue;let t=a.clone().sub(r),o=t.clone().sub(e.clone().multiplyScalar(t.dot(e))),s=o.length();s<=n||i.push({dir:o.multiplyScalar(1/s),length:s})}if(i.length<2)return null;let a=null,o=-1/0;for(let e of i){let t=0;for(let n of i)t+=n.length*Math.abs(e.dir.dot(n.dir));t>o&&(o=t,a=e.dir)}if(!a)return null;let s=Math.cos(gE.degToRad(r)),c=0;for(let e of i)Math.abs(a.dot(e.dir))<=s&&(c+=e.length);return c<=n?null:a.clone().normalize()},NZn=class{constructor({components:e,world:t,OBC:n,requestRender:r}){let i=e.get(n.Raycasters);this.caster=i.get(t),this.world=t,this.requestRender=r}async pickFromEvent(e){let t=kZn(e,this.world.renderer.three.domElement);return this.pickAtPosition(t)}async pickAtPosition(e){let t=CZn.map(e=>wZn[e]).filter(e=>Number.isInteger(e)),n=await this.caster.castRay({position:e,snappingClasses:t});if(!n)return null;let r=TZn[n.snappingClass]??this.#e(n)??`NONE`,i=this.world.camera.three,a=this.world.renderer.three.domElement;return{hit:n,snapName:r,point:n.point.clone(),normal:DZn(n,i),screen:OZn(n.point,i,a),modelId:n.fragments?.modelId??null}}#e(e){return e?.snappedEdgeP1&&e?.snappedEdgeP2?`LINE`:Array.isArray(e?.facePoints)&&e.facePoints.length>=9?`FACE`:null}requestFrame(){this.requestRender()}},PZn={pointer:XNt,vertex:qNt,edge:KNt,surface:JNt,noSurface:YNt},FZn=class{constructor(e){this.domElement=e,this.cursorMode=`overlay`,this.cursorStyle=`url("${XNt}") 16 16, auto`;let t=document.createElement(`img`);t.style.width=`28px`,t.style.height=`28px`,t.style.position=`absolute`,t.style.pointerEvents=`none`,t.style.transform=`translate(-50%, -50%)`,t.style.display=`none`,e.parentNode.insertBefore(t,e),this.img=t,this.visible=!1}show(){this.img.style.display=this.cursorMode===`crosshair`?`none`:`block`,this.domElement.style.cursor=this.cursorStyle,this.visible=!0}hide(){this.img.style.display=`none`,this.domElement.style.cursor=`default`,this.visible=!1}useCrosshairCursor(){this.cursorMode=`crosshair`,this.cursorStyle=`crosshair`,this.visible&&(this.img.style.display=`none`,this.domElement.style.cursor=this.cursorStyle)}useOverlayCursor(){this.cursorMode=`overlay`,this.cursorStyle=`url("${XNt}") 16 16, auto`,this.visible&&(this.img.style.display=`block`,this.domElement.style.cursor=this.cursorStyle)}update(e){if(!this.visible)return;if(this.cursorMode===`crosshair`){this.img.style.display=`none`;return}if(!e){this.img.style.left=`-9999px`,this.img.style.top=`-9999px`,this.img.src=YNt;return}let t=PZn[PZn[EZn[e.snapName]]?EZn[e.snapName]:`noSurface`];this.img.src=t,this.img.style.left=`${e.screen.x}px`,this.img.style.top=`${e.screen.y}px`}destroy(){this.hide(),this.img.remove()}},IZn=1e-8,LZn=new L(1,0,0),RZn=new L(0,1,0),zZn=new L(0,0,1),_6=e=>e?.isVector3&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z),v6=(e,t)=>!_6(e)||e.lengthSq()<=IZn?t.clone():e.clone().normalize(),BZn=(e,t)=>{let n=new L().crossVectors(t,e);if(!_6(n)||n.lengthSq()<=IZn){let t=Math.abs(RZn.dot(e))>.98?LZn:RZn;n=new L().crossVectors(t,e)}return v6(n,zZn)},y6=({tip:e,inwardDirection:t,planeNormal:n,arrowLength:r,minArrowLength:i=.01,diagonalBlend:a=.85})=>{if(!_6(e))return[];let o=v6(t,LZn),s=BZn(o,v6(n,RZn)),c=Math.max(Number.isFinite(r)?r:0,i),l=e.clone().add(s.clone().multiplyScalar(c)),u=e.clone().add(s.clone().multiplyScalar(-c)),d=v6(o.clone().add(s.clone().multiplyScalar(a)),o),f=v6(o.clone().add(s.clone().multiplyScalar(-a)),o),p=e.clone().add(d.multiplyScalar(c*Math.SQRT2)),m=e.clone().add(f.multiplyScalar(c*Math.SQRT2)),h=[e.clone(),l,e.clone(),u,e.clone(),p,e.clone(),m];return h.every(_6)?h:[]},VZn=e=>!Array.isArray(e)||e.length===0||e.length%2!=0?!1:e.every(_6),HZn=(e,t={})=>{let n=document.createElement(`canvas`),r=n.getContext(`2d`),{strokeColor:i=null,strokeWidth:a=0}=t;r.font=`700 120px Arial`;let o=r.measureText(e),s=Math.max(256,Math.ceil(o.width+32));n.width=s,n.height=256,r.font=`700 120px Arial`,r.textAlign=`center`,r.textBaseline=`middle`,r.clearRect(0,0,s,256),i&&a>0&&(r.lineJoin=`round`,r.strokeStyle=i,r.lineWidth=a,r.strokeText(e,s/2,256/2)),r.fillStyle=`rgba(255, 255, 255, 1)`,r.fillText(e,s/2,256/2);let c=new _Rt(n);return c.colorSpace=YT,c.needsUpdate=!0,c.minFilter=NT,c.magFilter=NT,{texture:c,aspect:s/256}},b6=({content:e,size:t,color:n,strokeColor:r,strokeWidth:i})=>{let a=new zE,{texture:o,aspect:s}=HZn(e,{strokeColor:r,strokeWidth:i}),c=new fO(Math.max(t*2.2,t*1.2*s),t*1.2),l=Math.max(t*.015,.001),u=()=>new ED({map:o,color:n,side:0,transparent:!0,depthTest:!0,depthWrite:!1,alphaTest:.15}),d=new OD(c,u());d.position.z=l;let f=new OD(c.clone(),u());return f.rotateY(Math.PI),f.position.z=-l,a.add(d,f),a.renderOrder=15,a},x6=({group:e,direction:t,up:n,normal:r,position:i})=>{let a=new OE().makeBasis(t.clone().normalize(),n.clone().normalize(),r.clone().normalize());e.quaternion.setFromRotationMatrix(a),e.position.copy(i)},UZn=new L(0,1,0),WZn=new L(0,0,0),GZn=class{constructor(e,t,n,r=[]){this.plugin=e,this.group=new zE,this.material=new rW({color:m6(e.defaultColor),linewidth:e.lineWidth,depthTest:!0,depthWrite:!1,transparent:!1}),this.#e(),this.geometry=new nW,this.line=new dW(this.geometry,this.material),this.line.visible=!1,this.line.renderOrder=10,this.group.add(this.line),this._p1=t.clone(),this._p2=t.clone(),this._startNormal=n.clone().normalize(),this._currentNormal=n.clone().normalize(),this._length=0,this._visible=!0,this._text=null,this.modelIds=g6(...r),this.group.position.copy(this._p1),(this.plugin.overlayScene||this.plugin.world.scene.three).add(this.group)}move(e,t){this._p2.copy(e),this._currentNormal.copy(t).normalize();let n=this._p1,r=WZn,i=h6(this._p2,n);this.group.position.copy(n);let a=new L().subVectors(this._p2,this._p1),o=a.length();if(this._length=o,o<=1e-6){this.line.visible=!1,this.#n();return}this.#e();let s=a.clone().normalize(),c=s.clone().negate(),l=Math.abs(s.dot(UZn))>.9,u=Math.max(o*(l?.08:.05),.03),d=this._startNormal.clone().normalize(),f=new L().crossVectors(d,s).normalize();if(f.lengthSq()<=1e-8){let e=new L;this.plugin.world.camera.three.getWorldDirection(e),f=new L().crossVectors(s,e).normalize()}let p=UZn.clone().sub(s.clone().multiplyScalar(UZn.dot(s)));p.lengthSq()>1e-8&&f.dot(p)<0&&f.negate();let m=o*this.plugin.arrowSizeRatio,h=d.clone().multiplyScalar(this.plugin.surfaceOffset),g=y6({tip:r,inwardDirection:s,planeNormal:d,arrowLength:m}).map(e=>e.clone().add(h)),_=y6({tip:i,inwardDirection:c,planeNormal:d,arrowLength:m}).map(e=>e.clone().add(h)),v=[r.clone().add(h),i.clone().add(h),...g,..._];if(!VZn(v)){this.line.visible=!1,this.#n();return}let y=[];v.forEach(e=>{y.push(e.x,e.y,e.z)}),this.geometry.setPositions(y),this.line.visible=!0;let b=i.clone().multiplyScalar(.5).add(h),x=f.clone().sub(s.clone().multiplyScalar(f.dot(s)));x.lengthSq()<=1e-8&&(x=f.clone()),x.normalize();let S=new L().crossVectors(s,x).normalize();S.dot(d)<0&&(S.negate(),x=new L().crossVectors(S,s).normalize());let C=b.clone().add(x.clone().multiplyScalar(u));this.#t(`${o.toFixed(2)} m`,o,s,x,S,C)}#e(){let e=this.plugin.world.renderer.three.domElement;this.material.resolution.set(e.clientWidth,e.clientHeight)}#t(e,t,n,r,i,a){this.#n();let o=Math.max(.04,t*this.plugin.textSizeRatio);this._text=b6({content:e,size:o,color:this.material.color}),x6({group:this._text,direction:n,up:r,normal:i,position:a}),this.group.add(this._text)}#n(){this._text&&=(this.group.remove(this._text),this._text.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.dispose())}),null)}destroy(){this.#n(),this.geometry.dispose(),this.material.dispose(),this.group.removeFromParent(),this.plugin.measurements=this.plugin.measurements.filter(e=>e!==this),this.plugin.fragmentsInstance.requestRender()}get length(){return this.visible?this._length:0}get visible(){return this._visible}set visible(e){this._visible=!!e,this.group.visible=this._visible}get color(){return p6(this.material.color)}set color(e=this.plugin.defaultColor){let t=m6(e);this.material.color.copy(t),this._text&&this._text.traverse(e=>{e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.color?.copy(t))})}},KZn=class{constructor(e,t,n,r={}){this.fragmentsInstance=e,this.world=e.world,this.overlayScene=e.overlayScene,this.snapPicker=t,this.cursorOverlay=n,this.arrowSizeRatio=r.arrowSizeRatio??.04,this.lineWidth=r.lineWidth??2,this.textSizeRatio=r.textSizeRatio??.1,this.offsetRatio=r.offsetRatio??.003,this.surfaceOffset=r.surfaceOffset??.003,this.defaultColor=r.defaultColor??`#ffffff`,this.measurements=[],this.measurementEndCallbacks={},this.measurementEndCallbackId=0,this.control=new qZn(this)}on(e,t){if(e===`measurementEnd`)return this.measurementEndCallbacks[this.measurementEndCallbackId++]=t,this.measurementEndCallbackId}off(e){this.measurementEndCallbacks[e]=null}destroy(){this.control.deactivate(),this.control.destroy(),this.measurements.slice().forEach(e=>e.destroy()),this.measurements.length=0}},qZn=class{constructor(e){this.plugin=e,this.currentMeasurement=null,this.lastSnap=null,this.mouseDown=!1,this.dragging=!1,this.activated=!1,this.onPointerMove=this.onPointerMove.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerUp=this.onPointerUp.bind(this)}async onPointerMove(e){e.preventDefault(),this.mouseDown&&(this.dragging=!0),this.lastSnap=await this.plugin.snapPicker.pickFromEvent(e),this.plugin.cursorOverlay.update(this.lastSnap),this.currentMeasurement&&this.lastSnap&&(this.currentMeasurement.move(this.lastSnap.point,this.lastSnap.normal),this.plugin.snapPicker.requestFrame())}onPointerDown(e){e.button===0&&(this.mouseDown=!0)}onPointerUp(e){if(e.button!==0)return;this.mouseDown=!1;let t=this.dragging;if(this.dragging=!1,!(t||!this.lastSnap)){if(this.currentMeasurement){this.currentMeasurement.move(this.lastSnap.point,this.lastSnap.normal),this.plugin.measurements.push(this.currentMeasurement),Object.values(this.plugin.measurementEndCallbacks).forEach(e=>{e?.(this.currentMeasurement)}),this.currentMeasurement=null;return}this.currentMeasurement=new GZn(this.plugin,this.lastSnap.point,this.lastSnap.normal,[this.lastSnap.modelId])}}activate(){if(this.activated)return;let e=this.plugin.world.renderer.three.domElement;this.plugin.cursorOverlay.show(),e.addEventListener(`pointermove`,this.onPointerMove),e.addEventListener(`pointerdown`,this.onPointerDown),document.addEventListener(`pointerup`,this.onPointerUp),this.activated=!0}deactivate(){if(!this.activated)return;let e=this.plugin.world.renderer.three.domElement;e.removeEventListener(`pointermove`,this.onPointerMove),e.removeEventListener(`pointerdown`,this.onPointerDown),document.removeEventListener(`pointerup`,this.onPointerUp),this.currentMeasurement?.destroy(),this.currentMeasurement=null,this.lastSnap=null,this.dragging=!1,this.mouseDown=!1,this.plugin.cursorOverlay.hide(),this.activated=!1}destroy(){}},JZn=new L(0,0,0),YZn=class{constructor(e,t,n,r,i=[],a=null){this.plugin=e,this.group=new zE,this.linesMaterial=new rW({color:m6(e.defaultColor),linewidth:e.lineWidth,depthTest:!0,depthWrite:!1,transparent:!1}),this.arcMaterial=this.linesMaterial.clone(),this.#n(),this.lineGeometry=new nW,this.arcGeometry=new _Qt,this.lines=new dW(this.lineGeometry,this.linesMaterial),this.arc=new vQt(this.arcGeometry,this.arcMaterial),this.lines.visible=!1,this.arc.visible=!1,this.group.add(this.lines,this.arc),this._p1=t.clone(),this._p2=n.clone(),this._p3=r.clone(),this._normalHint=a?.clone?.().normalize?.()||null,this._angle=0,this._visible=!0,this._text=null,this.modelIds=g6(...i),this.group.position.copy(this._p2),(this.plugin.overlayScene||this.plugin.world.scene.three).add(this.group),this.update(t,n,r,a)}update(e,t,n,r=null){this._p1.copy(e),this._p2.copy(t),this._p3.copy(n),r?.isVector3&&(this._normalHint=r.clone().normalize());let i=this._p2,a=h6(this._p1,i),o=JZn,s=h6(this._p3,i);this.group.position.copy(i);let c=a.clone().sub(o),l=s.clone().sub(o);this.#n();let u=this._normalHint?.isVector3?this._normalHint.clone().normalize():new L(0,1,0);if(c.lengthSq()>1e-6&&l.lengthSq()<=1e-6){this._angle=0,this.arc.visible=!1;let e=c.length()*this.plugin.arrowSizeRatio,t=c.clone().normalize(),n=u.lengthSq()>1e-8?u:new L(0,1,0);this.#t([o,a,...y6({tip:a,inwardDirection:t.clone().negate(),planeNormal:n,arrowLength:e})]),this.#r();return}if(c.lengthSq()<=1e-6||l.lengthSq()<=1e-6){this._angle=0,this.lines.visible=!1,this.arc.visible=!1,this.#r();return}let d=c.clone().normalize(),f=l.clone().normalize(),p=d.angleTo(f);this._angle=gE.radToDeg(p);let m=new L().crossVectors(d,f),h=m.lengthSq()>1e-8?m.clone().normalize():u;h.lengthSq()<=1e-8&&(h=new L(0,1,0)),d.clone().applyAxisAngle(h,p).dot(f)<.999&&(h=h.clone().negate());let g=(u.lengthSq()>1e-8?u:h).clone().multiplyScalar(this.plugin.surfaceOffset),_=c.length(),v=l.length(),y=_*this.plugin.arrowSizeRatio,b=v*this.plugin.arrowSizeRatio,x=[o.clone().add(g),a.clone().add(g),o.clone().add(g),s.clone().add(g),...y6({tip:a,inwardDirection:d.clone().negate(),planeNormal:h,arrowLength:y}).map(e=>e.clone().add(g)),...y6({tip:s,inwardDirection:f.clone().negate(),planeNormal:h,arrowLength:b}).map(e=>e.clone().add(g))];this.#t(x);let S=Math.min(c.length(),l.length())*.35;if(m.lengthSq()<=1e-8){this.arc.visible=!1,this.#r();return}let C=[];for(let e=0;e<=24;e++){let t=e/24*p,n=d.clone().applyAxisAngle(h,t);C.push(o.clone().add(n.multiplyScalar(S)).add(g))}this.arcGeometry.setPositions(C.flatMap(e=>[e.x,e.y,e.z])),this.arc.visible=!0;let w=d.clone().applyAxisAngle(h,p*.5),T=o.clone().add(w.multiplyScalar(S*1.45)).add(g),E=h.clone().cross(w).normalize();this.#e(`${this._angle.toFixed(2)}°`,S,w,E,h,T)}#e(e,t,n,r,i,a){this.#r(),this._text=b6({content:e,size:Math.max(t*this.plugin.textSizeRatio,.03),color:this.linesMaterial.color}),x6({group:this._text,direction:n,up:r,normal:i,position:a}),this.group.add(this._text)}#t(e){if(!VZn(e)){this.lines.visible=!1;return}let t=e.flatMap(e=>[e.x,e.y,e.z]);this.lineGeometry.setPositions(t),this.lines.visible=t.length>0}#n(){let e=this.plugin.world.renderer.three.domElement;this.linesMaterial.resolution.set(e.clientWidth,e.clientHeight),this.arcMaterial.resolution.set(e.clientWidth,e.clientHeight)}#r(){this._text&&=(this.group.remove(this._text),this._text.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.dispose())}),null)}destroy(){this.#r(),this.lineGeometry.dispose(),this.arcGeometry.dispose(),this.linesMaterial.dispose(),this.arcMaterial.dispose(),this.group.removeFromParent(),this.plugin.measurements=this.plugin.measurements.filter(e=>e!==this),this.plugin.fragmentsInstance.requestRender()}get angle(){return this.visible?this._angle:0}get visible(){return this._visible}set visible(e){this._visible=!!e,this.group.visible=this._visible}get color(){return p6(this.linesMaterial.color)}set color(e=this.plugin.defaultColor){let t=m6(e);this.linesMaterial.color.copy(t),this.arcMaterial.color.copy(t),this._text&&this._text.traverse(e=>{e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.color?.copy(t))})}},XZn=class{constructor(e,t,n,r={}){this.fragmentsInstance=e,this.world=e.world,this.overlayScene=e.overlayScene,this.snapPicker=t,this.cursorOverlay=n,this.textSizeRatio=r.textSizeRatio??.28,this.arrowSizeRatio=r.arrowSizeRatio??.04,this.lineWidth=r.lineWidth??2,this.surfaceOffset=r.surfaceOffset??.003,this.defaultColor=r.defaultColor??`#ffffff`,this.measurements=[],this.measurementEndCallbacks={},this.measurementEndCallbackId=0,this.control=new ZZn(this)}on(e,t){if(e===`measurementEnd`)return this.measurementEndCallbacks[this.measurementEndCallbackId++]=t,this.measurementEndCallbackId}off(e){this.measurementEndCallbacks[e]=null}destroy(){this.control.deactivate(),this.control.destroy(),this.measurements.slice().forEach(e=>e.destroy()),this.measurements.length=0}},ZZn=class{constructor(e){this.plugin=e,this.points=[],this.normals=[],this.modelIds=[],this.previewMeasurement=null,this.lastSnap=null,this.mouseDown=!1,this.dragging=!1,this.activated=!1,this.onPointerMove=this.onPointerMove.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerUp=this.onPointerUp.bind(this)}async onPointerMove(e){e.preventDefault(),this.mouseDown&&(this.dragging=!0),this.lastSnap=await this.plugin.snapPicker.pickFromEvent(e),this.plugin.cursorOverlay.update(this.lastSnap),!(!this.lastSnap||this.points.length===0)&&(this.points.length===1?this.#e(this.points[0],this.lastSnap.point,this.lastSnap.point):this.points.length===2&&this.#e(this.points[0],this.points[1],this.lastSnap.point),this.plugin.snapPicker.requestFrame())}onPointerDown(e){e.button===0&&(this.mouseDown=!0)}onPointerUp(e){if(e.button!==0)return;this.mouseDown=!1;let t=this.dragging;if(this.dragging=!1,t||!this.lastSnap||(this.points.push(this.lastSnap.point.clone()),this.normals.push(this.lastSnap.normal.clone()),this.modelIds.push(this.lastSnap.modelId),this.points.length<3))return;this.previewMeasurement?.destroy(),this.previewMeasurement=null;let n=new YZn(this.plugin,this.points[0],this.points[1],this.points[2],this.modelIds,this.normals[1]||this.normals[0]||this.lastSnap.normal);this.plugin.measurements.push(n),Object.values(this.plugin.measurementEndCallbacks).forEach(e=>{e?.(n)}),this.points=[],this.normals=[],this.modelIds=[]}#e(e,t,n){let r=this.points.length===1?this.lastSnap?.normal||this.normals[0]:this.normals[1]||this.normals[0]||this.lastSnap?.normal;if(!this.previewMeasurement){this.previewMeasurement=new YZn(this.plugin,e,t,n,this.modelIds,r);return}this.previewMeasurement.update(e,t,n,r)}activate(){if(this.activated)return;let e=this.plugin.world.renderer.three.domElement;this.plugin.cursorOverlay.show(),e.addEventListener(`pointermove`,this.onPointerMove),e.addEventListener(`pointerdown`,this.onPointerDown),document.addEventListener(`pointerup`,this.onPointerUp),this.activated=!0}deactivate(){if(!this.activated)return;let e=this.plugin.world.renderer.three.domElement;e.removeEventListener(`pointermove`,this.onPointerMove),e.removeEventListener(`pointerdown`,this.onPointerDown),document.removeEventListener(`pointerup`,this.onPointerUp),this.previewMeasurement?.destroy(),this.previewMeasurement=null,this.points=[],this.normals=[],this.modelIds=[],this.lastSnap=null,this.mouseDown=!1,this.dragging=!1,this.plugin.cursorOverlay.hide(),this.activated=!1}destroy(){}},QZn=new L(0,0,0),$Zn=new L(0,1,0),eQn=.9,tQn=class{constructor(e,t){this.plugin=e,this.group=new zE,this.material=new WD({color:m6(e.defaultColor),depthTest:!1,transparent:!0}),this.sphereMaterial=new ED({color:m6(e.defaultColor),depthTest:!1,transparent:!0}),this.sphereGeometry=new pO(.03,12,12),this.fromSphere=new OD(this.sphereGeometry,this.sphereMaterial),this.toSphere=new OD(this.sphereGeometry,this.sphereMaterial),this.lineGeometry=new yD,this.line=new KD(this.lineGeometry,this.material),this.fromSphere.raycast=()=>{},this.toSphere.raycast=()=>{},this.line.raycast=()=>{},this.toSphere.visible=!1,this.line.visible=!1,this.group.add(this.fromSphere,this.toSphere,this.line),this._length=0,this._visible=!0,this._text=null,this._textContent=null,this._localTo=null,this._isVertical=!1,this._consecutiveMisses=0,this._showRequestId=0,this._destroyed=!1,this.modelIds=g6(t.modelId),this.group.position.copy(t.point),this.plugin.world.scene.three.add(this.group),this._onCameraUpdate=()=>{this._isVertical&&this.#n()},this._cameraControls=this.plugin.world.camera.controls??null,this._cameraControls?.addEventListener?.(`update`,this._onCameraUpdate)}async show(e,t=()=>!0){let n=++this._showRequestId,r=e.point.clone(),i=e.normal.clone().normalize(),a=this.plugin.world.camera.three.position.clone().sub(r);i.dot(a)<0&&i.negate();let o=await this.plugin.castNormalRay(r,i,e.hit);if(n!==this._showRequestId||this._destroyed||!t())return;if(!o){this._consecutiveMisses+=1,this._consecutiveMisses>=2&&(this.#e(),this.plugin.fragmentsInstance.requestRender());return}this._consecutiveMisses=0,this.modelIds=g6(e.modelId,o.fragments?.modelId),this.group.position.copy(r),this.fromSphere.position.copy(QZn);let s=h6(o.point,r);this._localTo=s.clone(),this._length=s.length(),this.toSphere.position.copy(s),this.lineGeometry.setFromPoints([QZn,s]),this.toSphere.visible=!0,this.line.visible=!0,this.#t(),this.plugin.fragmentsInstance.requestRender()}#e(){this._length=0,this._localTo=null,this.toSphere.visible=!1,this.line.visible=!1,this.#a()}#t(){let e=`${this._length.toFixed(2)} m`;e!==this._textContent&&(this.#a(),this._text=b6({content:e,size:Math.max(.04,this._length*this.plugin.textSizeRatio),color:this.material.color}),this._textContent=e,this.group.add(this._text)),this.#n()}#n(){if(!this._text||!this._localTo)return;let e=this._localTo.clone().normalize(),t=this._localTo.clone().multiplyScalar(.5);this._isVertical=Math.abs(e.dot($Zn))>eQn;let n=new L,r=new L;this._isVertical?this.#r(e,t,n,r):this.#i(e,n,r);let i=Math.max(this._length*.05,.03),a=t.addScaledVector(n,i);x6({group:this._text,direction:e,up:n,normal:r,position:a})}#r(e,t,n,r){let i=this.plugin.world.camera.three,a=i.position.clone().sub(this.group.position).sub(t);r.copy(a).addScaledVector(e,-a.dot(e)),r.lengthSq()<1e-10&&(r.copy(new L(0,1,0).cross(e)),r.lengthSq()<1e-10&&r.copy(new L(1,0,0).cross(e))),r.normalize(),n.crossVectors(r,e).normalize();let o=e.clone().applyQuaternion(i.quaternion.clone().invert());(Math.abs(o.x)>1e-4?o.x>0:o.y>0)||(n.negate(),e.negate())}#i(e,t,n){t.copy($Zn).addScaledVector(e,-e.dot($Zn)).normalize(),n.crossVectors(e,t).normalize()}#a(){this._text&&(this.group.remove(this._text),this._text.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.dispose())}),this._text=null,this._textContent=null)}destroy(){this._destroyed=!0,this._showRequestId++,this._cameraControls?.removeEventListener?.(`update`,this._onCameraUpdate),this._cameraControls=null,this.#a(),this.lineGeometry.dispose(),this.material.dispose(),this.sphereMaterial.dispose(),this.sphereGeometry.dispose(),this.group.removeFromParent(),this.plugin.measurements=this.plugin.measurements.filter(e=>e!==this),this.plugin.fragmentsInstance.requestRender()}get length(){return this.visible?this._length:0}get visible(){return this._visible}set visible(e){this._visible=!!e,this.group.visible=this._visible}get color(){return p6(this.material.color)}set color(e=this.plugin.defaultColor){let t=m6(e);this.material.color.copy(t),this.sphereMaterial.color.copy(t),this._text&&this._text.traverse(e=>{e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.color?.copy(t))})}},nQn=class{constructor(e,t,n,r={}){this.fragmentsInstance=e,this.world=e.world,this.fragments=e.fragments;let i=e.components.get(e.OBC.Raycasters);this.caster=i.get(this.world),this.textSizeRatio=r.textSizeRatio??.1,this.defaultColor=r.defaultColor??`#ffffff`,this.measurements=[],this.measurementEndCallbacks={},this.measurementEndCallbackId=0,this.control=new rQn(this)}on(e,t){if(e===`measurementEnd`)return this.measurementEndCallbacks[this.measurementEndCallbackId++]=t,this.measurementEndCallbackId}off(e){this.measurementEndCallbacks[e]=null}async castNormalRay(e,t,n,r=.02){let i=n?.fragments?.modelId,a=n?.localId;if(i==null||a==null)return null;let o=e.clone().addScaledVector(t,.005);return(await this.fragmentsInstance.raycastFromRay(o,t)).find(t=>e.distanceTo(t.point)<r?!1:!(String(t.fragments?.modelId)===String(i)&&t.localId===a))??null}destroy(){this.control.deactivate(),this.measurements.slice().forEach(e=>e.destroy()),this.measurements.length=0}},rQn=class{constructor(e){this.plugin=e,this.currentMeasurement=null,this.lastSnap=null,this.activated=!1,this.pointerMoveRequestId=0,this.mouseDown=!1,this.dragging=!1,this.pointerDownPosition=null,this.dragThreshold=4,this.consecutiveInvalidHits=0,this.onPointerMove=this.onPointerMove.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerUp=this.onPointerUp.bind(this)}async onPointerMove(e){e.preventDefault();let t=++this.pointerMoveRequestId;if(this.mouseDown&&this.pointerDownPosition){let t=e.clientX-this.pointerDownPosition.x,n=e.clientY-this.pointerDownPosition.y;t*t+n*n>this.dragThreshold*this.dragThreshold&&(this.dragging=!0)}if(this.dragging)return;let n=kZn(e,this.plugin.world.renderer.three.domElement),r=await this.plugin.caster.castRay({position:n});if(t===this.pointerMoveRequestId){if(this.lastSnap=r?{hit:r,point:r.point.clone(),normal:DZn(r,this.plugin.world.camera.three),modelId:r.fragments?.modelId??null}:null,!this.lastSnap){this.consecutiveInvalidHits+=1,this.consecutiveInvalidHits>=2&&(this.currentMeasurement?.destroy(),this.currentMeasurement=null,this.plugin.fragmentsInstance.requestRender());return}this.consecutiveInvalidHits=0,this.currentMeasurement||=new tQn(this.plugin,this.lastSnap),await this.currentMeasurement.show(this.lastSnap,()=>t===this.pointerMoveRequestId),t===this.pointerMoveRequestId&&this.plugin.fragmentsInstance.requestRender()}}onPointerDown(e){e.button===0&&(this.mouseDown=!0,this.dragging=!1,this.pointerDownPosition={x:e.clientX,y:e.clientY})}onPointerUp(e){if(e.button!==0)return;this.mouseDown=!1;let t=this.dragging;this.dragging=!1,this.pointerDownPosition=null,!(t||!this.currentMeasurement)&&(this.currentMeasurement.length<=0||(this.plugin.measurements.push(this.currentMeasurement),Object.values(this.plugin.measurementEndCallbacks).forEach(e=>{e?.(this.currentMeasurement)}),this.currentMeasurement=null))}activate(){if(this.activated)return;let e=this.plugin.world.renderer.three.domElement;e.addEventListener(`pointermove`,this.onPointerMove),e.addEventListener(`pointerdown`,this.onPointerDown),document.addEventListener(`pointerup`,this.onPointerUp),this.activated=!0}deactivate(){if(!this.activated)return;this.pointerMoveRequestId++;let e=this.plugin.world.renderer.three.domElement;e.removeEventListener(`pointermove`,this.onPointerMove),e.removeEventListener(`pointerdown`,this.onPointerDown),document.removeEventListener(`pointerup`,this.onPointerUp),this.currentMeasurement?.destroy(),this.currentMeasurement=null,this.lastSnap=null,this.mouseDown=!1,this.dragging=!1,this.pointerDownPosition=null,this.consecutiveInvalidHits=0,this.activated=!1}},S6=new L(0,1,0),iQn=new L(0,0,1),aQn=new L(1,0,0),C6=1e-6,oQn=class{constructor(e,t){this.plugin=e,this.group=new zE,this.material=new rW({color:m6(e.defaultColor),linewidth:e.lineWidth,depthTest:!0,depthWrite:!1,transparent:!1}),this.#u(),this.geometry=new nW,this.lines=new dW(this.geometry,this.material),this.lines.renderOrder=10,this.group.add(this.lines),this._visible=!0,this._texts=[],this.modelIds=g6(t.modelId),this.perimeter=0,this.valid=!1,(this.plugin.overlayScene||this.plugin.world.scene.three).add(this.group),this.#e(t)}update(e){this.modelIds=g6(e.modelId),this.#e(e),this.plugin.fragmentsInstance.requestRender()}#e(e){this.#d(),this.valid=!1;let t=this.#t(e);if(!t){this.lines.visible=!1;return}let{vertices:n,boundaryEdges:r}=t;if(!r.length){this.lines.visible=!1;return}let i=e.normal.clone().normalize(),a=e.point.clone(),o=this.#i(n,a);this.group.position.copy(o);let{horizontalAxis:s,verticalAxis:c}=this.#a(i,r),{origin:l,boundarySegments2D:u,point2D:d}=this.#o(n,r,a,s,c),f=this.#s(d,new _E(0,1),u),p=this.#s(d,new _E(0,-1),u),m=this.#s(d,new _E(1,0),u),h=this.#s(d,new _E(-1,0),u),g=e=>l.clone().add(s.clone().multiplyScalar(e.x)).add(c.clone().multiplyScalar(e.y)),_=f?g(f.point):null,v=p?g(p.point):null,y=m?g(m.point):null,b=h?g(h.point):null,x=i.clone().multiplyScalar(this.plugin.surfaceOffset),S=[],C=[];this.perimeter=0;let w=new Set;for(let[e,t]of r){let n=e.distanceTo(t);if(n<=C6)continue;this.perimeter+=n;let r=`${n.toFixed(2)} m`;w.add(r);let i=a.clone().sub(e.clone().add(t).multiplyScalar(.5));S.push([e,t,r,i])}if(_&&v){let e=`${v.distanceTo(_).toFixed(2)} m`;C.push([v,_,e,null])}else _?C.push([a,_,`${a.distanceTo(_).toFixed(2)} m`,null]):v&&C.push([a,v,`${a.distanceTo(v).toFixed(2)} m`,null]);if(y&&b){let e=`${b.distanceTo(y).toFixed(2)} m`;C.push([b,y,e,null])}else y?C.push([a,y,`${a.distanceTo(y).toFixed(2)} m`,null]):b&&C.push([a,b,`${a.distanceTo(b).toFixed(2)} m`,null]);let T=new Set;C.forEach(([,,e])=>{w.has(e)&&T.add(e)});let E=S.map(e=>({segment:e,kind:`edge`})).concat(C.map(e=>({segment:e,kind:`center`})));if(!E.length){this.lines.visible=!1;return}let D=[];E.forEach(({segment:[e,t,n,r],kind:a})=>{let s=h6(e,o).add(x),c=h6(t,o).add(x);D.push(s.x,s.y,s.z,c.x,c.y,c.z),a===`edge`&&T.has(n)||this.#c(s,c,i,n,r)}),this.#u(),this.geometry.setPositions(D),this.lines.visible=!0,this.valid=!0}#t(e){let t=this.#n(e);if(t)return t;let n=this.#r(e),r=[],i=[];if(n)r=n.vertices,i=n.indices;else return null;if(i.length||(i=Array.from({length:r.length},(e,t)=>t)),i.length<3)return null;let a=AZn(r,i);if(!a.indices.length)return null;let o=jZn(a.vertices,a.indices);return{vertices:a.vertices,boundaryEdges:o}}#n(e){let t=SYn(e);if(!t)return null;let{vertices:n,indices:r}=t,i=AZn(n,r);if(!i.indices.length)return null;let a=jZn(i.vertices,i.indices);return{vertices:i.vertices,boundaryEdges:a}}#r(e){let t=CYn(e);if(!t)return null;let{vertices:n,indices:r}=t,i=AZn(n,r);if(!i.indices.length)return null;let a=jZn(i.vertices,i.indices);return{vertices:i.vertices,boundaryEdges:a,indices:i.indices}}#i(e,t){if(!e?.length)return t.clone();let n=new XE;return e.forEach(e=>n.expandByPoint(e)),n.isEmpty()?t.clone():n.getCenter(new L)}#a(e,t=[]){let n=MZn(e,t,{eps:C6});if(!n&&(n=S6.clone().sub(e.clone().multiplyScalar(S6.dot(e))),n.lengthSq()<=C6)){let t=iQn.clone().sub(e.clone().multiplyScalar(iQn.dot(e))),r=aQn.clone().sub(e.clone().multiplyScalar(aQn.dot(e)));n=t.lengthSq()>=r.lengthSq()?t:r}n.normalize();let r=new L().crossVectors(n,e).normalize();r.lengthSq()<=C6&&(r=aQn.clone().sub(e.clone().multiplyScalar(aQn.dot(e))).normalize());let i=this.plugin.world.camera.three.up.clone().normalize(),a=i.clone().sub(e.clone().multiplyScalar(i.dot(e)));return a.lengthSq()>C6&&n.dot(a.normalize())<0&&(n.negate(),r.negate()),{horizontalAxis:r,verticalAxis:n}}#o(e,t,n,r,i){let a=e[0].clone(),o=e=>{let t=e.clone().sub(a);return new _E(t.dot(r),t.dot(i))};return{origin:a,boundarySegments2D:t.map(([e,t])=>[o(e),o(t)]),point2D:o(n)}}#s(e,t,n){let r=(e,t)=>e.x*t.y-e.y*t.x,i=null;for(let[a,o]of n){let n=o.clone().sub(a),s=r(t,n);if(Math.abs(s)<=C6)continue;let c=a.clone().sub(e),l=r(c,n)/s,u=r(c,t)/s;if(l<C6||u<-1e-6||u>1.000001)continue;let d=e.clone().add(t.clone().multiplyScalar(l));(!i||l<i.distance)&&(i={distance:l,point:d})}return i}#c(e,t,n,r,i=null){let a=t.clone().sub(e),o=a.length();if(o<=C6)return;let{direction:s,up:c,offsetUp:l}=this.#l(a,n,i),u=b6({content:r,size:Math.max(.035,o*this.plugin.textSizeRatio),color:this.material.color,strokeColor:`rgba(0, 0, 0, 0.95)`,strokeWidth:12}),d=e.clone().add(t).multiplyScalar(.5),f=Math.max(.02,o*.03);x6({group:u,direction:s,up:c,normal:n,position:d.clone().add(l.clone().multiplyScalar(f))}),this._texts.push(u),this.group.add(u)}#l(e,t,n=null){let r=t.clone().normalize(),i=e.clone().sub(r.clone().multiplyScalar(e.dot(r)));i.lengthSq()<=C6&&(i=S6.clone().sub(r.clone().multiplyScalar(S6.dot(r))),i.lengthSq()<=C6&&(i=iQn.clone().sub(r.clone().multiplyScalar(iQn.dot(r))))),i.normalize();let a=new L().crossVectors(r,i);a.lengthSq()<=C6&&(a=S6.clone().sub(r.clone().multiplyScalar(S6.dot(r)))),a.normalize(),i=new L().crossVectors(a,r).normalize(),a=new L().crossVectors(r,i).normalize();let o=a.clone();if(n?.isVector3){let e=n.clone().sub(r.clone().multiplyScalar(n.dot(r))).sub(i.clone().multiplyScalar(n.dot(i)));e.lengthSq()>C6&&(e.normalize(),o.dot(e)<0&&o.negate())}let s=this.plugin.world.camera.three.up.clone().normalize(),c=s.clone().sub(r.clone().multiplyScalar(s.dot(r))).sub(i.clone().multiplyScalar(s.dot(i)));return c.lengthSq()>C6&&a.dot(c.normalize())<0&&(a.negate(),i.negate()),{direction:i,up:a,offsetUp:o}}#u(){let e=this.plugin.world.renderer.three.domElement;this.material.resolution.set(e.clientWidth,e.clientHeight)}#d(){this._texts.forEach(e=>{this.group.remove(e),e.traverse(e=>{e.geometry&&e.geometry.dispose(),e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.dispose())})}),this._texts=[]}destroy(){this.#d(),this.geometry.dispose(),this.material.dispose(),this.group.removeFromParent(),this.plugin.measurements=this.plugin.measurements.filter(e=>e!==this),this.plugin.fragmentsInstance.requestRender()}get visible(){return this._visible}set visible(e){this._visible=!!e,this.group.visible=this._visible,this.plugin.fragmentsInstance.requestRender()}get color(){return p6(this.material.color)}set color(e=this.plugin.defaultColor){let t=m6(e);this.material.color.copy(t),this._texts.forEach(e=>{e.traverse(e=>{e.material&&(Array.isArray(e.material)?e.material:[e.material]).forEach(e=>e.color?.copy(t))})}),this.plugin.fragmentsInstance.requestRender()}},sQn=class{constructor(e,t,n,r={}){this.fragmentsInstance=e,this.world=e.world,this.overlayScene=e.overlayScene,this.components=e.components,this.OBC=e.OBC,this.cursorOverlay=n;let i=this.components.get(this.OBC.Raycasters);this.caster=i.get(this.world),this.defaultColor=r.defaultColor??`#ffffff`,this.lineWidth=r.lineWidth??2,this.textSizeRatio=r.textSizeRatio??.08,this.surfaceOffset=r.surfaceOffset??.003,this.measurements=[],this.measurementEndCallbacks={},this.measurementEndCallbackId=0,this.previousHighlightOnHover=null,this.hoverSuspended=!1,this.control=new cQn(this)}on(e,t){if(e===`measurementEnd`)return this.measurementEndCallbacks[this.measurementEndCallbackId++]=t,this.measurementEndCallbackId}off(e){this.measurementEndCallbacks[e]=null}destroy(){this.control.deactivate(),this.measurements.slice().forEach(e=>e.destroy()),this.measurements.length=0}},cQn=class{constructor(e){this.plugin=e,this.lastHit=null,this.currentMeasurement=null,this.mouseDown=!1,this.dragging=!1,this.pointerDownPosition=null,this.dragThreshold=4,this.activated=!1,this.pointerMoveRequestId=0,this.consecutiveInvalidHits=0,this.onPointerMove=this.onPointerMove.bind(this),this.onPointerDown=this.onPointerDown.bind(this),this.onPointerUp=this.onPointerUp.bind(this)}clearPreview(){this.lastHit=null,this.plugin.cursorOverlay.update(null),this.currentMeasurement?.destroy(),this.currentMeasurement=null}async onPointerMove(e){e.preventDefault();let t=++this.pointerMoveRequestId;if(this.mouseDown&&this.pointerDownPosition){let t=e.clientX-this.pointerDownPosition.x,n=e.clientY-this.pointerDownPosition.y;t*t+n*n>this.dragThreshold*this.dragThreshold&&(this.dragging=!0)}let n=kZn(e,this.plugin.world.renderer.three.domElement),r=await this.plugin.caster.castRay({position:n,snappingClasses:[wZn.FACE]});if(!this.activated||t!==this.pointerMoveRequestId)return;if(!this.#e(r)){this.consecutiveInvalidHits+=1,this.consecutiveInvalidHits>=2&&this.clearPreview();return}this.consecutiveInvalidHits=0,this.lastHit={hit:r,facePoints:r.facePoints??null,faceIndices:r.faceIndices??r.faceIndexes??r.indices??null,point:r.point.clone(),normal:DZn(r,this.plugin.world.camera.three),modelId:r.fragments?.modelId??null};let i=OZn(r.point,this.plugin.world.camera.three,this.plugin.world.renderer.three.domElement);if(this.plugin.cursorOverlay.update({snapName:`FACE`,screen:i}),this.currentMeasurement?this.currentMeasurement.update(this.lastHit):this.currentMeasurement=new oQn(this.plugin,this.lastHit),!this.currentMeasurement.valid){this.currentMeasurement.destroy(),this.currentMeasurement=null;return}this.plugin.fragmentsInstance.requestRender()}onPointerDown(e){e.button===0&&(this.mouseDown=!0,this.dragging=!1,this.pointerDownPosition={x:e.clientX,y:e.clientY})}onPointerUp(e){if(e.button!==0)return;this.mouseDown=!1;let t=this.dragging;if(this.dragging=!1,this.pointerDownPosition=null,t||!this.currentMeasurement||!this.currentMeasurement.valid)return;let n=this.currentMeasurement;if(this.currentMeasurement=null,!n.valid){n.destroy();return}this.plugin.measurements.push(n),Object.values(this.plugin.measurementEndCallbacks).forEach(e=>{e?.(n)}),this.plugin.fragmentsInstance.requestRender()}activate(){if(this.activated)return;let e=this.plugin.world.renderer.three.domElement;!this.plugin.hoverSuspended&&typeof this.plugin.fragmentsInstance.suspendHoverHighlight==`function`&&(this.plugin.fragmentsInstance.suspendHoverHighlight(`face-measurement`),this.plugin.hoverSuspended=!0),typeof this.plugin.fragmentsInstance.highlightOnHover==`boolean`&&(this.plugin.previousHighlightOnHover=this.plugin.fragmentsInstance.highlightOnHover,this.plugin.fragmentsInstance.highlightOnHover=!1),this.plugin.cursorOverlay.useCrosshairCursor(),this.plugin.cursorOverlay.show(),e.addEventListener(`pointermove`,this.onPointerMove),e.addEventListener(`pointerdown`,this.onPointerDown),document.addEventListener(`pointerup`,this.onPointerUp),this.activated=!0}deactivate(){if(!this.activated)return;let e=this.plugin.world.renderer.three.domElement;e.removeEventListener(`pointermove`,this.onPointerMove),e.removeEventListener(`pointerdown`,this.onPointerDown),document.removeEventListener(`pointerup`,this.onPointerUp),this.pointerMoveRequestId+=1,this.consecutiveInvalidHits=0,this.clearPreview(),this.mouseDown=!1,this.dragging=!1,this.pointerDownPosition=null,this.plugin.cursorOverlay.hide(),this.plugin.cursorOverlay.useOverlayCursor(),this.plugin.hoverSuspended&&typeof this.plugin.fragmentsInstance.resumeHoverHighlight==`function`&&(this.plugin.fragmentsInstance.resumeHoverHighlight(`face-measurement`),this.plugin.hoverSuspended=!1),this.plugin.previousHighlightOnHover!==null&&(this.plugin.fragmentsInstance.highlightOnHover=this.plugin.previousHighlightOnHover,this.plugin.previousHighlightOnHover=null),this.activated=!1}#e(e){if(!e)return!1;if(e.facePoints?.length>=9)return!0;let t=e.object?.geometry?.attributes?.position,n=e.faceIndices??e.faceIndexes??e.indices??null;return!!(t&&n?.length>=3&&e.point)}},lQn=new L(0,1,0),uQn=new L(0,0,1),dQn=new L(1,0,0),w6=1e-6,fQn=({colorA:e,colorB:t,opacity:n,stripeWidth:r})=>new vO({uniforms:{uOrigin:{value:new L},uAxisX:{value:new L(1,0,0)},uAxisY:{value:new L(0,1,0)},uStripeWidth:{value:r},uColorA:{value:e.clone()},uColorB:{value:t.clone()},uOpacity:{value:n}},vertexShader:`
|
|
90649
90649
|
varying vec3 vLocalPos;
|
|
90650
90650
|
void main() {
|
|
90651
90651
|
vLocalPos = position;
|
|
@@ -96051,5 +96051,5 @@ void main() {
|
|
|
96051
96051
|
--bimdata-local-context-width: ${r.width}px;
|
|
96052
96052
|
--bimdata-local-context-center-width: ${r.centerWidth}px;
|
|
96053
96053
|
--bimdata-local-context-resolution: ${r.resolution};
|
|
96054
|
-
`),onMouseenter:t[0]||=(...e)=>r.onMouseEnter&&r.onMouseEnter(...e),onMouseleave:t[1]||=(...e)=>r.onMouseLeave&&r.onMouseLeave(...e)},[P(o,{ref:`modalManagerTemplateRef`},null,512),N(`div`,XIr,[(j(!0),M(ad,null,pl(r.windowPlugins.leftSidePanels,e=>(j(),hd(s,{plugin:e},null,8,[`plugin`]))),256)),N(`div`,ZIr,[(j(!0),M(ad,null,pl(r.windowPlugins.free,e=>(j(),hd(c,{key:e.name,class:li({"window-container__content__center__viewer":e.isViewer}),plugin:e},null,8,[`class`,`plugin`]))),128)),P(l,{position:`left`,plugins:r.windowPlugins.leftButtonColumn},null,8,[`plugins`]),P(l,{position:`right`,plugins:r.windowPlugins.rightButtonColumn},null,8,[`plugins`])]),(j(!0),M(ad,null,pl(r.windowPlugins.rightSidePanels,e=>(j(),hd(s,{plugin:e},null,8,[`plugin`]))),256))]),r.loading?(j(),M(`div`,QIr,[r.spinner&&r.spinner.component?(j(),hd(ll(r.spinner.component),ui(kd({key:0},r.spinner.props)),null,16)):(j(),hd(u,{key:1,size:`20px`,border:`3px`}))])):Td(``,!0),r.layoutSettingsDisplayed?(j(),M(`div`,$Ir,[P(d)])):Td(``,!0)],36)}var tLr=F(YIr,[[`render`,eLr],[`__scopeId`,`data-v-cc5a8745`]]),nLr=class{constructor(e=!0){let t=LFr(t_,null,{resizable:e});t.registerContent(`default`,tLr),this.settings=Ya({edit:!1,swap:!1,full:!1}),this.areas=t}get resizable(){return this.areas.resizable}set resizable(e){this.areas.resizable=e}apply(e=null){this.areas.layout=e?RFr(e):null}copy(e,t=!0){return VFr(this.areas.layout,e,t)}open({ratio:e,direction:t,insertAfter:n,windowName:r=null,windowState:i=null,localContextId:a=null}={}){let o=r?{options:{windowName:r,windowState:i}}:null;return a===null?this.areas.splitLayout(e,t,n,o):this.areas.split(a,e,t,n,o)}swap(e,t){return this.areas.swap(e,t)}close(e){return this.areas.delete(e)}compare(e,t){if(!e&&!t)return!0;if(!e||!t)return!1;if(typeof e==`string`&&typeof t==`string`)return e===t;if(typeof e==`string`||typeof t==`string`)return!1;if(e.windowName&&t.windowName){if(e.windowName!==t.windowName)return!1;let n=new Set(e.windowState?.modelIds),r=new Set(t.windowState?.modelIds);return n.size===r.size&&[...n].every(e=>r.has(e))}return e.windowName||t.windowName||e.direction!==t.direction||e.children.length!==t.children.length?!1:e.children.every((e,n)=>this.compare(e,t.children[n]))}},rLr={name:`@bimdata/viewer`,type:`module`,version:`2.18.0-beta.21`,description:`A customizable BIM viewer.`,keywords:[`bim`,`viewer`,`bimdata`,`ifc`,`bcf`],types:`./index.d.ts`,author:`BIMData.io`,homepage:`https://developers.bimdata.io/viewer/index.html`,repository:{url:`https://github.com/bimdata/viewer`},bugs:{email:`support@bimdata.io`},browserslist:[`last 2 chrome version`,`last 2 firefox version`],main:`dist/bimdata-viewer.esm.min.js`,module:`dist/bimdata-viewer.esm.min.js`,scripts:{dev:`vite -c build/vite.config.dev.js`,build:`node scripts/build.mjs`,"build:prod":`vite build -c build/vite.config.prod.js && esbuild dist/bimdata-viewer.esm.min.js --minify --outfile=dist/bimdata-viewer.esm.min.js --allow-overwrite`,"build:offline":`vite build -c build/vite.config.offline.js && esbuild dist/bimdata-viewer.offline.esm.min.js --minify --outfile=dist/bimdata-viewer.offline.esm.min.js --allow-overwrite`,"build:runtime":`vite build -c build/vite.config.runtime.js && esbuild dist/bimdata-viewer.runtime.esm.min.js --minify --outfile=dist/bimdata-viewer.runtime.esm.min.js --allow-overwrite`,"build:split":`vite build -c build/vite.config.split.js && esbuild dist/bimdata-viewer.split.esm.min.js --minify --outfile=dist/bimdata-viewer.split.esm.min.js --allow-overwrite`,"build:umd":`vite build -c build/vite.config.umd.js && esbuild dist/bimdata-viewer.umd.cjs --minify --outfile=dist/bimdata-viewer.umd.min.cjs`,"cy:run":`cypress run`,"cy:open":`cypress open`,prebuild:`rm -rf dist`,prepublishOnly:`npm run build`,"semantic-release":`semantic-release`,serve:`http-server -c-1 --silent`,test:`npm run test:unit & npm run build & npm run test:e2e`,"test:unit":`jest`,"test:e2e":`start-server-and-test 'npm run serve -- -p 8080' http://localhost:8080 cy:run`,"test:e2e-dev":`start-server-and-test 'npm run serve -- -p 8080' http://localhost:8080 cy:open`,version:`echo $npm_package_version`,ts:`tsc`},files:[`dist/*`,`types/*`,`CHANGELOG.md`,`README.md`,`package.json`,`package-lock.json`,`index.d.ts`],devDependencies:{"@babel/preset-env":`^7.29.2`,"@bimdata/2d-engine":`2.6.7`,"@bimdata/areas-next":`0.1.17`,"@bimdata/bcf-components":`6.7.8`,"@bimdata/components":`1.10.2`,"@bimdata/design-system":`2.4.3`,"@bimdata/engine-2d":`0.0.23`,"@bimdata/html-to-image":`1.11.16`,"@bimdata/typescript-fetch-api-client":`10.47.0`,"@photo-sphere-viewer/core":`^5.15.0`,"@rollup/plugin-alias":`^6.0.0`,"@rollup/plugin-babel":`^7.1.0`,"@rollup/plugin-commonjs":`^29.0.3`,"@rollup/plugin-image":`^3.0.3`,"@rollup/plugin-replace":`^6.0.3`,"@semantic-release/changelog":`^7.0.0`,"@semantic-release/commit-analyzer":`^13.0.1`,"@semantic-release/git":`^11.0.1`,"@semantic-release/github":`^12.0.9`,"@semantic-release/npm":`^13.1.5`,"@semantic-release/release-notes-generator":`^14.1.1`,"@vitejs/plugin-vue":`^6.0.8`,"@xeokit/xeokit-sdk":`git+https://git@github.com/Amoki/xeokit-sdk.git#b3227526bbbe8ac49c8c0c1d121363ca79781824`,"@zip.js/zip.js":`^2.8.34`,async:`^3.2.6`,autoprefixer:`^10.5.4`,"babel-core":`^7.0.0-bridge.0`,"babel-jest":`^30.4.1`,"camera-controls":`^3.1.2`,"conventional-changelog-eslint":`^6.1.0`,cypress:`^15.19.0`,esbuild:`^0.28.1`,globals:`^17.8.0`,html2canvas:`^1.4.1`,"http-server":`^14.1.1`,jest:`^30.4.2`,"jest-environment-jsdom":`^30.4.1`,lodash:`^4.18.1`,"pdfjs-dist":`^6.1.200`,postcss:`^8.5.23`,prettier:`^3.9.6`,"sass-embedded":`^1.100.0`,"semantic-release":`^25.0.8`,"start-server-and-test":`^3.0.11`,three:`0.184.0`,vite:`^8.1.5`,"vite-plugin-css-injected-by-js":`^5.0.2`,vue:`^3.5.40`,"vue-i18n":`^11.4.8`,"web-ifc":`^0.0.77`},allowScripts:{"cypress@15.19.0":!0}},iLr=1,aLr=class{math=tZe;constructor({plugins:e,api:t,ui:n,locale:r=`fr`}){this.instanceId=iLr++,this.pluginManager=new Pkr(e),this.windowManager=new Ikr,this.windowManager.registerAndAddPluginsToWindows([...this.pluginManager.registeredPlugins.values()]),this.api=new kPr(t),this.globalContext=new Qne(this),this.state=WPr(this),this.shortcutManager=v(this.state),this.uiSettings=n||{},this.i18n=new S_(r),this._contextMenu=null,this.layout=new nLr(this.uiSettings.resizable!==!1),this._darkTheme=co(n?.darkTheme??!1),this.localContext=null,window.$viewer=this}get darkTheme(){return this._darkTheme.value}set darkTheme(e){this._darkTheme.value=e}get version(){return rLr.version}get locale(){return this.i18n.locale}get contextMenu(){return this._contextMenu||d}set contextMenu(e){this._contextMenu=e}get registeredWindows(){return[...this.windowManager.registeredWindows.keys()]}get registeredPlugins(){return[...this.pluginManager.registeredPlugins.keys()]}get pluginsCfg(){return this.pluginManager.cfg}registerPlugin(e){this.pluginManager.registerPlugin(e),this.windowManager.registerAndAddPluginsToWindows([e])}};function oLr(e,t={}){t.backgroundColor&&(e.style.setProperty(`--bimdata-viewer-background-color`,t.backgroundColor),t.backgroundColor===`transparent`&&e.style.setProperty(`--areas-separator-color`,`transparent`)),t.colorPrimary&&e.style.setProperty(`--color-primary`,t.colorPrimary),t.colorPrimaryLighter&&e.style.setProperty(`--color-primary-lighter`,t.colorPrimaryLighter),t.colorPrimaryLight&&e.style.setProperty(`--color-primary-light`,t.colorPrimaryLight),t.colorPrimaryDark&&e.style.setProperty(`--color-primary-dark`,t.colorPrimaryDark),t.colorSecondary&&e.style.setProperty(`--color-secondary`,t.colorSecondary),t.colorSecondaryLighter&&e.style.setProperty(`--color-secondary-lighter`,t.colorSecondaryLighter),t.colorSecondaryLight&&e.style.setProperty(`--color-secondary-light`,t.colorSecondaryLight),t.colorSecondaryDark&&e.style.setProperty(`--color-secondary-dark`,t.colorSecondaryDark),t.colorSilverLight&&e.style.setProperty(`--color-silver-light`,t.colorSilverLight),t.colorSilver&&e.style.setProperty(`--color-silver`,t.colorSilver),t.colorSilverDark&&e.style.setProperty(`--color-silver-dark`,t.colorSilverDark),t.colorGraniteLight&&e.style.setProperty(`--color-granite-light`,t.colorGraniteLight),t.colorGranite&&e.style.setProperty(`--color-granite`,t.colorGranite),t.colorSuccess&&e.style.setProperty(`--color-success`,t.colorSuccess),t.colorSuccessLighter&&e.style.setProperty(`--color-success-Lighter`,t.colorSuccessLighter),t.colorSuccessLight&&e.style.setProperty(`--color-success-Light`,t.colorSuccessLight),t.colorSuccessDark&&e.style.setProperty(`--color-success-Dark`,t.colorSuccessDark),t.colorWarning&&e.style.setProperty(`--color-warning`,t.colorWarning),t.colorWarningLighter&&e.style.setProperty(`--color-warning-Lighter`,t.colorWarningLighter),t.colorWarningLight&&e.style.setProperty(`--color-warning-Light`,t.colorWarningLight),t.colorWarningDark&&e.style.setProperty(`--color-warning-Dark`,t.colorWarningDark),t.colorHigh&&e.style.setProperty(`--color-high`,t.colorHigh),t.colorHighLighter&&e.style.setProperty(`--color-high-lighter`,t.colorHighLighter),t.colorHighLight&&e.style.setProperty(`--color-high-light`,t.colorHighLight),t.colorHighDark&&e.style.setProperty(`--color-high-dark`,t.colorHighDark),t.colorText&&e.style.setProperty(`--color-text`,t.colorText),(!t.backgroundColor||t.backgroundColor!==`transparent`)&&e.style.setProperty(`--areas-separator-color`,`rgba(216, 216, 216, 1)`),t.headerHeight!=null&&e.style.setProperty(`--bimdata-viewer-header-height`,t.headerHeight),e.style.setProperty(`--areas-background-color`,`transparent`)}var sLr=Object.freeze({25:`GUEST`,50:`USER`,100:`ADMIN`}),Q9=Object.freeze({READ:`read`,WRITE:`write`});function cLr(e){let t={};return e.forEach(e=>{let[n,r]=e.split(`:`);t[n]?t[n].push(r):t[n]=[r]}),t}var lLr={token_scopes:[],usable_scopes:[],user_role:25};function uLr(e=lLr){let t=cLr(e.token_scopes),n=cLr(e.usable_scopes);return{...QQe(e),tokenScopes:t,usableScopes:n,userRole:sLr[e.user_role],user:e.user?QQe(e.user):null,hasBcfReadPermission:n.bcf?.includes(Q9.READ)??!1,hasBcfWritePermission:n.bcf?.includes(Q9.WRITE)??!1,hasModelReadPermission:n.model?.includes(Q9.READ)??!1,hasModelWritePermission:n.model?.includes(Q9.WRITE)??!1,hasDocReadPermission:n.document?.includes(Q9.READ)??!1,hasDocWritePermission:n.document?.includes(Q9.WRITE)??!1}}var dLr={de:{BcfComponents:{back:`Zurück`,BcfFilters:{filtersButton:`Filter`,filtersTitle:`Filter`,priorityLabel:`Priorität`,statusLabel:`Status`,stageLabel:`Phase`,assignedToLabel:`Zugewiesen an`,creatorsLabel:`Erstellt von`,tagsLabel:`Tags`,resetButton:`Zurücksetzen`,searchButton:`Suchen`,undefined:`Nicht definiert`,datePlaceholder:`Erstellungsdatum`},BcfSettings:{title:`BCF-Parameter`,text:`Erstellen, füllen und listen Sie die BCF-Einstellungen auf, die Sie für dieses Projekt haben möchten.`,validateButton:`Die BCF-Parameter anerkennen`},BcfStatistics:{emptyText:`Fügen Sie Fragen hinzu, um zugehörige Statistiken hier anzuzeigen.`,issues:`Probleme`,extension:{Priority:`Priorität`,PriorityNotDefined:`Keine Priorität`,PriorityTitle:`Prioritäten`,Status:`Status`,StatusNotDefined:`Kein Status`,StatusTitle:`Status`}},BcfTopicCard:{priority:`Priorität`,noPriority:`Keine`,assignedTo:`Zugewiesen an`,elements:`Elemente`,notSpecified:`Nicht definiert`,see:`Anzeigen`},BcfTopicCreationCard:{text:`Ein neues BCF-Thema erstellen`,createBcfSideTitle:`Ein Problem melden`},BcfTopicForm:{dragDropImageText:`Bitte wählen Sie eine Datei aus.`,addObjectButton:`Objekt`,addAnnotationButton:`Annotation`,annotationButtonTooltip:`Zu diesem Thema gibt es derzeit keine Ansichten.`,addPictureButton:`Fügen Sie ein Bild hinzu.`,titlePlaceholder:`Titel *`,titleErrorMessage:`Titel fehlt`,typeLabel:`Typ`,priorityLabel:`Priorität`,statusLabel:`Status`,stageLabel:`Phase`,assignedToLabel:`Zugewiesen an`,dueDateLabel:`Fälligkeitsdatum (TT.MM.JJJJ)`,descriptionLabel:`Beschreibung`,labelsLabel:`Tags`,createButton:`Bestätigen`,updateButton:`Änderungen übernehmen`,modalText:`Sie sind dabei, die Bearbeitung der Ausgabe {Name} zu beenden, aber es gibt noch ungespeicherte Änderungen.`,cancelButton:`Änderungen verwerfen`,continueButton:`Änderungen fortsetzen`,createTitle:`Ein Problem melden`,dragDropImageTextTablet:`Foto machen`,takeSnapshot:`Mach einen Schnappschuss`,importFile:`Eine Datei importieren`,searchPlaceholder:`Suchen`,emptySearch:`kein Ergebnis`,documentsLabel:`Dokumente`,documentsCount:`Dokumente – {count} ausgewählte Dokumente`,groupsLabel:`Berechtigungen`,groupsCount:`Berechtigungen – {count} ausgewählte Gruppen`,groupsText:`Wählen Sie die Benutzergruppen aus, die dieses Thema sehen und damit interagieren dürfen.`,validate:`Bestätigen`},BcfTopicOverview:{openViewer:`Im Viewer öffnen`,openViewerNoModels:`Es sind keine Vorlagen zur Ansicht bereit`,elements:`{count} Elemente`,noElements:`kein Element`,type:`Typ`,noTypeSpecified:`Kein Typ angegeben`,description:`Beschreibung`,noDescriptionProvided:`Keine Beschreibung angegeben`,assignedTo:`Zugeteilt an`,notAssigned:`Nicht zugewiesen`,dueDate:`Fälligkeitsdatum`,noDueDate:`Kein Fälligkeitsdatum`,informations:`Informationen`,status:`Status`,noStatusSpecified:`Kein Status angegeben`,stage:`Phase`,noStageProvided:`Keine Phase angegeben`,priority:`Priorität`,priorityNotDefined:`Nicht definiert`,tags:`Tags`,noTags:`Keine Tags`,commentButton:`Ein Kommentar veröffentlichen`,deleteText:`Sie löschen jetzt {Name}`,deleteBcfButton:`Dieses BCF löschen`,keepBcfButton:`Dieses BCF beibehalten`,author:`Autor`},BcfTopicsTable:{headers:{index:`#`,priority:`Priorität`,status:`Status`,title:`Titel`,creator:`Autor`,date:`Datum`}},BcfTopicActionsCell:{seeButton:`Anzeigen`},BcfTopicComments:{commentButton:`Ein Kommentar verfassen`,commentLabel:`Ein Kommentar verfassen`,commentText:`Kommentar`,cancelButton:`Abbrechen`,publishButton:`Veröffentlichen`,commentsText:`Kommentare`,deleteCommentText:`Diesen Kommentar löschen?`,deleteButton:`Löschen`,takeSnapshot:`Mach einen Schnappschuss`,edited:`bearbeitet`},BcfTopicPriorityCell:{noPriority:`Keine`},SettingCard:{addButton:`ein Element hinzufügen`,cancelButton:`Abbrechen`,validateButton:`Bestätigen`,deleteExtensionText:`Diesen Parameter löschen`,deleteButton:`Löschen`,title:{Priority:`Prioritäten`,Label:`Tags`,Status:`Status`,Type:`Typen`,Stage:`Phasen`},input:{Priority:`Eine neue Priorität hinzufügen`,Label:`Ein neues Etikett hinzufügen`,Status:`Einen neuen Status hinzufügen`,Type:`Einen neuen Typ hinzufügen`,Stage:`Eine neue Phase hinzufügen`},text:{Priority:`Liste der Prioritäten`,Label:`Liste von Tags`,Status:`Liste der Status`,Type:`Liste der Typen`,Stage:`Liste der Phasen`}}}},en:{BcfComponents:{back:`Back`,BcfFilters:{filtersButton:`Filters`,filtersTitle:`Filters`,priorityLabel:`Priority`,statusLabel:`Status`,stageLabel:`Stage`,assignedToLabel:`Assigned to`,creatorsLabel:`Created by`,tagsLabel:`Tags`,resetButton:`Reset`,searchButton:`Search`,undefined:`Not defined`,datePlaceholder:`Creation date`},BcfSettings:{title:`BCF Settings`,text:`Create, enter in, and list the BCF settings you would like to have for this project`,validateButton:`Validate BCF settings`},BcfStatistics:{emptyText:`Add BCF Topics to start to have some stats here.`,issues:`issues`,extension:{Priority:`Priority`,PriorityNotDefined:`No priority`,PriorityTitle:`Priorities`,Status:`Status`,StatusNotDefined:`No status`,StatusTitle:`Status`}},BcfTopicCard:{priority:`Priority`,noPriority:`None`,assignedTo:`Assigned to`,elements:`Elements`,notSpecified:`Not specified`,see:`See`},BcfTopicCreationCard:{text:`Create a new BCF topic`,createBcfSideTitle:`Report a problem`},BcfTopicForm:{dragDropImageText:`Please select a file`,addObjectButton:`Object`,addAnnotationButton:`Annotation`,annotationButtonTooltip:`This topic has no viewpoint`,addPictureButton:`Add a picture`,titlePlaceholder:`Title *`,titleErrorMessage:`Missing title`,typeLabel:`Type`,priorityLabel:`Priority`,statusLabel:`Status`,stageLabel:`Stage`,assignedToLabel:`Assigned to`,dueDateLabel:`Due date`,descriptionLabel:`Description`,labelsLabel:`Tags`,createButton:`Validate`,updateButton:`Modify this BCF`,modalText:`You are about to quit editing issue {name} but there are unsaved changes.`,cancelButton:`Discard changes`,continueButton:`Continue editing`,createTitle:`Report a problem`,dragDropImageTextTablet:`Take a picture`,takeSnapshot:`Take a snapshot`,importFile:`Import a file`,searchPlaceholder:`Search`,emptySearch:`No result`,documentsLabel:`Add a file`,documentsCount:`Files - {count} selected files`,groupsLabel:`Permissions`,groupsCount:`Permissions - {count} selected groups`,groupsText:`You are now setting the access rights: choose the user group(s) that will be exclusively authorized to see and interact with this topic.`,validate:`Validate`},BcfTopicOverview:{openViewer:`Open in viewer`,openViewerNoModels:`No model to open`,elements:`{count} Elements`,noElements:`No element`,type:`Type`,noTypeSpecified:`No type specified`,description:`Description`,noDescriptionProvided:`No description provided`,assignedTo:`Assigned to`,notAssigned:`Not assigned`,dueDate:`Due date`,noDueDate:`No due date`,informations:`Informations`,status:`Status`,noStatusSpecified:`No status specified`,stage:`Stage`,noStageProvided:`No stage provided`,priority:`Priority`,priorityNotDefined:`Not defined`,tags:`Tags`,noTags:`No tags`,commentButton:`Post a comment`,deleteText:`You are about to delete {name}`,deleteBcfButton:`Delete this BCF`,keepBcfButton:`Keep this BCF`,author:`Author`},BcfTopicsTable:{headers:{index:`#`,priority:`Priority`,status:`Status`,title:`Title`,creator:`Author`,date:`Date`}},BcfTopicActionsCell:{seeButton:`See`},BcfTopicComments:{commentButton:`Post a comment`,commentLabel:`Post a comment`,commentText:`Comment`,cancelButton:`Cancel`,publishButton:`Publish`,commentsText:`Comments`,deleteCommentText:`Delete this comment ?`,deleteButton:`Delete`,takeSnapshot:`Take a snapshot`,edited:`edited`},BcfTopicPriorityCell:{noPriority:`None`},SettingCard:{addButton:`add an element`,cancelButton:`Cancel`,validateButton:`Validate`,deleteExtensionText:`Remove this setting`,deleteButton:`Delete`,title:{Priority:`Priorities`,Label:`Labels`,Status:`Status`,Type:`Types`,Stage:`Stages`},input:{Priority:`Add a new priority`,Label:`Add a new label`,Status:`Add new status`,Type:`Add a new type`,Stage:`Add a new stage`},text:{Priority:`Priority list`,Label:`Labels list`,Status:`Status list`,Type:`Type list`,Stage:`Stage list`}}}},es:{BcfComponents:{back:`Volver`,BcfFilters:{filtersButton:`Filtros`,filtersTitle:`Filtros`,priorityLabel:`Prioridad`,statusLabel:`Estado`,stageLabel:`Fase`,assignedToLabel:`Asignado a`,creatorsLabel:`Creado por`,tagsLabel:`Etiquetas:`,resetButton:`Restablecer`,searchButton:`Buscar en`,undefined:`No definido`,datePlaceholder:`Fecha de creación`},BcfSettings:{title:`Parámetros del BCF`,text:`Cree, rellene y enumere los parámetros del BCF que desea tener en este proyecto`,validateButton:`Validar los parámetros del BCF`},BcfStatistics:{emptyText:`Añada preguntas para ver las estadísticas asociadas aquí.`,issues:`problemas`,extension:{Priority:`Prioridad`,PriorityNotDefined:`Sin prioridad`,PriorityTitle:`Prioridades`,Status:`Estado`,StatusNotDefined:`Sin estado`,StatusTitle:`Estatutos`}},BcfTopicCard:{priority:`Prioridad`,noPriority:`Sin`,assignedTo:`Asignado a`,elements:`Elementos`,notSpecified:`No definido`,see:`Ver`},BcfTopicCreationCard:{text:`Crear un nuevo tema BCF`,createBcfSideTitle:`Informar de un problema`},BcfTopicForm:{dragDropImageText:`Seleccione un archivo`,addObjectButton:`Objeto`,addAnnotationButton:`Anotación`,annotationButtonTooltip:`Actualmente este tema no posee ningún punto de vista`,addPictureButton:`Añadir una imagen`,titlePlaceholder:`Título *`,titleErrorMessage:`Falta el título`,typeLabel:`Tipo`,priorityLabel:`Prioridad`,statusLabel:`Estado`,stageLabel:`Fase`,assignedToLabel:`Asignado a`,dueDateLabel:`Fecha de vencimiento (DD/MM/AAAA)`,descriptionLabel:`Descripción`,labelsLabel:`Etiquetas`,createButton:`Validar`,updateButton:`Modificar este BCF`,modalText:`Está a punto de salir de la edición del problema de {name} pero hay cambios sin guardar.`,cancelButton:`Cancelar los cambios`,continueButton:`Continuar con los cambios`,createTitle:`Informar de un problema`,dragDropImageTextTablet:`Tomar una fotografía`,takeSnapshot:`Tomar un snapshot`,importFile:`Importar un archivo`,searchPlaceholder:`Buscar`,emptySearch:`No hay resultados`},BcfTopicOverview:{openViewer:`Abrir en el visor`,openViewerNoModels:`No hay ningún modelo listo para la visualización`,elements:`{count} Elementos`,noElements:`Ningún elemento`,type:`Tipo`,noTypeSpecified:`No se especifica el tipo`,description:`Descripción`,noDescriptionProvided:`No hay descripción`,assignedTo:`Asignado a`,notAssigned:`No asignado`,dueDate:`Plazo`,noDueDate:`Sin fecha de vencimiento`,informations:`Información`,status:`Estado`,noStatusSpecified:`No se especifica el estado`,stage:`Fase`,noStageProvided:`No se indica ninguna fase`,priority:`Prioridad`,priorityNotDefined:`No definido`,tags:`Etiquetas`,noTags:`Sin etiquetas`,commentButton:`Publicar un comentario`,deleteText:`Estás a punto de borrar {name}`,deleteBcfButton:`Borrar este BCF`,keepBcfButton:`Mantenga este BCF`,author:`Autor`},BcfTopicsTable:{headers:{index:`#`,priority:`Prioridad`,status:`Estado`,title:`Título`,creator:`Autor`,date:`Fecha`}},BcfTopicActionsCell:{seeButton:`Ver`},BcfTopicComments:{commentButton:`Publicar un comentario`,commentLabel:`Publicar un comentario`,commentText:`Comentario`,cancelButton:`Cancelar`,publishButton:`Publicar`,commentsText:`comentarios`,deleteCommentText:`¿Borrar este comentario?`,deleteButton:`Borrar`,takeSnapshot:`Tomar un snapshot`},BcfTopicPriorityCell:{noPriority:`Sin`},SettingCard:{addButton:`añadir un elemento`,cancelButton:`Cancelar`,validateButton:`Validar`,deleteExtensionText:`Borrar esta configuración`,deleteButton:`Borrar`,title:{Priority:`Prioridades`,Label:`Etiquetas:`,Status:`Estatutos`,Type:`Tipos`,Stage:`Fases`},input:{Priority:`Añadir una nueva prioridad`,Label:`Añadir una nueva etiqueta`,Status:`Añadir un nuevo estado`,Type:`Añadir un nuevo tipo`,Stage:`Añadir una nueva fase`},text:{Priority:`Lista de prioridades`,Label:`Lista de etiquetas`,Status:`Lista de estatutos`,Type:`Lista de tipos`,Stage:`Lista de fases`}}}},fr:{BcfComponents:{back:`Retour`,BcfFilters:{filtersButton:`Filtres`,filtersTitle:`Filtres`,priorityLabel:`Priorité`,statusLabel:`Statut`,stageLabel:`Phase`,assignedToLabel:`Assigné à`,creatorsLabel:`Créé par`,tagsLabel:`Tags`,resetButton:`Réinitialiser`,searchButton:`Rechercher`,undefined:`Non défini`,datePlaceholder:`Date de création`},BcfSettings:{title:`Paramètres BCF`,text:`Créez, renseignez et listez les paramètres BCF que vous souhaitez avoir sur ce projet`,validateButton:`Valider les paramètres BCF`},BcfStatistics:{emptyText:`Ajoutez des questions pour voir les statistiques associées ici.`,issues:`problèmes`,extension:{Priority:`Priorité`,PriorityNotDefined:`Aucune priorité`,PriorityTitle:`Priorités`,Status:`Statut`,StatusNotDefined:`Aucun statut`,StatusTitle:`Statuts`}},BcfTopicCard:{priority:`Priorité`,noPriority:`Aucune`,assignedTo:`Assigné à`,elements:`{n} Élements`,notSpecified:`Non défini`,see:`Voir`},BcfTopicCreationCard:{text:`Créer un nouveau topic BCF`,createBcfSideTitle:`Signaler un problème`},BcfTopicForm:{dragDropImageText:`Veuillez sélectionner un fichier`,addObjectButton:`Objet`,addAnnotationButton:`Annotation`,annotationButtonTooltip:`Ce topic ne possède actuellement aucun point de vue`,addPictureButton:`Ajouter une image`,titlePlaceholder:`Titre *`,titleErrorMessage:`Titre manquant`,typeLabel:`Type`,priorityLabel:`Priorité`,statusLabel:`Statut`,stageLabel:`Phase`,assignedToLabel:`Assigné à`,dueDateLabel:`Date d'échéance`,descriptionLabel:`Description`,labelsLabel:`Tags`,createButton:`Valider`,updateButton:`Modifier ce BCF`,modalText:`Vous êtes sur le point de quitter l'édition de l'issue {name} mais il y'a des modifications non enregistrées.`,cancelButton:`Annuler les modifications`,continueButton:`Continuer les modifications`,createTitle:`Signaler un problème`,dragDropImageTextTablet:`Prendre une photo`,takeSnapshot:`Prendre un snapshot`,importFile:`Importer un fichier`,searchPlaceholder:`Rechercher`,emptySearch:`Pas de résultat`,documentsLabel:`Documents`,documentsCount:`Documents - {count} documents sélectionnés`,groupsLabel:`Permissions`,groupsCount:`Permissions - {count} groupes sélectionnés`,groupsText:`Sélectionner les groupes utilisateur qui peuvent voir ce topic et intéragir avec.`,validate:`Valider`},BcfTopicOverview:{openViewer:`Ouvrir dans le viewer`,openViewerNoModels:`Il n'y a aucun modèle prêt pour une visualisation`,elements:`{count} Élements`,noElements:`Aucun élément concerné`,type:`Type`,noTypeSpecified:`Pas de type spécifié`,description:`Description`,noDescriptionProvided:`Pas de description renseignée`,assignedTo:`Assigné à`,notAssigned:`Non assigné`,dueDate:`Échéance`,noDueDate:`Pas de date d'échéance`,informations:`Informations`,status:`Statut`,noStatusSpecified:`Pas de statut spécifié`,stage:`Phase`,noStageProvided:`Pas de phase renseignée`,priority:`Priorité`,priorityNotDefined:`Non défini`,tags:`Tags`,noTags:`Pas de tags`,commentButton:`Poster un commentaire`,deleteText:`Vous êtes sur le point de supprimer {name}`,deleteBcfButton:`Supprimer ce BCF`,keepBcfButton:`Conserver ce BCF`,author:`Auteur`},BcfTopicsTable:{headers:{index:`#`,priority:`Priorité`,status:`Statut`,title:`Titre`,creator:`Auteur`,date:`Date`}},BcfTopicActionsCell:{seeButton:`Voir`},BcfTopicComments:{commentButton:`Poster un commentaire`,commentLabel:`Poster un commentaire`,commentText:`Commentaire`,cancelButton:`Annuler`,publishButton:`Publier`,commentsText:`commentaires`,deleteCommentText:`Supprimer ce commentaire ?`,deleteButton:`Supprimer`,takeSnapshot:`Prendre un snapshot`,edited:`edité`},BcfTopicPriorityCell:{noPriority:`Aucune`},SettingCard:{addButton:`ajouter un élément`,cancelButton:`Annuler`,validateButton:`Valider`,deleteExtensionText:`Supprimmer ce paramètre`,deleteButton:`Supprimer`,title:{Priority:`Priorités`,Label:`Tags`,Status:`Statuts`,Type:`Types`,Stage:`Phases`},input:{Priority:`Ajouter une nouvelle priorité`,Label:`Ajouter un nouveau label`,Status:`Ajouter un nouveau statut`,Type:`Ajouter un nouveau type`,Stage:`Ajouter une nouvelle phase`},text:{Priority:`Liste des priorités`,Label:`Liste des tags`,Status:`Liste des statuts`,Type:`Liste des types`,Stage:`Liste des phases`}}}},it:{BcfComponents:{back:`Indietro`,BcfFilters:{filtersButton:`Filtri`,filtersTitle:`Filtri`,priorityLabel:`Priorità`,statusLabel:`Stato`,stageLabel:`Fase`,datePlaceholder:`Data di creazione`,assignedToLabel:`Assegnato a`,creatorsLabel:`Creato da`,tagsLabel:`Etichette`,resetButton:`Ripristina`,searchButton:`Cerca`,undefined:`Non definito`},BcfSettings:{title:`Parametri BCF`,text:`Creare, notificare e elencare i parametri BCF che si desidera avere su questo progetto`,validateButton:`Conferma i parametri BCF`},BcfStatistics:{emptyText:`Aggiungi delle domande per vedere le statistiche associate qui.`,issues:`problemi`,extension:{Priority:`Priorità`,PriorityNotDefined:`Nessuna priorità`,PriorityTitle:`Priorità`,Status:`Stato`,StatusNotDefined:`Nessuno stato`,StatusTitle:`Stati`}},BcfTopicCard:{priority:`Priorità`,noPriority:`Nessuno`,assignedTo:`Assegnato a`,elements:`Elementi`,noElements:`0 elementi`,notSpecified:`Non definito`,see:`Visualizza`},BcfTopicCreationCard:{text:`Crea un nuovo topic BCF`,createBcfSideTitle:`Segnala un problema`},BcfTopicForm:{dragDropImageText:`Selezionare un file`,addObjectButton:`Oggetto`,addAnnotationButton:`Annotazione`,annotationButtonTooltip:`Attualmente questo argomento non presenta alcun punto di vista`,addPictureButton:`Aggiungere un'immagine`,titlePlaceholder:`Titolo *`,titleErrorMessage:`Titolo mancante`,typeLabel:`Tipo`,priorityLabel:`Priorità`,statusLabel:`Stato`,stageLabel:`Fase`,assignedToLabel:`Assegnato a`,dueDateLabel:`Data di scadenza`,descriptionLabel:`Descrizione`,labelsLabel:`Tag`,createButton:`Conferma`,updateButton:`Modificare questo BCF`,modalText:`State per abbandonare la modifica di {name} ma ci sono modifiche non salvate.`,cancelButton:`Annullare le modifiche`,continueButton:`Continuare le modifiche`,createTitle:`Segnala un problema`},BcfTopicOverview:{openViewer:`Apri nel visualizzatore`,openViewerNoModels:`Non esistono modelli pronti per la visualizzazione`,elements:`{count} Elementi`,noElements:`Nessun elemento`,type:`Tipo`,noTypeSpecified:`Nessun tipo specificato`,description:`Descrizione`,noDescriptionProvided:`Nessuna descrizione inserita`,assignedTo:`Assegnato a`,notAssigned:`Non assegnato`,dueDate:`Scadenza`,noDueDate:`Nessuna data di scadenza`,informations:`Informazioni`,status:`Stato`,noStatusSpecified:`Nessuno stato specificato`,stage:`Fase`,noStageProvided:`Nessuna fase inserita`,priority:`Priorità`,priorityNotDefined:`Non definita`,tags:`Etichette`,noTags:`Nessuna etichetta`,commentButton:`Pubblica un commento`,deleteText:`Stai per eliminare {name}`,deleteBcfButton:`Elimina questo BCF`,keepBcfButton:`Conserva questo BCF`,author:`Autore`},BcfTopicsTable:{headers:{index:`#`,priority:`Priorità`,status:`Stato`,title:`Titolo`,creator:`Autore`,date:`Data`}},BcfTopicActionsCell:{seeButton:`Visualizza`},BcfTopicComments:{commentButton:`Pubblica un commento`,commentLabel:`Pubblica un commento`,commentText:`Commento`,cancelButton:`Annulla`,publishButton:`Pubblica`,commentsText:`commenti`,deleteCommentText:`Eliminare questo commento?`,deleteButton:`Elimina`},BcfTopicPriorityCell:{noPriority:`Nessuno`},SettingCard:{addButton:`aggiungi un elemento`,cancelButton:`Annulla`,validateButton:`Conferma`,deleteExtensionText:`Elimina questo parametro`,deleteButton:`Elimina`,title:{Priority:`Priorità`,Label:`Etichette`,Status:`Stati`,Type:`Tipi`,Stage:`Fasi`},input:{Priority:`Aggiungi una nuova priorità`,Label:`Aggiungi una nuova etichetta`,Status:`Aggiungi un nuovo stato`,Type:`Aggiungi un nuovo tipo`,Stage:`Aggiungi una nuova fase`},text:{Priority:`Elenco delle priorità`,Label:`Elenco delle etichette`,Status:`Elenco degli stati`,Type:`Elenco dei tipi`,Stage:`Elenco delle fasi`}}}}},fLr=({apiClient:e,fetchUsers:t,i18nPlugin:n}={})=>({install(r){e?M_.setup({apiClient:e,fetchUsers:t}):console.error(`[BCF Components Plugin] No api client provided. You must provide an api client for the components to work properly.`),n?Object.entries(dLr).forEach(([e,t])=>{n.global.mergeLocaleMessage(e,t)}):console.warn(`[BCF Components Plugin] No i18n instance provided. You should either provide an i18n instance or define your own translations in order have text displayed properly.`),Object.entries(uce).forEach(([e,t])=>{r.component(e,t)})}}),pLr={de:{BuildingMaker:{title:`Building Maker`,back:`Zurück`,list:{text:`Erstellen und bearbeiten Sie die Etagen und laden Sie anschließend Ihre PDFs herunter.`,createButton:`Neues Projekt`,updateButton:`Umbenennen`,deleteButton:`Löschen`},form:{text:`Erstellen und bearbeiten Sie die Etagen und laden Sie anschließend Ihre PDFs herunter.`,input:`Name des Gebäudes`,error:`Ungültiger Name`,createButton:`Erstellen`,updateButton:`Bestätigen`},view:{addStoreyButton:`Etage`,addPlanButton:`Grundriss`,closeButton:`Fertigstellen`,submitFilesButton:`Bestätigen`},storeyForm:{title:`Neue Etage`,input:`Name`,error:`Ungültiger Name`,cancelButton:`Abbrechen`,submitButton:`Bestätigen`}},FileManager:{creationFormTitle:`Ordner erstellen`,renameFormPlaceholder:`Datei- / Ordnernam`,nameInputPlaceholder:`Ordnername`,emptyFolder:`Dieser Ordner ist leer`,newFolderSuccess:`Neuer Ordner erstellt`,renameFolderSuccess:`Umbenannter Ordner`,deleteFolderSuccess:`Ordner gelöscht`,newFileSuccess:`Datei hinzugefügt`,renameFileSuccess:`Umbenannte Datei`,deleteFileSuccess:`Datei gelöscht`,nameInputErrorMessage:`Ungültiger name`,cancel:`Abbrechen`,submit:`Bestätigen`,buttonText:`Neuer Ordner`,addFileButtonText:`Datei laden`,rename:`Umbenennen`,view:`Sehen`,download:`Herunterladen`,delete:`Löschen`,deleteTitle:`Dateien löschen`,deleteDetail:`Sie sind im Begriff, die folgenden Dateien / Ordner endgültig zu löschen`}},en:{BIMDataComponents:{t:{back:`Back`,cancel:`Cancel`,create:`Create`,delete:`Delete`,download:`Download`,finish:`Finish`,rename:`Rename`,search:`Search`,see:`View`,storey:`Storey`,validate:`Validate`}},BuildingMaker:{title:`Building Maker`,list:{text:`Create and edit storeys, then download your PDFs.`,new:`New project`},form:{input:`Building name`,error:`Invalid`},view:{addStorey:`Add Storey`,addFile:`Add File`,addPlan:`Add Plan`},storeyForm:{title:`New storey`,input:`Name`,error:`Invalid name`}},FileManager:{creationFormTitle:`Create folder`,renameFormPlaceholder:`Folder/File name`,nameInputPlaceholder:`Folder name`,emptyFolder:`This folder is empty`,newFolderSuccess:`New folder created`,renameFolderSuccess:`Folder renamed`,deleteFolderSuccess:`Folder deleted`,newFileSuccess:`File added`,renameFileSuccess:`File renamed`,deleteFileSuccess:`File deleted`,nameInputErrorMessage:`Invalid name`,buttonText:`New folder`,addFileButtonText:`Upload a file`,deleteTitle:`Deleting Files`,deleteDetail:`You are about to permanently delete the following files / folders`,dmsRoot:`Root of the project's DMS`,pdfPageSelectorTitle:`Select a page`},MetaBuildingStructure:{title:`Meta-Building Structure`,tab:{structure:`Structure`,zones:`Zones`,equipments:`Equipments`},StoreySelector:{placeholder:`Select a storey`}},PhotosphereBuilding:{title:`Photosphere Building`}},es:{BuildingMaker:{title:`Building Maker`,back:`Vuelta`,list:{text:`Cree y edite los pisos después cargue los PDF.`,createButton:`Nuevo proyecto`,updateButton:`Renombrar`,deleteButton:`Suprimir`},form:{text:`Cree y edite los pisos después cargue los PDF.`,input:`Nombre del edificio`,error:`Nombre no válido`,createButton:`Crear`,updateButton:`Validar`},view:{addStoreyButton:`Piso`,addPlanButton:`Plano`,closeButton:`Terminar`,submitFilesButton:`Validar`},storeyForm:{title:`Nuevo piso`,input:`Nombre`,error:`Nombre no válido`,cancelButton:`Anular`,submitButton:`Validar`}},FileManager:{creationFormTitle:`Crear un archivo`,renameFormPlaceholder:`Nombre de archivo / carpeta`,nameInputPlaceholder:`Nombre de la carpeta`,emptyFolder:`Esta carpeta está vacía`,newFolderSuccess:`Nueva carpeta creada`,renameFolderSuccess:`Carpeta renombrada`,deleteFolderSuccess:`Carpeta eliminada`,newFileSuccess:`Archivo agregado`,renameFileSuccess:`Archivo renombrado`,deleteFileSuccess:`Archivo eliminado`,nameInputErrorMessage:`Nombre inválida`,cancel:`Cancelar`,submit:`Validar`,buttonText:`Carpeta nueva`,addFileButtonText:`Cargar un archivo`,rename:`Renombrar`,view:`Ver`,download:`Descargar`,delete:`Borrar`,deleteTitle:`Eliminar archivos`,deleteDetail:`Está a punto de eliminar permanentemente los siguientes archivos / carpetas`}},fr:{BIMDataComponents:{t:{back:`Retour`,cancel:`Annuler`,create:`Créer`,delete:`Supprimer`,download:`Télécharger`,finish:`Terminer`,rename:`Renommer`,search:`Rechercher`,see:`Voir`,storey:`Étage`,validate:`Valider`}},BuildingMaker:{title:`Building Maker`,list:{text:`Créez et éditez les étages puis téléchagez vos PDF.`,new:`Nouveau projet`},form:{input:`Nom du bâtiment`,error:`Nom invalide`},view:{addStorey:`Ajouter un Étage`,addFile:`Ajouter un fichier`,addPlan:`Ajouter un plan`},storeyForm:{title:`Nouvel étage`,input:`Nom`,error:`Nom invalide`}},FileManager:{creationFormTitle:`Créer un dossier`,renameFormPlaceholder:`Nom du fichier/dosier`,nameInputPlaceholder:`Nom du dossier`,emptyFolder:`Ce dossier est vide`,newFolderSuccess:`Nouveau dossier créé`,renameFolderSuccess:`Dossier renommé`,deleteFolderSuccess:`Dossier supprimé`,newFileSuccess:`Fichier ajouté`,renameFileSuccess:`Fichier renommé`,deleteFileSuccess:`Fichier supprimé`,nameInputErrorMessage:`Nom invalide`,buttonText:`Nouveau dossier`,addFileButtonText:`Charger un fichier`,deleteTitle:`Supression de fichiers`,deleteDetail:`Vous êtes sur le point de supprimer définitivement les fichiers/dossiers suivants`,dmsRoot:`Racine de la GED du projet`,pdfPageSelectorTitle:`Sélectionner une page`},MetaBuildingStructure:{title:`Structure Méta-Building`,tab:{structure:`Structure`,zones:`Zones`,equipments:`Équipements`},StoreySelector:{placeholder:`Sélectionner un étage`}},PhotosphereBuilding:{title:`Photosphère Building`}},it:{BuildingMaker:{title:`Building Maker`,back:`Reso`,list:{text:`Crea e modifica i piani e poi scarica i tuoi PDF.`,createButton:`Nuovo progetto`,updateButton:`Rinominare`,deleteButton:`Eliminare`},form:{text:`Crea e modifica i piani e poi scarica i tuoi PDF.`,input:`Nome della costruzione`,error:`Nome non corretto`,createButton:`Creare`,updateButton:`Convalidare`},view:{addStoreyButton:`Piano`,addPlanButton:`Mappa`,closeButton:`Finire`,submitFilesButton:`Convalidare`},storeyForm:{title:`Nuovo piano`,input:`Nome`,error:`Nome non corretto`,cancelButton:`Annullare`,submitButton:`Convalidare`}},FileManager:{creationFormTitle:`Crea una cartella`,renameFormPlaceholder:`Nome file/cartella`,nameInputPlaceholder:`Nome della cartella`,emptyFolder:`Questa cartella è vuota`,newFolderSuccess:`Nuova cartella creata`,renameFolderSuccess:`Cartella rinominata`,deleteFolderSuccess:`Cartella eliminata`,newFileSuccess:`File aggiunto`,renameFileSuccess:`File rinominato`,deleteFileSuccess:`File cancellato`,nameInputErrorMessage:`Nome non valido`,cancel:`Annulla`,submit:`Invia`,buttonText:`Nuova cartella`,addFileButtonText:`Carica un file`,rename:`Rinominare`,view:`Vedere`,download:`Scaricare`,delete:`Cancellare`,deleteTitle:`Eliminazione di file`,deleteDetail:`Stai per eliminare definitivamente i seguenti file/cartelle`}}},mLr=({i18nPlugin:e}={})=>({install(t){e?Object.entries(pLr).forEach(([t,n])=>{e.global.mergeLocaleMessage(t,n)}):console.warn(`[BIMData Components Plugin] No i18n instance provided. You should either provide an i18n instance or define your own translations in order have text displayed properly.`),Object.entries(dcr).forEach(([e,n])=>{t.component(e,n)})}}),hLr={beforeMount(e,t){if(typeof t.value!=`function`)throw Error(`click away directive needs function, got ${typeof t.value}`);e.clickAwayHandler=n=>{(n.path||n.composedPath&&n.composedPath()).find(t=>t===e)||t.value()},window.addEventListener(`mousedown`,e.clickAwayHandler,!0)},unmounted(e){window.removeEventListener(`mousedown`,e.clickAwayHandler,!0),delete e.clickAwayHandler}},gLr=s({BIMDataClickAway:()=>K_,BIMDataClickInputAway:()=>hLr}),_Lr=e=>({install(t){Object.entries(bze).forEach(([n,r])=>{e&&e.excludedComponents&&e.excludedComponents.length>0&&e.excludedComponents.includes(n)||(!e||!e.includedComponents||e.includedComponents.includes(n))&&t.component(n,r)}),(!e||e.directives!==!1)&&Object.entries(gLr).forEach(([e,n])=>t.directive(e.split(`BIMData`)[1],n))}}),vLr={name:`LiWrapper`,render(){return Qd(`li`,this.$slots.default())}};function yLr(e,t){var n=new Set([]);return e.forEach(e=>{t.has(e)||n.add(e)}),n}var $9=f(`id`),bLr=({contextMenu:e,objects:t=[],state:n=e.$viewer.state,pictos:r})=>[{name:`selectAll`,get group(){return e.groupPositions.select},position:1,get label(){return e.$t(`context_menu.select_all`)},get picto(){return r.get(this.name)},execute:()=>n.selectObjects(t.filter(h(p(`visible`),m(`selected`))).map($9)),predicate:()=>t.some(h(p(`visible`),m(`selected`)))},{name:`deselectAll`,get group(){return e.groupPositions.select},position:2,get label(){return e.$t(`context_menu.deselect_all`)},get picto(){return r.get(this.name)},execute:()=>n.deselectObjects(t.filter(p(`selected`)).map($9)),predicate:()=>t.some(p(`selected`))},{name:`selectSimilar`,get group(){return e.groupPositions.select},position:3,get label(){return e.$t(`context_menu.select_similar`)},get picto(){return r.get(this.name)},execute(){let e=t.filter(e=>e.visible&&e.type===this.selectedObject.type&&e.id!==this.selectedObject.id).map($9);n.selectObjects(e)},selectedObject:null,predicate(){let e=t.filter(h(p(`visible`),p(`selected`)));return e.length===1&&e[0].type!==void 0?(this.selectedObject=e[0],!0):(this.selectedObject=null,!1)}},{name:`reverseSelection`,get label(){return e.$t(`context_menu.reverse_selection`)},get group(){return e.groupPositions.select},position:4,execute:()=>{let e=new Set(t.filter(p(`selected`)).map($9)),r=new Set(t.filter(p(`visible`)).map($9));n.selectObjects(Array.from(yLr(r,e)),{exclusive:!0})},predicate:()=>t.some(h(m(`selected`),p(`visible`)))&&t.some(h(p(`selected`),p(`visible`)))},{name:`showAll`,get group(){return e.groupPositions.visibility},position:1,get label(){return e.$t(`context_menu.show_all`)},get picto(){return r.get(this.name)},execute:()=>n.showObjects(t.filter(m(`visible`)).map($9)),predicate:()=>t.some(m(`visible`))},{name:`hide`,get group(){return e.groupPositions.visibility},position:2,get label(){return e.$t(`global.hide`)},get picto(){return r.get(this.name)},objectsToHide:null,execute(){let e=this.objectsToHide.filter(p(`selected`));e.length>0&&n.deselectObjects(e.map($9)),n.hideObjects(this.objectsToHide.map($9))},predicate(){return this.objectsToHide=t.filter(h(p(`selected`),p(`visible`))),this.objectsToHide.length>0}},{name:`hideAll`,get group(){return e.groupPositions.visibility},position:3,get label(){return e.$t(`context_menu.hide_all`)},execute:()=>{let e=t.filter(p(`visible`));e.some(p(`selected`))&&n.deselectObjects(e.filter(p(`selected`)).map($9)),n.hideObjects(e.map($9))},predicate:()=>t.some(p(`visible`))}].filter(e=>e.predicate()),xLr={components:{LiWrapper:vLr},inject:[`$viewer`],data(){return{enabled:!0,defaultPrevented:!1,displayed:!1,top:null,bottom:null,left:null,width:200,nextCommandId:1,currentCommands:[],contextCommands:[],registeredCommands:[],groupPositions:{select:10,visibility:20},asyncPredicateRunning:!1,activeComponentCommand:null,subMenuPosition:null,subMenuPinned:!1,componentOpenDelay:250,componentCloseDelay:120,subMenuOffset:6}},computed:{position(){return{top:this.top===null?`unset`:this.top+`px`,bottom:this.bottom===null?`unset`:this.bottom+`px`,left:this.left===null?`unset`:this.left+`px`,width:this.width+`px`}}},watch:{displayed(e){e?document.addEventListener(`keydown`,this.onKeyDown):document.removeEventListener(`keydown`,this.onKeyDown)},enabled(e){e||(this.resetTransientState(),this.displayed=!1)}},created(){this.$viewer.contextMenu=this,this.asyncPredicates=new Set,this.componentOpenTimer=null,this.componentCloseTimer=null},beforeUnmount(){this.clearComponentTimers()},methods:{resetTransientState(){this.currentCommands=[],this.contextCommands=[],this.defaultPrevented=!1,this.asyncPredicates.clear(),this.asyncPredicateRunning=!1,this.originEvent=null},onKeyDown(e){e.key===`Escape`&&this.away()},setPosition(e){let t=(document.fullscreenElement?document.fullscreenElement:this.$parent.$el).getBoundingClientRect();this.left=e.clientX-t.left,this.top=e.clientY-t.top,this.left+this.width>t.width&&(this.left-=this.width),e.clientY>t.top+t.height/2?(this.bottom=t.height-this.top,this.top=null):this.bottom=null},typeCheckCommand(e={}){let t=null;if((!e.execute||typeof e.execute!=`function`)&&!e.component&&(t=`Cannot register context menu command. A command must have an execute function or a component property.`),e.label||(t=`Cannot register context menu command. A command must have a label.`),t)throw console.error(t),Error(t);return e.id=this.nextCommandId++,e.component&&io(e.component),e},open(e){if(e.preventDefault(),this.closeComponentMenu(),!this.enabled){this.resetTransientState(),this.displayed=!1;return}this.currentCommands=[],this.setPosition(e),this.originEvent=e,this.setCurrentCommands(),this.groupCurrentCommands(),this.defaultPrevented=!1,this.displayed=!0,document.fullscreenElement?(this.$el.parentElement.removeChild(this.$el),this.adoptiveParent=document.fullscreenElement,this.adoptiveParent.appendChild(this.$el)):this.adoptiveParent&&this.adoptiveParent!==this.$viewer.globalContext.el&&(this.adoptiveParent.removeChild(this.$el),this.$viewer.globalContext.el.appendChild(this.$el),this.adoptiveParent=null)},setCurrentCommands(){this.asyncPredicates.clear(),this.asyncPredicateRunning=!1,this.defaultPrevented||this.registeredCommands.forEach(async e=>{if(typeof e.predicate==`function`){let t=e.predicate(this.$viewer.globalContext.activeLocalContext);if(t===!0)this.currentCommands.push(e);else if(typeof t?.then==`function`){this.asyncPredicates.add(t),this.asyncPredicateRunning=!0;let n=await t;this.asyncPredicates.has(t)&&(this.asyncPredicates.delete(t),this.asyncPredicateRunning=this.asyncPredicates.size>0,n===!0&&this.currentCommands.push(e))}}else this.currentCommands.push(e)}),this.currentCommands.push(...this.contextCommands),this.contextCommands=[]},getDefaultCommands({objects:e=[],state:t=this.$viewer.state,context:n=null}){let r=new Map;return n&&this.$viewer.shortcutManager.getShortcuts(n).forEach(e=>r.set(e.name,e.key)),bLr({contextMenu:this,objects:e,state:t,pictos:r})},executeCommand(e,t){if(e.execute){e.execute(this.originEvent),this.closeComponentMenu(),this.displayed=!1;return}e.component&&this.openComponentMenu(e,this.eventLine(t),!0)},away(){this.close()},close(){this.closeComponentMenu(),this.displayed=!1},clearComponentTimers(){this.componentOpenTimer&&=(clearTimeout(this.componentOpenTimer),null),this.componentCloseTimer&&=(clearTimeout(this.componentCloseTimer),null)},eventLine(e){return e?.currentTarget||e?.target||null},onCommandMouseEnter(e,t){if(!e.component){this.subMenuPinned||this.scheduleCloseComponentMenu();return}if(this.componentCloseTimer&&=(clearTimeout(this.componentCloseTimer),null),this.componentOpenTimer&&=(clearTimeout(this.componentOpenTimer),null),this.activeComponentCommand&&this.activeComponentCommand.id===e.id&&!this.subMenuPinned)return;let n=this.eventLine(t);this.componentOpenTimer=setTimeout(()=>{this.openComponentMenu(e,n,!1)},this.componentOpenDelay)},onCommandMouseLeave(e){e.component&&!this.subMenuPinned&&this.scheduleCloseComponentMenu()},onSubMenuMouseEnter(){this.componentCloseTimer&&=(clearTimeout(this.componentCloseTimer),null)},onSubMenuMouseLeave(){this.subMenuPinned||this.scheduleCloseComponentMenu()},scheduleCloseComponentMenu(){this.componentCloseTimer&&clearTimeout(this.componentCloseTimer),this.componentCloseTimer=setTimeout(()=>{this.subMenuPinned||this.closeComponentMenu()},this.componentCloseDelay)},getPositioningParent(){return document.fullscreenElement?document.fullscreenElement:this.$el?.parentElement||this.$parent.$el},async openComponentMenu(e,t,n=!1){t&&(this.clearComponentTimers(),this.activeComponentCommand=e,this.subMenuPinned=n,this.subMenuPosition={left:`0px`,top:`0px`},await this.$nextTick(),this.placeComponentMenu(t))},placeComponentMenu(e){let t=this.$refs.subMenuElement,n=this.getPositioningParent(),r=this.$el;if(!t||!n||!r||!e?.getBoundingClientRect)return;let i=n.getBoundingClientRect(),a=r.getBoundingClientRect(),o=e.getBoundingClientRect(),s=t.getBoundingClientRect(),c=this.subMenuOffset,l=i.left-a.left,u=i.right-a.left-s.width,d=o.right-a.left+c,f=o.left-a.left-s.width-c;d>u&&f>=l&&(d=f),d=Math.max(l,Math.min(d,u));let p=i.top-a.top,m=i.bottom-a.top-s.height,h=o.top-a.top,g=o.bottom-a.top-s.height;h>m&&g>=p&&(h=g),h=Math.max(p,Math.min(h,m)),this.subMenuPosition={left:d+`px`,top:h+`px`}},closeComponentMenu(){this.clearComponentTimers(),this.activeComponentCommand=null,this.subMenuPosition=null,this.subMenuPinned=!1},groupCurrentCommands(){let e=new Map;this.currentCommands.forEach(t=>{(t.group===null||t.group===void 0)&&(t.group=0),e.has(t.group)?e.get(t.group).push(t):e.set(t.group,[t])}),e.forEach(e=>e.sort((e,t)=>(e.position=e.position||0,t.position=t.position||0,e.position-t.position)));let t=[...e.keys()].sort((e,t)=>e-t).map(t=>e.get(t)).flat();this.currentCommands=t},isGroupIntersection(e){if(e===0)return!1;let t=this.currentCommands[e-1],n=this.currentCommands[e];return t.group<n.group},registerContextCommand(e){let t=this.typeCheckCommand(e);return this.contextCommands.push(t),e.id},registerCommand(e){let t=this.typeCheckCommand(e);return this.registeredCommands.push(t),e.id},unregisterCommand(e){return this.registeredCommands.find(t=>t.id===e)?(this.registeredCommands=this.registeredCommands.filter(t=>t.id!==e),!0):!1},preventDefault(){this.defaultPrevented=!0}}},SLr={key:0,class:`separator`},CLr={class:`menu-text`},wLr={key:1,class:`menu-picto`},TLr={key:1,class:`context-menu__spinner`};function ELr(e,t,n,r,i,a){let o=A(`BIMDataIconChevron`),s=A(`LiWrapper`),c=A(`BIMDataSpinner`),l=ul(`click-away`);return i.displayed&&(i.currentCommands.length||i.asyncPredicateRunning)?_s((j(),M(`ul`,{key:0,class:`bimdata-list context-menu`,style:ii(a.position)},[(j(!0),M(ad,null,pl(i.currentCommands,(e,t)=>(j(),hd(s,{key:e.label,class:`context-menu__element`,onClick:t=>a.executeCommand(e,t),onMouseenter:t=>a.onCommandMouseEnter(e,t),onMouseleave:t=>a.onCommandMouseLeave(e)},{default:k(()=>[a.isGroupIntersection(t)?(j(),M(`div`,SLr)):Td(``,!0),N(`div`,CLr,O(e.label),1),!e.component&&e.picto?(j(),M(`span`,wLr,O(e.picto),1)):e.component?(j(),hd(o,{key:2,size:`xxxs`,class:`fill-primary`})):Td(``,!0)]),_:2},1032,[`onClick`,`onMouseenter`,`onMouseleave`]))),128)),i.activeComponentCommand?(j(),M(`li`,{key:0,ref:`subMenuElement`,class:`context-menu__floating-sub-menu`,style:ii(i.subMenuPosition),onMouseenter:t[0]||=(...e)=>a.onSubMenuMouseEnter&&a.onSubMenuMouseEnter(...e),onMouseleave:t[1]||=(...e)=>a.onSubMenuMouseLeave&&a.onSubMenuMouseLeave(...e)},[(j(),hd(ll(i.activeComponentCommand.component),ui(xd(i.activeComponentCommand.componentProps||{})),null,16))],36)):Td(``,!0),i.asyncPredicateRunning?(j(),M(`li`,TLr,[P(c)])):Td(``,!0)],4)),[[l,a.away]]):Td(``,!0)}var DLr=F(xLr,[[`render`,ELr],[`__scopeId`,`data-v-ffd539d6`]]),OLr={name:`ViewerHeader`,inject:[`$viewer`],props:{visible:{type:Boolean,default:!0}},setup(){let e=bs(`$viewer`),t=Ya(new Map);return{logo:e.uiSettings.bimdataLogo!==!1,version:e.uiSettings.version===!1?null:e.version,headerContent:t,headerRightContentComponents:Zd(()=>Array.from(t.values()).filter(e=>e.position===`right`).sort((e,t)=>e.order-t.order).map(e=>e.component)),headerLeftContentComponents:Zd(()=>Array.from(t.values()).filter(e=>e.position===`left`).sort((e,t)=>e.order-t.order).map(e=>e.component)),addContent:e=>{if(!e.name)throw TypeError(`[Viewer Header] Content must have a name`);if(t.has(e.name))throw Error(`[Viewer Header] Content with name ${e.name} already exists`);t.set(e.name,e)},removeContent:e=>t.has(e)?(t.delete(e),!0):!1}}},kLr={class:`viewer-header`},ALr={class:`viewer-header__content`},jLr={class:`viewer-header__content__left`},MLr={class:`viewer-header__content__right`},NLr={key:0,class:`m-l-6 flex items-center`},PLr={key:1,class:`viewer-header__version`};function FLr(e,t,n,r,i,a){let o=A(`BIMDataIllustration`);return _s((j(),M(`div`,kLr,[N(`div`,ALr,[N(`div`,jLr,[(j(!0),M(ad,null,pl(r.headerLeftContentComponents,e=>(j(),hd(ll(e),{key:e.name}))),128))]),N(`div`,MLr,[(j(!0),M(ad,null,pl(r.headerRightContentComponents,e=>(j(),hd(ll(e),{key:e.name}))),128))])]),r.logo||r.version?(j(),M(`div`,NLr,[r.logo?(j(),hd(o,{key:0,name:`logo`,width:`30px`,height:`30px`})):Td(``,!0),r.version?(j(),M(`div`,PLr,O(r.version),1)):Td(``,!0)])):Td(``,!0)],512)),[[zf,n.visible]])}var ILr=F(OLr,[[`render`,FLr],[`__scopeId`,`data-v-5c9ea6b6`]]),LLr={emits:[`resize`],setup(e,{emit:t}){return{onResizerMousedown:e=>{e.preventDefault();let n=e.clientX,r=e=>{e.preventDefault();let r=e.clientX-n;n=e.clientX,t(`resize`,r)},i=e=>{e.preventDefault(),window.removeEventListener(`mousemove`,r),window.removeEventListener(`mouseup`,i)};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,i)}}}},RLr={class:`bimdata-separator`};function zLr(e,t,n,r,i,a){return j(),M(`div`,RLr,[t[1]||=N(`div`,{class:`bimdata-separator__line`},null,-1),N(`div`,{class:`bimdata-separator__resizer`,onMousedown:t[0]||=(...e)=>r.onResizerMousedown&&r.onResizerMousedown(...e)},null,32)])}var BLr={components:{Separator:F(LLr,[[`render`,zLr],[`__scopeId`,`data-v-79a3b3af`]])},props:{position:{type:String,required:!0,validator(e){return[`left`,`right`].includes(e)}},sidePanel:{type:Object,required:!0,validator(e){if(e.width&&(typeof e.width!=`number`||e.width<0))return console.error(`[GlobalSidePanel] sidePanel.width must be a strictly positive number, received ${typeof e.width}`),!1;let t=typeof e?.component==`object`;return t||console.error(`[GlobalSidePanel] sidePanel must have a component property`),t}}},setup(e){let t=co(null),n=co(e.sidePanel.width??400);return Ds(()=>e.sidePanel,()=>{Object.defineProperty(e.sidePanel,"width",{get(){return n.value},set(e){if(typeof e!=`number`||e<=0){console.error(`[GlobalSidePanel] sidePanel.width must be a strictly positive number, received ${typeof e}`);return}n.value=e}}),Object.defineProperty(e.sidePanel,"componentInstance",{get(){return t.value},enumerable:!0})},{immediate:!0}),{componentInstance:t,width:n,onResize:(e,t=1)=>{let r=n.value+e*t;n.value=Math.max(0,r)}}}},VLr={class:`bimdata-global-side-panel__component`};function HLr(e,t,n,r,i,a){let o=A(`Separator`);return j(),M(`div`,{class:`bimdata-global-side-panel`,style:ii(`width: ${r.width}px`)},[n.sidePanel.resizable&&n.position===`right`?(j(),hd(o,{key:0,onResize:t[0]||=e=>r.onResize(e,-1)})):Td(``,!0),N(`div`,VLr,[(j(),hd(ll(n.sidePanel.component),{ref:`componentInstance`},null,512))]),n.sidePanel.resizable&&n.position===`left`?(j(),hd(o,{key:1,onResize:t[1]||=e=>r.onResize(e)})):Td(``,!0)],4)}var ULr={name:`BimdataViewer`,components:{ContextMenu:DLr,ViewerHeader:ILr,ModalManager:rIr,GlobalSidePanel:F(BLr,[[`render`,HLr],[`__scopeId`,`data-v-82d0d4cb`]])},setup(){let e=bs(`$viewer`),{globalContext:t,shortcutManager:n}=e;tl(()=>{n&&n.destroy(),t.hub.clear()}),Zc(()=>{e.pluginManager.runPluginsScripts(e)});let r=Zd(()=>e.uiSettings.bimdataLogo!==!1&&(t.localContexts.length!==1||t.localContexts[0].window?.logoAndVersion)),i=Zd(()=>e.uiSettings.version!==!1&&(t.localContexts.length!==1||t.localContexts[0].window?.logoAndVersion)?e.version:null),a=Zd(()=>t.leftSidePanel),o=Zd(()=>t.rightSidePanel),s=Zd(()=>{let n=e.uiSettings.header!==!1,r=t.localContexts.length===1&&t.localContexts[0].window?.header===!1,i=!!(a.value||o.value);return n&&(!r||i)}),c=e.uiSettings.contextMenu!==!1,l=co(null);function u(e){c&&l.value.open(e)}function d(){e.shortcutManager.active=!0}function f(){e.shortcutManager.active=!1}return{Layout:e.layout.areas.component,onContextMenu:u,onMouseenter:d,onMouseleave:f,isHeaderVisible:s,viewerTemplateRef:t.templateRef,modalManagerTemplateRef:t.modalManagerTemplateRef,headerTemplateRef:t.headerTemplateRef,contextMenuTemplateRef:l,contextMenuEnabled:c,bimdataLogoOnSingleWindow:r,viewerVersionOnSingleWindow:i,version:e.version,loading:Zd(()=>t.loading),spinner:Zd(()=>t.spinner),leftSidePanel:a,rightSidePanel:o}}},WLr={key:1,class:`bimdata-context-loading-overlay`,style:{"z-index":`3`}},GLr={key:2,class:`viewer__logo`},KLr={key:1,class:`version m-t-6`};function qLr(e,t,n,r,i,a){let o=A(`ModalManager`),s=A(`ContextMenu`),c=A(`ViewerHeader`),l=A(`GlobalSidePanel`),u=A(`BIMDataSpinner`),d=A(`BIMDataIllustration`);return j(),M(`div`,{id:`bimdata-viewer`,ref:`viewerTemplateRef`,class:`bimdata-viewer bimdata-design-system bimdata-scrollbar`,onContextmenu:t[0]||=(...e)=>r.onContextMenu&&r.onContextMenu(...e),onMouseenter:t[1]||=(...e)=>r.onMouseenter&&r.onMouseenter(...e),onMouseleave:t[2]||=(...e)=>r.onMouseleave&&r.onMouseleave(...e)},[P(o,{ref:`modalManagerTemplateRef`},null,512),r.contextMenuEnabled?(j(),hd(s,{key:0,ref:`contextMenuTemplateRef`},null,512)):Td(``,!0),P(c,{ref:`headerTemplateRef`,visible:r.isHeaderVisible},null,8,[`visible`]),N(`div`,{class:`bimdata-viewer__content`,style:ii(r.isHeaderVisible?`height: calc(100% - var(--bimdata-viewer-header-height, 40px))`:`height: 100%`)},[r.leftSidePanel?(j(),hd(l,{key:0,"side-panel":r.leftSidePanel,position:`left`},null,8,[`side-panel`])):Td(``,!0),(j(),hd(ll(r.Layout),{style:`height: 100%; flex-grow: 1;`})),r.rightSidePanel?(j(),hd(l,{key:1,"side-panel":r.rightSidePanel,position:`right`},null,8,[`side-panel`])):Td(``,!0)],4),r.loading?(j(),M(`div`,WLr,[r.spinner&&r.spinner.component?(j(),hd(ll(r.spinner.component),ui(kd({key:0},r.spinner.props)),null,16)):(j(),hd(u,{key:1,size:`40px`,border:`5px`}))])):Td(``,!0),!r.isHeaderVisible&&(r.bimdataLogoOnSingleWindow||r.viewerVersionOnSingleWindow)?(j(),M(`div`,GLr,[r.bimdataLogoOnSingleWindow?(j(),hd(d,{key:0,name:`logo`})):Td(``,!0),r.viewerVersionOnSingleWindow?(j(),M(`div`,KLr,O(r.version),1)):Td(``,!0)])):Td(``,!0)],544)}var JLr=F(ULr,[[`render`,qLr],[`__scopeId`,`data-v-0c1c941a`]]),YLr=[`src`],XLr={class:`bimdata-models__header`},ZLr={key:0,class:`bimdata-models__header__loader`},QLr={class:`bimdata-models__header__picto`},$Lr={class:`bimdata-models__header__name`},eRr={key:0,class:`bimdata-models__header__name--empty`},tRr={key:1,class:`bimdata-models__header__name--empty`},nRr={key:3},rRr=[`onMousemove`,`onClick`],iRr=F({__name:`Models`,props:{preview:{type:Boolean,default:!1},windowPositioning:{type:Boolean,default:!0},customFilter:{type:Function,default:null},width:{type:String,default:`350px`}},setup(e){let t=e,n=bs(`$viewer`),r=co(),i=co(0),a=co(0),o=co(),s=lo([]),c=co(!1),l=Zd(()=>n.localContext.loadedModels),u=Zd(()=>n.localContext.loadedModelIds),d=Zd(()=>n.localContext.loadingModelIds),f=Zd(()=>n.localContext.multiModel),p=Zd(()=>(t.customFilter?s.value.filter(t.customFilter):s.value).map(e=>l.value.find(t=>t.document?.head_id!=null&&t.document.head_id===e.document.id)??e)),m=e=>u.value.includes(e),h=e=>d.value.includes(e),g=Zd(()=>{let{x:e,y:t}=o.value?.getBoundingClientRect()??{x:0,y:0};return`top:${a.value-t}px; left:${i.value-e}px;`}),_=e=>{!f.value&&m(e.id)||d.value.length>0||(n.localContext.loadedModelIds.includes(e.id)?n.localContext.unloadModels([e.id]):n.localContext.loadModels([e.id]))},v=e=>{switch(e){case`C`:return`success`;case`E`:return`failed`;case`P`:case`I`:return`sandglass`}},y=(e,t)=>{e?.viewer_360_file&&(i.value=t.clientX,a.value=t.clientY),r.value=e?.viewer_360_file},b=async e=>{c.value=!0;try{return(await n.api.apiClient.modelApi.getModels(n.api.cloudId,n.api.projectId,void 0,void 0,e)).filter(e=>n.state.models.some(e=>e.archived)||!e.archived).sort(Zy(`updated_at`,!1))}catch(e){console.error(`[Models] Cannot get project models. Error: `,e)}finally{c.value=!1}return[]},x=e=>e.children?.some(e=>m(e.id))??!1;return b(n.localContext.modelTypes).then(e=>{s.value=e}),(t,n)=>{let i=A(`BIMDataSpinner`),a=A(`BIMDataIconModel3D`),s=A(`BIMDataTextbox`),b=A(`BIMDataCheckbox`),S=A(`BIMDataRadio`),C=A(`BIMDataIcon`),w=A(`BIMDataDropdownList`);return j(),M(`div`,{ref_key:`templateRef`,ref:o,class:li([`bimdata-models`,{"bimdata-models--window-positioning":e.windowPositioning}])},[r.value?(j(),M(`div`,{key:0,class:`bimdata-models__preview`,style:ii(g.value)},[N(`img`,{src:r.value},null,8,YLr)],4)):Td(``,!0),P(w,{style:ii(`--bimdata-models-width: ${e.width};`),width:e.width,list:p.value,"element-key":`id`,"per-page":40,loading:c.value,class:`bimdata-models__list`,disabled:p.value.length===0,onElementClick:_},{header:k(({isOpen:e})=>[N(`div`,XLr,[c.value||d.value.length>0?(j(),M(`div`,ZLr,[P(i)])):(j(),M(ad,{key:1},[N(`div`,QLr,[P(a)]),N(`div`,{class:li([`bimdata-models__header__number bimdata-info-length`,{"bimdata-models__header__number--empty":u.value.length===0}])},[N(`span`,null,O(u.value.length),1)],2),N(`div`,$Lr,[p.value.length===0?(j(),M(`span`,eRr,O(t.$t(`model.no_model`)),1)):u.value.length===0?(j(),M(`span`,tRr,O(t.$t(`model.no_loaded_model`)),1)):u.value.length===1?(j(),hd(s,{key:2,text:l.value[0].name,tooltip:!e},null,8,[`text`,`tooltip`])):u.value.length>1?(j(),M(`span`,nRr,O(t.$t(`model.selected_models`)),1)):Td(``,!0)])],64))])]),element:k(({element:t,close:r})=>[N(`div`,{class:`bimdata-models__model`,onMousemove:n=>e.preview&&y(t,n),onMouseout:n[0]||=t=>e.preview&&y(),onClick:()=>{!f.value&&!m(t.id)&&r()}},[f.value?(j(),hd(b,{key:0,"model-value":m(t.id)||x(t),disabled:t.status!==`C`||d.value.length>0},null,8,[`model-value`,`disabled`])):(j(),hd(S,{key:1,"model-value":m(t.id)||x(t),disabled:t.status!==`C`||d.value.length>0},null,8,[`model-value`,`disabled`])),P(C,{margin:`0 calc(var(--spacing-unit) / 2)`,name:v(t.status),size:`xs`,class:li({"fill-success":t.status===`C`,"fill-high":t.status===`E`})},null,8,[`name`,`class`]),P(s,{class:li({"bimdata-models__model__name":!0,"bimdata-models__model__name--disabled":t.status!==`C`||d.value.length>0}),text:t.name,width:`calc(100% -
|
|
96054
|
+
`),onMouseenter:t[0]||=(...e)=>r.onMouseEnter&&r.onMouseEnter(...e),onMouseleave:t[1]||=(...e)=>r.onMouseLeave&&r.onMouseLeave(...e)},[P(o,{ref:`modalManagerTemplateRef`},null,512),N(`div`,XIr,[(j(!0),M(ad,null,pl(r.windowPlugins.leftSidePanels,e=>(j(),hd(s,{plugin:e},null,8,[`plugin`]))),256)),N(`div`,ZIr,[(j(!0),M(ad,null,pl(r.windowPlugins.free,e=>(j(),hd(c,{key:e.name,class:li({"window-container__content__center__viewer":e.isViewer}),plugin:e},null,8,[`class`,`plugin`]))),128)),P(l,{position:`left`,plugins:r.windowPlugins.leftButtonColumn},null,8,[`plugins`]),P(l,{position:`right`,plugins:r.windowPlugins.rightButtonColumn},null,8,[`plugins`])]),(j(!0),M(ad,null,pl(r.windowPlugins.rightSidePanels,e=>(j(),hd(s,{plugin:e},null,8,[`plugin`]))),256))]),r.loading?(j(),M(`div`,QIr,[r.spinner&&r.spinner.component?(j(),hd(ll(r.spinner.component),ui(kd({key:0},r.spinner.props)),null,16)):(j(),hd(u,{key:1,size:`20px`,border:`3px`}))])):Td(``,!0),r.layoutSettingsDisplayed?(j(),M(`div`,$Ir,[P(d)])):Td(``,!0)],36)}var tLr=F(YIr,[[`render`,eLr],[`__scopeId`,`data-v-cc5a8745`]]),nLr=class{constructor(e=!0){let t=LFr(t_,null,{resizable:e});t.registerContent(`default`,tLr),this.settings=Ya({edit:!1,swap:!1,full:!1}),this.areas=t}get resizable(){return this.areas.resizable}set resizable(e){this.areas.resizable=e}apply(e=null){this.areas.layout=e?RFr(e):null}copy(e,t=!0){return VFr(this.areas.layout,e,t)}open({ratio:e,direction:t,insertAfter:n,windowName:r=null,windowState:i=null,localContextId:a=null}={}){let o=r?{options:{windowName:r,windowState:i}}:null;return a===null?this.areas.splitLayout(e,t,n,o):this.areas.split(a,e,t,n,o)}swap(e,t){return this.areas.swap(e,t)}close(e){return this.areas.delete(e)}compare(e,t){if(!e&&!t)return!0;if(!e||!t)return!1;if(typeof e==`string`&&typeof t==`string`)return e===t;if(typeof e==`string`||typeof t==`string`)return!1;if(e.windowName&&t.windowName){if(e.windowName!==t.windowName)return!1;let n=new Set(e.windowState?.modelIds),r=new Set(t.windowState?.modelIds);return n.size===r.size&&[...n].every(e=>r.has(e))}return e.windowName||t.windowName||e.direction!==t.direction||e.children.length!==t.children.length?!1:e.children.every((e,n)=>this.compare(e,t.children[n]))}},rLr={name:`@bimdata/viewer`,type:`module`,version:`2.18.0-beta.22`,description:`A customizable BIM viewer.`,keywords:[`bim`,`viewer`,`bimdata`,`ifc`,`bcf`],types:`./index.d.ts`,author:`BIMData.io`,homepage:`https://developers.bimdata.io/viewer/index.html`,repository:{url:`https://github.com/bimdata/viewer`},bugs:{email:`support@bimdata.io`},browserslist:[`last 2 chrome version`,`last 2 firefox version`],main:`dist/bimdata-viewer.esm.min.js`,module:`dist/bimdata-viewer.esm.min.js`,scripts:{dev:`vite -c build/vite.config.dev.js`,build:`node scripts/build.mjs`,"build:prod":`vite build -c build/vite.config.prod.js && esbuild dist/bimdata-viewer.esm.min.js --minify --outfile=dist/bimdata-viewer.esm.min.js --allow-overwrite`,"build:offline":`vite build -c build/vite.config.offline.js && esbuild dist/bimdata-viewer.offline.esm.min.js --minify --outfile=dist/bimdata-viewer.offline.esm.min.js --allow-overwrite`,"build:runtime":`vite build -c build/vite.config.runtime.js && esbuild dist/bimdata-viewer.runtime.esm.min.js --minify --outfile=dist/bimdata-viewer.runtime.esm.min.js --allow-overwrite`,"build:split":`vite build -c build/vite.config.split.js && esbuild dist/bimdata-viewer.split.esm.min.js --minify --outfile=dist/bimdata-viewer.split.esm.min.js --allow-overwrite`,"build:umd":`vite build -c build/vite.config.umd.js && esbuild dist/bimdata-viewer.umd.cjs --minify --outfile=dist/bimdata-viewer.umd.min.cjs`,"cy:run":`cypress run`,"cy:open":`cypress open`,prebuild:`rm -rf dist`,prepublishOnly:`npm run build`,"semantic-release":`semantic-release`,serve:`http-server -c-1 --silent`,test:`npm run test:unit & npm run build & npm run test:e2e`,"test:unit":`jest`,"test:e2e":`start-server-and-test 'npm run serve -- -p 8080' http://localhost:8080 cy:run`,"test:e2e-dev":`start-server-and-test 'npm run serve -- -p 8080' http://localhost:8080 cy:open`,version:`echo $npm_package_version`,ts:`tsc`},files:[`dist/*`,`types/*`,`CHANGELOG.md`,`README.md`,`package.json`,`package-lock.json`,`index.d.ts`],devDependencies:{"@babel/preset-env":`^7.29.2`,"@bimdata/2d-engine":`2.6.7`,"@bimdata/areas-next":`0.1.17`,"@bimdata/bcf-components":`6.7.8`,"@bimdata/components":`1.10.2`,"@bimdata/design-system":`2.4.3`,"@bimdata/engine-2d":`0.0.23`,"@bimdata/html-to-image":`1.11.16`,"@bimdata/typescript-fetch-api-client":`10.47.0`,"@photo-sphere-viewer/core":`^5.15.0`,"@rollup/plugin-alias":`^6.0.0`,"@rollup/plugin-babel":`^7.1.0`,"@rollup/plugin-commonjs":`^29.0.3`,"@rollup/plugin-image":`^3.0.3`,"@rollup/plugin-replace":`^6.0.3`,"@semantic-release/changelog":`^7.0.0`,"@semantic-release/commit-analyzer":`^13.0.1`,"@semantic-release/git":`^11.0.1`,"@semantic-release/github":`^12.0.9`,"@semantic-release/npm":`^13.1.5`,"@semantic-release/release-notes-generator":`^14.1.1`,"@vitejs/plugin-vue":`^6.0.8`,"@xeokit/xeokit-sdk":`git+https://git@github.com/Amoki/xeokit-sdk.git#b3227526bbbe8ac49c8c0c1d121363ca79781824`,"@zip.js/zip.js":`^2.8.34`,async:`^3.2.6`,autoprefixer:`^10.5.4`,"babel-core":`^7.0.0-bridge.0`,"babel-jest":`^30.4.1`,"camera-controls":`^3.1.2`,"conventional-changelog-eslint":`^6.1.0`,cypress:`^15.19.0`,esbuild:`^0.28.1`,globals:`^17.8.0`,html2canvas:`^1.4.1`,"http-server":`^14.1.1`,jest:`^30.4.2`,"jest-environment-jsdom":`^30.4.1`,lodash:`^4.18.1`,"pdfjs-dist":`^6.1.200`,postcss:`^8.5.23`,prettier:`^3.9.6`,"sass-embedded":`^1.100.0`,"semantic-release":`^25.0.8`,"start-server-and-test":`^3.0.11`,three:`0.184.0`,vite:`^8.1.5`,"vite-plugin-css-injected-by-js":`^5.0.2`,vue:`^3.5.40`,"vue-i18n":`^11.4.8`,"web-ifc":`^0.0.77`},allowScripts:{"cypress@15.19.0":!0}},iLr=1,aLr=class{math=tZe;constructor({plugins:e,api:t,ui:n,locale:r=`fr`}){this.instanceId=iLr++,this.pluginManager=new Pkr(e),this.windowManager=new Ikr,this.windowManager.registerAndAddPluginsToWindows([...this.pluginManager.registeredPlugins.values()]),this.api=new kPr(t),this.globalContext=new Qne(this),this.state=WPr(this),this.shortcutManager=v(this.state),this.uiSettings=n||{},this.i18n=new S_(r),this._contextMenu=null,this.layout=new nLr(this.uiSettings.resizable!==!1),this._darkTheme=co(n?.darkTheme??!1),this.localContext=null,window.$viewer=this}get darkTheme(){return this._darkTheme.value}set darkTheme(e){this._darkTheme.value=e}get version(){return rLr.version}get locale(){return this.i18n.locale}get contextMenu(){return this._contextMenu||d}set contextMenu(e){this._contextMenu=e}get registeredWindows(){return[...this.windowManager.registeredWindows.keys()]}get registeredPlugins(){return[...this.pluginManager.registeredPlugins.keys()]}get pluginsCfg(){return this.pluginManager.cfg}registerPlugin(e){this.pluginManager.registerPlugin(e),this.windowManager.registerAndAddPluginsToWindows([e])}};function oLr(e,t={}){t.backgroundColor&&(e.style.setProperty(`--bimdata-viewer-background-color`,t.backgroundColor),t.backgroundColor===`transparent`&&e.style.setProperty(`--areas-separator-color`,`transparent`)),t.colorPrimary&&e.style.setProperty(`--color-primary`,t.colorPrimary),t.colorPrimaryLighter&&e.style.setProperty(`--color-primary-lighter`,t.colorPrimaryLighter),t.colorPrimaryLight&&e.style.setProperty(`--color-primary-light`,t.colorPrimaryLight),t.colorPrimaryDark&&e.style.setProperty(`--color-primary-dark`,t.colorPrimaryDark),t.colorSecondary&&e.style.setProperty(`--color-secondary`,t.colorSecondary),t.colorSecondaryLighter&&e.style.setProperty(`--color-secondary-lighter`,t.colorSecondaryLighter),t.colorSecondaryLight&&e.style.setProperty(`--color-secondary-light`,t.colorSecondaryLight),t.colorSecondaryDark&&e.style.setProperty(`--color-secondary-dark`,t.colorSecondaryDark),t.colorSilverLight&&e.style.setProperty(`--color-silver-light`,t.colorSilverLight),t.colorSilver&&e.style.setProperty(`--color-silver`,t.colorSilver),t.colorSilverDark&&e.style.setProperty(`--color-silver-dark`,t.colorSilverDark),t.colorGraniteLight&&e.style.setProperty(`--color-granite-light`,t.colorGraniteLight),t.colorGranite&&e.style.setProperty(`--color-granite`,t.colorGranite),t.colorSuccess&&e.style.setProperty(`--color-success`,t.colorSuccess),t.colorSuccessLighter&&e.style.setProperty(`--color-success-Lighter`,t.colorSuccessLighter),t.colorSuccessLight&&e.style.setProperty(`--color-success-Light`,t.colorSuccessLight),t.colorSuccessDark&&e.style.setProperty(`--color-success-Dark`,t.colorSuccessDark),t.colorWarning&&e.style.setProperty(`--color-warning`,t.colorWarning),t.colorWarningLighter&&e.style.setProperty(`--color-warning-Lighter`,t.colorWarningLighter),t.colorWarningLight&&e.style.setProperty(`--color-warning-Light`,t.colorWarningLight),t.colorWarningDark&&e.style.setProperty(`--color-warning-Dark`,t.colorWarningDark),t.colorHigh&&e.style.setProperty(`--color-high`,t.colorHigh),t.colorHighLighter&&e.style.setProperty(`--color-high-lighter`,t.colorHighLighter),t.colorHighLight&&e.style.setProperty(`--color-high-light`,t.colorHighLight),t.colorHighDark&&e.style.setProperty(`--color-high-dark`,t.colorHighDark),t.colorText&&e.style.setProperty(`--color-text`,t.colorText),(!t.backgroundColor||t.backgroundColor!==`transparent`)&&e.style.setProperty(`--areas-separator-color`,`rgba(216, 216, 216, 1)`),t.headerHeight!=null&&e.style.setProperty(`--bimdata-viewer-header-height`,t.headerHeight),e.style.setProperty(`--areas-background-color`,`transparent`)}var sLr=Object.freeze({25:`GUEST`,50:`USER`,100:`ADMIN`}),Q9=Object.freeze({READ:`read`,WRITE:`write`});function cLr(e){let t={};return e.forEach(e=>{let[n,r]=e.split(`:`);t[n]?t[n].push(r):t[n]=[r]}),t}var lLr={token_scopes:[],usable_scopes:[],user_role:25};function uLr(e=lLr){let t=cLr(e.token_scopes),n=cLr(e.usable_scopes);return{...QQe(e),tokenScopes:t,usableScopes:n,userRole:sLr[e.user_role],user:e.user?QQe(e.user):null,hasBcfReadPermission:n.bcf?.includes(Q9.READ)??!1,hasBcfWritePermission:n.bcf?.includes(Q9.WRITE)??!1,hasModelReadPermission:n.model?.includes(Q9.READ)??!1,hasModelWritePermission:n.model?.includes(Q9.WRITE)??!1,hasDocReadPermission:n.document?.includes(Q9.READ)??!1,hasDocWritePermission:n.document?.includes(Q9.WRITE)??!1}}var dLr={de:{BcfComponents:{back:`Zurück`,BcfFilters:{filtersButton:`Filter`,filtersTitle:`Filter`,priorityLabel:`Priorität`,statusLabel:`Status`,stageLabel:`Phase`,assignedToLabel:`Zugewiesen an`,creatorsLabel:`Erstellt von`,tagsLabel:`Tags`,resetButton:`Zurücksetzen`,searchButton:`Suchen`,undefined:`Nicht definiert`,datePlaceholder:`Erstellungsdatum`},BcfSettings:{title:`BCF-Parameter`,text:`Erstellen, füllen und listen Sie die BCF-Einstellungen auf, die Sie für dieses Projekt haben möchten.`,validateButton:`Die BCF-Parameter anerkennen`},BcfStatistics:{emptyText:`Fügen Sie Fragen hinzu, um zugehörige Statistiken hier anzuzeigen.`,issues:`Probleme`,extension:{Priority:`Priorität`,PriorityNotDefined:`Keine Priorität`,PriorityTitle:`Prioritäten`,Status:`Status`,StatusNotDefined:`Kein Status`,StatusTitle:`Status`}},BcfTopicCard:{priority:`Priorität`,noPriority:`Keine`,assignedTo:`Zugewiesen an`,elements:`Elemente`,notSpecified:`Nicht definiert`,see:`Anzeigen`},BcfTopicCreationCard:{text:`Ein neues BCF-Thema erstellen`,createBcfSideTitle:`Ein Problem melden`},BcfTopicForm:{dragDropImageText:`Bitte wählen Sie eine Datei aus.`,addObjectButton:`Objekt`,addAnnotationButton:`Annotation`,annotationButtonTooltip:`Zu diesem Thema gibt es derzeit keine Ansichten.`,addPictureButton:`Fügen Sie ein Bild hinzu.`,titlePlaceholder:`Titel *`,titleErrorMessage:`Titel fehlt`,typeLabel:`Typ`,priorityLabel:`Priorität`,statusLabel:`Status`,stageLabel:`Phase`,assignedToLabel:`Zugewiesen an`,dueDateLabel:`Fälligkeitsdatum (TT.MM.JJJJ)`,descriptionLabel:`Beschreibung`,labelsLabel:`Tags`,createButton:`Bestätigen`,updateButton:`Änderungen übernehmen`,modalText:`Sie sind dabei, die Bearbeitung der Ausgabe {Name} zu beenden, aber es gibt noch ungespeicherte Änderungen.`,cancelButton:`Änderungen verwerfen`,continueButton:`Änderungen fortsetzen`,createTitle:`Ein Problem melden`,dragDropImageTextTablet:`Foto machen`,takeSnapshot:`Mach einen Schnappschuss`,importFile:`Eine Datei importieren`,searchPlaceholder:`Suchen`,emptySearch:`kein Ergebnis`,documentsLabel:`Dokumente`,documentsCount:`Dokumente – {count} ausgewählte Dokumente`,groupsLabel:`Berechtigungen`,groupsCount:`Berechtigungen – {count} ausgewählte Gruppen`,groupsText:`Wählen Sie die Benutzergruppen aus, die dieses Thema sehen und damit interagieren dürfen.`,validate:`Bestätigen`},BcfTopicOverview:{openViewer:`Im Viewer öffnen`,openViewerNoModels:`Es sind keine Vorlagen zur Ansicht bereit`,elements:`{count} Elemente`,noElements:`kein Element`,type:`Typ`,noTypeSpecified:`Kein Typ angegeben`,description:`Beschreibung`,noDescriptionProvided:`Keine Beschreibung angegeben`,assignedTo:`Zugeteilt an`,notAssigned:`Nicht zugewiesen`,dueDate:`Fälligkeitsdatum`,noDueDate:`Kein Fälligkeitsdatum`,informations:`Informationen`,status:`Status`,noStatusSpecified:`Kein Status angegeben`,stage:`Phase`,noStageProvided:`Keine Phase angegeben`,priority:`Priorität`,priorityNotDefined:`Nicht definiert`,tags:`Tags`,noTags:`Keine Tags`,commentButton:`Ein Kommentar veröffentlichen`,deleteText:`Sie löschen jetzt {Name}`,deleteBcfButton:`Dieses BCF löschen`,keepBcfButton:`Dieses BCF beibehalten`,author:`Autor`},BcfTopicsTable:{headers:{index:`#`,priority:`Priorität`,status:`Status`,title:`Titel`,creator:`Autor`,date:`Datum`}},BcfTopicActionsCell:{seeButton:`Anzeigen`},BcfTopicComments:{commentButton:`Ein Kommentar verfassen`,commentLabel:`Ein Kommentar verfassen`,commentText:`Kommentar`,cancelButton:`Abbrechen`,publishButton:`Veröffentlichen`,commentsText:`Kommentare`,deleteCommentText:`Diesen Kommentar löschen?`,deleteButton:`Löschen`,takeSnapshot:`Mach einen Schnappschuss`,edited:`bearbeitet`},BcfTopicPriorityCell:{noPriority:`Keine`},SettingCard:{addButton:`ein Element hinzufügen`,cancelButton:`Abbrechen`,validateButton:`Bestätigen`,deleteExtensionText:`Diesen Parameter löschen`,deleteButton:`Löschen`,title:{Priority:`Prioritäten`,Label:`Tags`,Status:`Status`,Type:`Typen`,Stage:`Phasen`},input:{Priority:`Eine neue Priorität hinzufügen`,Label:`Ein neues Etikett hinzufügen`,Status:`Einen neuen Status hinzufügen`,Type:`Einen neuen Typ hinzufügen`,Stage:`Eine neue Phase hinzufügen`},text:{Priority:`Liste der Prioritäten`,Label:`Liste von Tags`,Status:`Liste der Status`,Type:`Liste der Typen`,Stage:`Liste der Phasen`}}}},en:{BcfComponents:{back:`Back`,BcfFilters:{filtersButton:`Filters`,filtersTitle:`Filters`,priorityLabel:`Priority`,statusLabel:`Status`,stageLabel:`Stage`,assignedToLabel:`Assigned to`,creatorsLabel:`Created by`,tagsLabel:`Tags`,resetButton:`Reset`,searchButton:`Search`,undefined:`Not defined`,datePlaceholder:`Creation date`},BcfSettings:{title:`BCF Settings`,text:`Create, enter in, and list the BCF settings you would like to have for this project`,validateButton:`Validate BCF settings`},BcfStatistics:{emptyText:`Add BCF Topics to start to have some stats here.`,issues:`issues`,extension:{Priority:`Priority`,PriorityNotDefined:`No priority`,PriorityTitle:`Priorities`,Status:`Status`,StatusNotDefined:`No status`,StatusTitle:`Status`}},BcfTopicCard:{priority:`Priority`,noPriority:`None`,assignedTo:`Assigned to`,elements:`Elements`,notSpecified:`Not specified`,see:`See`},BcfTopicCreationCard:{text:`Create a new BCF topic`,createBcfSideTitle:`Report a problem`},BcfTopicForm:{dragDropImageText:`Please select a file`,addObjectButton:`Object`,addAnnotationButton:`Annotation`,annotationButtonTooltip:`This topic has no viewpoint`,addPictureButton:`Add a picture`,titlePlaceholder:`Title *`,titleErrorMessage:`Missing title`,typeLabel:`Type`,priorityLabel:`Priority`,statusLabel:`Status`,stageLabel:`Stage`,assignedToLabel:`Assigned to`,dueDateLabel:`Due date`,descriptionLabel:`Description`,labelsLabel:`Tags`,createButton:`Validate`,updateButton:`Modify this BCF`,modalText:`You are about to quit editing issue {name} but there are unsaved changes.`,cancelButton:`Discard changes`,continueButton:`Continue editing`,createTitle:`Report a problem`,dragDropImageTextTablet:`Take a picture`,takeSnapshot:`Take a snapshot`,importFile:`Import a file`,searchPlaceholder:`Search`,emptySearch:`No result`,documentsLabel:`Add a file`,documentsCount:`Files - {count} selected files`,groupsLabel:`Permissions`,groupsCount:`Permissions - {count} selected groups`,groupsText:`You are now setting the access rights: choose the user group(s) that will be exclusively authorized to see and interact with this topic.`,validate:`Validate`},BcfTopicOverview:{openViewer:`Open in viewer`,openViewerNoModels:`No model to open`,elements:`{count} Elements`,noElements:`No element`,type:`Type`,noTypeSpecified:`No type specified`,description:`Description`,noDescriptionProvided:`No description provided`,assignedTo:`Assigned to`,notAssigned:`Not assigned`,dueDate:`Due date`,noDueDate:`No due date`,informations:`Informations`,status:`Status`,noStatusSpecified:`No status specified`,stage:`Stage`,noStageProvided:`No stage provided`,priority:`Priority`,priorityNotDefined:`Not defined`,tags:`Tags`,noTags:`No tags`,commentButton:`Post a comment`,deleteText:`You are about to delete {name}`,deleteBcfButton:`Delete this BCF`,keepBcfButton:`Keep this BCF`,author:`Author`},BcfTopicsTable:{headers:{index:`#`,priority:`Priority`,status:`Status`,title:`Title`,creator:`Author`,date:`Date`}},BcfTopicActionsCell:{seeButton:`See`},BcfTopicComments:{commentButton:`Post a comment`,commentLabel:`Post a comment`,commentText:`Comment`,cancelButton:`Cancel`,publishButton:`Publish`,commentsText:`Comments`,deleteCommentText:`Delete this comment ?`,deleteButton:`Delete`,takeSnapshot:`Take a snapshot`,edited:`edited`},BcfTopicPriorityCell:{noPriority:`None`},SettingCard:{addButton:`add an element`,cancelButton:`Cancel`,validateButton:`Validate`,deleteExtensionText:`Remove this setting`,deleteButton:`Delete`,title:{Priority:`Priorities`,Label:`Labels`,Status:`Status`,Type:`Types`,Stage:`Stages`},input:{Priority:`Add a new priority`,Label:`Add a new label`,Status:`Add new status`,Type:`Add a new type`,Stage:`Add a new stage`},text:{Priority:`Priority list`,Label:`Labels list`,Status:`Status list`,Type:`Type list`,Stage:`Stage list`}}}},es:{BcfComponents:{back:`Volver`,BcfFilters:{filtersButton:`Filtros`,filtersTitle:`Filtros`,priorityLabel:`Prioridad`,statusLabel:`Estado`,stageLabel:`Fase`,assignedToLabel:`Asignado a`,creatorsLabel:`Creado por`,tagsLabel:`Etiquetas:`,resetButton:`Restablecer`,searchButton:`Buscar en`,undefined:`No definido`,datePlaceholder:`Fecha de creación`},BcfSettings:{title:`Parámetros del BCF`,text:`Cree, rellene y enumere los parámetros del BCF que desea tener en este proyecto`,validateButton:`Validar los parámetros del BCF`},BcfStatistics:{emptyText:`Añada preguntas para ver las estadísticas asociadas aquí.`,issues:`problemas`,extension:{Priority:`Prioridad`,PriorityNotDefined:`Sin prioridad`,PriorityTitle:`Prioridades`,Status:`Estado`,StatusNotDefined:`Sin estado`,StatusTitle:`Estatutos`}},BcfTopicCard:{priority:`Prioridad`,noPriority:`Sin`,assignedTo:`Asignado a`,elements:`Elementos`,notSpecified:`No definido`,see:`Ver`},BcfTopicCreationCard:{text:`Crear un nuevo tema BCF`,createBcfSideTitle:`Informar de un problema`},BcfTopicForm:{dragDropImageText:`Seleccione un archivo`,addObjectButton:`Objeto`,addAnnotationButton:`Anotación`,annotationButtonTooltip:`Actualmente este tema no posee ningún punto de vista`,addPictureButton:`Añadir una imagen`,titlePlaceholder:`Título *`,titleErrorMessage:`Falta el título`,typeLabel:`Tipo`,priorityLabel:`Prioridad`,statusLabel:`Estado`,stageLabel:`Fase`,assignedToLabel:`Asignado a`,dueDateLabel:`Fecha de vencimiento (DD/MM/AAAA)`,descriptionLabel:`Descripción`,labelsLabel:`Etiquetas`,createButton:`Validar`,updateButton:`Modificar este BCF`,modalText:`Está a punto de salir de la edición del problema de {name} pero hay cambios sin guardar.`,cancelButton:`Cancelar los cambios`,continueButton:`Continuar con los cambios`,createTitle:`Informar de un problema`,dragDropImageTextTablet:`Tomar una fotografía`,takeSnapshot:`Tomar un snapshot`,importFile:`Importar un archivo`,searchPlaceholder:`Buscar`,emptySearch:`No hay resultados`},BcfTopicOverview:{openViewer:`Abrir en el visor`,openViewerNoModels:`No hay ningún modelo listo para la visualización`,elements:`{count} Elementos`,noElements:`Ningún elemento`,type:`Tipo`,noTypeSpecified:`No se especifica el tipo`,description:`Descripción`,noDescriptionProvided:`No hay descripción`,assignedTo:`Asignado a`,notAssigned:`No asignado`,dueDate:`Plazo`,noDueDate:`Sin fecha de vencimiento`,informations:`Información`,status:`Estado`,noStatusSpecified:`No se especifica el estado`,stage:`Fase`,noStageProvided:`No se indica ninguna fase`,priority:`Prioridad`,priorityNotDefined:`No definido`,tags:`Etiquetas`,noTags:`Sin etiquetas`,commentButton:`Publicar un comentario`,deleteText:`Estás a punto de borrar {name}`,deleteBcfButton:`Borrar este BCF`,keepBcfButton:`Mantenga este BCF`,author:`Autor`},BcfTopicsTable:{headers:{index:`#`,priority:`Prioridad`,status:`Estado`,title:`Título`,creator:`Autor`,date:`Fecha`}},BcfTopicActionsCell:{seeButton:`Ver`},BcfTopicComments:{commentButton:`Publicar un comentario`,commentLabel:`Publicar un comentario`,commentText:`Comentario`,cancelButton:`Cancelar`,publishButton:`Publicar`,commentsText:`comentarios`,deleteCommentText:`¿Borrar este comentario?`,deleteButton:`Borrar`,takeSnapshot:`Tomar un snapshot`},BcfTopicPriorityCell:{noPriority:`Sin`},SettingCard:{addButton:`añadir un elemento`,cancelButton:`Cancelar`,validateButton:`Validar`,deleteExtensionText:`Borrar esta configuración`,deleteButton:`Borrar`,title:{Priority:`Prioridades`,Label:`Etiquetas:`,Status:`Estatutos`,Type:`Tipos`,Stage:`Fases`},input:{Priority:`Añadir una nueva prioridad`,Label:`Añadir una nueva etiqueta`,Status:`Añadir un nuevo estado`,Type:`Añadir un nuevo tipo`,Stage:`Añadir una nueva fase`},text:{Priority:`Lista de prioridades`,Label:`Lista de etiquetas`,Status:`Lista de estatutos`,Type:`Lista de tipos`,Stage:`Lista de fases`}}}},fr:{BcfComponents:{back:`Retour`,BcfFilters:{filtersButton:`Filtres`,filtersTitle:`Filtres`,priorityLabel:`Priorité`,statusLabel:`Statut`,stageLabel:`Phase`,assignedToLabel:`Assigné à`,creatorsLabel:`Créé par`,tagsLabel:`Tags`,resetButton:`Réinitialiser`,searchButton:`Rechercher`,undefined:`Non défini`,datePlaceholder:`Date de création`},BcfSettings:{title:`Paramètres BCF`,text:`Créez, renseignez et listez les paramètres BCF que vous souhaitez avoir sur ce projet`,validateButton:`Valider les paramètres BCF`},BcfStatistics:{emptyText:`Ajoutez des questions pour voir les statistiques associées ici.`,issues:`problèmes`,extension:{Priority:`Priorité`,PriorityNotDefined:`Aucune priorité`,PriorityTitle:`Priorités`,Status:`Statut`,StatusNotDefined:`Aucun statut`,StatusTitle:`Statuts`}},BcfTopicCard:{priority:`Priorité`,noPriority:`Aucune`,assignedTo:`Assigné à`,elements:`{n} Élements`,notSpecified:`Non défini`,see:`Voir`},BcfTopicCreationCard:{text:`Créer un nouveau topic BCF`,createBcfSideTitle:`Signaler un problème`},BcfTopicForm:{dragDropImageText:`Veuillez sélectionner un fichier`,addObjectButton:`Objet`,addAnnotationButton:`Annotation`,annotationButtonTooltip:`Ce topic ne possède actuellement aucun point de vue`,addPictureButton:`Ajouter une image`,titlePlaceholder:`Titre *`,titleErrorMessage:`Titre manquant`,typeLabel:`Type`,priorityLabel:`Priorité`,statusLabel:`Statut`,stageLabel:`Phase`,assignedToLabel:`Assigné à`,dueDateLabel:`Date d'échéance`,descriptionLabel:`Description`,labelsLabel:`Tags`,createButton:`Valider`,updateButton:`Modifier ce BCF`,modalText:`Vous êtes sur le point de quitter l'édition de l'issue {name} mais il y'a des modifications non enregistrées.`,cancelButton:`Annuler les modifications`,continueButton:`Continuer les modifications`,createTitle:`Signaler un problème`,dragDropImageTextTablet:`Prendre une photo`,takeSnapshot:`Prendre un snapshot`,importFile:`Importer un fichier`,searchPlaceholder:`Rechercher`,emptySearch:`Pas de résultat`,documentsLabel:`Documents`,documentsCount:`Documents - {count} documents sélectionnés`,groupsLabel:`Permissions`,groupsCount:`Permissions - {count} groupes sélectionnés`,groupsText:`Sélectionner les groupes utilisateur qui peuvent voir ce topic et intéragir avec.`,validate:`Valider`},BcfTopicOverview:{openViewer:`Ouvrir dans le viewer`,openViewerNoModels:`Il n'y a aucun modèle prêt pour une visualisation`,elements:`{count} Élements`,noElements:`Aucun élément concerné`,type:`Type`,noTypeSpecified:`Pas de type spécifié`,description:`Description`,noDescriptionProvided:`Pas de description renseignée`,assignedTo:`Assigné à`,notAssigned:`Non assigné`,dueDate:`Échéance`,noDueDate:`Pas de date d'échéance`,informations:`Informations`,status:`Statut`,noStatusSpecified:`Pas de statut spécifié`,stage:`Phase`,noStageProvided:`Pas de phase renseignée`,priority:`Priorité`,priorityNotDefined:`Non défini`,tags:`Tags`,noTags:`Pas de tags`,commentButton:`Poster un commentaire`,deleteText:`Vous êtes sur le point de supprimer {name}`,deleteBcfButton:`Supprimer ce BCF`,keepBcfButton:`Conserver ce BCF`,author:`Auteur`},BcfTopicsTable:{headers:{index:`#`,priority:`Priorité`,status:`Statut`,title:`Titre`,creator:`Auteur`,date:`Date`}},BcfTopicActionsCell:{seeButton:`Voir`},BcfTopicComments:{commentButton:`Poster un commentaire`,commentLabel:`Poster un commentaire`,commentText:`Commentaire`,cancelButton:`Annuler`,publishButton:`Publier`,commentsText:`commentaires`,deleteCommentText:`Supprimer ce commentaire ?`,deleteButton:`Supprimer`,takeSnapshot:`Prendre un snapshot`,edited:`edité`},BcfTopicPriorityCell:{noPriority:`Aucune`},SettingCard:{addButton:`ajouter un élément`,cancelButton:`Annuler`,validateButton:`Valider`,deleteExtensionText:`Supprimmer ce paramètre`,deleteButton:`Supprimer`,title:{Priority:`Priorités`,Label:`Tags`,Status:`Statuts`,Type:`Types`,Stage:`Phases`},input:{Priority:`Ajouter une nouvelle priorité`,Label:`Ajouter un nouveau label`,Status:`Ajouter un nouveau statut`,Type:`Ajouter un nouveau type`,Stage:`Ajouter une nouvelle phase`},text:{Priority:`Liste des priorités`,Label:`Liste des tags`,Status:`Liste des statuts`,Type:`Liste des types`,Stage:`Liste des phases`}}}},it:{BcfComponents:{back:`Indietro`,BcfFilters:{filtersButton:`Filtri`,filtersTitle:`Filtri`,priorityLabel:`Priorità`,statusLabel:`Stato`,stageLabel:`Fase`,datePlaceholder:`Data di creazione`,assignedToLabel:`Assegnato a`,creatorsLabel:`Creato da`,tagsLabel:`Etichette`,resetButton:`Ripristina`,searchButton:`Cerca`,undefined:`Non definito`},BcfSettings:{title:`Parametri BCF`,text:`Creare, notificare e elencare i parametri BCF che si desidera avere su questo progetto`,validateButton:`Conferma i parametri BCF`},BcfStatistics:{emptyText:`Aggiungi delle domande per vedere le statistiche associate qui.`,issues:`problemi`,extension:{Priority:`Priorità`,PriorityNotDefined:`Nessuna priorità`,PriorityTitle:`Priorità`,Status:`Stato`,StatusNotDefined:`Nessuno stato`,StatusTitle:`Stati`}},BcfTopicCard:{priority:`Priorità`,noPriority:`Nessuno`,assignedTo:`Assegnato a`,elements:`Elementi`,noElements:`0 elementi`,notSpecified:`Non definito`,see:`Visualizza`},BcfTopicCreationCard:{text:`Crea un nuovo topic BCF`,createBcfSideTitle:`Segnala un problema`},BcfTopicForm:{dragDropImageText:`Selezionare un file`,addObjectButton:`Oggetto`,addAnnotationButton:`Annotazione`,annotationButtonTooltip:`Attualmente questo argomento non presenta alcun punto di vista`,addPictureButton:`Aggiungere un'immagine`,titlePlaceholder:`Titolo *`,titleErrorMessage:`Titolo mancante`,typeLabel:`Tipo`,priorityLabel:`Priorità`,statusLabel:`Stato`,stageLabel:`Fase`,assignedToLabel:`Assegnato a`,dueDateLabel:`Data di scadenza`,descriptionLabel:`Descrizione`,labelsLabel:`Tag`,createButton:`Conferma`,updateButton:`Modificare questo BCF`,modalText:`State per abbandonare la modifica di {name} ma ci sono modifiche non salvate.`,cancelButton:`Annullare le modifiche`,continueButton:`Continuare le modifiche`,createTitle:`Segnala un problema`},BcfTopicOverview:{openViewer:`Apri nel visualizzatore`,openViewerNoModels:`Non esistono modelli pronti per la visualizzazione`,elements:`{count} Elementi`,noElements:`Nessun elemento`,type:`Tipo`,noTypeSpecified:`Nessun tipo specificato`,description:`Descrizione`,noDescriptionProvided:`Nessuna descrizione inserita`,assignedTo:`Assegnato a`,notAssigned:`Non assegnato`,dueDate:`Scadenza`,noDueDate:`Nessuna data di scadenza`,informations:`Informazioni`,status:`Stato`,noStatusSpecified:`Nessuno stato specificato`,stage:`Fase`,noStageProvided:`Nessuna fase inserita`,priority:`Priorità`,priorityNotDefined:`Non definita`,tags:`Etichette`,noTags:`Nessuna etichetta`,commentButton:`Pubblica un commento`,deleteText:`Stai per eliminare {name}`,deleteBcfButton:`Elimina questo BCF`,keepBcfButton:`Conserva questo BCF`,author:`Autore`},BcfTopicsTable:{headers:{index:`#`,priority:`Priorità`,status:`Stato`,title:`Titolo`,creator:`Autore`,date:`Data`}},BcfTopicActionsCell:{seeButton:`Visualizza`},BcfTopicComments:{commentButton:`Pubblica un commento`,commentLabel:`Pubblica un commento`,commentText:`Commento`,cancelButton:`Annulla`,publishButton:`Pubblica`,commentsText:`commenti`,deleteCommentText:`Eliminare questo commento?`,deleteButton:`Elimina`},BcfTopicPriorityCell:{noPriority:`Nessuno`},SettingCard:{addButton:`aggiungi un elemento`,cancelButton:`Annulla`,validateButton:`Conferma`,deleteExtensionText:`Elimina questo parametro`,deleteButton:`Elimina`,title:{Priority:`Priorità`,Label:`Etichette`,Status:`Stati`,Type:`Tipi`,Stage:`Fasi`},input:{Priority:`Aggiungi una nuova priorità`,Label:`Aggiungi una nuova etichetta`,Status:`Aggiungi un nuovo stato`,Type:`Aggiungi un nuovo tipo`,Stage:`Aggiungi una nuova fase`},text:{Priority:`Elenco delle priorità`,Label:`Elenco delle etichette`,Status:`Elenco degli stati`,Type:`Elenco dei tipi`,Stage:`Elenco delle fasi`}}}}},fLr=({apiClient:e,fetchUsers:t,i18nPlugin:n}={})=>({install(r){e?M_.setup({apiClient:e,fetchUsers:t}):console.error(`[BCF Components Plugin] No api client provided. You must provide an api client for the components to work properly.`),n?Object.entries(dLr).forEach(([e,t])=>{n.global.mergeLocaleMessage(e,t)}):console.warn(`[BCF Components Plugin] No i18n instance provided. You should either provide an i18n instance or define your own translations in order have text displayed properly.`),Object.entries(uce).forEach(([e,t])=>{r.component(e,t)})}}),pLr={de:{BuildingMaker:{title:`Building Maker`,back:`Zurück`,list:{text:`Erstellen und bearbeiten Sie die Etagen und laden Sie anschließend Ihre PDFs herunter.`,createButton:`Neues Projekt`,updateButton:`Umbenennen`,deleteButton:`Löschen`},form:{text:`Erstellen und bearbeiten Sie die Etagen und laden Sie anschließend Ihre PDFs herunter.`,input:`Name des Gebäudes`,error:`Ungültiger Name`,createButton:`Erstellen`,updateButton:`Bestätigen`},view:{addStoreyButton:`Etage`,addPlanButton:`Grundriss`,closeButton:`Fertigstellen`,submitFilesButton:`Bestätigen`},storeyForm:{title:`Neue Etage`,input:`Name`,error:`Ungültiger Name`,cancelButton:`Abbrechen`,submitButton:`Bestätigen`}},FileManager:{creationFormTitle:`Ordner erstellen`,renameFormPlaceholder:`Datei- / Ordnernam`,nameInputPlaceholder:`Ordnername`,emptyFolder:`Dieser Ordner ist leer`,newFolderSuccess:`Neuer Ordner erstellt`,renameFolderSuccess:`Umbenannter Ordner`,deleteFolderSuccess:`Ordner gelöscht`,newFileSuccess:`Datei hinzugefügt`,renameFileSuccess:`Umbenannte Datei`,deleteFileSuccess:`Datei gelöscht`,nameInputErrorMessage:`Ungültiger name`,cancel:`Abbrechen`,submit:`Bestätigen`,buttonText:`Neuer Ordner`,addFileButtonText:`Datei laden`,rename:`Umbenennen`,view:`Sehen`,download:`Herunterladen`,delete:`Löschen`,deleteTitle:`Dateien löschen`,deleteDetail:`Sie sind im Begriff, die folgenden Dateien / Ordner endgültig zu löschen`}},en:{BIMDataComponents:{t:{back:`Back`,cancel:`Cancel`,create:`Create`,delete:`Delete`,download:`Download`,finish:`Finish`,rename:`Rename`,search:`Search`,see:`View`,storey:`Storey`,validate:`Validate`}},BuildingMaker:{title:`Building Maker`,list:{text:`Create and edit storeys, then download your PDFs.`,new:`New project`},form:{input:`Building name`,error:`Invalid`},view:{addStorey:`Add Storey`,addFile:`Add File`,addPlan:`Add Plan`},storeyForm:{title:`New storey`,input:`Name`,error:`Invalid name`}},FileManager:{creationFormTitle:`Create folder`,renameFormPlaceholder:`Folder/File name`,nameInputPlaceholder:`Folder name`,emptyFolder:`This folder is empty`,newFolderSuccess:`New folder created`,renameFolderSuccess:`Folder renamed`,deleteFolderSuccess:`Folder deleted`,newFileSuccess:`File added`,renameFileSuccess:`File renamed`,deleteFileSuccess:`File deleted`,nameInputErrorMessage:`Invalid name`,buttonText:`New folder`,addFileButtonText:`Upload a file`,deleteTitle:`Deleting Files`,deleteDetail:`You are about to permanently delete the following files / folders`,dmsRoot:`Root of the project's DMS`,pdfPageSelectorTitle:`Select a page`},MetaBuildingStructure:{title:`Meta-Building Structure`,tab:{structure:`Structure`,zones:`Zones`,equipments:`Equipments`},StoreySelector:{placeholder:`Select a storey`}},PhotosphereBuilding:{title:`Photosphere Building`}},es:{BuildingMaker:{title:`Building Maker`,back:`Vuelta`,list:{text:`Cree y edite los pisos después cargue los PDF.`,createButton:`Nuevo proyecto`,updateButton:`Renombrar`,deleteButton:`Suprimir`},form:{text:`Cree y edite los pisos después cargue los PDF.`,input:`Nombre del edificio`,error:`Nombre no válido`,createButton:`Crear`,updateButton:`Validar`},view:{addStoreyButton:`Piso`,addPlanButton:`Plano`,closeButton:`Terminar`,submitFilesButton:`Validar`},storeyForm:{title:`Nuevo piso`,input:`Nombre`,error:`Nombre no válido`,cancelButton:`Anular`,submitButton:`Validar`}},FileManager:{creationFormTitle:`Crear un archivo`,renameFormPlaceholder:`Nombre de archivo / carpeta`,nameInputPlaceholder:`Nombre de la carpeta`,emptyFolder:`Esta carpeta está vacía`,newFolderSuccess:`Nueva carpeta creada`,renameFolderSuccess:`Carpeta renombrada`,deleteFolderSuccess:`Carpeta eliminada`,newFileSuccess:`Archivo agregado`,renameFileSuccess:`Archivo renombrado`,deleteFileSuccess:`Archivo eliminado`,nameInputErrorMessage:`Nombre inválida`,cancel:`Cancelar`,submit:`Validar`,buttonText:`Carpeta nueva`,addFileButtonText:`Cargar un archivo`,rename:`Renombrar`,view:`Ver`,download:`Descargar`,delete:`Borrar`,deleteTitle:`Eliminar archivos`,deleteDetail:`Está a punto de eliminar permanentemente los siguientes archivos / carpetas`}},fr:{BIMDataComponents:{t:{back:`Retour`,cancel:`Annuler`,create:`Créer`,delete:`Supprimer`,download:`Télécharger`,finish:`Terminer`,rename:`Renommer`,search:`Rechercher`,see:`Voir`,storey:`Étage`,validate:`Valider`}},BuildingMaker:{title:`Building Maker`,list:{text:`Créez et éditez les étages puis téléchagez vos PDF.`,new:`Nouveau projet`},form:{input:`Nom du bâtiment`,error:`Nom invalide`},view:{addStorey:`Ajouter un Étage`,addFile:`Ajouter un fichier`,addPlan:`Ajouter un plan`},storeyForm:{title:`Nouvel étage`,input:`Nom`,error:`Nom invalide`}},FileManager:{creationFormTitle:`Créer un dossier`,renameFormPlaceholder:`Nom du fichier/dosier`,nameInputPlaceholder:`Nom du dossier`,emptyFolder:`Ce dossier est vide`,newFolderSuccess:`Nouveau dossier créé`,renameFolderSuccess:`Dossier renommé`,deleteFolderSuccess:`Dossier supprimé`,newFileSuccess:`Fichier ajouté`,renameFileSuccess:`Fichier renommé`,deleteFileSuccess:`Fichier supprimé`,nameInputErrorMessage:`Nom invalide`,buttonText:`Nouveau dossier`,addFileButtonText:`Charger un fichier`,deleteTitle:`Supression de fichiers`,deleteDetail:`Vous êtes sur le point de supprimer définitivement les fichiers/dossiers suivants`,dmsRoot:`Racine de la GED du projet`,pdfPageSelectorTitle:`Sélectionner une page`},MetaBuildingStructure:{title:`Structure Méta-Building`,tab:{structure:`Structure`,zones:`Zones`,equipments:`Équipements`},StoreySelector:{placeholder:`Sélectionner un étage`}},PhotosphereBuilding:{title:`Photosphère Building`}},it:{BuildingMaker:{title:`Building Maker`,back:`Reso`,list:{text:`Crea e modifica i piani e poi scarica i tuoi PDF.`,createButton:`Nuovo progetto`,updateButton:`Rinominare`,deleteButton:`Eliminare`},form:{text:`Crea e modifica i piani e poi scarica i tuoi PDF.`,input:`Nome della costruzione`,error:`Nome non corretto`,createButton:`Creare`,updateButton:`Convalidare`},view:{addStoreyButton:`Piano`,addPlanButton:`Mappa`,closeButton:`Finire`,submitFilesButton:`Convalidare`},storeyForm:{title:`Nuovo piano`,input:`Nome`,error:`Nome non corretto`,cancelButton:`Annullare`,submitButton:`Convalidare`}},FileManager:{creationFormTitle:`Crea una cartella`,renameFormPlaceholder:`Nome file/cartella`,nameInputPlaceholder:`Nome della cartella`,emptyFolder:`Questa cartella è vuota`,newFolderSuccess:`Nuova cartella creata`,renameFolderSuccess:`Cartella rinominata`,deleteFolderSuccess:`Cartella eliminata`,newFileSuccess:`File aggiunto`,renameFileSuccess:`File rinominato`,deleteFileSuccess:`File cancellato`,nameInputErrorMessage:`Nome non valido`,cancel:`Annulla`,submit:`Invia`,buttonText:`Nuova cartella`,addFileButtonText:`Carica un file`,rename:`Rinominare`,view:`Vedere`,download:`Scaricare`,delete:`Cancellare`,deleteTitle:`Eliminazione di file`,deleteDetail:`Stai per eliminare definitivamente i seguenti file/cartelle`}}},mLr=({i18nPlugin:e}={})=>({install(t){e?Object.entries(pLr).forEach(([t,n])=>{e.global.mergeLocaleMessage(t,n)}):console.warn(`[BIMData Components Plugin] No i18n instance provided. You should either provide an i18n instance or define your own translations in order have text displayed properly.`),Object.entries(dcr).forEach(([e,n])=>{t.component(e,n)})}}),hLr={beforeMount(e,t){if(typeof t.value!=`function`)throw Error(`click away directive needs function, got ${typeof t.value}`);e.clickAwayHandler=n=>{(n.path||n.composedPath&&n.composedPath()).find(t=>t===e)||t.value()},window.addEventListener(`mousedown`,e.clickAwayHandler,!0)},unmounted(e){window.removeEventListener(`mousedown`,e.clickAwayHandler,!0),delete e.clickAwayHandler}},gLr=s({BIMDataClickAway:()=>K_,BIMDataClickInputAway:()=>hLr}),_Lr=e=>({install(t){Object.entries(bze).forEach(([n,r])=>{e&&e.excludedComponents&&e.excludedComponents.length>0&&e.excludedComponents.includes(n)||(!e||!e.includedComponents||e.includedComponents.includes(n))&&t.component(n,r)}),(!e||e.directives!==!1)&&Object.entries(gLr).forEach(([e,n])=>t.directive(e.split(`BIMData`)[1],n))}}),vLr={name:`LiWrapper`,render(){return Qd(`li`,this.$slots.default())}};function yLr(e,t){var n=new Set([]);return e.forEach(e=>{t.has(e)||n.add(e)}),n}var $9=f(`id`),bLr=({contextMenu:e,objects:t=[],state:n=e.$viewer.state,pictos:r})=>[{name:`selectAll`,get group(){return e.groupPositions.select},position:1,get label(){return e.$t(`context_menu.select_all`)},get picto(){return r.get(this.name)},execute:()=>n.selectObjects(t.filter(h(p(`visible`),m(`selected`))).map($9)),predicate:()=>t.some(h(p(`visible`),m(`selected`)))},{name:`deselectAll`,get group(){return e.groupPositions.select},position:2,get label(){return e.$t(`context_menu.deselect_all`)},get picto(){return r.get(this.name)},execute:()=>n.deselectObjects(t.filter(p(`selected`)).map($9)),predicate:()=>t.some(p(`selected`))},{name:`selectSimilar`,get group(){return e.groupPositions.select},position:3,get label(){return e.$t(`context_menu.select_similar`)},get picto(){return r.get(this.name)},execute(){let e=t.filter(e=>e.visible&&e.type===this.selectedObject.type&&e.id!==this.selectedObject.id).map($9);n.selectObjects(e)},selectedObject:null,predicate(){let e=t.filter(h(p(`visible`),p(`selected`)));return e.length===1&&e[0].type!==void 0?(this.selectedObject=e[0],!0):(this.selectedObject=null,!1)}},{name:`reverseSelection`,get label(){return e.$t(`context_menu.reverse_selection`)},get group(){return e.groupPositions.select},position:4,execute:()=>{let e=new Set(t.filter(p(`selected`)).map($9)),r=new Set(t.filter(p(`visible`)).map($9));n.selectObjects(Array.from(yLr(r,e)),{exclusive:!0})},predicate:()=>t.some(h(m(`selected`),p(`visible`)))&&t.some(h(p(`selected`),p(`visible`)))},{name:`showAll`,get group(){return e.groupPositions.visibility},position:1,get label(){return e.$t(`context_menu.show_all`)},get picto(){return r.get(this.name)},execute:()=>n.showObjects(t.filter(m(`visible`)).map($9)),predicate:()=>t.some(m(`visible`))},{name:`hide`,get group(){return e.groupPositions.visibility},position:2,get label(){return e.$t(`global.hide`)},get picto(){return r.get(this.name)},objectsToHide:null,execute(){let e=this.objectsToHide.filter(p(`selected`));e.length>0&&n.deselectObjects(e.map($9)),n.hideObjects(this.objectsToHide.map($9))},predicate(){return this.objectsToHide=t.filter(h(p(`selected`),p(`visible`))),this.objectsToHide.length>0}},{name:`hideAll`,get group(){return e.groupPositions.visibility},position:3,get label(){return e.$t(`context_menu.hide_all`)},execute:()=>{let e=t.filter(p(`visible`));e.some(p(`selected`))&&n.deselectObjects(e.filter(p(`selected`)).map($9)),n.hideObjects(e.map($9))},predicate:()=>t.some(p(`visible`))}].filter(e=>e.predicate()),xLr={components:{LiWrapper:vLr},inject:[`$viewer`],data(){return{enabled:!0,defaultPrevented:!1,displayed:!1,top:null,bottom:null,left:null,width:200,nextCommandId:1,currentCommands:[],contextCommands:[],registeredCommands:[],groupPositions:{select:10,visibility:20},asyncPredicateRunning:!1,activeComponentCommand:null,subMenuPosition:null,subMenuPinned:!1,componentOpenDelay:250,componentCloseDelay:120,subMenuOffset:6}},computed:{position(){return{top:this.top===null?`unset`:this.top+`px`,bottom:this.bottom===null?`unset`:this.bottom+`px`,left:this.left===null?`unset`:this.left+`px`,width:this.width+`px`}}},watch:{displayed(e){e?document.addEventListener(`keydown`,this.onKeyDown):document.removeEventListener(`keydown`,this.onKeyDown)},enabled(e){e||(this.resetTransientState(),this.displayed=!1)}},created(){this.$viewer.contextMenu=this,this.asyncPredicates=new Set,this.componentOpenTimer=null,this.componentCloseTimer=null},beforeUnmount(){this.clearComponentTimers()},methods:{resetTransientState(){this.currentCommands=[],this.contextCommands=[],this.defaultPrevented=!1,this.asyncPredicates.clear(),this.asyncPredicateRunning=!1,this.originEvent=null},onKeyDown(e){e.key===`Escape`&&this.away()},setPosition(e){let t=(document.fullscreenElement?document.fullscreenElement:this.$parent.$el).getBoundingClientRect();this.left=e.clientX-t.left,this.top=e.clientY-t.top,this.left+this.width>t.width&&(this.left-=this.width),e.clientY>t.top+t.height/2?(this.bottom=t.height-this.top,this.top=null):this.bottom=null},typeCheckCommand(e={}){let t=null;if((!e.execute||typeof e.execute!=`function`)&&!e.component&&(t=`Cannot register context menu command. A command must have an execute function or a component property.`),e.label||(t=`Cannot register context menu command. A command must have a label.`),t)throw console.error(t),Error(t);return e.id=this.nextCommandId++,e.component&&io(e.component),e},open(e){if(e.preventDefault(),this.closeComponentMenu(),!this.enabled){this.resetTransientState(),this.displayed=!1;return}this.currentCommands=[],this.setPosition(e),this.originEvent=e,this.setCurrentCommands(),this.groupCurrentCommands(),this.defaultPrevented=!1,this.displayed=!0,document.fullscreenElement?(this.$el.parentElement.removeChild(this.$el),this.adoptiveParent=document.fullscreenElement,this.adoptiveParent.appendChild(this.$el)):this.adoptiveParent&&this.adoptiveParent!==this.$viewer.globalContext.el&&(this.adoptiveParent.removeChild(this.$el),this.$viewer.globalContext.el.appendChild(this.$el),this.adoptiveParent=null)},setCurrentCommands(){this.asyncPredicates.clear(),this.asyncPredicateRunning=!1,this.defaultPrevented||this.registeredCommands.forEach(async e=>{if(typeof e.predicate==`function`){let t=e.predicate(this.$viewer.globalContext.activeLocalContext);if(t===!0)this.currentCommands.push(e);else if(typeof t?.then==`function`){this.asyncPredicates.add(t),this.asyncPredicateRunning=!0;let n=await t;this.asyncPredicates.has(t)&&(this.asyncPredicates.delete(t),this.asyncPredicateRunning=this.asyncPredicates.size>0,n===!0&&this.currentCommands.push(e))}}else this.currentCommands.push(e)}),this.currentCommands.push(...this.contextCommands),this.contextCommands=[]},getDefaultCommands({objects:e=[],state:t=this.$viewer.state,context:n=null}){let r=new Map;return n&&this.$viewer.shortcutManager.getShortcuts(n).forEach(e=>r.set(e.name,e.key)),bLr({contextMenu:this,objects:e,state:t,pictos:r})},executeCommand(e,t){if(e.execute){e.execute(this.originEvent),this.closeComponentMenu(),this.displayed=!1;return}e.component&&this.openComponentMenu(e,this.eventLine(t),!0)},away(){this.close()},close(){this.closeComponentMenu(),this.displayed=!1},clearComponentTimers(){this.componentOpenTimer&&=(clearTimeout(this.componentOpenTimer),null),this.componentCloseTimer&&=(clearTimeout(this.componentCloseTimer),null)},eventLine(e){return e?.currentTarget||e?.target||null},onCommandMouseEnter(e,t){if(!e.component){this.subMenuPinned||this.scheduleCloseComponentMenu();return}if(this.componentCloseTimer&&=(clearTimeout(this.componentCloseTimer),null),this.componentOpenTimer&&=(clearTimeout(this.componentOpenTimer),null),this.activeComponentCommand&&this.activeComponentCommand.id===e.id&&!this.subMenuPinned)return;let n=this.eventLine(t);this.componentOpenTimer=setTimeout(()=>{this.openComponentMenu(e,n,!1)},this.componentOpenDelay)},onCommandMouseLeave(e){e.component&&!this.subMenuPinned&&this.scheduleCloseComponentMenu()},onSubMenuMouseEnter(){this.componentCloseTimer&&=(clearTimeout(this.componentCloseTimer),null)},onSubMenuMouseLeave(){this.subMenuPinned||this.scheduleCloseComponentMenu()},scheduleCloseComponentMenu(){this.componentCloseTimer&&clearTimeout(this.componentCloseTimer),this.componentCloseTimer=setTimeout(()=>{this.subMenuPinned||this.closeComponentMenu()},this.componentCloseDelay)},getPositioningParent(){return document.fullscreenElement?document.fullscreenElement:this.$el?.parentElement||this.$parent.$el},async openComponentMenu(e,t,n=!1){t&&(this.clearComponentTimers(),this.activeComponentCommand=e,this.subMenuPinned=n,this.subMenuPosition={left:`0px`,top:`0px`},await this.$nextTick(),this.placeComponentMenu(t))},placeComponentMenu(e){let t=this.$refs.subMenuElement,n=this.getPositioningParent(),r=this.$el;if(!t||!n||!r||!e?.getBoundingClientRect)return;let i=n.getBoundingClientRect(),a=r.getBoundingClientRect(),o=e.getBoundingClientRect(),s=t.getBoundingClientRect(),c=this.subMenuOffset,l=i.left-a.left,u=i.right-a.left-s.width,d=o.right-a.left+c,f=o.left-a.left-s.width-c;d>u&&f>=l&&(d=f),d=Math.max(l,Math.min(d,u));let p=i.top-a.top,m=i.bottom-a.top-s.height,h=o.top-a.top,g=o.bottom-a.top-s.height;h>m&&g>=p&&(h=g),h=Math.max(p,Math.min(h,m)),this.subMenuPosition={left:d+`px`,top:h+`px`}},closeComponentMenu(){this.clearComponentTimers(),this.activeComponentCommand=null,this.subMenuPosition=null,this.subMenuPinned=!1},groupCurrentCommands(){let e=new Map;this.currentCommands.forEach(t=>{(t.group===null||t.group===void 0)&&(t.group=0),e.has(t.group)?e.get(t.group).push(t):e.set(t.group,[t])}),e.forEach(e=>e.sort((e,t)=>(e.position=e.position||0,t.position=t.position||0,e.position-t.position)));let t=[...e.keys()].sort((e,t)=>e-t).map(t=>e.get(t)).flat();this.currentCommands=t},isGroupIntersection(e){if(e===0)return!1;let t=this.currentCommands[e-1],n=this.currentCommands[e];return t.group<n.group},registerContextCommand(e){let t=this.typeCheckCommand(e);return this.contextCommands.push(t),e.id},registerCommand(e){let t=this.typeCheckCommand(e);return this.registeredCommands.push(t),e.id},unregisterCommand(e){return this.registeredCommands.find(t=>t.id===e)?(this.registeredCommands=this.registeredCommands.filter(t=>t.id!==e),!0):!1},preventDefault(){this.defaultPrevented=!0}}},SLr={key:0,class:`separator`},CLr={class:`menu-text`},wLr={key:1,class:`menu-picto`},TLr={key:1,class:`context-menu__spinner`};function ELr(e,t,n,r,i,a){let o=A(`BIMDataIconChevron`),s=A(`LiWrapper`),c=A(`BIMDataSpinner`),l=ul(`click-away`);return i.displayed&&(i.currentCommands.length||i.asyncPredicateRunning)?_s((j(),M(`ul`,{key:0,class:`bimdata-list context-menu`,style:ii(a.position)},[(j(!0),M(ad,null,pl(i.currentCommands,(e,t)=>(j(),hd(s,{key:e.label,class:`context-menu__element`,onClick:t=>a.executeCommand(e,t),onMouseenter:t=>a.onCommandMouseEnter(e,t),onMouseleave:t=>a.onCommandMouseLeave(e)},{default:k(()=>[a.isGroupIntersection(t)?(j(),M(`div`,SLr)):Td(``,!0),N(`div`,CLr,O(e.label),1),!e.component&&e.picto?(j(),M(`span`,wLr,O(e.picto),1)):e.component?(j(),hd(o,{key:2,size:`xxxs`,class:`fill-primary`})):Td(``,!0)]),_:2},1032,[`onClick`,`onMouseenter`,`onMouseleave`]))),128)),i.activeComponentCommand?(j(),M(`li`,{key:0,ref:`subMenuElement`,class:`context-menu__floating-sub-menu`,style:ii(i.subMenuPosition),onMouseenter:t[0]||=(...e)=>a.onSubMenuMouseEnter&&a.onSubMenuMouseEnter(...e),onMouseleave:t[1]||=(...e)=>a.onSubMenuMouseLeave&&a.onSubMenuMouseLeave(...e)},[(j(),hd(ll(i.activeComponentCommand.component),ui(xd(i.activeComponentCommand.componentProps||{})),null,16))],36)):Td(``,!0),i.asyncPredicateRunning?(j(),M(`li`,TLr,[P(c)])):Td(``,!0)],4)),[[l,a.away]]):Td(``,!0)}var DLr=F(xLr,[[`render`,ELr],[`__scopeId`,`data-v-ffd539d6`]]),OLr={name:`ViewerHeader`,inject:[`$viewer`],props:{visible:{type:Boolean,default:!0}},setup(){let e=bs(`$viewer`),t=Ya(new Map);return{logo:e.uiSettings.bimdataLogo!==!1,version:e.uiSettings.version===!1?null:e.version,headerContent:t,headerRightContentComponents:Zd(()=>Array.from(t.values()).filter(e=>e.position===`right`).sort((e,t)=>e.order-t.order).map(e=>e.component)),headerLeftContentComponents:Zd(()=>Array.from(t.values()).filter(e=>e.position===`left`).sort((e,t)=>e.order-t.order).map(e=>e.component)),addContent:e=>{if(!e.name)throw TypeError(`[Viewer Header] Content must have a name`);if(t.has(e.name))throw Error(`[Viewer Header] Content with name ${e.name} already exists`);t.set(e.name,e)},removeContent:e=>t.has(e)?(t.delete(e),!0):!1}}},kLr={class:`viewer-header`},ALr={class:`viewer-header__content`},jLr={class:`viewer-header__content__left`},MLr={class:`viewer-header__content__right`},NLr={key:0,class:`m-l-6 flex items-center`},PLr={key:1,class:`viewer-header__version`};function FLr(e,t,n,r,i,a){let o=A(`BIMDataIllustration`);return _s((j(),M(`div`,kLr,[N(`div`,ALr,[N(`div`,jLr,[(j(!0),M(ad,null,pl(r.headerLeftContentComponents,e=>(j(),hd(ll(e),{key:e.name}))),128))]),N(`div`,MLr,[(j(!0),M(ad,null,pl(r.headerRightContentComponents,e=>(j(),hd(ll(e),{key:e.name}))),128))])]),r.logo||r.version?(j(),M(`div`,NLr,[r.logo?(j(),hd(o,{key:0,name:`logo`,width:`30px`,height:`30px`})):Td(``,!0),r.version?(j(),M(`div`,PLr,O(r.version),1)):Td(``,!0)])):Td(``,!0)],512)),[[zf,n.visible]])}var ILr=F(OLr,[[`render`,FLr],[`__scopeId`,`data-v-5c9ea6b6`]]),LLr={emits:[`resize`],setup(e,{emit:t}){return{onResizerMousedown:e=>{e.preventDefault();let n=e.clientX,r=e=>{e.preventDefault();let r=e.clientX-n;n=e.clientX,t(`resize`,r)},i=e=>{e.preventDefault(),window.removeEventListener(`mousemove`,r),window.removeEventListener(`mouseup`,i)};window.addEventListener(`mousemove`,r),window.addEventListener(`mouseup`,i)}}}},RLr={class:`bimdata-separator`};function zLr(e,t,n,r,i,a){return j(),M(`div`,RLr,[t[1]||=N(`div`,{class:`bimdata-separator__line`},null,-1),N(`div`,{class:`bimdata-separator__resizer`,onMousedown:t[0]||=(...e)=>r.onResizerMousedown&&r.onResizerMousedown(...e)},null,32)])}var BLr={components:{Separator:F(LLr,[[`render`,zLr],[`__scopeId`,`data-v-79a3b3af`]])},props:{position:{type:String,required:!0,validator(e){return[`left`,`right`].includes(e)}},sidePanel:{type:Object,required:!0,validator(e){if(e.width&&(typeof e.width!=`number`||e.width<0))return console.error(`[GlobalSidePanel] sidePanel.width must be a strictly positive number, received ${typeof e.width}`),!1;let t=typeof e?.component==`object`;return t||console.error(`[GlobalSidePanel] sidePanel must have a component property`),t}}},setup(e){let t=co(null),n=co(e.sidePanel.width??400);return Ds(()=>e.sidePanel,()=>{Object.defineProperty(e.sidePanel,"width",{get(){return n.value},set(e){if(typeof e!=`number`||e<=0){console.error(`[GlobalSidePanel] sidePanel.width must be a strictly positive number, received ${typeof e}`);return}n.value=e}}),Object.defineProperty(e.sidePanel,"componentInstance",{get(){return t.value},enumerable:!0})},{immediate:!0}),{componentInstance:t,width:n,onResize:(e,t=1)=>{let r=n.value+e*t;n.value=Math.max(0,r)}}}},VLr={class:`bimdata-global-side-panel__component`};function HLr(e,t,n,r,i,a){let o=A(`Separator`);return j(),M(`div`,{class:`bimdata-global-side-panel`,style:ii(`width: ${r.width}px`)},[n.sidePanel.resizable&&n.position===`right`?(j(),hd(o,{key:0,onResize:t[0]||=e=>r.onResize(e,-1)})):Td(``,!0),N(`div`,VLr,[(j(),hd(ll(n.sidePanel.component),{ref:`componentInstance`},null,512))]),n.sidePanel.resizable&&n.position===`left`?(j(),hd(o,{key:1,onResize:t[1]||=e=>r.onResize(e)})):Td(``,!0)],4)}var ULr={name:`BimdataViewer`,components:{ContextMenu:DLr,ViewerHeader:ILr,ModalManager:rIr,GlobalSidePanel:F(BLr,[[`render`,HLr],[`__scopeId`,`data-v-82d0d4cb`]])},setup(){let e=bs(`$viewer`),{globalContext:t,shortcutManager:n}=e;tl(()=>{n&&n.destroy(),t.hub.clear()}),Zc(()=>{e.pluginManager.runPluginsScripts(e)});let r=Zd(()=>e.uiSettings.bimdataLogo!==!1&&(t.localContexts.length!==1||t.localContexts[0].window?.logoAndVersion)),i=Zd(()=>e.uiSettings.version!==!1&&(t.localContexts.length!==1||t.localContexts[0].window?.logoAndVersion)?e.version:null),a=Zd(()=>t.leftSidePanel),o=Zd(()=>t.rightSidePanel),s=Zd(()=>{let n=e.uiSettings.header!==!1,r=t.localContexts.length===1&&t.localContexts[0].window?.header===!1,i=!!(a.value||o.value);return n&&(!r||i)}),c=e.uiSettings.contextMenu!==!1,l=co(null);function u(e){c&&l.value.open(e)}function d(){e.shortcutManager.active=!0}function f(){e.shortcutManager.active=!1}return{Layout:e.layout.areas.component,onContextMenu:u,onMouseenter:d,onMouseleave:f,isHeaderVisible:s,viewerTemplateRef:t.templateRef,modalManagerTemplateRef:t.modalManagerTemplateRef,headerTemplateRef:t.headerTemplateRef,contextMenuTemplateRef:l,contextMenuEnabled:c,bimdataLogoOnSingleWindow:r,viewerVersionOnSingleWindow:i,version:e.version,loading:Zd(()=>t.loading),spinner:Zd(()=>t.spinner),leftSidePanel:a,rightSidePanel:o}}},WLr={key:1,class:`bimdata-context-loading-overlay`,style:{"z-index":`3`}},GLr={key:2,class:`viewer__logo`},KLr={key:1,class:`version m-t-6`};function qLr(e,t,n,r,i,a){let o=A(`ModalManager`),s=A(`ContextMenu`),c=A(`ViewerHeader`),l=A(`GlobalSidePanel`),u=A(`BIMDataSpinner`),d=A(`BIMDataIllustration`);return j(),M(`div`,{id:`bimdata-viewer`,ref:`viewerTemplateRef`,class:`bimdata-viewer bimdata-design-system bimdata-scrollbar`,onContextmenu:t[0]||=(...e)=>r.onContextMenu&&r.onContextMenu(...e),onMouseenter:t[1]||=(...e)=>r.onMouseenter&&r.onMouseenter(...e),onMouseleave:t[2]||=(...e)=>r.onMouseleave&&r.onMouseleave(...e)},[P(o,{ref:`modalManagerTemplateRef`},null,512),r.contextMenuEnabled?(j(),hd(s,{key:0,ref:`contextMenuTemplateRef`},null,512)):Td(``,!0),P(c,{ref:`headerTemplateRef`,visible:r.isHeaderVisible},null,8,[`visible`]),N(`div`,{class:`bimdata-viewer__content`,style:ii(r.isHeaderVisible?`height: calc(100% - var(--bimdata-viewer-header-height, 40px))`:`height: 100%`)},[r.leftSidePanel?(j(),hd(l,{key:0,"side-panel":r.leftSidePanel,position:`left`},null,8,[`side-panel`])):Td(``,!0),(j(),hd(ll(r.Layout),{style:`height: 100%; flex-grow: 1;`})),r.rightSidePanel?(j(),hd(l,{key:1,"side-panel":r.rightSidePanel,position:`right`},null,8,[`side-panel`])):Td(``,!0)],4),r.loading?(j(),M(`div`,WLr,[r.spinner&&r.spinner.component?(j(),hd(ll(r.spinner.component),ui(kd({key:0},r.spinner.props)),null,16)):(j(),hd(u,{key:1,size:`40px`,border:`5px`}))])):Td(``,!0),!r.isHeaderVisible&&(r.bimdataLogoOnSingleWindow||r.viewerVersionOnSingleWindow)?(j(),M(`div`,GLr,[r.bimdataLogoOnSingleWindow?(j(),hd(d,{key:0,name:`logo`})):Td(``,!0),r.viewerVersionOnSingleWindow?(j(),M(`div`,KLr,O(r.version),1)):Td(``,!0)])):Td(``,!0)],544)}var JLr=F(ULr,[[`render`,qLr],[`__scopeId`,`data-v-0c1c941a`]]),YLr=[`src`],XLr={class:`bimdata-models__header`},ZLr={key:0,class:`bimdata-models__header__loader`},QLr={class:`bimdata-models__header__picto`},$Lr={class:`bimdata-models__header__name`},eRr={key:0,class:`bimdata-models__header__name--empty`},tRr={key:1,class:`bimdata-models__header__name--empty`},nRr={key:3},rRr=[`onMousemove`,`onClick`],iRr=F({__name:`Models`,props:{preview:{type:Boolean,default:!1},windowPositioning:{type:Boolean,default:!0},customFilter:{type:Function,default:null},width:{type:String,default:`350px`}},setup(e){let t=e,n=bs(`$viewer`),r=co(),i=co(0),a=co(0),o=co(),s=lo([]),c=co(!1),l=Zd(()=>n.localContext.loadedModels),u=Zd(()=>n.localContext.loadedModelIds),d=Zd(()=>n.localContext.loadingModelIds),f=Zd(()=>n.localContext.multiModel),p=Zd(()=>(t.customFilter?s.value.filter(t.customFilter):s.value).map(e=>l.value.find(t=>t.document?.head_id!=null&&t.document.head_id===e.document.id)??e)),m=e=>u.value.includes(e),h=e=>d.value.includes(e),g=Zd(()=>{let{x:e,y:t}=o.value?.getBoundingClientRect()??{x:0,y:0};return`top:${a.value-t}px; left:${i.value-e}px;`}),_=e=>{!f.value&&m(e.id)||d.value.length>0||(n.localContext.loadedModelIds.includes(e.id)?n.localContext.unloadModels([e.id]):n.localContext.loadModels([e.id]))},v=e=>{switch(e){case`C`:return`success`;case`E`:return`failed`;case`P`:case`I`:return`sandglass`}},y=(e,t)=>{e?.viewer_360_file&&(i.value=t.clientX,a.value=t.clientY),r.value=e?.viewer_360_file},b=async e=>{c.value=!0;try{return(await n.api.apiClient.modelApi.getModels(n.api.cloudId,n.api.projectId,void 0,void 0,e)).filter(e=>n.state.models.some(e=>e.archived)||!e.archived).sort(Zy(`updated_at`,!1))}catch(e){console.error(`[Models] Cannot get project models. Error: `,e)}finally{c.value=!1}return[]},x=e=>e.children?.some(e=>m(e.id))??!1;return b(n.localContext.modelTypes).then(e=>{s.value=e}),(t,n)=>{let i=A(`BIMDataSpinner`),a=A(`BIMDataIconModel3D`),s=A(`BIMDataTextbox`),b=A(`BIMDataCheckbox`),S=A(`BIMDataRadio`),C=A(`BIMDataIcon`),w=A(`BIMDataDropdownList`);return j(),M(`div`,{ref_key:`templateRef`,ref:o,class:li([`bimdata-models`,{"bimdata-models--window-positioning":e.windowPositioning}])},[r.value?(j(),M(`div`,{key:0,class:`bimdata-models__preview`,style:ii(g.value)},[N(`img`,{src:r.value},null,8,YLr)],4)):Td(``,!0),P(w,{style:ii(`--bimdata-models-width: ${e.width};`),width:e.width,list:p.value,"element-key":`id`,"per-page":40,loading:c.value,class:`bimdata-models__list`,disabled:p.value.length===0,onElementClick:_},{header:k(({isOpen:e})=>[N(`div`,XLr,[c.value||d.value.length>0?(j(),M(`div`,ZLr,[P(i)])):(j(),M(ad,{key:1},[N(`div`,QLr,[P(a)]),N(`div`,{class:li([`bimdata-models__header__number bimdata-info-length`,{"bimdata-models__header__number--empty":u.value.length===0}])},[N(`span`,null,O(u.value.length),1)],2),N(`div`,$Lr,[p.value.length===0?(j(),M(`span`,eRr,O(t.$t(`model.no_model`)),1)):u.value.length===0?(j(),M(`span`,tRr,O(t.$t(`model.no_loaded_model`)),1)):u.value.length===1?(j(),hd(s,{key:2,text:l.value[0].name,tooltip:!e},null,8,[`text`,`tooltip`])):u.value.length>1?(j(),M(`span`,nRr,O(t.$t(`model.selected_models`)),1)):Td(``,!0)])],64))])]),element:k(({element:t,close:r})=>[N(`div`,{class:`bimdata-models__model`,onMousemove:n=>e.preview&&y(t,n),onMouseout:n[0]||=t=>e.preview&&y(),onClick:()=>{!f.value&&!m(t.id)&&r()}},[f.value?(j(),hd(b,{key:0,"model-value":m(t.id)||x(t),disabled:t.status!==`C`||d.value.length>0},null,8,[`model-value`,`disabled`])):(j(),hd(S,{key:1,"model-value":m(t.id)||x(t),disabled:t.status!==`C`||d.value.length>0},null,8,[`model-value`,`disabled`])),P(C,{margin:`0 calc(var(--spacing-unit) / 2)`,name:v(t.status),size:`xs`,class:li({"fill-success":t.status===`C`,"fill-high":t.status===`E`})},null,8,[`name`,`class`]),P(s,{class:li({"bimdata-models__model__name":!0,"bimdata-models__model__name--disabled":t.status!==`C`||d.value.length>0}),text:t.name,width:`calc(100% -
|
|
96055
96055
|
${f.value?13:23}px - 2 * 6px - 16px)`},null,8,[`class`,`text`,`width`]),t.document&&!t.document.is_head_version?(j(),hd(C,{key:2,name:`versioning`,fill:``,color:`default`,size:`xs`,margin:`0 0 0 6px`})):Td(``,!0)],40,rRr),h(t.id)?(j(),hd(i,{key:0,class:`bimdata-models__model__spinner`})):Td(``,!0)]),_:1},8,[`style`,`width`,`list`,`loading`,`disabled`])],2)}}},[[`__scopeId`,`data-v-34c2cf79`]]),aRr=`data:image/svg+xml,%3csvg%20width='16'%20height='21'%20viewBox='0%200%2016%2021'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M7.47193%202.76644C7.65699%202.84439%207.77716%203.02565%207.777%203.22661L7.77339%207.94624C7.77318%208.22238%207.54916%208.44655%207.27301%208.44693L2.4192%208.45366C2.21569%208.45394%202.03258%208.33085%201.95617%208.1424C1.87975%207.95394%201.92528%207.73773%202.07129%207.59566L6.92872%202.86931C7.0729%202.72902%207.28688%202.6885%207.47193%202.76644ZM3.65141%207.45195L6.77378%207.44762L6.7761%204.41157L3.65141%207.45195ZM5.81657%200.893911L6.02338%200.893274L13.3879%200.870595C14.679%200.866619%2015.7208%201.91642%2015.722%203.20083L15.2221%203.20237L15.722%203.20052L15.722%203.20083L15.745%2017.8999L15.745%2017.9002C15.7462%2019.1846%2014.7063%2020.2408%2013.4153%2020.2448L2.35929%2020.2788C1.07114%2020.2828%200.0171799%2019.2362%200.0159721%2017.9486L0.00563138%206.92409L0.00543684%206.71668L0.152103%206.56972L5.67032%201.04045L5.81657%200.893911ZM6.23113%201.89264L1.00582%207.12841L1.01597%2017.9455C1.01666%2018.6791%201.62068%2019.2811%202.35835%2019.2788L13.4143%2019.2448C14.1484%2019.2425%2014.7456%2018.6402%2014.745%2017.9035C14.745%2017.9034%2014.745%2017.9033%2014.745%2017.9033L14.722%203.20423L14.722%203.20391C14.7213%202.46716%2014.123%201.86833%2013.3888%201.87059L6.23113%201.89264Z'%20fill='%232F374A'/%3e%3c/svg%3e`,oRr=[`src`],sRr={key:0,class:`bimdata-multi-model-loader__header-container`},cRr={key:0,class:`bimdata-multi-model-loader__header__loader`},lRr={class:`bimdata-multi-model-loader__header__picto`},uRr=[`src`],dRr={class:`bimdata-multi-model-loader__header__name`},fRr={key:0,class:`bimdata-multi-model-loader__header__name--empty`},pRr={key:1,class:`bimdata-multi-model-loader__header__name--empty`},mRr={key:3},hRr={key:1,class:`bimdata-multi-model-loader__main`},gRr=[`onMousemove`,`onClick`],_Rr=F({__name:`BIMDataMultiModelLoader`,props:{preview:{type:Boolean,default:!1},windowPositioning:{type:Boolean,default:!0},customFilter:{type:Function,default:null},width:{type:String,default:`350px`},statusProperty:{type:String,default:`status`}},setup(e){let t=e,n=bs(`$viewer`),r=co(),i=co(0),a=co(0),o=co(),s=lo([]),c=co(!1),l=co(!0),u=e=>{e.key===`Escape`?l.value=!0:e.key===`Enter`&&w()};Ds(l,e=>{e?(window.removeEventListener(`keydown`,u),y.clear(),v.clear(),r.value=null):window.addEventListener(`keydown`,u)});let d=Zd(()=>n.localContext.loadedModels),f=Zd(()=>n.localContext.loadedModelIds),p=Zd(()=>n.localContext.loadingModelIds),m=Zd(()=>n.localContext.multiModel),h=Zd(()=>(t.customFilter?s.value.filter(t.customFilter):s.value).map(e=>d.value.find(t=>t.document?.head_id!=null&&t.document.head_id===e.document.id)??e)),g=e=>f.value.includes(e),_=e=>p.value.includes(e),v=Ya(new Set),y=Ya(new Set),b=e=>e.children?.some(e=>g(e.id))??!1,x=e=>(g(e.id)||b(e)||v.has(e))&&!y.has(e),S=Zd(()=>{let{x:e,y:t}=o.value.getBoundingClientRect();return`top:${a.value-t}px; left:${i.value-e}px;`}),C=e=>{e[t.statusProperty]===`C`&&(!m.value&&g(e.id)||(g(e.id)?y.has(e)?y.delete(e):y.add(e):v.has(e)?v.delete(e):v.add(e)))},w=()=>{v.size>0&&n.localContext.loadModels(Array.from(v).map(e=>e.id)),y.size>0&&n.localContext.unloadModels(Array.from(y).map(e=>e.id)),l.value=!0},T=e=>{switch(e){case`C`:return`success`;case`E`:return`failed`;case`P`:case`I`:return`sandglass`}},E=e=>e.document&&!e.document.is_head_version,D=(e,n)=>{!t.preview||l.value||(e?.viewer_360_file&&(i.value=n.clientX,a.value=n.clientY),r.value=e?.viewer_360_file)};return(async e=>{c.value=!0;try{return(await n.api.apiClient.modelApi.getModels(n.api.cloudId,n.api.projectId,void 0,void 0,e)).filter(e=>n.state.models.some(e=>e.archived)||!e.archived).sort(Zy(`updated_at`,!1))}catch(e){console.error(`[Models] Cannot get project models. Error: `,e)}finally{c.value=!1}return[]})(n.localContext.modelTypes).then(e=>{s.value=e}),(t,n)=>{let i=A(`BIMDataSpinner`),a=A(`BIMDataTextbox`),s=A(`BIMDataIconChevron`),u=A(`BIMDataButton`),g=A(`BIMDataIconFileIfcPolychrome`),b=A(`BIMDataCheckbox`),ee=A(`BIMDataRadio`),te=A(`BIMDataIcon`),ne=A(`BIMDataPaginatedList`),re=ul(`click-away`);return j(),M(`div`,{ref_key:`templateRef`,ref:o,class:li([`bimdata-multi-model-loader`,{"bimdata-multi-model-loader--window-positioning":e.windowPositioning}])},[r.value?(j(),M(`div`,{key:0,class:`bimdata-multi-model-loader__preview`,style:ii(S.value)},[N(`img`,{src:r.value},null,8,oRr)],4)):Td(``,!0),P(Sf,{name:`fade`,mode:`out-in`},{default:k(()=>[l.value?(j(),M(`div`,sRr,[hl(t.$slots,`left`,{},void 0,!0),N(`div`,{class:`bimdata-multi-model-loader__header`,onClick:n[0]||=e=>l.value=!1},[c.value||p.value.length>0?(j(),M(`div`,cRr,[P(i)])):(j(),M(ad,{key:1},[N(`div`,lRr,[N(`img`,{src:mo(aRr),alt:`file icon`},null,8,uRr)]),N(`div`,{class:li([`bimdata-multi-model-loader__header__number bimdata-info-length`,{"bimdata-multi-model-loader__header__number--empty":f.value.length===0}])},[N(`span`,null,O(f.value.length),1)],2),N(`div`,dRr,[h.value.length===0?(j(),M(`span`,fRr,O(t.$t(`model.no_model`)),1)):f.value.length===0?(j(),M(`span`,pRr,O(t.$t(`model.no_loaded_model`)),1)):f.value.length===1?(j(),hd(a,{key:2,text:d.value[0].name,tooltip:l.value,width:`233px`},null,8,[`text`,`tooltip`])):f.value.length>1?(j(),M(`span`,mRr,O(t.$t(`model.selected_models`)),1)):Td(``,!0)]),P(u,{color:`default`,icon:``,radius:``,fill:``,width:`21px`,height:`21px`},{default:k(()=>[P(s,{size:`xxxs`})]),_:1})],64))]),hl(t.$slots,`right`,{},void 0,!0)])):_s((j(),M(`div`,hRr,[P(ne,{list:h.value,"per-page":10},{element:k(({element:t})=>[N(`div`,{class:li([`bimdata-multi-model-loader__main__model`,{"bimdata-multi-model-loader__main__model--disabled":t[e.statusProperty]!==`C`}]),onMousemove:e=>D(t,e),onMouseout:n[1]||=e=>D(),onClick:e=>C(t)},[P(g,{fill:``,color:`default`,size:`xs`}),m.value?(j(),hd(b,{key:0,"model-value":x(t),disabled:t[e.statusProperty]!==`C`},null,8,[`model-value`,`disabled`])):(j(),hd(ee,{key:1,"model-value":x(t),disabled:t[e.statusProperty]!==`C`},null,8,[`model-value`,`disabled`])),P(a,{class:li({"bimdata-multi-model-loader__main__model__name":!0,"bimdata-multi-model-loader__main__model__name--disabled":t[e.statusProperty]!==`C`}),text:t.name,width:E(t)?`333px`:`363px`},null,8,[`class`,`text`,`width`]),E(t)?(j(),hd(te,{key:2,name:`versioning`,fill:``,color:`default`,size:`xs`,margin:`0 0 0 6px`})):Td(``,!0),_(t.id)?(j(),hd(i,{key:3,class:`bimdata-multi-model-loader__main__model__spinner`})):(j(),hd(te,{key:4,name:T(t[e.statusProperty]),size:`xs`,class:li({"fill-success":t[e.statusProperty]===`C`,"fill-high":t[e.statusProperty]===`E`})},null,8,[`name`,`class`]))],42,gRr)]),_:1},8,[`list`]),P(u,{class:`bimdata-multi-model-loader__main__validate`,width:`93px`,color:`primary`,fill:``,radius:``,disabled:mo(v).size===0&&mo(y).size===0,onClick:w},{default:k(()=>[Cd(O(t.$t(`global.validate`)),1)]),_:1},8,[`disabled`])])),[[re,()=>l.value=!0]])]),_:3})],2)}}},[[`__scopeId`,`data-v-e99c2e7b`]]),vRr={data(){return{shown:!1}},mounted(){setTimeout(()=>{this.shown=!0},500)}};function yRr(e,t,n,r,i,a){let o=A(`BIMDataIllustration`);return j(),M(`div`,{class:`bimdata__no-model`,style:ii({"--no-model--opacity":+!!i.shown})},[P(o,{name:`emptyViewer`,x:`90`,y:`90`}),N(`span`,null,O(e.$t(`model.select_model`)),1)],4)}var bRr=F(vRr,[[`render`,yRr],[`__scopeId`,`data-v-5ffd9bc0`]]);window.BIMDataViewerVue=t_;var xRr=class{constructor(e={}){let{api:t={},ui:n}=e;this.uiCfg=n,t.apiUrl||=(console.info("[BIMData Viewer] INFO - Viewer config - `apiUrl` not set, use 'https://api.bimdata.io' by default."),`https://api.bimdata.io`),t.archiveUrl||=(console.info("[BIMData Viewer] INFO - Viewer config - `archiveUrl` not set, use 'https://archive.bimdata.io' by default."),`https://archive.bimdata.io`),t.pdfBackendUrl||=(console.info("[BIMData Viewer] INFO - Viewer config - `pdfBackendUrl` not set, use 'https://pdf-backend.bimdata.io' by default."),`https://pdf-backend.bimdata.io`),t.ifcIds&&(console.warn("[BIMData Viewer] DEPRECATED - Viewer config - please use the `modelIds` property instead of `ifcIds`."),t.modelIds===void 0&&(t.modelIds=t.ifcIds)),t.modelIds||=[],t.offline?.dataFile&&(t.offline.data=t.offline.dataFile),this.$viewer=new aLr(e),t.offline?.enabled?this.$viewer.api.enableOfflineMode(t.offline.data,t.offline.options).then(()=>this.state.loadModels(t.modelIds)):(this.$viewer.globalContext.loadingProcessStart(),this.state.loadModels(t.modelIds).finally(()=>this.$viewer.globalContext.loadingProcessEnd())),this.vueApp=null}get state(){return this.$viewer.state}get api(){return this.$viewer.api}async mount(e,t=`3d`){let{$viewer:n}=this;await n.api.ready;try{let e=await n.api.apiClient.collaborationApi.checkProjectAccess(n.api.cloudId,n.api.projectId);n.api.permissions=uLr(e)}catch{n.api.permissions=uLr()}let r=this.api.accessToken,{i18n:i}=n;i.registerTranslations(n.pluginManager.pluginTranslations),n.layout.apply(t);let a=tm({i18n:i.i18nVuePlugin,data(){return{accessToken:r}},render(){return Qd(JLr,{style:`height: 100%`})}}).use(i.i18nVuePlugin).use(_Lr()).use(mLr({i18nPlugin:i.i18nVuePlugin})).use(fLr({apiClient:n.api.apiClient,i18nPlugin:i.i18nVuePlugin}));a.provide(`$viewer`,n),a.provide(`BIMDATA_DESIGN_SYSTEM_DARK_THEME`,Zd(()=>n.darkTheme)),a.component(`BIMDataModelLoader`,iRr),a.component(`BIMDataMultiModelLoader`,_Rr),a.component(`BIMDataNoModelWindowPlaceHolder`,bRr),a.component(`BIMDataStoreySelector`,z3e),a.component(`ModelsLoader`,iRr),a.component(`NoModelWindowPlaceHolder`,bRr);let o=e instanceof HTMLElement?e:document.querySelector(e);o&&(o.style.height=`100%`);let s=a.mount(e);return s.$viewer=n,oLr(s.$el,this.uiCfg?.style),typeof window<`u`&&(window.bimdataViewer=s),this.vueApp=a,s}destroy(){this.vueApp?.unmount()}setLocale(e){if(!x_.includes(e))throw Error(`Viewer available locales are ${x_.join(`, `)}.`);this.$viewer.i18n.locale=e}registerPlugin(e){this.$viewer.registerPlugin(e)}registerWindow(e){return this.$viewer.windowManager.registerWindow(e)}unregisterWindow(e){return this.$viewer.windowManager.unregisterWindow(e)}setAccessToken(e){this.api.accessToken=e}async loadModels(e){this.$viewer.globalContext.loadingProcessStart();let t=await this.state.loadModels(e);return this.$viewer.globalContext.loadingProcessEnd(),t}loadIfcs(e){return console.warn(`[BIMData Viewer] DEPRECATED - Viewer - please use the loadModels method instead of loadIfcs.`),this.loadModels(e)}},SRr=(e={})=>new xRr(e);return window.makeBIMDataViewer=SRr,SRr});
|