// basic parameters for the locking mechanism kerf = 0.1; // laser kerf to account for slot = 0.2; // slot widht: material thckness rodlength = 30; // length of a rim / rod rodbase = 0.01; // base width, necessary for drawing using hull tabhook = 3; // trapezioid shape length tab = 2; // width of a tab snapratio = 0.75; // trapezioid angle between 0 (full tab gap and 1 full push through) // make the buildplate of triangles and squares projection(){ for(i=[0:1:3])translate([i*50,110,0])triangle(); for(i=[0:1:3])translate([i*50 + 55,80,0])rotate([0,0,180])triangle(); for(i=[0:1:5])translate([i*38,30,0])square(); for(i=[0:1:5])translate([i*38,70,0])square(); } // a square module square(){ translate([0,0,0])rotate([0,0,0])edge(); translate([0,-rodlength,0])rotate([0,0,90])edge(); translate([rodlength,-rodlength,0])rotate([0,0,180])edge(); translate([rodlength,0,0])rotate([0,0,270])edge(); hull(){ translate([0,0,0])rotate([0,0,0])cube([rodlength,rodbase,slot]); translate([0,-rodlength,0])rotate([0,0,90])cube([rodlength,rodbase,slot]); translate([rodlength,-rodlength,0])rotate([0,0,180])cube([rodlength,rodbase,slot]); translate([rodlength,0,0])rotate([0,0,270])cube([rodlength,rodbase,slot]); } } // the triangle shape module triangle(){ translate([0,0,0])rotate([0,0,0])edge(); translate([rodlength/2,-sin(60)*rodlength,0])rotate([0,0,120])edge(); translate([rodlength,0,0])rotate([0,0,240])edge(); hull(){ translate([0,0,0])rotate([0,0,0])translate([0,-rodbase,0])cube([rodlength,rodbase,slot]); translate([rodlength/2,-sin(60)*rodlength,0])rotate([0,0,120])translate([0,-rodbase,0])cube([rodlength,rodbase,slot]); translate([rodlength,0,0])rotate([0,0,240])translate([0,-rodbase,0])cube([rodlength,rodbase,slot]); } } // the locking edge design module edge(){ translate([0,-rodbase,0]){ difference(){ union(){ cube([rodlength,rodbase,slot]); translate([tabhook,rodbase,0])cube([rodlength/2-2*tabhook,slot,slot]); hull(){translate([tabhook/2,rodbase+slot,0])cube([rodlength/2-tabhook,0.01,slot]); translate([tabhook,rodbase+slot+tab,0])cube([rodlength/2-2*tabhook,0.01,slot]);} hull(){ translate([rodlength/2,rodbase,0])cube([rodlength/2,0.01,slot]); translate([rodlength/2+tabhook/2,rodbase+tab+slot,0])cube([rodlength/2-tabhook,0.01,slot]);} } translate([rodlength/2+snapratio*tabhook,rodbase,-0.01])cube([rodlength/2-2*snapratio*tabhook,slot,slot+0.02]); }} }