$fn=20; //How detailed should the sphere/cyl-s be. pillar_height = 10; //The height of the pillar in units. pillar_size=1; //The width and depth of the pillar. inset_size=0.5; //How much units should be removed of the inner side of the pillar? HINGE_SCALE=0.8; //The inner width of the hinge. screw_diameter=0.2; //The diameter in units of the screw hole. hinge_width_outer=0.2; //The outer width of the hinge, where screws will be placed. hinge_offset=0.4; //How far should the hinges be from the pillar hinge_color="red"; pillar_color="gray"; scaffolding_color="white"; module rounded_cube(size = [1, 1, 1], center = false, radius = 0.02) { //Radii should be lesser than half of the min(size[0],size[1],size[2])! // If single value, convert to [x, y, z] vector size = (size[0] == undef) ? [size, size, size] : size; translate = (center == false) ? [radius, radius, radius] : [ radius - (size[0] / 2), radius - (size[1] / 2), radius - (size[2] / 2) ]; translate(v = translate) minkowski() { cube(size = [ size[0] - (radius * 2), size[1] - (radius * 2), size[2] - (radius * 2) ]); sphere(r = radius); } } module cube_sat_pillar(rotation=0,size = [1, 1, 1], translation= [3,3,0]) { // If single value, convert to [x, y, z] vector size = (size[0] == undef) ? [size, size, size] : size; rotate(rotation){ translate(translation){ difference(){ color(pillar_color){ rounded_cube([pillar_size,pillar_size,pillar_height]); } translate([-inset_size,-inset_size,inset_size]){ cube([pillar_size,pillar_size,pillar_height-inset_size*2]); } } color(scaffolding_color){ translate([-pillar_size,inset_size,0]){ difference(){ rounded_cube([pillar_size,pillar_size-inset_size,pillar_size*HINGE_SCALE]); translate([inset_size,-inset_size/2,inset_size]){rotate([0,90,90]){translate([0,-screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } translate([0,screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } } } } }//END PIPE translate([-pillar_size,inset_size,pillar_height-pillar_size]){ difference(){ rounded_cube([pillar_size,pillar_size-inset_size,pillar_size*HINGE_SCALE]); translate([inset_size,-inset_size/2,inset_size]){rotate([0,90,90]){translate([0,-screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } translate([0,screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } } } } }//END PIPE translate([inset_size,-pillar_size,0]){ difference(){ rounded_cube([pillar_size-inset_size,pillar_size,pillar_size*HINGE_SCALE]); translate([inset_size*1.5,inset_size,inset_size]){rotate([0,90,180]){translate([0,-screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } translate([0,screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } } } } }//END PIPE translate([inset_size,-pillar_size,pillar_height-pillar_size]){ difference(){ rounded_cube([pillar_size-inset_size,pillar_size,pillar_size*HINGE_SCALE]); translate([-inset_size/2.0,inset_size,inset_size]){rotate([0,90,0]){ translate([0,-screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } translate([0,screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } } } } }//END PIPE } color(hinge_color){ translate([inset_size+hinge_width_outer+hinge_offset,-pillar_size,pillar_height-pillar_size]){ difference(){ rounded_cube([hinge_width_outer,pillar_size,pillar_size*HINGE_SCALE]); translate([-inset_size/2.0,inset_size,inset_size]){rotate([0,90,0]){ translate([0,-screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } translate([0,screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } } } } } //END HINGE BOLT 1 translate([inset_size+hinge_width_outer+hinge_offset,-translation[0]*2,pillar_height-pillar_size]){ difference(){ rounded_cube([hinge_width_outer,pillar_size,pillar_size*HINGE_SCALE]); translate([-inset_size/2.0,inset_size,inset_size]){rotate([0,90,0]){ translate([0,-screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } translate([0,screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } } } } } //END HINGE BOLT 2 translate([inset_size+hinge_width_outer/1.5+hinge_offset,-translation[0]*2+pillar_size,pillar_height-pillar_size]){ rounded_cube([hinge_width_outer,translation[0]*2-pillar_size*2,pillar_size*HINGE_SCALE]); } //END HINGE BODY translate([inset_size+hinge_width_outer+hinge_offset,-pillar_size,0]){ difference(){ rounded_cube([hinge_width_outer,pillar_size,pillar_size*HINGE_SCALE]); translate([-inset_size/2.0,inset_size,inset_size]){rotate([0,90,0]){ translate([0,-screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } translate([0,screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } } } } } //END HINGE BOLT 1 translate([inset_size+hinge_width_outer+hinge_offset,-translation[0]*2,0]){ difference(){ rounded_cube([hinge_width_outer,pillar_size,pillar_size*HINGE_SCALE]); translate([-inset_size/2.0,inset_size,inset_size]){rotate([0,90,0]){ translate([0,-screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } translate([0,screw_diameter*HINGE_SCALE,0]){ cylinder(d=screw_diameter); } } } } } //END HINGE BOLT 2 translate([inset_size+hinge_width_outer/1.5+hinge_offset,-translation[0]*2+pillar_size,0]){ rounded_cube([hinge_width_outer,translation[0]*2-pillar_size*2,pillar_size*HINGE_SCALE]); } //END HINGE BODY } } } } //EXAMPLE USAGE cube_sat_pillar(0); cube_sat_pillar(90); cube_sat_pillar(180); cube_sat_pillar(270);