Python enabled OpenSCAD
C++ Python C Shell Emacs Lisp
Pull request Compare This branch is 91 commits ahead, 5865 commits behind openscad:master.
Latest commit bdacf72 Jun 15, 2011 Henning Meyer Henning Meyer updated README
Failed to load latest commit information.
contrib Emacs major mode by Len Trigg Apr 7, 2010
doc Added some notes/ideas on visual debugging inspired by Stuart Young Apr 18, 2011
examples changed fn fs fa and t to global function instead of global properties Jun 15, 2011
icons changed icons May 20, 2011
libraries rounder -> boxes and added sidesonly parameter Feb 28, 2010
opencsg remove dep May 20, 2011
patches updated to support an installation dir May 9, 2010
qtfindreplacedialog @ f9d460d added qfindreplace May 27, 2011
qxs Merge branch 'qcodeedit' of int… Apr 12, 2010
scripts bugfix: 64-bit build of gmp was broken under Leopard, bumped to mpfr … Apr 19, 2011
src changed fn fs fa and t to global function instead of global properties Jun 15, 2011
test-code Copyright updates Jan 21, 2011
testdata Updated test, you no longer need to union the ojects passed to hull. Apr 10, 2011
.gitignore needed for vim Jun 3, 2011
.gitmodules fix submodule May 27, 2011
COPYING Clifford Wolf: Feb 1, 2010
Info.plist Experimental Apple Event hack; you can now do 'tell application "Open… Feb 2, 2010
OpenSCAD.sdef Experimental Apple Event hack; you can now do 'tell application "Open… Feb 2, 2010
README.textile updated README Jun 15, 2011
boost.pri Small steps towards making this buildable on VS2008 Apr 6, 2011
cgal.pri windows build tuning May 17, 2011
eigen2.pri Extracted eigen2.pri Mar 31, 2010
glew.pri update build files Jan 24, 2011
minkowski.scad fix isnan ambiguity May 19, 2011
mjau.gdb gdb: use our own libraries Apr 6, 2011
opencsg.pri static build and linkage of OpenCSG May 20, 2011
openscad.qrc Moved progress display to status bar. Disabled by default but can be … Feb 10, 2010
openscad_win32.rc Copyright updates Jan 21, 2011 integrated submodule update in qmake May 27, 2011
python.pri python version agnostic May 22, 2011 Use release libs also when developing Jul 2, 2010
valgrind.supp Clifford Wolf: Jan 10, 2010


OpenSCADpy Flattr this

By Henning Meyer, Marius Kintel and Clifford Wolf

What is OpenSCADpy?

OpenSCADPy is a fork of OpenSCAD, a software for creating solid 3D CAD objects. OpenSCADPy uses Python instead of OpenSCADs intrinsic language to model objects. It is free software and available for Linux/UNIX, MS Windows and Mac OS X.

Unlike most free software for creating 3D models (such as the famous application Blender) it does not focus on the artistic aspects of 3D modelling but instead on the CAD aspects. Thus it might be the application you are looking for when you are planning to create 3D models of machine parts but pretty sure is not what you are looking for when you are more interested in creating computer-animated movies.

OpenSCADpy is not an interactive modeller. Instead it is something like a 3D-compiler that reads in a script file that describes the object and renders the 3D model from this script file (see examples below). This gives you (the designer) full control over the modelling process and enables you to easily change any step in the modelling process or make designs that are defined by configurable parameters.

OpenSCADpy provides two main modelling techniques: First there is constructive solid geometry (aka CSG) and second there is extrusion of 2D outlines. As data exchange format format for this 2D outlines Autocad DXF files are used. In addition to 2D paths for extrusion it is also possible to read design parametes from DXF files. Besides DXF files OpenSCAD can read and create 3D models in the STL and OFF file formats.

Getting OpenSCADpy

Ubuntu Linux (Natty, Maverick)

Piece of cake:

sudo apt-add-repository ppa:hmeyer/openscadpy
sudo apt-get update
sudo apt-get install openscadpy

All other systems

As there are no binaries available for your system, you have to build them yourself. We are currently working on installers for MS Win and maybe even MacOS. As debian packages are available for Ubuntu, it should be easy to produce deb’s for Debian and RPMs (via Alien?) for Fedora. Please contact the maintainer if you need packages for your platform or if you can provide help building these.


To build OpenSCADpy, you need some libraries and tools. The version numbers in brackets specify the versions which have been used for development. Other versions may or may not work as well..

  • Python (2.6|2.7)

building OpenSCADpy

First, run qmake-qt4 to generate a Makefile. On some systems you need to run qmake4, qmake or something alike to run the qt4 version of the tool.
Then run make. Finally you might run make install as root or simply copy the openscadpy binary ( on Mac OS X) to the bin directory of your choice.


As OpenSCADpy is forked from OpenSCAD, you might want to look at the OpenSCAD Homepage for documentation.


All objects are defined in Python language. All OpenSCAD specific methods are part of the openscad-module – so most likely you want to import this module to the global namespace: from openscad import *
OpenSCADpy will render the content of the call openscad.assemble()
openscad.assemble( openscad.sphere(10) ) would create a sphere (with r=10).

The following is a list of all object classes in OpenSCADpy.


The functions openscad.fn(), openscad.fa(), openscad.fs() and openscad.t() work as documented in the OpenSCAD Wiki. Additionally to these global settings (which are evaluated at the time of creation) each primitive has local properties, set by obj.fn(val), obj.fa(val) and obj.fs(val). So you could do s = sphere(10).fn(17)

  • Cube
    cube(length=l, center=False) creates a cube with length l.
    cube(dim=[l,w,h], center=False) creates a box with dim l x w x h.
  • Sphere
    sphere(r=radius) creates a … yep a Sphere.
  • Cylinder
    cylinder(h=height, r=radius, center=False) creates a cylinder.
    cylinder(h=height, r1=radius1, r2=radius2, center=False) creates a cone.
  • Polyhedron
    polyhedron(points, faces, convexity=5) creates a Polyhedron. points is a list of coordinates. faces is a list of faces, representes as list of point indices.
    Example: (Pyramid)
    from openscad import *
    openscad.result = polyhedron(
    		[10, 0, 0],
    		[0, 10, 0],
    		[-10, 0, 0],
    		[0, -10, 0],
    		[0, 0, 10]
    		[0, 1, 2, 3],
    		[4, 1, 0],
    		[4, 2, 1],
    		[4, 3, 2],
    		[4, 0, 3]
  • Square
    square(length [, center]) creates a 2D-Square with edge-length length. If length is a list [x,y], it creates a rectangle with edge-lengths x * y.
  • Circle
    circle(r) creates a 2D-circle of radius r.
  • Polygon
    polygon(points [, paths, convexity=5]) creates a polygon. points is a list of coordinates, paths a list of point-index lists. If paths is omitted, a default path connecting all points in a row (and the last to the first) is created.


All transforms accept an object as last parameter. This parameter might be a single object – named child – or a list of objects – named children.
Transforms are also accessible via obj.scale([x,yz]), obj.rotate(ang) and so on.

  • Scale
    scale(dim, object) scale object by dim. dim is a list, e.g. [2,2,1].
  • Translatea
    translate(vec, object) translate object by vec. vec is a list, e.g. [5,-7.3,0].
  • Rotate
    360 degrees is a full circle – to stay compatible with OpenSCAD – this might be subject to change (to 2*pi).
    rotate(ang=angle [, vec=[0,0,1] ], object) Rotate ang degrees around vec (2*pi being a full circle).
    rotate(vec=[x,y,z], object) rotate x degrees around X, y degrees around Y and z degrees around Z.
  • Mirror
    mirror([x,y,z], object) mirror object on a plane with normal [x,y,z], crossing the origin.
  • Matrix
    matrix(mat, object) use mat (list with 16 elements – representing a 4 × 4 matrix) as a transformation matrix on object.
  • Color
    color([r,g,b,a], object) pretty self explaining….


All CSG-methods take an input list of objects.

  • Union
    union(list) many to one
  • Difference
    difference(list) all objects in list (but the first) are subtracted from the first.
  • Intersection
    intersection(list) intersect all objects in list.


  • Surface
    surface(file=filename, convexity=5, center=False)
    10 9 8 7 6 5 5 5 5 5 
    9 8 7 6 6 4 3 2 1 0 
    8 7 6 6 4 3 2 1 0 0
    7 6 6 4 3 2 1 0 0 0
    6 6 4 3 2 1 1 0 0 0
    6 6 3 2 1 1 1 0 0 0
    6 6 2 1 1 1 1 0 0 0
    6 6 1 0 0 0 0 0 0 0
    3 1 0 0 0 0 0 0 0 0
    3 0 0 0 0 0 0 0 0 0
  • STL
    import_stl(filename [, convexity=5]) import STL.
  • DXF
    import_dxf(file=filename [, layer=layername, origin=[0,0,0], scale=1.0, convexity=5]) import DXF.

If slices is -1, optimal slice number will be calculated based on fn, fa and fs.

  • Linear Extrusion
    linear_extrude(h=height [, twist=0.0, convexity=5, slices=-1, center= False], object) extrude object_.
    dxf_linear_extrude( file=filename, [layer=layername,] h=height, [twist=0.0, origin=[0,0,0], scale=1.0, convexity=5, center=False) fusion of linear_extrude and @import
    dxf@ – might be removed in later releases.
  • Rotational Extrusion
    rotate_extrude([convexity=5,] object) rotate extrude object a full circle.
    dxf_rotate_extrude(file=filename [,layer=layername, origin=[0,0,0], scale=1.0, convexity=5]) fusion of rotate_extrude and import_dxf – might be removed in later releases.


projection([convexity=5, cut_mode=False,] object) project object onto xy-Plane. If cut_mode is True don’t project but cut.


  • Minkowski Sum
    minkowski(list, convexity=5) build a minkowski sum of all objects in list.
  • DXF Dimensions
    DxfDim(filename, layername="", name [, origin=[0,0,0], scale=1]) get Dimension with name name from layer layername.
  • DXF Cross
    DxfCross(filename, layername="", origin=[0,0,0], scale=1.0) return the crossing of two lines on layer layername.
  • Render
    render(object) precalculate (and cache) object.


The variable openscad.t works like documented in the OpenSCAD Wiki. It can be used for animation.


  • a + b results in union([a, b])
  • a - b results in difference([a, b])
  • a & b results in intersection([a, b])
  • a * b results in minkowski([a, b])