Show HN: FluidCAD – Parametric CAD with JavaScript (fluidcad.io)
This is a CAD by code project I have been working on on my free time for more than year now.
I built it with 3 goals in mind:
- It should be familiar to CAD designers who have used other programs. Same workflow, same terminology.
- Reduce the mental effort required to create models as much as possible. This is achieved by:
- Provide live rendering and visual guidance as you type.
- Allow the user to reference existing edges/faces on the scene instead of having to calculate everything.
- Provide interactive mouse helpers for features that are hard to write by code: Only 3 interactive modes for now: Edge trimming, Sketch region extrude, Bezier curve drawing.
- Implicit coding whenever possible: e.g: There are sensible defaults for most parameters. The program will automatically fuse intersecting objects together so you do not have to worry about what object needs to be fused with what.
- It should be reasonably fast: The scene objects are cached and only the updated objects are re-computed.I think I have achieved these goals to a good extent. The program is still in early stages and there are many features I want to add, rewrite but I think it is already usable for simple models.
Update to add more details: This is based on Opencascade.js WASM binding. So you get all the good things that come with any brep kernel. Fillets, chamfers, step import and export...
The scene is webview but the editing is in your local file. You use your own editor and the environment you are familiar with.
One important feature that I think make this stand out among other code based cad software is the ability to transform features not just shapes. More here: https://fluidcad.io/docs/guides/patterns You can see it in action in the lantern example: https://fluidcad.io/docs/tutorials/lantern
23 comments
[ 5.1 ms ] story [ 41.7 ms ] threadWhich operations are supported? (Booleans? ...)
Where's the API link?
...finally, was this vibe-coded?
Inquiring minds want to know!
https://www.microsoft.com/en-us/garage/profiles/maker-js/
This looks like it could do the same thing for constraint modeling. That's awesome!
https://github.com/openscad/openscad/pull/4478#issuecomment-...
My pet use case is: "My naive approach as a programmer would be: `pen := new Pen(q,r,s,t); box := new Box( pen.L, pen.W, pen.H )`" along with being able to sometimes work with the whole pen, and sometimes touch the pen vs. the cap separately.
Since it's all javascript, it seems like there's a chance that this use case would work (ie: `p = Pen(...).render().getWidth()`)? Additionally, your intermediate step screenshots really makes it seem like a SketchUp-ish GUI would be perfect! Obviously a ton of work, but SketchUp's "grab face + extrude / push", but if it were "sticky" to the underlying parametric components seems like it'd be an awesome combo... something like group/components, but backed by code instead of GUI-only (or GUI-centric) editing.
I've been revisiting OpenSCAD recently but find it very frustrating. I just got started with build123d which is great but I'll definitely be trying this. The workflow is exactly what I'm looking for.
I'll drop an issue if I have feedback. Are you open to PRs?
I am trying to think of an example, declarative constraints are usually the domain of a graphical cad system(like solvespace). but I suspect it would look like a set of relationships you can enter in any order and it solves for the missing one. so... prolog? has there ever been a cad system in prolog?
E.g. when splitting a face in OnShape, I might have to redo a whole bunch of operations later because the identifiers change, but I'm often surprised how good it is at matching up faces after a single operation. Like modifying a sketch, then having to add the new face to an extrusion, but then it magically does the right thing for chamfers and drafts.
I've been using OpenSCAD and Build123D so far, but OpenSCAD is limited and Build123D is Python and I'd much rather use JS/TS.
Just curious – when when you do a sketch and then call extrude, why the implicit connection there? Why not assign the sketch to a const and then do `s.extrude`?
Great work so far!