import cadquery as cq from cadquery import exporters import key_bittings MM_PER_IN = 25.4 key_thickness = 2 + .2 text_size = 4 text_depth = 0.5 text_margin = 2 lishi_width = 18 - 0.3 lishi_depth = 5 lishi_height = 9.98 lishi_overhang_height = 2.25 lishi_overhang_width = 1 lishi_overhang_radius = 1 - .000000001 # workaround to fillet a part with the same thickness corner_radius = 0.5 side_thickness = 1 bottom_thickness = 2 back_thickness = 1.5 # this number is somewhat estimated, but quite important # it is the offset from the end of the pliers to the point of the cutter lishi_cutter_offset = .54 * MM_PER_IN key_guide_width = 15 key_guide_height = 12.5 notch_width = 1 notch_height = 1.32 notch_depth = 0.5 def lishi_template(name, depth): result = ( cq .Workplane("front") .box(lishi_width + side_thickness * 2, lishi_depth + lishi_overhang_width, lishi_height + bottom_thickness) .tag("lishi_interface") .edges("not >Y").fillet(corner_radius) ) # TODO: positioning could be better result = ( result .faces("Y and >Z") .workplane(offset=-side_thickness, centerOption="CenterOfMass") .rect(lishi_overhang_width, lishi_overhang_height, centered=False).extrude(-lishi_width) .edges(">Z").edges("Y", tag="lishi_interface").vertices(">X and X", tag="key_guide").vertices("Y", tag="key_guide").vertices(">XZ").workplane(centerOption="CenterOfMass") # TODO: better positioning .moveTo(lishi_width / 2 + side_thickness, -notch_height/2) .rect(notch_width, notch_height).cutBlind(-notch_depth) .faces(">Y").workplane(centerOption="CenterOfMass").text(name, text_size, -text_depth) ) return result for name, depth in key_bittings.national_disc_tumbler.items(): #log(f"{name}, {depth}") result = lishi_template(name, depth) exporters.export(result, f'national_disc_tumbler_{name}.stl')