chiark / gitweb /
demo: get sliceat right (nfc)
[moebius3.git] / genscad
1 #!/usr/bin/python
2
3 from __future__ import print_function
4
5 import signal
6 signal.signal(signal.SIGINT, signal.SIG_DFL)
7
8 from moebius import *
9
10 nomsize = 20
11 thick = 1.0
12
13 nv = 80
14 nw = 80
15
16 m = Moebius(nv, nw)
17
18
19 class ScadObject:
20   def __init__(so):
21     so._points = []
22     so._point_indices = {}
23     so._triangles = []
24
25   def writeout(so, objname, scalefactor=1):
26     print('module %s(){ scale(%s) polyhedron(points=[' %
27           (objname, scalefactor))
28     for p in so._points: print(p, ',')
29     print('],faces=[')
30     for t in so._triangles: print(repr(t), ',')
31     print('],convexity=10); }')
32     so._points = None
33
34   def _point(so, p):
35     l = list(p)
36     s = repr(l)
37     try:
38       ix = so._point_indices[s]
39     except KeyError:
40       ix = len(so._points)
41       so._points.append(s)
42       so._point_indices[s] = ix
43     return ix
44
45   def triangle(so, a,b,c):
46     ''' a b c  are clockwise from inside '''
47     so._triangles.append([ so._point(p) for p in (a,b,c) ])
48
49   def quad(so, cnrs):
50     ''' cnrs[0] [1] [3] [2] are clockwise from inside '''
51     so.triangle(cnrs[0], cnrs[1], cnrs[3])
52     so.triangle(cnrs[0], cnrs[3], cnrs[2])
53
54   def rquad(so, cnrs):
55     ''' cnrs[0] [1] [3] [2] are anticlockwise from inside '''
56     so.triangle(cnrs[0], cnrs[3], cnrs[1])
57     so.triangle(cnrs[0], cnrs[2], cnrs[3])
58
59 relthick = thick/(nomsize*2)
60
61 def make_moebius(objname):
62   so = ScadObject()
63   for v in range(0, nv):
64     for w in range(0, nw):
65       so.quad([ m.point_offset(v+a, w+b,  relthick)
66                 for a in (0, 1)
67                 for b in (0, 1) ])
68       so.rquad([ m.point_offset(v+a, w+b, -relthick)
69                  for a in (1, 0)
70                  for b in (1, 0) ])
71     for q, w in ((so.quad, 0), (so.rquad, nw)):
72       q([ m.point_offset(v+a, w,  b*relthick)
73           for a in (0, 1)
74           for b in (-1, +1) ])
75   so.writeout(objname, nomsize)
76
77 make_moebius('MoebiusCore')
78
79 print('moebiuscore_nomsize=%s;' % repr(nomsize))