UNPKG

@inweb/viewer-visualize

Version:

JavaScript library for rendering CAD and BIM files in a browser using VisualizeJS

24 lines (23 loc) 341 kB
/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2025, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Open Design Alliance software pursuant to a // license agreement with Open Design Alliance. // Open Design Alliance Copyright (C) 2002-2025 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(((t="undefined"!=typeof globalThis?globalThis:t||self).ODA=t.ODA||{},t.ODA.Visualize=t.ODA.Visualize||{}))}(this,function(t){"use strict";class e{constructor(){this._commands=new Map}registerCommand(t,e,i,s){this._commands.set(t,{id:t,handler:e,thisArg:s,description:i})}registerCommandAlias(t,e){this.registerCommand(e,(e,...i)=>this.executeCommand(t,e,...i))}getCommand(t){return this._commands.get(t)}getCommands(){const t=new Map;return this._commands.forEach((e,i)=>t.set(i,e)),t}executeCommand(t,e,...i){const s=this._commands.get(t);if(!s){if(e){if(e.draggers.includes(t))return e.setActiveDragger(t)}return void console.warn(`Command '${t}' not found`)}const{handler:r,thisArg:n}=s,o=r.apply(n,[e,...i]);return null==e||e.emit({type:"command",data:t,args:i}),o}}const i=new Map;function s(t=""){let s=i.get(t);return s||(s=new e,i.set(t,s)),s}class r{constructor(){this._providers=new Map}registerDragger(t,e){this._providers.set(t,e)}registerDraggerAlias(t,e){const i=this._providers.get(t);i&&this.registerDragger(e,t=>i(t))}getDraggers(){const t=new Map;return this._providers.forEach((e,i)=>t.set(i,e)),t}createDragger(t,e){const i=this._providers.get(t);if(!i)return null;const s=i(e);return s.name=t,s}}const n=new Map;function o(t=""){let e=n.get(t);return e||(e=new r,n.set(t,e)),e}class a{constructor(){this._providers=new Map}registerComponent(t,e){this._providers.set(t,e)}registerComponentAlias(t,e){const i=this._providers.get(t);i&&this.registerComponent(e,t=>i(t))}getComponents(){const t=new Map;return this._providers.forEach((e,i)=>t.set(i,e)),t}createComponent(t,e){const i=this._providers.get(t);if(!i)return null;const s=i(e);return s.name=t,s}}const h=new Map;function l(t=""){let e=h.get(t);return e||(e=new a,h.set(t,e)),e}class d{constructor(){this.name="",this.abortController=new AbortController}dispose(){this.abortController.abort(),this.abortController=void 0}isSupport(t,e){return!1}load(t,e,i){return Promise.resolve(this)}cancel(){this.abortController.abort()}extractFileName(t){const e=/[^/\\?#:]+(?=\?|#|$)/;return"string"==typeof t?(t.match(e)||[])[0]:t instanceof globalThis.File?(t.name.match(e)||[])[0]:void 0}}class c{constructor(){this._providers=new Map}registerLoader(t,e){this._providers.set(t,e)}getLoader(t){return this._providers.get(t)}getLoaders(){const t=new Map;return this._providers.forEach((e,i)=>t.set(i,e)),t}createLoader(t,e,i){let s=null;return this._providers.forEach((r,n)=>{const o=r(t);o.isSupport(e,i)&&(s=o,s.name=n)}),s}}const u=new Map;function g(t=""){let e=u.get(t);return e||(e=new c,u.set(t,e)),e}function p(){return{showWCS:!0,cameraAnimation:!0,antialiasing:!0,groundShadow:!1,shadows:!1,cameraAxisXSpeed:4,cameraAxisYSpeed:1,ambientOcclusion:!1,enableStreamingMode:!0,enablePartialMode:!1,memoryLimit:3294967296,cuttingPlaneFillColor:{red:255,green:152,blue:0},edgesColor:{r:255,g:152,b:0},facesColor:{r:255,g:152,b:0},edgesVisibility:!0,edgesOverlap:!0,facesOverlap:!1,facesTransparancy:200,enableCustomHighlight:!0,sceneGraph:!1,edgeModel:!0,reverseZoomWheel:!1,enableZoomWheel:!0,enableGestures:!0,geometryType:"vsfx",rulerUnit:"Default",rulerPrecision:2,cameraMode:"perspective"}}class m{constructor(t){this._emitter=t,this._data={showWCS:!0,cameraAnimation:!0,antialiasing:!0,groundShadow:!1,shadows:!1,cameraAxisXSpeed:4,cameraAxisYSpeed:1,ambientOcclusion:!1,enableStreamingMode:!0,enablePartialMode:!1,memoryLimit:3294967296,cuttingPlaneFillColor:{red:255,green:152,blue:0},edgesColor:{r:255,g:152,b:0},facesColor:{r:255,g:152,b:0},edgesVisibility:!0,edgesOverlap:!0,facesOverlap:!1,facesTransparancy:200,enableCustomHighlight:!0,sceneGraph:!1,edgeModel:!0,reverseZoomWheel:!1,enableZoomWheel:!0,enableGestures:!0,geometryType:"vsfx",rulerUnit:"Default",rulerPrecision:2,cameraMode:"perspective"},this.loadFromStorage()}static defaults(){return{showWCS:!0,cameraAnimation:!0,antialiasing:!0,groundShadow:!1,shadows:!1,cameraAxisXSpeed:4,cameraAxisYSpeed:1,ambientOcclusion:!1,enableStreamingMode:!0,enablePartialMode:!1,memoryLimit:3294967296,cuttingPlaneFillColor:{red:255,green:152,blue:0},edgesColor:{r:255,g:152,b:0},facesColor:{r:255,g:152,b:0},edgesVisibility:!0,edgesOverlap:!0,facesOverlap:!1,facesTransparancy:200,enableCustomHighlight:!0,sceneGraph:!1,edgeModel:!0,reverseZoomWheel:!1,enableZoomWheel:!0,enableGestures:!0,geometryType:"vsfx",rulerUnit:"Default",rulerPrecision:2,cameraMode:"perspective"}}notifierChangeEvent(){console.warn("Options.notifierChangeEvent() has been deprecated since 25.3 and will be removed in a future release, use Options.change() instead."),this.change()}change(){void 0!==this._emitter&&(this.saveToStorage(),this._emitter.emit({type:"optionschange",data:this}))}saveToStorage(){if("undefined"!=typeof window)try{localStorage.setItem("od-client-settings",JSON.stringify(this.data))}catch(t){console.error("Cannot save client settings.",t)}}loadFromStorage(){if("undefined"!=typeof window)try{const t=localStorage.getItem("od-client-settings");if(t){const e=JSON.parse(t);this.data={...e}}}catch(t){console.error("Cannot load client settings.",t)}}resetToDefaults(t){if(void 0!==t){const e=m.defaults(),i=t.reduce((t,i)=>(t[i]=e[i],t),{});this.data={...this.data,...i}}else this.data={...this.data,...m.defaults()}}get data(){return this._data}set data(t){const e=!!t.enableStreamingMode&&t.enablePartialMode,i=!e&&t.sceneGraph;this._data={...m.defaults(),...this._data,...t,enablePartialMode:e,sceneGraph:i},this.change()}get showWCS(){return this._data.showWCS}set showWCS(t){this._data.showWCS=t,this.change()}get cameraAnimation(){return this._data.cameraAnimation}set cameraAnimation(t){this._data.cameraAnimation=t,this.change()}get antialiasing(){return this._data.antialiasing}set antialiasing(t){this._data.antialiasing=t,this.change()}get groundShadow(){return this._data.groundShadow}set groundShadow(t){this._data.groundShadow=t,this.change()}get shadows(){return this._data.shadows}set shadows(t){this._data.shadows=t,this.change()}get cameraAxisXSpeed(){return this._data.cameraAxisXSpeed}set cameraAxisXSpeed(t){this._data.cameraAxisXSpeed=t,this.change()}get cameraAxisYSpeed(){return this._data.cameraAxisYSpeed}set cameraAxisYSpeed(t){this.cameraAxisYSpeed=t,this.change()}get ambientOcclusion(){return this._data.ambientOcclusion}set ambientOcclusion(t){this._data.ambientOcclusion=t,this.change()}get enableStreamingMode(){return this._data.enableStreamingMode}set enableStreamingMode(t){this._data.enableStreamingMode=t,t||(this._data.enablePartialMode=!1),this.change()}get enablePartialMode(){return this._data.enablePartialMode}set enablePartialMode(t){this._data.enablePartialMode=t,t&&(this._data.enableStreamingMode=!0,this._data.sceneGraph=!1),this.change()}get memoryLimit(){return this._data.memoryLimit}set memoryLimit(t){this._data.memoryLimit=t,this.change()}get cuttingPlaneFillColor(){return this._data.cuttingPlaneFillColor}set cuttingPlaneFillColor(t){this._data.cuttingPlaneFillColor=t,this.change()}get edgesColor(){return this._data.edgesColor}set edgesColor(t){this._data.edgesColor=t,this.change()}get facesColor(){return this._data.facesColor}set facesColor(t){this._data.facesColor=t,this.change()}get edgesVisibility(){return this._data.edgesVisibility}set edgesVisibility(t){this._data.edgesVisibility=t,this.change()}get edgesOverlap(){return this._data.edgesOverlap}set edgesOverlap(t){this._data.edgesOverlap=t,this.change()}get facesOverlap(){return this._data.facesOverlap}set facesOverlap(t){this._data.facesOverlap=t,this.change()}get facesTransparancy(){return this._data.facesTransparancy}set facesTransparancy(t){this._data.facesTransparancy=t,this.change()}get enableCustomHighlight(){return this._data.enableCustomHighlight}set enableCustomHighlight(t){this._data.enableCustomHighlight=t,this.change()}get sceneGraph(){return this._data.sceneGraph}set sceneGraph(t){this._data.sceneGraph=t,t&&(this._data.enablePartialMode=!1),this.change()}get edgeModel(){return Boolean(this._data.edgeModel)}set edgeModel(t){this._data.edgeModel=Boolean(t),this.change()}get reverseZoomWheel(){return this._data.reverseZoomWheel}set reverseZoomWheel(t){this._data.reverseZoomWheel=!!t,this.change()}get enableZoomWheel(){return this._data.enableZoomWheel}set enableZoomWheel(t){this._data.enableZoomWheel=!!t,this.change()}get enableGestures(){return this._data.enableGestures}set enableGestures(t){this._data.enableGestures=!!t,this.change()}get geometryType(){return this._data.geometryType}set geometryType(t){this._data.geometryType=t,this.change()}get rulerUnit(){return this._data.rulerUnit}set rulerUnit(t){this._data.rulerUnit=t,this.change()}get rulerPrecision(){return this._data.rulerPrecision}set rulerPrecision(t){this._data.rulerPrecision=t,this.change()}get cameraMode(){return this._data.cameraMode||"perspective"}set cameraMode(t){this._data.cameraMode=t,this.change()}}const f=["click","contextmenu","dblclick","mousedown","mouseleave","mousemove","mouseup","pointercancel","pointerdown","pointerleave","pointermove","pointerup","touchcancel","touchend","touchmove","touchstart","wheel"],v=f;class _{constructor(){this.performance={fps:0,frameTime:0,timeToFirstRender:0,loadTime:0},this.render={viewport:{width:0,height:0},antialiasing:"",drawCalls:0,triangles:0,points:0,lines:0},this.scene={objects:0,triangles:0,points:0,lines:0,edges:0},this.optimizedScene={objects:0,triangles:0,points:0,lines:0,edges:0},this.memory={geometries:0,geometryBytes:0,textures:0,textureBytes:0,materials:0,totalEstimatedGpuBytes:0,usedJSHeapSize:0},this.system={webglRenderer:"",webglVendor:""}}}class y{constructor(t){this.setViewParams=t=>{var e;const i=this.m_module.getViewer().getActiveTvExtendedView();i.setView(t.position,t.target,t.upVector,t.viewFieldWidth,t.viewFieldHeight,t.perspective),null===(e=i.delete)||void 0===e||e.call(i)},this.getViewParams=()=>{var t;const e=this.m_module.getViewer().activeView,i={position:e.viewPosition,target:e.viewTarget,upVector:e.upVector,viewFieldWidth:e.viewFieldWidth,viewFieldHeight:e.viewFieldHeight,perspective:e.perspective};return null===(t=e.delete)||void 0===t||t.call(e),i},this.m_module=t}getViewer(){return this.m_module.getViewer()}getModel(){return this.getViewer().getMarkupModel()}copyPoint(t){const e=new this.m_module.Point3d;return e.set(t.x,t.y,t.z),e}createVector3d(){return new this.m_module.Vector3d}createPoint3d(){return new this.m_module.Point3d}createMatrix3d(){return new this.m_module.Matrix3d}createPlane(){return new this.m_module.OdTvPlane}toVector(t){return this.m_module.Vector3d.createFromArray(t)}toGeVector(t){return[t.x,t.y,t.z]}toGePoint(t){return[t.x,t.y,t.z]}toPoint(t){return this.m_module.Point3d.createFromArray(t)}screenToWorld(t,e){return this.toPoint(this.m_module.getViewer().screenToWorld(t,e))}toDoubleArray(t){const e=[];for(let i=0;i<t.length;i++)e.push(t[i].x),e.push(t[i].y),e.push(t[i].z);return e}correctCameraTarget(){const t=this.getViewParams(),e=this.m_module.getViewer().getActiveExtents(),{min:i,max:s}=e,r=this.toPoint(t.target);r.x>=i.x&&r.y>=i.y&&r.z>=i.z&&r.x<=s.x&&r.y<=s.y&&r.z<=s.z||(t.target=e.center(),this.setViewParams(t))}}class w extends y{constructor(t){super(t.visualizeJs),this.beginInteractivity=()=>{const t=this.getViewer().activeView;t.beginInteractivity&&(t.beginInteractivity(24),this.subject.update()),t.delete()},this.endInteractivity=()=>{const t=this.getViewer().activeView;if(t.endInteractivity){t.endInteractivity();const e=this.getViewer().getActiveDevice(),i=this.m_module.canvas;e.invalidate([0,0,i.width,i.height]),e.delete(),this.subject.update()}t.delete()},this.subject=t,this.needInputText=!1,this.mouseDownPosition={x:0,y:0},this.autoSelect=!1,this.onmessage=t=>this.subject.emitEvent(t),this.canvasEvents=v}initialize(){this.canvasEvents=this.canvasEvents.filter(t=>"function"==typeof this[t]),this.canvasEvents.forEach(t=>this[t]=this[t].bind(this)),this.canvasEvents.forEach(t=>this.subject.on(t,this[t])),this.getViewer().setEnableAutoSelect(!!this.autoSelect)}dispose(){this.canvasEvents.forEach(t=>this.subject.off(t,this[t]))}relativeCoords(t){return{x:t.offsetX*window.devicePixelRatio,y:t.offsetY*window.devicePixelRatio}}pointerdown(t){if(!t.isPrimary||w.isGestureActive)return;t.target.setPointerCapture(t.pointerId);const e=this.relativeCoords(t);this.isDragging=!0,this.mouseDownPosition={x:e.x,y:e.y},this.start(e.x,e.y,t.clientX,t.clientY),this.subject.update()}pointerup(t){if(w.needSkipPointerUp)return;if(!t.isPrimary)return;t.target.releasePointerCapture(t.pointerId);const e=this.relativeCoords(t);this.end(e.x,e.y,t.clientX,t.clientY),this.isDragging=!1,this.subject.update()}pointercancel(t){t.isPrimary&&this.m_module.canvas.dispatchEvent(new PointerEvent("pointerup",t))}pointermove(t){if(!t.isPrimary||w.isGestureActive)return;const e=this.relativeCoords(t);this.drag(e.x,e.y,t.clientX,t.clientY),this.isDragging&&this.subject.update()}click(t){const e=this.getViewer(),i=this.relativeCoords(t),s=i.x,r=i.y,n=Math.abs(s-this.mouseDownPosition.x)<5&&Math.abs(r-this.mouseDownPosition.y)<5;if(e&&e.getEnableAutoSelect()&&n){e.unselect(),e.select(s,r,s,r),this.subject.update();const t=e.getSelected();this.onmessage({type:"select",data:t,handles:this.subject.getSelected()}),this.onmessage({type:"select2",data:t,handles:this.subject.getSelected2()})}}dblclick(t){const e=this.getViewer(),i=this.relativeCoords(t),s=i.x,r=i.y,n=e.getActiveDevice(),o=n.viewAt([s,r]);if(o&&!o.active)e.activeView=o,o.delete(),this.subject.update();else if(e&&e.getEnableAutoSelect()){const t=e.getSelected();if(!t.isNull()&&0!==t.numItems()){const i=t.getIterator(),s=i.getEntity();e.zoomToEntity(s),this.onmessage({type:"zoomtoentity",data:s}),this.subject.update(),this.deleteAll([i,s])}}n.delete()}start(t,e,i=0,s=0){}drag(t,e,i=0,s=0){}end(t,e,i=0,s=0){}getActiveMarkupEntity(t){return this.subject.addMarkupEntity(t)}syncOverlayView(){return this.subject.syncOverlay()}deleteAll(t){var e;for(const i of t)null===(e=null==i?void 0:i.delete)||void 0===e||e.call(i)}updatePreview(){}static set isGestureActive(t){w._isGestureActive!==t&&(w._isGestureActive=t,w._isGestureActive&&(w.needSkipPointerUp=!0))}static get isGestureActive(){return w._isGestureActive}static get needSkipPointerUp(){return!!w._needSkipPointerUp&&(w.needSkipPointerUp=!1,!0)}static set needSkipPointerUp(t){w._needSkipPointerUp=t}}function x(t,e,i){return t||((t=document.createElement("div")).setAttribute("data-testid",i),e.appendChild(t)),t}function b(t,e){return t&&e.removeChild(t),null}function S(t,e,i){const s=e.Point3d.createFromArray(t),r=i.activeView,n=r.worldToDeviceMatrix,o=s.transformBy(n),a={x:o.x/window.devicePixelRatio,y:o.y/window.devicePixelRatio};return n.delete(),s.delete(),o.delete(),r.delete(),a}function C(t){return t<0?Math.ceil(t):Math.floor(t)}w._isGestureActive=!1,w._needSkipPointerUp=!1;function A(t,e,i,s,r){const n=((t,e,i,s)=>{const r=e.x-t.x,n=e.y-t.y,o=s.x-i.x,a=s.y-i.y,h=(-n*(t.x-i.x)+r*(t.y-i.y))/(-o*n+r*a),l=(+o*(t.y-i.y)-a*(t.x-i.x))/(-o*n+r*a);return h>=0&&h<=1&&l>=0&&l<=1&&{x:C(t.x+l*r),y:C(t.y+l*n)}})(t,e,i,s);n&&r.push(n)}function T(t,e,i){return t.x<=e&&t.x>=0&&t.y<=i&&t.y>=0}function P(t,e){t&&(t.onclick=e?()=>e():()=>{})}function E(t,e){t.style.pointerEvents=e?"auto":"none"}class k{constructor(t,e,i){this.htmlElemStartPoint=null,this.htmlElemEndPoint=null,this.htmlElemLine=null,this.htmlElemTitle=null,this.startPoint=null,this.endPoint=null,this.scale=1,this.unit="",this.precision=2,this.size=10,this.lineThickness=2,this.style={border:"2px solid #FFFFFF",background:"#009bff",color:"white",boxShadow:"0 0 10px rgba(0,0,0,0.5)"},this.htmlElemStartPoint=x(this.htmlElemStartPoint,t,"ruler-start"),this.htmlElemEndPoint=x(this.htmlElemEndPoint,t,"ruler-end"),this.htmlElemLine=x(this.htmlElemLine,t,"ruler-line"),this.htmlElemTitle=x(this.htmlElemTitle,t,"ruler-value"),this.viewer=e,this.moduleInstance=i,this.targetElement=t,this.isFinishDraw=!1}drawMeasureLine(){const t=this.size,e=this.moduleInstance.canvas.getBoundingClientRect();if(this.startPoint){this.htmlElemStartPoint=x(this.htmlElemStartPoint,this.targetElement,"ruler-start");const i=S(this.startPoint,this.moduleInstance,this.viewer);T(i,e.width,e.height)?(this.htmlElemStartPoint.style.display="block",this.htmlElemStartPoint.style.cursor="pointer",this.htmlElemStartPoint.style.position="absolute",this.htmlElemStartPoint.style.top=i.y-t/2+"px",this.htmlElemStartPoint.style.left=i.x-t/2+"px",this.htmlElemStartPoint.style.borderRadius=`${t}px`,this.htmlElemStartPoint.style.border=this.style.border,this.htmlElemStartPoint.style.background=this.style.background,this.htmlElemStartPoint.style.zIndex="2",this.htmlElemStartPoint.style.width=`${t}px`,this.htmlElemStartPoint.style.height=`${t}px`,this.htmlElemStartPoint.style.boxShadow=this.style.boxShadow):this.htmlElemStartPoint.style.display="none"}if(this.endPoint&&this.isFinishDraw){this.htmlElemEndPoint=x(this.htmlElemEndPoint,this.targetElement,"ruler-end");const i=S(this.endPoint,this.moduleInstance,this.viewer);T(i,e.width,e.height)?(this.htmlElemEndPoint.style.display="block",this.htmlElemEndPoint.style.cursor="pointer",this.htmlElemEndPoint.style.position="absolute",this.htmlElemEndPoint.style.top=i.y-t/2+"px",this.htmlElemEndPoint.style.left=i.x-t/2+"px",this.htmlElemEndPoint.style.borderRadius=`${t}px`,this.htmlElemEndPoint.style.border=this.style.border,this.htmlElemEndPoint.style.background=this.style.background,this.htmlElemEndPoint.style.zIndex="2",this.htmlElemEndPoint.style.width=`${t}px`,this.htmlElemEndPoint.style.height=`${t}px`,this.htmlElemEndPoint.style.boxShadow=this.style.boxShadow):this.htmlElemEndPoint.style.display="none"}if(this.endPoint&&this.startPoint){const t=S(this.startPoint,this.moduleInstance,this.viewer),i=S(this.endPoint,this.moduleInstance,this.viewer),{p1:s,p2:r,angle:n,width:o}=function(t,e,i,s){const r={x:0,y:0},n={x:i,y:0},o={x:0,y:s},a={x:i,y:s},h=[];A(t,e,r,n,h),A(t,e,r,o,h),A(t,e,o,a,h),A(t,e,a,n,h);let l=null,d=null;0===h.length?(l=t,d=e):1===h.length?T(t,i,s)?(l=t,d=h[0]):(l=h[0],d=e):(l=h[0],d=h[1]);const c=d.x-l.x,u=d.y-l.y;let g=180*Math.atan(u/c)/Math.PI;return c<0&&(g-=180),{angle:g,width:Math.sqrt(Math.pow(c,2)+Math.pow(u,2)),p1:l,p2:d}}(t,i,e.width,e.height),a=r.x-s.x,h=r.y-s.y,l=this.lineThickness;if(T(s,e.width,e.height)&&T(r,e.width,e.height)){this.htmlElemLine=x(this.htmlElemLine,this.targetElement,"ruler-line"),this.htmlElemLine.style.display="block",this.htmlElemLine.style.cursor="pointer",this.htmlElemLine.style.position="absolute",this.htmlElemLine.style.top=`${s.y}px`,this.htmlElemLine.style.left=`${s.x}px`,this.htmlElemLine.style.width=`${o}px`,this.htmlElemLine.style.transform=`rotate(${n}deg)`,this.htmlElemLine.style.transformOrigin=`0px ${l/2}px`,this.htmlElemLine.style.boxShadow=this.style.boxShadow,this.htmlElemLine.style.border="none",this.htmlElemLine.style.background=this.style.background,this.htmlElemLine.style.zIndex="1",this.htmlElemLine.style.height=`${l}px`;const t=this.getDistance(),e=s.x+a/2,i=s.y+h/2;this.htmlElemTitle=x(this.htmlElemTitle,this.targetElement,"ruler-value"),this.htmlElemTitle.style.display="block",this.htmlElemTitle.style.cursor="pointer",this.htmlElemTitle.style.font="10px",this.htmlElemTitle.style.color="white",this.htmlElemTitle.style.position="Absolute",this.htmlElemTitle.style.top=`${i}px`,this.htmlElemTitle.style.left=`${e}px`,this.htmlElemTitle.style.transform="translate(-50%, -50%)",this.htmlElemTitle.style.borderRadius="5px",this.htmlElemTitle.style.boxShadow=this.style.boxShadow,this.htmlElemTitle.style.border="none",this.htmlElemTitle.style.background=this.style.background,this.htmlElemTitle.style.zIndex="3",this.htmlElemTitle.style.padding="2px",this.htmlElemTitle.style.textAlign="center",this.htmlElemTitle.innerHTML=this.formatDistance(t)}else this.htmlElemLine.style.display="none",this.htmlElemTitle.style.display="none"}}getDistance(){let t=function(t,e,i){const s=i.Point3d.createFromArray(t),r=i.Point3d.createFromArray(e),n=s.distanceTo(r).toFixed(2);return s.delete(),r.delete(),n}(this.startPoint,this.endPoint,this.moduleInstance);return Math.abs(this.scale)>1e-10&&(t/=this.scale),t}calculatePrecision(t){const e=Math.abs(t);return e>=1e3?0:e>=10?1:e>=.1?2:e>=.001?3:e>0?Math.floor(-Math.log10(e))+1:2}formatDistance(t){let e;e="Auto"===this.precision?this.calculatePrecision(t):Number.isFinite(this.precision)?this.precision:parseFloat(this.precision),Number.isFinite(e)?e<0?e=0:e>10&&(e=10):e=2;let i=t.toFixed(e);return"Auto"===this.precision&&(i=i.replace(/\.0+$/,"").replace(/\.$/,"")),+i!==t&&(i="~ "+i),`${i} ${this.unit}`}setStartPoint(t){this.startPoint=t,this.drawMeasureLine()}setEndPoint(t,e){this.isFinishDraw=void 0===e||e,this.endPoint=t,this.drawMeasureLine()}update(){this.drawMeasureLine()}setSize(t){this.size=t,this.drawMeasureLine()}clear(){this.endPoint=null,this.startPoint=null,this.htmlElemStartPoint=b(this.htmlElemStartPoint,this.targetElement),this.htmlElemEndPoint=b(this.htmlElemEndPoint,this.targetElement),this.htmlElemLine=b(this.htmlElemLine,this.targetElement),this.htmlElemTitle=b(this.htmlElemTitle,this.targetElement)}setUnit(t){this.unit=t,this.drawMeasureLine()}setConversionFactor(t){this.scale=t,this.drawMeasureLine()}setPrecision(t){this.precision=t,this.drawMeasureLine()}setStyle(t){this.style=t,this.drawMeasureLine()}setSelectionReactor(t){P(this.htmlElemStartPoint,t?t.onStartPoint:null),P(this.htmlElemEndPoint,t?t.onEndPoint:null),P(this.htmlElemTitle,t?t.onTitle:null)}setSelectability(t){E(this.htmlElemStartPoint,t),E(this.htmlElemEndPoint,t),E(this.htmlElemLine,t),E(this.htmlElemTitle,t)}}function M(t,e){return t[e]||e}class I extends w{constructor(t){var e,i;super(t),this.lineThickness=2,this.press=!1,this.gripingRadius=5,this.firstPoint=null,this.secondPoint=null,this.rulerUnitTable={Millimeters:"mm",Centimeters:"cm",Meters:"m",Feet:"ft",Inches:"in",Yards:"yd",Kilometers:"km",Miles:"mi",Micrometers:"µm",Mils:"mil",MicroInches:"µin",Default:"unit"},this.rulerUnit=null!==(e=t.options.rulerUnit)&&void 0!==e?e:"Default",this.rulerPrecision=null!==(i=t.options.rulerPrecision)&&void 0!==i?i:"Default",this.items=[],this.canvasEvents.push("resize","optionsChange")}initialize(){super.initialize(),this.m_overlayElement=document.createElement("div"),this.m_overlayElement.style.background="rgba(0,0,0,0)",this.m_overlayElement.style.position="fixed",this.m_overlayElement.style.zIndex="1",this.m_overlayElement.style.pointerEvents="none",document.body.appendChild(this.m_overlayElement),this.subject.addEventListener("optionschange",this.optionsChange),this.resize()}dispose(){super.dispose(),this.m_overlayElement.remove(),this.subject.removeEventListener("optionschange",this.optionsChange)}updatePreview(){this.items.forEach(t=>t.update())}resize(){const t=this.m_module.canvas.getBoundingClientRect();this.m_overlayElement.style.top=`${t.top}px`,this.m_overlayElement.style.left=`${t.left}px`,this.m_overlayElement.style.width=`${t.width}px`,this.m_overlayElement.style.height=`${t.height}px`}getSnapPointRadius(){const t=this.getViewer().activeView.viewDcCorners(),e=t.lowerLeft,i=t.upperRight;return i[0]-=e[0],i[1]-=e[1],Math.min(i[0],i[1])/120}start(t,e){this.createNewMeasureIfNeed();const i=this.getViewer().getSnapPoint(t,e,this.gripingRadius);i&&(this.firstPoint=i,this.previewMeasureLine.setStartPoint(this.firstPoint))}drag(t,e){this.createNewMeasureIfNeed();const i=this.getViewer().getSnapPoint(t,e,this.gripingRadius);this.isDragging?i?this.firstPoint?(this.secondPoint=i,this.previewMeasureLine.setStartPoint(this.firstPoint),this.previewMeasureLine.setEndPoint(this.secondPoint,!0)):(this.firstPoint=i,this.previewMeasureLine.setStartPoint(this.firstPoint)):(this.secondPoint=null,this.previewMeasureLine.clear(),this.previewMeasureLine.setStartPoint(this.firstPoint),this.previewMeasureLine.setEndPoint(this.getViewer().screenToWorld(t,e),!1)):i?this.previewMeasureLine.setStartPoint(i):this.previewMeasureLine.clear()}end(){if(this.firstPoint&&this.secondPoint){const t=this.createMeasureLine();t.setStartPoint(this.firstPoint),t.setEndPoint(this.secondPoint,!0)}this.firstPoint=null,this.secondPoint=null,this.previewMeasureLine.clear()}createNewMeasureIfNeed(){this.previewMeasureLine||(this.previewMeasureLine=this.createMeasureLine())}createMeasureLine(){const t=this.m_module.getViewer(),e=new k(this.m_overlayElement,t,this.m_module);e.lineThickness=this.lineThickness||e.lineThickness;const i="Default"===this.rulerUnit,s="Default"===this.rulerPrecision;if(e.setUnit(M(this.rulerUnitTable,i?t.getUnit():this.rulerUnit)),i)e.setConversionFactor(1);else{const i=this.getKUnitByName(t.getUnit()),s=this.getKUnitByName(this.subject.options.rulerUnit),r=t.getUnitsConversionCoef(i,s);this.conversionFactor=1/r,e.setConversionFactor(this.conversionFactor)}return s?e.setPrecision(2):e.setPrecision(this.rulerPrecision),this.items.push(e),e}optionsChange(t){var e,i;const s=t.data,r=null!==(e=s.rulerUnit)&&void 0!==e?e:"Default",n=null!==(i=s.rulerPrecision)&&void 0!==i?i:"Default",o=this.rulerUnit!==r,a=this.rulerPrecision!==n;if(!o&&!a)return;this.rulerUnit=r,this.rulerPrecision=n;const h=this.m_module.getViewer().getUnit(),l=this.getKUnitByName(r),d=this.getKUnitByName(h);this.items.forEach(t=>{if(o)if("Default"===r)t.setUnit(M(this.rulerUnitTable,h)),t.setConversionFactor(1);else{t.setUnit(M(this.rulerUnitTable,r));const e=this.m_module.getViewer().getUnitsConversionCoef(d,l);this.conversionFactor=1/e,t.setConversionFactor(this.conversionFactor)}a&&("Default"===n?t.setPrecision(2):t.setPrecision(n))})}getKUnitByName(t){let e=this.m_module.Units.kUserDefined;switch(t){case"Millimeters":e=this.m_module.Units.kMillimeters;break;case"Centimeters":e=this.m_module.Units.kCentimeters;break;case"Meters":e=this.m_module.Units.kMeters;break;case"Feet":e=this.m_module.Units.kFeet;break;case"Inches":e=this.m_module.Units.kInches;break;case"Yards":e=this.m_module.Units.kYards;break;case"Kilometers":e=this.m_module.Units.kKilometers;break;case"Miles":e=this.m_module.Units.kMiles;break;case"Micrometers":e=this.m_module.Units.kMicrometers;break;case"Mils":e=this.m_module.Units.kMils;break;case"MicroInches":e=this.m_module.Units.kMicroInches}return e}}class R{constructor(t,e,i,s){this.hasEventListeners=!1;const r="#35436E";this.container=e,this.container.style.touchAction="none",this.canvas=document.createElement("canvas"),this.canvas.id="odJoyStickCanvas",this.canvas.width=200,this.canvas.height=200,this.container.appendChild(this.canvas);const n=this.canvas.getContext("2d");let o=0;const a=2*Math.PI,h=(this.canvas.width-(this.canvas.width/2+10))/2,l=h+5,d=h+30,c=this.canvas.width/2,u=this.canvas.height/2;let g=c,p=u;this.onMouseDown=()=>{event.preventDefault(),o=1},this.onMouseMove=e=>{e.preventDefault(),1===o&&(g=e.pageX,p=e.pageY,this.canvas.offsetParent&&"BODY"===this.canvas.offsetParent.tagName.toUpperCase()?(g-=this.canvas.offsetLeft,p-=this.canvas.offsetTop):this.canvas.offsetParent&&(g-=this.canvas.offsetParent.offsetLeft,p-=this.canvas.offsetParent.offsetTop),n.clearRect(0,0,this.canvas.width,this.canvas.height),this.drawExternal(),this.drawInternal(),i({x:(g-c)/l*100,y:(p-u)/l*100*-1,global:t}))},this.onMouseUp=()=>{event.preventDefault(),o=0,g=c,p=u,n.clearRect(0,0,this.canvas.width,this.canvas.height),this.drawExternal(),this.drawInternal(),i({x:(g-c)/l*100,y:(p-u)/l*100*-1,global:t})},this.drawExternal=()=>{n.beginPath(),n.arc(c,u,d,0,a,!1),n.lineWidth=2,n.strokeStyle=r,n.globalAlpha=.5,n.stroke()},this.drawInternal=()=>{n.beginPath(),g<h&&(g=l),g+h>this.canvas.width&&(g=this.canvas.width-l),p<h&&(p=l),p+h>this.canvas.height&&(p=this.canvas.height-l),n.arc(g,p,h,0,a,!1),n.fillStyle=r,n.lineWidth=2,n.strokeStyle="#003300",n.globalAlpha=.5,n.fill(),n.stroke()};const m=()=>{this.hasEventListeners||(this.canvas.addEventListener("pointerdown",this.onMouseDown,!1),document.addEventListener("pointermove",this.onMouseMove,!1),document.addEventListener("pointerup",this.onMouseUp,!1),this.hasEventListeners=!0)},f=()=>{this.hasEventListeners&&(this.canvas.removeEventListener("pointerdown",this.onMouseDown,!1),document.removeEventListener("pointermove",this.onMouseMove,!1),document.removeEventListener("pointerup",this.onMouseUp,!1),this.hasEventListeners=!1)},v=()=>{if(s){const t=s.getBoundingClientRect();this.container.style.top=t.height-200+"px",this.container.style.left=`${t.left}px`,this.container.style.width="200px",this.container.style.height="200px"}},_=()=>{const t=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),e=window.innerWidth<1024;t||e?(this.container.style.display="block",m()):(this.container.style.display="none",f())};this.onResize=()=>{_(),setTimeout(v,500)},_(),v(),window.addEventListener("resize",this.onResize,!1),this.drawExternal(),this.drawInternal()}cleanup(){window.removeEventListener("resize",this.onResize,!1),this.hasEventListeners&&(this.canvas.removeEventListener("pointerdown",this.onMouseDown,!1),document.removeEventListener("pointermove",this.onMouseMove,!1),document.removeEventListener("pointerup",this.onMouseUp,!1),this.hasEventListeners=!1),this.canvas.remove()}}class L extends w{constructor(t){super(t),this.viewer=void 0,this.multiplier=5,this.baseSpeed=1,this.keyPressMap=new Set,this.keydown=this.keydown.bind(this),this.keyup=this.keyup.bind(this),this.lastFrameTS=0,this.lastFrameJoyStickTS=0,this.animationId=void 0,this.processMovement=this.processMovement.bind(this),this.processJoyStickMovement=this.processJoyStickMovement.bind(this),this.deltaAngle=Math.PI/3600,this.autoSelect=!0,this.isJoyStickMoving=!1,this.addJoyStickDragger(t.canvas.parentElement)}initialize(){super.initialize(),this.viewer=this.getViewer(),window.addEventListener("keydown",this.keydown,!1),window.addEventListener("keyup",this.keyup,!1),this.oldWCSEnableValue=this.viewer.getEnableWCS(),this.viewer.setEnableWCS(!1);const t=this.viewer.activeView,e=this.getMaxDimension(t);this.baseSpeed=e/3e4,this.subject.emitEvent({type:"walkstart"}),this.viewParams=this.getViewParams(),this.setViewParams(this.viewParams);const i=this.viewer.getActiveModel();this.cameraId=i.appendCamera("Camera0"),this.setupCamera(t),i.delete(),this.cameraWalker=new this.m_module.OdTvCameraWalker,this.cameraWalker.setCamera(this.cameraId),this.subject.update(),this.enableZoomWheelPreviousValue=this.subject.options.enableZoomWheel,this.subject.options.enableZoomWheel=!1}dispose(){var t;if(this.oldWCSEnableValue=void 0!==this.oldWCSEnableValue?this.oldWCSEnableValue:this.subject.options.showWCS,this.viewer.setEnableWCS(this.oldWCSEnableValue),super.dispose(),this.keyPressMap.clear(),window.removeEventListener("keydown",this.keydown),window.removeEventListener("keyup",this.keyup),this.animationId&&(window.cancelAnimationFrame(this.animationId),this.animationId=void 0),this.cameraId){const e=this.viewer.getActiveModel();e.removeEntity(this.cameraId),e.delete(),null===(t=this.cameraWalker)||void 0===t||t.delete()}if(this.viewParams){this.setViewParams(this.viewParams);this.viewer.activeView.delete()}this.subject.update(!0),this.subject.options.enableZoomWheel=this.enableZoomWheelPreviousValue,this.joyStickOverlayElement.remove(),this.joyStickDragger.cleanup()}keydown(t){switch(t.code){case"NumpadSubtract":case"Minus":this.multiplier>1&&(this.multiplier=this.multiplier-1,this.subject.emitEvent({type:"walkspeedchange",data:this.multiplier}));break;case"NumpadAdd":case"Equal":this.multiplier<10&&(this.multiplier=this.multiplier+1,this.subject.emitEvent({type:"walkspeedchange",data:this.multiplier}));break;case"KeyW":case"KeyA":case"KeyS":case"KeyD":case"KeyQ":case"KeyE":this.keyPressMap.add(t.code),this.animationId||this.processMovement(0)}}keyup(t){this.keyPressMap.delete(t.code),this.keyPressMap.size<1&&this.animationId&&(window.cancelAnimationFrame(this.animationId),this.animationId=void 0,this.lastFrameTS=0)}processMovement(t){if(this.animationId=requestAnimationFrame(this.processMovement),0!==this.lastFrameTS){const e=t-this.lastFrameTS;if(e>0){const t=this.multiplier*e*this.baseSpeed;Array.from(this.keyPressMap).forEach(e=>{switch(e){case"KeyW":this.moveForward(t);break;case"KeyS":this.moveBackward(t);break;case"KeyA":this.cameraWalker.moveLeft(t);break;case"KeyD":this.cameraWalker.moveRight(t);break;case"KeyQ":this.cameraWalker.moveUp(t);break;case"KeyE":this.cameraWalker.moveDown(t)}}),this.proceedChangeCamera()}}this.lastFrameTS=t}start(t,e){this.dragPosition={x:t,y:e}}drag(t,e){if(this.cameraId&&this.isDragging){const i=t-this.dragPosition.x,s=e-this.dragPosition.y;this.dragPosition={x:t,y:e},0!==i&&this.turnLeft(-i*this.deltaAngle),0!==s&&this.cameraWalker.turnDown(s*this.deltaAngle),this.subject.update(),this.subject.emitEvent({type:"changecamera"})}}moveForward(t){const{Vector3d:e}=this.m_module,i=this.cameraWalker.camera().openObjectAsCamera(),s=e.createFromArray(i.target()),r=e.createFromArray(i.direction()),n=e.createFromArray(i.upVector()),o=e.createFromArray(i.position());let a=e.createFromArray([r.x,r.y,0]);Math.abs(r.x)>.001&&Math.abs(r.y)>.001?a.setToProduct(a.normalize(),t):a=e.createFromArray([0,t,0]);const h=o.add(a),l=s.add(a);i.setupCamera(h.toArray(),l.toArray(),n.toArray())}moveBackward(t){this.moveForward(-t)}turnLeft(t){const e=this.cameraWalker.camera().openObjectAsCamera(),i=this.toVector(e.direction()),s=this.toVector(e.upVector()),r=e.position(),n=this.createMatrix3d();n.setToRotation(t,[0,0,1],r),i.transformBy(n),s.transformBy(n),e.setupCameraByDirection(r,i.toArray(),s.toArray()),e.delete()}setupCamera(t){const e=this.cameraId.openObjectAsCamera(),i=t.viewTarget;e.setDisplayGlyph(!1),e.setDisplayTarget(!1),e.setAutoAdjust(!0),e.setupCamera(t.viewPosition,i,t.upVector),e.setNearClip(!1,1),e.setFarClip(!1,0),e.setViewParameters(t.viewFieldWidth,t.viewFieldHeight,!0);const s=(r=t.lensLength,n=t.viewFieldWidth,o=t.viewFieldHeight,r/42*Math.sqrt(n*n+o*o));var r,n,o;const a=this.toPoint(t.viewTarget),h=this.toPoint(t.viewPosition),l=h.sub(a),d=l.asVector(),c=d.normalize(),u=this.toGeVector(c),g=[u[0]*s,u[1]*s,u[2]*s],p=this.toPoint(t.viewTarget),m=this.toPoint(g),f=p.add(m);e.setupCamera(this.toGePoint(f),t.viewTarget,t.upVector),this.deleteAll([a,h,l,d,c,p,m,f]),e.assignView(t),e.delete()}getMaxDimension(t){const[e,i,s]=t.sceneExtents.max(),[r,n,o]=t.sceneExtents.min(),a=[e-r,i-n,s-o];return Math.max(...a)}addJoyStickDragger(t){this.joyStickOverlayElement=document.createElement("div"),this.joyStickOverlayElement.id="joyStickDiv",this.joyStickOverlayElement.style.background="rgba(0,0,0,0)",this.joyStickOverlayElement.style.position="fixed",this.joyStickOverlayElement.style.zIndex="0",t.appendChild(this.joyStickOverlayElement),this.joyStickDragger=new R(this,this.joyStickOverlayElement,t=>{Math.sqrt(t.x*t.x+t.y*t.y)>20?(this.lastJoyStickCoord={x:t.x,y:t.y},this.animationId||this.isJoyStickMoving||(this.isJoyStickMoving=!0,this.processJoyStickMovement(0))):(this.isJoyStickMoving=!1,window.cancelAnimationFrame(this.animationId),this.animationId=void 0,this.lastFrameJoyStickTS=0)},this.m_module.canvas)}processJoyStickMovement(t){if(this.isJoyStickMoving){if(this.animationId=requestAnimationFrame(this.processJoyStickMovement),0!==this.lastFrameJoyStickTS){const e=t-this.lastFrameJoyStickTS;if(e>0){const t=100,i=this.lastJoyStickCoord.y/t,s=this.lastJoyStickCoord.x/t,r=this.multiplier*e*this.baseSpeed;this.moveTotal(r,i,s)}}this.lastFrameJoyStickTS=t}}moveTotal(t,e,i){0!==e&&this.moveForward(t*e),0!==i&&this.cameraWalker.moveRight(t*i),this.proceedChangeCamera()}proceedChangeCamera(){this.subject.update(),this.subject.emitEvent({type:"changecamera"})}}class D extends w{constructor(t){super(t),this.viewer=void 0,this.multiplier=5,this.speed=1,this.keyPressMap=new Set,this.keydown=this.keydown.bind(this),this.keyup=this.keyup.bind(this),this.lastFrameTS=0,this.lastFrameJoyStickTS=0,this.animationId=void 0,this.processMovement=this.processMovement.bind(this),this.processJoyStickMovement=this.processJoyStickMovement.bind(this),this.deltaAngle=Math.PI/3600,this.autoSelect=!0,this.isJoyStickMoving=!1,this.addJoyStickDragger(t.canvas.parentElement)}initialize(){super.initialize(),this.viewer=this.getViewer(),window.addEventListener("keydown",this.keydown,!1),window.addEventListener("keyup",this.keyup,!1),this.oldWCSEnableValue=this.viewer.getEnableWCS(),this.viewer.setEnableWCS(!1);const t=this.viewer.activeView,e=this.getMaxDimension(t);this.speed=e/3e4,this.subject.emitEvent({type:"flystart"}),this.viewParams=this.getViewParams(),this.setViewParams(this.viewParams);const i=this.viewer.getActiveModel();this.cameraId=i.appendCamera("Camera0"),this.setupCamera(t),i.delete(),this.cameraFlyer=new this.m_module.OdTvCameraWalker,this.cameraFlyer.setCamera(this.cameraId),this.subject.update(),this.enableZoomWheelPreviousValue=this.subject.options.enableZoomWheel,this.subject.options.enableZoomWheel=!1}dispose(){var t;if(this.oldWCSEnableValue=void 0!==this.oldWCSEnableValue?this.oldWCSEnableValue:this.subject.options.showWCS,this.viewer.setEnableWCS(this.oldWCSEnableValue),super.dispose(),this.keyPressMap.clear(),window.removeEventListener("keydown",this.keydown),window.removeEventListener("keyup",this.keyup),this.animationId&&(window.cancelAnimationFrame(this.animationId),this.animationId=void 0),this.cameraId){const e=this.viewer.getActiveModel();e.removeEntity(this.cameraId),e.delete(),null===(t=this.cameraFlyer)||void 0===t||t.delete()}if(this.viewParams){this.setViewParams(this.viewParams);this.viewer.activeView.delete()}this.subject.update(!0),this.subject.options.enableZoomWheel=this.enableZoomWheelPreviousValue,this.joyStickOverlayElement.remove(),this.joyStickDragger.cleanup()}keydown(t){switch(t.code){case"NumpadSubtract":case"Minus":this.multiplier>1&&(this.multiplier=this.multiplier-1,this.subject.emitEvent({type:"flyspeedchange",data:this.multiplier}));break;case"NumpadAdd":case"Equal":this.multiplier<10&&(this.multiplier=this.multiplier+1,this.subject.emitEvent({type:"flyspeedchange",data:this.multiplier}));break;case"KeyW":case"KeyA":case"KeyS":case"KeyD":case"KeyQ":case"KeyE":this.keyPressMap.add(t.code),this.animationId||this.processMovement(0)}}keyup(t){this.keyPressMap.delete(t.code),this.keyPressMap.size<1&&this.animationId&&(window.cancelAnimationFrame(this.animationId),this.animationId=void 0,this.lastFrameTS=0)}processMovement(t){if(this.animationId=requestAnimationFrame(this.processMovement),0!==this.lastFrameTS){const e=t-this.lastFrameTS,i=this.multiplier*e*this.speed;for(const t of this.keyPressMap)switch(t){case"KeyW":this.cameraFlyer.moveForward(i);break;case"KeyS":this.cameraFlyer.moveBackward(i);break;case"KeyA":this.cameraFlyer.moveLeft(i);break;case"KeyD":this.cameraFlyer.moveRight(i);break;case"KeyQ":this.cameraFlyer.moveUp(i);break;case"KeyE":this.cameraFlyer.moveDown(i)}this.subject.update(),this.subject.emitEvent({type:"changecamera"})}this.lastFrameTS=t}start(t,e){this.dragPosition={x:t,y:e}}drag(t,e){if(this.cameraId&&this.isDragging){const i=t-this.dragPosition.x,s=e-this.dragPosition.y;this.dragPosition={x:t,y:e},0!==i&&this.turnLeft(-i*this.deltaAngle),0!==s&&this.cameraFlyer.turnDown(s*this.deltaAngle),this.subject.update(),this.subject.emitEvent({type:"changecamera"})}}turnLeft(t){const e=this.cameraFlyer.camera().openObjectAsCamera(),i=this.toVector(e.direction()),s=this.toVector(e.upVector()),r=e.position(),n=this.createMatrix3d();n.setToRotation(t,[0,0,1],r),i.transformBy(n),s.transformBy(n),e.setupCameraByDirection(r,i.toArray(),s.toArray()),e.delete()}setupCamera(t){const e=this.cameraId.openObjectAsCamera(),i=t.viewTarget;e.setDisplayGlyph(!1),e.setDisplayTarget(!1),e.setAutoAdjust(!0),e.setupCamera(t.viewPosition,i,t.upVector),e.setNearClip(!1,1),e.setFarClip(!1,0),e.setViewParameters(t.viewFieldWidth,t.viewFieldHeight,!0);const s=(r=t.lensLength,n=t.viewFieldWidth,o=t.viewFieldHeight,r/42*Math.sqrt(n*n+o*o));var r,n,o;const a=this.toPoint(t.viewTarget),h=this.toPoint(t.viewPosition),l=h.sub(a),d=l.asVector(),c=d.normalize(),u=this.toGeVector(c),g=[u[0]*s,u[1]*s,u[2]*s],p=this.toPoint(t.viewTarget),m=this.toPoint(g),f=p.add(m);e.setupCamera(this.toGePoint(f),t.viewTarget,t.upVector),this.deleteAll([a,h,l,d,c,p,m,f]),e.assignView(t),e.delete()}getMaxDimension(t){const[e,i,s]=t.sceneExtents.max(),[r,n,o]=t.sceneExtents.min(),a=[e-r,i-n,s-o];return Math.max(...a)}addJoyStickDragger(t){this.joyStickOverlayElement=document.createElement("div"),this.joyStickOverlayElement.id="joyStickDiv",this.joyStickOverlayElement.style.background="rgba(0,0,0,0)",this.joyStickOverlayElement.style.position="fixed",this.joyStickOverlayElement.style.zIndex="0",t.appendChild(this.joyStickOverlayElement),this.joyStickDragger=new R(this,this.joyStickOverlayElement,t=>{Math.sqrt(t.x*t.x+t.y*t.y)>20?(this.lastJoyStickCoord={x:t.x,y:t.y},this.animationId||this.isJoyStickMoving||(this.isJoyStickMoving=!0,this.processJoyStickMovement(0))):(this.isJoyStickMoving=!1,window.cancelAnimationFrame(this.animationId),this.animationId=void 0,this.lastFrameJoyStickTS=0)},this.m_module.canvas)}processJoyStickMovement(t){if(this.isJoyStickMoving){if(this.animationId=requestAnimationFrame(this.processJoyStickMovement),0!==this.lastFrameJoyStickTS){const e=t-this.lastFrameJoyStickTS;if(e>0){const t=100,i=this.lastJoyStickCoord.y/t,s=this.lastJoyStickCoord.x/t,r=this.multiplier*e*this.speed;this.moveTotal(r,i,s)}}this.lastFrameJoyStickTS=t}}moveTotal(t,e,i){0!==e&&(e>0?this.cameraFlyer.moveForward(t*e):this.cameraFlyer.moveBackward(t*Math.abs(e))),0!==i&&this.cameraFlyer.moveRight(t*i),this.subject.update(),this.subject.emitEvent({type:"changecamera"})}}class O extends w{constructor(t){super(t),this.press=!1;const e=this.getViewer().getActiveExtents(),i=e.min(),s=e.max();this.m_size_x=Math.abs(s[0]-i[0])/2,this.m_size_y=Math.abs(s[1]-i[1])/2,this.m_size_z=Math.abs(s[2]-i[2])/2,this.m_center=this.toPoint(e.center()),this.m_normal=this.createNormal();const r=this.getViewer().activeView,n=this.createPlane();n.set(this.toGePoint(this.m_center),this.m_normal),r.addCuttingPlane(n),this.index=r.numCuttingPlanes()-1;const{red:o,green:a,blue:h}=this.subject.options.cuttingPlaneFillColor;r.setEnableCuttingPlaneFill(!0,o,a,h),r.setCuttingPlaneFillPatternEnabled(!0,this.m_module.CuttingPlaneFillStyle.kHorizontalBars,0,0,0),this.m_model=this.getModel(),this.createPreview(),this.deleteAll([e,r,n])}dispose(){super.dispose(),this.m_entity&&(this.m_model.removeEntity(this.m_entity),this.deleteAll([this.m_model,this.m_entity,this.planePreview,this.m_center]),this.m_entity=null,this.planePreview=null,this.subject.update())}createNormal(){return[0,0,0]}handleDelta(t){return t}getPlanePreviewCoordinate(){return[]}start(t,e){this.press=!0,this.m_last=this.screenToWorld(t,e),this.m_click={x:t,y:e}}drag(t,e){if(this.press){const i=this.screenToWorld(t,e),s=this.handleDelta(i.sub(this.m_last)),r=this.m_center;this.m_center=r.add(s);const n=this.m_last;this.m_last=i;const o=this.getViewer().activeView,a=this.createPlane(),h=a.set(this.toGePoint(this.m_center),this.m_normal),l=o.updateCuttingPlane(this.index,a);this.drawPreview(),this.deleteAll([o,a,r,s,n,h,l]);const d=this.getViewer().getActiveDevice();d.invalidate(d.getSize())}}end(t,e){if(this.press=!1,t===this.m_click.x&&e===this.m_click.y){this.m_normal=[-1*this.m_normal[0],-1*this.m_normal[1],-1*this.m_normal[2]];const t=this.getViewer().activeView,e=this.createPlane();e.set(this.toGePoint(this.m_center),this.m_normal),t.updateCuttingPlane(this.index,e),this.deleteAll([t,e,this.m_last]);const i=this.getViewer().getActiveDevice();i.invalidate(i.getSize())}}createPreview(){this.m_entity=this.m_model.appendEntity("&CuttingPlanePreview");const t=this.m_module.GeometryTypes,e=new this.m_module.OdTvTransparencyDef,i=new this.m_module.OdTvColorDef(112,112,112);e.setValue(.9);const s=this.m_entity.openObject();s.setColor(i,t.kFaces.value),i.setColor(112,112,112),s.setColor(i,t.kEdges.value),s.setLineWeight(5),s.setTransparency(e,t.kFaces),e.setValue(1),s.setTransparency(e,t.kEdges),this.planePreview=s.appendPolygon(this.getPlanePreviewCoordinate());const r=this.planePreview.openAsPolygon();r.setFilled(!0),this.deleteAll([e,i,s,r,t]),this.subject.syncOverlay()}drawPreview(){const t=this.planePreview.openAsPolygon();t.setPoints(this.getPlanePreviewCoordinate()),this.deleteAll([t]),this.subject.syncOverlay()}}class z extends O{createNormal(){return[1,0,0]}handleDelta(t){return t.y=0,t.z=0,t}getPlanePreviewCoordinate(){return[this.m_center.x,this.m_center.y-this.m_size_y,this.m_center.z-this.m_size_z,this.m_center.x,this.m_center.y+this.m_size_y,this.m_center.z-this.m_size_z,this.m_center.x,this.m_center.y+this.m_size_y,this.m_center.z+this.m_size_z,this.m_center.x,this.m_center.y-this.m_size_y,this.m_center.z+this.m_size_z]}}class F extends O{createNormal(){return[0,1,0]}handleDelta(t){return t.x=0,t.z=0,t}getPlanePreviewCoordinate(){return[this.m_center.x-this.m_size_x,this.m_center.y,this.m_center.z-this.m_size_z,this.m_center.x+this.m_size_x,this.m_center.y,this.m_center.z-this.m_size_z,this.m_center.x+this.m_size_x,this.m_center.y,this.m_center.z+this.m_size_z,this.m_center.x-this.m_size_x,this.m_center.y,this.m_center.z+this.m_size_z]}}class G extends O{createNormal(){return[0,0,1]}handleDelta(t){return t.x=0,t.y=0,t}getPlanePreviewCoordinate(){return[this.m_center.x-this.m_size_x,this.m_center.y-this.m_size_y,this.m_center.z,this.m_center.x+this.m_size_x,this.m_center.y-this.m_size_y,this.m_center.z,this.m_center.x+this.m_size_x,this.m_center.y+this.m_size_y,this.m_center.z,this.m_center.x-this.m_size_x,this.m_center.y+this.m_size_y,this.m_center.z]}}class V{constructor(t,e,i,s){this._m_module=t,this._subject=e,this._beginInteractivity=i,this._endInteractivity=s}beginAction(t,e){this.m_viewCenter=this.getCenter(),this.m_startPoint={x:t,y:e};this.getViewer().activeView.delete(),this._beginInteractivity()}action(t,e){var i,s;const r=this.getViewer().activeView,n=r.vportRect,o=Math.max(Math.abs(n[2]-n[0]),Math.abs(n[3]-n[1])),a=(this.m_startPoint.x-t)*Math.PI/o,h=(this.m_startPoint.y-e)*Math.PI/o;this.m_startPoint.x=t,this.m_startPoint.y=e;const l=h,d=a,c={position:r.viewPosition,target:r.viewTarget,upVector:r.upVector,viewFieldWidth:r.viewFieldWidth,viewFieldHeight:r.viewFieldHeight,perspective:r.perspective};r.delete();const u=this.getSideVector(c);0!==l&&this.calculateXOrbit(c,-l,u),0!==d&&this.calculateYOrbit(c,d,u),u.delete();const g=this.getViewer().getActiveTvExtendedView();g.setView(c.position,c.target,c.upVector,c.viewFieldWidth,c.viewFieldHeight,c.perspective),g.delete(),null===(s=null===(i=this._subject.activeDragger())||void 0===i?void 0:i.updatePreview)||void 0===s||s.call(i),this._subject.emitEvent({type:"orbit"}),this._subject.emitEvent({type:"changecamera"})}endAction(){this._endInteractivity()}getSideVector(t){const e=this.toVector(t.upVector),i=this.toPoint(t.target),s=this.toPoint(t.position),r=i.sub(s),n=r.asVector();if(n.length()<1e-10){const t=this.toVector(this._m_module.Vector3d.kXAxis);return this.deleteAll([r,e,i,s,n]),t}const o=e.crossProduct(n);if(o.length()<1e-10){const t=this.toVector(this._m_module.Vector3d.kXAxis);return this.deleteAll([r,e,i,s,n,o]),t}const a=o.normalize();return this.deleteAll([r,e,i,s,n,o]),a}calculateXOrbit(t,e,i){{const s=this.toPoint(t.position),r=this.toPoint(this.m_viewCenter),n=s.rotateByBasePoint(e,i,r);t.position=n.toArray(),this.deleteAll([s,r,n])}{const s=this.toPoint(t.target),r=this.toPoint(this.m_viewCenter),n=s.rotateByBasePoint(e,i,r);t.target=n.toArray(),this.deleteAll([s,r,n])}{const e=this.toPoint(t.position),s=this.toPoint(t.target),r=s.sub(e),n=r.asVector();if(n.length()<1e-10)return void this.deleteAll([e,s,r,n]);const o=n.crossProduct(i);if(o.length()<1e-10)return void this.deleteAll([e,s,r,n,o]);const a=o.normalize();t.upVector=a.toArray(),this.deleteAll([e,s,r,n,o,a])}}calculateYOrbit(t,e,i){{const i=this.toPoint(t.position),s=this.toPoint(this.m_viewCenter),r=this.toVector(this._m_module.Vector3d.kZAxis),n=i.rotateByBasePoint(e,r,s);t.position=n.toArray(),this.deleteAll([r,i,s,n])}{const i=this.toPoint(t.target),s=this.toPoint(this.m_viewCenter),r=this.toVector(this._m_module.Vector3d.kZAxis),n=i.rotateByBasePoint(e,r,s);t.target=n.toArray(),this.deleteAll([r,i,s,n])}{const s=this.toVector(this._m_module.Vector3d.kZAxis),r=this.toPoint(t.target),n=this.toPoint(t.position),o=i.rotateBy(e,s),a=r.sub(n),h=a.asVector();if(h.length()<1e-10)return void this.deleteAll([s,r,n,o,a,h]);const l=h.crossProduct(o);if(l.length()<1e-10)return void this.deleteAll([s,r,n,o,a,h,l]);const d=l.normalize();t.upVector=d.toArray