summaryrefslogtreecommitdiffstats
path: root/outline.py
blob: fa91621f06b2e1df09fe731a3614aece99781593 (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
import sys
import cadquery as cq
import math as m

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

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 gridify(gen):
  for x, y in gen:
    yield (y * size, x * spacing / 2)

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
''')))

  plate = (
    cq.Workplane("XY")
    .pushPoints(key_pos)
    .polygon(6, radius)
    .extrude(1)
    .rotate((0,0,0), (0,0,1), -90)
    .translate((3*spacing, -4*size, 0))
  )

  top = plate.faces('<Z').val().outerWire()

  pcb = (cq.Workplane("XY")
    .newObject([top])
    .toPending()
    .offset2D(-0.2, kind='intersection')
    .extrude(1)

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

  return pcb.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)