ImplicitCAD: Powerful, Open-Source, Programmatic CAD
implicitcad.org
implicitcad.org
Julia Longtin took up working on ImplicitCAD a few months ago. I'm not sure how much she's progressed with it.
Honestly, I no longer believe ImplicitCAD was the right approach to the problem, or that there's even as much of a problem as I originally thought. In particular, the system ImplicitCAD uses to represent objects, a variant of f-rep (http://en.wikipedia.org/wiki/Function_representation) has issues. (f-rep is awesome, I just tried to have my cake and eat it too with some trade offs, and thought I was being really clever! :P)
After ImplicitCAD, I worked with Rob Gilson on a SVG/WebGL constraint-based modelling tool, mech.ly. We got some neat stuff working, but never got to a point where we wanted to release things. I'm pretty persuaded this is the right direction to go.
I learned a lot from both projects. I also matured a lot intellectually. For example, I now review academic literature before diving into solving hard problems! :)
If you're unfamiliar with this, this basically is setting constraints on your geometry. For example, you can say that edge A has the same length as edge B, and it mirrors across plane C, which is 10 cm away from the primary XY plane.
This is essential to my workflow in 3D modeling and makes most geometry based operations (such as specifying that edge A is 10cm and starts at 3,4) obsolete. It also allows easy assemblies: you can specify the axis of shaft A need to be coincidental with the axis of hole B.
Plain text based 3D modelling would be awesome as you can use reasonable revision controls and have reasonable merge strategies.. but the lack of parametric modelling, at least for me, is a deal breaker. I've looked into writing a library for parametric modelling in Python, but then I realized that you probably need to be a PhD in geometry to write a correct implementation with reasonable speed....
Well, here's a video of sympy + OpenCASCADE for parametric modeling: https://www.youtube.com/watch?v=ZUCv7COgzU0&t=25s but see also my other comment for my thoughts regarding OpenCASCADE..
I remember doing that in FreeCAD. Maybe I didn't get all the intrincacies and you mean something bigger than what I tried, but there was definitely a constraint system.
EDIT: Found a video https://www.youtube.com/watch?v=qY_GGTa9-mU Is this what you mean?
The above looks pretty 3d to me.
An assembly module is being developed which addresses this problem, but it's a recent addition and still has some limitations
FreeCAD is a very good piece of software none the less
Huh, are you sure Solidworks has to be running for that workflow? Can't you just load the DLL?
I'm not optimistic, though. Even in normal interactive use, SolidWorks cannot manage to read updated values from a linked Excel spreadsheet upon opening a part (or writing while saving the part) without the embedded Excel window flashing up briefly. Getting SolidWorks and it's Excel child process to both stay in the background isn't really worth much effort to us at the moment, and I do occasionally get the benefit of spotting something breaking when the model flashes up on screen, instead of discovering it much later.
It's really something that shouldn't even require COM/OLE style stuff, just some basic command line functionality. But why would a Windows-only app support that method of interaction?
The tool is being beta-tested in fab academy [1] this semester; shoot me an email (in my profile) if you're interested in learning more.
At first, I tried to implement constraints in a Haskell DSL. Unfortunately, constraints usually only partially describe your object. Even a well-constrained object can be flipped and maintain the constraints, in most systems. I coudln't find a reasonable way to implement a text-based interface for this. It really needs to be graphical.
I abandoned ImplicitCAD to write a constraint-based CAD program with my friend Rob Gilson. (I handled constraint solving with gradient descent, which worked surprisingly well, and a dab of grobner bases here and there.) We got some neat stuff working, but eventually got pulled away to other projects.
I think there's a lot of interesting work to be done linking programmatic and graphical CAD. In particular, I think there's neat connections between constraint based CAD which is a form of visual logic programming, and functional programming. (Aside: I like Bret Victor's talk "Stop Drawing Dead Fish" which is on a kind of related topic.)
Unfortunately, I'm too busy with ML research these days to work on this stuff!
That said, I naively tried a bunch of naive approaches and had quite a bit of success with plain old gradient descent -- it was really surprising. I'm not sure if it would scale to really significant models, but it's something you could implement in a few hours and you could use to get a project off the ground.
Somehow UI-control-layouting with constraints feels similar to constraints in CAD drawings ? :-)
+ How does gradient descent work with over-constrainted models ? (as in: impossible to satisfy all constraints). You need some way to back out of those or relax one of the constraints.
Typically, you want to at least be able to express the lengths of lines, and the values of angles. I don't know how you could do this without using at least quadratic terms. So you have to do at least quadratic programming, and there's some things that can add higher degree terms.
Moreover, extremely similar problems are studied in automated geometric theorem proving, and they also get pulled into using polynomials.
Unfortunately, these problems are much much harder than linear programming.
There's some really powerful tools from algebraic geometry, mainly Grobner Bases, which you would ideally want to use. They're ridiculously powerful. Not only can you use them to solve systems of polynomial equations, but you can also test whether a set of equations implies another polynomial, or conflicts with another polynomial -- super useful for dealing with over-constrained models.
Tragically, the relevant algorithm is O(exp(exp(n))) -- well, or at least, that's the best upper bound anyone can probe, in practice it isn't that bad. Still, I quickly ran into computational problems. Grobner bases, also, while great are tricky to work with if you only want real valued solutions. They like to give you complex valued solutions to problems, and complex valued solutions to your CAD constraints are usually not what you are looking for.
> How does gradient descent work with over-constrainted models ? (as in: impossible to satisfy all constraints). You need some way to back out of those or relax one of the constraints.
In my implementation, each constraint was a separate cost function, which I added together. Normally, when you run the solver, it pushes all the constraint costs to zero, and you know you've solved everything.
Sometimes it would get stuck in a local minimum and require user intervention to help it get to the right solution. That was surprisingly rare.
If you have conflicting constraints it simply fails to reach a cost of zero at all. You can handle that in your interface however you like. The obvious thing is to try and solve a constraint immediately after adding it and then reject the constraint if you can't.
(I really didn't expect a local optimization method like gradient descent to work so well, but it did. That said, if I attacked the problem again I would try to use some sort of second order optimization method, I think.)
My my view is probably way too simplistic, but I'm really wondering how you would end up with quadratic terms if you need to define stuff like:
* this line needs to be 1/3 the length of that line
* these set of lines should start 50mm left of this line
I can see how trigonometric expressions could be useful to specify angles (although a constant there covers 99% of the user-cases?).
Remember that you're working with points. So, to express the length of a line, you need something like (x1-x2)^2 + (y1-y2)^2 .
If you just wanted to do things like "this point is +(0,10) of this other one", you're doing a really simple constructive system, which is easy to evaluate, but not anywhere near as flexible or powerful. ImplicitCAD/OpenSCAD trivially do that, just without a nice interface.
It happens pretty often that you'll modify a single constraint (flipping it is a common culprit), the solver will get "confused" and flip a bunch of your other constraints around. Constraint conflict resolution also often gets very hairy to almost impossible. Sometimes the fastest thing to do is to nuke a good part of your constraints and start over -- in a saner way.
I guess the BIG CAD packages (CATIA, NX) might be a bit better at this, or at least better at strongly encouraging saner ways of build parametric constraints (which is what I've heard).
It's too bad that there isn't a simple, intuitive and useful free/oss CAD software out there. With the whole hobbyist maker movement explosion out there, a lot of people would be thrilled to have something like that. Though, it seems that things are not very much better in the PCB CAD/CAM world either.
> It happens pretty often that you'll modify a single constraint (flipping it is a common culprit), the solver will get "confused" and flip a bunch of your other constraints around.
For "confused" constraint solvers, I see this as largely being a problem of there being lots of solutions to a well constrained system, because of flips and such. It needs to be easy for the user to specify which one they want.
Our approach was to have fast pulls of the mouse temporarily over ride the constraint solver. So, if you needed to flip the model, you do a really fast pull and it would flip. This works much better with multi touch, where you can just grab a few points with different fingers and force your model into whatever shape you want.
> Constraint conflict resolution also often gets very hairy to almost impossible.
There's some really powerful tools from algebraic geometry I tried to apply to this. In particular, there's these things called Grobner Bases which you can use to test if certain polynomials imply that another is true, false, or if it's independent of them.
From the users perspective, I wanted to use these to do a few things.
(1) Display implied constraints. If you make three corners of a quadrilateral perpendicular, the fourth is forced to be perpendicular. I grayed out perpendicular constraint could alert you to this, and prevent you from adding a conflicting constraint. Obviously, that example is kind of silly, but I think that propagating constraints through the whole model would really help people understand how more complicated models are constrained.
(2) If you try to add a constraint which conflicts with preexisting ones, highlight in red a minimal set it conflicts with.
I never got this part of the project to work though. I did some very small proof of concepts in sage, but couldn't really get things to work. I'm not really sure how realistic it is to make these work for real models.
[1]: https://www.onshape.com [2]: http://plmsource.industrysoftware.automation.siemens.com/plm...
I thought about this as well, but I don't know anyone who works with CAD who would likely switch their work flow from GUI to text-based, other than people in this thread, I suppose.
Furthermore, while I don't know about the details on how to implement a text-based 3D modelling language for constraint based modelling, I don't think there's a lot of point if a GUI is going to be attached to it anyway. Existing systems already do a reasonable job.
One of the most annoying part of the confused constraint system, for me, is that it is difficult to fix the constraints. Options are likely to be hidden behind layers and layers of menus and dialog. A text file can be easily searched and diffed, which in my mind should make a confused system easier to resolve. So maybe this kind of constraint based CAD should have both a language and a revision control system built into it, or something.
Programming doesn't have to be writing text. :P
Everyone seems to be thinking about APIs to the CAD program, which solidworks, autodesk, and presumably others provide.
I had in mind a pretty deep way to embed a lambda calculus into the visual interface. The hope was to make it intuitive to create powerful parametric models, where every sketch is a function of different parameters. We never implemented that part, though. :/
For some reason it's barely known about, which is a shame. It's truly fantastic - once you understand the UI it's almost as powerful as SolidWorks or other commercial parametric CAD systems (for smaller tasks anyway - once you get larger and more complex models it starts to struggle).
Knuth ran into the same problem with METAFONT for typography: 99% of designers were not skilled enough at programming to effectively create beautiful fonts with METAFONT, nor did they wish to be. And today METAFONT is nowhere while Type1, TrueType, and OpenType proliferate.
I've interned in a place that still used "good old" 2D, non-parametric autocad, and a lot of the "premilinary" design work took place on scratch pieces of paper. Sketch stuff up quickly, see how it looks and fits together iterate. Move to autocad for a to-scale sketch, then to drafters to the official engineering drawings.
[1]: http://solvespace.com/index.pl
For some reason it's barely known about, which is a shame as it's by far the most powerful open-source CAD system I've used. The parametric modelling system is very similar to that of commercial CAD software.
It is not very easy to learn but has many features of commercial applications including scripting via python.
I think that OpenCASCADE is very difficult to maintain. At least half the variable names are "aMPBLPB" and "aMPBLI", the other half are some strange combination of Russian, English and French. I think that to insulate yourself from the actual CAD engine it would be a good idea to use cadquery, a python library that is aiming to let you switch out the actual CAD implementation without (dramatically) rewriting your source code.
At the moment, I think the two biggest players in the CAD kernel landscape are verbnurbs ( http://verbnurbs.com/ ) and solvespace ( http://solvespace.com ) (which includes parametric modeling and constraint solving, btw). Both are very well written, well documented, and well tested. BRLCAD also has surface-surface intersection for NURBS, although I don't remember all the caveats....
Solvespace is a genuine joy to use. If making chamfers, path-based operations, and other such features were better supported, I'd gladly make it my primary CAD package.
It was released as open source pretty recently. I really hope some more development takes off.
As mentionned there is a python interface for FreeCAD. There is no need to know OpenCascade.
I didn't know verbnurbs and solvespace.
Verbnurbs is only a simple NURBS library. Solvespace seems to be more comparable to OpenCascade. I will look deeper into it.
Ha, well someone has to know OpenCASCADE to maintain FreeCAD. And someone has to fix OpenCASCADE when bugs are found, and when it's time to refactor legacy junk...
ImplicitCAD is using implicit surfaces / functional representations, while OpenSCAD is using a boundary representation (which is a lot more common in commercial packages).
Implicit surfaces are a very nice representation and make certain operations very easy: booleans become MIN or MAX functions between two functions. However, it becomes much harder to do feature-based operations -- a task like "bevel that edge" is tricky when the edge is an emergent property of the function, rather than as part of the model's explicit representation.
I had some neat tricks that made beveling most edges really easy! (Though, when the didn't work, it was pretty messy.)
Please keep in mind that I abandoned this project 2+ years ago, and started it four years ago. Things have come always since then. OpenSCAD was less mature when I started.