CadQuery –- A Python parametric CAD scripting framework based on OCCT
github.com
github.com
The point IMO of parametric cad in an existing language is to use the ecosystem. Lots of choices in this project make that really hard.
On a more general note, I've mostly been using CadQuery to model pieces for 3d printing and the experience has been quite fun. Errors are not always easy to figure out and there's a learning curve to consider, but being able to "simply" describe my model in code instead of relying lots of [point|drag|click] is totally worth it. It was also a nice way to refresh my geometry knowledge.
[0] https://github.com/bernhard-42/jupyter-cadquery [1] https://hub.docker.com/r/bwalter42/jupyter_cadquery
https://github.com/CadQuery/cadquery/issues/153#issuecomment...
As an example of an approach that doesn't break Pypi, nltk distributes through Pypi but has an download() method for installation.
https://pypi.org/project/nltk/ https://www.nltk.org/data.html
The fact they're hostile towards pip (and ergo pipenv and poetry) just make it less than appealing software to want to use.
Understatement, if there ever was one.
Installing conda will maim your system irrevocably.
https://github.com/possibilities/unkeyboard
Note I chose a somewhat non-idiomatic approach (in terms of cadquery) writing this and I'm new to python.
I was also interested in having parametric CAD related to custom keyboard PCBs. The approach I took was to copy the PCB module data to a format the CAD program could use. That way, the Kicad PCB files would still be the "source of truth" for the PCB design, but I could use OpenScad to come up with the plates for the case. https://github.com/rgoulter/keyboard-labs/
When I have looked into it before it seems to be criticised for being somewhat dated and not have the power and developer ease as Parasolid (which costs big bucks). Having both a software and mechanical engineering background (I spent a lot of time in SolidWorks) I regularly get the itch to try and combine the two and create a CAD tool.
I believe most tools built with OpenCascade use Coin3D for rendering.
Here are two quite remarkable statements from a MIT lecture on CAD (https://stellar.mit.edu/S/course/6/fa19/6.807/courseMaterial... ):
"[there are] ASIC and Parasolid, others are not really as good"
and "[CAD] Research disconnected from reality [compared to CG research]"
One might expect a whole range of CAD kernels floating around, since these kernels are such a fundamental part of civilization in some way. Doesn't seem to be the case, tho..
The itch I would love to scratch is an online real-time collaborative parametric cad app using CRDTs. Current thinking is combining OpenCascade compiled to WASM [0] with Yjs[1], but frankly don’t have the time.
A kind of Figma but for 3D cad. (There is obviously onShape but I’m thinking something a little simpler)
I do hope that Blender becomes more capable in this regard though.
Thanks for the opencascade/wasm link.. looks like a nice option!
github.com/buildrs/Share
how are you tackling this?
The architecture will tend towards platform + apps, to help address the scale problem. We're looking to partner/port the geometry kernel and focus on workflow and integration with open standards (IFC,STEP,gltf,Collada).
Initial UI is in react+three.js (soon react-three-fiber) with git for file-based versioning underneath. Also interested in recent discussions on HN about CRDTs on Matrix for collaboration. So kind of a CRDT real-time google docs capability on top of a persistent file based rep on git. This part is very fun coding :)
Just getting started! Appreciate any feedback, esp on our github/discord :)
It uses it's own B-Rep for NURBS and can export STEP files. The basics are there for extrudes, revolves and helixes. Booleans are still a bit buggy, but we occasionally fix a bug or two.
It's definitely the smallest NURBS kernel around at about 8000 LoC and the full program comming in at ~5MB. There is no real API for geometry though, just the constraint solver.
BTW the constraint solver has also been used in one of the FreeCAD assembly workbenches, and also in this sketcher add-on for blender: https://blenderartists.org/t/geometry-sketcher-constraint-so...
Watching Solvespace with great interest, who hung it could one day become a full brown kernel.
[1] http://web.ist.utl.pt/antonio.menezes.leitao/Rosetta/index.h...
I struggle with GUI CAD and I'm still learning all of this stuff at the most noddy level, but I am very conscious that I will want to send stuff out to be manufactured one day, and that means I have to be able to get beyond STL to STEP. So I am going to be spending more time with CADQuery and trying to use what it helps me visualise in FreeCAD as well.
There is now a FreeCad workbench for CadQuery 2.0 which I have not yet tried:
With a tool that can provide normalized, structured data corresponding to buildings, then for sure we could save on manufacturing too, every wall panel +- the same you could mass produce them. With a clever concept with datacenter-like floating floor you could even change and adapt the rooms (including plumbing) to suit needs without having to rebuild.
I've started to switch to Cadquery from OpenSCAD because OpenSCAD lacks proper fillets and chamfers.
I usually prefer the CSG (arithmetic tree of union/difference/intersection + transforms + base shape leaves) to model 3D objects, as opposed to Cadquery's "draw on 2D surfaces and extrude" approach, but OpenSCAD's lack of fillets / chamfers combined with the "everything is a polygonal mesh" approach of the rendering engine is just too limiting.
Cadquery has a lot of potential (the underlying engine uses a traditional hierarchical NURBS BREP, IIUC), but it also has a lot of shortcomings:
Here are some I've bumped into:
. very strange "stack-based" model. For complex objects, it's hard to wrap your head around it, and the workflow it forces on you as a user does not always fit your mental model of the object.
. the underlying hierarchical nature of the object (the BREP) is forcibly hidden from the user, which leads to kafka-esque situations when one wants to e.g. select parts of an object.
. selecting parts (faces and edges) in a object is a nightmare. cadquery has "selectors", which are a) its own weird little DSL b) very difficult to use on complex shapes c) does not support name-based retrieval: can't label things and get to them later by name.
See this github issue for example: https://github.com/dcowden/cadquery/issues/29 - the UI (cq-editor) is unusable for real-world work: no perspective rendering, no graduations in ortho views, no way to measure things on the object, no way to examine the BREP, etc ... Generally speaking, the UI is only a visualizer, and does not let you query / inspect the model in any detailed way.
- fine-grain control over tessellation (conversion to mesh) is lacking.
- good for modeling mechanical parts / lousy for modeling anything organic-looking
- importing external models that don't fit the cadquery BREP-based represention is basically impossible.
TL;DR: a nice tool to add to your belt, but not a very mature environment yet, and certainly can't replace OpenSCAD yet.There is usually a point at which you need to take your model out of the CAD out of the CAD tool.
For example to 3D print or to render.
And at that point, fine control on the meshing is rather important.
Sure, if you have a manufacturing tool that can directly handle NURBS, great.
That's certainly not the majority of the the hobbyist / prosumer market.
And the actual pros ... they don't use stuff like Cadquery, they use solidworks and the like.
So, yes: proper conversion to a polygonal mesh with fine control matters a great deal.
Sure, but the output conversion tools shouldn't be built around the render mesh. Any CAD tool worth it's salt should be able to take the best underlying representation of the model and give you an .stl with arbitrary precision. Every time I've ever exported a mesh from a NURBS modeller, I've gotten a dialog that lets you choose parameters.
I'm not so experienced with standalone renderers (I usually only need the built-in ones), but the mesh that the CAD program uses to render should basically only be used for that purpose. Most programs shouldn't even give you access to it unless you open it up and look and the guts.
SDF modeling is great for organic shapes.
On the surface, it feels similar to OpenSCAD since CSG operations are natural primitives (min/max/...). Fillets / chamfers are easier to produce, compared to OpenSCAD: http://mercury.sexy/hg_sdf/#snippet
Libfive is one implementation geared towards CAD work. One issue with SDFs for CAD is that it can be difficult to work on complex models. The representation is not minimal: two SDFs can represent the same volume, but act differently when you combine them with other bodies.
Libfive's "stdlib" is quite minimal. For anything fancy, you have to build your own "DOM" on top of it, in order to organize your parametric models. I have not enough experience for that, but I think that it should be possible to build a DSL that render to an SDF expression, while supporting introspection, constraint solving, AD for gradients, etc, with goals similar to CadQuery (I don't like the stack API either). This might also help with the normalization issue above.
I think I saw somewhere in the docs that you can tag items and reference them in the selector DSL. Maybe this is possible now? I haven't tried it though.
One other small gripe about CadQuery that I'd add is that its error messages (via its CAD kernel) are typically very opaque.