depth = 5; width = 60; length = 500; joint_length = 10; kerf = 0.1; dist_joint3_start = 70; dist_joint3 = 140; stab = 3; // stability joints per element module lower(w, l, d, jl, k) { difference () { polygon([[0,l],[0,0],[w,w],[w,l]]); for ( i = [1:l/jl/2] ) { translate([0, l+k-i*2*jl]) square([d, jl-2*k]); } // side stability for ( n=[0:stab-1] ) { for ( i = [0:w/jl/2] ) { translate([d+(w-d-(w/jl-1)*jl+2*k)/2+i*jl*2, l+k-dist_joint3_start-dist_joint3*n]) square([jl-2*k, d]); } } for ( i = [0:w/jl/2] ) { translate([d+(w-d-(w/jl-1)*jl+2*k)/2+i*jl*2, 100]) square([jl-2*k, d]); } translate([w-10, 320]) square([10, 30]); } } module lower_2(w, l, d, jl, k) { difference () { polygon([[0,0],[l,0],[l,w],[w,w]]); for ( i = [1:l/jl/2] ) { translate([l+k-i*2*jl, 0]) square([jl-2*k, d]); } // side stability for ( n=[0:stab-1] ) { for ( i = [0:w/jl/2] ) { translate([l+k-dist_joint3_start-dist_joint3*n, d+(w-d-(w/jl-1)*jl+2*k)/2+i*jl*2]) square([d, jl-2*k]); } } for ( i = [0:w/jl/2] ) { translate([100, d+(w-d-(w/jl-1)*jl+2*k)/2+i*jl*2]) square([d, jl-2*k]); } translate([320, w-10]) square([30, 10]); } } module upright(w, l, d, jl, k) { difference () { polygon([[-l,0],[0,0],[0,2*w],[-w,2*w],[-w,w],[-l,w]]); // remove the small border at the top translate([-d, w+k*2-jl]) square([d, jl-2*k]); // joints on the right side (low) for ( i = [1:ceil(2*w/jl/2)] ) { translate([-d, 2*w+k+jl-i*2*jl]) square([d, jl-2*k]); } // joints on the upper side (sideways) translate([-jl+2*k-d, 2*w-d]) square([jl-2*k, d]); for ( i = [1:ceil(w/jl/2)] ) { translate([jl+k-i*2*jl-d, 2*w-d]) square([jl-2*k, d]); } // joints on the lower side (upright) translate([-l, 0]) square([jl-2*k, d]); for ( i = [1:l/jl/2] ) { translate([+k-i*2*jl, 0]) square([jl-2*k, d]); } // side stability for ( n=[0:stab] ) { for ( i = [0:w/jl/2] ) { translate([-((l-d)/(stab+1))*(n+1), d+(w-d-(w/jl-1)*jl+2*k)/2+i*jl*2]) square([d, jl-2*k]); } } for ( i = [0:w/jl/2] ) { translate([-jl+2*k-d-(w-d-(w/jl-1)*jl+2*k)/2-i*jl*2, 100]) square([jl-2*k, d]); } translate([-320-30, w-10]) square([30, 10]); } } module upright_2(w, l, d, jl, k) { difference () { polygon([[0,-l],[0,0],[2*w,0],[2*w,-w],[w,-w],[w,-l]]); // remove the small border at the top translate([w+k*2-jl, -d]) square([jl-2*k, d]); // joints on the upper side (low) for ( i = [1:ceil(2*w/jl/2)] ) { translate([2*w+k+jl-i*2*jl, -d]) square([jl-2*k, d]); } // joints on the right side (sideways) translate([2*w-d, -jl+2*k-d]) square([d, jl-2*k]); for ( i = [1:ceil(w/jl/2)] ) { translate([2*w-d, jl+k-i*2*jl-d]) square([d, jl-2*k]); } // joints on the left side (upright) translate([0, -jl+2*k]) square([d, jl-2*k]); for ( i = [1:l/jl/2] ) { translate([0, jl+k-i*2*jl]) square([d, jl-2*k]); } // side stability for ( n=[0:stab] ) { for ( i = [0:w/jl/2] ) { translate([d+(w-d-(w/jl-1)*jl+2*k)/2+i*jl*2, -((l-d)/(stab+1))*(n+1)]) square([jl-2*k, d]); } } for ( i = [0:w/jl/2] ) { translate([100, -jl+2*k-d-(w-d-(w/jl-1)*jl+2*k)/2-i*jl*2]) square([d, jl-2*k]); } translate([w-10, -320-30]) square([10, 30]); } } module sideways(w, l, d, jl, k) { difference () { polygon([[0,l],[0,2*w-d],[-w,2*w-d],[-w,l]]); // remove the small border at the top translate([-d, l+k*2-jl]) square([d, jl-2*k]); // joints on the right (low) for ( i = [1:(l-w)/jl/2+1] ) { translate([-d, l+k+jl-i*2*jl]) square([d, jl-2*k]); } // joints on the lower side (upright) for ( i = [1:w/jl/2] ) { translate([k-i*2*jl-d, 2*w-d]) square([jl-2*k, d]); } // remove the small border at the end translate([-k-ceil(w/jl)*jl-d, w-d]) square([jl-2*k, d]); // side stability for ( n=[0:stab-1] ) { for ( i = [0:w/jl/2] ) { translate([-jl+2*k-d-(w-d-(w/jl-1)*jl+2*k)/2-i*jl*2, l+k-dist_joint3_start-dist_joint3*n]) square([jl-2*k, d]); } } translate([-w, 320]) square([10, 30]); } } module sideways_2(w, l, d, jl, k) { difference () { polygon([[l,0],[2*w-d,0],[2*w-d,-w],[l,-w]]); // remove the small border at the top translate([l+k*2-jl, -d]) square([jl-2*k, d]); // joints on the right (low) for ( i = [1:(l-w)/jl/2+1] ) { translate([l+k+jl-i*2*jl, -d]) square([jl-2*k, d]); } // joints on the lower side (upright) for ( i = [1:w/jl/2] ) { translate([2*w-d, k-i*2*jl-d]) square([d, jl-2*k]); } // remove the small border at the end translate([w-d, -k-ceil(w/jl)*jl-d]) square([d, jl-2*k]); // side stability for ( n=[0:stab-1] ) { for ( i = [0:w/jl/2] ) { translate([l+k-dist_joint3_start-dist_joint3*n, -jl+2*k-d-(w-d-(w/jl-1)*jl+2*k)/2-i*jl*2]) square([d, jl-2*k]); } } translate([320, -w]) square([30, 10]); } } module stability_joint(w, l, d, jl, k) { for ( n=[0:(stab+1)-1] ) { translate([0,n*(w+d),0]) difference () { polygon([[0,l],[w,l],[w,l+w],[0,l+w]]); // side stability for ( i = [0:w/jl/2] ) { translate([d+(w-d-(w/jl-1)*jl+2*k)/2-jl+i*jl*2, l]) square([jl-2*k, d]); } // side stability for ( i = [0:w/jl/2] ) { translate([0, l+d+(w-d-(w/jl-1)*jl+2*k)/2-jl+i*jl*2]) square([d, jl-2*k]); } } } } module stability_joint_2(w, l, d, jl, k) { //triangle for ( n=[0:(stab)-1] ) { translate([0,n*(w+d),0]) difference () { polygon([[0,l],[w,l],[w,l+d],[d,l+w],[0,l+w]]); // side stability for ( i = [0:w/jl/2] ) { translate([d+(w-d-(w/jl-1)*jl+2*k)/2-jl+i*jl*2, l]) square([jl-2*k, d]); } // side stability for ( i = [0:w/jl/2] ) { translate([0, l+d+(w-d-(w/jl-1)*jl+2*k)/2-jl+i*jl*2]) square([d, jl-2*k]); } } } } module stability_joint_3(w, l, d, jl, k) { //smaller th = 4; for ( n=[0:(stab)-1] ) { translate([0,n*(w+d),0]) difference () { polygon([[0,l],[w,l],[w,l+th*d],[th*d,l+th*d],[th*d,l+w],[0,l+w]]); // side stability for ( i = [0:w/jl/2] ) { translate([d+(w-d-(w/jl-1)*jl+2*k)/2-jl+i*jl*2, l]) square([jl-2*k, d]); } // side stability for ( i = [0:w/jl/2] ) { translate([0, l+d+(w-d-(w/jl-1)*jl+2*k)/2-jl+i*jl*2]) square([d, jl-2*k]); } } } } module butterfly_joint(w, l, d, jl, k) { h = 40; b = 30; polygon([[0,0],[0, h],[b/2, h*2/3],[b, h],[b, 0],[b/2, h/3]]); } dist = 1; translate([dist, dist*2 ,0]) lower(width, length, depth, joint_length, kerf); translate([dist*2, dist ,0]) lower_2(width, length, depth, joint_length, kerf); translate([-dist, dist,0]) upright(width, length, depth, joint_length, kerf); translate([dist-0*depth, -dist ,0]) upright_2(width, length, depth, joint_length, kerf); translate([-dist, dist*3+depth ,0]) sideways(width, length, depth, joint_length, kerf); translate([dist*3+depth, -dist ,0]) sideways_2(width, length, depth, joint_length, kerf); translate([dist,dist*3,0]) stability_joint(width, length, depth, joint_length, kerf); translate([dist*2+width,dist*3,0]) stability_joint_2(width, length, depth, joint_length, kerf); translate([dist*3+width*2,dist*3,0]) stability_joint_3(width, length, depth, joint_length, kerf); translate([-100,-100,0]) butterfly_joint(width, length, depth, joint_length, kerf);