chiark / gitweb /
curveopt: fix handling of empty lines from findcurve
[moebius3.git] / meshscad
1 #!/usr/bin/python3
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 from scad import *
10
11 nomsize = 30;
12 wire = 1.500;
13
14 # number of wires
15 kv = 24
16 kw = 16
17
18 # resolution
19 nv = 200
20 nw = 200
21 ns = 4 # around tube, should be even
22
23 from moedebug import *
24 dbg_file(sys.stderr)
25
26 nv += -nv % kv
27 nw += -nw % kw
28
29 each_v = nv / kv
30 each_w = nw / kw
31
32 m = Moebius(nv, nw)
33
34 def dpr(v): return '%+3f %+3f %+3f' % tuple(v)
35
36 def points_round_wire(p, norm, acrs, sigmas):
37   for sigma in sigmas:
38     delta = norm * sin(sigma) + acrs * cos(sigma)
39     r = p + wire/nomsize * delta
40     yield r
41
42 def calc_sigmas(ss):
43   return [ (s + 0.5)/ns * tau for s in ss ]
44
45 def make_moebius(objname):
46   print('module %s(){' % objname)
47   # wires:
48   extents = [ ScadObject() for w in range(0,nw) ] # along extents
49   travers = [ ScadObject() for v in range(0,nv) ] # along traverses
50
51   def qc(v, w, sigmas, is_trav):
52     #print(' QCv,w,T',v,w,is_trav, file=sys.stderr)
53     for ab in 0,1:
54       p, norm, extt, trav = m.details(v + ab*(not is_trav), w + ab*is_trav)
55       if is_trav: acrs = extt
56       else: acrs = trav
57       #print(' RW,ab,sx',ab,sx,
58       #      'r=',dpr(r),
59       #      'p=',dpr(p),
60       #      'norm=',dpr(norm),
61       #      'extt=',dpr(extt),
62       #      'acrs=',dpr(acrs),
63       #      'delta=',dpr(delta),
64       #      's=','%4f' % sigma,
65       #      file=sys.stderr)
66       for r in points_round_wire(p, norm, acrs, sigmas):
67         yield r
68
69   for v in range(0, nv):
70     for w in range(0, nw+1):
71       extw = w
72       if extw > nw/2: extw = nw-w
73       # each extent wire has to go round twice to meet itself
74       # (except the middle one, if there is one, where nw/2 = nw - nw/2
75       # and it gets to be by itself
76       for s in range(0, ns):
77         sigmas = calc_sigmas([s + sx for sx in (0,1)])
78         #print('VWS',v,w,s, sigmas, file=sys.stderr)
79         if not w % each_w:
80           extents[extw].quad([ cnr for cnr in qc(v,w,sigmas,False) ])
81         if not v % each_v and w < nw:
82           travers[v].rquad([ cnr for cnr in qc(v,w,sigmas,True) ])
83     if not v % each_v:
84       for w in 0, nw:
85         p, norm, extt, trav = m.details(v, w)
86         cnrs = points_round_wire(p, norm, extt, calc_sigmas(range(0,ns)))
87         cnrs = list(cnrs)
88         if w: cnrs.reverse()
89         for s in range(0, ns-1):
90           travers[v].triangle(cnrs[s],
91                               cnrs[s+1],
92                               cnrs[ns-1])
93
94   for w in range(0, nw):
95     print('// extent w=', w)
96     extents[w].writeout_core(nomsize)
97   for v in range(0, nv):
98     print('// travers v=', v)
99     travers[v].writeout_core(nomsize)
100   print('}')
101
102 make_moebius('MoebiusMesh')
103 print('moebiuscore_nomsize=%s;' % repr(nomsize))