Show HN: FluidCAD – Parametric CAD with JavaScript

fluidcad.io
maouida
2 days ago
152points
Hello HN users,

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

36 comments

Comments

ramses02 days ago
I'll throw my hat in on the feedback... looks great!

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.

maouida2 days ago
The interactive region extrude feature is designed specifically for fast modeling at the expense of making the model "not so parametric". When user pick a region, the raycasted point is inserted/hardcoded in the code. e.g extrude(100).pick([100, 100]) So if the sketch dimensions change, there is a chance the point will fall outside the region boundaries which will break it. It is preferred to use proper boolean operations in sketch mode to define regions while keeping it parametric.

The interactive region extrude is there for when you want fast modeling/prototyping.

somat2 days ago
These code base cad systems are pretty great. But all of them are imperative languages and as such can only solve imperative constraints. Including declarative constraints would be very welcome. I mean, sure, Theoretically we could enter the turing tarpit and build our own constraint solver, but it would be nice to see one included as a standard library.

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?

maouida2 days ago
The constraints solving took a good amount of thinking while designing FluidCAD. At first I tried to make it all declarative where user just create unconstrained geometries then define constraints, something like: const l1 = line(); const c1 = circle(); // define constraint l1.length(100).position(x, y).tangentTo(c1) ...

Then I decided against this idea because it results in too much typing + the constraint solver implementation is not trivial and there is not much web based open source solvers. I went with a mixed approach instead between declarative and imperative. https://fluidcad.io/docs/guides/sketching/constrained-geomet...

seesthruya6 hours ago
Really interesting! Love the combination of 'code cad' and graphical interface. I've been screwing around with build123d and its vscode plugin, which always selections, but this seems to take that concept much further.
isaacphi2 days ago
This looks incredible, great job!

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?

maouida2 days ago
Yes, PRs will be open on v0.1.0 I just want to finalize some design decisions and create a roadmap first.
flowerthoughts2 days ago
This is nice, though I think the use of indices instead of stable identifiers might bite in complex models that undergo changes. I've been toying with the idea that you could specify a point (2D or 3D in some coordinate system, depending on context) and pick the face/edge/point closest to that as the identifier. The only other alternative I see is diffing old and new, and trying to match the outputs of each operation geometrically, but that would produce extra output that needs to be persisted...

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.

maouida2 days ago
Yep, topological naming solving is a hard problem to solve. It took FreeCAD many years to get it to work correctly. That's why I went with indices for this version. You can also use filters like extrusion.endFaces(face().arc()) to get only arc edges.

Regarding the picking; that's exactly the region picking feature in this screenshot: https://fluidcad.io/img/region-extrude.gif

When the user click on a region we insert a 2D point, then the extrude feature will find the nearest face. I have experimented with adding this picking logic to selections too select().pick() which will probably be merged in future releases.

flowerthoughts9 hours ago
Nice!
bsimpson2 days ago
The thing that made Flash magical was that it had the approachability of a design tool (and it really did have some of the best design tools ever), with the extensibility of a scripting language. You could start by drawing on a canvas and grow into programmatically generating designs.

This looks like it could do the same thing for constraint modeling. That's awesome!

upcoming-sesame2 days ago
I don't know much about CAD but it is surprising to me this hasn't existed before seems so natural. great work
jwilliams2 days ago
It’s got plenty of precedent - AutoCAD has a Lisp equivalent since 1986[1]. Arguably it is what made it the powerhouse CAD tool.

Irrespective - This project is pretty cool to see!

[1] https://en.wikipedia.org/wiki/AutoLISP

unforbiddenYet2 days ago
Nice work and kudos for programming it by hand! Starred the project and plan to try it out soonish.
kabir_daki2 days ago
Impressive to see parametric CAD running in the browser. Curious how you handle precision with floating point — that's usually the first wall you hit with geometry in JS. Does it support STEP or DXF export?
WillAdams2 days ago
astroalex2 days ago
One obvious difference I can see at a glance is that Maker.js doesn't support 3D models, while FluidCAD does. I assume Maker.js is a lower level library aimed at interfacing directly with CNC machines, while FluidCAD is focused on 3D design.
WillAdams2 days ago
Maker.js is supposed to also support openjscad (or whatever they're call it these days, the JavaScript enabled version of OpenSCAD).