fluidcad 0.0.25 → 0.0.26

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 (41) hide show
  1. package/lib/dist/common/scene-object.d.ts +4 -14
  2. package/lib/dist/common/scene-object.js +10 -127
  3. package/lib/dist/common/transformable-primitive.d.ts +16 -0
  4. package/lib/dist/common/transformable-primitive.js +116 -0
  5. package/lib/dist/core/chamfer.d.ts +5 -5
  6. package/lib/dist/core/color.d.ts +3 -3
  7. package/lib/dist/core/fillet.d.ts +6 -6
  8. package/lib/dist/core/index.d.ts +1 -1
  9. package/lib/dist/core/interfaces.d.ts +32 -24
  10. package/lib/dist/core/load.d.ts +2 -2
  11. package/lib/dist/core/mirror.d.ts +7 -7
  12. package/lib/dist/core/mirror.js +42 -57
  13. package/lib/dist/core/plane.d.ts +5 -7
  14. package/lib/dist/core/remove.d.ts +2 -2
  15. package/lib/dist/core/rotate.d.ts +5 -5
  16. package/lib/dist/core/subtract.d.ts +2 -2
  17. package/lib/dist/core/translate.d.ts +9 -9
  18. package/lib/dist/features/2d/slot.d.ts +3 -0
  19. package/lib/dist/features/2d/slot.js +28 -7
  20. package/lib/dist/features/cylinder.d.ts +2 -2
  21. package/lib/dist/features/cylinder.js +2 -2
  22. package/lib/dist/features/plane-from-object.d.ts +1 -1
  23. package/lib/dist/features/plane-from-object.js +11 -6
  24. package/lib/dist/features/plane-mid.d.ts +1 -1
  25. package/lib/dist/features/plane.d.ts +1 -1
  26. package/lib/dist/features/select.d.ts +1 -1
  27. package/lib/dist/features/select.js +1 -1
  28. package/lib/dist/features/sphere.d.ts +2 -2
  29. package/lib/dist/features/sphere.js +2 -2
  30. package/lib/dist/math/index.d.ts +1 -1
  31. package/lib/dist/math/plane.d.ts +1 -2
  32. package/lib/dist/math/plane.js +20 -19
  33. package/lib/dist/tests/features/cut-two-distances.test.js +1 -1
  34. package/lib/dist/tests/features/cut.test.js +1 -1
  35. package/lib/dist/tests/features/primitive-chain.test.js +45 -0
  36. package/lib/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/ui/dist/assets/{index-D2eOzshJ.js → index-BeLxRMCv.js} +1 -1
  39. package/ui/dist/index.html +1 -1
  40. package/lib/dist/tests/features/scene-object-chain.test.js +0 -64
  41. /package/lib/dist/tests/features/{scene-object-chain.test.d.ts → primitive-chain.test.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluidcad",
3
- "version": "0.0.25",
3
+ "version": "0.0.26",
4
4
  "description": "Parametric CAD modeling library using javascript",
5
5
  "author": "Marwan Aouida <contact@marwan.dev>",
6
6
  "homepage": "https://fluidcad.io",
@@ -4305,7 +4305,7 @@ void main() {
4305
4305
 
4306
4306
  gl_FragColor = vec4(color, 1.0);
4307
4307
  }
4308
- `,of=class extends ii{constructor(e){super(),this.userData.isMetaShape=!0;for(let t of e.meshes){let e=t.vertices,n=t.indices,r=[];for(let t=0;t<n.length;t+=2){let i=n[t]*3;r.push(e[i],e[i+1],e[i+2])}if(n.length>=2){let t=n[n.length-1]*3;r.push(e[t],e[t+1],e[t+2])}let i=new Tr;i.setAttribute(`position`,new W(new Float32Array(r),3));let a=new Ui(i,new qr({uniforms:{color:{value:Nd.metaEdgeColor},dashLength:{value:$d},gapLength:{value:ef},dotLength:{value:tf},patternLength:{value:nf}},vertexShader:rf,fragmentShader:af,side:2,transparent:!0,polygonOffset:!0,polygonOffsetFactor:2,polygonOffsetUnits:1}));a.computeLineDistances(),this.add(a)}}},sf=`#2297ff`,cf=2,lf=class extends ii{constructor(e){super(),this.userData.isMetaShape=!0;for(let t of e.meshes){let e=new Tr;e.setAttribute(`position`,new W(new Float32Array(t.vertices),3)),e.setAttribute(`normal`,new W(new Float32Array(t.normals),3));let n=t.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new n(t.indices),1));let r=new qi(e,new Fi({color:sf,linewidth:cf,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1,side:2,depthWrite:!0,depthTest:!0}));this.add(r)}}},uf=`#2297ff`,df=`#2297ff`,ff=.15,pf=.4,mf=class extends ii{constructor(e,t){super(),this.userData.isMetaShape=!0,this.userData.isPickRegion=!0,this.userData.isPickRegionSelected=t,e.metaData&&(this.userData.metaData=e.metaData);let n=t?df:uf,r=t?pf:ff;for(let t of e.meshes){let e=new Tr;e.setAttribute(`position`,new W(new Float32Array(t.vertices),3)),e.setAttribute(`normal`,new W(new Float32Array(t.normals),3));let i=t.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new i(t.indices),1)),e.computeBoundingBox();let a=new G(e,new dr({color:n,transparent:!0,opacity:r,side:2,depthWrite:!1,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}));this.add(a)}}},hf=`#2297ff`,gf=2,_f=2,vf=16,yf=.003,bf=1.5,xf=1e-8;function Sf(e,t,n){if(e instanceof Pa)return(e.top-e.bottom)/e.zoom*n;if(e instanceof Qr){let r=e.position.distanceTo(t),i=e.fov*Math.PI/180;return 2*r*Math.tan(i/2)*n}return 1}var Cf=class extends ii{constructor(e){super(),this.userData.isMetaShape=!0;let t=new Zi(_f,vf),n=new dr({color:hf,side:2,depthTest:!0}),r=[];for(let t of e.meshes){let e=new Tr;e.setAttribute(`position`,new W(new Float32Array(t.vertices),3)),e.setAttribute(`normal`,new W(new Float32Array(t.normals),3));let n=t.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new n(t.indices),1));let i=new Fi({color:hf,linewidth:gf,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1,side:2,depthWrite:!0,depthTest:!0});this.add(new qi(e,i));let a=t.vertices,o=t.indices,s=new Map;for(let e of o)s.set(e,(s.get(e)||0)+1);for(let[e,t]of s)if(t===1){let t=new B(a[e*3],a[e*3+1],a[e*3+2]);r.some(e=>e.distanceToSquared(t)<xf)||r.push(t)}}for(let e of r){let r=new G(t,n);r.renderOrder=2;let i=new ii;i.renderOrder=2,i.userData.isVertexDot=!0,i.add(r),i.position.copy(e),r.onBeforeRender=(t,n,r)=>{i.scale.setScalar(Math.min(Sf(r,e,yf),bf)),i.updateMatrixWorld(!0)},this.add(i)}}},wf={color:`#2297ff`,lineWidth:2},Tf={trim:e=>new lf(e),"pick-edge":e=>new Cf(e)};function Ef(e){let t=e.metaType?Tf[e.metaType]:void 0;return t?t(e):new of(e)}var Df={"pick-region":e=>new mf(e,!1),"pick-region-selected":e=>new mf(e,!0)};function Of(e){let t=e.metaType?Df[e.metaType]:void 0;return t?t(e):new Zd(e)}var kf=class extends ii{constructor(e,t,n){if(super(),!e.sceneShapes)return;let r=e.sceneShapes.every(e=>e.isMetaShape||e.shapeType===`wire`||e.shapeType===`edge`),i=[`pick-region`,`pick-region-selected`,`pick-edge`];for(let a of e.sceneShapes){if(!t&&a.isMetaShape&&a.metaType&&i.includes(a.metaType))continue;let e;if(a.isMetaShape)switch(a.shapeType){case`wire`:case`edge`:e=Ef(a);break;case`face`:e=Of(a);break}else switch(a.shapeType){case`wire`:case`edge`:e=new Yd(a,n?.edge??(r?wf:void 0));break;case`face`:e=new Zd(a,n?.face);break;case`solid`:e=new Qd(a,n);break}e&&(a.shapeId&&(e.userData.shapeId=a.shapeId),this.add(e))}}};function Af(e,t,n){if(e instanceof Pa)return(e.top-e.bottom)/e.zoom*n;if(e instanceof Qr){let r=e.position.distanceTo(t),i=e.fov*Math.PI/180;return 2*r*Math.tan(i/2)*n}return 1}var jf=`#2297ff`,Mf=2,Nf=16,Pf=.003,Ff=1.5,If=15954511,Lf=64,Rf=3,zf=15954511,Bf=.35,Vf=.6,Hf=18,Uf=5,Wf=2.5,Gf=class extends ii{constructor(e,t,n,r){super(),this.buildEdges(e,t),this.buildVertices(e,t,r),n&&e.id===n&&(this.buildCursor(e,r),this.buildTangentArrow(e,r))}buildEdges(e,t){for(let n of t)if(!(n.parentId!==e.id||!n.sceneShapes.length))for(let e of n.sceneShapes){if(e.isMetaShape||e.isGuide){if(e.shapeType===`wire`||e.shapeType===`edge`){let t=Ef(e);e.shapeId&&(t.userData.shapeId=e.shapeId),this.add(t)}continue}let t=new Yd(e,{color:jf,lineWidth:2});e.shapeId&&(t.userData.shapeId=e.shapeId),this.add(t)}}buildVertices(e,t,n){let r=e.object?.plane?.normal,i=[];for(let n of t)if(!(n.parentId!==e.id||!n.sceneShapes.length)){for(let e of n.sceneShapes)if(!(e.isMetaShape||e.isGuide))for(let t of e.meshes){if(!t.indices.length)continue;let e=new Map;for(let n of t.indices)e.set(n,(e.get(n)||0)+1);for(let[n,r]of e)r===1&&i.push(new B(t.vertices[n*3],t.vertices[n*3+1],t.vertices[n*3+2]))}}let a=[];for(let e of i)a.some(t=>t.distanceToSquared(e)<1e-12)||a.push(e);let o=new Zi(Mf,Nf),s=new dr({color:jf,side:2,depthTest:!1});for(let e of a){let t=new G(o,s);t.renderOrder=2;let i=new ii;i.renderOrder=2,i.userData.isVertexDot=!0,i.add(t),i.position.copy(e),r&&i.lookAt(new B(e.x+r.x,e.y+r.y,e.z+r.z)),i.scale.setScalar(Math.min(Af(n,e,Pf),Ff)),t.onBeforeRender=(t,n,r)=>{i.scale.setScalar(Math.min(Af(r,e,Pf),Ff)),i.updateMatrixWorld(!0)},this.add(i)}}buildCursor(e,t){let n=e.object?.currentPosition;if(!n)return;let r=new Zi(Rf,Lf),i=new dr({color:If,side:2,depthTest:!1});i.transparent=!0,i.opacity=.8;let a=new G(r,i);a.renderOrder=1;let o=new ii;o.renderOrder=1,o.add(a),o.position.set(n.x,n.y,n.z);let s=e.object?.plane?.normal;if(s){let e=new B(n.x+s.x,n.y+s.y,n.z+s.z);o.lookAt(e)}o.scale.setScalar(Af(t,o.position,.003)),a.onBeforeRender=(e,t,n)=>{o.scale.setScalar(Af(n,o.position,.003)),o.updateMatrixWorld(!0)},this.add(o)}buildTangentArrow(e,t){let n=e.object?.currentPosition,r=e.object?.currentTangent,i=e.object?.plane?.origin;if(!n||!r||!i)return;let a=new B(r.x-i.x,r.y-i.y,r.z-i.z).normalize(),o=new dr({color:zf,transparent:!0,opacity:Bf,depthTest:!1}),s=new Qi(Vf,Vf,Hf,8);s.translate(0,Hf/2,0);let c=new G(s,o),l=new $i(Wf,Uf,8);l.translate(0,Hf+Uf/2,0);let u=new G(l,o),d=new ii;d.renderOrder=1,d.add(c),d.add(u);let f=new B(0,1,0),p=new mt().setFromUnitVectors(f,a);d.quaternion.copy(p),d.position.set(n.x,n.y,n.z),d.scale.setScalar(Af(t,d.position,.003)),c.onBeforeRender=(e,t,n)=>{d.scale.setScalar(Af(n,d.position,.003)),d.updateMatrixWorld(!0)},this.add(d)}};function Kf(e,t,n){if(e instanceof Pa)return(e.top-e.bottom)/e.zoom*n;if(e instanceof Qr){let r=e.position.distanceTo(t),i=e.fov*Math.PI/180;return 2*r*Math.tan(i/2)*n}return 1}var qf=`#ffc26c`,Jf=`#c88f40`,Yf=`#c88f40`,Xf=.1,Zf=20,Qf=3,$f=1.5,ep=.4,tp=class extends ii{constructor(e,t){super();let n=e.sceneShapes[0]?.meshes[0];if(!n)return;this.userData.isMetaShape=!0,this.userData.isConstructionPlane=!0;let r=e.object.normal,i=e.object.center,a=new Tr;a.setAttribute(`position`,new W(new Float32Array(n.vertices),3)),a.setAttribute(`normal`,new W(new Float32Array(n.normals),3)),a.setIndex(new W(new Uint16Array(n.indices),1)),a.computeBoundingBox();let o=new G(a,new dr({color:qf,transparent:!0,opacity:Xf,side:2,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1}));this.add(o);let s=new qi(new ia(a,18),new Fi({color:Jf,linewidth:1}));this.add(s);let c=new B(r.x,r.y,r.z).normalize(),l=new B(i.x,i.y,i.z),u=new dr({color:Yf}),d=Zf-Qf,f=new Qi(ep,ep,d,8);f.translate(0,d/2,0);let p=new G(f,u),m=new $i($f,Qf,8);m.translate(0,d+Qf/2,0);let h=new G(m,u),g=new ii;g.add(p),g.add(h);let _=new B(0,1,0),v=new mt().setFromUnitVectors(_,c);g.quaternion.copy(v),g.position.copy(l),g.scale.setScalar(Kf(t,g.position,.006)),p.onBeforeRender=(e,t,n)=>{g.scale.setScalar(Kf(n,g.position,.006)),g.updateMatrixWorld(!0)},this.add(g),this.position.z=.01}},np=`#c88f40`,rp=class extends ii{constructor(e){super();let t=e.sceneShapes[0]?.meshes[0];if(!t)return;let n=new Tr;n.setAttribute(`position`,new W(new Float32Array(t.vertices),3));let r=new qi(n,new fa({color:np,dashSize:5,gapSize:5}));r.computeLineDistances(),this.add(r)}},ip={edge:{color:`#11a4ed`,lineWidth:3,depthWrite:!1},face:{color:`#5c9fcc`,opacity:1}},ap={edge:{opacity:.3},face:{opacity:.3}};function op(e,t,n,r){if(r)return r;if(e===`select`)return ip;if(t&&n!==`sketch`)return ap}function sp(e,t,n,r,i,a){switch(e.type){case`sketch`:return new Gf(e,t,n,r);case`plane`:return new tp(e,r);case`axis`:return new rp(e)}let o=e.uniqueType===`select`,s=op(e.uniqueType,n,e.type,a),c=t.filter(t=>t.parentId===e.id),l;if(c.length>0){let e=new ii;for(let a of c)e.add(sp(a,t,n,r,i,s));l=e}else l=new kf(e,i,s);return o&&l.traverse(e=>{e.renderOrder=999}),l}function cp(e,t,n,r=!1){let i=new ii;i.name=`compiledMesh`;for(let a of e)a.parentId||!a.visible&&!(t&&a.type===`sketch`)||i.add(sp(a,e,t,n,r));let a=new Map,o=0;for(let t of e)if(t.sceneShapes)for(let e of t.sceneShapes)e.isMetaShape||(e.shapeId&&a.set(e.shapeId,o),o++);return i.traverse(e=>{let t=e.userData.shapeId;t&&a.has(t)&&(e.userData.shapeIndex=a.get(t))}),i}var lp=`/api/preferences`;async function up(){try{let e=await fetch(lp);return e.ok?await e.json():null}catch{return null}}function dp(e,t){fetch(lp,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({[e]:t})}).catch(()=>{})}var fp=`<svg
4308
+ `,of=class extends ii{constructor(e){super(),this.userData.isMetaShape=!0;for(let t of e.meshes){let e=t.vertices,n=t.indices,r=[];for(let t=0;t<n.length;t+=2){let i=n[t]*3;r.push(e[i],e[i+1],e[i+2])}if(n.length>=2){let t=n[n.length-1]*3;r.push(e[t],e[t+1],e[t+2])}let i=new Tr;i.setAttribute(`position`,new W(new Float32Array(r),3));let a=new Ui(i,new qr({uniforms:{color:{value:Nd.metaEdgeColor},dashLength:{value:$d},gapLength:{value:ef},dotLength:{value:tf},patternLength:{value:nf}},vertexShader:rf,fragmentShader:af,side:2,transparent:!0,polygonOffset:!0,polygonOffsetFactor:2,polygonOffsetUnits:1}));a.computeLineDistances(),this.add(a)}}},sf=`#2297ff`,cf=2,lf=class extends ii{constructor(e){super(),this.userData.isMetaShape=!0;for(let t of e.meshes){let e=new Tr;e.setAttribute(`position`,new W(new Float32Array(t.vertices),3)),e.setAttribute(`normal`,new W(new Float32Array(t.normals),3));let n=t.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new n(t.indices),1));let r=new qi(e,new Fi({color:sf,linewidth:cf,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1,side:2,depthWrite:!0,depthTest:!0}));this.add(r)}}},uf=`#2297ff`,df=`#2297ff`,ff=.15,pf=.4,mf=class extends ii{constructor(e,t){super(),this.userData.isMetaShape=!0,this.userData.isPickRegion=!0,this.userData.isPickRegionSelected=t,e.metaData&&(this.userData.metaData=e.metaData);let n=t?df:uf,r=t?pf:ff;for(let t of e.meshes){let e=new Tr;e.setAttribute(`position`,new W(new Float32Array(t.vertices),3)),e.setAttribute(`normal`,new W(new Float32Array(t.normals),3));let i=t.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new i(t.indices),1)),e.computeBoundingBox();let a=new G(e,new dr({color:n,transparent:!0,opacity:r,side:2,depthWrite:!1,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}));this.add(a)}}},hf=`#2297ff`,gf=2,_f=2,vf=16,yf=.003,bf=1.5,xf=1e-8;function Sf(e,t,n){if(e instanceof Pa)return(e.top-e.bottom)/e.zoom*n;if(e instanceof Qr){let r=e.position.distanceTo(t),i=e.fov*Math.PI/180;return 2*r*Math.tan(i/2)*n}return 1}var Cf=class extends ii{constructor(e){super(),this.userData.isMetaShape=!0;let t=new Zi(_f,vf),n=new dr({color:hf,side:2,depthTest:!0}),r=[];for(let t of e.meshes){let e=new Tr;e.setAttribute(`position`,new W(new Float32Array(t.vertices),3)),e.setAttribute(`normal`,new W(new Float32Array(t.normals),3));let n=t.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new n(t.indices),1));let i=new Fi({color:hf,linewidth:gf,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1,side:2,depthWrite:!0,depthTest:!0});this.add(new qi(e,i));let a=t.vertices,o=t.indices,s=new Map;for(let e of o)s.set(e,(s.get(e)||0)+1);for(let[e,t]of s)if(t===1){let t=new B(a[e*3],a[e*3+1],a[e*3+2]);r.some(e=>e.distanceToSquared(t)<xf)||r.push(t)}}for(let e of r){let r=new G(t,n);r.renderOrder=2;let i=new ii;i.renderOrder=2,i.userData.isVertexDot=!0,i.add(r),i.position.copy(e),r.onBeforeRender=(t,n,r)=>{i.scale.setScalar(Math.min(Sf(r,e,yf),bf)),i.updateMatrixWorld(!0)},this.add(i)}}},wf={color:`#2297ff`,lineWidth:2},Tf={trim:e=>new lf(e),"pick-edge":e=>new Cf(e)};function Ef(e){let t=e.metaType?Tf[e.metaType]:void 0;return t?t(e):new of(e)}var Df={"pick-region":e=>new mf(e,!1),"pick-region-selected":e=>new mf(e,!0)};function Of(e){let t=e.metaType?Df[e.metaType]:void 0;return t?t(e):new Zd(e)}var kf=class extends ii{constructor(e,t,n){if(super(),!e.sceneShapes)return;let r=e.sceneShapes.every(e=>e.isMetaShape||e.shapeType===`wire`||e.shapeType===`edge`),i=[`pick-region`,`pick-region-selected`,`pick-edge`];for(let a of e.sceneShapes){if(!t&&a.isMetaShape&&a.metaType&&i.includes(a.metaType))continue;let e;if(a.isMetaShape)switch(a.shapeType){case`wire`:case`edge`:e=Ef(a);break;case`face`:e=Of(a);break}else switch(a.shapeType){case`wire`:case`edge`:e=new Yd(a,n?.edge??(r?wf:void 0));break;case`face`:e=new Zd(a,n?.face);break;case`solid`:e=new Qd(a,n);break}e&&(a.shapeId&&(e.userData.shapeId=a.shapeId),this.add(e))}}};function Af(e,t,n){if(e instanceof Pa)return(e.top-e.bottom)/e.zoom*n;if(e instanceof Qr){let r=e.position.distanceTo(t),i=e.fov*Math.PI/180;return 2*r*Math.tan(i/2)*n}return 1}var jf=`#2297ff`,Mf=2,Nf=16,Pf=.003,Ff=1.5,If=15954511,Lf=64,Rf=3,zf=15954511,Bf=.35,Vf=.6,Hf=18,Uf=5,Wf=2.5,Gf=class extends ii{constructor(e,t,n,r){super(),this.buildEdges(e,t),this.buildVertices(e,t,r),n&&e.id===n&&(this.buildCursor(e,r),this.buildTangentArrow(e,r))}buildEdges(e,t){for(let n of t)if(!(n.parentId!==e.id||!n.sceneShapes.length))for(let e of n.sceneShapes){if(e.isMetaShape||e.isGuide){if(e.shapeType===`wire`||e.shapeType===`edge`){let t=Ef(e);e.shapeId&&(t.userData.shapeId=e.shapeId),this.add(t)}continue}let t=new Yd(e,{color:jf,lineWidth:2});e.shapeId&&(t.userData.shapeId=e.shapeId),this.add(t)}}buildVertices(e,t,n){let r=e.object?.plane?.normal,i=[];for(let n of t)if(!(n.parentId!==e.id||!n.sceneShapes.length)){for(let e of n.sceneShapes)if(!(e.isMetaShape||e.isGuide))for(let t of e.meshes){if(!t.indices.length)continue;let e=new Map;for(let n of t.indices)e.set(n,(e.get(n)||0)+1);for(let[n,r]of e)r===1&&i.push(new B(t.vertices[n*3],t.vertices[n*3+1],t.vertices[n*3+2]))}}let a=[];for(let e of i)a.some(t=>t.distanceToSquared(e)<1e-12)||a.push(e);let o=new Zi(Mf,Nf),s=new dr({color:jf,side:2,depthTest:!1});for(let e of a){let t=new G(o,s);t.renderOrder=2;let i=new ii;i.renderOrder=2,i.userData.isVertexDot=!0,i.add(t),i.position.copy(e),r&&i.lookAt(new B(e.x+r.x,e.y+r.y,e.z+r.z)),i.scale.setScalar(Math.min(Af(n,e,Pf),Ff)),t.onBeforeRender=(t,n,r)=>{i.scale.setScalar(Math.min(Af(r,e,Pf),Ff)),i.updateMatrixWorld(!0)},this.add(i)}}buildCursor(e,t){let n=e.object?.currentPosition;if(!n)return;let r=new Zi(Rf,Lf),i=new dr({color:If,side:2,depthTest:!1});i.transparent=!0,i.opacity=.8;let a=new G(r,i);a.renderOrder=1;let o=new ii;o.renderOrder=1,o.add(a),o.position.set(n.x,n.y,n.z);let s=e.object?.plane?.normal;if(s){let e=new B(n.x+s.x,n.y+s.y,n.z+s.z);o.lookAt(e)}o.scale.setScalar(Af(t,o.position,.003)),a.onBeforeRender=(e,t,n)=>{o.scale.setScalar(Af(n,o.position,.003)),o.updateMatrixWorld(!0)},this.add(o)}buildTangentArrow(e,t){let n=e.object?.currentPosition,r=e.object?.currentTangent,i=e.object?.plane?.origin;if(!n||!r||!i)return;let a=new B(r.x-i.x,r.y-i.y,r.z-i.z).normalize(),o=new dr({color:zf,transparent:!0,opacity:Bf,side:2,depthTest:!1,depthWrite:!1}),s=new Qi(Vf,Vf,Hf,16);s.translate(0,Hf/2,0);let c=new G(s,o),l=new $i(Wf,Uf,16);l.translate(0,Hf+Uf/2,0);let u=new G(l,o),d=new ii;d.renderOrder=1,d.add(c),d.add(u);let f=new B(0,1,0),p=new mt().setFromUnitVectors(f,a);d.quaternion.copy(p),d.position.set(n.x,n.y,n.z),d.scale.setScalar(Af(t,d.position,.003)),c.onBeforeRender=(e,t,n)=>{d.scale.setScalar(Af(n,d.position,.003)),d.updateMatrixWorld(!0)},this.add(d)}};function Kf(e,t,n){if(e instanceof Pa)return(e.top-e.bottom)/e.zoom*n;if(e instanceof Qr){let r=e.position.distanceTo(t),i=e.fov*Math.PI/180;return 2*r*Math.tan(i/2)*n}return 1}var qf=`#ffc26c`,Jf=`#c88f40`,Yf=`#c88f40`,Xf=.1,Zf=20,Qf=3,$f=1.5,ep=.4,tp=class extends ii{constructor(e,t){super();let n=e.sceneShapes[0]?.meshes[0];if(!n)return;this.userData.isMetaShape=!0,this.userData.isConstructionPlane=!0;let r=e.object.normal,i=e.object.center,a=new Tr;a.setAttribute(`position`,new W(new Float32Array(n.vertices),3)),a.setAttribute(`normal`,new W(new Float32Array(n.normals),3)),a.setIndex(new W(new Uint16Array(n.indices),1)),a.computeBoundingBox();let o=new G(a,new dr({color:qf,transparent:!0,opacity:Xf,side:2,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1}));this.add(o);let s=new qi(new ia(a,18),new Fi({color:Jf,linewidth:1}));this.add(s);let c=new B(r.x,r.y,r.z).normalize(),l=new B(i.x,i.y,i.z),u=new dr({color:Yf}),d=Zf-Qf,f=new Qi(ep,ep,d,8);f.translate(0,d/2,0);let p=new G(f,u),m=new $i($f,Qf,8);m.translate(0,d+Qf/2,0);let h=new G(m,u),g=new ii;g.add(p),g.add(h);let _=new B(0,1,0),v=new mt().setFromUnitVectors(_,c);g.quaternion.copy(v),g.position.copy(l),g.scale.setScalar(Kf(t,g.position,.006)),p.onBeforeRender=(e,t,n)=>{g.scale.setScalar(Kf(n,g.position,.006)),g.updateMatrixWorld(!0)},this.add(g),this.position.z=.01}},np=`#c88f40`,rp=class extends ii{constructor(e){super();let t=e.sceneShapes[0]?.meshes[0];if(!t)return;let n=new Tr;n.setAttribute(`position`,new W(new Float32Array(t.vertices),3));let r=new qi(n,new fa({color:np,dashSize:5,gapSize:5}));r.computeLineDistances(),this.add(r)}},ip={edge:{color:`#11a4ed`,lineWidth:3,depthWrite:!1},face:{color:`#5c9fcc`,opacity:1}},ap={edge:{opacity:.3},face:{opacity:.3}};function op(e,t,n,r){if(r)return r;if(e===`select`)return ip;if(t&&n!==`sketch`)return ap}function sp(e,t,n,r,i,a){switch(e.type){case`sketch`:return new Gf(e,t,n,r);case`plane`:return new tp(e,r);case`axis`:return new rp(e)}let o=e.uniqueType===`select`,s=op(e.uniqueType,n,e.type,a),c=t.filter(t=>t.parentId===e.id),l;if(c.length>0){let e=new ii;for(let a of c)e.add(sp(a,t,n,r,i,s));l=e}else l=new kf(e,i,s);return o&&l.traverse(e=>{e.renderOrder=999}),l}function cp(e,t,n,r=!1){let i=new ii;i.name=`compiledMesh`;for(let a of e)a.parentId||!a.visible&&!(t&&a.type===`sketch`)||i.add(sp(a,e,t,n,r));let a=new Map,o=0;for(let t of e)if(t.sceneShapes)for(let e of t.sceneShapes)e.isMetaShape||(e.shapeId&&a.set(e.shapeId,o),o++);return i.traverse(e=>{let t=e.userData.shapeId;t&&a.has(t)&&(e.userData.shapeIndex=a.get(t))}),i}var lp=`/api/preferences`;async function up(){try{let e=await fetch(lp);return e.ok?await e.json():null}catch{return null}}function dp(e,t){fetch(lp,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({[e]:t})}).catch(()=>{})}var fp=`<svg
4309
4309
  xmlns="http://www.w3.org/2000/svg"
4310
4310
  width="24"
4311
4311
  height="24"
@@ -4,7 +4,7 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>FluidCAD Viewer</title>
7
- <script type="module" crossorigin src="/assets/index-D2eOzshJ.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-BeLxRMCv.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-gPoNOiIs.css">
9
9
  </head>
10
10
  <body class="m-0 p-0 overflow-hidden w-full h-full bg-base-100 text-base-content">
@@ -1,64 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { setupOC, render } from "../setup.js";
3
- import sketch from "../../core/sketch.js";
4
- import extrude from "../../core/extrude.js";
5
- import sphere from "../../core/sphere.js";
6
- import { rect } from "../../core/2d/index.js";
7
- import { ShapeOps } from "../../oc/shape-ops.js";
8
- describe("chained transforms on scene objects", () => {
9
- setupOC();
10
- it("applies .translate() from chained call", () => {
11
- sketch("xy", () => {
12
- rect(20, 20);
13
- });
14
- const e = extrude(10).new().translate(50);
15
- render();
16
- const shapes = e.getShapes();
17
- expect(shapes).toHaveLength(1);
18
- const bbox = ShapeOps.getBoundingBox(shapes[0]);
19
- expect(bbox.minX).toBeCloseTo(50, 0);
20
- expect(bbox.maxX).toBeCloseTo(70, 0);
21
- });
22
- it("composes chained transforms left-to-right", () => {
23
- const s = sphere(1).translate(5, 0, 0).rotate("z", 90);
24
- render();
25
- const shapes = s.getShapes();
26
- const bbox = ShapeOps.getBoundingBox(shapes[0]);
27
- const cx = (bbox.minX + bbox.maxX) / 2;
28
- const cy = (bbox.minY + bbox.maxY) / 2;
29
- expect(cx).toBeCloseTo(0, 1);
30
- expect(cy).toBeCloseTo(5, 1);
31
- });
32
- it("composes multiple translates into a single offset", () => {
33
- sketch("xy", () => {
34
- rect(10, 10);
35
- });
36
- const e = extrude(10).new().translate(3, 0, 0).translate(0, 4, 0);
37
- render();
38
- const shapes = e.getShapes();
39
- const bbox = ShapeOps.getBoundingBox(shapes[0]);
40
- expect(bbox.minX).toBeCloseTo(3, 0);
41
- expect(bbox.minY).toBeCloseTo(4, 0);
42
- });
43
- it("chained translate with a PointLike array", () => {
44
- sketch("xy", () => {
45
- rect(10, 10);
46
- });
47
- const e = extrude(10).new().translate([7, 8, 9]);
48
- render();
49
- const bbox = ShapeOps.getBoundingBox(e.getShapes()[0]);
50
- expect(bbox.minX).toBeCloseTo(7, 0);
51
- expect(bbox.minY).toBeCloseTo(8, 0);
52
- expect(bbox.minZ).toBeCloseTo(9, 0);
53
- });
54
- it("chained mirror across a plane", () => {
55
- sketch("xy", () => {
56
- rect(20, 20);
57
- });
58
- const e = extrude(10).new().translate(5, 0, 0).mirror("yz");
59
- render();
60
- const bbox = ShapeOps.getBoundingBox(e.getShapes()[0]);
61
- expect(bbox.maxX).toBeCloseTo(-5, 0);
62
- expect(bbox.minX).toBeCloseTo(-25, 0);
63
- });
64
- });