Add key decoder card
This commit is contained in:
parent
428f5f03be
commit
183be1c828
61
key_decoder.py
Normal file
61
key_decoder.py
Normal file
@ -0,0 +1,61 @@
|
||||
import cadquery as cq
|
||||
from cadquery import exporters
|
||||
|
||||
import key_bittings
|
||||
from key_bittings import BittingSpecification
|
||||
|
||||
kerf = .11
|
||||
|
||||
bitting_width = 5
|
||||
|
||||
text_size = 5
|
||||
text_gap = 2
|
||||
|
||||
margins = 5
|
||||
margin_radius = 2
|
||||
|
||||
|
||||
def bitting(loc: cq.Location, name: str, depth: float):
|
||||
# can only make text in a 3D workplane, so make it in 3D and extract the face
|
||||
text = (
|
||||
cq.Workplane()
|
||||
.text(name, fontsize=text_size, distance=1, valign="top", halign="center")
|
||||
.edges("<Z")
|
||||
)
|
||||
|
||||
return (
|
||||
cq.Sketch()
|
||||
.push([(0, depth/2)]).rect(bitting_width, depth - kerf)
|
||||
.push([(0, -text_gap)]).face(text.vals())
|
||||
.moved(loc)
|
||||
)
|
||||
|
||||
|
||||
def decoder_card(spec: BittingSpecification):
|
||||
result = (
|
||||
cq.Sketch()
|
||||
.rect(margins * 2 + bitting_width * len(spec.depths),
|
||||
margins * 2 + text_size + text_gap + max(*spec.depths.values()))
|
||||
.vertices().fillet(margin_radius).reset()
|
||||
)
|
||||
|
||||
depths = iter(spec.depths.items())
|
||||
|
||||
result = (
|
||||
result
|
||||
.rarray(bitting_width, 0, len(spec.depths), 1)
|
||||
.each(lambda loc: bitting(loc, *next(depths)), mode="s")
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
|
||||
sketch = decoder_card(key_bittings.national_disc_tumbler)
|
||||
|
||||
# for preview/export purposes, a 3D object is more convenient
|
||||
result = cq.Workplane("front").workplane().placeSketch(sketch).extrude(1)
|
||||
exporters.export(result, "national_disc_tumbler_decoder.svg", opt={
|
||||
"showAxes": False,
|
||||
"projectionDir": (0, 0, 1),
|
||||
"strokeColor": (255, 0, 0),
|
||||
})
|
Loading…
Reference in New Issue
Block a user