Import the garage project
This commit is contained in:
parent
d7ecd0cf7a
commit
3c70b29ad1
8 changed files with 487 additions and 0 deletions
BIN
projects/garage/BMW Z4M.stl
Normal file
BIN
projects/garage/BMW Z4M.stl
Normal file
Binary file not shown.
16
projects/garage/Z4M.scad
Normal file
16
projects/garage/Z4M.scad
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
module scale_uniform(f) {
|
||||||
|
scale([f, f, f])
|
||||||
|
children();
|
||||||
|
}
|
||||||
|
|
||||||
|
module z4m() {
|
||||||
|
// reference dimensions
|
||||||
|
// cube([73, 171, 51]);
|
||||||
|
|
||||||
|
scale_uniform(1.36)
|
||||||
|
translate([43, 63, 1.4])
|
||||||
|
rotate([0.4, 0, 180])
|
||||||
|
import("BMW Z4M.stl");
|
||||||
|
}
|
||||||
|
|
||||||
|
z4m();
|
50
projects/garage/box.scad
Normal file
50
projects/garage/box.scad
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
function sorted(arr) = !(len(arr)>0) ? [] : let(
|
||||||
|
pivot = arr[floor(len(arr)/2)],
|
||||||
|
lesser = [ for (y = arr) if (y < pivot) y ],
|
||||||
|
equal = [ for (y = arr) if (y == pivot) y ],
|
||||||
|
greater = [ for (y = arr) if (y > pivot) y ]
|
||||||
|
) concat(
|
||||||
|
sorted(lesser), equal, sorted(greater)
|
||||||
|
);
|
||||||
|
|
||||||
|
module ccube(dimensions) {
|
||||||
|
ds = sorted(dimensions);
|
||||||
|
echo(ds.y, ds.z, 1, "// thickness", ds.x);
|
||||||
|
cube(dimensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
module topbottom(dimensions, thickness, back_inset) {
|
||||||
|
ccube([dimensions.x + (thickness * 2), dimensions.y + (thickness * 2) + back_inset, thickness]);
|
||||||
|
}
|
||||||
|
|
||||||
|
module side(dimensions, thickness) {
|
||||||
|
ccube([thickness, dimensions.y, dimensions.z]);
|
||||||
|
}
|
||||||
|
|
||||||
|
module frontback(dimensions, thickness) {
|
||||||
|
ccube([dimensions.x + (thickness * 2), thickness, dimensions.z]);
|
||||||
|
}
|
||||||
|
|
||||||
|
module box(dimensions, thickness, back_inset=0) {
|
||||||
|
translate([0, 0, 0]);
|
||||||
|
topbottom(dimensions, thickness, back_inset);
|
||||||
|
|
||||||
|
translate([0, 0, dimensions.z + thickness])
|
||||||
|
topbottom(dimensions, thickness, back_inset);
|
||||||
|
|
||||||
|
translate([0, thickness, thickness])
|
||||||
|
side(dimensions, thickness);
|
||||||
|
|
||||||
|
translate([dimensions.x + thickness, thickness, thickness])
|
||||||
|
side(dimensions, thickness);
|
||||||
|
|
||||||
|
translate([0, dimensions.y + thickness, thickness])
|
||||||
|
frontback(dimensions, thickness);
|
||||||
|
|
||||||
|
translate([0, thickness, thickness])
|
||||||
|
rotate([0, 0, -15])
|
||||||
|
mirror([0, 1, 0])
|
||||||
|
frontback(dimensions, thickness);
|
||||||
|
}
|
||||||
|
|
||||||
|
box([5, 5, 5], 0.5, 1);
|
82
projects/garage/casters.scad
Normal file
82
projects/garage/casters.scad
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
function caster_axel(wheel_r, axel_r) = [1 + axel_r, wheel_r + axel_r, 0];
|
||||||
|
|
||||||
|
module caster_bracket(wheel_r, wheel_h, axel_r, plate_t, padding=0.125, $fn=$fn) {
|
||||||
|
plate_side = wheel_r + axel_r + 1;
|
||||||
|
|
||||||
|
module caster_plate(
|
||||||
|
wheel_r,
|
||||||
|
axel_r,
|
||||||
|
plate_t,
|
||||||
|
) {
|
||||||
|
difference() {
|
||||||
|
linear_extrude(plate_t)
|
||||||
|
polygon([
|
||||||
|
[0, 0],
|
||||||
|
[0, plate_side],
|
||||||
|
[2 + axel_r * 2, plate_side],
|
||||||
|
[plate_side, 2 + axel_r * 2],
|
||||||
|
[plate_side, 0],
|
||||||
|
]);
|
||||||
|
|
||||||
|
axel = caster_axel(wheel_r, axel_r);
|
||||||
|
translate(axel)
|
||||||
|
cylinder(r=axel_r, h=plate_t, $fn=$fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
translate([0, -plate_t, 0])
|
||||||
|
union() {
|
||||||
|
translate([0, plate_t, 0]);
|
||||||
|
caster_plate(wheel_r, axel_r, plate_t);
|
||||||
|
|
||||||
|
translate([0, plate_t, wheel_h + (plate_t + padding * 2)])
|
||||||
|
caster_plate(wheel_r, axel_r, plate_t);
|
||||||
|
|
||||||
|
cube([plate_side, plate_t, wheel_h + ((plate_t + padding) * 2)]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module caster(
|
||||||
|
wheel_r,
|
||||||
|
wheel_h,
|
||||||
|
axel_r,
|
||||||
|
axel_h,
|
||||||
|
bearing_r=0,
|
||||||
|
bearing_h=0,
|
||||||
|
plate_t=0.125,
|
||||||
|
padding=0.125,
|
||||||
|
$fn=$fn,
|
||||||
|
) {
|
||||||
|
rotate([-90, 0, -90])
|
||||||
|
translate([-(caster_axel(wheel_r, axel_r).y), bearing_h - (wheel_r * 2) - 1 + plate_t + padding, -((wheel_h/2) + plate_t + padding)])
|
||||||
|
union() {
|
||||||
|
caster_bracket(wheel_r, wheel_h, axel_r, plate_t, padding, $fn=$fn);
|
||||||
|
|
||||||
|
translate(caster_axel(wheel_r, axel_r)) {
|
||||||
|
translate([0, 0, plate_t + padding])
|
||||||
|
cylinder(r = wheel_r, h=wheel_h, $fn=$fn);
|
||||||
|
|
||||||
|
translate([0, 0, -padding]) {
|
||||||
|
cylinder(r = axel_r, h = (wheel_h + (2* plate_t) + (padding*4)), $fn=$fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
translate([caster_axel(wheel_r, axel_r).y, 0, (wheel_h/2) + plate_t + padding])
|
||||||
|
rotate([90, 0, 0]) {
|
||||||
|
cylinder(r = bearing_r, h=bearing_h);
|
||||||
|
|
||||||
|
translate([0, 0, bearing_h])
|
||||||
|
cylinder(r=axel_r, h=axel_h, $fn=$fn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
caster(
|
||||||
|
// wheel (r, h)
|
||||||
|
5, 1,
|
||||||
|
// axel (r, h)
|
||||||
|
0.5, 1,
|
||||||
|
// bearing (r, h)
|
||||||
|
0.75, 0.25,
|
||||||
|
$fn=16
|
||||||
|
);
|
192
projects/garage/garage.scad
Normal file
192
projects/garage/garage.scad
Normal file
|
@ -0,0 +1,192 @@
|
||||||
|
use <steel-shelving.scad>
|
||||||
|
use <Z4M.scad>
|
||||||
|
use <tire-loft.scad>
|
||||||
|
use <printer-rack.scad>
|
||||||
|
|
||||||
|
// Note 16" stud spacing
|
||||||
|
// Note 2.5" downgrade over run of garage; height to minimums
|
||||||
|
|
||||||
|
module pass() {
|
||||||
|
}
|
||||||
|
|
||||||
|
module do() {
|
||||||
|
children();
|
||||||
|
}
|
||||||
|
|
||||||
|
module garage_perimeter() {
|
||||||
|
union() {
|
||||||
|
polygon([
|
||||||
|
[0, 0],
|
||||||
|
[0, 232],
|
||||||
|
[40, 232],
|
||||||
|
[40, 238],
|
||||||
|
[-6, 238],
|
||||||
|
[-6, -6],
|
||||||
|
[5, -6],
|
||||||
|
[5, 0],
|
||||||
|
[0, 0],
|
||||||
|
]);
|
||||||
|
|
||||||
|
polygon([
|
||||||
|
[201, 0],
|
||||||
|
[196, 0],
|
||||||
|
[196, -6],
|
||||||
|
[207, -6],
|
||||||
|
[207, 198],
|
||||||
|
[207 - 72, 198],
|
||||||
|
[207 - 72, 238],
|
||||||
|
[207 - 72 - 62, 238],
|
||||||
|
[207 - 72 - 62, 232],
|
||||||
|
[207 - 72 - 6, 232],
|
||||||
|
[207 - 72 - 6, 192],
|
||||||
|
[201, 192],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// walls
|
||||||
|
union() {
|
||||||
|
// FIXME: Draw the walls downgrade
|
||||||
|
linear_extrude(height=96)
|
||||||
|
garage_perimeter();
|
||||||
|
|
||||||
|
// FIXME: Draw the floor
|
||||||
|
|
||||||
|
// Garage door frame
|
||||||
|
translate([0, -6, 90])
|
||||||
|
cube([201, 6, 6]);
|
||||||
|
|
||||||
|
// Pedestrian door frame
|
||||||
|
translate([0, 232, 84])
|
||||||
|
cube([129, 6, 12]);
|
||||||
|
}
|
||||||
|
|
||||||
|
module label(text="label",
|
||||||
|
textsize=4,
|
||||||
|
pos=[0,0,0],
|
||||||
|
dpos=[10,0,10],
|
||||||
|
linesize=0.2,
|
||||||
|
length=20,
|
||||||
|
anglexyz=[0,45,90])
|
||||||
|
{
|
||||||
|
p1 = pos + dpos;
|
||||||
|
if ($preview)
|
||||||
|
color("black") {
|
||||||
|
line(pos, p1, linesize);
|
||||||
|
translate(p1)
|
||||||
|
rotate($vpr)
|
||||||
|
text(text, size = textsize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module line(p1=[0,0,0], p2=[0,0,10], r=.1) {
|
||||||
|
hull() {
|
||||||
|
translate(p1) sphere(r);
|
||||||
|
translate(p2) sphere(r);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// car (rough, assuming driver side door open)
|
||||||
|
translate([45 + 24 + 18, 10, 0])
|
||||||
|
color("blue")
|
||||||
|
z4m();
|
||||||
|
|
||||||
|
// south side workspace
|
||||||
|
|
||||||
|
//// power pulls
|
||||||
|
translate([0, 0, 44]) {
|
||||||
|
let(outlets=4) {
|
||||||
|
translate([1, 232, 2])
|
||||||
|
rotate([90, 0, 0])
|
||||||
|
cylinder(r=0.5, h=16 + 48 * (outlets - 1));
|
||||||
|
|
||||||
|
for(i=[0:outlets-1]) {
|
||||||
|
translate([0, 232 - 4 - 16 - i*48, 0])
|
||||||
|
cube([3, 4, 4]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//// printer rack
|
||||||
|
translate([4, 232 - 37, 0]) {
|
||||||
|
pass()
|
||||||
|
do() {
|
||||||
|
cube([42, 24, 92]);
|
||||||
|
label("servers", pos=[21, 12, 92]);
|
||||||
|
}
|
||||||
|
do() {
|
||||||
|
translate([33, 0, 0])
|
||||||
|
rotate([0, 0, 90])
|
||||||
|
printer_rack();
|
||||||
|
label("printers", pos=[19, 21, 80]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
toolchest_size=44;
|
||||||
|
|
||||||
|
//// tool chest
|
||||||
|
translate([4, 232 - 37 - 1 - toolchest_size, 0]) {
|
||||||
|
do() {
|
||||||
|
color("red")
|
||||||
|
cube([18.6, toolchest_size, 42.5]);
|
||||||
|
|
||||||
|
label("Tool chest", pos=[9.3, 25, 45.2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//// worktop
|
||||||
|
let(tops=2)
|
||||||
|
translate([24 + 1, 232 - 1 - 37 - 1 - toolchest_size - 1- (48 * tops), 0]) {
|
||||||
|
rotate([0, 0, 90])
|
||||||
|
shelving(48 * tops, 24, 32, shelves=3);
|
||||||
|
label("Worktop", pos=[-12, (48*tops)/2, 32]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//// bike hanger
|
||||||
|
pass()
|
||||||
|
cube([50, 33, 60]);
|
||||||
|
|
||||||
|
// north side storage
|
||||||
|
translate([201 - 24 - 1, 1, 0]) {
|
||||||
|
for (i=[0:2]) {
|
||||||
|
translate([0, (48 + 1) * i, 0]) {
|
||||||
|
color("red")
|
||||||
|
shelving(24, 48, 78);
|
||||||
|
label("Deep storage", pos=[12, 24, 90]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Current tire rack
|
||||||
|
translate([201, 148, 65]) {
|
||||||
|
rotate([0, 0, 90])
|
||||||
|
tire_loft();
|
||||||
|
label("Tire storage", pos=[-14.5, 22, 30]);
|
||||||
|
}
|
||||||
|
|
||||||
|
translate([201, 148, 32])
|
||||||
|
rotate([0, 0, 90])
|
||||||
|
tire_loft();
|
||||||
|
|
||||||
|
// sherpa
|
||||||
|
translate([201 - 13, 192, 0])
|
||||||
|
rotate([0, 0, 270])
|
||||||
|
cube([42, 12, 25]);
|
||||||
|
|
||||||
|
// trash can
|
||||||
|
translate([90, 232-14, 0]) {
|
||||||
|
let (height=28, wall=0.25)
|
||||||
|
difference() {
|
||||||
|
cylinder(h=height, d=23);
|
||||||
|
translate([0, 0, wall])
|
||||||
|
cylinder(h=height, d=23 - (wall * 2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// IT gear
|
||||||
|
translate([129-19, 232-32, 0]) {
|
||||||
|
translate([0, 0, 84])
|
||||||
|
cube([19, 24, 15]);
|
||||||
|
|
||||||
|
cube([24, 24, 32]);
|
||||||
|
}
|
48
projects/garage/printer-rack.scad
Normal file
48
projects/garage/printer-rack.scad
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
use <box.scad>
|
||||||
|
use <casters.scad>
|
||||||
|
|
||||||
|
padding = 1.5;
|
||||||
|
mdf_thickness = 0.75;
|
||||||
|
pin_inset = 3;
|
||||||
|
|
||||||
|
function padded(dims, padding) = [for(e=dims) e+padding];
|
||||||
|
|
||||||
|
// dimensions for things
|
||||||
|
prusa = padded([31.5, 31.5, 35.5], padding);
|
||||||
|
cr10 = padded([19, 27, 25], padding);
|
||||||
|
repbox = padded([19, 12.5, 12.5], padding);
|
||||||
|
cart = [prusa.x, prusa.y, 6.75 + mdf_thickness];
|
||||||
|
|
||||||
|
module cart() {
|
||||||
|
for(x=[pin_inset, cart.x - pin_inset])
|
||||||
|
for(y=[pin_inset, cart.y - pin_inset])
|
||||||
|
translate([x, y, 0])
|
||||||
|
caster(
|
||||||
|
// wheel (r, h)
|
||||||
|
3, 1,
|
||||||
|
// axel (r, h)
|
||||||
|
0.5, 1,
|
||||||
|
// bearing (r, h)
|
||||||
|
0.75, 0.25,
|
||||||
|
$fn=16
|
||||||
|
);
|
||||||
|
|
||||||
|
translate([0, 0, cart.z - mdf_thickness])
|
||||||
|
ccube([prusa.x + (mdf_thickness * 2), prusa.y + (mdf_thickness * 2), mdf_thickness]);
|
||||||
|
}
|
||||||
|
|
||||||
|
module printer_rack() {
|
||||||
|
translate([0, 0, 0])
|
||||||
|
cart();
|
||||||
|
|
||||||
|
//translate([0, 0, cart.z])
|
||||||
|
//box(prusa, mdf_thickness);
|
||||||
|
|
||||||
|
translate([0, 0, cart.z])
|
||||||
|
box([prusa.x, prusa.y, repbox.z], mdf_thickness);
|
||||||
|
|
||||||
|
translate([0, 0, cart.z + repbox.z + mdf_thickness * 2])
|
||||||
|
box([prusa.x, prusa.y, cr10.z], mdf_thickness);
|
||||||
|
}
|
||||||
|
|
||||||
|
printer_rack();
|
45
projects/garage/steel-shelving.scad
Normal file
45
projects/garage/steel-shelving.scad
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
module shelving_leg(height) {
|
||||||
|
linear_extrude(height)
|
||||||
|
polygon([
|
||||||
|
[0, 0],
|
||||||
|
[1, 0],
|
||||||
|
[1, 0.125],
|
||||||
|
[0.125, 0.125],
|
||||||
|
[0.125, 1],
|
||||||
|
[0, 1],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
module shelving_legs(width, depth, height) {
|
||||||
|
union() {
|
||||||
|
translate([0, 0, 0])
|
||||||
|
rotate([0, 0, 0])
|
||||||
|
shelving_leg(height);
|
||||||
|
|
||||||
|
translate([width, 0, 0])
|
||||||
|
rotate([0, 0, 90])
|
||||||
|
shelving_leg(height);
|
||||||
|
|
||||||
|
translate([0, depth, 0])
|
||||||
|
rotate([0, 0, -90])
|
||||||
|
shelving_leg(height);
|
||||||
|
|
||||||
|
translate([width, depth, 0])
|
||||||
|
rotate([0, 0, 180])
|
||||||
|
shelving_leg(height);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module shelving_shelves(width, depth, height, shelves) {
|
||||||
|
for (i = [0:((height-2)/(shelves - 1)):height-2]) {
|
||||||
|
translate([0, 0, i])
|
||||||
|
cube([width, depth, 2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module shelving(width, depth, height, shelves=4) {
|
||||||
|
shelving_legs(width, depth, height);
|
||||||
|
shelving_shelves(width, depth, height, shelves);
|
||||||
|
}
|
||||||
|
|
||||||
|
shelving(48, 24, 78);
|
54
projects/garage/tire-loft.scad
Normal file
54
projects/garage/tire-loft.scad
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
// HyLoft 01031 Folding Storage TireLoft,
|
||||||
|
|
||||||
|
module rounded_cylinder(r, h, n) {
|
||||||
|
rotate_extrude(convexity=1) {
|
||||||
|
offset(r=n) offset(delta=-n) square([r,h]);
|
||||||
|
square([n,h]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module tire(dia, w, iw) {
|
||||||
|
difference() {
|
||||||
|
rounded_cylinder(dia/2, w, 1);
|
||||||
|
cylinder(r=(iw/2), h=w);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module loft_end() {
|
||||||
|
cube([1, 22.5, 1]);
|
||||||
|
cube([1, 1, 24.5]);
|
||||||
|
|
||||||
|
translate([-0.125, 22.5, -0.75])
|
||||||
|
rotate([45, 0, 0])
|
||||||
|
cube([0.125, 1, 32]);
|
||||||
|
}
|
||||||
|
|
||||||
|
module tire_loft() {
|
||||||
|
color("silver") {
|
||||||
|
loft_end();
|
||||||
|
|
||||||
|
translate([0, 4, 0.5])
|
||||||
|
rotate([0, 90, 0])
|
||||||
|
cylinder(d=1, h=42);
|
||||||
|
|
||||||
|
translate([0, 22, 0.5])
|
||||||
|
rotate([0, 90, 0])
|
||||||
|
cylinder(d=1, h=42);
|
||||||
|
|
||||||
|
translate([42, 0, 0])
|
||||||
|
mirror([1, 0, 0])
|
||||||
|
loft_end();
|
||||||
|
}
|
||||||
|
|
||||||
|
// tires
|
||||||
|
for(i=[0:10:30]) {
|
||||||
|
let(dr=2) {
|
||||||
|
translate([i + 1, (28.3/2)-dr, (28.3/2)-dr])
|
||||||
|
rotate([0, 90])
|
||||||
|
color("black")
|
||||||
|
tire(28.3, 9.3, 19);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tire_loft();
|
Loading…
Reference in a new issue