openscad-parts/Parametric_altoids_storage/Parametric_altoids_storage.scad

244 lines
5.2 KiB
OpenSCAD
Raw Permalink Normal View History

2014-01-17 19:54:01 +01:00
//------------------------------------------------------------
// Parametric altoids storage racks
//
// http://www.thingiverse.com/wardwouts
//
//
//------------------------------------------------------------
// What type of storage do you want?
style = "fullwide"; // [full,fullwide, singleleft, singleright, middle]
// Number of tins to store
tins = 5;
// in the sides for easier tin grabbing?
cutouts = "yes"; // [yes,no]
screw_holes = "yes"; // [yes,no]
closed_ends = "no"; // [yes,no]
// For stacking multiple racks you may not want a bottom shelf
with_bottom_shelf = "yes"; // [yes,no]
// Side depth (how deep is a shelf in mm)
depth = 40;
// Side width (how wide is a shelf in mm)
width = 20;
wall_thickness = 2;
bottom_thickness = 1;
// Amount of play a tin should have at its sides
width_play = 0.5;
// Amount of play a tin should have between shelves
height_play = 0.5;
//////////////////////////////////////////////////////////////////
// Some tin measurements; these shouldn't need editing
// Thickness of an altoids tin as measured
tin_thickness = 21.5;
// as measured
tin_width = 62;
// as measured
tin_length = 97.5;
//////////////////////////////////////////////////////////////////
// Code starts here
wtn = wall_thickness;
btn = bottom_thickness;
// the sace betwee 2 shelves
spacing = tin_thickness + height_play;
tin_tot_width = tin_width + width_play;
tin_tot_length = tin_length + width_play;
length=tins*spacing + tins*wtn;
module base() {
// Draw the base wall thickness offset from origin
translate([0,wtn,0]){
if ( screw_holes == "yes"){
difference(){
cube([length,width,btn]);
union() {
translate([wtn+spacing/2,width/2,0]){
screw_hole();
}
translate([length - spacing/2,width/2,0]){
screw_hole();
}
}
}
} else {
cube([length,width,btn]);
}
}
}
module side() {
if (cutouts == "yes") {
difference(){
cube([length,wtn,depth+btn]);
union(){
for (i = [0 : tins - 1]){
translate([wtn + (spacing/2) + (spacing+wtn)*i, -wtn, depth+btn]){
rotate([270,0,0]){
// if I aim for an exact cutout, some material remains,
// so cutout 3*wtn
cylinder(h=wtn*3,r=spacing/2);
}
}
}
}
}
} else {
cube([length,wtn,depth+btn]);
}
}
module shelf() {
// Draws a single shelf with one rounded corner
// To draw this it draws 2 rectangles and one cilinder like:
// +--+-
// | | \
// | |+-+
// +--++-+
// As the circle may get to big it cuts everything off at the surrouning rectangle
// Draw the base wall thickness and base thickness offset from origin
translate([0,wtn,btn]){
intersection() {
cube([wtn,width,depth]);
union() {
translate([0,width/2,depth-width/2]){
rotate([0,90,0]){
cylinder(h=wtn, r=width/2);
}
}
cube([wtn,width/2,depth]);
translate([0,width/2,0]){
cube([wtn,width/2,depth-width/2]);
}
}
}
}
}
module shelves() {
// Draw the same number of shelves as there are tins
// If with_bottom_shelf was chosen, draw one more
for (i = [0 : tins - 1]){
translate([(spacing+wtn)*i,0,0]){
shelf();
}
}
if (with_bottom_shelf == "yes"){
translate([length,0,0]){
shelf();
// the end tray needs a bit more side and base too
cube([wtn,wtn,btn+depth]);
cube([wtn,width+wtn,btn]);
}
}
}
module spacer() {
// If a full rack was chosen we need material to hold the two sides together
// this module draws that bit
if (style == "full" || style == "fullwide") {
if (style == "full") {
translate([0,width+wtn,0]){
if (with_bottom_shelf == "yes"){
cube([length + wtn, tin_tot_width/2 - width, btn]);
} else {
cube([length, tin_tot_width/2 - width, btn]);
}
}
} else {
translate([0,width+wtn,0]){
if (with_bottom_shelf == "yes"){
cube([length + wtn, tin_tot_length/2 - width, btn]);
} else {
cube([length, tin_tot_length/2 - width, btn]);
}
}
}
}
}
module ends() {
// It can be nice to have closed top and bottom shelves
// If closed_ends have been chosen, fill up the ends
if (closed_ends == "yes"){
if (style == "full") {
cube([wtn, tin_tot_width/2+wtn, depth+btn]);
} else if (style == "fullwide") {
cube([wtn, tin_tot_length/2+wtn, depth+btn]);
}
if (with_bottom_shelf == "yes"){
translate([length,0,0]){
if (style == "full") {
cube([wtn, tin_tot_width/2+wtn, depth+btn]);
} else if (style == "fullwide") {
cube([wtn, tin_tot_length/2+wtn, depth+btn]);
}
}
}
}
}
module screw_hole() {
// screw head that I measured maxes at 7mm
// screw thread is 3.5 mm
head = 7;
thread = 3.5 + 0.5;
translate([0,0,-20]){
cylinder(h=30, r=thread/2, $fn=20);
}
translate([0,0,btn-(thread/2)]){
cylinder(h=head-(thread/2), r1=thread/2, r2=head);
}
}
module rack() {
base();
side();
shelves();
spacer();
ends();
}
if (style == "singleright"){
mirror([0,1,0]){
rack();
}
} else {
rack();
}
if (style == "full") {
translate([0, tin_tot_width+2*wtn,0]){
mirror([0,1,0]){
rack();
}
}
} else if (style == "fullwide") {
translate([0, tin_tot_length+2*wtn,0]){
mirror([0,1,0]){
rack();
}
}
} else if (style == "middle") {
translate([0, wtn, 0]){
mirror([0,1,0]){
rack();
}
}
}