#!/usr/bin/env python

import stlwrite as stl

def example():
    def get_cube():
        # cube corner points
        s = 3.
        p1 = (0, 0, 0)
        p2 = (0, 0, s)
        p3 = (0, s, 0)
        p4 = (0, s, s)
        p5 = (s, 0, 0)
        p6 = (s, 0, s)
        p7 = (s, s, 0)
        p8 = (s, s, s)

        z = s/3.
        t = z*2
        q1 = (z, 0, z)
        q2 = (z, 0, t)
        q3 = (z, s, z)
        q4 = (z, s, t)
        q5 = (t, 0, z)
        q6 = (t, 0, t)
        q7 = (t, s, z)
        q8 = (t, s, t)

        r1 = (0, 0, z)
        r2 = (0, 0, t)
        r3 = (0, s, z)
        r4 = (0, s, t)
        r5 = (s, 0, z)
        r6 = (s, 0, t)
        r7 = (s, s, z)
        r8 = (s, s, t)

        # define the faces for a cube with a rectangular hole cut through it
        return [
            [p1, p5, p7, p3],
            [p1, r1, r5, p5],
            [r6, r5, q5, q6],
            [r1, r2, q2, q1],
            [p2, p6, r6, r2],
            [p5, p6, p8, p7],
            [p3, p7, r7, r3],
            [r7, r8, q8, q7],
            [q3, q4, r4, r3],
            [r8, p8, p4, r4],
            [p1, p3, p4, p2],
            [p2, p4, p8, p6],
            # donut hole
            [q3, q1, q2, q4],
            [q5, q7, q8, q6],
            [q3, q7, q5, q1],
            [q2, q6, q8, q4]
        ]

    filename = 'cubehole.stl'
    with open(filename, 'wb') as fp:
        writer = stl.ASCII_STL_Writer(fp)
        writer.add_faces(get_cube())
        writer.close()
    print 'Wrote ' + filename

if __name__ == '__main__':
    example()
