Decide whether you want to start from scratch or want to rework an existing generator.

You should go over the arguments first. Get at least the most basic arguments done. For things you are still unsure you can just use a attribute set in the .__init__() method and turn it into a proper argument later on.

Depending on what you want to do you can work on the different levels of the API. You can either use what is there and combine it into something new or you can implements new things in the appropriate level.

Here are some examples:

Housing for some electronics

You can use the ElectronicsBox or the ClosedBox as a basis. Write some callbacks to place holes in the walls to allow accessing the ports of the electronics boards. Place some holes to screw spacers into the bottom to mount the PBC on.


This is a good non box example to look at.

class boxes.generators.nemamount.NemaMount[source]

Mounting bracket for a Nema motor

Note that although it produces a cube like object it uses separate variables (x, y, h) for the different axis. Probably because it started as a copy of another generator like ClosedBox.


class boxes.generators.displayshelf.DisplayShelf[source]

Shelf with slanted floors

The DisplayShelf is completely made out of rectangularWalls(). It uses a callback to place all the fingerHolesAt() at the right places on the sides. While the use of the Boxes.py API is pretty straightforward the calculations needed are a bit more tricky. You can use the debug default param to check if you got things right when attempting something like this yourself.

Note that the front walls and the shelfs form a 90° angle so they work with the default FingerJoints.


class boxes.generators.bintray.BinTray[source]

A Type tray variant to be used up right with sloped walls in front

The BinTray is based on the TypeTray generator:

class boxes.generators.typetray.TypeTray[source]

Type tray - allows only continuous walls

TypeTray is an already pretty complicated generator.

BinTray replaces the now vertical front (former top) edges with a special purpose one that does add the triangles:

class boxes.generators.bintray.BinFrontEdge(boxes, settings)[source]

The hi (height of inner walls) argument was removed although the variable is still used internally - out of laziness.

To complete the bin the front walls are added. Follow up patches then switched the slots between the vertical and horizontal walls to have better support for the now bottoms of the bins. Another patch adds angled finger joints for connecting the front walls with the bottoms of the bins.

The TrafficLight generator uses a similar technique implementing its own Edge class. But it uses its own code to generate all the wall needed.


class boxes.generators.stachel.Stachel[source]

Bass Recorder Endpin

Stachel allows mounting a monopod to a bass recorder. It is basically just one part repeated with different parameters. It can’t really make use of much of the Boxes.py library. It implements this one part including the move parameter and draws everything using the .polyline() method. This is pretty painful as lots of angles and distances need to be calculated by hand.

For symmetric sections it passes the parameters to .polyline twice – first in normal order and then reversed to get the mirrored section.

This generator is beyond what Boxes.py is designed for. If you need something similar you may want to use another tool like OpenScad or a traditional CAD program.