Programmatic CAD, OpenSCAD alternatives

There are quite a few programatic CAD, OpenSCAD alternatives out there. I am collecting a list of them and providing links to them here. The requirements to be included in this list are:

  • Free and libre.
  • They are a programming language as opposed to a GUI.

OpenSCAD: The most well known programmatic CAD program. Probably the original open source one that I am aware of.openscad screenshot

CoffeeSCad: Solid CAD modeling in your browser, with a CoffeeScript based syntax (and lots more!)coffeescad screenshot showing code edit window and a rendered cube

ImplicitCAD: Powerful, Open-Source, Programmatic CAD. Haskell and extopenscad.edit area and rendered object in ImplicitCad

RapCAD: Rapid prototyping CAD IDE for RepRap and RepStrap 3D printing machines.code edit window of RapCAD with rendered line next to it

OpenJSCAD: OpenSCAD + JavaScript = OpenJSCAD, edit locally or remote online, preview in browser direct via WebGL.
screenshot of OpenJSCAD

FABFabbers bills itself as “a new site for the 3d printing community”. It provides in browser OpenSCAD compilation and linking to github projects.FABFabbers screenshot

Update: Atomic let me know about BRL-CAD, the free military-grade antecessor to all of these.

BRL-CAD mged graphics window

BRL-CAD mged command window

Update 2: gzmask pointed out SchemeCad, a programmable 3D CAD tool that supports wireframe models and features animation. Users can program Scheme Cad by writing extensions in Scheme (a dialect of LISP). It’s available for Windows and Linux.

screenshot of scheme-cad

Update 3: CScheme is the integration of geometric kernels in a functional language.

screenshot of cscheme website

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
;export the model
(define (print-brep shape filename)
  (BRepTools_Write shape filename))
 
;translate an object
(define (translate obj x y z)
  (let ((vec (make-object gp_Vec% x y z))
        (trsf (make-object gp_Trsf%)))
    (begin
      (send trsf SetTranslation vec)
      (send (make-object BRepBuilderAPI_Transform% obj trsf #t) Shape))))
 
;make a structure from two given object
(define (structure obj1 obj2)
  (let ((compound (make-object TopoDS_Compound%)) 
        (builder (make-object BRep_Builder%)))
    (begin
      (send builder MakeCompound compound)
      (send builder Add compound obj1)
      (send builder Add compound obj2)
      compound)))
 
;make a structure from a list of object
(define (composite lis)
  (if (list? lis)
    (cond
      ((= (length lis) 0) (error "empty list")) 
      ((= (length lis) 1) (car lis))
      (else (make-compound (car lis) (composite (cdr lis)))))
    (error "Not a list")))
 
;build a torus
(define (torus radius circle)
  (make-object BRepPrimApi_MakeTorus% radius circle))
 
;build a sphere
(define (sphere radius)
    (make-object BRepPrimApi_MakeSphere% radius))
 
;calculate the torus dimension
(define (radius z)
  (sqrt (- 1 (* z z))))
 
;make all torus objects
(define (torus-on-sphere the-list)
  (composite 
    (map 
      (lambda (z) (translate (torus (radius z) 0.05) 0.0 0.0 z)) 
      the-list)))
 
Final export operation
;export the model
(print-brep
  (structure
    (sphere 0.3)
    (torus-on-sphere (list -0.93 -0.75 -0.5 -0.25 0 0.25 0.5 0.75 +0.93)))
  "./torus.brep")

and PLaSM: a functional language for computing with geometry.

screenshot of plasm website

1
2
3
4
5
6
7
8
DEF points1 = <<0,0,0>,<0,3,4>,<0,6,3>,<0,10,0>>;
DEF points2 = <<3,0,2>,<2,2.5,5>,<3,6,5>,<4,8,2>>;
DEF points3 = <<6,0,2>,<8,3,5>,<7,6,4.5>,<6,10,2.5>>;
DEF points4 = <<10,0,0>,<11,3,4>,<11,6,3>,<10,9,0>>;
DEF dom = intervals:1:12;
 
MAP:(beziersurface:< points1 , points2 , points3 , points4 >): 
(dom * dom);

Thanks to Kristoffer Josefsson for those two.

Update 4: Parametric Parts allows consumers to create and print 3D parts through our web-based platform. Anyone can make an idea come to life, even without technical expertise or prior 3D experience. It apparently uses  CadQuery for its backend.

CadQuery is an intuitive, easy-to-use python based language for building parametric 3D CAD models. CadQuery is for 3D CAD what jQuery is for javascript. Imagine selecting Faces of a 3d object the same way you select DOM objects with JQuery! Thanks to Monique for pointing them out.

screenshot of parametricparts website

Pierre left a comment to let me know about POV-Ray.  The Persistence of Vision Raytracer (POV-Ray) is a high-quality, Free Software tool for creating stunning three-dimensional graphics. The syntax looks very similar to OpenSCAD and C.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include "colors.inc"
camera{
  location <4, 4, -10>
  look_at 0
  angle 36
}
light_source{ <500, 500, -1000> White }
plane{ y, -1.5
  pigment{ checker Green White }
}
union{
  box{ -1, 1 }
  sphere{ 0, 1.375 }
  pigment{ Red }
}

screenshot of povray of sphere unioned with a cube
Let me know if I’ve left any off the list?

Emacs: yank a line multiple times from the kill ring

a line of php repeated 8 times

Today I needed to copy a line multiple times in emacs. I needed 8 copies, but how to do that in emacs short of pressing C-y to yank 8 times? My initial guess was to try C-u 8 C-y but that yanks the 8th item from the kill ring.

Fuco on #emacs supplied the awesome answer:

F3 C-y C-8 F4

So what does that do? F3starts recording a macro, C-yyanks the line, then within the macro itself you can add a numeric argument of 8 using C-8. End recording of the macro with F4. Emacs then runs the macro 8 times. Recall that pressing F4 after ending recording of the macro runs the macro.

Setting alternate hreflang in WordPress

UPDATE 2013-05-03:

After writing this I found out my approach was incorrect. I have since removed the code as it was not useful.

Dan’s team was kind enough to point me to Virgin Australia‘s site. If you inspect the source and search for hreflang, you’ll see how it should be done.

/UPDATE

After seeing the excellent talk by Dan Petrovic at the Melbourne WordCamp, I went to find out more about the <link rel=”alternate” hreflang=”en-AU” href=”http://somesite.com.au/” />. He has an article describing it. Essentially if you have multiple sites that have similar content (but not exactly the same) then you can instruct google that the sites serve different regions by using the rel=alternate hreflang=”en=gb” options for the link tag.

A common scenario that you might find this useful would be in online stores where there is a different store for each country.

eg. for site somesite.com.au you want a <link> tag like this:

<link rel=”alternate” hreflang=”en-AU” href=”http://somesite.com.au/” />

and for somesite.com you might want a tag like this:

<link rel=”alternate” hreflang=”en-US” href=”http://somesite.com/” />

and you want to remove the rel=”canonical” option too.

I couldn’t find a plugin that would implement this in WordPress so I wrote one and put it up on github. Yoast does not have an option for this as far as I can tell.

At some point I might put it up on wordpress.org too if it seems like there is interest in it.