
ImplicitCAD: Powerful, Open-Source, Programmatic CAD - ics
http://www.implicitcad.org/
======
colah3
Author here. Sorry, I abandoned this two or three years ago. Please look at
this in the context of a project done several years ago and never completed.
(I do ML research these days -- you can see my blog here:
[http://colah.github.io/](http://colah.github.io/))

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](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! :)

~~~
ics
As the submitter I just want to say thanks for dropping in to comment. As a
professional CAD user and hobby Haskell learner, I found the project very
interesting and thought it was worth sharing. If you ever feel like sharing
I'd be very interested in reading a post-mortem of your work on ImplicitCAD or
any other CAD-related software.

~~~
moeamaya
I second this; it's really motivating to learn about an emphatic approach to
an idea that ultimately resulted in an oblique transition. A post-mortem would
help those interested in solving similar problems start from a more informed
base.

------
pwnna
So I've looked at potentially working with OpenSCAD before, but unfortunately
had to go back to something like Autodesk Inventor before really starting. The
biggest problem I have with all open source 3D CAD systems are the lack of
parametric modeling.

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....

~~~
colah3
Author of ImplicitCAD here. I completely agree.

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!

~~~
auxym
As a frequent user of Solidworks for ~4 years, I'd have to guess that CAD
constraint solvers are not an easy problem.

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.

~~~
colah3
I was really excited about handling some of the messy constraint situations
better than existing tools. I'll split this into two pieces:

> 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.

------
bitwize
It's a neat tool for programmers, but mechanical engineers don't want no part
of this. What they want is something that operates visually and lets them
design parts and assemblies with direct manipulation and shaping of 3D
objects, applying constraints and invariants, etc. This is why the industry
has standardized on tools like SolidWorks and Inventor -- those tools operate
the way a mech eng _thinks_.

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.

~~~
auxym
I agree with this, the process of mechanical design very much involves messing
around with things visually.

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.

------
leoedin
For anyone looking for an open-source parametric CAD system that is robust and
functional enough to use on real projects, try SolveSpace[1].

[1]: [http://solvespace.com/index.pl](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.

------
doczoidberg
best opensource CAD application is FreeCAD:
[http://www.freecadweb.org/](http://www.freecadweb.org/)

It is not very easy to learn but has many features of commercial applications
including scripting via python.

~~~
kanzure
Working with FreeCAD means maintaining OpenCASCADE, here's my notes (hopefully
this will help you get a sense for what you're signing up for):
[http://diyhpl.us/wiki/cad/opencascade/](http://diyhpl.us/wiki/cad/opencascade/)

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/](http://verbnurbs.com/) ) and solvespace (
[http://solvespace.com](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....

~~~
doczoidberg
Thanks for your notes.

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.

~~~
kanzure
> As mentionned there is a python interface for FreeCAD. There is no need to
> know OpenCascade.

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...

------
TD-Linux
How does this differ from OpenSCAD? The example looks nearly identical.

~~~
mkeeter
They're using different representations for solid geometry.

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.

~~~
colah3
Author of ImplicitCAD here!

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.

------
eternalban
Back in '91, there was a mini putsch by the TAs of Columbia GSAPP's CAD
course. The existing course and supporting software were based on
computational geometry and a scripting language to go with it. The new regime
brought in Maya, et al. I think I was the only one who lamented and found it a
step backwards..

------
vic20forever
Relevant:
[https://news.ycombinator.com/item?id=8631804](https://news.ycombinator.com/item?id=8631804)

