Loading
mechadense

miniSageCAD

by mechadense Jan 4, 2013
Download All Files

Thing Apps Enabled

Please Login to Comment

Is it possible to use your minicad to export mathematical functions to .STL files? I have been painfully trying to get an open-source software which would do it.

This is exactly what miniSageCAD does. I too was frustrated to being unable to quickly turn mathematical functions into 3D printable models (The situation may have improved by now 2016-03 - I haven't checked recently).

You have to get your function into the form of an algebraic variety that is f(x,y,z)=0.
And plug it in at the end of the code (there are a few usage examples) and execute it in sage

  • Note that miniSageCAD is more of an experiment that has usable results than a real software
  • Note If you use Firefox you may need to jump through some hoops to activate and allow the java browser plugin for the live turnable 3D preview.

Be prepared for long rendering times!

  • I only did the high level composition stuff and copied the lower level export to *.stl function from some old probably unoptimized code from Christopher Olah (author of ImplicitCAD - which you may want to check out).
  • IIRC I failed at symbolically simplifying the composed functions.
  • I did not check the useless eager evaluation overhead.

That's amazing! However I downloaded it and in the text files there are no instructions like a quickstart. Since Sage has a lot of different packages and databases, I don't quite know where to start. I am still looking into it and I think I will eventually find the way, but a quick README telling these directions wouldn't be a good introduction?

When I wrote the code there where no dependencies that where manually to add.
Back then I used locally installed Sage - Now there is SageMathCloud too:
https://cloud.sagemath.com/
I don't know if it will work there too.

How to implement hull or smth for emulating "extrude along the curved path"? In OpenScad I can do this via

union(){
hull(){
translate([0,0,10])rotate(15,[180,0,0])cylinder(h=0.1,r=5);
translate([0,-15,50])rotate(45,[180,0,0])cylinder(h=0.1,r=12);
}
hull(){
translate([0,-15,50])rotate(45,[180,0,0])cylinder(h=0.1,r=12);
translate([0,-30,70])rotate(60,[180,0,0])cylinder(h=0.1,r=20);
}}

Yes convex hulls are painfully lacking.
The reason is that convex hulls are rather nontrivial:
http://en.wikipedia.org/wiki/Convex_hull_algorithmshttp://en.wikipedia.org/wiki/C...
I think todays practically used algorithms are all vertex based.

You'd have to find a general way to generate an implicit function Surf(c):={x,y,z|f_hull(x,y,z)=c} such that forall c: Surf(c)=boundary(hull(Surf1(c),surf2(c),..)) without relying on vertex based algorithms. I guess that there isn't a noniterative direct way to do that. A hull of compositioned objects (planes & tubes) like your example is even harder. Concrete example: For easier reasoning imagine the convex hull of two circles in a two dimensional room. The implicit function for a circle is a cone. You'd have to generate a "roof" from this two cones only with elementary functions (provable impossible?).

Special cases could be implemented though. And I think this (with auto case choice) is a good way to go. Sadly two arbitrary orientated circles like in your specific case will not work this way. But e.g. a truncated cone as convex hull for two spheres will. In Haskell types could carry the necessary information or monads, but in sage I see hurdles/limits.

Another (less powerful) approach for things similar to this would be to to define an implicit function by the minimal distance to an user choosen parametrically defined spacecurve x(t),y(t),z(t).