// short for "render hack" rhck=0.01; // print quality/robustness/material params wall_t=1; bottom_t=0.6; clr=0.3; $fn=60; // parameters regarding tablet size and amount diameter = 7.3; // diameter of compartment heigth = 3.4; // heigth of compartment amount = 8; // amount of compartments keyring=false; // adds a keyring splitting_aid=true; // splitting aid // instantiation translate([0,15,0])color([0.6,0.7,0.8]){ carrier(amount,diameter,heigth,with_splitter=splitting_aid); } translate([0,30,wall_t+clr])color([1,1,1,0.6]){ shroud(amount,diameter,heigth,with_gap=1,with_keyring=keyring); } // carrier: carries the actual contents module carrier(n=6,d_t=7,h_t=3.5,with_splitter=1){ // derived params r_t=d_t/2; carrier_h=h_t+bottom_t; rad_end=r_t+wall_t; difference(){ union(){ cylinder(carrier_h+wall_t+0.5,rad_end,rad_end); translate([(n-1)*(d_t+wall_t),0,0]){ cylinder(carrier_h,rad_end,rad_end); } cylinder(carrier_h+bottom_t,rad_end,rad_end); for(i=[1:n])translate([i*(d_t+wall_t),0,0]){ cylinder(carrier_h,rad_end,rad_end); } translate([0,-r_t,0]){ cube([(n)*(d_t+wall_t),d_t,carrier_h]); } } for(i=[0:n])translate([i*(d_t+wall_t),0,bottom_t]){ if(i==0){ // grip piece if(with_splitter){ translate([0,0,h_t])cylinder(h_t+wall_t+1+rhck,r_t+clr/2,r_t+wall_t); }else{ translate([0,0,h_t])cylinder(h_t+wall_t+1+rhck,r_t+clr/2,r_t+clr); } }else{ // compartments cylinder(h_t+wall_t+1+rhck,r_t+clr/2,r_t+clr/2); } } } // edge of pill splitter if(with_splitter){ translate([0,0,h_t])rotate([0,45,0]){ cube([3*d_t/8,d_t+wall_t,3*d_t/8],center=true); } } } // shroud: keeps the contents in the carrier module shroud(n=6,d_t=7,h_t=3.5,with_gap=1,with_keyring=0){ // derived params r_t=d_t/2; carrier_h=h_t+bottom_t; rad_end=r_t+wall_t; inner_r=rad_end+clr; outer_r=inner_r+wall_t; inner_h=carrier_h+clr; shroud_h=wall_t+wall_t+carrier_h+clr; translate([0,0,-wall_t-clr]){ difference(){ union(){ // positive of spring end cylinder(shroud_h,outer_r,outer_r); // rear end translate([((with_keyring)?(n+1.5):(n))*(d_t+wall_t),0,0]){ cylinder(shroud_h,outer_r,outer_r); } // middle part translate([0,-outer_r,0]){ cube([((with_keyring)?(n+1.5):(n))*(d_t+wall_t),outer_r*2,shroud_h]); } } // cylindrical cutout on spring end translate([0,0,-rhck]){ cylinder(shroud_h+2*rhck,inner_r,inner_r); } // rectanguar hollow translate([0,-inner_r,wall_t]){ cube([n*(d_t+wall_t),inner_r*2,inner_h]); } // half-cylinder hollow translate([n*(d_t+wall_t),0,wall_t]){ cylinder(inner_h,inner_r,inner_r); } //cutout on spring end translate([0,-inner_r,-rhck])cube([inner_r/2,inner_r*2,shroud_h+rhck*2]); translate([0,-inner_r/2,-rhck])cube([inner_r,inner_r,shroud_h+rhck*2]); for(i=[0,1])mirror([0,i,0]){ translate([inner_r/2,inner_r/2,-rhck]){ cylinder(shroud_h+rhck*2,inner_r/2,inner_r/2); } } translate([-outer_r,0,-rhck])rotate([0,0,45]){ translate([-inner_r,-inner_r,0]){ cube([2*inner_r,2*inner_r,shroud_h+2*rhck]); } } // optional keyring if(with_keyring)translate([(n+1.5)*(d_t+wall_t),0,-rhck]){ cylinder(shroud_h+rhck*2,r_t,r_t); } if(with_gap){ // cutout for printability translate([0,0,shroud_h-wall_t-rhck]){ translate([0,-inner_r+1.7,0]){ cube([n*(d_t+wall_t),2*inner_r-(2*1.7),wall_t+2*rhck]); } translate([n*(d_t+wall_t),0,0]){ cylinder(wall_t+2*rhck,inner_r-1.7,inner_r-1.7); } } } // cutaway to look inside (for modelling purposes) //translate([0,0,2])cube([100,100,100]); } // spring ends for(i=[48,-48])rotate([0,0,i+180])translate([inner_r+wall_t/2,0,0]){ cylinder(shroud_h,2*wall_t/3,2*wall_t/3); } } }