// -*- C -*- opening_height = 7.84; opening_depth = 7.88; openingcnr_dia = 2.75; opening_topprotr = 1.54; gap = 0.25; retain_empir_angle = 20; retain_empir_stalkw = 1.0; retain_rad = 1.5; topprotr_rad = 0.35; bot_overlap = 5; bot_w = 3; handle_d = 2; handle_w = 8; handle_rh = 2; handle_rcut = 3; cutout_gap = 1.5; // calculated ins_irad = openingcnr_dia/2 + gap; ins_orad = openingcnr_dia/2 + opening_height - gap; ins_th = ins_orad - ins_irad; handle_x0 = ins_irad; handle_h = bot_overlap + ins_th; handle_y0 = -ins_orad-bot_overlap; handle_y1 = handle_y0 + handle_h; handle_x1 = handle_x0 + bot_w + handle_w; module InsertSection(){ hull(){ translate([-ins_orad, 0]) square([ins_th, 0.1]); translate([-ins_irad - topprotr_rad, opening_topprotr - topprotr_rad]) circle(r=topprotr_rad, $fn=10); } translate([0, -ins_orad]) square([ins_irad+1, ins_th]); intersection(){ translate([0.1,0.1]) mirror([1,1]) square([100,100]); difference(){ circle(r= ins_orad); circle(r= ins_irad, $fn=20); } } } module HandleSection(){ difference(){ hull(){ translate([handle_x0, handle_y0]) square([bot_w, handle_h]); for (y= [handle_y1 - handle_rh/2, handle_y1 - ins_th + handle_rh/2]) { translate([handle_x1 - handle_rh/2, y]) circle(r= handle_rh/2, $fn=20); } } hull(){ for (x= [handle_x0 + bot_w + handle_rcut/2, handle_x1 - handle_rh/2 - handle_rcut/2]) { translate([x, handle_y1]) circle(r = handle_rcut/2, $fn=20); } } } hull(){ for (y= [handle_y1 - handle_rh/2, handle_y1 - 3*handle_rh/2]) translate([handle_x1 - handle_rh/2, y]) circle(r = handle_rh/2, $fn=20); } } module RetainSection(){ rotate(180-retain_empir_angle) translate([0,ins_orad]) circle(r=retain_rad, $fn=20); } module RetainCutout(){ rotate(180-retain_empir_angle) translate([0,ins_orad]) { difference(){ circle(r=retain_rad + cutout_gap, $fn=20); rotate(180 + retain_empir_angle/2) translate([0, -retain_empir_stalkw]) square([100, retain_empir_stalkw*2]); } } } module WithRetainSection(){ difference(){ InsertSection(); RetainCutout(); } HandleSection(); RetainSection(); } module Demo(){ difference(){ InsertSection(); RetainCutout(); } HandleSection(); color("red") RetainSection(); } module Test(){ linear_extrude(height=2) WithRetainSection(); } //Demo(); //WithRetainSection(); Test();