toothheight = 1.2; webthick = 1.8; height = 7; pindepth = 10; nomrad = height/2 - toothheight; minrad = nomrad - 0.5; maxrad = nomrad + 0.5; jawthick = 1.5; webgap = 0.4; toothgap = webthick + webgap*2; basethick = toothheight; module DoveClipPin() { translate([0,0, height/2]) intersection(){ union(){ for (m=[0,1]) { mirror([0,0,m]) translate([0,0,height/2]) rotate([90,0,0]) cylinder($fn=20, r1=minrad, r2=maxrad, h=pindepth); } translate([-webthick/2, -pindepth, -height/2-1]) cube([webthick, pindepth, height+2]); } translate([-maxrad-1, -pindepth-1, -height/2]) cube([maxrad*2+2, pindepth+2, height]); } } module DoveClipEnd(baseextend=1, h=7) { cubex = nomrad*2 + jawthick*2; cube0y = -basethick-nomrad*2-toothheight; centrey = -basethick-nomrad; difference(){ translate([-cubex/2, cube0y, 0]) cube([cubex, -cube0y+baseextend, h]); translate([0, centrey, -1]) cylinder($fn=20, r=nomrad, h=h+2); translate([-toothgap/2, cube0y-1, -1]) cube([toothgap, toothheight+nomrad+1, h+2]); } } module DoveClipPair(baseextend=1, h=7) { delta = nomrad*2 + jawthick*2 + toothgap; for (x=[-delta/2,delta/2]) translate([x,0,0]) DoveClipEnd(baseextend=baseextend, h=h); }