fluidcad 0.0.15 → 0.0.16

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 (38) hide show
  1. package/bin/fluidcad.js +2 -2
  2. package/lib/dist/common/scene-object.d.ts +4 -1
  3. package/lib/dist/common/scene-object.js +14 -3
  4. package/lib/dist/core/interfaces.d.ts +18 -0
  5. package/lib/dist/core/part.js +1 -1
  6. package/lib/dist/core/repeat.js +2 -1
  7. package/lib/dist/features/2d/aline.d.ts +2 -0
  8. package/lib/dist/features/2d/aline.js +4 -0
  9. package/lib/dist/features/axis.d.ts +2 -0
  10. package/lib/dist/features/axis.js +3 -0
  11. package/lib/dist/features/color.d.ts +1 -0
  12. package/lib/dist/features/color.js +4 -0
  13. package/lib/dist/features/extrude-base.d.ts +13 -0
  14. package/lib/dist/features/extrude-base.js +64 -0
  15. package/lib/dist/features/extrude-to-face.js +28 -7
  16. package/lib/dist/features/extrude-two-distances.js +72 -17
  17. package/lib/dist/features/extrude.js +90 -21
  18. package/lib/dist/features/mirror-shape2d.d.ts +1 -0
  19. package/lib/dist/features/mirror-shape2d.js +7 -0
  20. package/lib/dist/features/remove.js +1 -1
  21. package/lib/dist/filters/filter-builder-base.d.ts +7 -0
  22. package/lib/dist/filters/filter-builder-base.js +16 -0
  23. package/lib/dist/filters/filter.js +6 -0
  24. package/lib/dist/filters/tangent-expander.d.ts +47 -0
  25. package/lib/dist/filters/tangent-expander.js +223 -0
  26. package/lib/dist/index.js +6 -1
  27. package/lib/dist/oc/thin-face-maker.d.ts +12 -1
  28. package/lib/dist/oc/thin-face-maker.js +54 -13
  29. package/lib/dist/rendering/scene.js +5 -4
  30. package/lib/dist/tests/features/extrude-two-distances.test.js +16 -0
  31. package/lib/dist/tests/features/repeat-circular.test.js +12 -0
  32. package/lib/dist/tests/features/repeat-linear.test.js +22 -0
  33. package/lib/dist/tests/features/select.test.js +55 -0
  34. package/lib/dist/tests/features/thin-extrude.test.js +61 -0
  35. package/lib/dist/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +3 -3
  37. package/ui/dist/assets/{index-BJG141m7.js → index-CLQhpG6A.js} +1 -1
  38. package/ui/dist/index.html +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fluidcad",
3
- "version": "0.0.15",
3
+ "version": "0.0.16",
4
4
  "description": "Parametric CAD modeling library using javascript",
5
5
  "author": "Marwan Aouida <contact@marwan.dev>",
6
6
  "homepage": "https://fluidcad.io",
@@ -58,8 +58,8 @@
58
58
  "chokidar": "^5.0.0",
59
59
  "color-name": "^2.1.0",
60
60
  "express": "^5.2.1",
61
- "occjs-fluidcad": "^2.0.0",
62
- "occjs-wrapper": "npm:occjs-fluidcad@2.0.0",
61
+ "occjs-fluidcad": "^3.0.0",
62
+ "occjs-wrapper": "npm:occjs-fluidcad@3.0.0",
63
63
  "tsx": "^4.21.0",
64
64
  "vite": "^8.0.8",
65
65
  "ws": "^8.18.0"
@@ -4272,7 +4272,7 @@ void main() {
4272
4272
 
4273
4273
  }
4274
4274
 
4275
- `,extensions:{clipCullDistance:!1,multiDraw:!1}});super(a,o),this.frustumCulled=!1}},Bd={cameraMode:`orthographic`,showGrid:!0},Vd=new class{current={...Bd};listeners=new Set;update(e){Object.assign(this.current,e);for(let e of this.listeners)e(this.current)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}},Hd=new B(0,0,1),Ud=new B(50,-50,40),Wd=50;function Gd(e){return new B(e.x,e.y,e.z)}var Kd=class{mode=`default`;cameraBackup=null;cameraBackupMode=null;enabled=!0;lastGridNormal=Hd.clone();lastGridPosition;constructor(e){this.ctx=e,this.setupDefaultAxes(),this.setupGrid(Hd),Vd.subscribe(()=>this.applyGridVisibility()),Pd(()=>this.rebuildGrid())}get currentMode(){return this.mode}get isSketchMode(){return this.mode===`sketch`}set sketchEnabled(e){this.enabled=e}enterDefaultMode(){this.mode===`sketch`&&(this.restoreCamera(),this.cameraBackupMode===`perspective`&&(this.ctx.switchCamera(`perspective`),Vd.update({cameraMode:`perspective`})),this.cameraBackupMode=null),this.mode=`default`,this.ctx.camera.up.copy(Un.DEFAULT_UP),this.ctx.cameraControls.updateCameraUp(),this.showDefaultAxes(),this.setupGrid(Hd)}enterSketchMode(e){if(!this.enabled)return;this.mode=`sketch`,Vd.current.cameraMode===`perspective`&&(this.cameraBackupMode=`perspective`,this.ctx.switchCamera(`orthographic`)),this.positionCameraForSketch(e),this.showSketchAxes(e);let t=Gd(e.normal),n=Gd(e.origin);this.setupGrid(t,n.add(t.clone().multiplyScalar(-.01)))}enforceSketchNormal(e){let t=this.ctx.cameraControls,n=Gd(e.normal),r=Gd(e.yDirection),i=new B;t.getTarget(i);let a=i.clone().add(n.clone().multiplyScalar(Wd));this.ctx.camera.up.copy(r),t.updateCameraUp(),t.normalizeRotations(),t.setLookAt(a.x,a.y,a.z,i.x,i.y,i.z,!1),t.getTarget(this.ctx.controls.target),this.ctx.gizmo.target=this.ctx.controls.target}positionCameraForSketch(e){let t=this.ctx.cameraControls;if(!this.cameraBackup){let e=new B,n=new B;t.getPosition(e),t.getTarget(n),this.cameraBackup={position:e,target:n}}let n=Gd(e.center),r=Gd(e.normal),i=Gd(e.yDirection),a=n.clone().add(r.clone().multiplyScalar(Wd));this.ctx.camera.up.copy(i),t.updateCameraUp(),t.normalizeRotations(),t.setLookAt(a.x,a.y,a.z,n.x,n.y,n.z,!1),t.getTarget(this.ctx.controls.target),this.ctx.gizmo.target=this.ctx.controls.target}restoreCamera(){let e=this.ctx.cameraControls,t=this.cameraBackup,n=t?.position??Ud.clone(),r=t?.target??new B(0,0,0);this.ctx.camera.up.copy(Un.DEFAULT_UP),e.updateCameraUp(),e.normalizeRotations(),e.setLookAt(n.x,n.y,n.z,r.x,r.y,r.z,!1),e.getTarget(this.ctx.controls.target),this.ctx.gizmo.target=this.ctx.controls.target,this.cameraBackup=null}setupDefaultAxes(){let e=new mo(1e3);e.name=`defaultAxesHelper`,this.ctx.scene.add(e)}showDefaultAxes(){this.removeByName(`sketchAxesHelper`);let e=this.ctx.scene.getObjectByName(`defaultAxesHelper`);e&&(e.visible=!0)}showSketchAxes(e){let t=this.ctx.scene.getObjectByName(`defaultAxesHelper`);t&&(t.visible=!1),this.removeByName(`sketchAxesHelper`);let n=new mo(1e3);n.name=`sketchAxesHelper`;let r=Gd(e.origin),i=Gd(e.xDirection),a=Gd(e.yDirection),o=Gd(e.normal),s=new gn().makeBasis(i,a,o);s.setPosition(r),n.matrix.copy(s),n.matrixAutoUpdate=!1,this.ctx.scene.add(n)}rebuildGrid(){this.setupGrid(this.lastGridNormal,this.lastGridPosition),this.ctx.requestRender()}setupGrid(e,t){this.lastGridNormal=e.clone(),this.lastGridPosition=t?.clone(),this.removeByName(`grid`);let n=new zd(10,100,Nd.gridColor,1e5,e);n.name=`grid`,t&&n.position.copy(t),n.visible=this.mode===`sketch`||Vd.current.showGrid,this.ctx.scene.add(n)}applyGridVisibility(){let e=this.ctx.scene.getObjectByName(`grid`);e&&(e.visible=this.mode===`sketch`||Vd.current.showGrid,this.ctx.requestRender())}removeByName(e){let t=this.ctx.scene.getObjectByName(e);t&&this.ctx.scene.remove(t)}},qd={color:``,lineWidth:1,opacity:1,depthWrite:!0},Jd=class extends ii{constructor(e,t={}){super();let n={...qd,...t};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 r=t.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new r(t.indices),1));let i=new qi(e,new Fi({color:n.color||Nd.edgeColor,linewidth:n.lineWidth,transparent:n.opacity<1,opacity:n.opacity,polygonOffset:!0,polygonOffsetFactor:2,polygonOffsetUnits:1,side:2,depthWrite:n.depthWrite,depthTest:n.depthWrite}));t.edgeIndex!==void 0&&(i.userData.edgeIndex=t.edgeIndex),this.add(i)}}},Yd={color:``,opacity:1},Xd=class extends ii{constructor(e,t={}){super();let n={...Yd,...t};for(let r of e.meshes){let e=new Tr;e.setAttribute(`position`,new W(new Float32Array(r.vertices),3)),e.setAttribute(`normal`,new W(new Float32Array(r.normals),3));let i=r.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new i(r.indices),1)),e.computeBoundingBox();let a=t?.color??r.color??`#`+Nd.faceColor.getHexString(),o=t?.color!==void 0||t?.opacity!==void 0,s=new G(e,new la({color:a,transparent:o||n.opacity<1,opacity:n.opacity,depthWrite:!o,polygonOffset:!0,polygonOffsetFactor:o?-1:1,polygonOffsetUnits:1}));r.faceMapping&&(s.userData.faceMapping=r.faceMapping),this.add(s)}}},Zd=class extends ii{constructor(e,t){super();for(let n of e.meshes)if(n.label===`solid-faces`){let e=new Xd({shapeType:`face`,meshes:[n]},t?.face);e.renderOrder=1,this.add(e)}else if(n.label===`solid-edges`){let e=new Jd({shapeType:`edge`,meshes:[n]},t?.edge);e.renderOrder=2,this.add(e)}}},Qd=4,$d=1.5,ef=.6,tf=Qd+$d+ef+$d,nf=`
4275
+ `,extensions:{clipCullDistance:!1,multiDraw:!1}});super(a,o),this.frustumCulled=!1}},Bd={cameraMode:`orthographic`,showGrid:!0},Vd=new class{current={...Bd};listeners=new Set;update(e){Object.assign(this.current,e);for(let e of this.listeners)e(this.current)}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}},Hd=new B(0,0,1),Ud=new B(50,-50,40),Wd=50;function Gd(e){return new B(e.x,e.y,e.z)}var Kd=class{mode=`default`;cameraBackup=null;cameraBackupMode=null;enabled=!0;lastGridNormal=Hd.clone();lastGridPosition;constructor(e){this.ctx=e,this.setupDefaultAxes(),this.setupGrid(Hd),Vd.subscribe(()=>this.applyGridVisibility()),Pd(()=>this.rebuildGrid())}get currentMode(){return this.mode}get isSketchMode(){return this.mode===`sketch`}set sketchEnabled(e){this.enabled=e}enterDefaultMode(){this.mode===`sketch`&&(this.restoreCamera(),this.cameraBackupMode===`perspective`&&(this.ctx.switchCamera(`perspective`),Vd.update({cameraMode:`perspective`})),this.cameraBackupMode=null),this.mode=`default`,this.ctx.camera.up.copy(Un.DEFAULT_UP),this.ctx.cameraControls.updateCameraUp(),this.showDefaultAxes(),this.setupGrid(Hd)}enterSketchMode(e){if(!this.enabled)return;this.mode=`sketch`,Vd.current.cameraMode===`perspective`&&(this.cameraBackupMode=`perspective`,this.ctx.switchCamera(`orthographic`)),this.positionCameraForSketch(e),this.showSketchAxes(e);let t=Gd(e.normal),n=Gd(e.origin);this.setupGrid(t,n.add(t.clone().multiplyScalar(-.01)))}enforceSketchNormal(e){let t=this.ctx.cameraControls,n=Gd(e.normal),r=Gd(e.yDirection),i=new B;t.getTarget(i);let a=i.clone().add(n.clone().multiplyScalar(Wd));this.ctx.camera.up.copy(r),t.updateCameraUp(),t.normalizeRotations(),t.setLookAt(a.x,a.y,a.z,i.x,i.y,i.z,!1),t.getTarget(this.ctx.controls.target),this.ctx.gizmo.target=this.ctx.controls.target}positionCameraForSketch(e){let t=this.ctx.cameraControls;if(!this.cameraBackup){let e=new B,n=new B;t.getPosition(e),t.getTarget(n),this.cameraBackup={position:e,target:n}}let n=Gd(e.center),r=Gd(e.normal),i=Gd(e.yDirection),a=n.clone().add(r.clone().multiplyScalar(Wd));this.ctx.camera.up.copy(i),t.updateCameraUp(),t.normalizeRotations(),t.setLookAt(a.x,a.y,a.z,n.x,n.y,n.z,!1),t.getTarget(this.ctx.controls.target),this.ctx.gizmo.target=this.ctx.controls.target}restoreCamera(){let e=this.ctx.cameraControls,t=this.cameraBackup,n=t?.position??Ud.clone(),r=t?.target??new B(0,0,0);this.ctx.camera.up.copy(Un.DEFAULT_UP),e.updateCameraUp(),e.normalizeRotations(),e.setLookAt(n.x,n.y,n.z,r.x,r.y,r.z,!1),e.getTarget(this.ctx.controls.target),this.ctx.gizmo.target=this.ctx.controls.target,this.cameraBackup=null}setupDefaultAxes(){let e=new mo(1e3);e.name=`defaultAxesHelper`,this.ctx.scene.add(e)}showDefaultAxes(){this.removeByName(`sketchAxesHelper`);let e=this.ctx.scene.getObjectByName(`defaultAxesHelper`);e&&(e.visible=!0)}showSketchAxes(e){let t=this.ctx.scene.getObjectByName(`defaultAxesHelper`);t&&(t.visible=!1),this.removeByName(`sketchAxesHelper`);let n=new mo(1e3);n.name=`sketchAxesHelper`;let r=Gd(e.origin),i=Gd(e.xDirection),a=Gd(e.yDirection),o=Gd(e.normal),s=new gn().makeBasis(i,a,o);s.setPosition(r),n.matrix.copy(s),n.matrixAutoUpdate=!1,this.ctx.scene.add(n)}rebuildGrid(){this.setupGrid(this.lastGridNormal,this.lastGridPosition),this.ctx.requestRender()}setupGrid(e,t){this.lastGridNormal=e.clone(),this.lastGridPosition=t?.clone(),this.removeByName(`grid`);let n=new zd(10,100,Nd.gridColor,1e5,e);n.name=`grid`,t&&n.position.copy(t),n.visible=this.mode===`sketch`||Vd.current.showGrid,this.ctx.scene.add(n)}applyGridVisibility(){let e=this.ctx.scene.getObjectByName(`grid`);e&&(e.visible=this.mode===`sketch`||Vd.current.showGrid,this.ctx.requestRender())}removeByName(e){let t=this.ctx.scene.getObjectByName(e);t&&this.ctx.scene.remove(t)}},qd={color:``,lineWidth:1,opacity:1,depthWrite:!0},Jd=class extends ii{constructor(e,t={}){super();let n={...qd,...t};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 r=t.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new r(t.indices),1));let i=new qi(e,new Fi({color:n.color||Nd.edgeColor,linewidth:n.lineWidth,transparent:n.opacity<1,opacity:n.opacity,polygonOffset:!0,polygonOffsetFactor:2,polygonOffsetUnits:1,side:2,depthWrite:n.depthWrite,depthTest:n.depthWrite}));t.edgeIndex!==void 0&&(i.userData.edgeIndex=t.edgeIndex),this.add(i)}}},Yd={color:``,opacity:1},Xd=class extends ii{constructor(e,t={}){super();let n={...Yd,...t};for(let r of e.meshes){let e=new Tr;e.setAttribute(`position`,new W(new Float32Array(r.vertices),3)),e.setAttribute(`normal`,new W(new Float32Array(r.normals),3));let i=r.vertices.length/3>65535?Uint32Array:Uint16Array;e.setIndex(new W(new i(r.indices),1)),e.computeBoundingBox();let a=t?.color??r.color??`#`+Nd.faceColor.getHexString(),o=t?.color!==void 0||t?.opacity!==void 0,s=new G(e,new la({color:a,transparent:o||n.opacity<1,opacity:n.opacity,depthWrite:!o,polygonOffset:!0,polygonOffsetFactor:o?-1:1,polygonOffsetUnits:1,side:2}));r.faceMapping&&(s.userData.faceMapping=r.faceMapping),this.add(s)}}},Zd=class extends ii{constructor(e,t){super();for(let n of e.meshes)if(n.label===`solid-faces`){let e=new Xd({shapeType:`face`,meshes:[n]},t?.face);e.renderOrder=1,this.add(e)}else if(n.label===`solid-edges`){let e=new Jd({shapeType:`edge`,meshes:[n]},t?.edge);e.renderOrder=2,this.add(e)}}},Qd=4,$d=1.5,ef=.6,tf=Qd+$d+ef+$d,nf=`
4276
4276
  attribute float lineDistance;
4277
4277
  varying float vLineDistance;
4278
4278
 
@@ -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-BJG141m7.js"></script>
7
+ <script type="module" crossorigin src="/assets/index-CLQhpG6A.js"></script>
8
8
  <link rel="stylesheet" crossorigin href="/assets/index-BpvgjPLm.css">
9
9
  </head>
10
10
  <body class="m-0 p-0 overflow-hidden w-full h-full bg-base-100 text-base-content">