323 lines
6.9 KiB
OpenSCAD
323 lines
6.9 KiB
OpenSCAD
// The Parameters of the House
|
|
// all in mm
|
|
level=3500;
|
|
wallstrength=500;
|
|
ceilingstrength=300;
|
|
floorstrength=200;
|
|
ringdiameter=14000;
|
|
ringstrength=2500;
|
|
garagediameter=ringdiameter+2000;
|
|
garageheigth=4000;
|
|
sides=6;
|
|
|
|
outer_wall_woodwidth=50;
|
|
outer_wall_strawwidth=1000;
|
|
|
|
// Reusable functions
|
|
// returns the inner circle radius given
|
|
// the angle
|
|
// wallstrengt
|
|
// and the diameter
|
|
//
|
|
//
|
|
function radius_in_circle(angle, diameter, wallstrength) =(
|
|
(cos(angle)*diameter)-
|
|
wallstrength
|
|
);
|
|
|
|
|
|
// returns the cleaned up value
|
|
// given
|
|
// angle,
|
|
// diameter,
|
|
// wallstrengt (measured 90° to the wall)
|
|
function radius_in_diameter(angle, wallstrength, diameter) = (
|
|
radius_in_circle(angle=angle, diameter=diameter, wallstrength=wallstrength)/ cos(angle));
|
|
// echo(radius_in_diameter(diameter=2,wallstrength=0,angle=45));
|
|
// should return 2
|
|
|
|
// return the length of the inside of wall
|
|
// given
|
|
// angle
|
|
// wallstrengt
|
|
// diameter
|
|
function sidelength_inside(angle,diameter,wallstrength)=(abs(sin(angle)*radius_in_diameter(angle,diameter,wallstrength)*2));
|
|
// echo(abs(sidelength_inside(diameter=2,wallstrength=0,angle=45)));
|
|
// should return 4
|
|
|
|
// The House Modules
|
|
module ngon(
|
|
diameter=5,
|
|
height=level,
|
|
sides=sides
|
|
)
|
|
{
|
|
cylinder(
|
|
h=height,
|
|
r=diameter/2,
|
|
$fn=sides
|
|
);
|
|
};
|
|
|
|
module garage(
|
|
garageheigth=garageheigth,
|
|
garagediameter=garagediameter
|
|
)
|
|
{
|
|
//color([0.1,0.1,1])
|
|
#translate([0,0,-garageheigth])
|
|
living(
|
|
floorstrength=2*floorstrength,
|
|
ceilingstrength=2*ceilingstrength
|
|
);
|
|
};
|
|
|
|
module ring(
|
|
ringdiameter=ringdiameter,
|
|
ringstrength=ringstrength,
|
|
ringheigth=level
|
|
)
|
|
{
|
|
//do the math for the radii
|
|
angle=(0.5*360/sides);
|
|
radius_in_circle=(sin(angle)*ringdiameter)-wallstrength;
|
|
echo("DEBUG RING radius_in_circle");
|
|
echo(radius_in_circle);
|
|
side_length=2*cos(0.5*360/sides)*radius_in_circle;
|
|
echo("DEBUG RING side_length");
|
|
echo(side_length);
|
|
radius_in_diameter=radius_in_circle/ sin(angle);
|
|
echo("DEBUG RING radius_in_diameter");
|
|
echo(radius_in_diameter);
|
|
#difference() {
|
|
ngon(
|
|
height=ringheigth,
|
|
diameter=ringdiameter,
|
|
sides=sides
|
|
);
|
|
%translate ([0,0, -1]) ngon(
|
|
height=ringheigth+2,
|
|
diameter=radius_in_diameter,
|
|
sides=sides
|
|
);
|
|
};
|
|
};
|
|
|
|
module living(
|
|
ringdiameter=ringdiameter,
|
|
ringstrength=ringstrength,
|
|
ringheigth=level,
|
|
floorstrength=floorstrength,
|
|
ceilingstrength=ceilingstrength,
|
|
wallstrength=wallstrength
|
|
)
|
|
{
|
|
|
|
angle=(0.5*360/sides);
|
|
radius_in_circle=(sin(angle)*ringdiameter)-wallstrength;
|
|
radius_in_diameter=radius_in_circle/ sin(angle);
|
|
side_length=2*acos(0.5*360/sides)*radius_in_circle;
|
|
#
|
|
difference() {
|
|
%ring();
|
|
echo("DEBUG LIVING building inner ring");
|
|
translate([0,0,+floorstrength])
|
|
ring(
|
|
ringdiameter=radius_in_diameter,
|
|
ringstrength=ringstrength-2*wallstrength,
|
|
ringheigth=level-(floorstrength+ceilingstrength));
|
|
};
|
|
};
|
|
|
|
|
|
|
|
module spar(
|
|
spar_width,
|
|
spar_depth,
|
|
spar_height
|
|
)
|
|
{
|
|
echo("DEBUG SPAR creating spar");
|
|
echo("DEBUG SPAR spar vars");
|
|
echo(
|
|
spar_width,
|
|
spar_depth,
|
|
spar_height
|
|
);
|
|
|
|
translate(
|
|
[0.5*spar_width,
|
|
0.5*spar_depth,
|
|
0] )
|
|
cube(
|
|
size=[
|
|
spar_width,
|
|
spar_depth,
|
|
spar_height
|
|
]
|
|
);
|
|
}
|
|
|
|
module draw_spars(
|
|
spar_offset,
|
|
outer_wall_woodwidth,
|
|
wallstrength,
|
|
ringheigth
|
|
)
|
|
{
|
|
echo("DEBUG draw_spars drawing spars");
|
|
echo("DEBUG draw_spars vars:( spar_offset, outer_wall_woodwidth, wallstrength, ringheigth)");
|
|
echo(
|
|
spar_offset,
|
|
outer_wall_woodwidth,
|
|
wallstrength,
|
|
ringheigth
|
|
);
|
|
|
|
// positive spar
|
|
translate (
|
|
[
|
|
spar_offset,
|
|
0,
|
|
0
|
|
//radius_in_circle
|
|
] )
|
|
spar(
|
|
spar_width=outer_wall_woodwidth,
|
|
spar_depth=wallstrength,
|
|
spar_height=ringheigth
|
|
);
|
|
// mirrored / negative spar
|
|
translate (
|
|
[
|
|
-spar_offset,
|
|
0,
|
|
0
|
|
//radius_in_circle
|
|
] )
|
|
spar(
|
|
spar_width=outer_wall_woodwidth,
|
|
spar_depth=wallstrength,
|
|
spar_height=ringheigth
|
|
);
|
|
}
|
|
|
|
module outer_wall(
|
|
ringdiameter=ringdiameter,
|
|
ringstrength=ringstrength,
|
|
ringheigth=level,
|
|
floorstrength=floorstrength,
|
|
ceilingstrength=ceilingstrength
|
|
)
|
|
{
|
|
echo("DEBUG OUTER WALL building with ringdiameter, ringstrength,ringheigth,floorstrength,ceilingstrength");
|
|
echo(ringdiameter, ringstrength,ringheigth,floorstrength,ceilingstrength);
|
|
angle=0.5*360/sides;
|
|
echo("DEBUG angle");
|
|
echo(angle);
|
|
radius_in_circle=floor(
|
|
radius_in_circle(diameter=ringdiameter,angle=angle,wallstrength=wallstrength)
|
|
|
|
// (cos(angle)*ringdiameter)-
|
|
// wallstrength
|
|
);
|
|
echo("DEBUG radius_in_circle");
|
|
echo(radius_in_circle(diameter=ringdiameter,angle=angle,wallstrength=wallstrength));
|
|
echo("DEBUG radius_in_diameter")
|
|
|
|
echo(radius_in_diameter(diameter=ringdiameter,angle=angle,wallstrength=wallstrength));
|
|
side_length=round(sidelength_inside(diameter=ringdiameter,angle=angle,wallstrength=wallstrength)
|
|
//2*cos(angle)*radius_in_circle
|
|
);
|
|
echo("DEBUG side_lenght");
|
|
echo(side_length);
|
|
elements=floor(side_length/(outer_wall_woodwidth+outer_wall_strawwidth));
|
|
echo("DEBUG elements");
|
|
echo(elements);
|
|
for(side=[1:sides] )
|
|
{
|
|
// rotate the outerwall to every side of the building
|
|
rotate(angle+2*side*angle)
|
|
translate(
|
|
[
|
|
radius_in_circle+
|
|
wallstrength,
|
|
0,
|
|
0
|
|
]
|
|
)
|
|
{
|
|
echo("DEBUG running through sides");
|
|
echo(side);
|
|
rotate( [0,0,90])
|
|
{
|
|
echo("DEBUG OUTER WALL building spars");
|
|
if (elements%2==1)
|
|
{
|
|
echo("DEBUG uneven number");
|
|
// center the middle modeline
|
|
for (spar= [0:elements/2])
|
|
{
|
|
echo("DEBUG OUTER WALL planking");
|
|
echo("DEBUG OUTER WALL spar");
|
|
echo(spar);
|
|
offset = (
|
|
0.5* outer_wall_strawwidth +
|
|
spar*(outer_wall_woodwidth +
|
|
outer_wall_strawwidth)
|
|
);
|
|
echo("DEBUG OUTER WALL offset for spar");
|
|
echo(offset);
|
|
echo("DEBUG OUTER WALL spar vars");
|
|
echo(
|
|
outer_wall_woodwidth,
|
|
wallstrength,
|
|
ringheigth
|
|
);
|
|
draw_spars(
|
|
offset,
|
|
outer_wall_woodwidth,
|
|
wallstrength,
|
|
ringheigth
|
|
);
|
|
}
|
|
}
|
|
if (elements%2==0)
|
|
{
|
|
echo("DEBUG even number");
|
|
// center the middle modeline
|
|
for (spar= [0:elements/2])
|
|
{
|
|
echo("DEBUG OUTER WALL planking");
|
|
echo("DEBUG OUTER WALL spar");
|
|
echo(spar);
|
|
// offset "along" the wall
|
|
offset= (0.5* outer_wall_strawwidth +
|
|
spar*(outer_wall_woodwidth+
|
|
outer_wall_strawwidth));
|
|
echo("DEBUG OUTER WALL offset for spar");
|
|
echo(offset);
|
|
echo("DEBUG OUTER WALL spar vars");
|
|
echo(
|
|
outer_wall_woodwidth,
|
|
wallstrength,
|
|
ringheigth
|
|
);
|
|
draw_spars(
|
|
offset,
|
|
outer_wall_woodwidth,
|
|
wallstrength,
|
|
ringheigth=ringheigth
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
living();
|
|
translate([0,0,level]) living();
|
|
garage();
|
|
outer_wall();
|
|
//ring();
|