@sienci/gviewer 0.1.13 → 0.1.14

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.
@@ -2728,7 +2728,7 @@ function Ei() {
2728
2728
  return e.wrapS = h.RepeatWrapping, e.wrapT = h.RepeatWrapping, WB = e, e;
2729
2729
  }
2730
2730
  function ai(r, Q) {
2731
- const B = Math.max(1e-3, r), A = B * 3, t = B * 0.15, P = B * 0.35, e = DB(Q), i = new h.CylinderGeometry(0, t, A, 8, 1, !1);
2731
+ const B = Math.max(1e-3, r), A = B * 1.6, t = B * 0.08, P = B * 0.187, e = DB(Q), i = new h.CylinderGeometry(0, t, A, 8, 1, !1);
2732
2732
  i.rotateX(-Math.PI / 2), i.translate(0, 0, A / 2);
2733
2733
  const s = new h.CylinderGeometry(0, P, A, 8, 1, !0);
2734
2734
  s.rotateX(-Math.PI / 2), s.translate(0, 0, A / 2);
@@ -3032,7 +3032,7 @@ class Hi {
3032
3032
  const A = B.units !== this.options.units || B.grid.size !== this.options.grid.size || B.grid.axisDepth !== this.options.grid.axisDepth, t = B.render.theme.colors.grid.major !== this.options.render.theme.colors.grid.major || B.render.theme.colors.grid.minor !== this.options.render.theme.colors.grid.minor || B.render.theme.colors.axes.x !== this.options.render.theme.colors.axes.x || B.render.theme.colors.axes.y !== this.options.render.theme.colors.axes.y || B.render.theme.colors.axes.z !== this.options.render.theme.colors.axes.z;
3033
3033
  (A || t) && this.renderGridAndAxes(), (B.grid.labels !== this.options.grid.labels || B.units !== this.options.units || B.grid.size !== this.options.grid.size || t) && this.refreshGridLabels(), (B.boundingBox.visible !== this.options.boundingBox.visible || B.boundingBox.labels !== this.options.boundingBox.labels || B.units !== this.options.units || B.render.theme.colors.boundingBox !== this.options.render.theme.colors.boundingBox) && this.refreshBoundingBox();
3034
3034
  const i = B.render.theme.colors.rapid !== this.options.render.theme.colors.rapid || B.render.theme.colors.cutting !== this.options.render.theme.colors.cutting || B.render.theme.colors.laser !== this.options.render.theme.colors.laser || B.render.theme.background !== this.options.render.theme.background || B.render.theme.colors.processed !== this.options.render.theme.colors.processed;
3035
- if (i && this.refreshToolpathColors(), (B.bit.enabled !== this.options.bit.enabled || B.bit.type !== this.options.bit.type || B.bit.size !== this.options.bit.size || B.bit.opacity !== this.options.bit.opacity || B.bit.colorSource !== this.options.bit.colorSource || B.bit.color !== this.options.bit.color || i) && (this.ensureBitMarker(), (c = this.bitMarker) == null || c.setOptions(this.options)), B.mode.laser !== this.options.mode.laser && (this.options.mode.laser ? this.options.bit.type !== "laser" && (this.preLaserBitType = this.options.bit.type, this.options = { ...this.options, bit: { ...this.options.bit, type: "laser" } }) : this.options = { ...this.options, bit: { ...this.options.bit, type: this.preLaserBitType } }, this.ensureBitMarker(), (n = this.bitMarker) == null || n.setOptions(this.options), this.renderScene()), B.mode.sim3d !== this.options.mode.sim3d)
3035
+ if (i && this.refreshToolpathColors(), (B.bit.enabled !== this.options.bit.enabled || B.bit.type !== this.options.bit.type || B.bit.size !== this.options.bit.size || B.bit.opacity !== this.options.bit.opacity || B.bit.colorSource !== this.options.bit.colorSource || B.bit.color !== this.options.bit.color || i) && (this.ensureBitMarker(), (c = this.bitMarker) == null || c.setOptions(this.options)), B.mode.laser !== this.options.mode.laser && (this.options.mode.laser ? this.options.bit.type !== "laser" && (this.preLaserBitType = this.options.bit.type, this.options = { ...this.options, bit: { ...this.options.bit, type: "laser" } }) : this.options = { ...this.options, bit: { ...this.options.bit, type: this.preLaserBitType } }, this.ensureBitMarker(), (n = this.bitMarker) == null || n.setOptions(this.options), this.currentLines.length > 0 && this.renderScene()), B.mode.sim3d !== this.options.mode.sim3d)
3036
3036
  if (!this.options.mode.sim3d)
3037
3037
  this.setSim3dHandle(null), this.setToolpathStreamsVisible(!0);
3038
3038
  else {
package/dist/gviewer.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=/([A-Za-z])\s*([+-]?(?:\d+(?:\.\d*)?|\.\d+))/g;class Z{parseLine(t){const n=[],e=this.stripComments(t,n),s=this.parseWords(e),r=s.filter(a=>{const c=a.letter.toUpperCase();return c==="G"||c==="M"}),i=s.filter(a=>{const c=a.letter.toUpperCase();return c!=="G"&&c!=="M"});return{raw:t,words:s,gcodes:r,params:i,comments:n}}stripComments(t,n){let e="",s=!1,r=-1,i="";for(let a=0;a<t.length;a+=1){const c=t[a];if(!s&&c===";"){const u=t.slice(a+1);n.push({type:"semicolon",text:u,start:a,end:t.length});break}if(c==="("){s?i+=c:(s=!0,r=a,i="");continue}if(c===")"&&s){n.push({type:"paren",text:i,start:r,end:a+1}),s=!1,r=-1,i="";continue}if(s){i+=c;continue}e+=c}return s&&n.push({type:"paren",text:i,start:r,end:t.length}),e}parseWords(t){const n=[];for(const e of t.matchAll($)){const s=e[0],r=e[1].toUpperCase(),i=Number(e[2]),a=e.index??0,c=a+s.length;n.push({letter:r,value:i,raw:s,start:a,end:c})}return n}}const g=["X","Y","Z","A","B","C"],C={motion:"G0",distance:"G90",plane:"G17",units:"G21",feedMode:"G94",feedRate:null,spindleSpeed:null,tool:null,coolant:null,spindle:null,coordinateSystem:"G54"};class I{constructor(t={}){this.parser=new Z,this.modals={...C},this.position={X:0,Y:0,Z:0,A:0,B:0,C:0},this.callbacks=t,this.feedRates=new Set,this.spindleSpeeds=new Set,this.tools=new Set}setCallbacks(t){this.callbacks=t}getModals(){return{...this.modals}}getPosition(){return{...this.position}}getUniqueFeedRates(){return Array.from(this.feedRates)}getUniqueSpindleSpeeds(){return Array.from(this.spindleSpeeds)}getUniqueTools(){return Array.from(this.tools)}reset(){this.modals={...C},this.position={X:0,Y:0,Z:0,A:0,B:0,C:0},this.feedRates.clear(),this.spindleSpeeds.clear(),this.tools.clear()}processLine(t){const n=this.parser.parseLine(t),e={...this.position};this.updateModals(n);const s=this.modals.motion,r=this.modals.plane;let i=this.applyAxes(n,e),a,c,u="none";return s==="G0"||s==="G1"?N(e,i)||(u="linear",this.position={...i},this.emitLinear({start:e,end:i})):(s==="G2"||s==="G3")&&(N(e,i)||(u="arc",c=this.arcCenter(n,e,i,r),a=this.computeArcMax(e,i,s,r,c),this.position={...i},this.emitArc({start:e,end:i,max:a,center:c,plane:r,motion:s}))),{parsed:n,modals:{...this.modals},start:e,end:i,movement:u,arcMax:a}}unitsScale(){return this.modals.units==="G20"?25.4:1}updateModals(t){for(const n of t.gcodes){if(n.letter.toUpperCase()==="G"){const e=`G${Math.trunc(n.value)}`;(e==="G0"||e==="G1"||e==="G2"||e==="G3")&&(this.modals.motion=e),(e==="G90"||e==="G91")&&(this.modals.distance=e),(e==="G17"||e==="G18"||e==="G19")&&(this.modals.plane=e),(e==="G20"||e==="G21")&&(this.modals.units=e),(e==="G93"||e==="G94")&&(this.modals.feedMode=e),(e==="G54"||e==="G55"||e==="G56"||e==="G57"||e==="G58"||e==="G59")&&(this.modals.coordinateSystem=e)}if(n.letter.toUpperCase()==="M"){const e=`M${Math.trunc(n.value)}`;(e==="M7"||e==="M8"||e==="M9")&&(this.modals.coolant=e),(e==="M3"||e==="M4"||e==="M5")&&(this.modals.spindle=e)}}for(const n of t.params){const e=n.letter.toUpperCase();e==="F"&&(this.modals.feedRate=n.value,this.feedRates.add(n.value)),e==="S"&&(this.modals.spindleSpeed=n.value,this.spindleSpeeds.add(n.value)),e==="T"&&(this.modals.tool=n.value,this.tools.add(n.value))}}applyAxes(t,n){const e={...n},s=this.unitsScale();for(const r of g){const i=t.params.find(c=>c.letter.toUpperCase()===r);if(!i)continue;const a=r==="X"||r==="Y"||r==="Z"?i.value*s:i.value;this.modals.distance==="G90"?e[r]=a:e[r]=e[r]+a}return e}computeArcMax(t,n,e,s,r){const{primary:i,secondary:a,tertiary:c}=X(s),u=q(t[i],t[a],r[i],r[a]),f=Math.atan2(t[a]-r[a],t[i]-r[i]),d=Math.atan2(n[a]-r[a],n[i]-r[i]),y=W(f,d,e);let l=Number.NEGATIVE_INFINITY,h=Number.NEGATIVE_INFINITY;for(const A of y){const G=r[i]+u*Math.cos(A),p=r[a]+u*Math.sin(A);G>l&&(l=G),p>h&&(h=p)}const M={...t};M[i]=l,M[a]=h,M[c]=Math.max(t[c],n[c]);for(const A of g)A!==i&&A!==a&&A!==c&&(M[A]=Math.max(t[A],n[A]));return M}arcCenter(t,n,e,s){const{primary:r,secondary:i}=X(s),a={...n},c=this.unitsScale(),u=b(t,"R"),f=j(t,s),d=f.primary===null?null:f.primary*c,y=f.secondary===null?null:f.secondary*c;if(d!==null||y!==null)return a[r]=n[r]+(d??0),a[i]=n[i]+(y??0),a;if(u===null)return a;const l=u*c,h=n[r],M=n[i],A=e[r],G=e[i],p=A-h,w=G-M,L=Math.hypot(p,w);if(L===0)return a;const P=Math.abs(l),m=Math.sqrt(Math.max(0,P*P-L/2*(L/2))),x=(h+A)/2,v=(M+G)/2,S=-w/L,E=p/L,Y=l>=0?1:-1;return a[r]=x+Y*S*m,a[i]=v+Y*E*m,a}emitLinear(t){const n=this.callbacks.onLinearMove;if(!n)return;const e=t.end.A-t.start.A,s=Math.max(1,Math.ceil(Math.abs(e)/D));let r={...t.start};for(let i=1;i<=s;i+=1){const a=i/s,c=K(t.start,t.end,a),u=V(r),f=V(c);n({modals:{...this.modals},start:{...r},end:{...c},transformedStart:u,transformedEnd:f}),r=c}}emitArc(t){const n=this.callbacks.onArcMove;if(!n)return;const e=V(t.start),s=V(t.end),r=V(t.max),i=V(t.center);n({modals:{...this.modals},start:{...t.start},end:{...t.end},max:{...t.max},center:{...t.center},plane:t.plane,motion:t.motion,transformedStart:e,transformedEnd:s,transformedMax:r,transformedCenter:i})}}function b(o,t){const n=o.params.find(e=>e.letter.toUpperCase()===t);return n?n.value:null}function X(o){return o==="G18"?{primary:"Z",secondary:"X",tertiary:"Y"}:o==="G19"?{primary:"Y",secondary:"Z",tertiary:"X"}:{primary:"X",secondary:"Y",tertiary:"Z"}}function j(o,t){const n=b(o,"I"),e=b(o,"J"),s=b(o,"K");return t==="G18"?{primary:s,secondary:n}:t==="G19"?{primary:e,secondary:s}:{primary:n,secondary:e}}function W(o,t,n){const e=Math.PI*2;let s=T(o),r=T(t);const i=[0,Math.PI/2,Math.PI,3*Math.PI/2,e];if(n==="G2"){s<r&&(s+=e);const c=[s,r];for(const u of i){let f=u;f<r&&(f+=e),f<=s&&f>=r&&c.push(f)}return c}r<s&&(r+=e);const a=[s,r];for(const c of i){let u=c;u<s&&(u+=e),u>=s&&u<=r&&a.push(u)}return a}function T(o){const t=Math.PI*2;let n=o%t;return n<0&&(n+=t),n}function q(o,t,n,e){return Math.hypot(o-n,t-e)}function N(o,t){return g.every(n=>o[n]===t[n])}const D=5;function K(o,t,n){return{X:o.X+(t.X-o.X)*n,Y:o.Y+(t.Y-o.Y)*n,Z:o.Z+(t.Z-o.Z)*n,A:o.A+(t.A-o.A)*n,B:o.B+(t.B-o.B)*n,C:o.C+(t.C-o.C)*n}}function V(o){const t=o.A*Math.PI/180,n=Math.cos(t),e=Math.sin(t),s=o.Y*n-o.Z*e,r=o.Y*e+o.Z*n;return{...o,Y:s,Z:r}}function H(o,t={}){const n=[],e=t.arcSegments??30,s=t.collector??{},r=new I({onLinearMove:i=>{(s.onLinearMove??U)(i,n)},onArcMove:i=>{(s.onArcMove??((c,u)=>{F(c,u,e)}))(i,n)}});for(const i of o)i&&r.processLine(i);return Float32Array.from(n)}function J(o,t={}){const n=[],e=[],s=t.arcSegments??30,r=new I({onLinearMove:i=>{const a=i.transformedStart??i.start,c=i.transformedEnd??i.end;(i.modals.motion==="G0"?n:e).push(a.X,a.Y,a.Z,c.X,c.Y,c.Z)},onArcMove:i=>{const a=i.modals.motion==="G0"?n:e;F(i,a,s)}});for(const i of o)i&&r.processLine(i);return{rapid:Float32Array.from(n),cutting:Float32Array.from(e)}}async function Q(o,t={}){var y;const n=[],e=[],s=t.arcSegments??30,r=t.batch,i=Math.max(1,Math.floor((r==null?void 0:r.everyLines)??5e3)),a=Math.max(0,Math.floor((r==null?void 0:r.yieldEveryLines)??5e4));let c=i,u=a>0?a:Number.POSITIVE_INFINITY;const f=new I({onLinearMove:l=>{const h=l.transformedStart??l.start,M=l.transformedEnd??l.end;(l.modals.motion==="G0"?n:e).push(h.X,h.Y,h.Z,M.X,M.Y,M.Z)},onArcMove:l=>{const h=l.modals.motion==="G0"?n:e;F(l,h,s)}}),d=o.length;for(let l=0;l<d;l+=1){if((y=r==null?void 0:r.shouldAbort)!=null&&y.call(r))throw new Error("Aborted.");const h=o[l];if(!h){r!=null&&r.onProgress&&(l+1===d||l+1===c)&&(r.onProgress(l+1,d),c+=i),a>0&&(l+1===d||l+1===u)&&(await new Promise(M=>{setTimeout(M,0)}),u+=a);continue}f.processLine(h),r!=null&&r.onProgress&&(l+1===d||l+1===c)&&(r.onProgress(l+1,d),c+=i),a>0&&(l+1===d||l+1===u)&&(await new Promise(M=>{setTimeout(M,0)}),u+=a)}return{rapid:Float32Array.from(n),cutting:Float32Array.from(e)}}async function ee(o,t={}){var G;const n=[],e=t.arcSegments??30,s=t.batch,r=Math.max(1,Math.floor((s==null?void 0:s.everyLines)??5e3)),i=Math.max(0,Math.floor((s==null?void 0:s.yieldEveryLines)??5e4));let a=r,c=i>0?i:Number.POSITIVE_INFINITY;const u=new Int32Array(o.length);u.fill(-1);const f=new Int32Array(o.length);f.fill(-1);const d=new Uint8Array(o.length),y=new Int32Array(o.length);let l=-1,h=0;const M=new I({onLinearMove:p=>{const w=p.modals.motion==="G0"?1:2;l>=0&&(h===0?h=w:h!==w&&(h=3)),U(p,n)},onArcMove:p=>{const w=p.modals.motion==="G0"?1:2;l>=0&&(h===0?h=w:h!==w&&(h=3)),F(p,n,e)}}),A=o.length;for(let p=0;p<A;p+=1){if((G=s==null?void 0:s.shouldAbort)!=null&&G.call(s))throw new Error("Aborted.");const w=n.length/3;l=p,h=0;const L=o[p];L&&M.processLine(L),l=-1;const P=n.length/3;P>w&&(u[p]=w,f[p]=P,d[p]=h),y[p]=P,s!=null&&s.onProgress&&(p+1===A||p+1===a)&&(s.onProgress(p+1,A),a+=r),i>0&&(p+1===A||p+1===c)&&(await new Promise(m=>{setTimeout(m,0)}),c+=i)}return{positions:Float32Array.from(n),lineStartVertex:u,lineEndVertex:f,lineKind:d,prefixEndVertex:y}}function te(o,t={}){const n=t.arcSegments??30,e=Math.max(1,Math.floor(t.bucketCount??16)),s=t.baseOpacity??.9,{minPower:r,maxPower:i}=ae(o),a=[],c=Array.from({length:e},()=>[]),u=new I({onLinearMove:d=>{const y=d.transformedStart??d.start,l=d.transformedEnd??d.end;if(d.modals.motion==="G0"){a.push(y.X,y.Y,y.Z,l.X,l.Y,l.Z);return}const h=R(d.modals.spindleSpeed,r,i,e);c[h].push(y.X,y.Y,y.Z,l.X,l.Y,l.Z)},onArcMove:d=>{if(d.modals.motion==="G0")return;const y=R(d.modals.spindleSpeed,r,i,e),l=c[y];F(d,l,n)}});for(const d of o)d&&u.processLine(d);const f=c.map((d,y)=>({opacity:_(y,e,s),vertices:Float32Array.from(d)}));return{rapid:Float32Array.from(a),buckets:f,minPower:r,maxPower:i}}async function ne(o,t={}){const n=await O(o,t);return{rapid:n.rapidPositions,buckets:n.buckets.map(e=>({opacity:e.opacity,vertices:e.positions})),minPower:n.minPower,maxPower:n.maxPower}}async function z(o,t={}){var L,P;const n=t.arcSegments??30,e=Math.max(1,Math.floor(t.bucketCount??16)),s=!!t.laserMode,r=t.batch,i=o.length*(s?2:1),a=Math.max(1,Math.floor((r==null?void 0:r.everyLines)??5e3)),c=Math.max(0,Math.floor((r==null?void 0:r.yieldEveryLines)??5e4));let u=a,f=c>0?c:Number.POSITIVE_INFINITY,d=Number.NEGATIVE_INFINITY,y=!1;if(s){const m=new Z;for(const x of o){if(!x)continue;if(m.parseLine(x).gcodes.some(E=>{if(E.letter!=="M")return!1;const Y=Math.trunc(E.value);return Y===3||Y===4||Y===5})){y=!1;break}y=!0}}const l=m=>m.spindle==="M5"||!(m.spindle==="M3"||m.spindle==="M4"||y&&m.spindle===null)?!1:m.spindleSpeed===null?!0:m.spindleSpeed>0;if(s){const m=new I({onLinearMove:x=>{if(!l(x.modals))return;const v=x.modals.spindleSpeed;v===null||v<=0||(d=Math.max(d,v))},onArcMove:x=>{if(!l(x.modals))return;const v=x.modals.spindleSpeed;v===null||v<=0||(d=Math.max(d,v))}});for(let x=0;x<o.length;x+=1){if((L=r==null?void 0:r.shouldAbort)!=null&&L.call(r))throw new Error("Aborted.");const v=o[x];v&&m.processLine(v);const S=x+1;r!=null&&r.onProgress&&(S===i||S===u)&&(r.onProgress(S,i),u+=a),c>0&&(S===i||S===f)&&(await new Promise(E=>{setTimeout(E,0)}),f+=c)}Number.isFinite(d)||(d=0)}else d=0;const h=m=>{if(e<=1)return 0;if(m===null)return e-1;const x=m;if(x<=0)return 0;if(d<=0)return e-1;const v=Math.min(1,Math.max(0,x/d)),S=1+Math.floor(v*(e-2));return Math.min(e-1,Math.max(1,S))},M=[],A=s?Array.from({length:e},()=>[]):[new Array],G=new Int32Array(o.length),p=Array.from({length:s?e:1},()=>new Int32Array(o.length)),w=new I({onLinearMove:m=>{const x=m.transformedStart??m.start,v=m.transformedEnd??m.end;if(m.modals.motion==="G0"){M.push(x.X,x.Y,x.Z,v.X,v.Y,v.Z);return}if(s&&!l(m.modals))return;const S=s?h(m.modals.spindleSpeed):0;A[S].push(x.X,x.Y,x.Z,v.X,v.Y,v.Z)},onArcMove:m=>{if(m.modals.motion==="G0"||s&&!l(m.modals))return;const x=s?h(m.modals.spindleSpeed):0,v=A[x];F(m,v,n)}});for(let m=0;m<o.length;m+=1){if((P=r==null?void 0:r.shouldAbort)!=null&&P.call(r))throw new Error("Aborted.");const x=o[m];x&&w.processLine(x),G[m]=M.length/3;for(let S=0;S<A.length;S+=1)p[S][m]=A[S].length/3;const v=s?o.length+m+1:m+1;r!=null&&r.onProgress&&(v===i||v===u)&&(r.onProgress(v,i),u+=a),c>0&&(v===i||v===f)&&(await new Promise(S=>{setTimeout(S,0)}),f+=c)}return{rapid:{positions:Float32Array.from(M),prefixEndVertex:G},cuts:A.map((m,x)=>({positions:Float32Array.from(m),prefixEndVertex:p[x]})),cutBucketCount:A.length,minPower:0,maxPower:d}}async function O(o,t={}){const n=Math.max(1,Math.floor(t.bucketCount??16)),e=t.baseOpacity??.9,s=await z(o,{arcSegments:t.arcSegments,bucketCount:n,laserMode:!0,batch:t.batch}),r=s.cuts.map((i,a)=>({opacity:_(a,n,e),positions:i.positions,prefixEndVertex:i.prefixEndVertex}));return{rapidPositions:s.rapid.positions,rapidPrefixEndVertex:s.rapid.prefixEndVertex,buckets:r,minPower:0,maxPower:s.maxPower}}function oe(o,t){o.push(t.X,t.Y,t.Z)}function U(o,t){const n=o.transformedStart??o.start,e=o.transformedEnd??o.end;t.push(n.X,n.Y,n.Z,e.X,e.Y,e.Z)}function F(o,t,n){const e=Math.max(1,Math.floor(n)),{primary:s,secondary:r}=re(o.plane),i=se(o.start[s],o.start[r],o.center[s],o.center[r]),a=Math.atan2(o.start[r]-o.center[r],o.start[s]-o.center[s]),c=Math.atan2(o.end[r]-o.center[r],o.end[s]-o.center[s]),u=Math.PI*2;let f=B(a),d=B(c);o.motion==="G2"?f<=d&&(f+=u):d<=f&&(d+=u);const y=o.motion==="G2"?f-d:d-f;let l={...o.start};for(let h=1;h<=e;h+=1){const M=h/e,A=o.motion==="G2"?f-y*M:f+y*M,G=ie(o.start,o.end,M);G[s]=o.center[s]+i*Math.cos(A),G[r]=o.center[r]+i*Math.sin(A);const p=k(l),w=k(G);t.push(p.X,p.Y,p.Z,w.X,w.Y,w.Z),l=G}}function k(o){const t=o.A*Math.PI/180,n=Math.cos(t),e=Math.sin(t),s=o.Y*n-o.Z*e,r=o.Y*e+o.Z*n;return{...o,Y:s,Z:r}}function re(o){return o==="G18"?{primary:"Z",secondary:"X"}:o==="G19"?{primary:"Y",secondary:"Z"}:{primary:"X",secondary:"Y"}}function B(o){const t=Math.PI*2;let n=o%t;return n<0&&(n+=t),n}function se(o,t,n,e){return Math.hypot(o-n,t-e)}function ie(o,t,n){return{X:o.X+(t.X-o.X)*n,Y:o.Y+(t.Y-o.Y)*n,Z:o.Z+(t.Z-o.Z)*n,A:o.A+(t.A-o.A)*n,B:o.B+(t.B-o.B)*n,C:o.C+(t.C-o.C)*n}}function ae(o){let t=Number.POSITIVE_INFINITY,n=Number.NEGATIVE_INFINITY;const e=new I({onLinearMove:s=>{const r=s.modals.spindleSpeed;r!==null&&(t=Math.min(t,r),n=Math.max(n,r))},onArcMove:s=>{const r=s.modals.spindleSpeed;r!==null&&(t=Math.min(t,r),n=Math.max(n,r))}});for(const s of o)s&&e.processLine(s);return!Number.isFinite(t)||!Number.isFinite(n)?{minPower:0,maxPower:0}:{minPower:t,maxPower:n}}function R(o,t,n,e){if(e<=1)return 0;const s=o??t;if(n<=t)return e-1;const r=(s-t)/(n-t),i=Math.floor(r*(e-1));return Math.min(e-1,Math.max(0,i))}function _(o,t,n){if(t<=1)return n;const e=o/(t-1);return n*e}function ce(o){const t=new Float32Array(o.vertices),n=new Uint32Array(o.frames),e=new Float32Array(o.colorArrayBuffer),{verticesLen:s,framesLen:r}=o,i=new Map;for(let a=0;a<r;a++){const c=n[a],u=a<r-1?n[a+1]:s/3;if(u<=c+1)continue;const f=c*4,d=e[f],y=e[f+1],l=e[f+2],h=e[f+3],M=le(d,y,l),A=`${M}|${Math.round(h*100)}`;let G=i.get(A);G||(G={hexColor:M,opacity:h,pos:[],rgb:[]},i.set(A,G));for(let p=c;p<u-1;p++){const w=p*3,L=(p+1)*3;G.pos.push(t[w],t[w+1],t[w+2],t[L],t[L+1],t[L+2]),G.rgb.push(d,y,l,d,y,l)}}return Array.from(i.values()).map(({hexColor:a,opacity:c,pos:u,rgb:f})=>({hexColor:a,opacity:c,positions:new Float32Array(u),rgbColors:new Float32Array(f)}))}function le(o,t,n){const e=s=>Math.round(Math.min(1,Math.max(0,s))*255).toString(16).padStart(2,"0");return`#${e(o)}${e(t)}${e(n)}`}function de(o){const t=new Float32Array(o.vertices),n=new Uint32Array(o.frames),e=new Float32Array(o.colorArrayBuffer),{verticesLen:s,framesLen:r}=o,i=[],a=[],c=[],u=[],f=new Int32Array(r),d=new Int32Array(r);for(let y=0;y<r;y++){const l=n[y],h=y<r-1?n[y+1]:s/3;if(h>l+1){const M=e[l*4+3]<.75,A=M?i:c,G=M?a:u;for(let p=l;p<h-1;p++){const w=p*3,L=(p+1)*3;A.push(t[w],t[w+1],t[w+2],t[L],t[L+1],t[L+2]);const P=p*4,m=(p+1)*4;G.push(e[P],e[P+1],e[P+2],e[m],e[m+1],e[m+2])}}f[y]=i.length/3,d[y]=c.length/3}return{rapid:{positions:Float32Array.from(i),colors:Float32Array.from(a),prefixEndVertex:f},cut:{positions:Float32Array.from(c),colors:Float32Array.from(u),prefixEndVertex:d}}}exports.GCodeParser=Z;exports.GCodeVirtualizer=I;exports.buildLaserGeometryFromLinesBatched=O;exports.buildLaserVerticesFromLines=te;exports.buildLaserVerticesFromLinesBatched=ne;exports.buildMovementGeometryFromLinesBatched=ee;exports.buildMovementVerticesFromLines=J;exports.buildMovementVerticesFromLinesBatched=Q;exports.buildToolpathGeometryFromLinesBatched=z;exports.buildVerticesFromLines=H;exports.buildWorkerSegmentGroups=ce;exports.buildWorkerToolpathStreams=de;exports.pushXYZ=oe;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const $=/([A-Za-z])\s*([+-]?(?:\d+(?:\.\d*)?|\.\d+))/g;class C{parseLine(e){const o=[],t=this.stripComments(e,o),s=this.parseWords(t),r=s.filter(a=>{const c=a.letter.toUpperCase();return c==="G"||c==="M"}),i=s.filter(a=>{const c=a.letter.toUpperCase();return c!=="G"&&c!=="M"});return{raw:e,words:s,gcodes:r,params:i,comments:o}}stripComments(e,o){let t="",s=!1,r=-1,i="";for(let a=0;a<e.length;a+=1){const c=e[a];if(!s&&c===";"){const u=e.slice(a+1);o.push({type:"semicolon",text:u,start:a,end:e.length});break}if(c==="("){s?i+=c:(s=!0,r=a,i="");continue}if(c===")"&&s){o.push({type:"paren",text:i,start:r,end:a+1}),s=!1,r=-1,i="";continue}if(s){i+=c;continue}t+=c}return s&&o.push({type:"paren",text:i,start:r,end:e.length}),t}parseWords(e){const o=[];for(const t of e.matchAll($)){const s=t[0],r=t[1].toUpperCase(),i=Number(t[2]),a=t.index??0,c=a+s.length;o.push({letter:r,value:i,raw:s,start:a,end:c})}return o}}const g=["X","Y","Z","A","B","C"],Z={motion:"G0",distance:"G90",plane:"G17",units:"G21",feedMode:"G94",feedRate:null,spindleSpeed:null,tool:null,coolant:null,spindle:null,coordinateSystem:"G54"};class I{constructor(e={}){this.parser=new C,this.modals={...Z},this.position={X:0,Y:0,Z:0,A:0,B:0,C:0},this.callbacks=e,this.feedRates=new Set,this.spindleSpeeds=new Set,this.tools=new Set}setCallbacks(e){this.callbacks=e}getModals(){return{...this.modals}}getPosition(){return{...this.position}}getUniqueFeedRates(){return Array.from(this.feedRates)}getUniqueSpindleSpeeds(){return Array.from(this.spindleSpeeds)}getUniqueTools(){return Array.from(this.tools)}reset(){this.modals={...Z},this.position={X:0,Y:0,Z:0,A:0,B:0,C:0},this.feedRates.clear(),this.spindleSpeeds.clear(),this.tools.clear()}processLine(e){const o=this.parser.parseLine(e),t={...this.position};this.updateModals(o);const s=this.modals.motion,r=this.modals.plane;let i=this.applyAxes(o,t),a,c,u="none";return s==="G0"||s==="G1"?N(t,i)||(u="linear",this.position={...i},this.emitLinear({start:t,end:i})):(s==="G2"||s==="G3")&&(N(t,i)||(u="arc",c=this.arcCenter(o,t,i,r),a=this.computeArcMax(t,i,s,r,c),this.position={...i},this.emitArc({start:t,end:i,max:a,center:c,plane:r,motion:s}))),{parsed:o,modals:{...this.modals},start:t,end:i,movement:u,arcMax:a}}unitsScale(){return this.modals.units==="G20"?25.4:1}updateModals(e){for(const o of e.gcodes){if(o.letter.toUpperCase()==="G"){const t=`G${Math.trunc(o.value)}`;(t==="G0"||t==="G1"||t==="G2"||t==="G3")&&(this.modals.motion=t),(t==="G90"||t==="G91")&&(this.modals.distance=t),(t==="G17"||t==="G18"||t==="G19")&&(this.modals.plane=t),(t==="G20"||t==="G21")&&(this.modals.units=t),(t==="G93"||t==="G94")&&(this.modals.feedMode=t),(t==="G54"||t==="G55"||t==="G56"||t==="G57"||t==="G58"||t==="G59")&&(this.modals.coordinateSystem=t)}if(o.letter.toUpperCase()==="M"){const t=`M${Math.trunc(o.value)}`;(t==="M7"||t==="M8"||t==="M9")&&(this.modals.coolant=t),(t==="M3"||t==="M4"||t==="M5")&&(this.modals.spindle=t)}}for(const o of e.params){const t=o.letter.toUpperCase();t==="F"&&(this.modals.feedRate=o.value,this.feedRates.add(o.value)),t==="S"&&(this.modals.spindleSpeed=o.value,this.spindleSpeeds.add(o.value)),t==="T"&&(this.modals.tool=o.value,this.tools.add(o.value))}}applyAxes(e,o){const t={...o},s=this.unitsScale();for(const r of g){const i=e.params.find(c=>c.letter.toUpperCase()===r);if(!i)continue;const a=r==="X"||r==="Y"||r==="Z"?i.value*s:i.value;this.modals.distance==="G90"?t[r]=a:t[r]=t[r]+a}return t}computeArcMax(e,o,t,s,r){const{primary:i,secondary:a,tertiary:c}=X(s),u=q(e[i],e[a],r[i],r[a]),f=Math.atan2(e[a]-r[a],e[i]-r[i]),d=Math.atan2(o[a]-r[a],o[i]-r[i]),M=W(f,d,t);let l=Number.NEGATIVE_INFINITY,m=Number.NEGATIVE_INFINITY;for(const x of M){const w=r[i]+u*Math.cos(x),h=r[a]+u*Math.sin(x);w>l&&(l=w),h>m&&(m=h)}const A={...e};A[i]=l,A[a]=m,A[c]=Math.max(e[c],o[c]);for(const x of g)x!==i&&x!==a&&x!==c&&(A[x]=Math.max(e[x],o[x]));return A}arcCenter(e,o,t,s){const{primary:r,secondary:i}=X(s),a={...o},c=this.unitsScale(),u=b(e,"R"),f=j(e,s),d=f.primary===null?null:f.primary*c,M=f.secondary===null?null:f.secondary*c;if(d!==null||M!==null)return a[r]=o[r]+(d??0),a[i]=o[i]+(M??0),a;if(u===null)return a;const l=u*c,m=o[r],A=o[i],x=t[r],w=t[i],h=x-m,G=w-A,L=Math.hypot(h,G);if(L===0)return a;const P=Math.abs(l),p=Math.sqrt(Math.max(0,P*P-L/2*(L/2))),y=(m+x)/2,v=(A+w)/2,S=-G/L,E=h/L,Y=l>=0?1:-1;return a[r]=y+Y*S*p,a[i]=v+Y*E*p,a}emitLinear(e){const o=this.callbacks.onLinearMove;if(!o)return;const t=e.end.A-e.start.A,s=Math.max(1,Math.ceil(Math.abs(t)/D));let r={...e.start};for(let i=1;i<=s;i+=1){const a=i/s,c=K(e.start,e.end,a),u=V(r),f=V(c);o({modals:{...this.modals},start:{...r},end:{...c},transformedStart:u,transformedEnd:f}),r=c}}emitArc(e){const o=this.callbacks.onArcMove;if(!o)return;const t=V(e.start),s=V(e.end),r=V(e.max),i=V(e.center);o({modals:{...this.modals},start:{...e.start},end:{...e.end},max:{...e.max},center:{...e.center},plane:e.plane,motion:e.motion,transformedStart:t,transformedEnd:s,transformedMax:r,transformedCenter:i})}}function b(n,e){const o=n.params.find(t=>t.letter.toUpperCase()===e);return o?o.value:null}function X(n){return n==="G18"?{primary:"Z",secondary:"X",tertiary:"Y"}:n==="G19"?{primary:"Y",secondary:"Z",tertiary:"X"}:{primary:"X",secondary:"Y",tertiary:"Z"}}function j(n,e){const o=b(n,"I"),t=b(n,"J"),s=b(n,"K");return e==="G18"?{primary:s,secondary:o}:e==="G19"?{primary:t,secondary:s}:{primary:o,secondary:t}}function W(n,e,o){const t=Math.PI*2;let s=T(n),r=T(e);const i=[0,Math.PI/2,Math.PI,3*Math.PI/2,t];if(o==="G2"){s<r&&(s+=t);const c=[s,r];for(const u of i){let f=u;f<r&&(f+=t),f<=s&&f>=r&&c.push(f)}return c}r<s&&(r+=t);const a=[s,r];for(const c of i){let u=c;u<s&&(u+=t),u>=s&&u<=r&&a.push(u)}return a}function T(n){const e=Math.PI*2;let o=n%e;return o<0&&(o+=e),o}function q(n,e,o,t){return Math.hypot(n-o,e-t)}function N(n,e){return g.every(o=>n[o]===e[o])}const D=5;function K(n,e,o){return{X:n.X+(e.X-n.X)*o,Y:n.Y+(e.Y-n.Y)*o,Z:n.Z+(e.Z-n.Z)*o,A:n.A+(e.A-n.A)*o,B:n.B+(e.B-n.B)*o,C:n.C+(e.C-n.C)*o}}function V(n){const e=n.A*Math.PI/180,o=Math.cos(e),t=Math.sin(e),s=n.Y*o-n.Z*t,r=n.Y*t+n.Z*o;return{...n,Y:s,Z:r}}function H(n,e={}){const o=[],t=e.arcSegments??30,s=e.collector??{},r=new I({onLinearMove:i=>{(s.onLinearMove??U)(i,o)},onArcMove:i=>{(s.onArcMove??((c,u)=>{F(c,u,t)}))(i,o)}});for(const i of n)i&&r.processLine(i);return Float32Array.from(o)}function J(n,e={}){const o=[],t=[],s=e.arcSegments??30,r=new I({onLinearMove:i=>{const a=i.transformedStart??i.start,c=i.transformedEnd??i.end;(i.modals.motion==="G0"?o:t).push(a.X,a.Y,a.Z,c.X,c.Y,c.Z)},onArcMove:i=>{const a=i.modals.motion==="G0"?o:t;F(i,a,s)}});for(const i of n)i&&r.processLine(i);return{rapid:Float32Array.from(o),cutting:Float32Array.from(t)}}async function Q(n,e={}){var M;const o=[],t=[],s=e.arcSegments??30,r=e.batch,i=Math.max(1,Math.floor((r==null?void 0:r.everyLines)??5e3)),a=Math.max(0,Math.floor((r==null?void 0:r.yieldEveryLines)??5e4));let c=i,u=a>0?a:Number.POSITIVE_INFINITY;const f=new I({onLinearMove:l=>{const m=l.transformedStart??l.start,A=l.transformedEnd??l.end;(l.modals.motion==="G0"?o:t).push(m.X,m.Y,m.Z,A.X,A.Y,A.Z)},onArcMove:l=>{const m=l.modals.motion==="G0"?o:t;F(l,m,s)}}),d=n.length;for(let l=0;l<d;l+=1){if((M=r==null?void 0:r.shouldAbort)!=null&&M.call(r))throw new Error("Aborted.");const m=n[l];if(!m){r!=null&&r.onProgress&&(l+1===d||l+1===c)&&(r.onProgress(l+1,d),c+=i),a>0&&(l+1===d||l+1===u)&&(await new Promise(A=>{setTimeout(A,0)}),u+=a);continue}f.processLine(m),r!=null&&r.onProgress&&(l+1===d||l+1===c)&&(r.onProgress(l+1,d),c+=i),a>0&&(l+1===d||l+1===u)&&(await new Promise(A=>{setTimeout(A,0)}),u+=a)}return{rapid:Float32Array.from(o),cutting:Float32Array.from(t)}}async function ee(n,e={}){var w;const o=[],t=e.arcSegments??30,s=e.batch,r=Math.max(1,Math.floor((s==null?void 0:s.everyLines)??5e3)),i=Math.max(0,Math.floor((s==null?void 0:s.yieldEveryLines)??5e4));let a=r,c=i>0?i:Number.POSITIVE_INFINITY;const u=new Int32Array(n.length);u.fill(-1);const f=new Int32Array(n.length);f.fill(-1);const d=new Uint8Array(n.length),M=new Int32Array(n.length);let l=-1,m=0;const A=new I({onLinearMove:h=>{const G=h.modals.motion==="G0"?1:2;l>=0&&(m===0?m=G:m!==G&&(m=3)),U(h,o)},onArcMove:h=>{const G=h.modals.motion==="G0"?1:2;l>=0&&(m===0?m=G:m!==G&&(m=3)),F(h,o,t)}}),x=n.length;for(let h=0;h<x;h+=1){if((w=s==null?void 0:s.shouldAbort)!=null&&w.call(s))throw new Error("Aborted.");const G=o.length/3;l=h,m=0;const L=n[h];L&&A.processLine(L),l=-1;const P=o.length/3;P>G&&(u[h]=G,f[h]=P,d[h]=m),M[h]=P,s!=null&&s.onProgress&&(h+1===x||h+1===a)&&(s.onProgress(h+1,x),a+=r),i>0&&(h+1===x||h+1===c)&&(await new Promise(p=>{setTimeout(p,0)}),c+=i)}return{positions:Float32Array.from(o),lineStartVertex:u,lineEndVertex:f,lineKind:d,prefixEndVertex:M}}function te(n,e={}){const o=e.arcSegments??30,t=Math.max(1,Math.floor(e.bucketCount??16)),s=e.baseOpacity??.9,{minPower:r,maxPower:i}=ae(n),a=[],c=Array.from({length:t},()=>[]),u=new I({onLinearMove:d=>{const M=d.transformedStart??d.start,l=d.transformedEnd??d.end;if(d.modals.motion==="G0"){a.push(M.X,M.Y,M.Z,l.X,l.Y,l.Z);return}const m=R(d.modals.spindleSpeed,r,i,t);c[m].push(M.X,M.Y,M.Z,l.X,l.Y,l.Z)},onArcMove:d=>{if(d.modals.motion==="G0")return;const M=R(d.modals.spindleSpeed,r,i,t),l=c[M];F(d,l,o)}});for(const d of n)d&&u.processLine(d);const f=c.map((d,M)=>({opacity:_(M,t,s),vertices:Float32Array.from(d)}));return{rapid:Float32Array.from(a),buckets:f,minPower:r,maxPower:i}}async function ne(n,e={}){const o=await O(n,e);return{rapid:o.rapidPositions,buckets:o.buckets.map(t=>({opacity:t.opacity,vertices:t.positions})),minPower:o.minPower,maxPower:o.maxPower}}async function z(n,e={}){var L,P;const o=e.arcSegments??30,t=Math.max(1,Math.floor(e.bucketCount??16)),s=!!e.laserMode,r=e.batch,i=n.length*(s?2:1),a=Math.max(1,Math.floor((r==null?void 0:r.everyLines)??5e3)),c=Math.max(0,Math.floor((r==null?void 0:r.yieldEveryLines)??5e4));let u=a,f=c>0?c:Number.POSITIVE_INFINITY,d=Number.NEGATIVE_INFINITY,M=!1;if(s){const p=new C;for(const y of n){if(!y)continue;if(p.parseLine(y).gcodes.some(E=>{if(E.letter!=="M")return!1;const Y=Math.trunc(E.value);return Y===3||Y===4||Y===5})){M=!1;break}M=!0}}const l=p=>p.spindle==="M5"||!(p.spindle==="M3"||p.spindle==="M4"||M&&p.spindle===null)?!1:p.spindleSpeed===null?!0:p.spindleSpeed>0;if(s){const p=new I({onLinearMove:y=>{if(!l(y.modals))return;const v=y.modals.spindleSpeed;v===null||v<=0||(d=Math.max(d,v))},onArcMove:y=>{if(!l(y.modals))return;const v=y.modals.spindleSpeed;v===null||v<=0||(d=Math.max(d,v))}});for(let y=0;y<n.length;y+=1){if((L=r==null?void 0:r.shouldAbort)!=null&&L.call(r))throw new Error("Aborted.");const v=n[y];v&&p.processLine(v);const S=y+1;r!=null&&r.onProgress&&(S===i||S===u)&&(r.onProgress(S,i),u+=a),c>0&&(S===i||S===f)&&(await new Promise(E=>{setTimeout(E,0)}),f+=c)}Number.isFinite(d)||(d=0)}else d=0;const m=p=>{if(t<=1)return 0;if(p===null)return t-1;const y=p;if(y<=0)return 0;if(d<=0)return t-1;const v=Math.min(1,Math.max(0,y/d)),S=1+Math.floor(v*(t-2));return Math.min(t-1,Math.max(1,S))},A=[],x=s?Array.from({length:t},()=>[]):[new Array],w=new Int32Array(n.length),h=Array.from({length:s?t:1},()=>new Int32Array(n.length)),G=new I({onLinearMove:p=>{const y=p.transformedStart??p.start,v=p.transformedEnd??p.end;if(p.modals.motion==="G0"){A.push(y.X,y.Y,y.Z,v.X,v.Y,v.Z);return}if(s&&!l(p.modals))return;const S=s?m(p.modals.spindleSpeed):0;x[S].push(y.X,y.Y,y.Z,v.X,v.Y,v.Z)},onArcMove:p=>{if(p.modals.motion==="G0"||s&&!l(p.modals))return;const y=s?m(p.modals.spindleSpeed):0,v=x[y];F(p,v,o)}});for(let p=0;p<n.length;p+=1){if((P=r==null?void 0:r.shouldAbort)!=null&&P.call(r))throw new Error("Aborted.");const y=n[p];y&&G.processLine(y),w[p]=A.length/3;for(let S=0;S<x.length;S+=1)h[S][p]=x[S].length/3;const v=s?n.length+p+1:p+1;r!=null&&r.onProgress&&(v===i||v===u)&&(r.onProgress(v,i),u+=a),c>0&&(v===i||v===f)&&(await new Promise(S=>{setTimeout(S,0)}),f+=c)}return{rapid:{positions:Float32Array.from(A),prefixEndVertex:w},cuts:x.map((p,y)=>({positions:Float32Array.from(p),prefixEndVertex:h[y]})),cutBucketCount:x.length,minPower:0,maxPower:d}}async function O(n,e={}){const o=Math.max(1,Math.floor(e.bucketCount??16)),t=e.baseOpacity??.9,s=await z(n,{arcSegments:e.arcSegments,bucketCount:o,laserMode:!0,batch:e.batch}),r=s.cuts.map((i,a)=>({opacity:_(a,o,t),positions:i.positions,prefixEndVertex:i.prefixEndVertex}));return{rapidPositions:s.rapid.positions,rapidPrefixEndVertex:s.rapid.prefixEndVertex,buckets:r,minPower:0,maxPower:s.maxPower}}function oe(n,e){n.push(e.X,e.Y,e.Z)}function U(n,e){const o=n.transformedStart??n.start,t=n.transformedEnd??n.end;e.push(o.X,o.Y,o.Z,t.X,t.Y,t.Z)}function F(n,e,o){const t=Math.max(1,Math.floor(o)),{primary:s,secondary:r}=re(n.plane),i=se(n.start[s],n.start[r],n.center[s],n.center[r]),a=Math.atan2(n.start[r]-n.center[r],n.start[s]-n.center[s]),c=Math.atan2(n.end[r]-n.center[r],n.end[s]-n.center[s]),u=Math.PI*2;let f=B(a),d=B(c);n.motion==="G2"?f<=d&&(f+=u):d<=f&&(d+=u);const M=n.motion==="G2"?f-d:d-f;let l={...n.start};for(let m=1;m<=t;m+=1){const A=m/t,x=n.motion==="G2"?f-M*A:f+M*A,w=ie(n.start,n.end,A);w[s]=n.center[s]+i*Math.cos(x),w[r]=n.center[r]+i*Math.sin(x);const h=k(l),G=k(w);e.push(h.X,h.Y,h.Z,G.X,G.Y,G.Z),l=w}}function k(n){const e=n.A*Math.PI/180,o=Math.cos(e),t=Math.sin(e),s=n.Y*o-n.Z*t,r=n.Y*t+n.Z*o;return{...n,Y:s,Z:r}}function re(n){return n==="G18"?{primary:"Z",secondary:"X"}:n==="G19"?{primary:"Y",secondary:"Z"}:{primary:"X",secondary:"Y"}}function B(n){const e=Math.PI*2;let o=n%e;return o<0&&(o+=e),o}function se(n,e,o,t){return Math.hypot(n-o,e-t)}function ie(n,e,o){return{X:n.X+(e.X-n.X)*o,Y:n.Y+(e.Y-n.Y)*o,Z:n.Z+(e.Z-n.Z)*o,A:n.A+(e.A-n.A)*o,B:n.B+(e.B-n.B)*o,C:n.C+(e.C-n.C)*o}}function ae(n){let e=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY;const t=new I({onLinearMove:s=>{const r=s.modals.spindleSpeed;r!==null&&(e=Math.min(e,r),o=Math.max(o,r))},onArcMove:s=>{const r=s.modals.spindleSpeed;r!==null&&(e=Math.min(e,r),o=Math.max(o,r))}});for(const s of n)s&&t.processLine(s);return!Number.isFinite(e)||!Number.isFinite(o)?{minPower:0,maxPower:0}:{minPower:e,maxPower:o}}function R(n,e,o,t){if(t<=1)return 0;const s=n??e;if(o<=e)return t-1;const r=(s-e)/(o-e),i=Math.floor(r*(t-1));return Math.min(t-1,Math.max(0,i))}function _(n,e,o){if(e<=1)return o;const t=n/(e-1);return o*t}function ce(n){const e=new Float32Array(n.vertices),o=new Uint32Array(n.frames),t=new Float32Array(n.colorArrayBuffer),{verticesLen:s,framesLen:r}=n,i=new Map;for(let a=0;a<r;a++){const c=o[a],u=a<r-1?o[a+1]:s/3;if(u<=c+1)continue;const f=c*4,d=t[f],M=t[f+1],l=t[f+2],m=t[f+3],A=le(d,M,l),x=`${A}|${Math.round(m*100)}`;let w=i.get(x);w||(w={hexColor:A,opacity:m,pos:[],rgb:[]},i.set(x,w));for(let h=c;h<u-1;h++){const G=h*3,L=(h+1)*3;w.pos.push(e[G],e[G+1],e[G+2],e[L],e[L+1],e[L+2]),w.rgb.push(d,M,l,d,M,l)}}return Array.from(i.values()).map(({hexColor:a,opacity:c,pos:u,rgb:f})=>({hexColor:a,opacity:c,positions:new Float32Array(u),rgbColors:new Float32Array(f)}))}function le(n,e,o){const t=s=>Math.round(Math.min(1,Math.max(0,s))*255).toString(16).padStart(2,"0");return`#${t(n)}${t(e)}${t(o)}`}function de(n){const e=new Float32Array(n.vertices),o=new Uint32Array(n.frames),t=new Float32Array(n.colorArrayBuffer),r=(n.isLaser&&n.savedColorsBuffer&&n.savedColorLen?new Float32Array(n.savedColorsBuffer):null)??t,{verticesLen:i,framesLen:a}=n,c=[],u=[],f=[],d=[],M=new Int32Array(a),l=new Int32Array(a);for(let m=0;m<a;m++){const A=o[m],x=m<a-1?o[m+1]:i/3;if(x>A+1){const w=t[A*4+3]<.75,h=w?c:f,G=w?u:d;for(let L=A;L<x-1;L++){const P=L*3,p=(L+1)*3;h.push(e[P],e[P+1],e[P+2],e[p],e[p+1],e[p+2]);const y=L*4,v=(L+1)*4;G.push(r[y],r[y+1],r[y+2],r[v],r[v+1],r[v+2])}}M[m]=c.length/3,l[m]=f.length/3}return{rapid:{positions:Float32Array.from(c),colors:Float32Array.from(u),prefixEndVertex:M},cut:{positions:Float32Array.from(f),colors:Float32Array.from(d),prefixEndVertex:l}}}exports.GCodeParser=C;exports.GCodeVirtualizer=I;exports.buildLaserGeometryFromLinesBatched=O;exports.buildLaserVerticesFromLines=te;exports.buildLaserVerticesFromLinesBatched=ne;exports.buildMovementGeometryFromLinesBatched=ee;exports.buildMovementVerticesFromLines=J;exports.buildMovementVerticesFromLinesBatched=Q;exports.buildToolpathGeometryFromLinesBatched=z;exports.buildVerticesFromLines=H;exports.buildWorkerSegmentGroups=ce;exports.buildWorkerToolpathStreams=de;exports.pushXYZ=oe;