You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

327 lines
9.7 KiB
OpenSCAD

// Tux-Spardose
// Forked from runeman.org/3d/tux
// Modified by Kreativmonkey 04.2018
//
// Licence: GPLv3
/////////////////////////////////////////////////////////////////////////
////////////////// VARIABLES ////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
///// Render
// lock
// tux
// moneybox minimum height 200mm
// dev
renderer = "moneybox";
// Dimention in mm
// For moneybox the minimal height is:
// euro = 150mm
// dollar = 170mm
// sterling = 190mm
height=150;
wall=5;
// currency for the coinhole
// Options:
// - euro
// - dollar
// - pfund (without Ten Pounds)
currency="euro";
// Numb of Fragments
// Set $fn to ~100 for rendering the print objekt
$fn=50;
//////////////////////////////////////////////////////////////////////////
////////////////// RENDERS ///////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
if (renderer == "lock") {
translate([0,0, height*0.06]) rotate([180,0,0]) lock(height);
}
if (renderer == "tux") {
difference(){
tux(height);
}
}
if ( renderer == "moneybox") {
difference(){
tux(height, true);
cutLock(height);
coinhole(height, currency);
}
}
if (renderer == "dev"){
difference(){
tux(height, true);
cutLock(height);
coinhole(height, currency);
translate([-height/2, 0, 0]) cube(height);
}
}
////////////////////////////////////////////////////////////////////////
/////////////////// MODULES ////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////
module lock(size){
translate([0,0,size*0.05]) cube([size*0.4, size*0.05, size*0.02], center=true);
difference(){
union(){
// body
translate([0, 0, size*0.01]) cylinder(r=size*0.18, h=size*0.05);
// bottom
cylinder(r1=size*0.21, r2=size*0.18 , h=size*0.015);
}
cylinder(r1=size*0.16, r2=size*0.14 , h=size*0.02);
}
translate([0,0,size*0.022/2]) cube([size*0.322, size*0.032, size*0.022], center=true);
}
module coinhole(size, currency = "euro") {
// Dimension Dollar "Half Dollar": r=30.61mm h=2.15mm
// Dimension Euro "2 Euro": r=25.75mm h=2.2mm
// Dimension Sterling "Ten pounds": r=65mm h=2.5mm
if( currency == "euro" ) {
if(size < 170) echo("The minimal height is 150mm");
translate([0,size*0.05,size*0.95]) rotate([0,0,90]) cube([3, 30, size*0.3], center=true);
translate([0, 0, size*0.60]) cylinder(d=35, h=size*0.18);
}
if( currency == "dollar" ) {
if(size < 170) echo("The minimal height is 170mm");
translate([0,size*0.05,size*0.95]) rotate([0,0,90]) cube([3, 35, size*0.3], center=true);
translate([0, 0, size*0.60]) cylinder(d=40, h=size*0.18);
}
if( currency == "sterling" ) {
if(size < 190) echo("The minimal height is 190mm");
translate([0,size*0.05,size*0.95]) rotate([0,0,90]) cube([4, 43, size*0.3], center=true);
translate([0, 0, size*0.60]) cylinder(d=45, h=size*0.18);
}
}
module cutLock(size){
translate([0,0,size*0.04]) cylinder(r=size*0.21, h=size*0.022);
// Verschluss mit aussparungen.
lock(size*1.01);
translate([0, 0, size*0.02]) cube([size*0.06, size*0.41, size*0.07], center=true);
translate([0, 0, size*0.04]) cube([size*0.41, size*0.06, size*0.006], center=true);
cylinder(r=size*0.18, h=size*0.025);
}
module tux(size, inside = false){
difference(){
union(){
arm(size, "right");
arm(size, "left");
foot(size, "right");
foot(size, "left");
}
if( inside == true ){
body(size, wall);
arm(size, "right", wall);
arm(size, "left", wall);
foot(size, "right", wall);
foot(size, "left", wall);
}
}
difference(){
union(){
body(size);
head(size);
}
if( inside == true ){
body(size, wall+5);
head(size, wall+5);
}
translate([0,0,-size*0.7]) cube([size*1.4,size*1.4,size*1.4], center=true);
}
// Botton
resize(newsize=[size*0.59,size*0.515,0])
cylinder(r2=size*0.14, r1=size*0.13, h=size*0.06);
}
module head(size, wthikness = 0){
if( wthikness == 0){
difference(){
union(){
// HEAD
translate([0,1,size*0.82])
rotate([30,0,0])
resize(newsize=[size*0.36-wthikness,size*0.34-wthikness,size*0.34-wthikness])
sphere(size*0.16-wthikness);
}
// Eyeholes
translate([-size*0.07,-size*0.19+wthikness,size*0.85]) rotate([80,-5,-10]) resize(newsize=[size*0.1, size*0.15, size*0.12]) cylinder(r=size*0.12, h=size*0.01, center=true);
translate([size*0.07,-size*0.19+wthikness,size*0.85]) rotate([80,5,10]) resize(newsize=[size*0.1, size*0.15, size*0.12]) cylinder(r=size*0.12, h=size*0.01, center=true);
translate([0,-size*0.155+wthikness,size*0.85]) rotate([-10,0,0]) resize(newsize=[size*0.15, size*0.02,size*0.15])sphere(size*0.02);
}
} else {
difference(){
union(){
// HEAD
translate([0,1,size*0.82])
rotate([30,0,0])
resize(newsize=[size*0.36-wthikness,size*0.34-wthikness,size*0.34-wthikness])
sphere(size*0.16-wthikness);
}
translate([0,-size*0.135,size*0.85]) rotate([-10,0,0]) cube([size*0.25, size*0.05, size*0.25], center=true);
}
}
// Pupills
translate([size*0.05,-size*0.13,size*0.83])
rotate([0,7,0])
resize(newsize=[size*0.075-wthikness, size*0.044-wthikness, size*0.1-wthikness])
sphere(3);
translate([-size*0.05,-size*0.13,size*0.83])
rotate([0,-7,0])
resize(newsize=[size*0.075-wthikness, size*0.044-wthikness, size*0.1-wthikness])
sphere(3);
// beak
if(wthikness ==0){
hull(){
// tip
translate([0,-size*0.22,size*0.74])
resize(newsize=[size*0.11-wthikness,size*0.15-wthikness,size*0.044-wthikness])
sphere(2);
//chin
translate([0,-size*0.05,size*0.73])
resize(newsize=[size*0.25-wthikness,size*0.03-wthikness,size*0.22-wthikness])
sphere(2);
//nose
translate([0,-10,size*0.77])
rotate([5,0,0])
resize(newsize=[size*0.01-wthikness,size*0.22-wthikness,size*0.044-wthikness])
sphere(2);
}
}
}
// BODY
module body(size, wthikness = 0){
// body
difference(){
hull(){
translate([0,0,15])
resize(newsize=[size*0.60-wthikness,size*0.52-wthikness,size*0.60-wthikness])
sphere((size*0.60+wthikness)/2, center=true);
//neck
translate([0,1.5,size*0.60])
sphere(size*0.17-wthikness/2);
//back top
translate([0,size*0.11,size*0.52])
rotate([20,0,0])
resize(newsize=[size*0.34-wthikness,size*0.22-wthikness,size*0.40-wthikness])
sphere(2);
//back bottom
translate([0,size*0.22,size*0.30])
rotate([10,0,0])
resize(newsize=[size*0.22-wthikness,size*0.11-wthikness,size*0.44-wthikness])
sphere(2);
}
translate([0,0,-size*0.35+wthikness])
cube([size*1.40-wthikness,size*1.40-wthikness,size*0.70-wthikness], center=true);
}
//tail
if( wthikness == 0){
translate([0,size*0.24,size*0.09])
sphere(size*0.09);
}
}
// ARMS
module arm(size, side, wthikness = 0){
if(side == "right"){
hull(){
translate([-size*0.21,0,size*0.45])
rotate([-20,110,0])
resize(newsize=[size*0.30-wthikness,size*0.22-wthikness,size*0.15-wthikness])
sphere(2);
translate([-size*0.19,-size*0.15,size*0.30])
rotate([60,70,100])
resize(newsize=[size*0.22-wthikness,size*0.30-wthikness,size*0.10-wthikness])
sphere(2);
}
}
if(side == "left"){
// left arm
hull(){
translate([size*0.21,0,size*0.45])
rotate([20,70,0])
resize(newsize=[size*0.30-wthikness,size*0.22-wthikness,size*0.15-wthikness])
sphere(2);
translate([size*0.27,-size*0.22,size*0.30])
rotate([80,20,30])
resize(newsize=[size*0.15-wthikness,size*0.25-wthikness,size*0.10-wthikness])
sphere(2);
}
}
}
// FOOT
module foot(size, side="none", wthikness = 0){
if(side == "right"){
translate([-size*0.20,-size*0.25,size*0.074]) rotate([85,30,140]) complete();
}
// left foot
if(side == "left"){
translate([size*0.20,-size*0.25,size*0.074]) rotate([85,-30,220]) complete();
}
if(side == "none"){
complete();
}
module complete(){
hull(){
union(){
translate([0,-1.8,size*0.074])
sphere(size*0.074-wthikness);
}
finger();
}
rotate([0,0,30]) finger();
rotate([0,0,-30]) finger();
}
module finger(){
hull(){
resize(newsize=[size*0.15-wthikness,size*0.15-wthikness,size*0.074-wthikness])
sphere(2);
translate([0,size*0.20,0])
resize(newsize=[size*0.18-wthikness,size*0.22-wthikness,size*0.074-wthikness])
sphere(2);
}
}
}