// -*- C -*- tube_dia = 27.5 + 0.5; lock_w = 42.5 + 0.5; lock_d = 28.0 + 0.5; main_h = 45.0; backflange_d = 12; lockshaft_r = [5, 5]; cliprecess_h = 16; total_h = 45; back_gap = 7; main_th = 2.5; midweb_d = 3; clip_th = 2.5; clip_gap = 2.5; clip_d = 22.0; // calculated front_th = main_th; tube_or = tube_dia/2 + main_th; back_ohw = back_gap/2 + main_th; backflange_ymin = tube_or+backflange_d; lock_0y = tube_dia/2 + lock_d/2 + midweb_d; lock_or = [lock_w, lock_d]/2 + [front_th,front_th]; module oval(sz){ // sz[0] > sz[1] xr = sz[0]; yr = sz[1]; hull(){ for (sx=[-1,+1]) { translate([sx * (xr-yr), 0]) circle(r=yr); } } } module MainPlan(){ difference(){ union(){ circle(r = tube_or); translate([-back_ohw,0]) mirror([0,1]) square([back_ohw*2, backflange_ymin]); } circle(r = tube_dia/2); translate([-back_gap/2,1]) mirror([0,1]) square([back_gap, backflange_ymin+2]); } translate([0, lock_0y]){ difference(){ union(){ oval(lock_or); } oval([lock_w/2, lock_d/2]); } } } lockshaft_or = lockshaft_r + [clip_th,clip_th]; cliprecess_ymax = cliprecess_h - lockshaft_r[1]; clip_ymin = cliprecess_ymax - total_h; clip_ogap = clip_gap + clip_th*2; module ClipElevationPositive(){ oval(lockshaft_or); translate([-lockshaft_or[0], 0]) square([lockshaft_or[0]*2, cliprecess_ymax]); translate([-clip_ogap/2, 0]) mirror([0,1]) square([clip_ogap, -clip_ymin]); } module ClipElevationNegative(){ hull(){ for (y=[0, cliprecess_ymax+1]) translate([0, y]) oval(lockshaft_r); } translate([-clip_gap/2, 1]) mirror([0,1]) square([clip_gap, 2-clip_ymin]); } module ClipElevation(){ difference(){ ClipElevationPositive(1); ClipElevationNegative(0); } } module ExtrudeClipElevation(extra=0){ translate([0, lock_0y + lock_d/2 + clip_d + extra, -clip_ymin]) rotate([90,0,0]) linear_extrude(height= clip_d + extra*2, convexity=100) children(0); } module MainPositive(){ difference(){ union(){ linear_extrude(height=total_h, convexity=100) MainPlan(); ExtrudeClipElevation() ClipElevationPositive(); } ExtrudeClipElevation(1) ClipElevationNegative(); } } //MainPlan(); //ClipElevation(); MainPositive();