diff --git a/cad/test2/button.py b/cad/test2/button.py new file mode 100755 index 0000000..dc07fa2 --- /dev/null +++ b/cad/test2/button.py @@ -0,0 +1,141 @@ +#!/usr/bin/python + +# all dimensions are mm + +from cadmium import * + + +but_top_x = 10.0 +but_top_y = but_top_x+5.0 +but_top_z = 1.5 + +but_corner_r = 2.0 + +but_base_border = 1.0 +but_base_x = but_top_x+2*but_base_border +but_base_y = but_top_y+2*but_base_border +but_base_z = 0.5 + +but_fillet_r = 0.4 +but_chamfer_r = 0.2 + + +# ----- Helper elements for fillets ------------------------------------------- + + +def fillet_line(x, r): + s = Box(x, r, r) + s -= Cylinder(r, h = x). \ + rotate(Y_axis, 90). \ + translate(0, r, r) + return s.translate(-x/2, 0, 0) + +def fillet_circle(r, fillet_r): + return Cylinder(r+fillet_r, h = fillet_r)- \ + Torus(r+fillet_r, fillet_r, center = True). \ + translate(0, 0, fillet_r) + + +# ----- Helper elements for chamfers ------------------------------------------ + + +def chamfer_line (x, r): + s = Box(x, r, r) + s -= Cylinder(r, h = x). \ + rotate(Y_axis, 90) + return s.translate(-x/2, -r, -r) + +def chamfer_circle(r, fillet_r): + return Box(2*(r), 2*(r), fillet_r). \ + translate(-r, -r, -fillet_r)- \ + Cylinder(r-fillet_r, h = fillet_r). \ + translate(0, 0, -fillet_r)- \ + Torus(r-fillet_r, fillet_r, center = True). \ + translate(0, 0, -fillet_r) + + +# ----- Box with rounded corners ---------------------------------------------- + + +def rbox_core(x, y, z, r): + return Box(x-2*r, y, z, center = True).translate(0, 0, z/2)+ \ + Box(x, y-2*r, z, center = True).translate(0, 0, z/2) + +def rbox(x, y, z, r): + s = rbox_core(x, y, z, r) + for dx in [-1, 1]: + for dy in [-1, 1]: + s += Cylinder(r, h = z). \ + translate(dx*(x/2-r), dy*(y/2-r), 0) + return s + +def rbox_fillet_bottom(x, y, z, r, fillet_r): + s = None + for a in [0, 180]: + t = fillet_line(x-2*r, fillet_r). \ + translate(0, y/2, 0). \ + rotate(Z_axis, a) + if s is None: + s = t + else: + s += t + s += fillet_line(y-2*r, fillet_r). \ + translate(0, x/2, 0). \ + rotate(Z_axis, a+90) + for dx in [-1, 1]: + for dy in [-1, 1]: + s += fillet_circle(r, fillet_r). \ + translate(dx*(x/2-r), dy*(y/2-r), 0) + return s + +def rbox_chamfer_top_corners(x, y, z, r, chamfer_r): + s = None + for dx in [-1, 1]: + for dy in [-1, 1]: + t = chamfer_circle(r, chamfer_r). \ + translate(dx*(x/2-r), dy*(y/2-r), z) + if s is None: + s = t + else: + s += t + return s-rbox_core(x, y, z, r) + +def rbox_chamfer_top(x, y, z, r, chamfer_r): + s = rbox_chamfer_top_corners(x, y, z, r, chamfer_r) + for a in [0, 180]: + s += chamfer_line(x-2*r, chamfer_r). \ + translate(0, y/2, z). \ + rotate(Z_axis, a) + s += chamfer_line(y-2*r, chamfer_r). \ + translate(0, x/2, z). \ + rotate(Z_axis, a+90) + return s + +def rbox_chamfer_bottom(x, y, z, r, chamfer_r): + return rbox_chamfer_top(x, y, z, r, chamfer_r). \ + translate(0, 0, -z). \ + rotate(X_axis, 180) + +# ----- Button ---------------------------------------------------------------- + + +def button_top(): + return rbox(but_top_x, but_top_y, but_top_z, but_corner_r)- \ + rbox_chamfer_top(but_top_x, but_top_y, but_top_z, \ + but_corner_r, but_chamfer_r)+ \ + rbox_fillet_bottom(but_top_x, but_top_y, but_top_z, but_corner_r, + but_fillet_r) + +def button_base(): + s = rbox(but_base_x, but_base_y, but_base_z, but_corner_r)- \ + rbox_chamfer_top(but_base_x, but_base_y, but_base_z, \ + but_corner_r, but_chamfer_r)- \ + rbox_chamfer_bottom(but_base_x, but_base_y, but_base_z, \ + but_corner_r, but_chamfer_r) + return s.translate(0, 0, -but_base_z) + +def button(): + return button_top()+button_base() + +b = button() +b.toSTL("button.stl")