echo(version=version()); /////////////////// // // display parameters // circle_res = 50; p_top_bar = 0; // p for part p_base = 1; p_left = 2; p_right = 3; p_front = 4; p_back = 5; p_long_f = 6; p_long_b = 7; p_base_2 = 8; /////////////////// // // decide what parts to show // show = [0,0,0,0,0,1,0,0,0]; /////////////////// // // sizing parameters // mdf_thick = 5; castle_step = 8; kerf = 0.135/2; nominal_unit_length = 50; nominal_unit_depth = 100; nominal_front_height = 25; nominal_back_height = 25; unit_length = (2 * floor(nominal_unit_length/(2*castle_step)) + 1) * castle_step; unit_depth = (2 * floor(nominal_unit_depth/(2*castle_step)) + 1) * castle_step + 2*mdf_thick; unit_height = 200; top_bar_diameter = 8; top_bar_wall_thickness = 2; top_bar_elevation = 1.2*unit_height; top_bar_depth = 0.5*unit_depth; base_x = unit_length; base_y = unit_depth; left_x = unit_depth; left_y = unit_height; right_x = unit_depth; right_y = unit_height; front_x = unit_length; front_y = (2 * floor(nominal_front_height/(2*castle_step)) + 1) * castle_step; back_x = unit_length; back_y = (2 * floor(nominal_back_height/(2*castle_step)) + 1) * castle_step; long_x_f = front_x; long_y_f = front_y; long_x_b = front_x; long_y_b = front_y; base_2_x = unit_length; base_2_y = unit_depth; ///////////////////// // // part origins and rotations // o_top_bar = [0,top_bar_depth,top_bar_elevation]; r_top_bar = [0,90,0]; o_base = [0,0,0]; r_base = [0,0,0]; o_left = [0,0,0]; r_left = [-90,180,-90]; o_right = [unit_length-mdf_thick,0,0]; r_right = [-90,180,-90]; o_front = [0,mdf_thick,0]; r_front = [90,0,0]; o_back = [0,unit_depth,0]; r_back = [0,0,0]; //zeros for printing [90,0,0]; o_long_f = [0,mdf_thick,0]; //[0,mdf_thick,front_y-castle_step]; r_long_f = [90,0,0]; o_long_b = [0,unit_depth,0]; // [0,unit_depth,front_y-castle_step]; r_long_b = [90,0,0]; o_base_2 = [unit_length-mdf_thick,unit_depth,mdf_thick]; r_base_2 = [180,0,0]; o = [o_top_bar,o_base,o_left,o_right,o_front,o_back,o_long_f,o_long_b,o_base_2]; r = [r_top_bar,r_base,r_left,r_right,r_front,r_back,r_long_f,r_long_b,r_base_2]; ///////////////////// // // top bar // if(show[p_top_bar] > 0) { translate(o[p_top_bar]) rotate(r[p_top_bar]) color("gray") linear_extrude(height = unit_length) { difference () { circle(d = top_bar_diameter, $fn = circle_res); circle(d = top_bar_diameter - 2*top_bar_wall_thickness, $fn = circle_res); } } } // /////////////////// // // show parts // these lines call the various constructor modules // with a bit more effort, this section could be // reduced to a for loop - I'm not sure however // if the programming language can handle the // higher dimension arrays that would be required. if(show[p_base]) base(p_base,base_x,base_y,kerf,"yellow"); if(show[p_base_2]) base(p_base_2,base_x,base_y,kerf,"yellow"); if(show[p_left]) end_wall(p_left,left_x,left_y,kerf,"brown"); if(show[p_right]) end_wall(p_right,right_x,right_y,kerf,"brown"); if(show[p_front]) front(p_front,front_x,front_y,kerf,"orange"); if(show[p_back]) back(p_back,back_x,back_y,kerf,"orange"); if(show[p_long_f]) long(p_long_f,long_x_f,long_y_f,kerf,"orange"); if(show[p_long_b]) long(p_long_b,long_x_b,long_y_b,kerf,"orange"); // ///////////////// // // part constructor modules // module base (p,x,y,k,colour) { translate(o[p]) rotate(r[p]) color(colour) //linear_extrude(height = mdf_thick) { // front castellation steps_x = base_x/(2*castle_step); castellate_x(mdf_thick,castle_step,steps_x/2,-1,k); // back castellation translate([0,base_y-mdf_thick,0]) castellate_x(mdf_thick,castle_step,steps_x/2,-1,k); // left castellation steps_y = base_y/(2*castle_step); translate([0,mdf_thick,0]) castellate_y(mdf_thick,castle_step,steps_y/2,-1,k); // right castellation translate([base_x-mdf_thick,mdf_thick,0]) castellate_y(mdf_thick,castle_step,steps_y/2,-1,k); // core translate([mdf_thick,mdf_thick,0]) offset(r = k) square([base_x-2*mdf_thick,base_y-2*mdf_thick]); } } module end_wall (p,x,y,k,colour) { translate(o[p]) rotate(r[p]) color(colour) //linear_extrude(height = mdf_thick) difference () { union () { // bottom castellation steps = left_x/(2*castle_step); translate([mdf_thick,0,0]) castellate_x(mdf_thick,castle_step,steps-1,1,k); //front side castellation & filled in edge steps_f = 6; translate([0,0,0]) castellate_y(mdf_thick,castle_step,steps_f,-1,k); translate([0,castle_step*2*(steps_f+.5),0]) castellate_y(mdf_thick,castle_step,left_y/(2*castle_step)-(steps_f)-1,0,k); //back side castellation & filled in edge steps_b = 6; translate([left_x-mdf_thick,0,0]) castellate_y(mdf_thick,castle_step,steps_b,-1,k); translate([left_x-mdf_thick,castle_step*2*(steps_b+.5),0]) castellate_y(mdf_thick,castle_step,left_y/(2*castle_step)-(steps_b)-1,0,k); translate([mdf_thick,mdf_thick,0]) offset(r=k) square([left_x-2*mdf_thick,left_y-mdf_thick]); translate([0,left_y,0]) offset(r=k) polygon([[0,0],[left_x,0],[0.65*left_x,left_y/3],[0.5*left_x,left_y/3]]); } translate([top_bar_depth,top_bar_elevation,0]) offset(r=-k) circle(d=12,$fn=circle_res); } } module front (p,x,y,k,colour) { translate(o[p]) rotate(r[p]) color(colour) //linear_extrude(height = mdf_thick) { steps_x = front_x/(2*castle_step); castellate_x(mdf_thick,castle_step,steps_x,1,k); steps_y = front_y/(2*castle_step)-1; translate([0,0,0]) castellate_y(mdf_thick,castle_step,steps_y,1,k); translate([front_x-mdf_thick,0,0]) castellate_y(mdf_thick,castle_step,steps_y,1,k); translate([mdf_thick,mdf_thick,0]) offset(r=k) square([front_x-2*mdf_thick,front_y-castle_step-mdf_thick]); } } module back (p,x,y,k,colour) { translate(o[p]) rotate(r[p]) color(colour) //linear_extrude(height = mdf_thick) { steps = back_x/(2*castle_step); castellate_x(mdf_thick,castle_step,steps,1,k); steps_y = back_y/(2*castle_step)-1; translate([0,0,0]) castellate_y(mdf_thick,castle_step,steps_y,1,k); translate([back_x-mdf_thick,0,0]) castellate_y(mdf_thick,castle_step,steps_y,1,k); translate([mdf_thick,mdf_thick,0]) offset(r=k) square([back_x-2*mdf_thick,back_y-castle_step-mdf_thick]); } } module long (p,x,y,k,colour) { translate(o[p]) rotate(r[p]) color(colour) //linear_extrude(height = mdf_thick) difference () { union () { steps_x = long_x_f/(2*castle_step); castellate_x(mdf_thick,castle_step,steps_x,1,k); translate([long_x_f+2*castle_step-mdf_thick,0,0]) castellate_x(mdf_thick,castle_step,steps_x-1,1,k); steps_y = 2; translate([0,0,0]) castellate_y(mdf_thick,castle_step,steps_y,1,k); translate([2*long_x_f-2*mdf_thick,0,0]) castellate_y(mdf_thick,castle_step,steps_y,1,k); translate([mdf_thick,mdf_thick,0]) offset(r=k) square([2*long_x_f-3*mdf_thick,long_y_f-castle_step-mdf_thick]); } { steps_y = 2; translate([front_x-mdf_thick,0,0]) castellate_y(mdf_thick,castle_step,3,-1,k); } } } // ///////////////// // // castellation functions // module castellate_x(h,s,n,d,k) { if (d>0) { for (i = [0:1:n]) { translate([2*s*i,0,0]) offset(r=k) square([s,h]); } } if (d<0) { for (i = [0:1:n-1]) { translate([(2*i+1)*s,0,0]) offset(r=k) square([s,h]); } } if (d==0) { for (i = [0:1:n-1]) { translate([(2*i)*s,0,0]) offset(r=k) square([2*s,h]); } translate([(2*n-1)*s,0,0]) offset(r=k) square([s,h]); } } module castellate_y(h,s,n,d,k) { if (d>0) { for (i = [0:1:n]) { translate([0,2*s*i,0]) offset(r=k) square([h,s]); } } if (d<0) { for (i = [0:1:n-1]) { translate([0,(2*i+1)*s,0]) offset(r=k) square([h,s]); } } if (d==0) { for (i = [0:1:n-1]) { translate([0,(2*i)*s,0]) offset(r=k) square([h,2*s]); } translate([0,(2*n-1)*s,0]) offset(r=k) square([h,2*s]); } }