147 lines
4.8 KiB
OpenSCAD
147 lines
4.8 KiB
OpenSCAD
// 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);
|
|
}
|
|
}
|
|
}
|