// 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();