import{m as D}from"./index-BkFzql5p.js";import"./vendor-react-7jnMmQ9s.js";import"./vendor-ui-CtsphK4U.js";import"./vendor-icons-FFp724MI.js";import"./vendor-three-SYzIooV9.js";const v=Object.freeze([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function u(t,e){return Array.from(t?.childNodes||[]).filter(r=>r?.nodeType===1&&r.tagName===e)}function g(t,e,r){if(typeof t!="string"||!t.trim())return[...r];const n=t.trim().split(/\s+/).map(i=>Number(i));if(n.length!==e||n.some(i=>!Number.isFinite(i)))throw new Error(`Expected ${e} numeric values, received ${JSON.stringify(t)}`);return n}function L(t,e,r){if(typeof t!="string"||!t.trim())throw new Error(`${r} must declare ${e} numeric values`);const n=t.trim().split(/\s+/).map(i=>Number(i));if(n.length!==e||n.some(i=>!Number.isFinite(i)))throw new Error(`${r} must declare ${e} numeric values`);return n}function S(t,e,r){const n=Number(t?.getAttribute(e));if(!Number.isFinite(n)||n<=0)throw new Error(`${r} must declare a positive ${e}`);return n}function T(t,e,r){return[1,0,0,t,0,1,0,e,0,0,1,r,0,0,0,1]}function j(t,e,r){return[t,0,0,0,0,e,0,0,0,0,r,0,0,0,0,1]}function x(t,e,r){const n=Math.sin(t),i=Math.cos(t),o=Math.sin(e),a=Math.cos(e),c=Math.sin(r),m=Math.cos(r);return[m*a,m*o*n-c*i,m*o*i+c*n,0,c*a,c*o*n+m*i,c*o*i-m*n,0,-o,a*n,a*i,0,0,0,0,1]}function U(t){if(!t)return[...v];const[e,r,n]=g(t.getAttribute("xyz"),3,[0,0,0]),[i,o,a]=g(t.getAttribute("rpy"),3,[0,0,0]);return D(T(e,r,n),x(i,o,a))}function z(t){const[e,r,n]=g(t?.getAttribute("scale"),3,[1,1,1]);return j(e,r,n)}function A(t){return t instanceof URL?t.toString():new URL(t,globalThis.window?.location?.href||"http://localhost/").toString()}function M(t){try{const e=new URL(String(t||""));return!!(e.origin&&e.origin!=="null")}catch{return!1}}function O(t){const e=String(t||"").trim();return!e||e.startsWith("package://")?!1:M(e)}function P(t,{filename:e,sourceUrl:r}){return M(r)||O(e)?t.toString():`${t.pathname}${t.search}`}function E(t){const e=String(t||"").replace(/\\/g,"/"),r=e.startsWith("/"),n=[];for(const i of e.split("/"))if(!(!i||i===".")){if(i===".."){n.length&&n[n.length-1]!==".."?n.pop():r||n.push(i);continue}n.push(i)}return`${r?"/":""}${n.join("/")}`}function C(t){const e=String(t||"").replace(/\\/g,"/"),r=e.lastIndexOf("/");return r>=0?e.slice(0,r+1):""}function J(t,e){const r=String(e||"").trim();return!r||/^[a-z][a-z0-9+.-]*:/i.test(r)?"":r.startsWith("/")?E(r):E(`${C(t)}${r}`)}function q(t,e){const r=new URL(A(e));if(r.pathname!=="/__cad/asset")return"";const n=r.searchParams.get("file")||"",i=J(n,t);if(!i)return"";const o=new URL("/__cad/asset",r);o.searchParams.set("file",i);for(const[a,c]of r.searchParams.entries())a!=="file"&&o.searchParams.set(a,c);return`${o.pathname}${o.search}`}function I(t,e){const r=q(t,e);if(r)return r;const n=A(e);let i;return t.startsWith("package://")?i=new URL(t.slice(10).replace(/^\/+/,""),new URL("/",n)):i=new URL(t,n),P(i,{filename:t,sourceUrl:e})}function V(t){const e=String(t||"").split("/");return e[e.length-1]||"mesh"}function W(t,e){const r=u(t,"box")[0];if(r){const o=L(r.getAttribute("size"),3,`${e} box size`);if(o.some(a=>a<=0))throw new Error(`${e} box size values must be positive`);return{type:"box",size:o}}const n=u(t,"cylinder")[0];if(n)return{type:"cylinder",radius:S(n,"radius",`${e} cylinder`),length:S(n,"length",`${e} cylinder`)};const i=u(t,"sphere")[0];return i?{type:"sphere",radius:S(i,"radius",`${e} sphere`)}:null}function _(t,e){const r=g(t,4,[0,0,0,1]);if(r.some(n=>n<0||n>1))throw new Error(`${e} must use rgba values between 0 and 1`);return`#${r.slice(0,3).map(n=>Math.round(n*255).toString(16).padStart(2,"0")).join("")}`}function N(t,e){const r=u(t,"color")[0],n=String(r?.getAttribute("rgba")||"").trim();return n?_(n,e):""}function B(t){const e=new Map;for(const r of u(t,"material")){const n=String(r.getAttribute("name")||"").trim();if(!n)continue;const i=N(r,`URDF material ${n}`);i&&e.set(n,i)}return e}function H(t,e,{linkName:r,visualIndex:n}){const i=u(t,"material")[0];if(!i)return"";const o=N(i,`URDF link ${r} visual ${n} material`);if(o)return o;const a=String(i.getAttribute("name")||"").trim();return a?String(e.get(a)||""):""}function G(t,e){const r=u(t,"mimic")[0];if(!r)return null;const n=String(r.getAttribute("joint")||"").trim();if(!n)throw new Error(`URDF mimic joint ${e} must reference another joint`);const i=String(r.getAttribute("multiplier")??"1").trim()||"1",o=String(r.getAttribute("offset")??"0").trim()||"0",a=Number(i),c=Number(o);if(!Number.isFinite(a)||!Number.isFinite(c))throw new Error(`URDF mimic joint ${e} has invalid multiplier or offset`);return{joint:n,multiplier:a,offset:c}}function X(t,e){const r=String(t.getAttribute("name")||"").trim();if(!r)throw new Error("URDF joint name is required");const n=String(t.getAttribute("type")||"").trim().toLowerCase();if(!["fixed","continuous","revolute","prismatic"].includes(n))throw new Error(`Unsupported URDF joint type: ${n||"(missing)"}`);const i=u(t,"parent")[0],o=u(t,"child")[0],a=String(i?.getAttribute("link")||"").trim(),c=String(o?.getAttribute("link")||"").trim();if(!a||!c)throw new Error(`URDF joint ${r} must declare parent and child links`);if(!e.has(a)||!e.has(c))throw new Error(`URDF joint ${r} references missing links`);const m=n==="fixed"?[1,0,0]:g(u(t,"axis")[0]?.getAttribute("xyz"),3,[1,0,0]);let h=0,f=0;if(n==="continuous")h=-180,f=180;else if(n==="revolute"||n==="prismatic"){const s=u(t,"limit")[0];if(!s)throw new Error(`URDF ${n} joint ${r} requires `);const l=Number(s.getAttribute("lower")),p=Number(s.getAttribute("upper"));if(!Number.isFinite(l)||!Number.isFinite(p))throw new Error(`URDF ${n} joint ${r} has invalid limits`);n==="revolute"?(h=l*180/Math.PI,f=p*180/Math.PI):(h=l,f=p)}return{name:r,type:n,parentLink:a,childLink:c,originTransform:U(u(t,"origin")[0]),axis:m,defaultValueDeg:0,minValueDeg:h,maxValueDeg:f,mimic:G(t,r)}}function Y(t){const e=new Set(t.map(r=>r.name));for(const r of t)if(r.mimic&&!e.has(r.mimic.joint))throw new Error(`URDF mimic joint ${r.name} references missing joint ${r.mimic.joint}`)}function K(t,e){const r=new Set(t.map(s=>s.name)),n=new Set,i=new Map,o=new Set;for(const s of e){if(o.has(s.name))throw new Error(`Duplicate URDF joint name: ${s.name}`);if(o.add(s.name),n.has(s.childLink))throw new Error(`URDF link ${s.childLink} has multiple parents`);n.add(s.childLink);const l=i.get(s.parentLink)||[];l.push(s.childLink),i.set(s.parentLink,l)}const a=[...r].filter(s=>!n.has(s));if(a.length!==1)throw new Error(`URDF must form a single rooted tree; found roots ${JSON.stringify(a)}`);const c=a[0],m=new Set,h=new Set,f=s=>{if(!m.has(s)){if(h.has(s))throw new Error("URDF joint graph contains a cycle");h.add(s);for(const l of i.get(s)||[])f(l);h.delete(s),m.add(s)}};if(f(c),m.size!==t.length){const s=t.map(l=>l.name).filter(l=>!m.has(l));throw new Error(`URDF leaves links disconnected from the root: ${JSON.stringify(s)}`)}return c}function nt(t,{sourceUrl:e}={}){if(typeof DOMParser>"u")throw new Error("DOMParser is unavailable in this environment");const r=new DOMParser().parseFromString(String(t||""),"application/xml");if(r.querySelector("parsererror"))throw new Error("Failed to parse URDF XML");const i=r.documentElement;if(!i||i.tagName!=="robot")throw new Error("URDF root element must be ");const o=String(i.getAttribute("name")||"").trim();if(!o)throw new Error("URDF robot name is required");const a=B(i),c=u(i,"link").map(l=>{const p=String(l.getAttribute("name")||"").trim();if(!p)throw new Error("URDF link name is required");const k=u(l,"visual").map((d,w)=>{const b=u(d,"geometry")[0],$=b?u(b,"mesh")[0]:null,y={id:`${p}:v${w+1}`,color:H(d,a,{linkName:p,visualIndex:w+1})};if($){const R=String($.getAttribute("filename")||"").trim();if(!R)throw new Error(`URDF link ${p} visual ${w+1} is missing a mesh filename`);return{...y,label:V(R),meshUrl:I(R,e||"/"),localTransform:D(U(u(d,"origin")[0]),z($))}}const F=b?W(b,`URDF link ${p} visual ${w+1}`):null;if(!F)throw new Error(`URDF link ${p} uses unsupported visual geometry`);return{...y,label:F.type,primitive:F,localTransform:U(u(d,"origin")[0])}});return{name:p,visuals:k}}),m=new Set;for(const l of c){if(m.has(l.name))throw new Error(`Duplicate URDF link name: ${l.name}`);m.add(l.name)}const f=u(i,"joint").map(l=>X(l,m));Y(f);const s=K(c,f);return{robotName:o,rootLink:s,rootWorldTransform:[...v],links:c,joints:f,motion:null,srdf:null}}export{nt as parseUrdf}; //# sourceMappingURL=parseUrdf-C7WqROHT.js.map