// title: Hoop House @ McGee Home Garden v001 // author: Marty McGee // license: MIT // url: http://www.marty-mcgee.com/playground/openjuice/openjscad/#examples/juice/hoophouseS-v001.jscad // revision: 0.117 function main() { return build_garden(). scale(1/4);//. // 1 foot = 12 inches //rotateY(1.0). // slight slope on Y axis ( west-to-east incline ) //translate([0,0,0.5]); // below-to-above-ground ( 1/2 inch incline ) } function build_garden() { // each var returns array of CSG.cube objects var garden_base = get_base(); var garden_posts = get_posts(); // boxes var garden_blocks = get_blocks(); var garden_box_A = get_box_A(); var garden_box_B = get_box_B(); var garden_box_C = get_box_C(); var garden_box_D = get_box_D(); var garden_box_G = get_box_G(); // caps (support) var garden_caps_top = get_caps_top(); var garden_caps_bot = get_caps_bot(); // lattice fences //var garden_fences = get_fences(); // gate(s) and hinges var garden_gate_A = get_gate_A(); //var garden_gate_B = get_gate_B(); var garden_gate_hinges = get_gate_hinges(); //var garden_gussets = get_gussets(); var garden_hoops = get_hoops(); var garden_hoop_support = get_hoop_support(); var garden_render = union( garden_base, garden_posts, garden_blocks, garden_box_A, garden_box_B, garden_box_C, garden_box_D, garden_box_G, garden_caps_top, garden_caps_bot, // garden_fences, garden_gate_A, // garden_gate_B, garden_gate_hinges, // garden_gussets, garden_hoops, garden_hoop_support ); return garden_render; } // BEGIN CONSTRUCTION ... function get_base(){ var garden, garden_full, garden_base, garden_main; var garden_uom = "inches"; var garden_x = 192; // 16 feet var garden_y = 384; // 32 feet var garden_z = 72; // 6 feet var garden_base_x = garden_x; var garden_base_y = garden_y; var garden_base_z = garden_z - 60; // 6-5= 1 foot var garden_main_x = garden_x; var garden_main_y = garden_y; var garden_main_z = garden_z - 12; // 6-1= 5 feet garden_full = cube({size: [garden_x, garden_y, garden_z]}). translate([0,0,-12]). setColor([0.3,0.7,1.0,1.0]); garden_base = cube({size: [garden_base_x, garden_base_y, garden_base_z]}). translate([0,0,-12]). setColor([0.6,0.5,0.0,0.7]); garden_main = cube({size: [garden_main_x, garden_main_y, garden_main_z]}). translate([0,0,0]). setColor([0.3,0.7,1.0,1.0]); garden = /*union( garden_full,*/ garden_base/*, garden_main )*/; return garden_base; } function get_posts(){ var posts = []; var posts_count = 13; // posts (box G) for(var p = 0; p < posts_count; p++) { // common post size and depth posts.push( cube({size: [3.5, 3.5, 72]}). translate([0, 0, -12]). setColor([0.6,0.3,0.0,1.0]) ); } // box G // west side posts[0] = posts[0].translate([0, 0, 0 ]); // stem post posts[1] = posts[1].translate([0, 94.25, 0 ]); posts[2] = posts[2].translate([0, 190.25, 0 ]); posts[3] = posts[3].translate([0, 286.25, 0 ]); posts[4] = posts[4].translate([0, 380.5, 0 ]); // north side posts[5] = posts[5].translate([94.25, 380.5, 0 ]); // east side posts[6] = posts[6].translate([188.5, 380.5, 0 ]); posts[7] = posts[7].translate([188.5, 286.25, 0 ]); posts[8] = posts[8].translate([188.5, 190.25, 0 ]); posts[9] = posts[9].translate([188.5, 94.25, 0 ]); posts[10] = posts[10].translate([188.5, 0, 0 ]); // south side //posts[11] = posts[11].translate([94.25, 0, 0 ]); posts[11] = posts[11].translate([142.25, 0, 0 ]); posts[12] = posts[12].translate([46.25, 0, 0 ]); // gate post return posts; } function get_blocks(){ var blocks = []; var blocks_count = 25; // blocks (box ABCD) for(var b = 0; b < blocks_count; b++) { // common block size blocks.push( cube({size: [3.5, 3.5, 11]}). //.translate([0, 0, 0]); setColor([0.9,0.6,0.0,1.0]) ); } // box A blocks[0] = blocks[13].translate([49.5, 48, 0 ]); blocks[1] = blocks[14].translate([139, 48, 0 ]); blocks[2] = blocks[15].translate([49.5, 116.5, 0 ]); blocks[3] = blocks[16].translate([139, 116.5, 0 ]); // box B blocks[4] = blocks[17].translate([49.5, 156, 0 ]); blocks[5] = blocks[18].translate([139, 156, 0 ]); blocks[6] = blocks[19].translate([49.5, 224.5, 0 ]); blocks[7] = blocks[20].translate([139, 224.5, 0 ]); // box C blocks[8] = blocks[21].translate([49.5, 264, 0 ]); blocks[9] = blocks[22].translate([139, 264, 0 ]); blocks[10] = blocks[23].translate([49.5, 332.5, 0 ]); blocks[11] = blocks[24].translate([139, 332.5, 0 ]); // box D // west side blocks[12] = blocks[12].translate([0, 48, 0 ]); blocks[13] = blocks[13].translate([8.5, 48, 0 ]); blocks[14] = blocks[14].translate([8.5, 94.25, 0 ]); blocks[15] = blocks[15].translate([8.5, 190.25, 0 ]); blocks[16] = blocks[16].translate([8.5, 286.25, 0 ]); blocks[17] = blocks[17].translate([8.5, 367, 0 ]); // north side blocks[18] = blocks[18].translate([94.25, 372, 0 ]); // east side blocks[19] = blocks[19].translate([180, 367, 0 ]); blocks[20] = blocks[20].translate([180, 286.25, 0 ]); blocks[21] = blocks[21].translate([180, 190.25, 0 ]); blocks[22] = blocks[22].translate([180, 94.25, 0 ]); blocks[23] = blocks[23].translate([180, 48, 0 ]); blocks[24] = blocks[24].translate([188.5, 48, 0 ]); return blocks; } // boxes function get_box_A(){ var box_A = []; // box_A (x) box_A.push( cube({size: [1.5, 72, 5.5]}). translate([48, 48, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_A.push( cube({size: [1.5, 72, 5.5]}). translate([48, 48, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); box_A.push( cube({size: [1.5, 72, 5.5]}). translate([142.5, 48, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_A.push( cube({size: [1.5, 72, 5.5]}). translate([142.5, 48, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); // box_A (y) box_A.push( cube({size: [96, 1.5, 5.5]}). translate([48, 46.5, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_A.push( cube({size: [96, 1.5, 5.5]}). translate([48, 46.5, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); box_A.push( cube({size: [96, 1.5, 5.5]}). translate([48, 120, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_A.push( cube({size: [96, 1.5, 5.5]}). translate([48, 120, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); return box_A; } function get_box_B(){ var box_B = []; // box_B (x) box_B.push( cube({size: [1.5, 72, 5.5]}). translate([48, 156, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_B.push( cube({size: [1.5, 72, 5.5]}). translate([48, 156, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); box_B.push( cube({size: [1.5, 72, 5.5]}). translate([142.5, 156, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_B.push( cube({size: [1.5, 72, 5.5]}). translate([142.5, 156, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); // box_B (y) box_B.push( cube({size: [96, 1.5, 5.5]}). translate([48, 154.5, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_B.push( cube({size: [96, 1.5, 5.5]}). translate([48, 154.5, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); box_B.push( cube({size: [96, 1.5, 5.5]}). translate([48, 228, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_B.push( cube({size: [96, 1.5, 5.5]}). translate([48, 228, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); return box_B; } function get_box_C(){ var box_C = []; // box_C (x) box_C.push( cube({size: [1.5, 72, 5.5]}). translate([48, 264, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_C.push( cube({size: [1.5, 72, 5.5]}). translate([48, 264, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); box_C.push( cube({size: [1.5, 72, 5.5]}). translate([142.5, 264, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_C.push( cube({size: [1.5, 72, 5.5]}). translate([142.5, 264, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); // box_C (y) box_C.push( cube({size: [96, 1.5, 5.5]}). translate([48, 262.5, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_C.push( cube({size: [96, 1.5, 5.5]}). translate([48, 262.5, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); box_C.push( cube({size: [96, 1.5, 5.5]}). translate([48, 336, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_C.push( cube({size: [96, 1.5, 5.5]}). translate([48, 336, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); return box_C; } function get_box_D(){ var box_D = []; // box_D (x) // west side box_D.push( cube({size: [1.5, 144, 5.5]}). translate([12, 48, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [1.5, 144, 5.5]}). translate([12, 48, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [1.5, 180, 5.5]}). translate([12, 192, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [1.5, 180, 5.5]}). translate([12, 192, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); // east side box_D.push( cube({size: [1.5, 144, 5.5]}). translate([178.5, 48, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [1.5, 144, 5.5]}). translate([178.5, 48, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [1.5, 180, 5.5]}). translate([178.5, 192, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [1.5, 180, 5.5]}). translate([178.5, 192, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); // box_D (y) // south-west side box_D.push( cube({size: [13.5, 1.5, 5.5]}). translate([0, 46.5, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [13.5, 1.5, 5.5]}). translate([0, 46.5, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); // north side box_D.push( cube({size: [175, 1.5, 5.5]}). translate([8.5, 370.5, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [175, 1.5, 5.5]}). translate([8.5, 370.5, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); // south-east side box_D.push( cube({size: [13.5, 1.5, 5.5]}). translate([178.5, 46.5, 0]). setColor([0.7,0.4,0.0,1.0]) ); box_D.push( cube({size: [13.5, 1.5, 5.5]}). translate([178.5, 46.5, 5.75]). setColor([0.7,0.4,0.0,1.0]) ); return box_D; } function get_box_G(){ var box_G = []; // box G (x) // west side box_G.push( cube({size: [1.5, 192, 3.5]}). translate([-1.5, 0, -3.5]). setColor([0.8,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 5.5]}). translate([-1.5, 0, 0]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 5.5]}). translate([-1.5, 0, 5.75]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 3.5]}). translate([-1.5, 192, -3.5]). setColor([0.8,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 5.5]}). translate([-1.5, 192, 0]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 5.5]}). translate([-1.5, 192, 5.75]). setColor([0.9,0.4,0.0,1.0]) ); // east side box_G.push( cube({size: [1.5, 192, 3.5]}). translate([192, 0, -3.5]). setColor([0.8,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 5.5]}). translate([192, 0, 0]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 5.5]}). translate([192, 0, 5.75]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 3.5]}). translate([192, 192, -3.5]). setColor([0.8,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 5.5]}). translate([192, 192, 0]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [1.5, 192, 5.5]}). translate([192, 192, 5.75]). setColor([0.9,0.4,0.0,1.0]) ); // box G (y) // north side box_G.push( cube({size: [195, 1.5, 3.5]}). translate([-1.5, 384, -3.5]). setColor([0.7,0.3,0.0,1.0]) ); box_G.push( cube({size: [195, 1.5, 5.5]}). translate([-1.5, 384, 0]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [195, 1.5, 5.5]}). translate([-1.5, 384, 5.75]). setColor([0.9,0.4,0.0,1.0]) ); // south side box_G.push( cube({size: [195, 1.5, 3.5]}). translate([-1.5, -1.5, -3.5]). setColor([0.7,0.3,0.0,1.0]) ); // south side (wall) box_G.push( cube({size: [147.25, 1.5, 5.5]}). translate([46.25, -1.5, 0]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [147.25, 1.5, 5.5]}). translate([46.25, -1.5, 5.75]). setColor([0.9,0.4,0.0,1.0]) ); // south side (gate) box_G.push( cube({size: [41.75, 1.5, 5.5]}). translate([4.25, -1.5, 0]). setColor([1.0,0.4,0.0,0.8]) ); box_G.push( cube({size: [41.75, 1.5, 5.5]}). translate([4.25, -1.5, 5.75]). setColor([1.0,0.4,0.0,0.8]) ); // south side (gate end caps) box_G.push( cube({size: [5.5, 1.5, 5.5]}). translate([-1.5, -1.5, 0]). setColor([0.9,0.4,0.0,1.0]) ); box_G.push( cube({size: [5.5, 1.5, 5.5]}). translate([-1.5, -1.5, 5.75]). setColor([0.9,0.4,0.0,1.0]) ); return box_G; } function get_caps_top(){ var caps_top = []; // caps_top (x) caps_top.push( cube({size: [3.5, 192, 1.5]}). translate([0, 0, 60]). setColor([1.0,0.5,0.0,0.8]) ); caps_top.push( cube({size: [3.5, 192, 1.5]}). translate([0, 192, 60]). setColor([1.0,0.5,0.0,0.8]) ); caps_top.push( cube({size: [3.5, 192, 1.5]}). translate([188.5, 0, 60]). setColor([1.0,0.5,0.0,0.8]) ); caps_top.push( cube({size: [3.5, 192, 1.5]}). translate([188.5, 192, 60]). setColor([1.0,0.5,0.0,0.8]) ); // caps_top (y) caps_top.push( cube({size: [192, 3.5, 1.5]}). translate([0, 0, 60]). setColor([1.0,0.5,0.0,0.8]) ); caps_top.push( cube({size: [192, 3.5, 1.5]}). translate([0, 380.5, 60]). setColor([1.0,0.5,0.0,0.8]) ); return caps_top; } function get_caps_bot(){ var caps_bot = []; // caps_bot (x) caps_bot.push( cube({size: [1.5, 192, 3.5]}). translate([0, 0, 10]). setColor([1.0,0.5,0.0,0.8]) ); caps_bot.push( cube({size: [1.5, 192, 3.5]}). translate([0, 192, 10]). setColor([1.0,0.5,0.0,0.8]) ); caps_bot.push( cube({size: [1.5, 192, 3.5]}). translate([190.5, 0, 10]). setColor([1.0,0.5,0.0,0.8]) ); caps_bot.push( cube({size: [1.5, 192, 3.5]}). translate([190.5, 192, 10]). setColor([1.0,0.5,0.0,0.8]) ); // caps_bot (y) caps_bot.push( cube({size: [192, 1.5, 3.5]}). translate([0, 0, 10]). setColor([1.0,0.5,0.0,0.8]) ); caps_bot.push( cube({size: [192, 1.5, 3.5]}). translate([0, 382.5, 10]). setColor([1.0,0.5,0.0,0.8]) ); return caps_bot; } function get_fences(){ var fences = []; var fences_count = 12; // east side for(var i = 0; i < 1; i++){ // south-to-north angle -45 fences = fences.concat(get_fence(0.5,96,50.25, 0.5,1.5,48, 315, 4)); // south-to-north angle +45 fences = fences.concat(get_fence(0.5,96,50.25, 0.5,1.5,48, 46, 4)); } /* north side for(var j = 0; j < 4; j++){ }*/ return fences; } // fences[0] = get_fence(96,0.5,48, 0.5,1.5,48, -45, 4); function get_fence(perimeterX,perimeterY,perimeterZ,pieceX,pieceY,pieceZ,angle,space){ var fence = []; var pieces = []; var border = []; border.push( cube({ size: [perimeterX, perimeterY, perimeterZ] }). translate([-0.5, 0, 11.25]). // with 4 inch spacing between pieces setColor([1.0,0.5,0.1,0.8]) ); for(var i = 0; i < 49; i++){ pieces.push( // 2D (doesn't work, 2D+3D not interchangeable) CAG.roundedRectangle({center: [0,0], radius: [1.5, Math.sqrt(Math.pow(48,2) + Math.pow(48,2)) + 4], roundradius: 1, resolution: 4}) // 3D (works, but excessive render time) /*cube({ size: [0.5, 1.5, Math.sqrt(Math.pow(48,2) + Math.pow(48,2)) + 4] // pythagorem + 4 inch extra border cut spacing }). rotateX(angle). translate([-0.5, -48 + 4*i, 11.25])//. // with 4 inch spacing between pieces //setColor([1.0,0.5,0.0,0.8]) */ ); } //console.log(JSON.stringify(pieces)); //console.log(JSON.stringify(border)); fence = border[0].subtract(pieces); return fence; } function get_gate_A(){ var gate = []; return gate; } function get_gate_B(){ var gate = []; return gate; } function get_gate_hinges(){ var hinges = []; return hinges; } function get_gussets(){ var gussets = []; gussets.push( polyhedron({ // openscad-like (e.g. pyramid) points: [ [10,10,0],[10,-10,0],[-10,-10,0],[-10,10,0], // the four points at base [0,0,10] ], // the apex point triangles: [ [0,1,4],[1,2,4],[2,3,4],[3,0,4], // each triangle side [1,0,3],[2,1,3] ] // two triangles for square base }) .translate([10, -30, 0]) ); return gussets; } function get_hoops(){ var hoops = []; var hoops_half = []; var hoophouse = []; /* hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2, 0, 0.025]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); // hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2,0,-1.6]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2,0,-3.2]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2,0,-4.8]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2,0,-6.4]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2,0,-8.0]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2,0,-9.6]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2,0,-11.2]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); // hoops.push( torus({ ri:0.025, fni:40, fno:40 }) .translate([3.2,0,-12.835]) .rotateX(90) .scale(30) .setColor([1.0,1.0,1.0,0.8]) ); */ // hoop cross beams hoops.push( cylinder({r: 0.75, h: 385, center: [false, false, false]}) .translate([96, 119.25, -384.5]) .rotateX(90) .scale(1) .setColor([1.0,1.0,1.0,0.8]) ); // hide other half of toruses hoops_half.push( cube({size: [250, 450, 150], center: false}) .translate([-30,-30,-150]) ); hoophouse = difference( union(hoops), union(hoops_half) ); return hoophouse; //return hoops; } function get_hoop_support(){ var hoop_support = []; // south support posts hoop_support.push( cube({size: [3.5, 1.5, 119]}). translate([92.5, -1.5, 0]). setColor([0.7,0.3,0.0,1.0]) ); hoop_support.push( cube({size: [3.5, 1.5, 119]}). translate([97.5, -1.5, 0]). setColor([0.7,0.3,0.0,1.0]) ); // middle support posts hoop_support.push( cube({size: [3.5, 1.5, 119]}). translate([92.5, 191, 0]). setColor([0.7,0.3,0.0,1.0]) ); hoop_support.push( cube({size: [3.5, 1.5, 119]}). translate([97.5, 191, 0]). setColor([0.7,0.3,0.0,1.0]) ); // north support posts hoop_support.push( cube({size: [3.5, 1.5, 119]}). translate([92.5, 384.5, 0]). setColor([0.7,0.3,0.0,1.0]) ); hoop_support.push( cube({size: [3.5, 1.5, 119]}). translate([97.5, 384.5, 0]). setColor([0.7,0.3,0.0,1.0]) ); // ridge beams hoop_support.push( cube({size: [1.5, 193.5, 3.5]}). translate([96, -1.5, 115.5]). setColor([0.7,0.3,0.0,1.0]) ); hoop_support.push( cube({size: [1.5, 193.5, 3.5]}). translate([96, 192, 115.5]). setColor([0.7,0.3,0.0,1.0]) ); return hoop_support; } // end file