summaryrefslogtreecommitdiffstats
path: root/outline.py
blob: f9312711591b5e68b6d6f437ef939f04e3aed431 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import cadquery as cq
import math as m

spacing = 21.5
size = spacing * 1.5 / m.sqrt(3)
radius = size * 4/3

sin30, cos30 = m.sin(30/180*m.pi), m.cos(30/180*m.pi)
epsi = 1e-6


def shape2points(shape):
  lines = shape.strip('\n').split('\n')

  for y, line in enumerate(lines):
    for x, char in enumerate(line):
      if char != ' ':
        yield x, y


def gridpos(x, y, ox=0, oy=0):
  return (x * spacing / 2 + ox, -y * size + oy)


def gridify(gen):
  for x, y in gen:
    yield gridpos(x, y)


def make_outline():
  results = []
  key_pos = list(gridify(shape2points('''
  X X X
 X X X X
X X X X X
 X X X X
  X
''')))
  extras = list(gridify(shape2points('''
       
        
        X X
     X X X
   
''')))

  return (
    cq.Workplane("XY")
    .sketch()

    .push(key_pos)
    .regularPolygon(radius/2, 6)
    .reset()

    .push([(x+2*cos30, y-2*sin30) for x,y in extras])
    .regularPolygon(radius/2, 6)
    .reset()

    .clean()

    .segment(
      gridpos(11, 1 + 2/3, ox=2*cos30, oy=-2*sin30),
      gridpos(8.75, 1/12-1, ox=-2*cos30, oy=-2*sin30),
    )
    .segment(gridpos(7, -1/3))
    .segment(gridpos(7, 1/3))
    .segment(gridpos(8, 2/3))
    .segment(gridpos(8, 4/3))
    .segment(gridpos(9, 5/3, ox=2*cos30, oy=-2*sin30))
    .segment(gridpos(10, 4/3, ox=2*cos30, oy=-2*sin30))
    .assemble()

    .finalize()
    .extrude(1)
    .faces('<Z')
    .wires()
    .toPending()
    .extrude(1.6)

    # fillets
    .edges('|Z')
    .fillet(4)

    .translate((1.5*spacing, -2*size, 0))
    
    .pushPoints([
      (53.75, -52.652),
      (110.5, -43.446),
      (53.75, -101.554),
      (119.982, -90.891),
    ])
    .circle(3.2)
    .cutThruAll()
    
    # .section()
  )


try:
  show_object
except NameError:
  show_object = None

if __name__ == "__main__" or show_object:
    filename = 'outline.dxf'
    obj = make_outline()
    if show_object:
      show_object(obj, name=filename)
    else:
      print('generating "{}"...'.format(filename))
      cq.exporters.export(obj, filename)