8 ms·
Parametric CAD in Rust
- nynx 8mo agoUnfortunately, using a geometry kernel [1] that operates on triangle meshes means this is a no-go for serious CAD usage. [1]: https://github.com/elalish/manifold https://github.com/elalish/manifold
- bigfishrunning 8mo agoMy whole CAD experience is with OpenSCAD, which apparently uses the same kernel; Honest question -- what is the alternative? I would assume the vast majority of 3D model processing relies on triangle meshes...
- autumn-antlers 8mo agolibfive
- nynx 8mo agoBreps. Nearly all commercial cad packages operate on boundary representations of objects.
- bob1029 8mo agoI would start with CSG if you are new to these ideas: https://en.wikipedia.org/wiki/Constructive_solid_geometry https://en.wikipedia.org/wiki/Constructive_solid_geometry
- pca006132 8mo agoMesh is also a boundary representation. I think you meam NURBS.
- MITSardine 8mo agoIt's just the name, BREP stands for Boundary REPresentation.
- nicr_22 8mo agoOpenCASCADE? https://dev.opencascade.org/ https://dev.opencascade.org/
- Brian_K_White 8mo agoMeshes are an output, not a source, and not a good internal representation. Meshes are only a lossy approximation of the actual geometry, and the errors accumulate as features reference off of earlier features. A simple example is a line tangent to an arc. The line will only be the correct distance from the center of the arc at one point (one angle) per segment. In openscad you don't notice the problem because since it's code and you have variables and programming ways of expressing relationships, you would usually not try to derive one thing from another by geometry, instead both things would reference a common ancestor variable. But that's a technical implimentation detail that works around the problem by just not doing a thing that doesn't work. The problem is still there that a valid geometry constraint would produce invalid results.
- avhon1 8mo agoSolveSpace is available in library form. It uses NURBS to represent surfaces, with triangles as a fallback. https://solvespace.com/library.pl https://solvespace.com/library.pl
- WillAdams 8mo agoNotably the library was used (at least for a while) in the development of Dune 3D: https://dune3d.org/ https://dune3d.org/ but then the author used the source directly as noted in the Github footnote: >I ended up directly using solvespace's solver instead of the suggested wrapper code since it didn't expose all of the features I needed. I also had to patch the solver to make it sufficiently fast for the kinds of equations I was generating by symbolically solving equations where applicable.
- xixixao 8mo agoI've built something very similar (also based on triangle meshes, but in TS), and while it wouldn't work for say 3D printing, my target is game object modeling. I guess people have specific use cases in mind when referring to "CAD".
- nynx 8mo agoIn my mind, cad that you’re not going to manufacture is “modeling”. Not sure if that’s a common verbal distinction.
- ezst 8mo agoNot sure either but sharing the sentiment.
- bigiain 8mo agoAn example of common terms that disagrees with that somewhat, is "CAD/CAM" where the design component is clearly distinct from the manufacturing component. I do agree that historically, software aimed at building 3d models for games/animations and other digital use was usually called modeling and not cad. I'm thinking of software like 3D Studio Max back in the 90s here. https://en.wikipedia.org/wiki/CAD/CAM https://en.wikipedia.org/wiki/CAD/CAM I notice though that the Wikipedia article for CAD says: "This software is used to increase the productivity of the designer, improve the quality of design, improve communications through documentation, and to create a database for manufacturing." https://en.wikipedia.org/wiki/Computer-aided_design https://en.wikipedia.org/wiki/Computer-aided_design
- dgently7 8mo agomy personal distinction I use is about measurements. while you may model to a specific scale for use in 3d gfx (game by engine/animation/vfx) you cross over from "modeling" to "cad" as soon as you are creating geometry with specific real world measurements. (probably for manufacturing or engineering reasons bc thats when it matters most) like I can model a table that is the right size and looks like it will not tip over for my game, but I am going to cad that table to run a stress sim and make the plans for building it for real. though id still call the action of doing the building in the cad software "modeling"... so idk.. language is weird. so software that lets you work accurately with measurements and real units == cad. (fusion360) software that just makes geometry == modeling. (blender) but if you wanna go get real confused look at "plasticity" an app targeted at "modeling" but uses a cad engine and sells itself as "cad for artists" it has real scale measurements and everything too.
- asdfaslkj353 8mo ago[flagged]
- ecto 8mo ago[flagged]
- asdfaslkj353 8mo ago[flagged]
- tuetuopay 8mo agoGP perhaps did not say it in a polite manner, but their criticism is valid. Please have a check on a different monitor and browser than you are currently using, as most of the article is unreadable. Code blocks are nigh unreadable, and the screenshots are washed out as if they were HDR with improper tone mapping (I tested both with Firefox on Linux and Safari on iOS). It's a shame, because it made me gloss over the article. Oh, and the screenshots have the same issue both on the blog post and on the main vcad.io website. Funnily enough, code snippets on vcad.io have proper readable colors as opposed to your blog (they're still too dim to be comfortable though, but they're readable).
- maartenh 8mo agoCurious to how well LLM's work in this context! (mentioned as one of the reasons to embed CAD in Rust) I only know of another text -> STL AI model, I'm quite a bit more excited about this idea. Does someone have experience with this?
- storystarling 8mo agoI've found LLMs perform surprisingly well here if you target CSG or OpenSCAD. It seems to frame the 3D modeling challenge as a logic and syntax problem rather than a spatial one, which plays to the model's strengths. You avoid the spatial hallucinations common in image generation because it's effectively just writing code.
- d_silin 8mo agoInteresting, because I am trying to learn OpenSCAD for some simple modeling.
- the__alchemist 8mo agoNote: This is probably a dead-end; it is not on the same level as SolidWorks, Fusion etc.
- ecto 8mo agoHow could I make it better?
- the__alchemist 8mo agoSorry about the confusion - I'm referring to OpenSCAD; not your project.
- avmich 8mo agoYou're probably right, OpenSCAD seems to be limited both in speed and in exactness of the surfaces. However purely programmatic interface allows doing surprising things which might be hard to achieve with a mouse.
- WillAdams 8mo agoIf you're using one of the old stable builds, then the newer nightly builds are markedly faster --- hopefully there will be a new stable release presently.
- whilenot-dev 8mo agoI wouldn't call a FOSS project that you compare to some 2,620 USD/year software a dead-end. It's good enough for simple modeling, especially when it comes to scripting, and has been for 10 years already.
- 8mo ago
- hambes 8mo agoI've been doing a similar thing using GhostSCAD[1], which is a relatively thin wrapper around OpenSCAD in Go. Not as typesafe, but my language of choice. [1]: https://github.com/ljanyst/ghostscad https://github.com/ljanyst/ghostscad
- WillAdams 8mo agoNote that a while back Python support was added to a soft-fork of OpenSCAD: https://pythonscad.org/ https://pythonscad.org/
- 20lives 8mo ago[dead]
- oussama-gmd 8mo agoAmazing work! This is what I was looking for, I thought of this few months ago and didn't have the time to create it myself. Thanks will explore it and give my feedback!
- deleted 8mo ago[deleted]
- kibwen 8mo agoNote that there's an existing CAD-in-Rust project, Fornjot, which has been quietly developing since 2020: https://www.fornjot.app/ https://www.fornjot.app/
- mountainriver 8mo agoAlso Truck https://github.com/ricosjp/truck https://github.com/ricosjp/truck
- Cargo4286 8mo agoNeither Fornjot nor Truck are ready for general use as a BREP CAD kernel.
- davidmedin 8mo agoThis sounds a lot like Fidget (https://github.com/mkeeter/fidget https://github.com/mkeeter/fidget) and libfive (https://github.com/libfive/libfive https://github.com/libfive/libfive) by the amazing Matt Keeter!
- ecto 8mo agoHadn't ran into these, thanks!
- rnhmjoj 8mo agoI had a lot of fun playing around with antimony (also from Keeter) a few years ago, but unfortunately it has been mostly abandoned. I heard libfive is supposed to be the next generation, but I haven't experimented with it yet. Do you know how it compares?
- FpUser 8mo agoI am constantly designing parts myself. I just wish that instead of having many unfinished, unpolished products we had something with the level of Solidworks / Onshape / whatever. FreeCad is getting somewhere but it is still way behind. The last thing I care about is what language was it implemented with.
- WillAdams 8mo agoOpenSCAD is quite polished (for a programmatic mesh modeler). There is a soft-fork which adds Python: https://pythonscad.org/ https://pythonscad.org/ which I've found quite useful: https://github.com/WillAdams/gcodepreview https://github.com/WillAdams/gcodepreview in particular, working up a facility to write out DXFs w/ arcs
- kivarada 8mo agoGreat work! Please consider adding a RSS/Atom Feed to your site. I would like to include it in my Tech Content Platform: https://insidestack.it https://insidestack.it
- etskinner 8mo agoThe opening paragraph is very telling; the author doesn't seem to understand typical pro-level parametric CAD programs available on the market: > I keep designing physical parts for our robots. Motor mounts, sensor brackets, wheel hubs. Every time, the workflow is the same: open a GUI CAD program, click around for an hour, export an STL, realize the bolt pattern is 2mm off, repeat. This doesn't make sense. When you realize the bolt pattern is 2mm off, you just edit that dimension and let the CAD program recalculate. You don't need to click around for an hour again. That's the beauty of contstraint-based parametric modeling as opposed to, say, modeling in Blender. The author's program is akin to writing vim to replace Publisher. They're solving entirely different problems. Not to mention, this code-as-model paradigm already exists: OpenSCAD
- ecto 8mo agoYou're correct, I'm completely uneducated! Pull requests welcome :)
- IshKebab 8mo agoThe pull request is to delete the project and open SOLIDWORKS or FreeCAD. But don't actually delete it. It looks like a nice alternative to OpenSCAD. But like OpenSCAD it's really a niche thing for designs that are highly parametric like fasteners, gears, 3D printed boxes, etc. Like OpenSCAD using it for normal "irregular" CAD is going to be extremely frustrating. Like editing an SVG in notepad instead of Inkscape. I still feel like there's a unexplored space where you combine the benefits of both somehow though. Like a code-based CAD but it also has a GUI editor that stays in sync and avoids the need to type in coordinates by hand. That would be extremely difficult though.
- aaronblohowiak 8mo ago>I still feel like there's an unexplored space where you combine the benefits of both somehow though. Like a code-based CAD but it also has a GUI editor that stays in sync and avoids the need to type in coordinates by hand. That would be extremely difficult though. I think you can do this if the data representation of operations and values is human readable. The simplest implementation would restrict the language/data format to operations representable in the gui. Unlike trying to solve the "visual programming" problems, we don't need or desire Turing completeness. Very interesting indeed!
- gwbas1c 8mo agoWhat's nice about this is that it allows for programmatic CAD, enabling things like web applications that can download an .stl file based on user input. I hope I can find a weekend or two to play with it. BTW: I spent a few weekends playing with Microcad (https://microcad.xyz/ https://microcad.xyz/). It was cool, and had a similar rust feel. I just, for the life of me, couldn't figure out how to do 3d ellipses.
- Cargo4286 8mo agoHere's an ellipsoid in build123d using geometric transformation of a sphere: from build123d import * mat = Matrix([[2,0,0,0],[0,1.5,0,0],[0,0,0.5,0]]) ellipsoid = Sphere(100).transform_geometry(mat) Also, FYI build123d now runs in the browser thanks to OCP.wasm. Example playground here https://jojain.github.io/build123d-sandbox/ https://jojain.github.io/build123d-sandbox/
- asimeqi 8mo agoIf you are using build123d, probably the easiest way is to sketch an ellipse and revolve it.
- Cargo4286 8mo agoThe definition of an ellipsoid is that it can have three independent radii. A revolved ellipse only has two independent radii. If only two independent radii are needed then yes I agree with you, but I wanted to provide a fully qualified answer.
- gwbas1c 8mo agobuild123d isn't Microcad
- ge96 8mo agoSketchUp was my go to for a while but I'm done with parametric personally, trying to fix meshes for 3D printing... time I grow up and use something like Fusion360 seems like or onshape. Still it was good/simple enough for non-round shapes in SketchUp except they have some kind of memory leak/bug at least for the 2017 version. But I guess quit being cheap and buy a modern copy on my part. Edit: oh I guess sketchup is a surface modeler weird thought it was parametric this whole time, lol someone else said it's a polygon modeler Yeah I don't know what parametric modeling is apparently, I use a mouse/calipers to model stuff not parameters There is a solid validator plugin you use before you export an STL to make sure the mesh is closed/a manifold
- IshKebab 8mo agoSketchUp uses direct modelling, not parametric modelling. I think they even got some patents on direct modelling.
- Animats 8mo agoIt's using a constructive solid geometry system. You can add and subtract volumes. Making a hole is subtracting a volume. This has classically been numeric roundoff hell, where points that should coincide and surfaces which should touch don't get handled properly due to numerical error. The geometry engine is Manifold, which guarantees watertight meshes from boolean operations. Ah. That's what's doing the constructive solid geometry. Here's the 2009 PhD thesis behind the object merge and difference algorithms inside Manifold. Nice. At last, soundness. This is a long-standing problem. And now there's an open source implementation. Manifold itself is in C++, not Rust, though. None of this is parametric. That's a different problem. That's where you put in constraints such as A is perpendicular to B, B is 100mm from C, etc., and the constraint solver tries to satisfy all the constraints. Change a dimension and everything adjusts to preserve the constraints. Parametric CAD is all about constraint solving and expressing conflicts to the user. Autodesk Inventor, Fusion, etc. have good constraint solvers. [1] https://github.com/elalish/manifold/blob/master/docs/RobustBoolean.pdf https://github.com/elalish/manifold/blob/master/docs/RobustB...
- MomsAVoxell 8mo ago
- hahahahhaah 8mo agoWhy not use OpenSCAD?
- amelius 8mo agoBecause it is not written in Rust, I suppose. Anyway, I think using only code for designing 3D objects is a poor design choice. You really need something that is between pure code and pure GUI.
- WillAdams 8mo agoI would really like to see someone work that up. I suspect that Moment of Inspiration and Rhinoceros 3D are something along those lines, but I'm not aware of an opensource tool which hoes that row. One thing in particular which it would be nice to see would be a facility where one could draw a piece of geometry, then all the coordinates/values which describe it could be displayed in a pane where they could then be named or re-arranged, or the values changed, or even the values changed into formulae.
- yehoshuapw 8mo agoThat is actually not so bad a reason. I use build123d, but want it in haskell, enough to look at how hard it would be to create something similar. (I also totally agree about the gui being worth having sometimes, and would have loved the ability to fully mix. Code as the main driver, but gui to help choose it. For example to figure out faces and other attachment stuff)
- jas8425 8mo agoIs anyone else put off by the AI-sounding text? Two things that give it away for me are the excessive use of punctuation-emphasized sentence fragments ex: > No clicking. No undo. Just recompile. > That's our mascot. Entirely CSG. > No garbage collection pauses. No floating point surprises from a scripting layer. And worst of all, the dreaded "and/but honestly": > But honestly, the main reason is the toolchain. Am I misreading things?
- ecto 8mo agoThanks for the feedback
- xyzsparetimexyz 8mo agoYeah I hate it. Why should I read something you didn't bother to write?
- askl 8mo ago> Am I misreading things? Probably not. There's also this at the bottom. > One thing I care about that most CAD tools don't: vcad is designed to be used by AI coding agents.
- wrl 8mo agoCLAUDE.md in the repo and "Co-Authored by Claude" on all the commits too. Hard pass.
- librasteve 8mo agoI get the sense that this author is looking for a DSL (domain specific language) and landed quite close.
- vhantz 8mo agoYet another rewrite-it-in-rust-just-because project. I'll stick with OpenSCAD
- amelius 8mo agoBased on a geometry engine written in C++ ... https://github.com/elalish/manifold https://github.com/elalish/manifold
- jlarocco 8mo agoNot to crap on this project too much, but this, and most of the other small CAD projects that get posted here, always have a condescending, "Look how easy I've made this" vibe to them, and then they're always light years behind modern CAD software. If you're doing serious CAD work, like designing a whole machine, or working with multiple vendors to get parts manufactured, then it really is worth paying for a commercial CAD system and learning how to use it. All of the commercial CAD systems today support parametric modelling where later operations are updated automatically when the earlier operations are changed by the user. If you insist on writing code, then even entry level systems like SolidWorks have APIs to do everything from creating the part geometry, defining geometric tolerances and PMI, running simulations, doing different types of analysis, creating machine/tooling instructions (G-code, etc.), exporting to various formats, and a million other things. And they have workbenches for manufacturing techniques other than 3D printing, like sheet metal, CNC machining, cable routing, injection molding, welding, etc. And most of them have libaries of standard and off the shelf parts, like screws, bolts, nuts, washers, cables and housings, etc. in various standardized sizes so you don't have to model those at all. For testing, on the higher end, the CAD systems integrate with metrology hardware and they're able to actually measure the manufactured parts and compare against the model to validate that they have the correct shape and meet all of the tolerances. Not as a virtual unit test running in CI, but by actually measuring the physical part.
- kingstnap 8mo agoI had Google Gemini 3 write me a part using human language about 3 weeks ago for a 3D printing project. I specifcally had it spit out a FreeCAD macro, which is basically Python that looks like what you've made.
- MITSardine 8mo agoIf anyone is interested, you can try EngineeringSketchPad (https://acdl.mit.edu/ESP/ https://acdl.mit.edu/ESP/) which is very similar but much more mature. It also supports simple geometric primitives and boolean operations via a scripting language, but also more general rational curves and surfaces (i.e. BREPs). It has other nice features like differentiation, application-specific views (think structural vs CFD), and an attention to water-tightness/correctness.
- gmac 8mo agoThe certificate just expired, so mobile Safari is not willing to let me see it. :(
- MITSardine 8mo agoI should have shared this more recent page directly on the manual with examples to begin with: https://flexcompute.github.io/EngineeringSketchPad/EngSketchPad/ESP/ESP-help.html https://flexcompute.github.io/EngineeringSketchPad/EngSketch...
- zombot 8mo ago> Types prevent you from passing a radius where a diameter was expected. CAD files should be code. Code has tests, reviews, diffs, and CI. An STL file has... bytes. Fucking A Right!
- rkagerer 8mo agoWith the ability to change one number and regenerate everything That's exactly how I use Solidworks (and similar parametric CAD software) all the time. It takes some discipline, but the key is for all your geometry and relations to be driven from sketches and equations. Then you just change a value (sketch dimension or global constant), hit rebuild, and everything regenerates fairly reliably. Don't get me wrong, this is a great project and I love seeing efforts like this, OpenSCAD, etc. add more options in the landscape of parametric CAD. But I do find the graphical interface very natural for doing creative design work. In fact, sometimes I wish I could literally step into my design in VR and grab and move vertices around in 3 dimensions (eg. when fine tuning non-planar splines).
- fainpul 8mo agoI'm with you. What I've learned from all those "programmatic CAD" threads is that some people just really prefer code over anything else. They also build only simple parts, so it's not an issue for them. As the author says: "I wanted to write my parts the way I write firmware. In Rust. With types. With version control."
- nkrisc 8mo agoEven as some who would generally prefer graphical CAD software in most cases, sometimes for simple parts like the examples in the linked article code really is just easier. Sometimes it’s the same when I’m working on texturing for 3D models and I want to combine some texture maps in a specific way, I really don’t want to open Photoshop or similar for something that could be expressed in just a few lines of code. ImageMagick can probably do it, whatever it is, but then I need to learn the incantation.
- alnwlsn 8mo agoIt depends. I use Solidworks all the time but I think OpenSCAD was a great choice to make this part: https://github.com/settinger/selectric_typeballs https://github.com/settinger/selectric_typeballs A bit like how you can edit images in MS Paint, Python, or Photoshop. None of these is or should be a one size fits all solution.
- anon291 8mo agoI'm about as into formal methods as you can get, with a deep background in Haskell and such. Rust is wonderful and all that, but sometimes I think the optimism is misplaced and doesn't come from a place of full knowledge. Statements like this make me scared: > The geometry engine is manifold, which guarantees watertight meshes from boolean operations. The Rust bindings give us zero-cost abstractions over the C++ core — the operator overloads compile down to direct manifold calls. No garbage collection pauses. No floating point surprises from a scripting layer. Floating point is incredibly surprising. People seem to believe that a typed programming language eliminates floating point error. Scripting and interpretability has nothing to do with why floating point is hard. Floating point arithmetic is as deterministic in Python as C++ or Rust. The issue is whether people understand the rules. The type system has nothing to do with this, as floating point errors are almost always value errors, not type errors. The only way to avoid floating point errors using formal methods is an actual theorem prover. Rust is nowhere close to being a theorem prover.
- WillAdams 8mo agoYeah, I'd like to see a CAD program which uses integer math at its core for repeatability and to avoid errors such as 10.000 being displayed as 9.999 after multiple scaling operations.
- ozy 8mo agoI really like the idea of openscad, or this, or the many alternatives. But when I say a shape with these and these dimensions, the next shape should attach to it somewhere. And then I want to say: chamfer all outside edges. But in all these programs, it's me redoing the math in my code, computing where the shape goes. As for chamfers, I just give up ...
- ginko 8mo agoBuild123d can do chamfers. You can also do relative positioning by selecting positions from the first shape. (there's various ways to do that)
- avhon1 8mo ago> chamfer all outside edges FreeCAD can do this. So can all of the proprietary parametric CAD programs I've ever used, some of which (PTC OnShape, Siemens Solid Edge, Autodesk Fusion) have usable free tiers available.
- bluGill 8mo agoIf you are a programmer OpenSCAD is easier to learn. However you will quickly run into limits. Just a few hours of a FreeCAD tutorial and I was already seeing how I could do things I'd never attempt in OpenSCAD. FreeCAD has a reputation of not being great, but I'm not far enough into it to learn the limits - things I can't figure out feel like things I could learn, in OpenSCAD the things I couldn't figure out where because they were too complex - I could but the code wouldn't be readable so there was no point (not to mention math errors). FreeCAD is designed for the things real designers really do. OpenSCAD is designed for the things mathematicians do.
- KiwiKid 8mo agoBOSL2 is a great library to use with Openscad. It provides a bunch of primitives shapes functions with chamfer/rounding parameters. Math doesn't go away tho
- zefhous 8mo ago
- codetiger 8mo agoI wish there was a JSON representation of the geometry, so we don't have to code and compile. :P
- vbezhenar 8mo agoThis is not parametric CAD. Not useful anyway. You need much more complicated engine. This approach is explored by OpenSCAD. No need to reinvent the wheel. But parametric CAD is much more than that.
- mobiuscog 8mo agoThis reminds me of PoVRay... in a good way.
- WillAdams 8mo agoNote that OpenSCAD came about as a result of Art of Illusion.
- yuumei 8mo agoNote that one of the co-authors of the source is "Claude"
- Gerharddc 8mo ago> Every render in this post was made that way. Claude generated the geometry with vcad, imported each STL/GLB into Blender via MCP, set up studio lighting, and rendered to PNG. No human touched Blender. This seems a bit wasteful to me. Why do you need an LLM to do the part of controlling Blender? Can't normal code be used to automate this instead? And save a scary amount of electricity in the process...
- Gud 8mo agoSurprised no one is mentioning BRL-CAD. This is exactly how BRL-CAD works! https://brlcad.org/ https://brlcad.org/
- deleted 8mo ago[deleted]
- deleted 8mo ago[deleted]
- macmac 8mo agoAren't a few definitions missing from the examples (e.g. base_holes and wall_holes)?