brep-io-kernel 1.0.251 → 1.0.252

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/apiExamples/BREP_Booleans.html +2 -2
  2. package/dist/apiExamples/BREP_Export.html +2 -2
  3. package/dist/apiExamples/BREP_Primitives.html +2 -2
  4. package/dist/apiExamples/BREP_Transforms.html +2 -2
  5. package/dist/apiExamples/Embeded_2D_Sketcher.html +2 -2
  6. package/dist/apiExamples/Embeded_CAD.html +2 -2
  7. package/dist/apiExamples/Embeded_CAD_Integration_Test.html +2 -2
  8. package/dist/assembly-constraint-capture.html +5 -5
  9. package/dist/assets/{AnnotationRegistry-DxnuBVib.js → AnnotationRegistry-61-QTIl6.js} +1 -1
  10. package/dist/assets/{AssemblyConstraintRegistry-DHKMQSj6.js → AssemblyConstraintRegistry-DDhkhKoR.js} +1 -1
  11. package/dist/assets/{FeatureRegistry-C9h4q68e.js → FeatureRegistry-CyK8O2Ca.js} +3 -3
  12. package/dist/assets/{PartHistory-4fqTqe8m.js → PartHistory-CYHQ9__L.js} +1 -1
  13. package/dist/assets/{annUtils-C1gESzsQ.js → annUtils-B86URBT5.js} +1 -1
  14. package/dist/assets/{apiExample_BREP_Booleans-B1xVAOyX.js → apiExample_BREP_Booleans-DdWlLKsQ.js} +1 -1
  15. package/dist/assets/{apiExample_BREP_Export-CHD3cpsa.js → apiExample_BREP_Export-AUY7EeHW.js} +1 -1
  16. package/dist/assets/{apiExample_BREP_Primitives-Cxgt1-u1.js → apiExample_BREP_Primitives-g6bMwZLj.js} +1 -1
  17. package/dist/assets/{apiExample_BREP_Transforms-CZ-klSeH.js → apiExample_BREP_Transforms-DH3-Y9FI.js} +1 -1
  18. package/dist/assets/{apiExample_Embeded_2D_Sketcher-Bpi0fqAV.js → apiExample_Embeded_2D_Sketcher-B8EeF-Gj.js} +1 -1
  19. package/dist/assets/{apiExample_Embeded_CAD-B_SPpcLZ.js → apiExample_Embeded_CAD-7roRFtt7.js} +1 -1
  20. package/dist/assets/{apiExample_Embeded_CAD_Integration_Test-DjKBLQ49.js → apiExample_Embeded_CAD_Integration_Test-Pb0iBwIv.js} +1 -1
  21. package/dist/assets/{assemblyConstraintDialogs-8hg4PlL4.js → assemblyConstraintDialogs-BJX50LIF.js} +1 -1
  22. package/dist/assets/{brep-kernel-QpBwDdca.js → brep-kernel-BaJWJnmy.js} +1 -1
  23. package/dist/assets/{browserTests-CfVrmhte.js → browserTests-DxakKnoa.js} +1 -1
  24. package/dist/assets/{dialogCapturePageFactory-C9unVBhR.js → dialogCapturePageFactory-B5p-TYIP.js} +1 -1
  25. package/dist/assets/{featureDialogs-Cx7p1XpK.js → featureDialogs-CnBa1DyN.js} +1 -1
  26. package/dist/assets/{featureDialogs-D7xm3LIj.js → featureDialogs-DbmvJ-NA.js} +1 -1
  27. package/dist/assets/{index.es-Due8Wdrm.js → index.es-kd2D9M8K.js} +1 -1
  28. package/dist/assets/{javascript-CvgRKapH.js → javascript-CAvRMK4c.js} +1 -1
  29. package/dist/assets/{main-cad-DtMN0iSg.js → main-cad-Dojzs8d6.js} +6 -6
  30. package/dist/assets/{pmiDialogs-Bxu3FGJy.js → pmiDialogs-DQBW7aoF.js} +1 -1
  31. package/dist/assets/{test-Ccoy9ITq.js → test-ByMinHh_.js} +3 -3
  32. package/dist/cad.html +7 -7
  33. package/dist/feature-dialog-capture.html +4 -4
  34. package/dist/pmi-dialog-capture.html +5 -5
  35. package/dist/test.html +1 -1
  36. package/dist/viewer.html +7 -7
  37. package/dist-kernel/brep-kernel.js +1 -1
  38. package/package.json +1 -1
  39. package/src/BREP/SolidMethods/manifoldOps.js +5 -0
@@ -5,10 +5,10 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>BREP API Example: Booleans</title>
8
- <script type="module" crossorigin src="/assets/apiExample_BREP_Booleans-B1xVAOyX.js"></script>
8
+ <script type="module" crossorigin src="/assets/apiExample_BREP_Booleans-DdWlLKsQ.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-BdX5DvLD.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ZNr0Qq7Q.js">
11
- <link rel="modulepreload" crossorigin href="/assets/brep-kernel-QpBwDdca.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/brep-kernel-BaJWJnmy.js">
12
12
  <link rel="stylesheet" crossorigin href="/assets/example-CoxINuWK.css">
13
13
  </head>
14
14
  <body>
@@ -5,10 +5,10 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>BREP API Example: Export</title>
8
- <script type="module" crossorigin src="/assets/apiExample_BREP_Export-CHD3cpsa.js"></script>
8
+ <script type="module" crossorigin src="/assets/apiExample_BREP_Export-AUY7EeHW.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-BdX5DvLD.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ZNr0Qq7Q.js">
11
- <link rel="modulepreload" crossorigin href="/assets/brep-kernel-QpBwDdca.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/brep-kernel-BaJWJnmy.js">
12
12
  <link rel="stylesheet" crossorigin href="/assets/example-CoxINuWK.css">
13
13
  </head>
14
14
  <body>
@@ -5,10 +5,10 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>BREP API Example: Primitives</title>
8
- <script type="module" crossorigin src="/assets/apiExample_BREP_Primitives-Cxgt1-u1.js"></script>
8
+ <script type="module" crossorigin src="/assets/apiExample_BREP_Primitives-g6bMwZLj.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-BdX5DvLD.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ZNr0Qq7Q.js">
11
- <link rel="modulepreload" crossorigin href="/assets/brep-kernel-QpBwDdca.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/brep-kernel-BaJWJnmy.js">
12
12
  <link rel="stylesheet" crossorigin href="/assets/example-CoxINuWK.css">
13
13
  </head>
14
14
  <body>
@@ -5,10 +5,10 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>BREP API Example: Transforms</title>
8
- <script type="module" crossorigin src="/assets/apiExample_BREP_Transforms-CZ-klSeH.js"></script>
8
+ <script type="module" crossorigin src="/assets/apiExample_BREP_Transforms-DH3-Y9FI.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-BdX5DvLD.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ZNr0Qq7Q.js">
11
- <link rel="modulepreload" crossorigin href="/assets/brep-kernel-QpBwDdca.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/brep-kernel-BaJWJnmy.js">
12
12
  <link rel="stylesheet" crossorigin href="/assets/example-CoxINuWK.css">
13
13
  </head>
14
14
  <body>
@@ -5,10 +5,10 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
7
7
  <title>BREP API Example: Embeded 2D Sketcher</title>
8
- <script type="module" crossorigin src="/assets/apiExample_Embeded_2D_Sketcher-Bpi0fqAV.js"></script>
8
+ <script type="module" crossorigin src="/assets/apiExample_Embeded_2D_Sketcher-B8EeF-Gj.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-BdX5DvLD.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ZNr0Qq7Q.js">
11
- <link rel="modulepreload" crossorigin href="/assets/brep-kernel-QpBwDdca.js">
11
+ <link rel="modulepreload" crossorigin href="/assets/brep-kernel-BaJWJnmy.js">
12
12
  <link rel="stylesheet" crossorigin href="/assets/example-CoxINuWK.css">
13
13
  </head>
14
14
  <body>
@@ -31,10 +31,10 @@
31
31
  background: #fff;
32
32
  }
33
33
  </style>
34
- <script type="module" crossorigin src="/assets/apiExample_Embeded_CAD-B_SPpcLZ.js"></script>
34
+ <script type="module" crossorigin src="/assets/apiExample_Embeded_CAD-7roRFtt7.js"></script>
35
35
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-BdX5DvLD.js">
36
36
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ZNr0Qq7Q.js">
37
- <link rel="modulepreload" crossorigin href="/assets/brep-kernel-QpBwDdca.js">
37
+ <link rel="modulepreload" crossorigin href="/assets/brep-kernel-BaJWJnmy.js">
38
38
  <link rel="stylesheet" crossorigin href="/assets/example-CoxINuWK.css">
39
39
  </head>
40
40
  <body>
@@ -92,10 +92,10 @@
92
92
  }
93
93
  }
94
94
  </style>
95
- <script type="module" crossorigin src="/assets/apiExample_Embeded_CAD_Integration_Test-DjKBLQ49.js"></script>
95
+ <script type="module" crossorigin src="/assets/apiExample_Embeded_CAD_Integration_Test-Pb0iBwIv.js"></script>
96
96
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-BdX5DvLD.js">
97
97
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ZNr0Qq7Q.js">
98
- <link rel="modulepreload" crossorigin href="/assets/brep-kernel-QpBwDdca.js">
98
+ <link rel="modulepreload" crossorigin href="/assets/brep-kernel-BaJWJnmy.js">
99
99
  <link rel="stylesheet" crossorigin href="/assets/example-CoxINuWK.css">
100
100
  </head>
101
101
  <body>
@@ -13,14 +13,14 @@
13
13
  background: #05070d;
14
14
  }
15
15
  </style>
16
- <script type="module" crossorigin src="/assets/assemblyConstraintDialogs-8hg4PlL4.js"></script>
16
+ <script type="module" crossorigin src="/assets/assemblyConstraintDialogs-BJX50LIF.js"></script>
17
17
  <link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-BdX5DvLD.js">
18
18
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ZNr0Qq7Q.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/browserStorage-CvgF8ovw.js">
20
- <link rel="modulepreload" crossorigin href="/assets/featureDialogs-Cx7p1XpK.js">
21
- <link rel="modulepreload" crossorigin href="/assets/annUtils-C1gESzsQ.js">
22
- <link rel="modulepreload" crossorigin href="/assets/AssemblyConstraintRegistry-DHKMQSj6.js">
23
- <link rel="modulepreload" crossorigin href="/assets/dialogCapturePageFactory-C9unVBhR.js">
20
+ <link rel="modulepreload" crossorigin href="/assets/featureDialogs-CnBa1DyN.js">
21
+ <link rel="modulepreload" crossorigin href="/assets/annUtils-B86URBT5.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/AssemblyConstraintRegistry-DDhkhKoR.js">
23
+ <link rel="modulepreload" crossorigin href="/assets/dialogCapturePageFactory-B5p-TYIP.js">
24
24
  </head>
25
25
  <body>
26
26
  <div id="app"></div>
@@ -1,2 +1,2 @@
1
- var st=Object.defineProperty;var Ut=(e,t,n)=>t in e?st(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var m=(e,t)=>st(e,"name",{value:t,configurable:!0});var P=(e,t,n)=>Ut(e,typeof t!="symbol"?t+"":t,n);import{L as Xt}from"./ListEntityBase-DIaWtqmZ.js";import{a5 as I,V as f,a as _,M as de,b as Se,Q as V,u as Ht,s as kt,f as Gt,ae as Qt,B as Tt}from"./featureDialogs-Cx7p1XpK.js";import{b as q,i as Y,d as te,o as E,m as Re,c as ce,g as Ye,j as Yt}from"./annUtils-C1gESzsQ.js";const B=class B extends Xt{constructor(t={}){super({history:t.history||null,registry:t.registry||null}),this.resultArtifacts=[]}static _normalizeSelectionItems(t){return Array.isArray(t)?t:[]}static _normalizeSelectionType(t){return String(t||"").toUpperCase()}static _isSelectionType(t,n){return!n||!n.size?!0:n.has(B._normalizeSelectionType(t?.type))}static _selectionRefName(t){return t?.name||t?.userData?.faceName||t?.userData?.edgeName||t?.userData?.vertexName||t?.userData?.solidName||t?.userData?.name||null}static _collectSelectionRefs(t,n=null){const r=B._normalizeSelectionItems(t),s=Array.isArray(n)?new Set(n.map(i=>B._normalizeSelectionType(i))):null,o=[];for(const i of r){if(!B._isSelectionType(i,s))continue;const a=B._selectionRefName(i);a&&o.push(a)}return o}async run(t){return console.warn(`BaseAnnotation.run() not implemented for ${this.constructor.name}`),[]}getScene(){return this.renderingContext?.pmimode?.viewer?.partHistory?.scene||null}getObjectByName(t){const n=this.getScene();return n?n.getObjectByName(t):null}static getSchema(t,n){const r={},s={},o=n||{};for(const i in this.inputParamsSchema){if(!Object.prototype.hasOwnProperty.call(this.inputParamsSchema,i))continue;const a=this.inputParamsSchema[i]||{},c={...a},l=Object.prototype.hasOwnProperty.call(o,i)?U(o[i]):U(a.default_value);c&&Object.prototype.hasOwnProperty.call(c,"default_value")&&(c.default_value=U(l)),r[i]=c,s[i]=l}return{schema:r,params:s}}static applyParams(t,n,r){const s=Zt(this.inputParamsSchema,r,n);return Object.assign(n,s),{paramsPatch:{}}}static ensurePersistentData(t){return!t||typeof t!="object"?null:((!t.persistentData||typeof t.persistentData!="object")&&(t.persistentData={}),t.persistentData)}static dragLabelOnPlane(t,n,r={}){if(!n||typeof r.makePlane!="function")return;const s=r.makePlane();if(!s||!(s instanceof I)&&!s.isPlane)return;const o=r.eventTarget||window,i=t?.viewer,a=m(l=>{const u=n.raycastFromEvent?n.raycastFromEvent(l):null;if(!u)return;const p=new f;(n.intersectPlane?n.intersectPlane(u,s,p):u.intersectPlane(s,p))&&typeof r.onDrag=="function"&&r.onDrag(p,l,s)},"onMove"),c=m(l=>{try{o.removeEventListener("pointermove",a,!0)}catch{}try{o.removeEventListener("pointerup",c,!0)}catch{}if(r.suspendControls===!0)try{i?.controls&&(i.controls.enabled=!0)}catch{}try{t?.hideDragPlaneHelper?.()}catch{}if(typeof r.onEnd=="function")try{r.onEnd(l)}catch{}if(r.preventDefault!==!1)try{l.preventDefault(),l.stopImmediatePropagation?.(),l.stopPropagation()}catch{}},"onUp");try{t?.showDragPlaneHelper?.(s)}catch{}if(r.suspendControls===!0)try{i?.controls&&(i.controls.enabled=!1)}catch{}try{o.addEventListener("pointermove",a,!0)}catch{}try{o.addEventListener("pointerup",c,!0)}catch{}}onIdChanged(){(!this.inputParams||typeof this.inputParams!="object")&&(this.inputParams={}),this.inputParams.id=this.id}onParamsChanged(){(!this.inputParams||typeof this.inputParams!="object")&&(this.inputParams={}),this.inputParams.id||(this.inputParams.id=this.id),this.inputParams.type||(this.inputParams.type=this.type||this.entityType||"annotation")}onPersistentDataChanged(){(!this.persistentData||typeof this.persistentData!="object")&&(this.persistentData={})}};m(B,"BaseAnnotation"),P(B,"entityType","annotation"),P(B,"shortName","ANN"),P(B,"longName","Annotation"),P(B,"inputParamsSchema",{});let v=B;function Zt(e,t,n){const r={},s=t&&typeof t=="object"?t:{};for(const o in e){if(!Object.prototype.hasOwnProperty.call(e,o))continue;const i=e[o]||{};if(i.readOnly){n&&Object.prototype.hasOwnProperty.call(n,o)?r[o]=n[o]:r[o]=U(i.default_value);continue}const a=s[o],c=n&&Object.prototype.hasOwnProperty.call(n,o);if(a===void 0){r[o]=U(c?n[o]:i.default_value);continue}switch(i.type){case"number":{const l=Number(a);r[o]=Number.isFinite(l)?l:c&&Number.isFinite(n[o])?Number(n[o]):Number.isFinite(i.default_value)?i.default_value:0;break}case"boolean":r[o]=a==="false"?!1:!!a;break;case"options":{const l=Array.isArray(i.options)?i.options:[],u=a==null?"":String(a);l.includes(u)?r[o]=u:c&&l.includes(n[o])?r[o]=n[o]:r[o]=l.includes(i.default_value)?i.default_value:l[0]||"";break}case"reference_selection":{if(i.multiple){const l=Array.isArray(a)?a:a?[a]:[];r[o]=l.map(u=>u==null?"":String(u)).filter(u=>u.length),!r[o].length&&c&&Array.isArray(n[o])&&(r[o]=n[o].slice())}else r[o]=a==null?c?String(n[o]??""):"":String(a);break}case"textarea":case"string":r[o]=a==null?c?String(n[o]??""):"":String(a);break;case"object":r[o]=U(a&&typeof a=="object"?a:i.default_value);break;case"transform":r[o]=Kt(a,i.default_value);break;case"vec3":r[o]=Jt(a,i.default_value);break;default:r[o]=U(a);break}}return r}m(Zt,"sanitizeAnnotationParams");function Kt(e,t){const n=e&&typeof e=="object"?e:t||{},r=m((s,o,i=3)=>{const a=Array.isArray(s)?s:o&&Array.isArray(o)?o:[],c=[];for(let l=0;l<i;l+=1){const u=a[l],p=Number(u);c[l]=Number.isFinite(p)?p:0}return c},"toArray");return{position:r(n.position,t?.position||[0,0,0]),rotationEuler:r(n.rotationEuler,t?.rotationEuler||[0,0,0]),scale:r(n.scale,t?.scale||[1,1,1])}}m(Kt,"normalizeTransform");function Jt(e,t){const n=Array.isArray(e)?e:e&&typeof e=="object"?[e.x,e.y,e.z]:t;if(!Array.isArray(n))return[0,0,0];const r=[];for(let s=0;s<3;s+=1){const o=Number(n[s]);r[s]=Number.isFinite(o)?o:0}return r}m(Jt,"normalizeVec3");function U(e){if(e==null)return e;if(Array.isArray(e))return e.map(t=>U(t));if(typeof e=="object"){const t={};for(const n of Object.keys(e))t[n]=U(e[n]);return t}return e}m(U,"__cloneValue");function C(e,t,n,r=.01){const s=[];typeof t=="function"&&s.push(t),typeof n=="function"&&s.push(n);for(const o of s)try{const i=Number(o(e));if(Number.isFinite(i)&&i>0)return i}catch{}return r}m(C,"resolveScreenSizeWorld");function en(e){if(!e||e.lengthSq()===0)return new f(0,0,1);const t=Math.abs(e.dot(new f(0,0,1)))<.9?new f(0,0,1):new f(0,1,0),n=new f().crossVectors(e,t);return n.lengthSq()===0&&n.crossVectors(e,new f(1,0,0)),n.lengthSq()===0?new f(1,0,0):n.normalize()}m(en,"arbitraryPerpendicular3D");function le(e){if(!e)return null;if(e instanceof f)return e.clone();if(Array.isArray(e)&&e.length>=3)return new f(Number(e[0])||0,Number(e[1])||0,Number(e[2])||0);if(typeof e=="object"){const t=Number(e.x),n=Number(e.y),r=Number(e.z);if(Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r))return new f(t,n,r)}return null}m(le,"vectorFromAny$2");function tn(e){return e>1?1:e<-1?-1:e}m(tn,"clampToUnit");function nn(e,t){const n=e.x*t.y-e.y*t.x,r=e.x*t.x+e.y*t.y;return Math.atan2(n,r)}m(nn,"signedAngle2D");function rn(e,t){const n=Math.cos(t),r=Math.sin(t);return new _(e.x*n-e.y*r,e.x*r+e.y*n)}m(rn,"rotate2D");function Ze(e,t){const n=e.clone().normalize();let r=(t?t.clone():new f(1,0,0)).projectOnPlane(n);r.lengthSq()<1e-12&&(r=Math.abs(n.z)<.9?new f(0,0,1).cross(n):new f(0,1,0).cross(n)),r.normalize();const s=new f().crossVectors(n,r).normalize();return{U:r,V:s,N:n}}m(Ze,"planeBasis");function We(e,t,n){const r=e.clone().sub(t);return new _(r.dot(n.U),r.dot(n.V))}m(We,"to2D");function Ne(e,t){return new _(e.dot(t.U),e.dot(t.V))}m(Ne,"dirTo2D");function J(e,t,n){return t.clone().add(n.U.clone().multiplyScalar(e.x)).add(n.V.clone().multiplyScalar(e.y))}m(J,"from2D");function on(e,t,n,r){const s=t.x*r.y-t.y*r.x;if(Math.abs(s)<1e-12)return null;const o=new _().subVectors(n,e),i=(o.x*r.y-o.y*r.x)/s;return new _(e.x+t.x*i,e.y+t.y*i)}m(on,"intersectLines2D");function sn(e,t,n){const r=e.clone().sub(t).dot(n);return e.clone().sub(n.clone().multiplyScalar(r))}m(sn,"projectPointToPlane");function ge(e,t,n,r){const s=n?e.clone().multiplyScalar(-1):e.clone(),o=r?t.clone().multiplyScalar(-1):t.clone(),i=tn(s.dot(o)),a=Math.acos(i),c=nn(s,o);return{A:s,B:o,angle:a,signedAngle:c}}m(ge,"createAngleCombo");function Mt(e,t,n,r=!0){if(!e||!t)return null;const s=[ge(e,t,!1,!1),ge(e,t,!1,!0),ge(e,t,!0,!1),ge(e,t,!0,!0)],o=Math.PI/2,i=1e-6,a=m((c,l)=>c.length?c.slice().sort(l)[0]:null,"selectByAngle");if(n==="reflex"){const c=s[0],l=Math.abs(c.signedAngle),u=l<1e-6?0:2*Math.PI-l,p=-Math.sign(c.signedAngle||1),d=c.A.clone().add(c.B);return d.lengthSq()<1e-10&&d.set(-c.A.y,c.A.x),d.normalize().multiplyScalar(-1),{start:c.A.clone(),end:c.B.clone(),sweep:u,dirSign:p,angleRad:u,bisector:d,angleType:"reflex",signedAngle:c.signedAngle}}if(n==="acute"){if(!r){const d=s[0],y=d.A.clone().add(d.B);y.lengthSq()<1e-10&&y.set(-d.A.y,d.A.x),y.normalize();const g=Math.abs(d.signedAngle)<1e-8?1:Math.sign(d.signedAngle),b=Math.abs(d.signedAngle);return{start:d.A.clone(),end:d.B.clone(),sweep:b,dirSign:g,angleRad:b,bisector:y,angleType:"acute",signedAngle:d.signedAngle}}const c=s.filter(d=>d.angle<=o+i),l=a(c.length?c:s,(d,y)=>d.angle-y.angle);if(!l)return null;const u=l.A.clone().add(l.B);u.lengthSq()<1e-10&&u.set(-l.A.y,l.A.x),u.normalize();const p=Math.abs(l.signedAngle)<1e-8?1:Math.sign(l.signedAngle);return{start:l.A.clone(),end:l.B.clone(),sweep:l.angle,dirSign:p,angleRad:l.angle,bisector:u,angleType:"acute",signedAngle:l.signedAngle}}if(n==="obtuse"){const c=s.filter(d=>d.angle>=o-i);let l=a(c,(d,y)=>d.angle-y.angle);if(l||(l=a(s,(d,y)=>y.angle-d.angle)),!l)return null;const u=l.A.clone().add(l.B);u.lengthSq()<1e-10&&u.set(-l.A.y,l.A.x),u.normalize();const p=Math.abs(l.signedAngle)<1e-8?1:Math.sign(l.signedAngle);return{start:l.A.clone(),end:l.B.clone(),sweep:l.angle,dirSign:p,angleRad:l.angle,bisector:u,angleType:"obtuse",signedAngle:l.signedAngle}}return null}m(Mt,"resolveAngleOrientation2D");function an({planePoint:e=null,planeNormal:t=null,basis:n=null,vertex2D:r=null,directionA2D:s=null,directionB2D:o=null,sweepRad:i=0,sweepDirection:a=1,bisector2D:c=null,labelWorld:l=null,screenSizeWorld:u=null,fallbackScreenSizeWorld:p=null,defaultRadiusPixels:d=60,minRadiusPixels:y=30,arcDensity:g=64,minArcSteps:b=48,extensionPixels:h=25,stubPixels:N=12,labelOffsetPixels:A=70,arrowLengthPixels:x=10,arrowWidthPixels:D=4}={}){if(!e||!t||!n||!r||!s||!o)return null;const w=r.clone(),S=s.clone(),T=o.clone();if(S.lengthSq()<=1e-12||T.lengthSq()<=1e-12)return null;S.normalize(),T.normalize();const M=t.clone().normalize();let z=null;const F=le(l);if(F){const se=sn(F,e,M);z=We(se,e,n).clone().sub(w).length()}(!Number.isFinite(z)||z<=0)&&(z=C(d,u,p,.02));const R=C(y,u,p,.01);z=Math.max(z,R);const L=[],Z=Math.max(0,Number(i)||0),tt=Number(a)||1;if(Z>1e-6){const se=Math.max(b,Math.floor(Z*g));for(let K=0;K<=se;K+=1){const ze=K/se,Te=tt*Z*ze,ot=rn(S,Te),$t=new _(w.x+ot.x*z,w.y+ot.y*z);L.push(J($t,e,n))}}const me=C(x,u,p,.08),ye=C(D,u,p,.03),re=[];if(L.length>=2){const se=L[0].clone().sub(L[1]).normalize();re.push({tip:L[0].clone(),direction:se,length:me,width:ye});const K=L[L.length-1].clone(),ze=L[L.length-2].clone(),Te=K.clone().sub(ze).normalize();re.push({tip:K,direction:Te,length:me,width:ye})}const oe=z+C(h,u,p,.02),he=C(N,u,p,.01),ue=J(w,e,n),Vt=J(new _(w.x+S.x*oe,w.y+S.y*oe),e,n),Ot=J(new _(w.x+T.x*oe,w.y+T.y*oe),e,n),_t=J(new _(w.x-S.x*he,w.y-S.y*he),e,n),Bt=J(new _(w.x-T.x*he,w.y-T.y*he),e,n),Ct=[[ue.clone(),Vt],[ue.clone(),Ot],[ue.clone(),_t],[ue.clone(),Bt]];let fe=c?c.clone():new _().addVectors(S,T);fe.lengthSq()<1e-10&&fe.set(-S.y,S.x),fe.normalize();const nt=C(A,u,p,.03),rt=z>0?z+nt*.3:nt,jt=new _(w.x+fe.x*rt,w.y+fe.y*rt),It=J(jt,e,n);return{radius:z,arcPoints:L,arrowSpecs:re,segments:Ct,labelPosition:It,originWorld:ue}}m(an,"buildAngleDimensionGeometry");function ln({pointA:e=null,pointB:t=null,normal:n=null,offset:r=0,showExtensions:s=!0,labelWorld:o=null,screenSizeWorld:i=null,fallbackScreenSizeWorld:a=null,arrowLengthPixels:c=12,arrowWidthPixels:l=4,labelLiftPixels:u=6,labelLeaderThresholdPixels:p=6}={}){const d=le(e),y=le(t);if(!d||!y)return null;const g=y.clone().sub(d);if(g.lengthSq()<1e-8)return null;g.normalize();let b=le(n);(!b||b.lengthSq()<1e-12)&&(b=new f(0,0,1)),b.normalize();let h=new f().crossVectors(b,g);if(h.lengthSq()<1e-12&&(h=en(g)),h.lengthSq()<1e-12)return null;h.normalize();let N=Number(r);Number.isFinite(N)||(N=C(20,i,a,.05));const A=d.clone().addScaledVector(h,N),x=y.clone().addScaledVector(h,N),D=[];s!==!1&&N!==0&&(D.push([d.clone(),A.clone()]),D.push([y.clone(),x.clone()])),D.push([A.clone(),x.clone()]);const w=C(c,i,a,.08),S=C(l,i,a,.03),T=[{tip:A.clone(),direction:g.clone().negate(),length:w,width:S},{tip:x.clone(),direction:g.clone(),length:w,width:S}],M=le(o),z=new f().addVectors(A,x).multiplyScalar(.5),F=C(u,i,a,.02),R=M||z.addScaledVector(h,F);let L=null;if(M){const Z=A.distanceTo(x);if(Z>1e-6){const me=M.clone().sub(A).dot(g),ye=Math.max(0,Math.min(Z,me)),re=A.clone().addScaledVector(g,ye),oe=C(p,i,a,.02);M.distanceTo(re)>oe&&(L=[re,M.clone()])}}return{direction:g,tangent:h,offset:N,offsetA:A,offsetB:x,segments:D,arrowSpecs:T,labelPosition:R,leaderSegment:L}}m(ln,"buildLinearDimensionGeometry");const cn={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the linear dimension"},targets:{type:"reference_selection",selectionFilter:["VERTEX","EDGE"],multiple:!0,default_value:[],label:"Targets",hint:"Select two vertices, or a vertex and an edge, or a single edge"},planeRefName:{type:"reference_selection",selectionFilter:["FACE","PLANE"],multiple:!1,default_value:"",label:"Face/Plane",hint:"Projection plane (optional)"},alignment:{type:"options",default_value:"view",options:["view","XY","YZ","ZX"],label:"Alignment",hint:"Dimension alignment mode"},offset:{type:"number",default_value:0,label:"Offset",hint:"Offset distance for the dimension line",step:"any"},showExt:{type:"boolean",default_value:!0,label:"Extension Lines",hint:"Draw extension lines from anchors to offset line"},isReference:{type:"boolean",default_value:!1,label:"Reference",hint:"Mark as reference dimension (parentheses)"},decimals:{type:"number",default_value:3,defaultResolver:m(({pmimode:e})=>{const t=Number.isFinite(e?._opts?.dimDecimals)?e._opts.dimDecimals|0:void 0;if(Number.isFinite(t))return Math.max(0,Math.min(8,t))},"defaultResolver"),label:"Decimals",hint:"Number of decimal places to display",min:0,max:8,step:1}},$=class $ extends v{static showContexButton(t){const n=v._collectSelectionRefs(t,["VERTEX","EDGE"]);return n.length?{params:{targets:n.slice(0,2)}}:!1}constructor(t={}){super(t)}uiFieldsTest(t){const n=this.inputParams?.planeRefName;return(Array.isArray(n)?n.length>0:!!String(n||"").trim())?["alignment"]:[]}async run(t){const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams,a=at(n,i),c=a&&a.p0&&a.p1?a.p0.distanceTo(a.p1):null,l=it(c,i);if(i.value=l.display,!a||!a.p0||!a.p1)return[];(!i.persistentData||typeof i.persistentData!="object")&&(i.persistentData={});const u=i.persistentData;try{const d=o.alignNormal?o.alignNormal(i?.alignment||"view",i):new f(0,0,1),y=ln({pointA:a.p0,pointB:a.p1,normal:d,offset:i?.offset,showExtensions:i?.showExt!==!1,labelWorld:u.labelWorld||i.labelWorld,screenSizeWorld:o.screenSizeWorld,fallbackScreenSizeWorld:m(x=>q(n?.viewer,x),"fallbackScreenSizeWorld")});if(!y)return[];for(const[x,D]of y.segments)r.add(Y(x,D,1096065));for(const x of y.arrowSpecs)te(r,x.tip,x.direction,x.length,x.width,1096065);y.leaderSegment&&r.add(Y(y.leaderSegment[0],y.leaderSegment[1],1096065));const g=Number.isFinite(i.decimals)?i.decimals:n?._opts?.dimDecimals|0,b=a.p0.distanceTo(a.p1),h=it(b,i,g);i.value=h.display;const N=o.formatReferenceLabel?o.formatReferenceLabel(i,h.raw):h.display,A=y.labelPosition;A&&o.updateLabel(s,N,A,i)}catch{}return[]}static onLabelPointerDown(t,n,r,s,o){try{if(!t.viewer?.camera)return;const c=at(t,r);if(!c||!c.p0||!c.p1)return;const l=c.p0,u=c.p1,p=o.alignNormal?o.alignNormal(r?.alignment||"view",r):new f(0,0,1),d=new f().subVectors(u,l).normalize(),y=new f().crossVectors(p,d).normalize(),g=new f().addVectors(l,u).multiplyScalar(.5),b=new I().setFromNormalAndCoplanarPoint(p,g);$.dragLabelOnPlane(t,o,{makePlane:m(()=>b,"makePlane"),onDrag:m(h=>{const A=new f().subVectors(h,g).dot(y);r.offset=A;const x=[h.x,h.y,h.z];$.ensurePersistentData(r),r.persistentData.labelWorld=x,r.labelWorld=x,o.updateLabel(n,null,h,r),t.refreshAnnotationsUI?.()},"onDrag"),onEnd:m(()=>{try{t?.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}},"onEnd")})}catch{}}};m($,"LinearDimensionAnnotation"),P($,"entityType","linear"),P($,"type","linear"),P($,"shortName","DIM"),P($,"longName","Linear Dimension"),P($,"title","Linear"),P($,"inputParamsSchema",cn);let Ve=$;function it(e,t,n){if(typeof e!="number"||!Number.isFinite(e))return{raw:"-",display:"-"};const r=n!==void 0?n:Number(t?.decimals),s=Number.isFinite(r)?Math.max(0,Math.min(8,r|0)):3,o=`${e.toFixed(s)}`,i=t?.isReference?`(${o})`:o;return{raw:o,display:i}}m(it,"formatLinearLabel");function at(e,t){const n=Array.isArray(t?.targets);try{const r=e?.viewer?.partHistory?.scene,s=un(n?t.targets:null);if(r&&s.length){const o=fn(r,s);if(o.length){const i=[],a=[];for(const l of o){const u=typeof l?.type=="string"?l.type.toUpperCase():"";u==="VERTEX"?i.push(l):u==="EDGE"&&a.push(l)}const c=e?.viewer;if(i.length>=2){const l=Me(c,i[0]),u=Me(c,i[1]);if(l&&u)return{p0:l,p1:u}}if(i.length===1&&a.length){const l=Me(c,i[0]),u=l?pn(a,l):null;if(l&&u)return{p0:l,p1:u}}if(!i.length&&a.length){if(a.length===1){const l=Et(a[0]);if(l)return{p0:l.a,p1:l.b}}else if(a.length>=2)return vt(a[0],a[1])}}}}catch{}if(!n)try{const r=e?.viewer?.partHistory?.scene,s=t?.aRefName||null,o=t?.bRefName||null;if(r&&(s||o)){const i=s?r.getObjectByName(s):null,a=o?r.getObjectByName(o):null;if(i&&a)return dn(i,a);if(i&&!a){const c=E(e.viewer,i),l=be(t.p1);if(c&&l)return{p0:c,p1:l}}if(!i&&a){const c=E(e.viewer,a),l=be(t.p0);if(l&&c)return{p0:l,p1:c}}}}catch{}return{p0:be(t?.p0)||new f(0,0,0),p1:be(t?.p1)||new f(0,0,0)}}m(at,"computeDimPoints");function un(e){return Array.isArray(e)?e:e==null||e===""?[]:[e]}m(un,"normalizeTargetList");function fn(e,t){if(!e||!Array.isArray(t))return[];const n=[],r=new Set;for(const s of t){let o=null;if(s&&typeof s=="object")s.isObject3D?o=s:s.name&&(o=e.getObjectByName(s.name));else if(s!=null){const a=String(s).trim();a&&(o=e.getObjectByName(a))}if(!o)continue;const i=o.uuid||o.id||o.name;if(i!=null){const a=String(i);if(r.has(a))continue;r.add(a)}n.push(o)}return n}m(fn,"resolveTargetObjects");function Me(e,t){const n=E(e,t);return n&&n.clone||n&&n.isVector3?n.clone():t?.getWorldPosition?t.getWorldPosition(new f):null}m(Me,"resolveVertexPoint");function pn(e,t){if(!Array.isArray(e)||!t)return null;let n=null,r=1/0;for(const s of e){const o=Et(s);if(o){const a=o.a.distanceToSquared(t);a<r&&(r=a,n=o.a);const c=o.b.distanceToSquared(t);c<r&&(r=c,n=o.b);continue}const i=Oe(s,t);if(i){const a=i.distanceToSquared(t);a<r&&(r=a,n=i)}}return n?n.clone():null}m(pn,"closestEndpointToPoint");function Et(e){if(!e)return null;try{e.updateMatrixWorld?.(!0)}catch{}try{if(typeof e.points=="function"){const o=e.points(!0);if(Array.isArray(o)&&o.length>=2){const i=we(o[0]),a=we(o[o.length-1]);if(i&&a)return{a:i,b:a}}}}catch{}const t=Array.isArray(e?.userData?.polylineLocal)?e.userData.polylineLocal:null;if(t&&t.length>=2){const o=we(t[0]),i=we(t[t.length-1]);if(o&&i)return e.matrixWorld&&(o.applyMatrix4(e.matrixWorld),i.applyMatrix4(e.matrixWorld)),{a:o,b:i}}const n=e?.geometry?.attributes?.instanceStart,r=e?.geometry?.attributes?.instanceEnd;if(n&&r&&n.count>=1){const o=new f(n.getX(0),n.getY(0),n.getZ(0)),i=new f(r.getX(0),r.getY(0),r.getZ(0));return e.matrixWorld&&(o.applyMatrix4(e.matrixWorld),i.applyMatrix4(e.matrixWorld)),{a:o,b:i}}const s=e?.geometry?.getAttribute?.("position");if(s&&s.itemSize===3&&s.count>=2){const o=new f(s.getX(0),s.getY(0),s.getZ(0)),i=new f(s.getX(s.count-1),s.getY(s.count-1),s.getZ(s.count-1));return e.matrixWorld&&(o.applyMatrix4(e.matrixWorld),i.applyMatrix4(e.matrixWorld)),{a:o,b:i}}return null}m(Et,"edgeEndpointsWorld");function dn(e,t){if(e?.type==="VERTEX"&&t?.type==="VERTEX")return{p0:e.getWorldPosition(new f),p1:t.getWorldPosition(new f)};if(e?.type==="EDGE"&&t?.type==="VERTEX"){const n=t.getWorldPosition(new f);return{p0:Oe(e,n),p1:n}}if(e?.type==="VERTEX"&&t?.type==="EDGE"){const n=e.getWorldPosition(new f),r=Oe(t,n);return{p0:n,p1:r}}return e?.type==="EDGE"&&t?.type==="EDGE"?vt(e,t):{p0:E(null,e)||new f,p1:E(null,t)||new f}}m(dn,"closestPointsForObjects");function Oe(e,t){try{const n=e.points(!0);if(!n||n.length<2)return e.getWorldPosition(new f);const r=t.clone();let s={d2:1/0,q:null};const o=new f,i=new f;for(let a=0;a<n.length-1;a++){o.set(n[a].x,n[a].y,n[a].z),i.set(n[a+1].x,n[a+1].y,n[a+1].z);const c=mn(o,i,r),l=c.distanceToSquared(r);l<s.d2&&(s={d2:l,q:c})}return s.q||e.getWorldPosition(new f)}catch{return e.getWorldPosition(new f)}}m(Oe,"closestPointOnEdgeToPoint");function vt(e,t){try{const n=e.points(!0),r=t.points(!0);if(!n||n.length<2||!r||r.length<2)return{p0:E(null,e)||new f,p1:E(null,t)||new f};const s=new f,o=new f,i=new f,a=new f;let c={d2:1/0,p:null,q:null};for(let l=0;l<n.length-1;l++){s.set(n[l].x,n[l].y,n[l].z),o.set(n[l+1].x,n[l+1].y,n[l+1].z);for(let u=0;u<r.length-1;u++){i.set(r[u].x,r[u].y,r[u].z),a.set(r[u+1].x,r[u+1].y,r[u+1].z);const{p,q:d}=yn(s,o,i,a),y=p.distanceToSquared(d);y<c.d2&&(c={d2:y,p,q:d})}}return{p0:c.p||E(null,e)||new f,p1:c.q||E(null,t)||new f}}catch{return{p0:E(null,e)||new f,p1:E(null,t)||new f}}}m(vt,"closestPointsBetweenEdges");function mn(e,t,n){const r=t.clone().sub(e),s=Math.max(0,Math.min(1,r.dot(n.clone().sub(e))/(r.lengthSq()||1)));return e.clone().addScaledVector(r,s)}m(mn,"closestPointOnSegment");function yn(e,t,n,r){const s=t.clone().sub(e),o=r.clone().sub(n),i=e.clone().sub(n),a=s.dot(s),c=o.dot(o),l=o.dot(i);let u,p;const d=1e-12;if(a<=d&&c<=d)u=0,p=0;else if(a<=d)u=0,p=Math.max(0,Math.min(1,l/c));else{const b=s.dot(i);if(c<=d)p=0,u=Math.max(0,Math.min(1,-b/a));else{const h=s.dot(o),N=a*c-h*h;u=N!==0?Math.max(0,Math.min(1,(h*l-b*c)/N)):0,p=(h*u+l)/c,p<0?(p=0,u=Math.max(0,Math.min(1,-b/a))):p>1&&(p=1,u=Math.max(0,Math.min(1,(h-b)/a)))}}const y=e.clone().addScaledVector(s,u),g=n.clone().addScaledVector(o,p);return{p:y,q:g}}m(yn,"closestPointsOnSegments");function we(e){return le(e)}m(we,"arrayToVector");function be(e){return e?e instanceof f?e.clone():Array.isArray(e)?new f(e[0]||0,e[1]||0,e[2]||0):typeof e=="object"?new f(e.x||0,e.y||0,e.z||0):null:null}m(be,"vectorFromAnnotationPoint");const hn={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the radial dimension"},cylindricalFaceRef:{type:"reference_selection",selectionFilter:["FACE"],multiple:!1,default_value:"",label:"Cylindrical Face",hint:"Select cylindrical face"},planeRef:{type:"reference_selection",selectionFilter:["FACE","PLANE"],multiple:!1,default_value:"",label:"Projection Plane",hint:"Optional plane used to project the dimension"},displayStyle:{type:"options",default_value:"radius",options:["radius","diameter"],label:"Display Style",hint:"Display as radius or diameter"},alignment:{type:"options",default_value:"view",options:["view","XY","YZ","ZX"],label:"Alignment",hint:"Dimension alignment mode"},offset:{type:"number",default_value:0,label:"Offset",hint:"Distance to offset the dimension line",step:"any"},isReference:{type:"boolean",default_value:!1,label:"Reference",hint:"Mark as reference dimension (parentheses)"},decimals:{type:"number",default_value:3,defaultResolver:m(({pmimode:e})=>{const t=Number.isFinite(e?._opts?.dimDecimals)?e._opts.dimDecimals|0:void 0;if(Number.isFinite(t))return Math.max(0,Math.min(8,t))},"defaultResolver"),label:"Decimals",hint:"Number of decimal places to display",min:0,max:8,step:1}},X=class X extends v{static showContexButton(t){const n=v._normalizeSelectionItems(t),r=new Set(["FACE"]);for(const s of n){if(!v._isSelectionType(s,r)||!gn(s))continue;const o=v._selectionRefName(s);if(o)return{params:{cylindricalFaceRef:o}}}return!1}constructor(t={}){super(t)}uiFieldsTest(t){const n=this.inputParams?.planeRef;return(Array.isArray(n)?n.length>0:!!String(n||"").trim())?["alignment"]:[]}async run(t){const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams,a=wn(n,i),c=lt(a,i);i.value=c.display,ct(i);try{const l=Be(n,i,o);if(!l||!l.center||!l.radiusPoint)return[];const{center:u,radiusPoint:p,planeNormal:d,planePoint:y,radius:g}=l,b=16739125;let h=new f().subVectors(p,u);h.lengthSq()<1e-6&&h.set(1,0,0),h.normalize();let N=d;if(N||(N=o.alignNormal?o.alignNormal(i.alignment||"view",i):null),N&&N.lengthSq()>1e-6){const S=h.clone().projectOnPlane(N).normalize();S.lengthSq()>1e-6&&(h=S)}const A=o.screenSizeWorld?o.screenSizeWorld(12):q(n?.viewer,12),x=o.screenSizeWorld?o.screenSizeWorld(4):q(n?.viewer,4),D=i.displayStyle==="diameter",w=i.persistentData?.labelWorld?Ce(i.persistentData.labelWorld):null;if(D){const S=w?w.clone().sub(u).normalize():h.clone(),T=w?u.clone().addScaledVector(S,w.clone().sub(u).length()):u.clone().addScaledVector(S,g+Math.abs(Number(i.offset)||o.screenSizeWorld?o.screenSizeWorld(50):q(n?.viewer,50))),M=u.clone().addScaledVector(S,-g),z=u.clone().addScaledVector(S,g),F=u.clone().addScaledVector(S,-g);r.add(Y(M,T,b)),te(r,z,S.clone(),A,x,b),te(r,F,S.clone().negate(),A,x,b);const R=Re(o.screenSizeWorld?o.screenSizeWorld(6):q(n?.viewer,6),b);R.position.copy(u),r.add(R)}else{const S=w||Ft(n,i,u,p,d,y,o);let M=S.clone().sub(u).clone();M.lengthSq()||(M=h.clone()),M.normalize();const z=S;r.add(Y(u,z,b));const F=u.clone().addScaledVector(M,g);te(r,F,M.clone(),A,x,b);const R=Re(o.screenSizeWorld?o.screenSizeWorld(6):q(n?.viewer,6),b);R.position.copy(u),r.add(R)}if(typeof a=="number"){const S=lt(a,i);i.value=S.display;const T=o.formatReferenceLabel?o.formatReferenceLabel(i,S.raw):S.display,M=bn(n,i,u,p,d,y,o);M&&o.updateLabel(s,T,M,i)}}catch(l){console.warn("RadialDimensionAnnotation render error:",l)}return[]}static onLabelPointerDown(t,n,r,s,o){try{const i=Be(t,r,o);if(!i||!i.center||!i.radiusPoint)return;const a=i.planeNormal&&i.planeNormal.lengthSq()>1e-6?i.planeNormal.clone().normalize():o.alignNormal?o.alignNormal(r.alignment||"view",r):new f(0,0,1),c=i.planePoint||i.radiusPoint,l=a&&c?new I().setFromNormalAndCoplanarPoint(a,c):null,u=new f().subVectors(i.radiusPoint,i.center).normalize();X.dragLabelOnPlane(t,o,{makePlane:m(()=>l,"makePlane"),onDrag:m(p=>{l.projectPoint(p,p),ct(r),r.persistentData.labelWorld=[p.x,p.y,p.z];const d=new f().subVectors(p,i.center);r.offset=d.dot(u)-i.radius,o.updateLabel(n,null,p,r),t.refreshAnnotationsUI?.()},"onDrag"),onEnd:m(()=>{try{t?.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}},"onEnd")})}catch{}}};m(X,"RadialDimensionAnnotation"),P(X,"entityType","radial"),P(X,"type","radial"),P(X,"shortName","RAD"),P(X,"longName","Radial Dimension"),P(X,"title","Radial"),P(X,"inputParamsSchema",hn);let _e=X;function lt(e,t){if(typeof e!="number"||!Number.isFinite(e))return{raw:"-",display:"-"};const n=t?.displayStyle==="diameter"?e*2:e,r=Number(t?.decimals),s=Number.isFinite(r)?Math.max(0,Math.min(8,r|0)):3,i=`${t?.displayStyle==="diameter"?"⌀":"R"}${n.toFixed(s)}`,a=`${i} (wu)`,c=t?.isReference?`(${a})`:a;return{raw:i,display:c}}m(lt,"formatRadialLabel");function ct(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(ct,"ensurePersistent$2");function Be(e,t,n){try{const r=e?.viewer?.partHistory?.scene;if(!r||!t.cylindricalFaceRef)return null;const s=r.getObjectByName(t.cylindricalFaceRef);if(!s)return null;let o=s;for(;o&&typeof o.getFaceMetadata!="function";)o=o.parent;let i=null,a=null,c=null,l=null,u=null;const p=new f;let d=null,y=null;if(o&&typeof o.getFaceMetadata=="function"&&(d=o.getFaceMetadata(t.cylindricalFaceRef),d&&(d.type==="cylindrical"||d.type==="conical")&&(d.type==="cylindrical"?(i=new f(d.center[0],d.center[1],d.center[2]),a=d.radius,c=new f(d.axis[0],d.axis[1],d.axis[2]).normalize()):Math.abs(d.radiusBottom-d.radiusTop)<1e-6&&(i=new f(d.center[0],d.center[1],d.center[2]),a=d.radiusBottom,c=new f(d.axis[0],d.axis[1],d.axis[2]).normalize()),i&&c&&(s.parent&&s.parent.matrixWorld&&(i.applyMatrix4(s.parent.matrixWorld),c.transformDirection(s.parent.matrixWorld).normalize()),u=new f,Math.abs(c.x)<.9?u.crossVectors(c,new f(1,0,0)).normalize():u.crossVectors(c,new f(0,1,0)).normalize(),l=i.clone().addScaledVector(u,a))),d&&typeof d=="object")){const h=d.pmiRadiusOverride??d.radiusOverride;Number.isFinite(h)&&h>0&&(y=Math.abs(h))}if((!i||!c||!Number.isFinite(a)||a<=0)&&o){const h=Sn(o,s);h&&(i=h.center,c=h.axis,a=h.radius,l=h.radiusPoint,u=h.perpendicular)}if(!i||!c||!Number.isFinite(a)||a<=0){const h=Tn(s);if(!h)return null;i=h.center,c=h.axis,a=h.radius,l=h.radiusPoint,u=new f().subVectors(l,i).normalize()}if(y&&i){let h=null;u&&u.lengthSq()>1e-12?h=u.clone().normalize():l&&(h=new f().subVectors(l,i),h.lengthSq()>1e-12&&h.normalize()),a=y,h&&(u=h.clone(),l=i.clone().addScaledVector(h,a))}p.copy(i);let g=null,b=null;if(t.planeRef){const h=r.getObjectByName(t.planeRef);h&&(g=ce(e.viewer,h),b=E(e.viewer,h))}if(g&&b&&g.lengthSq()>1e-6){const h=g.clone().normalize();g=h;const N=new I().setFromNormalAndCoplanarPoint(h,b),A=new f;N.projectPoint(i,A),i=A;let x=new f().subVectors(l,p);x.lengthSq()<1e-12&&(x=u.clone());let D=x.projectOnPlane(h);D.lengthSq()<1e-12&&(D=c.clone().cross(h),D.lengthSq()<1e-12&&(Math.abs(h.x)<.9?D=new f().crossVectors(h,new f(1,0,0)):D=new f().crossVectors(h,new f(0,1,0)))),D.normalize(),l=i.clone().addScaledVector(D,a)}return{center:i,radiusPoint:l,planeNormal:g,planePoint:b,axis:c,radius:a}}catch{return null}}m(Be,"computeRadialPoints");function Ee(e){if(!e||typeof e!="object")return!1;const t=String(e.type||"").toLowerCase();if(t==="cylindrical"){const n=Number(e.radius);return Number.isFinite(n)&&n>0}if(t==="conical"){const n=Number(e.radiusBottom),r=Number(e.radiusTop);return!Number.isFinite(n)||!Number.isFinite(r)||Math.abs(n-r)>1e-6?!1:Math.max(n,r)>0}return!1}m(Ee,"isCylindricalMetadata");function ve(e){if(!e)return null;const t=e.userData||null;if(t?.metadata&&Ee(t.metadata))return t.metadata;if(typeof e.getMetadata=="function")try{const s=e.getMetadata();if(Ee(s))return s}catch{}const n=e?.name||t?.faceName||null;let r=e?.parentSolid||t?.parentSolid||e?.parent||null;for(;r;){if(n&&typeof r.getFaceMetadata=="function"){try{const s=r.getFaceMetadata(n);if(Ee(s))return s}catch{}break}r=r.parent||null}return null}m(ve,"readCylindricalMetadata");function gn(e){if(!e)return!1;if(ve(e))return!0;if(Array.isArray(e.faces)){for(const t of e.faces)if(ve(t))return!0}return!!(e.parent&&ve(e.parent))}m(gn,"hasCylindricalMetadata");function wn(e,t){try{const n=Be(e,t);return n&&typeof n.radius=="number"?n.radius:n&&n.center&&n.radiusPoint?n.center.distanceTo(n.radiusPoint):null}catch{return null}}m(wn,"measureRadialValue");function bn(e,t,n,r,s,o,i){try{let a=null;return t.persistentData?.labelWorld?a=Ce(t.persistentData.labelWorld):t.labelWorld&&(a=Ce(t.labelWorld)),a||(a=Ft(e,t,n,r,s,o,i)),s&&o&&s.lengthSq()>1e-6&&a&&new I().setFromNormalAndCoplanarPoint(s.clone().normalize(),o).projectPoint(a,a),a}catch{return null}}m(bn,"resolveLabelPosition$1");function Ft(e,t,n,r,s,o,i){try{const a=new f().subVectors(r,n);if(a.lengthSq()<1e-12)return r.clone();a.normalize();let c=Number(t?.offset);(!Number.isFinite(c)||c===0)&&(c=i.screenSizeWorld?i.screenSizeWorld(50):q(e?.viewer,50));const l=n.distanceTo(r),u=n.clone().addScaledVector(a,l+Math.abs(c));return s&&o&&s.lengthSq()>1e-6&&new I().setFromNormalAndCoplanarPoint(s.clone().normalize(),o).projectPoint(u,u),u}catch{return r?r.clone():null}}m(Ft,"computeRadialLabelPosition");function Sn(e,t){try{if(!e||!t)return null;const n=Array.isArray(e._auxEdges)?e._auxEdges:null;if(!n||n.length===0)return null;const r=(t.name||t.userData?.faceName||"").trim();if(!r)return null;const s=zn(r);if(!s)return null;const o=xn(n,`${s}_PATH`);if(!o||!Array.isArray(o.points)||o.points.length<2)return null;e.updateMatrixWorld?.(!0),t.updateMatrixWorld?.(!0);const i=Pn(o,e);if(!i||i.length<2)return null;const a=Nn(t,16);if(!a.length)return null;let c=null;for(const l of a){const u=An(l,i,!!o.closedLoop);if(!u||!u.point)continue;const p=new f().subVectors(l,u.point),d=p.lengthSq();if(!(d>1e-10))continue;const y=Math.sqrt(d);p.normalize(),(!c||y>c.radius)&&(c={center:u.point.clone(),axis:u.direction?u.direction.clone():null,radius:y,radiusPoint:u.point.clone().addScaledVector(p,y),perpendicular:p.clone()})}return c?((!c.axis||c.axis.lengthSq()<1e-10)&&(c.axis=Dn(i,c.center,!!o.closedLoop)||new f(0,1,0)),c):null}catch{return null}}m(Sn,"inferPipeFaceDataFromAuxEdges");function xn(e,t){if(!Array.isArray(e)||!t)return null;for(const r of e)if(r?.name===t)return r;const n=t.toLowerCase();for(const r of e)if(typeof r?.name=="string"&&r.name.toLowerCase()===n)return r;return null}m(xn,"findAuxEdgeByName");function Pn(e,t){try{const n=[],r=!e.polylineWorld&&t?.matrixWorld?t.matrixWorld:null,s=new f;for(const o of e.points){if(Array.isArray(o)&&o.length>=3)s.set(o[0],o[1],o[2]);else if(o&&typeof o=="object")s.set(Number(o.x)||0,Number(o.y)||0,Number(o.z)||0);else continue;r&&s.applyMatrix4(r),n.push(s.clone())}return n}catch{return null}}m(Pn,"buildAuxPolylineWorld");function Nn(e,t=16){try{const n=e?.geometry;if(!n)return[];const r=typeof n.getAttribute=="function"?n.getAttribute("position"):null,s=e.matrixWorld||new de,o=[],i=new f;if(r&&r.count>0){const a=Math.max(1,Math.floor(r.count/t));for(let c=0;c<r.count&&o.length<t;c+=a)i.set(r.getX(c),r.getY(c),r.getZ(c)).applyMatrix4(s),o.push(i.clone())}if(!o.length)try{n.computeBoundingSphere?.(),n.boundingSphere&&(i.copy(n.boundingSphere.center).applyMatrix4(s),o.push(i.clone()))}catch{}return o}catch{return[]}}m(Nn,"collectFaceSamplePoints");function An(e,t,n=!1){if(!e||!Array.isArray(t)||t.length<2)return null;const r=new f,s=new f,o=new f;let i=null,a=null,c=1/0;const l=t.length,u=n?l:l-1;for(let p=0;p<u;p++){const d=t[p],y=t[(p+1)%l];if(!d||!y)continue;s.copy(y).sub(d);const g=s.lengthSq();if(g<1e-14)continue;o.copy(e).sub(d);let b=o.dot(s)/g;b=Math.max(0,Math.min(1,b)),r.copy(d).addScaledVector(s,b);const h=r.distanceToSquared(e);h<c&&(c=h,i=r.clone(),a=s.clone().normalize())}return i?{point:i,direction:a,distanceSq:c}:null}m(An,"closestPointOnPolyline");function Dn(e,t,n=!1){if(!Array.isArray(e)||e.length<2||!t)return null;let r=null,s=1/0;const o=new f,i=new f,a=e.length,c=n?a:a-1;for(let l=0;l<c;l++){const u=e[l],p=e[(l+1)%a];if(!u||!p)continue;o.copy(u).add(p).multiplyScalar(.5);const d=o.distanceToSquared(t);d<s&&(s=d,i.copy(p).sub(u),r=i.lengthSq()>1e-14?i.clone().normalize():null)}return r}m(Dn,"estimatePolylineTangent");function zn(e){const t=/^(.*?)(_Outer|_Inner|_CapStart|_CapEnd)$/i.exec(e);return t?t[1]:null}m(zn,"pipeFaceBaseName");function Tn(e){try{const t=e?.geometry;if(!t||!t.getAttribute)return null;const n=t.getAttribute("position");if(!n||n.count<6)return null;const r=e.matrixWorld||new de,s=[],o=new f;for(let w=0;w<n.count;w++)o.set(n.getX(w),n.getY(w),n.getZ(w)).applyMatrix4(r),s.push(o.clone());if(!s.length)return null;const i=new f;for(const w of s)i.add(w);i.divideScalar(s.length);const a=new Float64Array(9),c=new f;for(const w of s)c.copy(w).sub(i),a[0]+=c.x*c.x,a[1]+=c.x*c.y,a[2]+=c.x*c.z,a[4]+=c.y*c.y,a[5]+=c.y*c.z,a[8]+=c.z*c.z;a[3]=a[1],a[6]=a[2],a[7]=a[5];const l=new f(1,0,0);for(let w=0;w<20;w++){const S=a[0]*l.x+a[1]*l.y+a[2]*l.z,T=a[1]*l.x+a[4]*l.y+a[5]*l.z,M=a[2]*l.x+a[5]*l.y+a[8]*l.z;l.set(S,T,M);const z=l.length();if(z<1e-12){l.set(0,1,0);break}l.divideScalar(z)}l.lengthSq()<1e-12&&l.set(0,1,0);let u=1/0,p=-1/0,d=0,y=0;const g=new f,b=new f,h=new f;for(const w of s){c.copy(w).sub(i);const S=c.dot(l);S<u&&(u=S),S>p&&(p=S),b.copy(l).multiplyScalar(S),g.copy(c).sub(b);const T=g.length();T>1e-6&&(y===0&&h.copy(g).normalize(),d+=T,y++)}if(!y)return null;const N=d/y,A=i.clone().add(l.clone().multiplyScalar((u+p)*.5)),x=h.lengthSq()>1e-12?h.clone():new f().crossVectors(l,new f(1,0,0)).normalize();x.lengthSq()<1e-12&&x.set(0,1,0).cross(l).normalize();const D=A.clone().addScaledVector(x,N);return{center:A,axis:l.normalize(),radius:N,radiusPoint:D}}catch{return null}}m(Tn,"inferCylinderFromGeometry");function Ce(e){return e?e instanceof f?e.clone():Array.isArray(e)?new f(e[0]||0,e[1]||0,e[2]||0):typeof e=="object"?new f(e.x||0,e.y||0,e.z||0):null:null}m(Ce,"vectorFromAny$1");const Mn={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the angle dimension"},decimals:{type:"number",default_value:1,defaultResolver:m(({pmimode:e})=>{const t=Number.isFinite(e?._opts?.angleDecimals)?e._opts.angleDecimals|0:void 0;if(Number.isFinite(t))return Math.max(0,Math.min(3,t))},"defaultResolver"),label:"Decimals",hint:"Number of decimal places to display",min:0,max:3,step:1},targets:{type:"reference_selection",selectionFilter:["FACE","EDGE"],multiple:!0,default_value:[],label:"Elements",hint:"Select two edges/faces to define the angle",minSelections:2,maxSelections:2},planeRefName:{type:"reference_selection",selectionFilter:["FACE","PLANE"],multiple:!1,default_value:"",label:"Projection Plane",hint:"Override projection plane (optional)"},reverseElementOrder:{type:"boolean",default_value:!1,label:"Reverse Selection Order",hint:"Swap Element A and Element B to flip the measured side"},isReference:{type:"boolean",default_value:!1,label:"Reference",hint:"Mark as reference dimension (parentheses)"},angleType:{type:"options",default_value:"acute",options:["acute","obtuse","reflex"],label:"Angle Type",hint:"Choose which angle (acute, obtuse, or reflex) to display"}},Q=class Q extends v{static showContexButton(t){const n=v._collectSelectionRefs(t,["FACE","EDGE"]);return n.length<2?!1:{params:{targets:n.slice(0,2)}}}constructor(t={}){super(t)}async run(t){const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams,a=vn(n,i),c=ft(a,i);i.value=c.display,ut(i);try{const l=pt(n,i,o);if(!l||!l.__2d)return[];const u=16096779,{N:p,P:d,A_d:y,B_d:g,V2:b,basis:h,sweep:N=0,dirSign:A=1,bisector:x=null}=l.__2d,D=an({planePoint:d,planeNormal:p,basis:h,vertex2D:b,directionA2D:y,directionB2D:g,sweepRad:N,sweepDirection:A,bisector2D:x,labelWorld:i.persistentData?.labelWorld,screenSizeWorld:o.screenSizeWorld,fallbackScreenSizeWorld:m(w=>q(n?.viewer,w),"fallbackScreenSizeWorld")});if(!D)return[];for(let w=0;w<D.arcPoints.length-1;w+=1)r.add(Y(D.arcPoints[w],D.arcPoints[w+1],u));for(const[w,S]of D.segments)r.add(Y(w,S,u));for(const w of D.arrowSpecs)te(r,w.tip,w.direction,w.length,w.width,u);if(typeof a=="number"){const w=ft(a,i),S=w.raw;i.value=w.display;const T=o.formatReferenceLabel?o.formatReferenceLabel(i,S):w.display,M=D.labelPosition;M&&o.updateLabel(s,T,M,i)}}catch{}return[]}static onLabelPointerDown(t,n,r,s,o){try{const i=pt(t,r,o);if(!i)return;const a=Je(t,r,i,o),c=a?.n||new f(0,0,1),l=a?.p||new f,u=new I().setFromNormalAndCoplanarPoint(c,l);try{t?.showDragPlaneHelper?.(u)}catch{}const p=m(y=>{const g=o.raycastFromEvent?o.raycastFromEvent(y):null;if(!g)return;const b=new f;(o.intersectPlane?o.intersectPlane(g,u,b):g.intersectPlane(u,b))&&(ut(r),r.persistentData.labelWorld=[b.x,b.y,b.z],o.updateLabel(n,null,b,r),t.refreshAnnotationsUI?.())},"onMove"),d=m(y=>{try{window.removeEventListener("pointermove",p,!0),window.removeEventListener("pointerup",d,!0)}catch{}try{t?.hideDragPlaneHelper?.()}catch{}try{t.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}try{y.preventDefault(),y.stopImmediatePropagation?.(),y.stopPropagation()}catch{}},"onUp");window.addEventListener("pointermove",p,!0),window.addEventListener("pointerup",d,!0)}catch{}}};m(Q,"AngleDimensionAnnotation"),P(Q,"entityType","angle"),P(Q,"type","angle"),P(Q,"shortName","ANG"),P(Q,"longName","Angle Dimension"),P(Q,"title","Angle"),P(Q,"inputParamsSchema",Mn);let je=Q;function ut(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(ut,"ensurePersistent$1");function En(e){const t=Array.isArray(e)?e:e==null||e===""?[]:[e],n=[],r=new Set;for(const s of t){let o="";s&&typeof s=="object"?typeof s.name=="string"?o=s.name:s.id!=null&&(o=String(s.id)):s!=null&&(o=String(s)),o=o.trim(),!(!o||r.has(o))&&(r.add(o),n.push(o))}return n}m(En,"normalizeTargetNames");function Ke(e){const t=Array.isArray(e?.targets),n=En(t?e.targets:null);let r="",s="";return n.length?(r=n[0]||"",s=n[1]||""):t||(r=e?.elementARefName||"",s=e?.elementBRefName||""),e?.reverseElementOrder?{elementARefName:s,elementBRefName:r}:{elementARefName:r,elementBRefName:s}}m(Ke,"resolveElementRefNames");function qt(e){const t=e?.angleType;return t==="acute"||t==="obtuse"||t==="reflex"?t:e?.useReflexAngle?"reflex":"acute"}m(qt,"resolveAngleType");function Lt(e){return!e||typeof e!="object"||!Object.prototype.hasOwnProperty.call(e,"angleType")?!1:e.angleType==="acute"||e.angleType==="obtuse"||e.angleType==="reflex"}m(Lt,"isAngleTypeExplicit");function ft(e,t){if(typeof e!="number"||!Number.isFinite(e))return{raw:"-",display:"-"};const n=Number(t?.decimals),r=Number.isFinite(n)?Math.max(0,Math.min(3,n|0)):1,s=`${e.toFixed(r)}°`,o=t?.isReference?`(${s})`:s;return{raw:s,display:o}}m(ft,"formatAngleLabel");function vn(e,t){try{const n=Rt(e,t),r=Je(e,t,n);if(!r)return null;const{elementARefName:s,elementBRefName:o}=Ke(t),i=Ae(e,s,r.n,r.p),a=Ae(e,o,r.n,r.p);if(!i||!a)return null;const c=Ze(r.n,i.d),l=Ne(i.d,c).normalize(),u=Ne(a.d,c).normalize(),p=qt(t),d=Lt(t)||!!t?.useReflexAngle,y=Mt(l,u,p,d);return y?Se.radToDeg(y.angleRad):null}catch{return null}}m(vn,"measureAngleValue");function Rt(e,t){try{const n=e?.viewer?.partHistory?.scene;if(!n)return null;const{elementARefName:r,elementBRefName:s}=Ke(t),o=r?n.getObjectByName(r):null,i=s?n.getObjectByName(s):null;if(!o||!i)return null;const a=ce(e.viewer,o),c=ce(e.viewer,i),l=E(e.viewer,o),u=E(e.viewer,i);let p=null;if(t.planeRefName){const d=n.getObjectByName(t.planeRefName);d&&(p=ce(e.viewer,d))}return{dirA:a,dirB:c,pointA:l,pointB:u,plane:p}}catch{return null}}m(Rt,"computeAngleElements");function pt(e,t,n){try{const r=Rt(e,t);if(!r||!r.dirA||!r.dirB)return null;const s=Je(e,t,r,n);if(!s)return null;const{elementARefName:o,elementBRefName:i}=Ke(t),a=Ae(e,o,s.n,s.p),c=Ae(e,i,s.n,s.p);if(!a||!c)return null;const l=Ze(s.n,a.d),u=We(a.p,s.p,l),p=We(c.p,s.p,l);let d=Ne(a.d,l).normalize(),y=Ne(c.d,l).normalize();t?.reverseElementOrder&&(d=d.multiplyScalar(-1),y=y.multiplyScalar(-1));const g=qt(t),b=Lt(t)||!!t?.useReflexAngle,h=Mt(d,y,g,b);if(!h)return null;const N=h.start.clone(),A=h.end.clone();let x=on(u,N,p,A);if(x){const D=Math.max(1e-6,u.distanceTo(p));Math.max(x.distanceTo(u),x.distanceTo(p))>D*8&&(x=null)}return x||(x=new _().addVectors(u,p).multiplyScalar(.5)),{...r,__2d:{N:s.n,P:s.p,basis:l,A_p:u,B_p:p,A_d:N,B_d:A,V2:x,sweep:h.sweep,dirSign:h.dirSign,angleRad:h.angleRad,angleType:h.angleType,bisector:h.bisector}}}catch{return null}}m(pt,"computeAngleElementsWithGeometry");function Je(e,t,n,r){try{if(t?.planeRefName){const a=e.viewer?.partHistory?.scene?.getObjectByName(t.planeRefName);if(a){const c=ce(e.viewer,a)||new f(0,0,1);if(c.lengthSq()>1e-12){const l=E(e.viewer,a)||new f;return{n:c.clone().normalize(),p:l}}}}if(n?.dirA&&n?.dirB){const a=new f().crossVectors(n.dirA,n.dirB);if(a.lengthSq()>1e-12){const c=n.pointA&&n.pointB?new f().addVectors(n.pointA,n.pointB).multiplyScalar(.5):n.pointA||n.pointB||new f;return{n:a.normalize(),p:c}}}const o=(r?.alignNormal?r.alignNormal("view",t):null)||n?.plane||new f(0,0,1),i=n?.pointA&&n?.pointB?new f().addVectors(n.pointA,n.pointB).multiplyScalar(.5):n?.pointA||n?.pointB||new f;return{n:o.clone().normalize(),p:i}}catch{return{n:new f(0,0,1),p:new f}}}m(Je,"resolveAnglePlane");function Ae(e,t,n,r){try{if(!t)return null;const s=e?.viewer?.partHistory?.scene;if(!s)return null;const o=s.getObjectByName(t);if(!o)return null;const i=n&&n.lengthSq()>1e-12?n.clone().normalize():new f(0,0,1),a=E(e.viewer,o)||r||new f,c=r||a,l=new I().setFromNormalAndCoplanarPoint(i,c),u=ce(e.viewer,o),p=u?u.clone().normalize():null,d=o?.userData||{},y=String(o?.type||"").toUpperCase(),g=String(d.type||d.brepType||"").toUpperCase(),h=y==="FACE"||y==="PLANE"||!(y==="FACE"||y==="EDGE"||y==="PLANE")&&(g==="FACE"||g==="PLANE");if(y==="EDGE"||!h&&(g==="EDGE"||o?.isLine||o?.isLine2||o?.isLineSegments||o?.isLineLoop)){const w=Fn(o,l,c);if(w)return w}if(h&&p&&p.lengthSq()>1e-12){const w=p.clone().normalize(),S=new f().crossVectors(w,i),T=S.lengthSq();if(T>1e-12){const M=w.dot(a),z=i.dot(c),F=new f().crossVectors(i,S).multiplyScalar(M),R=new f().crossVectors(S,w).multiplyScalar(z),L=F.add(R).divideScalar(T);return{p:l.projectPoint(L,L.clone()),d:S.normalize()}}}let A=a.clone();if(p&&p.lengthSq()>1e-12){const w=p.dot(i);if(Math.abs(w)>1e-9){const T=c.clone().clone().sub(a).dot(i)/w;A=a.clone().addScaledVector(p,T)}}const x=l.projectPoint(A,A.clone());let D=p?p.clone().projectOnPlane(i):null;return(!D||D.lengthSq()<1e-12)&&(D=Ze(i).U.clone()),D.normalize(),{p:x,d:D}}catch{return null}}m(Ae,"lineInPlaneForElement");function Fn(e,t,n){const r=qn(e);if(!Array.isArray(r)||r.length<2)return null;const s=[];for(const u of r)u&&s.push(t.projectPoint(u,u.clone()));if(s.length<2)return null;let o=0,i=1,a=0;for(let u=0;u<s.length;u++)for(let p=u+1;p<s.length;p++){const d=s[u].distanceToSquared(s[p]);d>a&&(a=d,o=u,i=p)}if(a<=1e-12)return null;const c=s[i].clone().sub(s[o]).normalize();let l=s[o].clone();if(n){let u=l.distanceToSquared(n);for(let p=0;p<s.length;p++){const d=s[p].distanceToSquared(n);d<u&&(u=d,l=s[p].clone())}}return{p:l,d:c}}m(Fn,"edgeLineInPlane");function qn(e){if(!e)return null;try{e.updateMatrixWorld?.(!0)}catch{}const t=e.matrixWorld||null,n=[],r=m(c=>{const l=dt(c);if(!l)return;const u=n[n.length-1];u&&u.distanceToSquared(l)<=1e-14||n.push(l)},"pushUnique");try{if(typeof e.points=="function"){const c=e.points(!0);if(Array.isArray(c))for(const l of c)r(l);if(n.length>=2)return n;n.length=0}}catch{}const s=Array.isArray(e?.userData?.polylineLocal)?e.userData.polylineLocal:null;if(s){for(const c of s){const l=dt(c);l&&(t&&l.applyMatrix4(t),r(l))}if(n.length>=2)return n;n.length=0}const o=e?.geometry?.attributes?.instanceStart,i=e?.geometry?.attributes?.instanceEnd;if(o&&i){const c=Math.min(o.count||0,i.count||0);for(let l=0;l<c;l++){const u=new f(o.getX(l),o.getY(l),o.getZ(l)),p=new f(i.getX(l),i.getY(l),i.getZ(l));t&&(u.applyMatrix4(t),p.applyMatrix4(t)),r(u),r(p)}if(n.length>=2)return n;n.length=0}const a=e?.geometry?.getAttribute?.("position");if(a&&a.itemSize===3&&a.count>=2){for(let c=0;c<a.count;c++){const l=new f(a.getX(c),a.getY(c),a.getZ(c));t&&l.applyMatrix4(t),r(l)}if(n.length>=2)return n}return null}m(qn,"getEdgeWorldPoints");function dt(e){if(!e)return null;if(e instanceof f)return e.clone();if(Array.isArray(e)&&e.length>=3)return new f(e[0]||0,e[1]||0,e[2]||0);if(typeof e=="object"){const t=Number(e.x),n=Number(e.y),r=Number(e.z);if(Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r))return new f(t,n,r)}return null}m(dt,"pointFromAny");const Ln={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the leader"},target:{type:"reference_selection",selectionFilter:["VERTEX"],multiple:!0,default_value:"",label:"Target Point",hint:"Select target point"},text:{type:"textarea",default_value:"TEXT HERE",defaultResolver:m(({pmimode:e})=>{const t=e?._opts?.leaderText;return typeof t=="string"&&t.length?t:void 0},"defaultResolver"),label:"Text",hint:"Leader text content",rows:3},anchorPosition:{type:"options",default_value:"Right Middle",options:["Left Top","Left Middle","Left Bottom","Right Top","Right Middle","Right Bottom"],label:"Anchor Position",hint:"Preferred label alignment relative to anchor"},endStyle:{type:"options",default_value:"arrow",options:["arrow","dot"],label:"Leader End",hint:"Choose arrowhead or dot for end marker"}},H=class H extends v{static showContexButton(t){const n=v._collectSelectionRefs(t,["VERTEX"]);return n.length?{params:{target:n}}:!1}constructor(t={}){super(t)}async run(t){this.renderingContext=t;const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams||{},a=Ye();mt(i),i.anchorPosition=yt(i.anchorPosition??i.anchorSide),delete i.anchorSide;const c=n?.viewer,l=c?.partHistory?.scene,u=ht(c,l,i),p=gt(n,i,u,o),d=o?.formatReferenceLabel?o.formatReferenceLabel(i,Fe(i.text)):Fe(i.text);if(i.value=d,p&&o?.updateLabel?.(s,d,p,i),!u.length||!p)return[];const y=a.lineColor??9684477,g=$e(n,c),b=Ue(u)||p,h=Wn(p,b,g),N=Math.max(o?.screenSizeWorld?o.screenSizeWorld(18):q(c,18),1e-4),A=Math.max(o?.screenSizeWorld?o.screenSizeWorld(36):q(c,36),1e-4),x=Vn(u,g,p),D=(x.length-1)*.5;return x.forEach(({point:w,order:S})=>{const T=(S-D)*N,M=p.clone().addScaledVector(h,-A).addScaledVector(g.up,T);if(r.add(Y(w,M,y)),r.add(Y(M,p,y)),i.endStyle==="dot"){const z=a.leaderDotRadiusPx??6,F=o?.screenSizeWorld?o.screenSizeWorld(z):q(c,z),R=Re(Math.max(F,1e-4),a.dotColor??y);R.position.copy(w),r.add(R)}else{const z=w.clone().sub(M);z.lengthSq()||z.copy(h),z.normalize();const F=a.arrowLengthPx??12,R=a.arrowWidthPx??4,L=o?.screenSizeWorld?o.screenSizeWorld(F):q(c,F),Z=o?.screenSizeWorld?o.screenSizeWorld(R):q(c,R);te(r,w,z,L,Z,a.arrowColor??y)}}),[]}static applyParams(t,n,r){return super.applyParams(t,n,r),n.text=Fe(n.text),Array.isArray(n.target)||(n.target=n.target?[String(n.target)]:[]),n.anchorPosition=yt(n.anchorPosition??n.anchorSide),delete n.anchorSide,n.endStyle=Rn(n.endStyle),{paramsPatch:{}}}static onLabelPointerDown(t,n,r,s,o){try{const i=t?.viewer,a=ht(i,i?.partHistory?.scene,r),c=gt(t,r,a,o)||new f,u=$e(t,i,r).forward,p=a&&a.length&&a[0]?a[0]:Ue(a)||c;if(!o?.raycastFromEvent)return;const d=new I().setFromNormalAndCoplanarPoint(u,p);H.dragLabelOnPlane(t,o,{makePlane:m(()=>d,"makePlane"),onDrag:m(y=>{mt(r),r.persistentData.labelWorld=[y.x,y.y,y.z],o.updateLabel(n,null,y,r),t?.refreshAnnotationsUI?.()},"onDrag"),onEnd:m(()=>{try{t?.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}},"onEnd")})}catch{}}};m(H,"LeaderAnnotation"),P(H,"entityType","leader"),P(H,"type","leader"),P(H,"shortName","LEAD"),P(H,"longName","Leader"),P(H,"title","Leader"),P(H,"inputParamsSchema",Ln);let Ie=H;function mt(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(mt,"ensurePersistentData$1");function Fe(e){return typeof e=="string"?e:e==null?"":String(e)}m(Fe,"sanitizeText$1");function yt(e){const t=new Set(["Left Top","Left Middle","Left Bottom","Right Top","Right Middle","Right Bottom"]);if(typeof e=="string"){const n=e.trim();if(t.has(n))return n;const r=n.toLowerCase();if(r==="left")return"Left Middle";if(r==="right")return"Right Middle";if(r==="left-top"||r==="lefttop")return"Left Top";if(r==="left-bottom"||r==="leftbottom")return"Left Bottom";if(r==="right-top"||r==="righttop")return"Right Top";if(r==="right-bottom"||r==="rightbottom")return"Right Bottom"}if(e&&typeof e=="object"){const n=String(e.label||e.value||e.name||"").trim();if(t.has(n))return n}return"Right Middle"}m(yt,"normalizeAnchorPosition$1");function Rn(e){return e==="dot"?"dot":"arrow"}m(Rn,"normalizeEndStyle");function ht(e,t,n){const r=Array.isArray(n?.target)?n.target:[];if(!r.length||!t)return[];const s=[],o=new Set;for(const i of r){const a=typeof i=="string"?i:String(i??"");if(!(!a||o.has(a))){o.add(a);try{const c=t.getObjectByName?.(a);if(!c)continue;let l=E(e,c);!l&&typeof c.getWorldPosition=="function"&&(l=c.getWorldPosition(new f)),l&&s.push(l.clone())}catch{}}}return s}m(ht,"resolveTargetPoints");function gt(e,t,n,r){const s=e?.viewer,o=$e(e,s),i=n&&n.length&&n[0]?n[0].clone():Ue(n)||new f,a=o?.forward&&o.forward.lengthSq()?o.forward.clone():new f(0,0,1),c=new I().setFromNormalAndCoplanarPoint(a,i),l=Bn(t?.persistentData?.labelWorld);if(l){const b=l.clone();return c.projectPoint(b,b),b}const u=Math.max(r?.screenSizeWorld?r.screenSizeWorld(90):q(s,90),1e-4),p=Math.max(r?.screenSizeWorld?r.screenSizeWorld(36):q(s,36),1e-4),d=o?.right&&o.right.lengthSq()?o.right.clone():new f(1,0,0),y=o?.up&&o.up.lengthSq()?o.up.clone():new f(0,1,0),g=i.clone().addScaledVector(d,u).addScaledVector(y,p);return c.projectPoint(g,g),g}m(gt,"resolveLabelPosition");function $e(e,t,n){const r=On(e?.viewEntry?.camera);if(r)return r;const s=new f(0,0,-1),o=new f(0,1,0);try{t?.camera?.getWorldDirection&&(t.camera.getWorldDirection(s),s.normalize()),t?.camera?.up&&o.copy(t.camera.up).normalize()}catch{}s.lengthSq()||s.set(0,0,-1),o.lengthSq()||o.set(0,1,0);const i=new f().crossVectors(s,o);i.lengthSq()||(Math.abs(s.z)<.9?o.set(0,0,1):o.set(1,0,0),i.crossVectors(s,o)),i.normalize();const a=new f().crossVectors(i,s);a.lengthSq()||a.copy(o.lengthSq()?o:new f(0,1,0)),a.normalize();const c=s.clone().normalize();return{right:i,up:a,forward:c}}m($e,"computeViewBasis$1");function Wn(e,t,n){try{const s=e.clone().sub(t||new f);if(s.lengthSq()>1e-10)return s.normalize()}catch{}const r=n?.right?.clone?.()||new f(1,0,0);return r.lengthSq()||r.set(1,0,0),r.normalize()}m(Wn,"computeShoulderDirection");function Vn(e,t,n){if(!e.length)return[];const r=t?.up&&t.up.lengthSq()?t.up:new f(0,1,0),s=e.map((o,i)=>{const c=o.clone().sub(n||new f).dot(r);return{point:o,metric:c,index:i}});return s.sort((o,i)=>o.metric-i.metric),s.map((o,i)=>({point:o.point,order:i}))}m(Vn,"sortTargetsByViewUp");function On(e){if(!e||typeof e!="object")return null;const t=_n(e);if(!t)return null;const n=new f(0,0,-1).applyQuaternion(t);if(!n.lengthSq())return null;const r=new f(0,1,0).applyQuaternion(t);let s=new f().crossVectors(n,r);s.lengthSq()||(s=new f().crossVectors(n,new f(0,1,0))),s.lengthSq()||s.set(1,0,0),s.normalize();const o=new f().crossVectors(s,n);o.lengthSq()||o.copy(r.lengthSq()?r:new f(0,1,0)),o.normalize();const i=n.clone().normalize();return{right:s,up:o,forward:i}}m(On,"basisFromSavedCamera");function _n(e){const t=e?.quaternion||e?.camera?.quaternion;if(Array.isArray(t)&&t.length>=4){const[s,o,i,a]=t;if([s,o,i,a].every(c=>Number.isFinite(c)))return new V(s,o,i,a).normalize()}if(t&&typeof t=="object"){const s=Number(t.x),o=Number(t.y),i=Number(t.z),a=Number(t.w);if([s,o,i,a].every(c=>Number.isFinite(c)))return new V(s,o,i,a).normalize()}const n=e?.worldMatrix||e?.cameraMatrix||e?.matrix,r=Array.isArray(n?.elements)?n.elements:n;if(Array.isArray(r)&&r.length===16){const s=new de().fromArray(r),o=new f,i=new V,a=new f;return s.decompose(o,i,a),i.normalize()}return null}m(_n,"quaternionFromSnapshot");function Bn(e){if(!e&&e!==0)return null;if(e instanceof f)return e.clone();if(Array.isArray(e)&&e.length>=3){const[t,n,r]=e;return[t,n,r].some(s=>typeof s!="number"||!Number.isFinite(s))?null:new f(t,n,r)}if(typeof e=="object"){const t=Number(e.x),n=Number(e.y),r=Number(e.z);if([t,n,r].every(s=>Number.isFinite(s)))return new f(t,n,r)}return null}m(Bn,"vectorFromAny");function Ue(e){if(!e||!e.length)return null;const t=new f;return e.forEach(n=>t.add(n)),t.multiplyScalar(1/e.length)}m(Ue,"averageTargets");const Cn={id:{type:"string",default_value:null,hint:"unique identifier for the note"},text:{type:"string",default_value:"",defaultResolver:m(({pmimode:e})=>{const t=e?._opts?.noteText;return typeof t=="string"?t:void 0},"defaultResolver"),hint:"Note text content"},position:{type:"object",default_value:null,hint:"3D position of the note marker"}},k=class k extends v{static showContexButton(t){const n=v._normalizeSelectionItems(t);if(!n.length)return!1;const r=n[0],s=E(null,r);return s?{params:{position:{x:s.x,y:s.y,z:s.z}}}:!1}constructor(t={}){super(t)}async run(t){const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams,a=Ye(),c=new f(i.position?.x||0,i.position?.y||0,i.position?.z||0),l=new Ht(a.noteDotRadius??.08,16,12),u=new kt({color:a.noteDotColor??a.dotColor??9684477,depthTest:!1,depthWrite:!1,transparent:!0}),p=new Gt(l,u);p.position.copy(c),r.add(p);const d=String(i.text||"");if(!d)return[];let y=null;if(i.labelWorld)y=new f(i.labelWorld.x,i.labelWorld.y,i.labelWorld.z);else{const g=o.alignNormal("view",i),b=new f,h=new f(0,1,0);try{n.viewer?.camera?.getWorldDirection?.(b),b.crossVectors(g,h).normalize()}catch{b.set(1,0,0)}const N=o.screenSizeWorld(16);y=c.clone().addScaledVector(b,N).addScaledVector(g,N*.25)}return o.updateLabel(s,d,y,i),[]}static getSchema(t,n){const r={text:{type:"string",label:"Text",default_value:n.text||""}},s={text:r.text.default_value};return{schema:r,params:s}}static applyParams(t,n,r){return super.applyParams(t,n,r),n.text=jn(n.text),{paramsPatch:{}}}static onLabelPointerDown(t,n,r,s,o){try{if(!t.viewer?.camera)return;const c=o.alignNormal?o.alignNormal(r.alignment||"view",r):new f(0,0,1),l=r.labelWorld?new f(r.labelWorld.x,r.labelWorld.y,r.labelWorld.z):new f(r.position?.x||0,r.position?.y||0,r.position?.z||0),u=new I().setFromNormalAndCoplanarPoint(c,l);k.dragLabelOnPlane(t,o,{makePlane:m(()=>u,"makePlane"),onDrag:m(p=>{r.labelWorld={x:p.x,y:p.y,z:p.z};try{o.updateLabel(n,null,p,r)}catch{}},"onDrag"),onEnd:m(()=>{try{t?.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}},"onEnd")})}catch{}}};m(k,"NoteAnnotation"),P(k,"entityType","note"),P(k,"type","note"),P(k,"shortName","NOTE"),P(k,"longName","Note"),P(k,"title","Note"),P(k,"inputParamsSchema",Cn);let Xe=k;function jn(e){return typeof e=="string"?e:e==null?"":String(e)}m(jn,"sanitizeText");const In={id:{type:"string",default_value:null,hint:"unique identifier for the view transform"},targets:{type:"reference_selection",multiple:!0,default_value:[],label:"Target Objects",selectionFilter:["SOLID","COMPONENT"],hint:"Choose the solids or components to reposition in this view"},transform:{type:"transform",label:"Transform",hint:"Translation and rotation applied relative to the reference point"},showTraceLine:{type:"boolean",default_value:!0,label:"Show trace lines",hint:"Draw a line from the original position to the transformed position"}},W=class W extends v{static showContexButton(t){const n=v._collectSelectionRefs(t,["SOLID","COMPONENT"]);return n.length?{params:{targets:n}}:!1}constructor(t={}){super(t)}async run(t){const{pmimode:n,group:r}=t;if(!n||!r)return[];const s=this.inputParams||{};wt(s),s.transform=qe(s.transform);const o=W._resolveSolidReferences(s,n,!0);if(!o.length)return[];const i=W._ensureOriginalSnapshots(s,o,!1,n?.viewer),a=s.showTraceLine!==!1;let c=n?.__explodeTraceState;c instanceof Map||(c=new Map,n&&(n.__explodeTraceState=c));const l=O(s.transform.position,new f(0,0,0)),u=Pt(s.transform.rotationEuler),p=O(s.transform.scale,new f(1,1,1));return o.forEach(d=>{try{const y=i.get(d.uuid),g=O(y?.centerLocal)||Wt(d),b=c?.get(d.uuid)?.clone()||kn(y),h=At(b,g)||O(y?.centerWorld)||O(y?.worldPosition),N=Gn(b,l,u,p),A=At(N,g)||Hn(d);Nt(h)&&Nt(A)&&h.distanceToSquared(A)>=1e-8&&a&&r.add(Yt(h,A,16098596,{viewer:n?.viewer})),c?.set(d.uuid,N)}catch{}}),[]}static _resolveSolidReferences(t,n,r=!1){if(!t||!n)return[];const s=n.viewer,o=s?.partHistory?.scene||s?.scene;if(!o)return[];if(!r&&Array.isArray(t.__resolvedSolids)&&t.__resolvedSolids.length){const c=t.__resolvedSolids.filter(l=>l&&l.isObject3D);return ie(t,"__resolvedSolids",c),ie(t,"solids",c),c}const i=Array.isArray(t.targets)?t.targets:[],a=[];return i.forEach(c=>{const l=Un(c,o);l&&l.isObject3D&&a.push(l)}),ie(t,"__resolvedSolids",a),ie(t,"solids",a),a}static _ensureOriginalSnapshots(t,n,r=!1,s=null){wt(t);let o=t.__originalSnapshots;return o instanceof Map||(o=xt(t.persistentData?.originalTransforms)),o instanceof Map||(o=new Map),(Array.isArray(n)?n:[]).forEach(a=>{!a||!a.uuid||(r||!o.has(a.uuid))&&o.set(a.uuid,St(a,s))}),ie(t,"__originalSnapshots",o),t.persistentData.originalTransforms=Xn(o),o}static getOriginalSnapshotMap(t){if(!t)return new Map;if(t.__originalSnapshots instanceof Map)return t.__originalSnapshots;const n=xt(t?.persistentData?.originalTransforms);return ie(t,"__originalSnapshots",n instanceof Map?n:new Map),t.__originalSnapshots}static applyTransformsToSolids(t,n,r={}){if(!t||!n)return;const s=W._resolveSolidReferences(t,n,!0);if(!s.length)return;const o=r&&r.startSnapshots instanceof Map?r.startSnapshots:W.getOriginalSnapshotMap(t),i=r?.cumulativeState instanceof Map?r.cumulativeState:null,a=qe(t.transform);t.transform=a;const c=O(a.position,new f(0,0,0)),l=Pt(a.rotationEuler),u=O(a.scale,new f(1,1,1));s.forEach(p=>{if(!p||!p.uuid)return;const d=o.get(p.uuid)||W.getOriginalSnapshotMap(t).get(p.uuid)||St(p,n?.viewer);if(!d)return;const y=O(d.position,new f(0,0,0)),g=ke(d.quaternion,new V),b=O(d.scale,new f(1,1,1)),h=y.clone().add(c),N=g.clone().multiply(l),A=b.clone().multiply(u);if(p.position.copy(h),p.quaternion.copy(N),p.scale.copy(A),p.updateMatrixWorld(!0),i){const x=p.getWorldPosition(new f);i.set(p.uuid,{position:h.toArray(),quaternion:N.toArray(),scale:A.toArray(),worldPosition:x.toArray()})}})}static restoreOriginalTransforms(t,n){if(!t||!n)return;const r=W._resolveSolidReferences(t,n,!0);if(!r.length)return;const s=W.getOriginalSnapshotMap(t);r.forEach(o=>{if(!o||!o.uuid)return;const i=s.get(o.uuid);if(!i)return;const a=O(i.position,new f(0,0,0)),c=ke(i.quaternion,new V),l=O(i.scale,new f(1,1,1));o.position.copy(a),o.quaternion.copy(c),o.scale.copy(l),o.updateMatrixWorld(!0)})}static applyParams(t,n,r){super.applyParams(t,n,r),n.targets=$n(n.targets),n.transform=qe(n.transform),n.showTraceLine=n.showTraceLine!==!1;try{t&&typeof t.applyViewTransformsSequential=="function"&&t.applyViewTransformsSequential()}catch{}return{paramsPatch:{}}}};m(W,"ExplodeBodyAnnotation"),P(W,"entityType","exp"),P(W,"type","exp"),P(W,"shortName","EXP"),P(W,"longName","Explode Body"),P(W,"title","Explode Body"),P(W,"inputParamsSchema",In),P(W,"aliases",["viewTransform"]);let He=W;function wt(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(wt,"ensurePersistent");function ie(e,t,n){if(!(!e||typeof e!="object"))try{Object.defineProperty(e,t,{value:n,configurable:!0,enumerable:!1,writable:!0})}catch{e[t]=n}}m(ie,"setHiddenProperty");function qe(e){const t=e&&typeof e=="object"?e:{},n=m((r,s)=>{if(!Array.isArray(r))return s.slice();const o=s.slice();for(let i=0;i<o.length;i+=1){const a=Number(r[i]);o[i]=Number.isFinite(a)?a:o[i]}return o},"sanitizeArray");return{position:n(t.position,[0,0,0]),rotationEuler:n(t.rotationEuler,[0,0,0]),scale:n(t.scale,[1,1,1])}}m(qe,"sanitizeTransform");function $n(e){return Array.isArray(e)?e.map(t=>t==null?"":String(t).trim()).filter(t=>t.length):[]}m($n,"arrayOfStrings");function Un(e,t){if(!t||!e&&e!==0)return null;let n=null;if(typeof e=="string"&&e.trim().length){const s=e.trim();if(s[0]==="{")try{n=JSON.parse(s)}catch{n={name:s}}else n={name:s}}else typeof e=="object"&&(n={...e});if(!n)return null;const r=[];n.name&&typeof n.name=="string"&&r.push(n.name.trim()),Array.isArray(n.path)&&n.path.length&&r.push(String(n.path[n.path.length-1]));for(const s of r){if(!s)continue;const o=t.getObjectByName(s);if(o&&o.type==="SOLID"||o)return o}if(typeof n.uuid=="string"){const s=t.getObjectByProperty("uuid",n.uuid);if(s)return s;const o=bt(t,i=>i?.userData?.__pmiExportSourceUuid===n.uuid);if(o)return o}if(Number.isInteger(n.id)){try{const o=t.getObjectById(n.id);if(o)return o}catch{}const s=bt(t,o=>o?.userData?.__pmiExportSourceId===n.id);if(s)return s}return null}m(Un,"resolveSolidObject");function bt(e,t){if(!e?.traverse||typeof t!="function")return null;let n=null;return e.traverse(r=>{if(!(n||!r?.isObject3D))try{t(r)&&(n=r)}catch{}}),n}m(bt,"findExportCloneMatch");function St(e,t=null){try{e.updateMatrixWorld(!0)}catch{}const n=e.position.clone(),r=e.quaternion.clone(),s=e.scale.clone(),o=e.getWorldPosition(new f),i=Wt(e),a=i.clone().applyMatrix4(new de().compose(n.clone(),r.clone(),s.clone()));return{position:n.toArray(),quaternion:r.toArray(),scale:s.toArray(),worldPosition:o.toArray(),centerWorld:a.toArray(),centerLocal:i.toArray()}}m(St,"captureSnapshot");function xt(e){if(!Array.isArray(e))return new Map;const t=new Map;return e.forEach(n=>{!n||typeof n!="object"||!n.uuid||t.set(n.uuid,{position:j(n.position,[0,0,0]),quaternion:j(n.quaternion,[0,0,0,1]),scale:j(n.scale,[1,1,1]),worldPosition:j(n.worldPosition,null),centerWorld:j(n.centerWorld,null),centerLocal:j(n.centerLocal,null)})}),t}m(xt,"snapshotArrayToMap");function Xn(e){if(!(e instanceof Map))return[];const t=[];return e.forEach((n,r)=>{r&&t.push({uuid:r,position:j(n.position,[0,0,0]),quaternion:j(n.quaternion,[0,0,0,1]),scale:j(n.scale,[1,1,1]),worldPosition:j(n.worldPosition,null),centerWorld:j(n.centerWorld,null),centerLocal:j(n.centerLocal,null)})}),t}m(Xn,"snapshotMapToArray");function j(e,t){if(Array.isArray(e))return e.slice();if(e&&typeof e=="object"&&typeof e.length=="number"){const n=[];for(let r=0;r<e.length;r+=1)n.push(Number(e[r]));return n}return e&&typeof e.x=="number"&&typeof e.y=="number"&&typeof e.z=="number"?typeof e.w=="number"?[e.x,e.y,e.z,e.w]:[e.x,e.y,e.z]:t&&t.slice()}m(j,"toArray");function O(e,t){if(e instanceof f)return e.clone();if(Array.isArray(e)&&e.length>=3){const n=Number(e[0]),r=Number(e[1]),s=Number(e[2]);if([n,r,s].every(o=>Number.isFinite(o)))return new f(n,r,s)}return e&&typeof e=="object"&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z)?new f(e.x,e.y,e.z):t&&t.isVector3?t.clone():new f}m(O,"vectorFromArray");function ke(e,t){if(Array.isArray(e)&&e.length>=4){const n=Number(e[0]),r=Number(e[1]),s=Number(e[2]),o=Number(e[3]);if([n,r,s,o].every(i=>Number.isFinite(i)))return new V(n,r,s,o)}return e&&typeof e=="object"&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z)&&Number.isFinite(e.w)?new V(e.x,e.y,e.z,e.w):t&&t.isQuaternion?t.clone():new V}m(ke,"quaternionFromArray");function Pt(e){const t=Array.isArray(e)?e:[0,0,0],n=Number(t[0])||0,r=Number(t[1])||0,s=Number(t[2])||0;try{return new V().setFromEuler(new Qt(Se.degToRad(n),Se.degToRad(r),Se.degToRad(s),"XYZ"))}catch{return new V}}m(Pt,"quaternionFromEuler");function Wt(e){try{if(!e)return new f;e.updateMatrixWorld?.(!0);const t=new Tt().setFromObject(e);if(!t.isEmpty()){const r=t.getCenter(new f).clone();return e.worldToLocal(r),r}}catch{}return new f}m(Wt,"getSolidLocalCenter");function Hn(e){try{if(!e)return new f;e.updateMatrixWorld?.(!0);const t=new Tt().setFromObject(e);if(!t.isEmpty())return t.getCenter(new f)}catch{}try{return e.getWorldPosition(new f)}catch{return new f}}m(Hn,"getSolidWorldCenter");function Nt(e){return!e||!e.isVector3?!1:Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z)}m(Nt,"isFiniteVec3");function kn(e){if(!e||typeof e!="object")return pe(new f,new V,new f(1,1,1));const t=O(e.position,new f),n=ke(e.quaternion,new V),r=O(e.scale,new f(1,1,1));return pe(t,n,r)}m(kn,"transformEntryFromSnapshot");function Gn(e,t,n,r){const s=e||pe(new f,new V,new f(1,1,1)),o=s.position.clone().add(t||new f),i=s.quaternion.clone().multiply(n||new V),a=s.scale.clone().multiply(r||new f(1,1,1));return pe(o,i,a)}m(Gn,"composeTransformEntry");function At(e,t){if(!e||!t||!t.isVector3)return null;const n=new de().compose(e.position.clone(),e.quaternion.clone(),e.scale.clone());return t.clone().applyMatrix4(n)}m(At,"applyTransformEntryToPoint");function pe(e,t,n){return{position:e.clone(),quaternion:t.clone(),scale:n.clone(),clone(){return pe(this.position,this.quaternion,this.scale)}}}m(pe,"makeTransformEntry");const Qn={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the hole callout"},target:{type:"reference_selection",selectionFilter:["VERTEX","EDGE","FACE"],multiple:!1,default_value:"",label:"Target",hint:"Pick the hole edge/vertex/face to call out"},quantity:{type:"number",default_value:0,label:"Quantity",hint:"Number of identical holes this callout represents (0 = auto from feature)",min:0},showQuantity:{type:"boolean",default_value:!0,label:"Show Quantity",hint:"Include the hole count in the callout label"},beforeText:{type:"string",default_value:"",label:"Text Before",hint:"Optional text to show before the callout"},afterText:{type:"string",default_value:"",label:"Text After",hint:"Optional text to show after the callout"},anchorPosition:{type:"options",default_value:"Right Top",options:["Left Top","Left Middle","Left Bottom","Right Top","Right Middle","Right Bottom"],label:"Anchor Position",hint:"Preferred label alignment relative to anchor"}},G=class G extends v{static showContexButton(t){const n=v._normalizeSelectionItems(t),r=new Set(["VERTEX","EDGE","FACE"]);for(const s of n){if(!v._isSelectionType(s,r)||!Kn(s))continue;const o=v._selectionRefName(s);if(o)return{params:{target:o}}}return!1}constructor(t={}){super(t)}async run(t){this.renderingContext=t;const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams||{},a=n?.viewer,c=a?.partHistory?.scene,l=Dt(a,i.target),u=E(c,l),p=Yn(a?.partHistory,l,u,i.target),d=p?.center?xe(p.center):u;if(!d)return[];const y=sr(i,p,a?.partHistory),g=p?Jn(p,y,{showQuantity:i.showQuantity!==!1,beforeText:i.beforeText,afterText:i.afterText}):"";i.value=g;const b=zt(a),h=o?.screenSizeWorld?o.screenSizeWorld(80):q(a,80),N=o?.screenSizeWorld?o.screenSizeWorld(30):q(a,30),x=xe(i?.persistentData?.labelWorld)||d.clone().addScaledVector(b.right,er(i.anchorPosition||"Right Top")*h).addScaledVector(b.up,tr(i.anchorPosition||"Right Top")*N);o?.updateLabel&&o.updateLabel(s,g,x,i);const D=Ye(),w=D.lineColor??16771584;r.add(Y(x,d,w));const S=D.arrowLengthPx??12,T=D.arrowWidthPx??4,M=o?.screenSizeWorld?o.screenSizeWorld(S):q(a,S),z=o?.screenSizeWorld?o.screenSizeWorld(T):q(a,T),F=d.clone().sub(x);return F.lengthSq()>1e-12&&(F.normalize(),te(r,d,F,M,z,D.arrowColor??w)),[]}static applyParams(t,n,r){super.applyParams(t,n,r);const s=Number(n?.quantity);return n.quantity=Number.isFinite(s)?Math.max(0,Math.round(s)):1,n.showQuantity=n.showQuantity!==!1,n.beforeText=De(n.beforeText),n.afterText=De(n.afterText),n.anchorPosition=nr(n.anchorPosition),{paramsPatch:{}}}static onLabelPointerDown(t,n,r,s,o){const i=t?.viewer,a=Dt(i,r.target),c=i?.partHistory?.scene,l=E(c,a)||xe(r?.persistentData?.labelWorld);if(!l)return;const p=zt(i).forward;if(!o?.raycastFromEvent)return;const d=new I().setFromNormalAndCoplanarPoint(p,l);G.dragLabelOnPlane(t,o,{makePlane:m(()=>d,"makePlane"),suspendControls:!0,onDrag:m(y=>{or(r),r.persistentData.labelWorld=[y.x,y.y,y.z],o.updateLabel(n,null,y,r),t?.refreshAnnotationsUI?.()},"onDrag")})}};m(G,"HoleCalloutAnnotation"),P(G,"entityType","holeCallout"),P(G,"type","holeCallout"),P(G,"shortName","HOLE"),P(G,"longName","Hole Callout"),P(G,"title","Hole Callout"),P(G,"inputParamsSchema",Qn);let Ge=G;function Dt(e,t){if(!e||!t)return null;const n=e.partHistory?.scene;if(!n)return null;if(typeof t=="string"){const r=n.getObjectByName?.(t);if(r)return r;const s=Pe(t);for(const i of s){const a=n.getObjectByName?.(i);if(a)return a}let o=null;try{n.traverse(i=>{if(o)return;const a=i?.name?String(i.name):"";if(a){for(const c of s)if(c&&(a===c||a.endsWith(c)||a.includes(c))){o=i;return}}})}catch{}if(o)return o}return typeof t=="object"?t:n.getObjectByName?.(String(t))||null}m(Dt,"resolveTargetObject");function Yn(e,t,n,r=null){const s=Array.isArray(e?.features)?e.features:[],o=[];for(const u of s){const p=Array.isArray(u?.persistentData?.holes)?u.persistentData.holes:[];for(const d of p)o.push(d)}if(!o.length)return null;const i=t?.userData?.hole||t?.userData?.metadata?.hole;if(i)return i;if(t?.parent){const u=t.parent.userData?.hole||t.parent.userData?.metadata?.hole;if(u)return u}const a=t?.uuid||t?.id||t?.name||null,c=Pe(r,a);if(t?.name)for(const u of Pe(t.name))c.add(u);const l=o.filter(u=>{const p=u?.sourceName?String(u.sourceName):null,d=u?.featureId?String(u.featureId):null,y=u?.targetId?String(u.targetId):null;return p&&c.has(p)||d&&c.has(d)||y&&c.has(y)});if(l.length===1)return l[0];if(l.length>1&&n){const u=ee(l,n);if(u)return u}if(a){const u=o.filter(p=>p?.targetId&&String(p.targetId)===String(a));if(u.length===1)return u[0];if(u.length>1&&n){const p=ee(u,n);if(p)return p}}if(r){const u=String(r),p=o.filter(d=>{const y=d?.featureId?String(d.featureId):"",g=d?.sourceName?String(d.sourceName):"";return y&&u.includes(y)||g&&u.includes(g)});if(p.length===1)return p[0];if(p.length>1&&n){const d=ee(p,n);if(d)return d}}if(c.size){const u=o.filter(p=>{const d=p?.featureId?String(p.featureId):"",y=p?.sourceName?String(p.sourceName):"",g=p?.targetId?String(p.targetId):"";return c.has(d)||c.has(y)||c.has(g)});if(u.length===1)return u[0];if(u.length>1&&n){const p=ee(u,n);if(p)return p}}if(n){const u=ee(o,n);if(u)return u}if(t?.parent){const u=Pe(t.parent.name),p=o.filter(d=>{const y=d?.featureId?String(d.featureId):"",g=d?.sourceName?String(d.sourceName):"",b=d?.targetId?String(d.targetId):"";return u.has(y)||u.has(g)||u.has(b)});if(p.length===1)return p[0];if(p.length>1&&n){const d=ee(p,n);if(d)return d}}if(n){const u=ee(o,n);if(u)return u}return o[0]}m(Yn,"findHoleDescriptor");function Zn(e){if(!e)return null;const t=e.userData||null;if(t?.hole)return t.hole;if(t?.metadata?.hole)return t.metadata.hole;if(typeof e.getMetadata=="function")try{const s=e.getMetadata();if(s?.hole)return s.hole;if(s?.metadata?.hole)return s.metadata.hole}catch{}const n=e?.name||t?.faceName||null,r=e?.parentSolid||t?.parentSolid||null;if(n&&r&&typeof r.getFaceMetadata=="function")try{const s=r.getFaceMetadata(n);if(s?.hole)return s.hole}catch{}return null}m(Zn,"readHoleMetadata");function Kn(e){if(!e)return!1;const t=[e],n=new Set,r=m(s=>Object.prototype.hasOwnProperty.call(s,"faces"),"hasOwnFaces");for(;t.length;){const s=t.shift();if(!(!s||n.has(s))){if(n.add(s),Zn(s))return!0;if(r(s)&&Array.isArray(s.faces))for(const o of s.faces)t.push(o);else if(s.type==="SOLID"||s.type==="COMPONENT"){const o=Array.isArray(s.children)?s.children:[];for(const i of o)i&&i.type==="FACE"&&t.push(i)}s.parent&&t.push(s.parent)}}return!1}m(Kn,"hasHoleMetadata");function Jn(e,t=1,n={}){if(!e)return"";const r=[],s=De(n.beforeText);s&&r.push(s);const i=n.showQuantity!==!1&&t>1?`${t}× `:"",a=Number(e.totalDepth??e.straightDepth),c=!e.throughAll&&a>0?` ↧ ${ae(a)}`:e.throughAll?" THRU ALL":"";r.push(`${i}⌀${ae(e.diameter)}${c}`),e.type==="COUNTERSINK"?r.push(`⌵ ⌀${ae(e.countersinkDiameter)} × ${ae(e.countersinkAngle,0)}°`):e.type==="COUNTERBORE"&&r.push(`⌴ ⌀${ae(e.counterboreDiameter)} ↧ ${ae(e.counterboreDepth)}`);const l=rr(e?.thread);l&&r.push(l);const u=De(n.afterText);return u&&r.push(u),r.join(`
1
+ var st=Object.defineProperty;var Ut=(e,t,n)=>t in e?st(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var m=(e,t)=>st(e,"name",{value:t,configurable:!0});var P=(e,t,n)=>Ut(e,typeof t!="symbol"?t+"":t,n);import{L as Xt}from"./ListEntityBase-DIaWtqmZ.js";import{a5 as I,V as f,a as _,M as de,b as Se,Q as V,u as Ht,s as kt,f as Gt,ae as Qt,B as Tt}from"./featureDialogs-CnBa1DyN.js";import{b as q,i as Y,d as te,o as E,m as Re,c as ce,g as Ye,j as Yt}from"./annUtils-B86URBT5.js";const B=class B extends Xt{constructor(t={}){super({history:t.history||null,registry:t.registry||null}),this.resultArtifacts=[]}static _normalizeSelectionItems(t){return Array.isArray(t)?t:[]}static _normalizeSelectionType(t){return String(t||"").toUpperCase()}static _isSelectionType(t,n){return!n||!n.size?!0:n.has(B._normalizeSelectionType(t?.type))}static _selectionRefName(t){return t?.name||t?.userData?.faceName||t?.userData?.edgeName||t?.userData?.vertexName||t?.userData?.solidName||t?.userData?.name||null}static _collectSelectionRefs(t,n=null){const r=B._normalizeSelectionItems(t),s=Array.isArray(n)?new Set(n.map(i=>B._normalizeSelectionType(i))):null,o=[];for(const i of r){if(!B._isSelectionType(i,s))continue;const a=B._selectionRefName(i);a&&o.push(a)}return o}async run(t){return console.warn(`BaseAnnotation.run() not implemented for ${this.constructor.name}`),[]}getScene(){return this.renderingContext?.pmimode?.viewer?.partHistory?.scene||null}getObjectByName(t){const n=this.getScene();return n?n.getObjectByName(t):null}static getSchema(t,n){const r={},s={},o=n||{};for(const i in this.inputParamsSchema){if(!Object.prototype.hasOwnProperty.call(this.inputParamsSchema,i))continue;const a=this.inputParamsSchema[i]||{},c={...a},l=Object.prototype.hasOwnProperty.call(o,i)?U(o[i]):U(a.default_value);c&&Object.prototype.hasOwnProperty.call(c,"default_value")&&(c.default_value=U(l)),r[i]=c,s[i]=l}return{schema:r,params:s}}static applyParams(t,n,r){const s=Zt(this.inputParamsSchema,r,n);return Object.assign(n,s),{paramsPatch:{}}}static ensurePersistentData(t){return!t||typeof t!="object"?null:((!t.persistentData||typeof t.persistentData!="object")&&(t.persistentData={}),t.persistentData)}static dragLabelOnPlane(t,n,r={}){if(!n||typeof r.makePlane!="function")return;const s=r.makePlane();if(!s||!(s instanceof I)&&!s.isPlane)return;const o=r.eventTarget||window,i=t?.viewer,a=m(l=>{const u=n.raycastFromEvent?n.raycastFromEvent(l):null;if(!u)return;const p=new f;(n.intersectPlane?n.intersectPlane(u,s,p):u.intersectPlane(s,p))&&typeof r.onDrag=="function"&&r.onDrag(p,l,s)},"onMove"),c=m(l=>{try{o.removeEventListener("pointermove",a,!0)}catch{}try{o.removeEventListener("pointerup",c,!0)}catch{}if(r.suspendControls===!0)try{i?.controls&&(i.controls.enabled=!0)}catch{}try{t?.hideDragPlaneHelper?.()}catch{}if(typeof r.onEnd=="function")try{r.onEnd(l)}catch{}if(r.preventDefault!==!1)try{l.preventDefault(),l.stopImmediatePropagation?.(),l.stopPropagation()}catch{}},"onUp");try{t?.showDragPlaneHelper?.(s)}catch{}if(r.suspendControls===!0)try{i?.controls&&(i.controls.enabled=!1)}catch{}try{o.addEventListener("pointermove",a,!0)}catch{}try{o.addEventListener("pointerup",c,!0)}catch{}}onIdChanged(){(!this.inputParams||typeof this.inputParams!="object")&&(this.inputParams={}),this.inputParams.id=this.id}onParamsChanged(){(!this.inputParams||typeof this.inputParams!="object")&&(this.inputParams={}),this.inputParams.id||(this.inputParams.id=this.id),this.inputParams.type||(this.inputParams.type=this.type||this.entityType||"annotation")}onPersistentDataChanged(){(!this.persistentData||typeof this.persistentData!="object")&&(this.persistentData={})}};m(B,"BaseAnnotation"),P(B,"entityType","annotation"),P(B,"shortName","ANN"),P(B,"longName","Annotation"),P(B,"inputParamsSchema",{});let v=B;function Zt(e,t,n){const r={},s=t&&typeof t=="object"?t:{};for(const o in e){if(!Object.prototype.hasOwnProperty.call(e,o))continue;const i=e[o]||{};if(i.readOnly){n&&Object.prototype.hasOwnProperty.call(n,o)?r[o]=n[o]:r[o]=U(i.default_value);continue}const a=s[o],c=n&&Object.prototype.hasOwnProperty.call(n,o);if(a===void 0){r[o]=U(c?n[o]:i.default_value);continue}switch(i.type){case"number":{const l=Number(a);r[o]=Number.isFinite(l)?l:c&&Number.isFinite(n[o])?Number(n[o]):Number.isFinite(i.default_value)?i.default_value:0;break}case"boolean":r[o]=a==="false"?!1:!!a;break;case"options":{const l=Array.isArray(i.options)?i.options:[],u=a==null?"":String(a);l.includes(u)?r[o]=u:c&&l.includes(n[o])?r[o]=n[o]:r[o]=l.includes(i.default_value)?i.default_value:l[0]||"";break}case"reference_selection":{if(i.multiple){const l=Array.isArray(a)?a:a?[a]:[];r[o]=l.map(u=>u==null?"":String(u)).filter(u=>u.length),!r[o].length&&c&&Array.isArray(n[o])&&(r[o]=n[o].slice())}else r[o]=a==null?c?String(n[o]??""):"":String(a);break}case"textarea":case"string":r[o]=a==null?c?String(n[o]??""):"":String(a);break;case"object":r[o]=U(a&&typeof a=="object"?a:i.default_value);break;case"transform":r[o]=Kt(a,i.default_value);break;case"vec3":r[o]=Jt(a,i.default_value);break;default:r[o]=U(a);break}}return r}m(Zt,"sanitizeAnnotationParams");function Kt(e,t){const n=e&&typeof e=="object"?e:t||{},r=m((s,o,i=3)=>{const a=Array.isArray(s)?s:o&&Array.isArray(o)?o:[],c=[];for(let l=0;l<i;l+=1){const u=a[l],p=Number(u);c[l]=Number.isFinite(p)?p:0}return c},"toArray");return{position:r(n.position,t?.position||[0,0,0]),rotationEuler:r(n.rotationEuler,t?.rotationEuler||[0,0,0]),scale:r(n.scale,t?.scale||[1,1,1])}}m(Kt,"normalizeTransform");function Jt(e,t){const n=Array.isArray(e)?e:e&&typeof e=="object"?[e.x,e.y,e.z]:t;if(!Array.isArray(n))return[0,0,0];const r=[];for(let s=0;s<3;s+=1){const o=Number(n[s]);r[s]=Number.isFinite(o)?o:0}return r}m(Jt,"normalizeVec3");function U(e){if(e==null)return e;if(Array.isArray(e))return e.map(t=>U(t));if(typeof e=="object"){const t={};for(const n of Object.keys(e))t[n]=U(e[n]);return t}return e}m(U,"__cloneValue");function C(e,t,n,r=.01){const s=[];typeof t=="function"&&s.push(t),typeof n=="function"&&s.push(n);for(const o of s)try{const i=Number(o(e));if(Number.isFinite(i)&&i>0)return i}catch{}return r}m(C,"resolveScreenSizeWorld");function en(e){if(!e||e.lengthSq()===0)return new f(0,0,1);const t=Math.abs(e.dot(new f(0,0,1)))<.9?new f(0,0,1):new f(0,1,0),n=new f().crossVectors(e,t);return n.lengthSq()===0&&n.crossVectors(e,new f(1,0,0)),n.lengthSq()===0?new f(1,0,0):n.normalize()}m(en,"arbitraryPerpendicular3D");function le(e){if(!e)return null;if(e instanceof f)return e.clone();if(Array.isArray(e)&&e.length>=3)return new f(Number(e[0])||0,Number(e[1])||0,Number(e[2])||0);if(typeof e=="object"){const t=Number(e.x),n=Number(e.y),r=Number(e.z);if(Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r))return new f(t,n,r)}return null}m(le,"vectorFromAny$2");function tn(e){return e>1?1:e<-1?-1:e}m(tn,"clampToUnit");function nn(e,t){const n=e.x*t.y-e.y*t.x,r=e.x*t.x+e.y*t.y;return Math.atan2(n,r)}m(nn,"signedAngle2D");function rn(e,t){const n=Math.cos(t),r=Math.sin(t);return new _(e.x*n-e.y*r,e.x*r+e.y*n)}m(rn,"rotate2D");function Ze(e,t){const n=e.clone().normalize();let r=(t?t.clone():new f(1,0,0)).projectOnPlane(n);r.lengthSq()<1e-12&&(r=Math.abs(n.z)<.9?new f(0,0,1).cross(n):new f(0,1,0).cross(n)),r.normalize();const s=new f().crossVectors(n,r).normalize();return{U:r,V:s,N:n}}m(Ze,"planeBasis");function We(e,t,n){const r=e.clone().sub(t);return new _(r.dot(n.U),r.dot(n.V))}m(We,"to2D");function Ne(e,t){return new _(e.dot(t.U),e.dot(t.V))}m(Ne,"dirTo2D");function J(e,t,n){return t.clone().add(n.U.clone().multiplyScalar(e.x)).add(n.V.clone().multiplyScalar(e.y))}m(J,"from2D");function on(e,t,n,r){const s=t.x*r.y-t.y*r.x;if(Math.abs(s)<1e-12)return null;const o=new _().subVectors(n,e),i=(o.x*r.y-o.y*r.x)/s;return new _(e.x+t.x*i,e.y+t.y*i)}m(on,"intersectLines2D");function sn(e,t,n){const r=e.clone().sub(t).dot(n);return e.clone().sub(n.clone().multiplyScalar(r))}m(sn,"projectPointToPlane");function ge(e,t,n,r){const s=n?e.clone().multiplyScalar(-1):e.clone(),o=r?t.clone().multiplyScalar(-1):t.clone(),i=tn(s.dot(o)),a=Math.acos(i),c=nn(s,o);return{A:s,B:o,angle:a,signedAngle:c}}m(ge,"createAngleCombo");function Mt(e,t,n,r=!0){if(!e||!t)return null;const s=[ge(e,t,!1,!1),ge(e,t,!1,!0),ge(e,t,!0,!1),ge(e,t,!0,!0)],o=Math.PI/2,i=1e-6,a=m((c,l)=>c.length?c.slice().sort(l)[0]:null,"selectByAngle");if(n==="reflex"){const c=s[0],l=Math.abs(c.signedAngle),u=l<1e-6?0:2*Math.PI-l,p=-Math.sign(c.signedAngle||1),d=c.A.clone().add(c.B);return d.lengthSq()<1e-10&&d.set(-c.A.y,c.A.x),d.normalize().multiplyScalar(-1),{start:c.A.clone(),end:c.B.clone(),sweep:u,dirSign:p,angleRad:u,bisector:d,angleType:"reflex",signedAngle:c.signedAngle}}if(n==="acute"){if(!r){const d=s[0],y=d.A.clone().add(d.B);y.lengthSq()<1e-10&&y.set(-d.A.y,d.A.x),y.normalize();const g=Math.abs(d.signedAngle)<1e-8?1:Math.sign(d.signedAngle),b=Math.abs(d.signedAngle);return{start:d.A.clone(),end:d.B.clone(),sweep:b,dirSign:g,angleRad:b,bisector:y,angleType:"acute",signedAngle:d.signedAngle}}const c=s.filter(d=>d.angle<=o+i),l=a(c.length?c:s,(d,y)=>d.angle-y.angle);if(!l)return null;const u=l.A.clone().add(l.B);u.lengthSq()<1e-10&&u.set(-l.A.y,l.A.x),u.normalize();const p=Math.abs(l.signedAngle)<1e-8?1:Math.sign(l.signedAngle);return{start:l.A.clone(),end:l.B.clone(),sweep:l.angle,dirSign:p,angleRad:l.angle,bisector:u,angleType:"acute",signedAngle:l.signedAngle}}if(n==="obtuse"){const c=s.filter(d=>d.angle>=o-i);let l=a(c,(d,y)=>d.angle-y.angle);if(l||(l=a(s,(d,y)=>y.angle-d.angle)),!l)return null;const u=l.A.clone().add(l.B);u.lengthSq()<1e-10&&u.set(-l.A.y,l.A.x),u.normalize();const p=Math.abs(l.signedAngle)<1e-8?1:Math.sign(l.signedAngle);return{start:l.A.clone(),end:l.B.clone(),sweep:l.angle,dirSign:p,angleRad:l.angle,bisector:u,angleType:"obtuse",signedAngle:l.signedAngle}}return null}m(Mt,"resolveAngleOrientation2D");function an({planePoint:e=null,planeNormal:t=null,basis:n=null,vertex2D:r=null,directionA2D:s=null,directionB2D:o=null,sweepRad:i=0,sweepDirection:a=1,bisector2D:c=null,labelWorld:l=null,screenSizeWorld:u=null,fallbackScreenSizeWorld:p=null,defaultRadiusPixels:d=60,minRadiusPixels:y=30,arcDensity:g=64,minArcSteps:b=48,extensionPixels:h=25,stubPixels:N=12,labelOffsetPixels:A=70,arrowLengthPixels:x=10,arrowWidthPixels:D=4}={}){if(!e||!t||!n||!r||!s||!o)return null;const w=r.clone(),S=s.clone(),T=o.clone();if(S.lengthSq()<=1e-12||T.lengthSq()<=1e-12)return null;S.normalize(),T.normalize();const M=t.clone().normalize();let z=null;const F=le(l);if(F){const se=sn(F,e,M);z=We(se,e,n).clone().sub(w).length()}(!Number.isFinite(z)||z<=0)&&(z=C(d,u,p,.02));const R=C(y,u,p,.01);z=Math.max(z,R);const L=[],Z=Math.max(0,Number(i)||0),tt=Number(a)||1;if(Z>1e-6){const se=Math.max(b,Math.floor(Z*g));for(let K=0;K<=se;K+=1){const ze=K/se,Te=tt*Z*ze,ot=rn(S,Te),$t=new _(w.x+ot.x*z,w.y+ot.y*z);L.push(J($t,e,n))}}const me=C(x,u,p,.08),ye=C(D,u,p,.03),re=[];if(L.length>=2){const se=L[0].clone().sub(L[1]).normalize();re.push({tip:L[0].clone(),direction:se,length:me,width:ye});const K=L[L.length-1].clone(),ze=L[L.length-2].clone(),Te=K.clone().sub(ze).normalize();re.push({tip:K,direction:Te,length:me,width:ye})}const oe=z+C(h,u,p,.02),he=C(N,u,p,.01),ue=J(w,e,n),Vt=J(new _(w.x+S.x*oe,w.y+S.y*oe),e,n),Ot=J(new _(w.x+T.x*oe,w.y+T.y*oe),e,n),_t=J(new _(w.x-S.x*he,w.y-S.y*he),e,n),Bt=J(new _(w.x-T.x*he,w.y-T.y*he),e,n),Ct=[[ue.clone(),Vt],[ue.clone(),Ot],[ue.clone(),_t],[ue.clone(),Bt]];let fe=c?c.clone():new _().addVectors(S,T);fe.lengthSq()<1e-10&&fe.set(-S.y,S.x),fe.normalize();const nt=C(A,u,p,.03),rt=z>0?z+nt*.3:nt,jt=new _(w.x+fe.x*rt,w.y+fe.y*rt),It=J(jt,e,n);return{radius:z,arcPoints:L,arrowSpecs:re,segments:Ct,labelPosition:It,originWorld:ue}}m(an,"buildAngleDimensionGeometry");function ln({pointA:e=null,pointB:t=null,normal:n=null,offset:r=0,showExtensions:s=!0,labelWorld:o=null,screenSizeWorld:i=null,fallbackScreenSizeWorld:a=null,arrowLengthPixels:c=12,arrowWidthPixels:l=4,labelLiftPixels:u=6,labelLeaderThresholdPixels:p=6}={}){const d=le(e),y=le(t);if(!d||!y)return null;const g=y.clone().sub(d);if(g.lengthSq()<1e-8)return null;g.normalize();let b=le(n);(!b||b.lengthSq()<1e-12)&&(b=new f(0,0,1)),b.normalize();let h=new f().crossVectors(b,g);if(h.lengthSq()<1e-12&&(h=en(g)),h.lengthSq()<1e-12)return null;h.normalize();let N=Number(r);Number.isFinite(N)||(N=C(20,i,a,.05));const A=d.clone().addScaledVector(h,N),x=y.clone().addScaledVector(h,N),D=[];s!==!1&&N!==0&&(D.push([d.clone(),A.clone()]),D.push([y.clone(),x.clone()])),D.push([A.clone(),x.clone()]);const w=C(c,i,a,.08),S=C(l,i,a,.03),T=[{tip:A.clone(),direction:g.clone().negate(),length:w,width:S},{tip:x.clone(),direction:g.clone(),length:w,width:S}],M=le(o),z=new f().addVectors(A,x).multiplyScalar(.5),F=C(u,i,a,.02),R=M||z.addScaledVector(h,F);let L=null;if(M){const Z=A.distanceTo(x);if(Z>1e-6){const me=M.clone().sub(A).dot(g),ye=Math.max(0,Math.min(Z,me)),re=A.clone().addScaledVector(g,ye),oe=C(p,i,a,.02);M.distanceTo(re)>oe&&(L=[re,M.clone()])}}return{direction:g,tangent:h,offset:N,offsetA:A,offsetB:x,segments:D,arrowSpecs:T,labelPosition:R,leaderSegment:L}}m(ln,"buildLinearDimensionGeometry");const cn={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the linear dimension"},targets:{type:"reference_selection",selectionFilter:["VERTEX","EDGE"],multiple:!0,default_value:[],label:"Targets",hint:"Select two vertices, or a vertex and an edge, or a single edge"},planeRefName:{type:"reference_selection",selectionFilter:["FACE","PLANE"],multiple:!1,default_value:"",label:"Face/Plane",hint:"Projection plane (optional)"},alignment:{type:"options",default_value:"view",options:["view","XY","YZ","ZX"],label:"Alignment",hint:"Dimension alignment mode"},offset:{type:"number",default_value:0,label:"Offset",hint:"Offset distance for the dimension line",step:"any"},showExt:{type:"boolean",default_value:!0,label:"Extension Lines",hint:"Draw extension lines from anchors to offset line"},isReference:{type:"boolean",default_value:!1,label:"Reference",hint:"Mark as reference dimension (parentheses)"},decimals:{type:"number",default_value:3,defaultResolver:m(({pmimode:e})=>{const t=Number.isFinite(e?._opts?.dimDecimals)?e._opts.dimDecimals|0:void 0;if(Number.isFinite(t))return Math.max(0,Math.min(8,t))},"defaultResolver"),label:"Decimals",hint:"Number of decimal places to display",min:0,max:8,step:1}},$=class $ extends v{static showContexButton(t){const n=v._collectSelectionRefs(t,["VERTEX","EDGE"]);return n.length?{params:{targets:n.slice(0,2)}}:!1}constructor(t={}){super(t)}uiFieldsTest(t){const n=this.inputParams?.planeRefName;return(Array.isArray(n)?n.length>0:!!String(n||"").trim())?["alignment"]:[]}async run(t){const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams,a=at(n,i),c=a&&a.p0&&a.p1?a.p0.distanceTo(a.p1):null,l=it(c,i);if(i.value=l.display,!a||!a.p0||!a.p1)return[];(!i.persistentData||typeof i.persistentData!="object")&&(i.persistentData={});const u=i.persistentData;try{const d=o.alignNormal?o.alignNormal(i?.alignment||"view",i):new f(0,0,1),y=ln({pointA:a.p0,pointB:a.p1,normal:d,offset:i?.offset,showExtensions:i?.showExt!==!1,labelWorld:u.labelWorld||i.labelWorld,screenSizeWorld:o.screenSizeWorld,fallbackScreenSizeWorld:m(x=>q(n?.viewer,x),"fallbackScreenSizeWorld")});if(!y)return[];for(const[x,D]of y.segments)r.add(Y(x,D,1096065));for(const x of y.arrowSpecs)te(r,x.tip,x.direction,x.length,x.width,1096065);y.leaderSegment&&r.add(Y(y.leaderSegment[0],y.leaderSegment[1],1096065));const g=Number.isFinite(i.decimals)?i.decimals:n?._opts?.dimDecimals|0,b=a.p0.distanceTo(a.p1),h=it(b,i,g);i.value=h.display;const N=o.formatReferenceLabel?o.formatReferenceLabel(i,h.raw):h.display,A=y.labelPosition;A&&o.updateLabel(s,N,A,i)}catch{}return[]}static onLabelPointerDown(t,n,r,s,o){try{if(!t.viewer?.camera)return;const c=at(t,r);if(!c||!c.p0||!c.p1)return;const l=c.p0,u=c.p1,p=o.alignNormal?o.alignNormal(r?.alignment||"view",r):new f(0,0,1),d=new f().subVectors(u,l).normalize(),y=new f().crossVectors(p,d).normalize(),g=new f().addVectors(l,u).multiplyScalar(.5),b=new I().setFromNormalAndCoplanarPoint(p,g);$.dragLabelOnPlane(t,o,{makePlane:m(()=>b,"makePlane"),onDrag:m(h=>{const A=new f().subVectors(h,g).dot(y);r.offset=A;const x=[h.x,h.y,h.z];$.ensurePersistentData(r),r.persistentData.labelWorld=x,r.labelWorld=x,o.updateLabel(n,null,h,r),t.refreshAnnotationsUI?.()},"onDrag"),onEnd:m(()=>{try{t?.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}},"onEnd")})}catch{}}};m($,"LinearDimensionAnnotation"),P($,"entityType","linear"),P($,"type","linear"),P($,"shortName","DIM"),P($,"longName","Linear Dimension"),P($,"title","Linear"),P($,"inputParamsSchema",cn);let Ve=$;function it(e,t,n){if(typeof e!="number"||!Number.isFinite(e))return{raw:"-",display:"-"};const r=n!==void 0?n:Number(t?.decimals),s=Number.isFinite(r)?Math.max(0,Math.min(8,r|0)):3,o=`${e.toFixed(s)}`,i=t?.isReference?`(${o})`:o;return{raw:o,display:i}}m(it,"formatLinearLabel");function at(e,t){const n=Array.isArray(t?.targets);try{const r=e?.viewer?.partHistory?.scene,s=un(n?t.targets:null);if(r&&s.length){const o=fn(r,s);if(o.length){const i=[],a=[];for(const l of o){const u=typeof l?.type=="string"?l.type.toUpperCase():"";u==="VERTEX"?i.push(l):u==="EDGE"&&a.push(l)}const c=e?.viewer;if(i.length>=2){const l=Me(c,i[0]),u=Me(c,i[1]);if(l&&u)return{p0:l,p1:u}}if(i.length===1&&a.length){const l=Me(c,i[0]),u=l?pn(a,l):null;if(l&&u)return{p0:l,p1:u}}if(!i.length&&a.length){if(a.length===1){const l=Et(a[0]);if(l)return{p0:l.a,p1:l.b}}else if(a.length>=2)return vt(a[0],a[1])}}}}catch{}if(!n)try{const r=e?.viewer?.partHistory?.scene,s=t?.aRefName||null,o=t?.bRefName||null;if(r&&(s||o)){const i=s?r.getObjectByName(s):null,a=o?r.getObjectByName(o):null;if(i&&a)return dn(i,a);if(i&&!a){const c=E(e.viewer,i),l=be(t.p1);if(c&&l)return{p0:c,p1:l}}if(!i&&a){const c=E(e.viewer,a),l=be(t.p0);if(l&&c)return{p0:l,p1:c}}}}catch{}return{p0:be(t?.p0)||new f(0,0,0),p1:be(t?.p1)||new f(0,0,0)}}m(at,"computeDimPoints");function un(e){return Array.isArray(e)?e:e==null||e===""?[]:[e]}m(un,"normalizeTargetList");function fn(e,t){if(!e||!Array.isArray(t))return[];const n=[],r=new Set;for(const s of t){let o=null;if(s&&typeof s=="object")s.isObject3D?o=s:s.name&&(o=e.getObjectByName(s.name));else if(s!=null){const a=String(s).trim();a&&(o=e.getObjectByName(a))}if(!o)continue;const i=o.uuid||o.id||o.name;if(i!=null){const a=String(i);if(r.has(a))continue;r.add(a)}n.push(o)}return n}m(fn,"resolveTargetObjects");function Me(e,t){const n=E(e,t);return n&&n.clone||n&&n.isVector3?n.clone():t?.getWorldPosition?t.getWorldPosition(new f):null}m(Me,"resolveVertexPoint");function pn(e,t){if(!Array.isArray(e)||!t)return null;let n=null,r=1/0;for(const s of e){const o=Et(s);if(o){const a=o.a.distanceToSquared(t);a<r&&(r=a,n=o.a);const c=o.b.distanceToSquared(t);c<r&&(r=c,n=o.b);continue}const i=Oe(s,t);if(i){const a=i.distanceToSquared(t);a<r&&(r=a,n=i)}}return n?n.clone():null}m(pn,"closestEndpointToPoint");function Et(e){if(!e)return null;try{e.updateMatrixWorld?.(!0)}catch{}try{if(typeof e.points=="function"){const o=e.points(!0);if(Array.isArray(o)&&o.length>=2){const i=we(o[0]),a=we(o[o.length-1]);if(i&&a)return{a:i,b:a}}}}catch{}const t=Array.isArray(e?.userData?.polylineLocal)?e.userData.polylineLocal:null;if(t&&t.length>=2){const o=we(t[0]),i=we(t[t.length-1]);if(o&&i)return e.matrixWorld&&(o.applyMatrix4(e.matrixWorld),i.applyMatrix4(e.matrixWorld)),{a:o,b:i}}const n=e?.geometry?.attributes?.instanceStart,r=e?.geometry?.attributes?.instanceEnd;if(n&&r&&n.count>=1){const o=new f(n.getX(0),n.getY(0),n.getZ(0)),i=new f(r.getX(0),r.getY(0),r.getZ(0));return e.matrixWorld&&(o.applyMatrix4(e.matrixWorld),i.applyMatrix4(e.matrixWorld)),{a:o,b:i}}const s=e?.geometry?.getAttribute?.("position");if(s&&s.itemSize===3&&s.count>=2){const o=new f(s.getX(0),s.getY(0),s.getZ(0)),i=new f(s.getX(s.count-1),s.getY(s.count-1),s.getZ(s.count-1));return e.matrixWorld&&(o.applyMatrix4(e.matrixWorld),i.applyMatrix4(e.matrixWorld)),{a:o,b:i}}return null}m(Et,"edgeEndpointsWorld");function dn(e,t){if(e?.type==="VERTEX"&&t?.type==="VERTEX")return{p0:e.getWorldPosition(new f),p1:t.getWorldPosition(new f)};if(e?.type==="EDGE"&&t?.type==="VERTEX"){const n=t.getWorldPosition(new f);return{p0:Oe(e,n),p1:n}}if(e?.type==="VERTEX"&&t?.type==="EDGE"){const n=e.getWorldPosition(new f),r=Oe(t,n);return{p0:n,p1:r}}return e?.type==="EDGE"&&t?.type==="EDGE"?vt(e,t):{p0:E(null,e)||new f,p1:E(null,t)||new f}}m(dn,"closestPointsForObjects");function Oe(e,t){try{const n=e.points(!0);if(!n||n.length<2)return e.getWorldPosition(new f);const r=t.clone();let s={d2:1/0,q:null};const o=new f,i=new f;for(let a=0;a<n.length-1;a++){o.set(n[a].x,n[a].y,n[a].z),i.set(n[a+1].x,n[a+1].y,n[a+1].z);const c=mn(o,i,r),l=c.distanceToSquared(r);l<s.d2&&(s={d2:l,q:c})}return s.q||e.getWorldPosition(new f)}catch{return e.getWorldPosition(new f)}}m(Oe,"closestPointOnEdgeToPoint");function vt(e,t){try{const n=e.points(!0),r=t.points(!0);if(!n||n.length<2||!r||r.length<2)return{p0:E(null,e)||new f,p1:E(null,t)||new f};const s=new f,o=new f,i=new f,a=new f;let c={d2:1/0,p:null,q:null};for(let l=0;l<n.length-1;l++){s.set(n[l].x,n[l].y,n[l].z),o.set(n[l+1].x,n[l+1].y,n[l+1].z);for(let u=0;u<r.length-1;u++){i.set(r[u].x,r[u].y,r[u].z),a.set(r[u+1].x,r[u+1].y,r[u+1].z);const{p,q:d}=yn(s,o,i,a),y=p.distanceToSquared(d);y<c.d2&&(c={d2:y,p,q:d})}}return{p0:c.p||E(null,e)||new f,p1:c.q||E(null,t)||new f}}catch{return{p0:E(null,e)||new f,p1:E(null,t)||new f}}}m(vt,"closestPointsBetweenEdges");function mn(e,t,n){const r=t.clone().sub(e),s=Math.max(0,Math.min(1,r.dot(n.clone().sub(e))/(r.lengthSq()||1)));return e.clone().addScaledVector(r,s)}m(mn,"closestPointOnSegment");function yn(e,t,n,r){const s=t.clone().sub(e),o=r.clone().sub(n),i=e.clone().sub(n),a=s.dot(s),c=o.dot(o),l=o.dot(i);let u,p;const d=1e-12;if(a<=d&&c<=d)u=0,p=0;else if(a<=d)u=0,p=Math.max(0,Math.min(1,l/c));else{const b=s.dot(i);if(c<=d)p=0,u=Math.max(0,Math.min(1,-b/a));else{const h=s.dot(o),N=a*c-h*h;u=N!==0?Math.max(0,Math.min(1,(h*l-b*c)/N)):0,p=(h*u+l)/c,p<0?(p=0,u=Math.max(0,Math.min(1,-b/a))):p>1&&(p=1,u=Math.max(0,Math.min(1,(h-b)/a)))}}const y=e.clone().addScaledVector(s,u),g=n.clone().addScaledVector(o,p);return{p:y,q:g}}m(yn,"closestPointsOnSegments");function we(e){return le(e)}m(we,"arrayToVector");function be(e){return e?e instanceof f?e.clone():Array.isArray(e)?new f(e[0]||0,e[1]||0,e[2]||0):typeof e=="object"?new f(e.x||0,e.y||0,e.z||0):null:null}m(be,"vectorFromAnnotationPoint");const hn={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the radial dimension"},cylindricalFaceRef:{type:"reference_selection",selectionFilter:["FACE"],multiple:!1,default_value:"",label:"Cylindrical Face",hint:"Select cylindrical face"},planeRef:{type:"reference_selection",selectionFilter:["FACE","PLANE"],multiple:!1,default_value:"",label:"Projection Plane",hint:"Optional plane used to project the dimension"},displayStyle:{type:"options",default_value:"radius",options:["radius","diameter"],label:"Display Style",hint:"Display as radius or diameter"},alignment:{type:"options",default_value:"view",options:["view","XY","YZ","ZX"],label:"Alignment",hint:"Dimension alignment mode"},offset:{type:"number",default_value:0,label:"Offset",hint:"Distance to offset the dimension line",step:"any"},isReference:{type:"boolean",default_value:!1,label:"Reference",hint:"Mark as reference dimension (parentheses)"},decimals:{type:"number",default_value:3,defaultResolver:m(({pmimode:e})=>{const t=Number.isFinite(e?._opts?.dimDecimals)?e._opts.dimDecimals|0:void 0;if(Number.isFinite(t))return Math.max(0,Math.min(8,t))},"defaultResolver"),label:"Decimals",hint:"Number of decimal places to display",min:0,max:8,step:1}},X=class X extends v{static showContexButton(t){const n=v._normalizeSelectionItems(t),r=new Set(["FACE"]);for(const s of n){if(!v._isSelectionType(s,r)||!gn(s))continue;const o=v._selectionRefName(s);if(o)return{params:{cylindricalFaceRef:o}}}return!1}constructor(t={}){super(t)}uiFieldsTest(t){const n=this.inputParams?.planeRef;return(Array.isArray(n)?n.length>0:!!String(n||"").trim())?["alignment"]:[]}async run(t){const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams,a=wn(n,i),c=lt(a,i);i.value=c.display,ct(i);try{const l=Be(n,i,o);if(!l||!l.center||!l.radiusPoint)return[];const{center:u,radiusPoint:p,planeNormal:d,planePoint:y,radius:g}=l,b=16739125;let h=new f().subVectors(p,u);h.lengthSq()<1e-6&&h.set(1,0,0),h.normalize();let N=d;if(N||(N=o.alignNormal?o.alignNormal(i.alignment||"view",i):null),N&&N.lengthSq()>1e-6){const S=h.clone().projectOnPlane(N).normalize();S.lengthSq()>1e-6&&(h=S)}const A=o.screenSizeWorld?o.screenSizeWorld(12):q(n?.viewer,12),x=o.screenSizeWorld?o.screenSizeWorld(4):q(n?.viewer,4),D=i.displayStyle==="diameter",w=i.persistentData?.labelWorld?Ce(i.persistentData.labelWorld):null;if(D){const S=w?w.clone().sub(u).normalize():h.clone(),T=w?u.clone().addScaledVector(S,w.clone().sub(u).length()):u.clone().addScaledVector(S,g+Math.abs(Number(i.offset)||o.screenSizeWorld?o.screenSizeWorld(50):q(n?.viewer,50))),M=u.clone().addScaledVector(S,-g),z=u.clone().addScaledVector(S,g),F=u.clone().addScaledVector(S,-g);r.add(Y(M,T,b)),te(r,z,S.clone(),A,x,b),te(r,F,S.clone().negate(),A,x,b);const R=Re(o.screenSizeWorld?o.screenSizeWorld(6):q(n?.viewer,6),b);R.position.copy(u),r.add(R)}else{const S=w||Ft(n,i,u,p,d,y,o);let M=S.clone().sub(u).clone();M.lengthSq()||(M=h.clone()),M.normalize();const z=S;r.add(Y(u,z,b));const F=u.clone().addScaledVector(M,g);te(r,F,M.clone(),A,x,b);const R=Re(o.screenSizeWorld?o.screenSizeWorld(6):q(n?.viewer,6),b);R.position.copy(u),r.add(R)}if(typeof a=="number"){const S=lt(a,i);i.value=S.display;const T=o.formatReferenceLabel?o.formatReferenceLabel(i,S.raw):S.display,M=bn(n,i,u,p,d,y,o);M&&o.updateLabel(s,T,M,i)}}catch(l){console.warn("RadialDimensionAnnotation render error:",l)}return[]}static onLabelPointerDown(t,n,r,s,o){try{const i=Be(t,r,o);if(!i||!i.center||!i.radiusPoint)return;const a=i.planeNormal&&i.planeNormal.lengthSq()>1e-6?i.planeNormal.clone().normalize():o.alignNormal?o.alignNormal(r.alignment||"view",r):new f(0,0,1),c=i.planePoint||i.radiusPoint,l=a&&c?new I().setFromNormalAndCoplanarPoint(a,c):null,u=new f().subVectors(i.radiusPoint,i.center).normalize();X.dragLabelOnPlane(t,o,{makePlane:m(()=>l,"makePlane"),onDrag:m(p=>{l.projectPoint(p,p),ct(r),r.persistentData.labelWorld=[p.x,p.y,p.z];const d=new f().subVectors(p,i.center);r.offset=d.dot(u)-i.radius,o.updateLabel(n,null,p,r),t.refreshAnnotationsUI?.()},"onDrag"),onEnd:m(()=>{try{t?.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}},"onEnd")})}catch{}}};m(X,"RadialDimensionAnnotation"),P(X,"entityType","radial"),P(X,"type","radial"),P(X,"shortName","RAD"),P(X,"longName","Radial Dimension"),P(X,"title","Radial"),P(X,"inputParamsSchema",hn);let _e=X;function lt(e,t){if(typeof e!="number"||!Number.isFinite(e))return{raw:"-",display:"-"};const n=t?.displayStyle==="diameter"?e*2:e,r=Number(t?.decimals),s=Number.isFinite(r)?Math.max(0,Math.min(8,r|0)):3,i=`${t?.displayStyle==="diameter"?"⌀":"R"}${n.toFixed(s)}`,a=`${i} (wu)`,c=t?.isReference?`(${a})`:a;return{raw:i,display:c}}m(lt,"formatRadialLabel");function ct(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(ct,"ensurePersistent$2");function Be(e,t,n){try{const r=e?.viewer?.partHistory?.scene;if(!r||!t.cylindricalFaceRef)return null;const s=r.getObjectByName(t.cylindricalFaceRef);if(!s)return null;let o=s;for(;o&&typeof o.getFaceMetadata!="function";)o=o.parent;let i=null,a=null,c=null,l=null,u=null;const p=new f;let d=null,y=null;if(o&&typeof o.getFaceMetadata=="function"&&(d=o.getFaceMetadata(t.cylindricalFaceRef),d&&(d.type==="cylindrical"||d.type==="conical")&&(d.type==="cylindrical"?(i=new f(d.center[0],d.center[1],d.center[2]),a=d.radius,c=new f(d.axis[0],d.axis[1],d.axis[2]).normalize()):Math.abs(d.radiusBottom-d.radiusTop)<1e-6&&(i=new f(d.center[0],d.center[1],d.center[2]),a=d.radiusBottom,c=new f(d.axis[0],d.axis[1],d.axis[2]).normalize()),i&&c&&(s.parent&&s.parent.matrixWorld&&(i.applyMatrix4(s.parent.matrixWorld),c.transformDirection(s.parent.matrixWorld).normalize()),u=new f,Math.abs(c.x)<.9?u.crossVectors(c,new f(1,0,0)).normalize():u.crossVectors(c,new f(0,1,0)).normalize(),l=i.clone().addScaledVector(u,a))),d&&typeof d=="object")){const h=d.pmiRadiusOverride??d.radiusOverride;Number.isFinite(h)&&h>0&&(y=Math.abs(h))}if((!i||!c||!Number.isFinite(a)||a<=0)&&o){const h=Sn(o,s);h&&(i=h.center,c=h.axis,a=h.radius,l=h.radiusPoint,u=h.perpendicular)}if(!i||!c||!Number.isFinite(a)||a<=0){const h=Tn(s);if(!h)return null;i=h.center,c=h.axis,a=h.radius,l=h.radiusPoint,u=new f().subVectors(l,i).normalize()}if(y&&i){let h=null;u&&u.lengthSq()>1e-12?h=u.clone().normalize():l&&(h=new f().subVectors(l,i),h.lengthSq()>1e-12&&h.normalize()),a=y,h&&(u=h.clone(),l=i.clone().addScaledVector(h,a))}p.copy(i);let g=null,b=null;if(t.planeRef){const h=r.getObjectByName(t.planeRef);h&&(g=ce(e.viewer,h),b=E(e.viewer,h))}if(g&&b&&g.lengthSq()>1e-6){const h=g.clone().normalize();g=h;const N=new I().setFromNormalAndCoplanarPoint(h,b),A=new f;N.projectPoint(i,A),i=A;let x=new f().subVectors(l,p);x.lengthSq()<1e-12&&(x=u.clone());let D=x.projectOnPlane(h);D.lengthSq()<1e-12&&(D=c.clone().cross(h),D.lengthSq()<1e-12&&(Math.abs(h.x)<.9?D=new f().crossVectors(h,new f(1,0,0)):D=new f().crossVectors(h,new f(0,1,0)))),D.normalize(),l=i.clone().addScaledVector(D,a)}return{center:i,radiusPoint:l,planeNormal:g,planePoint:b,axis:c,radius:a}}catch{return null}}m(Be,"computeRadialPoints");function Ee(e){if(!e||typeof e!="object")return!1;const t=String(e.type||"").toLowerCase();if(t==="cylindrical"){const n=Number(e.radius);return Number.isFinite(n)&&n>0}if(t==="conical"){const n=Number(e.radiusBottom),r=Number(e.radiusTop);return!Number.isFinite(n)||!Number.isFinite(r)||Math.abs(n-r)>1e-6?!1:Math.max(n,r)>0}return!1}m(Ee,"isCylindricalMetadata");function ve(e){if(!e)return null;const t=e.userData||null;if(t?.metadata&&Ee(t.metadata))return t.metadata;if(typeof e.getMetadata=="function")try{const s=e.getMetadata();if(Ee(s))return s}catch{}const n=e?.name||t?.faceName||null;let r=e?.parentSolid||t?.parentSolid||e?.parent||null;for(;r;){if(n&&typeof r.getFaceMetadata=="function"){try{const s=r.getFaceMetadata(n);if(Ee(s))return s}catch{}break}r=r.parent||null}return null}m(ve,"readCylindricalMetadata");function gn(e){if(!e)return!1;if(ve(e))return!0;if(Array.isArray(e.faces)){for(const t of e.faces)if(ve(t))return!0}return!!(e.parent&&ve(e.parent))}m(gn,"hasCylindricalMetadata");function wn(e,t){try{const n=Be(e,t);return n&&typeof n.radius=="number"?n.radius:n&&n.center&&n.radiusPoint?n.center.distanceTo(n.radiusPoint):null}catch{return null}}m(wn,"measureRadialValue");function bn(e,t,n,r,s,o,i){try{let a=null;return t.persistentData?.labelWorld?a=Ce(t.persistentData.labelWorld):t.labelWorld&&(a=Ce(t.labelWorld)),a||(a=Ft(e,t,n,r,s,o,i)),s&&o&&s.lengthSq()>1e-6&&a&&new I().setFromNormalAndCoplanarPoint(s.clone().normalize(),o).projectPoint(a,a),a}catch{return null}}m(bn,"resolveLabelPosition$1");function Ft(e,t,n,r,s,o,i){try{const a=new f().subVectors(r,n);if(a.lengthSq()<1e-12)return r.clone();a.normalize();let c=Number(t?.offset);(!Number.isFinite(c)||c===0)&&(c=i.screenSizeWorld?i.screenSizeWorld(50):q(e?.viewer,50));const l=n.distanceTo(r),u=n.clone().addScaledVector(a,l+Math.abs(c));return s&&o&&s.lengthSq()>1e-6&&new I().setFromNormalAndCoplanarPoint(s.clone().normalize(),o).projectPoint(u,u),u}catch{return r?r.clone():null}}m(Ft,"computeRadialLabelPosition");function Sn(e,t){try{if(!e||!t)return null;const n=Array.isArray(e._auxEdges)?e._auxEdges:null;if(!n||n.length===0)return null;const r=(t.name||t.userData?.faceName||"").trim();if(!r)return null;const s=zn(r);if(!s)return null;const o=xn(n,`${s}_PATH`);if(!o||!Array.isArray(o.points)||o.points.length<2)return null;e.updateMatrixWorld?.(!0),t.updateMatrixWorld?.(!0);const i=Pn(o,e);if(!i||i.length<2)return null;const a=Nn(t,16);if(!a.length)return null;let c=null;for(const l of a){const u=An(l,i,!!o.closedLoop);if(!u||!u.point)continue;const p=new f().subVectors(l,u.point),d=p.lengthSq();if(!(d>1e-10))continue;const y=Math.sqrt(d);p.normalize(),(!c||y>c.radius)&&(c={center:u.point.clone(),axis:u.direction?u.direction.clone():null,radius:y,radiusPoint:u.point.clone().addScaledVector(p,y),perpendicular:p.clone()})}return c?((!c.axis||c.axis.lengthSq()<1e-10)&&(c.axis=Dn(i,c.center,!!o.closedLoop)||new f(0,1,0)),c):null}catch{return null}}m(Sn,"inferPipeFaceDataFromAuxEdges");function xn(e,t){if(!Array.isArray(e)||!t)return null;for(const r of e)if(r?.name===t)return r;const n=t.toLowerCase();for(const r of e)if(typeof r?.name=="string"&&r.name.toLowerCase()===n)return r;return null}m(xn,"findAuxEdgeByName");function Pn(e,t){try{const n=[],r=!e.polylineWorld&&t?.matrixWorld?t.matrixWorld:null,s=new f;for(const o of e.points){if(Array.isArray(o)&&o.length>=3)s.set(o[0],o[1],o[2]);else if(o&&typeof o=="object")s.set(Number(o.x)||0,Number(o.y)||0,Number(o.z)||0);else continue;r&&s.applyMatrix4(r),n.push(s.clone())}return n}catch{return null}}m(Pn,"buildAuxPolylineWorld");function Nn(e,t=16){try{const n=e?.geometry;if(!n)return[];const r=typeof n.getAttribute=="function"?n.getAttribute("position"):null,s=e.matrixWorld||new de,o=[],i=new f;if(r&&r.count>0){const a=Math.max(1,Math.floor(r.count/t));for(let c=0;c<r.count&&o.length<t;c+=a)i.set(r.getX(c),r.getY(c),r.getZ(c)).applyMatrix4(s),o.push(i.clone())}if(!o.length)try{n.computeBoundingSphere?.(),n.boundingSphere&&(i.copy(n.boundingSphere.center).applyMatrix4(s),o.push(i.clone()))}catch{}return o}catch{return[]}}m(Nn,"collectFaceSamplePoints");function An(e,t,n=!1){if(!e||!Array.isArray(t)||t.length<2)return null;const r=new f,s=new f,o=new f;let i=null,a=null,c=1/0;const l=t.length,u=n?l:l-1;for(let p=0;p<u;p++){const d=t[p],y=t[(p+1)%l];if(!d||!y)continue;s.copy(y).sub(d);const g=s.lengthSq();if(g<1e-14)continue;o.copy(e).sub(d);let b=o.dot(s)/g;b=Math.max(0,Math.min(1,b)),r.copy(d).addScaledVector(s,b);const h=r.distanceToSquared(e);h<c&&(c=h,i=r.clone(),a=s.clone().normalize())}return i?{point:i,direction:a,distanceSq:c}:null}m(An,"closestPointOnPolyline");function Dn(e,t,n=!1){if(!Array.isArray(e)||e.length<2||!t)return null;let r=null,s=1/0;const o=new f,i=new f,a=e.length,c=n?a:a-1;for(let l=0;l<c;l++){const u=e[l],p=e[(l+1)%a];if(!u||!p)continue;o.copy(u).add(p).multiplyScalar(.5);const d=o.distanceToSquared(t);d<s&&(s=d,i.copy(p).sub(u),r=i.lengthSq()>1e-14?i.clone().normalize():null)}return r}m(Dn,"estimatePolylineTangent");function zn(e){const t=/^(.*?)(_Outer|_Inner|_CapStart|_CapEnd)$/i.exec(e);return t?t[1]:null}m(zn,"pipeFaceBaseName");function Tn(e){try{const t=e?.geometry;if(!t||!t.getAttribute)return null;const n=t.getAttribute("position");if(!n||n.count<6)return null;const r=e.matrixWorld||new de,s=[],o=new f;for(let w=0;w<n.count;w++)o.set(n.getX(w),n.getY(w),n.getZ(w)).applyMatrix4(r),s.push(o.clone());if(!s.length)return null;const i=new f;for(const w of s)i.add(w);i.divideScalar(s.length);const a=new Float64Array(9),c=new f;for(const w of s)c.copy(w).sub(i),a[0]+=c.x*c.x,a[1]+=c.x*c.y,a[2]+=c.x*c.z,a[4]+=c.y*c.y,a[5]+=c.y*c.z,a[8]+=c.z*c.z;a[3]=a[1],a[6]=a[2],a[7]=a[5];const l=new f(1,0,0);for(let w=0;w<20;w++){const S=a[0]*l.x+a[1]*l.y+a[2]*l.z,T=a[1]*l.x+a[4]*l.y+a[5]*l.z,M=a[2]*l.x+a[5]*l.y+a[8]*l.z;l.set(S,T,M);const z=l.length();if(z<1e-12){l.set(0,1,0);break}l.divideScalar(z)}l.lengthSq()<1e-12&&l.set(0,1,0);let u=1/0,p=-1/0,d=0,y=0;const g=new f,b=new f,h=new f;for(const w of s){c.copy(w).sub(i);const S=c.dot(l);S<u&&(u=S),S>p&&(p=S),b.copy(l).multiplyScalar(S),g.copy(c).sub(b);const T=g.length();T>1e-6&&(y===0&&h.copy(g).normalize(),d+=T,y++)}if(!y)return null;const N=d/y,A=i.clone().add(l.clone().multiplyScalar((u+p)*.5)),x=h.lengthSq()>1e-12?h.clone():new f().crossVectors(l,new f(1,0,0)).normalize();x.lengthSq()<1e-12&&x.set(0,1,0).cross(l).normalize();const D=A.clone().addScaledVector(x,N);return{center:A,axis:l.normalize(),radius:N,radiusPoint:D}}catch{return null}}m(Tn,"inferCylinderFromGeometry");function Ce(e){return e?e instanceof f?e.clone():Array.isArray(e)?new f(e[0]||0,e[1]||0,e[2]||0):typeof e=="object"?new f(e.x||0,e.y||0,e.z||0):null:null}m(Ce,"vectorFromAny$1");const Mn={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the angle dimension"},decimals:{type:"number",default_value:1,defaultResolver:m(({pmimode:e})=>{const t=Number.isFinite(e?._opts?.angleDecimals)?e._opts.angleDecimals|0:void 0;if(Number.isFinite(t))return Math.max(0,Math.min(3,t))},"defaultResolver"),label:"Decimals",hint:"Number of decimal places to display",min:0,max:3,step:1},targets:{type:"reference_selection",selectionFilter:["FACE","EDGE"],multiple:!0,default_value:[],label:"Elements",hint:"Select two edges/faces to define the angle",minSelections:2,maxSelections:2},planeRefName:{type:"reference_selection",selectionFilter:["FACE","PLANE"],multiple:!1,default_value:"",label:"Projection Plane",hint:"Override projection plane (optional)"},reverseElementOrder:{type:"boolean",default_value:!1,label:"Reverse Selection Order",hint:"Swap Element A and Element B to flip the measured side"},isReference:{type:"boolean",default_value:!1,label:"Reference",hint:"Mark as reference dimension (parentheses)"},angleType:{type:"options",default_value:"acute",options:["acute","obtuse","reflex"],label:"Angle Type",hint:"Choose which angle (acute, obtuse, or reflex) to display"}},Q=class Q extends v{static showContexButton(t){const n=v._collectSelectionRefs(t,["FACE","EDGE"]);return n.length<2?!1:{params:{targets:n.slice(0,2)}}}constructor(t={}){super(t)}async run(t){const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams,a=vn(n,i),c=ft(a,i);i.value=c.display,ut(i);try{const l=pt(n,i,o);if(!l||!l.__2d)return[];const u=16096779,{N:p,P:d,A_d:y,B_d:g,V2:b,basis:h,sweep:N=0,dirSign:A=1,bisector:x=null}=l.__2d,D=an({planePoint:d,planeNormal:p,basis:h,vertex2D:b,directionA2D:y,directionB2D:g,sweepRad:N,sweepDirection:A,bisector2D:x,labelWorld:i.persistentData?.labelWorld,screenSizeWorld:o.screenSizeWorld,fallbackScreenSizeWorld:m(w=>q(n?.viewer,w),"fallbackScreenSizeWorld")});if(!D)return[];for(let w=0;w<D.arcPoints.length-1;w+=1)r.add(Y(D.arcPoints[w],D.arcPoints[w+1],u));for(const[w,S]of D.segments)r.add(Y(w,S,u));for(const w of D.arrowSpecs)te(r,w.tip,w.direction,w.length,w.width,u);if(typeof a=="number"){const w=ft(a,i),S=w.raw;i.value=w.display;const T=o.formatReferenceLabel?o.formatReferenceLabel(i,S):w.display,M=D.labelPosition;M&&o.updateLabel(s,T,M,i)}}catch{}return[]}static onLabelPointerDown(t,n,r,s,o){try{const i=pt(t,r,o);if(!i)return;const a=Je(t,r,i,o),c=a?.n||new f(0,0,1),l=a?.p||new f,u=new I().setFromNormalAndCoplanarPoint(c,l);try{t?.showDragPlaneHelper?.(u)}catch{}const p=m(y=>{const g=o.raycastFromEvent?o.raycastFromEvent(y):null;if(!g)return;const b=new f;(o.intersectPlane?o.intersectPlane(g,u,b):g.intersectPlane(u,b))&&(ut(r),r.persistentData.labelWorld=[b.x,b.y,b.z],o.updateLabel(n,null,b,r),t.refreshAnnotationsUI?.())},"onMove"),d=m(y=>{try{window.removeEventListener("pointermove",p,!0),window.removeEventListener("pointerup",d,!0)}catch{}try{t?.hideDragPlaneHelper?.()}catch{}try{t.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}try{y.preventDefault(),y.stopImmediatePropagation?.(),y.stopPropagation()}catch{}},"onUp");window.addEventListener("pointermove",p,!0),window.addEventListener("pointerup",d,!0)}catch{}}};m(Q,"AngleDimensionAnnotation"),P(Q,"entityType","angle"),P(Q,"type","angle"),P(Q,"shortName","ANG"),P(Q,"longName","Angle Dimension"),P(Q,"title","Angle"),P(Q,"inputParamsSchema",Mn);let je=Q;function ut(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(ut,"ensurePersistent$1");function En(e){const t=Array.isArray(e)?e:e==null||e===""?[]:[e],n=[],r=new Set;for(const s of t){let o="";s&&typeof s=="object"?typeof s.name=="string"?o=s.name:s.id!=null&&(o=String(s.id)):s!=null&&(o=String(s)),o=o.trim(),!(!o||r.has(o))&&(r.add(o),n.push(o))}return n}m(En,"normalizeTargetNames");function Ke(e){const t=Array.isArray(e?.targets),n=En(t?e.targets:null);let r="",s="";return n.length?(r=n[0]||"",s=n[1]||""):t||(r=e?.elementARefName||"",s=e?.elementBRefName||""),e?.reverseElementOrder?{elementARefName:s,elementBRefName:r}:{elementARefName:r,elementBRefName:s}}m(Ke,"resolveElementRefNames");function qt(e){const t=e?.angleType;return t==="acute"||t==="obtuse"||t==="reflex"?t:e?.useReflexAngle?"reflex":"acute"}m(qt,"resolveAngleType");function Lt(e){return!e||typeof e!="object"||!Object.prototype.hasOwnProperty.call(e,"angleType")?!1:e.angleType==="acute"||e.angleType==="obtuse"||e.angleType==="reflex"}m(Lt,"isAngleTypeExplicit");function ft(e,t){if(typeof e!="number"||!Number.isFinite(e))return{raw:"-",display:"-"};const n=Number(t?.decimals),r=Number.isFinite(n)?Math.max(0,Math.min(3,n|0)):1,s=`${e.toFixed(r)}°`,o=t?.isReference?`(${s})`:s;return{raw:s,display:o}}m(ft,"formatAngleLabel");function vn(e,t){try{const n=Rt(e,t),r=Je(e,t,n);if(!r)return null;const{elementARefName:s,elementBRefName:o}=Ke(t),i=Ae(e,s,r.n,r.p),a=Ae(e,o,r.n,r.p);if(!i||!a)return null;const c=Ze(r.n,i.d),l=Ne(i.d,c).normalize(),u=Ne(a.d,c).normalize(),p=qt(t),d=Lt(t)||!!t?.useReflexAngle,y=Mt(l,u,p,d);return y?Se.radToDeg(y.angleRad):null}catch{return null}}m(vn,"measureAngleValue");function Rt(e,t){try{const n=e?.viewer?.partHistory?.scene;if(!n)return null;const{elementARefName:r,elementBRefName:s}=Ke(t),o=r?n.getObjectByName(r):null,i=s?n.getObjectByName(s):null;if(!o||!i)return null;const a=ce(e.viewer,o),c=ce(e.viewer,i),l=E(e.viewer,o),u=E(e.viewer,i);let p=null;if(t.planeRefName){const d=n.getObjectByName(t.planeRefName);d&&(p=ce(e.viewer,d))}return{dirA:a,dirB:c,pointA:l,pointB:u,plane:p}}catch{return null}}m(Rt,"computeAngleElements");function pt(e,t,n){try{const r=Rt(e,t);if(!r||!r.dirA||!r.dirB)return null;const s=Je(e,t,r,n);if(!s)return null;const{elementARefName:o,elementBRefName:i}=Ke(t),a=Ae(e,o,s.n,s.p),c=Ae(e,i,s.n,s.p);if(!a||!c)return null;const l=Ze(s.n,a.d),u=We(a.p,s.p,l),p=We(c.p,s.p,l);let d=Ne(a.d,l).normalize(),y=Ne(c.d,l).normalize();t?.reverseElementOrder&&(d=d.multiplyScalar(-1),y=y.multiplyScalar(-1));const g=qt(t),b=Lt(t)||!!t?.useReflexAngle,h=Mt(d,y,g,b);if(!h)return null;const N=h.start.clone(),A=h.end.clone();let x=on(u,N,p,A);if(x){const D=Math.max(1e-6,u.distanceTo(p));Math.max(x.distanceTo(u),x.distanceTo(p))>D*8&&(x=null)}return x||(x=new _().addVectors(u,p).multiplyScalar(.5)),{...r,__2d:{N:s.n,P:s.p,basis:l,A_p:u,B_p:p,A_d:N,B_d:A,V2:x,sweep:h.sweep,dirSign:h.dirSign,angleRad:h.angleRad,angleType:h.angleType,bisector:h.bisector}}}catch{return null}}m(pt,"computeAngleElementsWithGeometry");function Je(e,t,n,r){try{if(t?.planeRefName){const a=e.viewer?.partHistory?.scene?.getObjectByName(t.planeRefName);if(a){const c=ce(e.viewer,a)||new f(0,0,1);if(c.lengthSq()>1e-12){const l=E(e.viewer,a)||new f;return{n:c.clone().normalize(),p:l}}}}if(n?.dirA&&n?.dirB){const a=new f().crossVectors(n.dirA,n.dirB);if(a.lengthSq()>1e-12){const c=n.pointA&&n.pointB?new f().addVectors(n.pointA,n.pointB).multiplyScalar(.5):n.pointA||n.pointB||new f;return{n:a.normalize(),p:c}}}const o=(r?.alignNormal?r.alignNormal("view",t):null)||n?.plane||new f(0,0,1),i=n?.pointA&&n?.pointB?new f().addVectors(n.pointA,n.pointB).multiplyScalar(.5):n?.pointA||n?.pointB||new f;return{n:o.clone().normalize(),p:i}}catch{return{n:new f(0,0,1),p:new f}}}m(Je,"resolveAnglePlane");function Ae(e,t,n,r){try{if(!t)return null;const s=e?.viewer?.partHistory?.scene;if(!s)return null;const o=s.getObjectByName(t);if(!o)return null;const i=n&&n.lengthSq()>1e-12?n.clone().normalize():new f(0,0,1),a=E(e.viewer,o)||r||new f,c=r||a,l=new I().setFromNormalAndCoplanarPoint(i,c),u=ce(e.viewer,o),p=u?u.clone().normalize():null,d=o?.userData||{},y=String(o?.type||"").toUpperCase(),g=String(d.type||d.brepType||"").toUpperCase(),h=y==="FACE"||y==="PLANE"||!(y==="FACE"||y==="EDGE"||y==="PLANE")&&(g==="FACE"||g==="PLANE");if(y==="EDGE"||!h&&(g==="EDGE"||o?.isLine||o?.isLine2||o?.isLineSegments||o?.isLineLoop)){const w=Fn(o,l,c);if(w)return w}if(h&&p&&p.lengthSq()>1e-12){const w=p.clone().normalize(),S=new f().crossVectors(w,i),T=S.lengthSq();if(T>1e-12){const M=w.dot(a),z=i.dot(c),F=new f().crossVectors(i,S).multiplyScalar(M),R=new f().crossVectors(S,w).multiplyScalar(z),L=F.add(R).divideScalar(T);return{p:l.projectPoint(L,L.clone()),d:S.normalize()}}}let A=a.clone();if(p&&p.lengthSq()>1e-12){const w=p.dot(i);if(Math.abs(w)>1e-9){const T=c.clone().clone().sub(a).dot(i)/w;A=a.clone().addScaledVector(p,T)}}const x=l.projectPoint(A,A.clone());let D=p?p.clone().projectOnPlane(i):null;return(!D||D.lengthSq()<1e-12)&&(D=Ze(i).U.clone()),D.normalize(),{p:x,d:D}}catch{return null}}m(Ae,"lineInPlaneForElement");function Fn(e,t,n){const r=qn(e);if(!Array.isArray(r)||r.length<2)return null;const s=[];for(const u of r)u&&s.push(t.projectPoint(u,u.clone()));if(s.length<2)return null;let o=0,i=1,a=0;for(let u=0;u<s.length;u++)for(let p=u+1;p<s.length;p++){const d=s[u].distanceToSquared(s[p]);d>a&&(a=d,o=u,i=p)}if(a<=1e-12)return null;const c=s[i].clone().sub(s[o]).normalize();let l=s[o].clone();if(n){let u=l.distanceToSquared(n);for(let p=0;p<s.length;p++){const d=s[p].distanceToSquared(n);d<u&&(u=d,l=s[p].clone())}}return{p:l,d:c}}m(Fn,"edgeLineInPlane");function qn(e){if(!e)return null;try{e.updateMatrixWorld?.(!0)}catch{}const t=e.matrixWorld||null,n=[],r=m(c=>{const l=dt(c);if(!l)return;const u=n[n.length-1];u&&u.distanceToSquared(l)<=1e-14||n.push(l)},"pushUnique");try{if(typeof e.points=="function"){const c=e.points(!0);if(Array.isArray(c))for(const l of c)r(l);if(n.length>=2)return n;n.length=0}}catch{}const s=Array.isArray(e?.userData?.polylineLocal)?e.userData.polylineLocal:null;if(s){for(const c of s){const l=dt(c);l&&(t&&l.applyMatrix4(t),r(l))}if(n.length>=2)return n;n.length=0}const o=e?.geometry?.attributes?.instanceStart,i=e?.geometry?.attributes?.instanceEnd;if(o&&i){const c=Math.min(o.count||0,i.count||0);for(let l=0;l<c;l++){const u=new f(o.getX(l),o.getY(l),o.getZ(l)),p=new f(i.getX(l),i.getY(l),i.getZ(l));t&&(u.applyMatrix4(t),p.applyMatrix4(t)),r(u),r(p)}if(n.length>=2)return n;n.length=0}const a=e?.geometry?.getAttribute?.("position");if(a&&a.itemSize===3&&a.count>=2){for(let c=0;c<a.count;c++){const l=new f(a.getX(c),a.getY(c),a.getZ(c));t&&l.applyMatrix4(t),r(l)}if(n.length>=2)return n}return null}m(qn,"getEdgeWorldPoints");function dt(e){if(!e)return null;if(e instanceof f)return e.clone();if(Array.isArray(e)&&e.length>=3)return new f(e[0]||0,e[1]||0,e[2]||0);if(typeof e=="object"){const t=Number(e.x),n=Number(e.y),r=Number(e.z);if(Number.isFinite(t)&&Number.isFinite(n)&&Number.isFinite(r))return new f(t,n,r)}return null}m(dt,"pointFromAny");const Ln={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the leader"},target:{type:"reference_selection",selectionFilter:["VERTEX"],multiple:!0,default_value:"",label:"Target Point",hint:"Select target point"},text:{type:"textarea",default_value:"TEXT HERE",defaultResolver:m(({pmimode:e})=>{const t=e?._opts?.leaderText;return typeof t=="string"&&t.length?t:void 0},"defaultResolver"),label:"Text",hint:"Leader text content",rows:3},anchorPosition:{type:"options",default_value:"Right Middle",options:["Left Top","Left Middle","Left Bottom","Right Top","Right Middle","Right Bottom"],label:"Anchor Position",hint:"Preferred label alignment relative to anchor"},endStyle:{type:"options",default_value:"arrow",options:["arrow","dot"],label:"Leader End",hint:"Choose arrowhead or dot for end marker"}},H=class H extends v{static showContexButton(t){const n=v._collectSelectionRefs(t,["VERTEX"]);return n.length?{params:{target:n}}:!1}constructor(t={}){super(t)}async run(t){this.renderingContext=t;const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams||{},a=Ye();mt(i),i.anchorPosition=yt(i.anchorPosition??i.anchorSide),delete i.anchorSide;const c=n?.viewer,l=c?.partHistory?.scene,u=ht(c,l,i),p=gt(n,i,u,o),d=o?.formatReferenceLabel?o.formatReferenceLabel(i,Fe(i.text)):Fe(i.text);if(i.value=d,p&&o?.updateLabel?.(s,d,p,i),!u.length||!p)return[];const y=a.lineColor??9684477,g=$e(n,c),b=Ue(u)||p,h=Wn(p,b,g),N=Math.max(o?.screenSizeWorld?o.screenSizeWorld(18):q(c,18),1e-4),A=Math.max(o?.screenSizeWorld?o.screenSizeWorld(36):q(c,36),1e-4),x=Vn(u,g,p),D=(x.length-1)*.5;return x.forEach(({point:w,order:S})=>{const T=(S-D)*N,M=p.clone().addScaledVector(h,-A).addScaledVector(g.up,T);if(r.add(Y(w,M,y)),r.add(Y(M,p,y)),i.endStyle==="dot"){const z=a.leaderDotRadiusPx??6,F=o?.screenSizeWorld?o.screenSizeWorld(z):q(c,z),R=Re(Math.max(F,1e-4),a.dotColor??y);R.position.copy(w),r.add(R)}else{const z=w.clone().sub(M);z.lengthSq()||z.copy(h),z.normalize();const F=a.arrowLengthPx??12,R=a.arrowWidthPx??4,L=o?.screenSizeWorld?o.screenSizeWorld(F):q(c,F),Z=o?.screenSizeWorld?o.screenSizeWorld(R):q(c,R);te(r,w,z,L,Z,a.arrowColor??y)}}),[]}static applyParams(t,n,r){return super.applyParams(t,n,r),n.text=Fe(n.text),Array.isArray(n.target)||(n.target=n.target?[String(n.target)]:[]),n.anchorPosition=yt(n.anchorPosition??n.anchorSide),delete n.anchorSide,n.endStyle=Rn(n.endStyle),{paramsPatch:{}}}static onLabelPointerDown(t,n,r,s,o){try{const i=t?.viewer,a=ht(i,i?.partHistory?.scene,r),c=gt(t,r,a,o)||new f,u=$e(t,i,r).forward,p=a&&a.length&&a[0]?a[0]:Ue(a)||c;if(!o?.raycastFromEvent)return;const d=new I().setFromNormalAndCoplanarPoint(u,p);H.dragLabelOnPlane(t,o,{makePlane:m(()=>d,"makePlane"),onDrag:m(y=>{mt(r),r.persistentData.labelWorld=[y.x,y.y,y.z],o.updateLabel(n,null,y,r),t?.refreshAnnotationsUI?.()},"onDrag"),onEnd:m(()=>{try{t?.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}},"onEnd")})}catch{}}};m(H,"LeaderAnnotation"),P(H,"entityType","leader"),P(H,"type","leader"),P(H,"shortName","LEAD"),P(H,"longName","Leader"),P(H,"title","Leader"),P(H,"inputParamsSchema",Ln);let Ie=H;function mt(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(mt,"ensurePersistentData$1");function Fe(e){return typeof e=="string"?e:e==null?"":String(e)}m(Fe,"sanitizeText$1");function yt(e){const t=new Set(["Left Top","Left Middle","Left Bottom","Right Top","Right Middle","Right Bottom"]);if(typeof e=="string"){const n=e.trim();if(t.has(n))return n;const r=n.toLowerCase();if(r==="left")return"Left Middle";if(r==="right")return"Right Middle";if(r==="left-top"||r==="lefttop")return"Left Top";if(r==="left-bottom"||r==="leftbottom")return"Left Bottom";if(r==="right-top"||r==="righttop")return"Right Top";if(r==="right-bottom"||r==="rightbottom")return"Right Bottom"}if(e&&typeof e=="object"){const n=String(e.label||e.value||e.name||"").trim();if(t.has(n))return n}return"Right Middle"}m(yt,"normalizeAnchorPosition$1");function Rn(e){return e==="dot"?"dot":"arrow"}m(Rn,"normalizeEndStyle");function ht(e,t,n){const r=Array.isArray(n?.target)?n.target:[];if(!r.length||!t)return[];const s=[],o=new Set;for(const i of r){const a=typeof i=="string"?i:String(i??"");if(!(!a||o.has(a))){o.add(a);try{const c=t.getObjectByName?.(a);if(!c)continue;let l=E(e,c);!l&&typeof c.getWorldPosition=="function"&&(l=c.getWorldPosition(new f)),l&&s.push(l.clone())}catch{}}}return s}m(ht,"resolveTargetPoints");function gt(e,t,n,r){const s=e?.viewer,o=$e(e,s),i=n&&n.length&&n[0]?n[0].clone():Ue(n)||new f,a=o?.forward&&o.forward.lengthSq()?o.forward.clone():new f(0,0,1),c=new I().setFromNormalAndCoplanarPoint(a,i),l=Bn(t?.persistentData?.labelWorld);if(l){const b=l.clone();return c.projectPoint(b,b),b}const u=Math.max(r?.screenSizeWorld?r.screenSizeWorld(90):q(s,90),1e-4),p=Math.max(r?.screenSizeWorld?r.screenSizeWorld(36):q(s,36),1e-4),d=o?.right&&o.right.lengthSq()?o.right.clone():new f(1,0,0),y=o?.up&&o.up.lengthSq()?o.up.clone():new f(0,1,0),g=i.clone().addScaledVector(d,u).addScaledVector(y,p);return c.projectPoint(g,g),g}m(gt,"resolveLabelPosition");function $e(e,t,n){const r=On(e?.viewEntry?.camera);if(r)return r;const s=new f(0,0,-1),o=new f(0,1,0);try{t?.camera?.getWorldDirection&&(t.camera.getWorldDirection(s),s.normalize()),t?.camera?.up&&o.copy(t.camera.up).normalize()}catch{}s.lengthSq()||s.set(0,0,-1),o.lengthSq()||o.set(0,1,0);const i=new f().crossVectors(s,o);i.lengthSq()||(Math.abs(s.z)<.9?o.set(0,0,1):o.set(1,0,0),i.crossVectors(s,o)),i.normalize();const a=new f().crossVectors(i,s);a.lengthSq()||a.copy(o.lengthSq()?o:new f(0,1,0)),a.normalize();const c=s.clone().normalize();return{right:i,up:a,forward:c}}m($e,"computeViewBasis$1");function Wn(e,t,n){try{const s=e.clone().sub(t||new f);if(s.lengthSq()>1e-10)return s.normalize()}catch{}const r=n?.right?.clone?.()||new f(1,0,0);return r.lengthSq()||r.set(1,0,0),r.normalize()}m(Wn,"computeShoulderDirection");function Vn(e,t,n){if(!e.length)return[];const r=t?.up&&t.up.lengthSq()?t.up:new f(0,1,0),s=e.map((o,i)=>{const c=o.clone().sub(n||new f).dot(r);return{point:o,metric:c,index:i}});return s.sort((o,i)=>o.metric-i.metric),s.map((o,i)=>({point:o.point,order:i}))}m(Vn,"sortTargetsByViewUp");function On(e){if(!e||typeof e!="object")return null;const t=_n(e);if(!t)return null;const n=new f(0,0,-1).applyQuaternion(t);if(!n.lengthSq())return null;const r=new f(0,1,0).applyQuaternion(t);let s=new f().crossVectors(n,r);s.lengthSq()||(s=new f().crossVectors(n,new f(0,1,0))),s.lengthSq()||s.set(1,0,0),s.normalize();const o=new f().crossVectors(s,n);o.lengthSq()||o.copy(r.lengthSq()?r:new f(0,1,0)),o.normalize();const i=n.clone().normalize();return{right:s,up:o,forward:i}}m(On,"basisFromSavedCamera");function _n(e){const t=e?.quaternion||e?.camera?.quaternion;if(Array.isArray(t)&&t.length>=4){const[s,o,i,a]=t;if([s,o,i,a].every(c=>Number.isFinite(c)))return new V(s,o,i,a).normalize()}if(t&&typeof t=="object"){const s=Number(t.x),o=Number(t.y),i=Number(t.z),a=Number(t.w);if([s,o,i,a].every(c=>Number.isFinite(c)))return new V(s,o,i,a).normalize()}const n=e?.worldMatrix||e?.cameraMatrix||e?.matrix,r=Array.isArray(n?.elements)?n.elements:n;if(Array.isArray(r)&&r.length===16){const s=new de().fromArray(r),o=new f,i=new V,a=new f;return s.decompose(o,i,a),i.normalize()}return null}m(_n,"quaternionFromSnapshot");function Bn(e){if(!e&&e!==0)return null;if(e instanceof f)return e.clone();if(Array.isArray(e)&&e.length>=3){const[t,n,r]=e;return[t,n,r].some(s=>typeof s!="number"||!Number.isFinite(s))?null:new f(t,n,r)}if(typeof e=="object"){const t=Number(e.x),n=Number(e.y),r=Number(e.z);if([t,n,r].every(s=>Number.isFinite(s)))return new f(t,n,r)}return null}m(Bn,"vectorFromAny");function Ue(e){if(!e||!e.length)return null;const t=new f;return e.forEach(n=>t.add(n)),t.multiplyScalar(1/e.length)}m(Ue,"averageTargets");const Cn={id:{type:"string",default_value:null,hint:"unique identifier for the note"},text:{type:"string",default_value:"",defaultResolver:m(({pmimode:e})=>{const t=e?._opts?.noteText;return typeof t=="string"?t:void 0},"defaultResolver"),hint:"Note text content"},position:{type:"object",default_value:null,hint:"3D position of the note marker"}},k=class k extends v{static showContexButton(t){const n=v._normalizeSelectionItems(t);if(!n.length)return!1;const r=n[0],s=E(null,r);return s?{params:{position:{x:s.x,y:s.y,z:s.z}}}:!1}constructor(t={}){super(t)}async run(t){const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams,a=Ye(),c=new f(i.position?.x||0,i.position?.y||0,i.position?.z||0),l=new Ht(a.noteDotRadius??.08,16,12),u=new kt({color:a.noteDotColor??a.dotColor??9684477,depthTest:!1,depthWrite:!1,transparent:!0}),p=new Gt(l,u);p.position.copy(c),r.add(p);const d=String(i.text||"");if(!d)return[];let y=null;if(i.labelWorld)y=new f(i.labelWorld.x,i.labelWorld.y,i.labelWorld.z);else{const g=o.alignNormal("view",i),b=new f,h=new f(0,1,0);try{n.viewer?.camera?.getWorldDirection?.(b),b.crossVectors(g,h).normalize()}catch{b.set(1,0,0)}const N=o.screenSizeWorld(16);y=c.clone().addScaledVector(b,N).addScaledVector(g,N*.25)}return o.updateLabel(s,d,y,i),[]}static getSchema(t,n){const r={text:{type:"string",label:"Text",default_value:n.text||""}},s={text:r.text.default_value};return{schema:r,params:s}}static applyParams(t,n,r){return super.applyParams(t,n,r),n.text=jn(n.text),{paramsPatch:{}}}static onLabelPointerDown(t,n,r,s,o){try{if(!t.viewer?.camera)return;const c=o.alignNormal?o.alignNormal(r.alignment||"view",r):new f(0,0,1),l=r.labelWorld?new f(r.labelWorld.x,r.labelWorld.y,r.labelWorld.z):new f(r.position?.x||0,r.position?.y||0,r.position?.z||0),u=new I().setFromNormalAndCoplanarPoint(c,l);k.dragLabelOnPlane(t,o,{makePlane:m(()=>u,"makePlane"),onDrag:m(p=>{r.labelWorld={x:p.x,y:p.y,z:p.z};try{o.updateLabel(n,null,p,r)}catch{}},"onDrag"),onEnd:m(()=>{try{t?.viewer?.controls&&(t.viewer.controls.enabled=!0)}catch{}},"onEnd")})}catch{}}};m(k,"NoteAnnotation"),P(k,"entityType","note"),P(k,"type","note"),P(k,"shortName","NOTE"),P(k,"longName","Note"),P(k,"title","Note"),P(k,"inputParamsSchema",Cn);let Xe=k;function jn(e){return typeof e=="string"?e:e==null?"":String(e)}m(jn,"sanitizeText");const In={id:{type:"string",default_value:null,hint:"unique identifier for the view transform"},targets:{type:"reference_selection",multiple:!0,default_value:[],label:"Target Objects",selectionFilter:["SOLID","COMPONENT"],hint:"Choose the solids or components to reposition in this view"},transform:{type:"transform",label:"Transform",hint:"Translation and rotation applied relative to the reference point"},showTraceLine:{type:"boolean",default_value:!0,label:"Show trace lines",hint:"Draw a line from the original position to the transformed position"}},W=class W extends v{static showContexButton(t){const n=v._collectSelectionRefs(t,["SOLID","COMPONENT"]);return n.length?{params:{targets:n}}:!1}constructor(t={}){super(t)}async run(t){const{pmimode:n,group:r}=t;if(!n||!r)return[];const s=this.inputParams||{};wt(s),s.transform=qe(s.transform);const o=W._resolveSolidReferences(s,n,!0);if(!o.length)return[];const i=W._ensureOriginalSnapshots(s,o,!1,n?.viewer),a=s.showTraceLine!==!1;let c=n?.__explodeTraceState;c instanceof Map||(c=new Map,n&&(n.__explodeTraceState=c));const l=O(s.transform.position,new f(0,0,0)),u=Pt(s.transform.rotationEuler),p=O(s.transform.scale,new f(1,1,1));return o.forEach(d=>{try{const y=i.get(d.uuid),g=O(y?.centerLocal)||Wt(d),b=c?.get(d.uuid)?.clone()||kn(y),h=At(b,g)||O(y?.centerWorld)||O(y?.worldPosition),N=Gn(b,l,u,p),A=At(N,g)||Hn(d);Nt(h)&&Nt(A)&&h.distanceToSquared(A)>=1e-8&&a&&r.add(Yt(h,A,16098596,{viewer:n?.viewer})),c?.set(d.uuid,N)}catch{}}),[]}static _resolveSolidReferences(t,n,r=!1){if(!t||!n)return[];const s=n.viewer,o=s?.partHistory?.scene||s?.scene;if(!o)return[];if(!r&&Array.isArray(t.__resolvedSolids)&&t.__resolvedSolids.length){const c=t.__resolvedSolids.filter(l=>l&&l.isObject3D);return ie(t,"__resolvedSolids",c),ie(t,"solids",c),c}const i=Array.isArray(t.targets)?t.targets:[],a=[];return i.forEach(c=>{const l=Un(c,o);l&&l.isObject3D&&a.push(l)}),ie(t,"__resolvedSolids",a),ie(t,"solids",a),a}static _ensureOriginalSnapshots(t,n,r=!1,s=null){wt(t);let o=t.__originalSnapshots;return o instanceof Map||(o=xt(t.persistentData?.originalTransforms)),o instanceof Map||(o=new Map),(Array.isArray(n)?n:[]).forEach(a=>{!a||!a.uuid||(r||!o.has(a.uuid))&&o.set(a.uuid,St(a,s))}),ie(t,"__originalSnapshots",o),t.persistentData.originalTransforms=Xn(o),o}static getOriginalSnapshotMap(t){if(!t)return new Map;if(t.__originalSnapshots instanceof Map)return t.__originalSnapshots;const n=xt(t?.persistentData?.originalTransforms);return ie(t,"__originalSnapshots",n instanceof Map?n:new Map),t.__originalSnapshots}static applyTransformsToSolids(t,n,r={}){if(!t||!n)return;const s=W._resolveSolidReferences(t,n,!0);if(!s.length)return;const o=r&&r.startSnapshots instanceof Map?r.startSnapshots:W.getOriginalSnapshotMap(t),i=r?.cumulativeState instanceof Map?r.cumulativeState:null,a=qe(t.transform);t.transform=a;const c=O(a.position,new f(0,0,0)),l=Pt(a.rotationEuler),u=O(a.scale,new f(1,1,1));s.forEach(p=>{if(!p||!p.uuid)return;const d=o.get(p.uuid)||W.getOriginalSnapshotMap(t).get(p.uuid)||St(p,n?.viewer);if(!d)return;const y=O(d.position,new f(0,0,0)),g=ke(d.quaternion,new V),b=O(d.scale,new f(1,1,1)),h=y.clone().add(c),N=g.clone().multiply(l),A=b.clone().multiply(u);if(p.position.copy(h),p.quaternion.copy(N),p.scale.copy(A),p.updateMatrixWorld(!0),i){const x=p.getWorldPosition(new f);i.set(p.uuid,{position:h.toArray(),quaternion:N.toArray(),scale:A.toArray(),worldPosition:x.toArray()})}})}static restoreOriginalTransforms(t,n){if(!t||!n)return;const r=W._resolveSolidReferences(t,n,!0);if(!r.length)return;const s=W.getOriginalSnapshotMap(t);r.forEach(o=>{if(!o||!o.uuid)return;const i=s.get(o.uuid);if(!i)return;const a=O(i.position,new f(0,0,0)),c=ke(i.quaternion,new V),l=O(i.scale,new f(1,1,1));o.position.copy(a),o.quaternion.copy(c),o.scale.copy(l),o.updateMatrixWorld(!0)})}static applyParams(t,n,r){super.applyParams(t,n,r),n.targets=$n(n.targets),n.transform=qe(n.transform),n.showTraceLine=n.showTraceLine!==!1;try{t&&typeof t.applyViewTransformsSequential=="function"&&t.applyViewTransformsSequential()}catch{}return{paramsPatch:{}}}};m(W,"ExplodeBodyAnnotation"),P(W,"entityType","exp"),P(W,"type","exp"),P(W,"shortName","EXP"),P(W,"longName","Explode Body"),P(W,"title","Explode Body"),P(W,"inputParamsSchema",In),P(W,"aliases",["viewTransform"]);let He=W;function wt(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(wt,"ensurePersistent");function ie(e,t,n){if(!(!e||typeof e!="object"))try{Object.defineProperty(e,t,{value:n,configurable:!0,enumerable:!1,writable:!0})}catch{e[t]=n}}m(ie,"setHiddenProperty");function qe(e){const t=e&&typeof e=="object"?e:{},n=m((r,s)=>{if(!Array.isArray(r))return s.slice();const o=s.slice();for(let i=0;i<o.length;i+=1){const a=Number(r[i]);o[i]=Number.isFinite(a)?a:o[i]}return o},"sanitizeArray");return{position:n(t.position,[0,0,0]),rotationEuler:n(t.rotationEuler,[0,0,0]),scale:n(t.scale,[1,1,1])}}m(qe,"sanitizeTransform");function $n(e){return Array.isArray(e)?e.map(t=>t==null?"":String(t).trim()).filter(t=>t.length):[]}m($n,"arrayOfStrings");function Un(e,t){if(!t||!e&&e!==0)return null;let n=null;if(typeof e=="string"&&e.trim().length){const s=e.trim();if(s[0]==="{")try{n=JSON.parse(s)}catch{n={name:s}}else n={name:s}}else typeof e=="object"&&(n={...e});if(!n)return null;const r=[];n.name&&typeof n.name=="string"&&r.push(n.name.trim()),Array.isArray(n.path)&&n.path.length&&r.push(String(n.path[n.path.length-1]));for(const s of r){if(!s)continue;const o=t.getObjectByName(s);if(o&&o.type==="SOLID"||o)return o}if(typeof n.uuid=="string"){const s=t.getObjectByProperty("uuid",n.uuid);if(s)return s;const o=bt(t,i=>i?.userData?.__pmiExportSourceUuid===n.uuid);if(o)return o}if(Number.isInteger(n.id)){try{const o=t.getObjectById(n.id);if(o)return o}catch{}const s=bt(t,o=>o?.userData?.__pmiExportSourceId===n.id);if(s)return s}return null}m(Un,"resolveSolidObject");function bt(e,t){if(!e?.traverse||typeof t!="function")return null;let n=null;return e.traverse(r=>{if(!(n||!r?.isObject3D))try{t(r)&&(n=r)}catch{}}),n}m(bt,"findExportCloneMatch");function St(e,t=null){try{e.updateMatrixWorld(!0)}catch{}const n=e.position.clone(),r=e.quaternion.clone(),s=e.scale.clone(),o=e.getWorldPosition(new f),i=Wt(e),a=i.clone().applyMatrix4(new de().compose(n.clone(),r.clone(),s.clone()));return{position:n.toArray(),quaternion:r.toArray(),scale:s.toArray(),worldPosition:o.toArray(),centerWorld:a.toArray(),centerLocal:i.toArray()}}m(St,"captureSnapshot");function xt(e){if(!Array.isArray(e))return new Map;const t=new Map;return e.forEach(n=>{!n||typeof n!="object"||!n.uuid||t.set(n.uuid,{position:j(n.position,[0,0,0]),quaternion:j(n.quaternion,[0,0,0,1]),scale:j(n.scale,[1,1,1]),worldPosition:j(n.worldPosition,null),centerWorld:j(n.centerWorld,null),centerLocal:j(n.centerLocal,null)})}),t}m(xt,"snapshotArrayToMap");function Xn(e){if(!(e instanceof Map))return[];const t=[];return e.forEach((n,r)=>{r&&t.push({uuid:r,position:j(n.position,[0,0,0]),quaternion:j(n.quaternion,[0,0,0,1]),scale:j(n.scale,[1,1,1]),worldPosition:j(n.worldPosition,null),centerWorld:j(n.centerWorld,null),centerLocal:j(n.centerLocal,null)})}),t}m(Xn,"snapshotMapToArray");function j(e,t){if(Array.isArray(e))return e.slice();if(e&&typeof e=="object"&&typeof e.length=="number"){const n=[];for(let r=0;r<e.length;r+=1)n.push(Number(e[r]));return n}return e&&typeof e.x=="number"&&typeof e.y=="number"&&typeof e.z=="number"?typeof e.w=="number"?[e.x,e.y,e.z,e.w]:[e.x,e.y,e.z]:t&&t.slice()}m(j,"toArray");function O(e,t){if(e instanceof f)return e.clone();if(Array.isArray(e)&&e.length>=3){const n=Number(e[0]),r=Number(e[1]),s=Number(e[2]);if([n,r,s].every(o=>Number.isFinite(o)))return new f(n,r,s)}return e&&typeof e=="object"&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z)?new f(e.x,e.y,e.z):t&&t.isVector3?t.clone():new f}m(O,"vectorFromArray");function ke(e,t){if(Array.isArray(e)&&e.length>=4){const n=Number(e[0]),r=Number(e[1]),s=Number(e[2]),o=Number(e[3]);if([n,r,s,o].every(i=>Number.isFinite(i)))return new V(n,r,s,o)}return e&&typeof e=="object"&&Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z)&&Number.isFinite(e.w)?new V(e.x,e.y,e.z,e.w):t&&t.isQuaternion?t.clone():new V}m(ke,"quaternionFromArray");function Pt(e){const t=Array.isArray(e)?e:[0,0,0],n=Number(t[0])||0,r=Number(t[1])||0,s=Number(t[2])||0;try{return new V().setFromEuler(new Qt(Se.degToRad(n),Se.degToRad(r),Se.degToRad(s),"XYZ"))}catch{return new V}}m(Pt,"quaternionFromEuler");function Wt(e){try{if(!e)return new f;e.updateMatrixWorld?.(!0);const t=new Tt().setFromObject(e);if(!t.isEmpty()){const r=t.getCenter(new f).clone();return e.worldToLocal(r),r}}catch{}return new f}m(Wt,"getSolidLocalCenter");function Hn(e){try{if(!e)return new f;e.updateMatrixWorld?.(!0);const t=new Tt().setFromObject(e);if(!t.isEmpty())return t.getCenter(new f)}catch{}try{return e.getWorldPosition(new f)}catch{return new f}}m(Hn,"getSolidWorldCenter");function Nt(e){return!e||!e.isVector3?!1:Number.isFinite(e.x)&&Number.isFinite(e.y)&&Number.isFinite(e.z)}m(Nt,"isFiniteVec3");function kn(e){if(!e||typeof e!="object")return pe(new f,new V,new f(1,1,1));const t=O(e.position,new f),n=ke(e.quaternion,new V),r=O(e.scale,new f(1,1,1));return pe(t,n,r)}m(kn,"transformEntryFromSnapshot");function Gn(e,t,n,r){const s=e||pe(new f,new V,new f(1,1,1)),o=s.position.clone().add(t||new f),i=s.quaternion.clone().multiply(n||new V),a=s.scale.clone().multiply(r||new f(1,1,1));return pe(o,i,a)}m(Gn,"composeTransformEntry");function At(e,t){if(!e||!t||!t.isVector3)return null;const n=new de().compose(e.position.clone(),e.quaternion.clone(),e.scale.clone());return t.clone().applyMatrix4(n)}m(At,"applyTransformEntryToPoint");function pe(e,t,n){return{position:e.clone(),quaternion:t.clone(),scale:n.clone(),clone(){return pe(this.position,this.quaternion,this.scale)}}}m(pe,"makeTransformEntry");const Qn={id:{type:"string",default_value:null,label:"ID",hint:"unique identifier for the hole callout"},target:{type:"reference_selection",selectionFilter:["VERTEX","EDGE","FACE"],multiple:!1,default_value:"",label:"Target",hint:"Pick the hole edge/vertex/face to call out"},quantity:{type:"number",default_value:0,label:"Quantity",hint:"Number of identical holes this callout represents (0 = auto from feature)",min:0},showQuantity:{type:"boolean",default_value:!0,label:"Show Quantity",hint:"Include the hole count in the callout label"},beforeText:{type:"string",default_value:"",label:"Text Before",hint:"Optional text to show before the callout"},afterText:{type:"string",default_value:"",label:"Text After",hint:"Optional text to show after the callout"},anchorPosition:{type:"options",default_value:"Right Top",options:["Left Top","Left Middle","Left Bottom","Right Top","Right Middle","Right Bottom"],label:"Anchor Position",hint:"Preferred label alignment relative to anchor"}},G=class G extends v{static showContexButton(t){const n=v._normalizeSelectionItems(t),r=new Set(["VERTEX","EDGE","FACE"]);for(const s of n){if(!v._isSelectionType(s,r)||!Kn(s))continue;const o=v._selectionRefName(s);if(o)return{params:{target:o}}}return!1}constructor(t={}){super(t)}async run(t){this.renderingContext=t;const{pmimode:n,group:r,idx:s,ctx:o}=t,i=this.inputParams||{},a=n?.viewer,c=a?.partHistory?.scene,l=Dt(a,i.target),u=E(c,l),p=Yn(a?.partHistory,l,u,i.target),d=p?.center?xe(p.center):u;if(!d)return[];const y=sr(i,p,a?.partHistory),g=p?Jn(p,y,{showQuantity:i.showQuantity!==!1,beforeText:i.beforeText,afterText:i.afterText}):"";i.value=g;const b=zt(a),h=o?.screenSizeWorld?o.screenSizeWorld(80):q(a,80),N=o?.screenSizeWorld?o.screenSizeWorld(30):q(a,30),x=xe(i?.persistentData?.labelWorld)||d.clone().addScaledVector(b.right,er(i.anchorPosition||"Right Top")*h).addScaledVector(b.up,tr(i.anchorPosition||"Right Top")*N);o?.updateLabel&&o.updateLabel(s,g,x,i);const D=Ye(),w=D.lineColor??16771584;r.add(Y(x,d,w));const S=D.arrowLengthPx??12,T=D.arrowWidthPx??4,M=o?.screenSizeWorld?o.screenSizeWorld(S):q(a,S),z=o?.screenSizeWorld?o.screenSizeWorld(T):q(a,T),F=d.clone().sub(x);return F.lengthSq()>1e-12&&(F.normalize(),te(r,d,F,M,z,D.arrowColor??w)),[]}static applyParams(t,n,r){super.applyParams(t,n,r);const s=Number(n?.quantity);return n.quantity=Number.isFinite(s)?Math.max(0,Math.round(s)):1,n.showQuantity=n.showQuantity!==!1,n.beforeText=De(n.beforeText),n.afterText=De(n.afterText),n.anchorPosition=nr(n.anchorPosition),{paramsPatch:{}}}static onLabelPointerDown(t,n,r,s,o){const i=t?.viewer,a=Dt(i,r.target),c=i?.partHistory?.scene,l=E(c,a)||xe(r?.persistentData?.labelWorld);if(!l)return;const p=zt(i).forward;if(!o?.raycastFromEvent)return;const d=new I().setFromNormalAndCoplanarPoint(p,l);G.dragLabelOnPlane(t,o,{makePlane:m(()=>d,"makePlane"),suspendControls:!0,onDrag:m(y=>{or(r),r.persistentData.labelWorld=[y.x,y.y,y.z],o.updateLabel(n,null,y,r),t?.refreshAnnotationsUI?.()},"onDrag")})}};m(G,"HoleCalloutAnnotation"),P(G,"entityType","holeCallout"),P(G,"type","holeCallout"),P(G,"shortName","HOLE"),P(G,"longName","Hole Callout"),P(G,"title","Hole Callout"),P(G,"inputParamsSchema",Qn);let Ge=G;function Dt(e,t){if(!e||!t)return null;const n=e.partHistory?.scene;if(!n)return null;if(typeof t=="string"){const r=n.getObjectByName?.(t);if(r)return r;const s=Pe(t);for(const i of s){const a=n.getObjectByName?.(i);if(a)return a}let o=null;try{n.traverse(i=>{if(o)return;const a=i?.name?String(i.name):"";if(a){for(const c of s)if(c&&(a===c||a.endsWith(c)||a.includes(c))){o=i;return}}})}catch{}if(o)return o}return typeof t=="object"?t:n.getObjectByName?.(String(t))||null}m(Dt,"resolveTargetObject");function Yn(e,t,n,r=null){const s=Array.isArray(e?.features)?e.features:[],o=[];for(const u of s){const p=Array.isArray(u?.persistentData?.holes)?u.persistentData.holes:[];for(const d of p)o.push(d)}if(!o.length)return null;const i=t?.userData?.hole||t?.userData?.metadata?.hole;if(i)return i;if(t?.parent){const u=t.parent.userData?.hole||t.parent.userData?.metadata?.hole;if(u)return u}const a=t?.uuid||t?.id||t?.name||null,c=Pe(r,a);if(t?.name)for(const u of Pe(t.name))c.add(u);const l=o.filter(u=>{const p=u?.sourceName?String(u.sourceName):null,d=u?.featureId?String(u.featureId):null,y=u?.targetId?String(u.targetId):null;return p&&c.has(p)||d&&c.has(d)||y&&c.has(y)});if(l.length===1)return l[0];if(l.length>1&&n){const u=ee(l,n);if(u)return u}if(a){const u=o.filter(p=>p?.targetId&&String(p.targetId)===String(a));if(u.length===1)return u[0];if(u.length>1&&n){const p=ee(u,n);if(p)return p}}if(r){const u=String(r),p=o.filter(d=>{const y=d?.featureId?String(d.featureId):"",g=d?.sourceName?String(d.sourceName):"";return y&&u.includes(y)||g&&u.includes(g)});if(p.length===1)return p[0];if(p.length>1&&n){const d=ee(p,n);if(d)return d}}if(c.size){const u=o.filter(p=>{const d=p?.featureId?String(p.featureId):"",y=p?.sourceName?String(p.sourceName):"",g=p?.targetId?String(p.targetId):"";return c.has(d)||c.has(y)||c.has(g)});if(u.length===1)return u[0];if(u.length>1&&n){const p=ee(u,n);if(p)return p}}if(n){const u=ee(o,n);if(u)return u}if(t?.parent){const u=Pe(t.parent.name),p=o.filter(d=>{const y=d?.featureId?String(d.featureId):"",g=d?.sourceName?String(d.sourceName):"",b=d?.targetId?String(d.targetId):"";return u.has(y)||u.has(g)||u.has(b)});if(p.length===1)return p[0];if(p.length>1&&n){const d=ee(p,n);if(d)return d}}if(n){const u=ee(o,n);if(u)return u}return o[0]}m(Yn,"findHoleDescriptor");function Zn(e){if(!e)return null;const t=e.userData||null;if(t?.hole)return t.hole;if(t?.metadata?.hole)return t.metadata.hole;if(typeof e.getMetadata=="function")try{const s=e.getMetadata();if(s?.hole)return s.hole;if(s?.metadata?.hole)return s.metadata.hole}catch{}const n=e?.name||t?.faceName||null,r=e?.parentSolid||t?.parentSolid||null;if(n&&r&&typeof r.getFaceMetadata=="function")try{const s=r.getFaceMetadata(n);if(s?.hole)return s.hole}catch{}return null}m(Zn,"readHoleMetadata");function Kn(e){if(!e)return!1;const t=[e],n=new Set,r=m(s=>Object.prototype.hasOwnProperty.call(s,"faces"),"hasOwnFaces");for(;t.length;){const s=t.shift();if(!(!s||n.has(s))){if(n.add(s),Zn(s))return!0;if(r(s)&&Array.isArray(s.faces))for(const o of s.faces)t.push(o);else if(s.type==="SOLID"||s.type==="COMPONENT"){const o=Array.isArray(s.children)?s.children:[];for(const i of o)i&&i.type==="FACE"&&t.push(i)}s.parent&&t.push(s.parent)}}return!1}m(Kn,"hasHoleMetadata");function Jn(e,t=1,n={}){if(!e)return"";const r=[],s=De(n.beforeText);s&&r.push(s);const i=n.showQuantity!==!1&&t>1?`${t}× `:"",a=Number(e.totalDepth??e.straightDepth),c=!e.throughAll&&a>0?` ↧ ${ae(a)}`:e.throughAll?" THRU ALL":"";r.push(`${i}⌀${ae(e.diameter)}${c}`),e.type==="COUNTERSINK"?r.push(`⌵ ⌀${ae(e.countersinkDiameter)} × ${ae(e.countersinkAngle,0)}°`):e.type==="COUNTERBORE"&&r.push(`⌴ ⌀${ae(e.counterboreDiameter)} ↧ ${ae(e.counterboreDepth)}`);const l=rr(e?.thread);l&&r.push(l);const u=De(n.afterText);return u&&r.push(u),r.join(`
2
2
  `)}m(Jn,"formatHoleCallout");function zt(e){const t=e?.camera,n=new f;t?.getWorldDirection?t.getWorldDirection(n):n.set(0,0,-1),n.normalize();const r=t?.up?t.up.clone():new f(0,1,0),s=new f().crossVectors(n,r).normalize(),o=new f().crossVectors(s,n).normalize();return{forward:n,right:s,up:o}}m(zt,"computeViewBasis");function er(e){return String(e).startsWith("Left")?-1:1}m(er,"anchorSign");function tr(e){return e.includes("Bottom")?-1:e.includes("Middle")?0:1}m(tr,"anchorVertical");function nr(e){return new Set(["Left Top","Left Middle","Left Bottom","Right Top","Right Middle","Right Bottom"]).has(e)?e:"Right Top"}m(nr,"normalizeAnchorPosition");function ae(e,t=2){const n=Number(e);return Number.isFinite(n)?n.toFixed(t):""}m(ae,"fmt");function rr(e){if(!e||!e.designation)return"";let t=String(e.designation).replace(/\s+/g,"").toUpperCase();const n=e.series?String(e.series).toUpperCase():"";return n&&!t.includes(n)&&(t+=n),`THREAD ${t}`}m(rr,"formatThreadLine");function xe(e){if(!Array.isArray(e)||e.length<3)return null;const[t,n,r]=e;return[t,n,r].every(s=>Number.isFinite(Number(s)))?new f(Number(t),Number(n),Number(r)):null}m(xe,"arrToVec");function or(e){(!e.persistentData||typeof e.persistentData!="object")&&(e.persistentData={})}m(or,"ensurePersistentData");function De(e){if(e==null)return"";const t=String(e).trim();return t.length?t:""}m(De,"normalizeAddonText");function Pe(e,t=null){const n=new Set,r=m(s=>{if(s==null)return;const o=String(s);if(!o)return;n.add(o);const i=o.match(/\[(.*?)\]/);if(i&&i[1]){const c=i[1];n.add(c);const l=c.replace(/_AXIS_\d+$/,"");l&&l!==c&&n.add(l)}const a=o.replace(/_AXIS_\d+$/,"");a&&a!==o&&n.add(a)},"push");return r(e),r(t),n}m(Pe,"normalizeTargetTokens");function ee(e,t){if(!Array.isArray(e)||!e.length||!t)return null;let n=null,r=1/0;for(const s of e){const o=xe(s?.center);if(!o)continue;const i=o.distanceToSquared(t);i<r&&(r=i,n=s)}return n}m(ee,"nearestDescriptor");function sr(e,t,n){const r=Number(e?.quantity),s=Number.isFinite(r)?Math.round(r):1;if(s>0)return s;const o=ir(n,t);return Number.isFinite(o)&&o>0?o:1}m(sr,"resolveHoleQuantity");function ir(e,t){if(!e||!t)return null;const n=Array.isArray(e.features)?e.features:[],r=t.featureId||null;let s=null;for(const o of n){const i=Array.isArray(o?.persistentData?.holes)?o.persistentData.holes:[];if(!i.length)continue;if(i.includes(t))return i.length;const a=ar(o);r&&a&&String(a)===String(r)&&(s=i.length)}return s}m(ir,"countFeatureHoles");function ar(e){if(!e||typeof e!="object")return null;const t=e.inputParams||{};return e.id??t.id??t.featureID??null}m(ar,"resolveFeatureId");const Le=m(e=>!e&&e!==0?"":String(e).trim().toLowerCase(),"normalizeKey"),et=class et{constructor(){this._map=new Map,this._aliases=new Map}register(t){if(!t)return;if(typeof t=="function"){const r=t;r.shortName||(r.shortName=r.featureShortName||r.name||r.type||"ANN"),r.longName||(r.longName=r.featureName||r.name||r.shortName||r.type||"Annotation"),typeof r.showContexButton!="function"&&(r.showContexButton=()=>!1)}const n=Le(t.type||t.shortName||t.featureShortName||t.name||t.longName||t.featureName);if(n&&(this._map.set(n,t),Array.isArray(t.aliases)))for(const r of t.aliases){const s=Le(r);s&&this._aliases.set(s,t)}}get(t){const n=Le(t);if(!n)throw new Error("Annotation type must be a non-empty string");const r=this._map.get(n)||this._aliases.get(n);if(!r)throw new Error(`Annotation type "${t}" is not registered.`);return r}getSafe(t){try{return this.get(t)}catch{return null}}has(t){return!!this.getSafe(t)}list(){return Array.from(this._map.values())}};m(et,"AnnotationRegistry");let Qe=et;const ne=new Qe;ne.register(Ve);ne.register(_e);ne.register(je);ne.register(Ie);ne.register(Xe);ne.register(He);ne.register(Ge);export{ne as a,ln as b,an as c,Ne as d,on as i,Ze as p,Mt as r,We as t};