module mold( size, /* mold inner size */ s=1, /* shell thickness */ h_protrude=-1, /* how far to protrude outside horizontally, default is size[2] */ v_protrude=10, /* and vertically */ l_intrude=0, /* how far to intrude on the left */ r_intrude=0, /* how far to intrude on the right */ f_intrude=0, /* how far to intrude on the front */ introffset, /* offset from the front of the left and right intrusions */ chamfer=1 ) { difference() { cube(size=[size[0]+2*s,size[1]+2*s,size[2]+s]); translate([s,s,s]) { hull() { translate([chamfer,0,chamfer]) cube(size=[size[0]-2*chamfer,size[1],size[2]-2*chamfer]); translate([0,chamfer,chamfer]) cube(size=[size[0],size[1]-2*chamfer,size[2]-2*chamfer]); translate([chamfer,chamfer,0]) cube(size=[size[0]-2*chamfer,size[1]-2*chamfer,size[2]+1]); } } } gw = 3*s; // guide width, in case I'll want to change it. h_protrude_ = h_protrude<0 ? size[2] : h_protrude; module trusion(in,gw=gw,h_protrude=h_protrude_) { translate([-gw/2,0,s+size[2]]) union() { hull() { translate([0,0,in]) cube(size=[gw,in+s,v_protrude-in]); cube(size=[gw,s,in]); } hull() { translate([0,0,-h_protrude]) cube(size=[gw,s,v_protrude+h_protrude]); translate([0,-h_protrude,0]) cube(size=[gw,s+h_protrude,v_protrude]); } } } /* frontal guide */ translate([s+size[0]/2,0,]) trusion(in=f_intrude); /* left guide */ translate([0,s+introffset,0]) rotate([0,0,-90]) trusion(in=l_intrude); /* right guide */ translate([size[0]+2*s,s+introffset,0]) rotate([0,0,90]) trusion(in=r_intrude); } /* vim:set ai sw=1: */