// -*- C -*- pump_dia = 27; seatstay_mindia = 14; seatstay_maxdia = 19; pump_seatstay_gap = 12.3; pump_seatstay_delta = 0.1; body_thick_x = 5; body_thick_y = 5; pin_workdepth = 16; pin_width = 11 + 0.5; pin_thick = 3 + 0.4; pin_base = 25; lock_manouvre_thick = 3.5 + 0.5; lock_manouvre_len = 18; lock_hang_width = 17.5; // fudgeish holes_rotation = 9; pin_offset = 6; // computed body_depth = pin_width + 8; module Holes(){ translate([0, -pump_dia/2]); rotate(-holes_rotation){ translate([-(pump_seatstay_gap/2 + pump_dia/2), 0]) circle(r=pump_dia/2); translate([+(pump_seatstay_gap/2 + seatstay_mindia/2), pump_dia/2 -seatstay_maxdia/2 -pump_seatstay_delta]) { hull(){ for (ud=[-1,1]) translate([0, ud * (seatstay_maxdia-seatstay_mindia)/2]) circle(r=seatstay_mindia/2); } } } } module BodyPlan(){ hull(){ for(x=[-1,1]) for(y=[-1,1]) translate([x*body_thick_x, y*body_thick_y]) Holes(); } } module Body(){ translate([0,0,-body_depth/2]) linear_extrude(height=body_depth){ difference(){ BodyPlan(); Holes(); } } } module Pin(){ translate([0, pin_offset, 0]) rotate([0,90,0]){ translate([0, 0, -pin_thick/2]) linear_extrude(height=pin_thick){ translate([-pin_base/2, 0]) square([pin_base, 50]); translate([-pin_width/2, -100]) square([pin_width, 101]); } translate([-lock_manouvre_thick/2, -pin_workdepth-100, -lock_manouvre_len]) cube([lock_manouvre_thick, 100, lock_manouvre_len*2]); translate([- lock_manouvre_thick/2, -pin_workdepth-50, -lock_hang_width/2]) cube([50, 50, lock_hang_width]); } } module Demo(){ %Body(); Pin(); } module All(){ difference(){ Body(); Pin(); } } Demo(); //All(); //Pin();