//Echelle de dessin appliqué à toutes les longueurs mais pas à l'épaisseur du bois scale = 0.1; //Longueur des cotés gauche et droit de la base base_side_length=1500*scale; // Hauteur des cotés gauche et droit de la base base_side_height=300*scale; // marge à appliquer sur les planches gauche et droite de la base side_margin=70*scale; // Hauteur des cotés avant et arrière de la base et de toutes les planches des niveaux supérieurs //base_front_height=200*scale; // On choisi de rendre la hauteur dépendante de la hauteur des cotés gauche et droit de la base base_front_height=0.7*base_side_height; // Longueur des cotés avant et arrière de la base mais aussi du niveau 1 base_front_length=1200*scale; // Marge à appliquer sur les cotés avant et arrière front_margin=side_margin; // Ecart minimum entre deux fentes sur les planches. Calculé pour avoir une répartition homogène des fentes sur la planche. Au final l'écart peut être différent entre les planches gauches/droites et les planches avant/arrière ecart_slit_min=130*scale; // Fente dans laquelle le niveau 1 arrière s'insère sur la base level1_pos_rear=3; // Fente dans laquelle le niveau 1 avant s'insère sur la base level1_pos_front=8; // Fente dans laquelle le niveau 2 gauche s'insère sur le niveau 1 level2_pos_left=3; // Fente dans laquelle le niveau 2 droit s'insère sur le niveau 1 level2_pos_right=6; // Fente dans laquelle le niveau 3 arrière s'insère sur le niveau 2 level3_pos_rear=2; // Fente dans laquelle le niveau 3 avant s'insère sur le niveau 2 level3_pos_front=5; // Epaisseur du bois wood_thick=3; // Largeur d'une fente (10% de l'épaisseur du bois) slit_width=wood_thick*1.10; //10 pourcent de marge pour l'emboitement // Hauteur d'une fente (dépend des hauteurs des cotés avant/arrière et gauche/droit slit_height=(base_side_height - base_front_height)/2; //draw_2D(); draw_3D(); module draw_2D() { separ_pieces = 20*scale; blocker_shift_Y = slit_height*2 + separ_pieces; blocker_shift_X = slit_width*3 + separ_pieces; // Niveau 1 avant / arrière nb_slits_base = getSlits(base_side_length, side_margin); nb_slits_front = getSlits(base_front_length, front_margin); shift_side = getShiftSlit(base_side_length, side_margin, nb_slits_base)+slit_width; shift_front = getShiftSlit(base_front_length, front_margin, nb_slits_front)+slit_width; // Niveau 2 gauche et droite level2_length = side_margin*2 + shift_side*(level1_pos_front-level1_pos_rear)+slit_width; // Level 3 avant / arrière level3_length = front_margin*2 + shift_front*(level2_pos_right-level2_pos_left)+slit_width; base_side_shift_X = base_side_length + separ_pieces; base_side_shift_Y = base_side_height + separ_pieces; base_front_shift_X = base_front_length + separ_pieces; base_front_shift_Y = base_front_height + separ_pieces; translate([0, 0]) { // Base mur avant et arrière translate([0,0]) rotate([0,0,0]) base_front_rear(); translate([0,base_front_shift_Y]) rotate([0,0,0]) base_front_rear(); // Niveau 1 translate([0,base_front_shift_Y*2]) { translate([0,0]) rotate([0,0,0]) level1_front_rear(); translate([0,base_front_shift_Y]) rotate([0,0,0]) level1_front_rear(); } // Base murs gauche et droite translate([0, base_front_shift_Y*4]) { translate([0,0]) rotate([0,0,0]) base_left_right(); translate([0,base_side_shift_Y]) rotate([0,0,0]) base_left_right(); // Blockers translate([base_side_shift_X,0]) { translate([0,0]) rotate([0,0,0]) do_blocker(); translate([0,blocker_shift_Y*1]) rotate([0,0,0]) do_blocker(); translate([0,blocker_shift_Y*2]) rotate([0,0,0]) do_blocker(); translate([0,blocker_shift_Y*3]) rotate([0,0,0]) do_blocker(); } } } // Niveaux 2 et 3 translate([base_front_shift_X,0]) { translate([0, 0]) { translate([0,0]) rotate([0,0,0]) level2_3(level2_length, side_margin); translate([0,base_front_shift_Y]) rotate([0,0,0]) level2_3(level2_length, side_margin); translate([0, base_front_shift_Y*2]) { translate([0,0]) rotate([0,0,0]) level2_3(level3_length, front_margin); translate([0,base_front_shift_Y]) rotate([0,0]) level2_3(level3_length, front_margin); } } } } // Dessin en 3D module draw_3D() { translate([side_margin-slit_width,-wood_thick,base_front_height-2*slit_height]) rotate([90,0,0]) linear_extrude(wood_thick) do_blocker(); translate([base_side_length-side_margin*2+slit_width*2,-wood_thick,base_front_height-2*slit_height]) rotate([90,0,0]) linear_extrude(wood_thick) do_blocker(); translate([side_margin-slit_width,base_front_length-2*side_margin,base_front_height-2*slit_height]) rotate([90,0,0]) linear_extrude(wood_thick) do_blocker(); translate([base_side_length-side_margin*2+slit_width*2,base_front_length-2*side_margin,base_front_height-2*slit_height]) rotate([90,0,0]) linear_extrude(wood_thick) do_blocker(); // Base murs gauche et droite translate([0,0,0]) rotate([90,0,0]) linear_extrude(wood_thick) base_left_right(); translate([0,base_front_length-2*front_margin-wood_thick,0]) rotate([90,0,0]) linear_extrude(wood_thick) base_left_right(); // Base mur avant et arrière translate([side_margin,-front_margin-wood_thick,0]) rotate([90,0,90]) linear_extrude(wood_thick) base_front_rear(); translate([base_side_length - side_margin - slit_width,-front_margin-wood_thick,0]) rotate([90,0,90]) linear_extrude(wood_thick) base_front_rear(); // Niveau 1 avant / arrière nb_slits_base = getSlits(base_side_length, side_margin); nb_slits_front = getSlits(base_front_length, front_margin); shift_side = getShiftSlit(base_side_length, side_margin, nb_slits_base)+slit_width; shift_front = getShiftSlit(base_front_length, front_margin, nb_slits_front)+slit_width; translate([front_margin+shift_side*(level1_pos_rear-1),0,base_front_height]) { translate([0,-front_margin-wood_thick,0]) rotate([90,0,90]) linear_extrude(wood_thick) level1_front_rear(); translate([shift_side*(level1_pos_front-level1_pos_rear),-front_margin-wood_thick,0]) rotate([90,0,90]) linear_extrude(wood_thick) level1_front_rear(); // Niveau 2 gauche et droite level2_length = side_margin*2 + shift_side*(level1_pos_front-level1_pos_rear)+slit_width; //Translation globale de tous les niveaux à partir du 2 pour pouvoir travailler comme si on était à l'origine translate([-side_margin, shift_front*(level2_pos_left-1)-front_margin, (base_front_height-2*slit_height)]) { translate([0,front_margin,0]) rotate([90,0,0]) linear_extrude(wood_thick) level2_3(level2_length, side_margin); translate([0,shift_front*(level2_pos_right-level2_pos_left)+front_margin,0]) rotate([90,0,0]) linear_extrude(wood_thick) level2_3(level2_length, side_margin); // Level 3 avant / arrière level3_length = front_margin*2 + shift_front*(level2_pos_right-level2_pos_left)+slit_width; translate([shift_side*(level2_pos_left-1)-side_margin, -wood_thick, base_front_height-2*slit_height]) { translate([0,0,0]) // shift_front*(level3_pos_rear-1) rotate([90,0,90]) linear_extrude(wood_thick) level2_3(level3_length, front_margin); translate([shift_side*(level2_pos_right-level2_pos_left),0,0]) rotate([90,0,90]) linear_extrude(wood_thick) level2_3(level3_length, front_margin); } } } } module base_left_right() { difference() { square([base_side_length,base_side_height]); translate([0,base_side_height-slit_height,0]) do_slits(base_side_length,side_margin, slit_width); translate([side_margin, 0, 0]) do_slit(slit_width, base_front_height-slit_height); translate([base_side_length-side_margin-slit_width, 0, 0]) do_slit(slit_width, base_front_height-slit_height); } } module base_front_rear() { difference() { square([base_front_length,base_front_height]); translate([0,base_front_height-slit_height,0]) do_slits(base_front_length,front_margin, slit_width); translate([side_margin-slit_width, base_front_height-slit_height, 0]) do_slit(); translate([base_front_length-side_margin, base_front_height-slit_height, 0]) do_slit(); } } module level1_front_rear() { difference() { square([base_front_length,base_front_height]); translate([0,base_front_height-slit_height,0]) do_slits(base_front_length,front_margin, slit_width); translate([front_margin-slit_width, 0, 0]) do_slit(); translate([base_front_length-front_margin, 0, 0]) do_slit(); translate([base_front_length-front_margin-slit_width, 0, 0]) do_slit(); translate([front_margin, 0, 0]) do_slit(); } } module level2_3(length, margin) { difference() { square([length,base_front_height]); translate([0,base_front_height-slit_height,0]) do_slits(length, margin, slit_width); *translate([margin-slit_width, 0, 0]) do_slit(); *translate([length-margin, 0, 0]) do_slit(); translate([length-margin-slit_width, 0, 0]) do_slit(); translate([margin, 0, 0]) do_slit(); } } module do_slit(width=slit_width, height=slit_height) { square([width, height]); } module do_slits(length, margin, slit_width) { //slit_zone = length-2*margin; //slits = ((slit_zone)/1000)*slit_by_meter; //slits = floor(slit_zone / ecart_slit_min); //shift_slit = (slit_zone - slits*slit_width)/(slits - 1); slits = getSlits(length, margin); shift_slit = getShiftSlit(length, margin, slits ); echo("Slits=", floor(slits), " shift_slit=", shift_slit); for(i=[0:slits-1]) { translate([i*(shift_slit+slit_width)+margin, 0, 0]) do_slit(); } } module do_blocker() { difference() { square([slit_width*3, slit_height*2]); translate([slit_width,0]) do_slit(); } } function getShiftSlit(length, margin, nb_slits) = (getSlitZone(length, margin) - nb_slits*slit_width)/(nb_slits - 1); function getSlits(length, margin) = ceil(getSlitZone(length, margin) / ecart_slit_min); function getSlitZone( length, margin ) = length-2*margin;