Welcome to MakerHome




We've completed our yearlong print-a-day project!
All new material is now at Hacktastic: www.mathgrrl.com


Thursday, May 15, 2014

Day 262 - Customizable Furniture Minis

Today our Customizable Furniture Minis set is finally done and posted to Thingiverse! I guess it's time to actually start packing now...



Settings: All models printed on a Replicator 2 with .3mm/low resolution, with no support and no raft. 

Technical notes: For discussions of the OpenSCAD code used to make these models, see the MakerHome posts from the last couple of weeks. In addition you can see the version of the OpenSCAD code that is built to work with the Thingiverse Customizer by viewing the code from within the Customizer. For learn how to change your own OpenSCAD code into something for the Customizer, see MakerBot's helpful Best Practices and Developer Documentation pages. It's an easy process that mostly involves passing commands to the Customizer through comments in your OpenSCAD code.

Wednesday, May 14, 2014

Day 261 - Clearance stars

Sometimes with scaled floor plans it is difficult to tell if your setup is crowded or not. To test out the openness of our layout we printed two "clearance stars" to represent an individual's personal space as they moved through the apartment. According to homeplanner.com, for limited access spaces - like passageways behind furniture - a space of 24 inches should be allowed. For high-traffic spaces they suggest a space of 36 inches. But hey, it's a New York City apartment, not a spacious country home, so we took those measurements down a little bit after measuring the minimum comfortable clearances in our current home. We ended up settling on 22 inches clearance for limited access spaces, and 30 inches for high-traffic areas. The star models represent 1:50 scale of six feet tall so you can imagine them sort of as people with extra elbow room poking out all around. Here they are proving that we will be able to fit in the apartment along with all the furniture:


Thingiverse link: http://www.thingiverse.com/make:78720

Settings: MakerBot Replicator 2 at .3mm/low resolution.

Technical notes, OpenSCAD flavor: This model is just a tall twelve-pointed star column with a smaller copy of itself hollowed out of the middle. The star is a union of three (4-pointed, of course) squares, each rotated 120 degrees from the last, with code borrowed from Catarina Mota's shape library:

/////////////////////////////////////////////////////////////
// module for clearance star ////////////////////////////////

module 12ptstar(width,height) {
starNum = 3;
starAngle = 360/starNum;
// place StarNum cubes rotated evenly
for (s = [1:starNum]) {
rotate([0, 0, s*starAngle]) cube([width/sqrt(2),width/sqrt(2),height], true);
  }
}

module clearance_star(width,height) {
scale(s)
difference(){
12ptstar(width,height);
12ptstar(width-6,height+2);
}
}

Here are the lines of code for rendering the two stars:

// limited access clearance star 
//clearance_star(width=22,height=72);

// high-traffic access clearance star 
//clearance_star(width=30,height=72);

Tuesday, May 13, 2014

Day 260 - Bed frame and floor plan

Today's print is very simple: just a snap-around bed frame to model the wooden frame around our king-size bed. As you can see in the picture, we've chosen the smallest of the bedrooms to be our "master" bedroom, and the bed will take up pretty much all of the room. The closet at the bottom of the picture is part of this bedroom, but the other closet is actually a piece taken out of this small room to make a closet for the bedroom to the right. We made the actual larger "master bedroom" into the office (Day 255), with the thought that we'd rather have extra room while awake than asleep.

The picture below also shows off the nice floor plan that P made in Illustrator from the measurements that the real estate broker and building super were kind enough to make for us. The floor plan is made 1:50 scale to match the printed furniture. My Mother's Day gift this year was for everyone else in the house to pretend to be as excited as I am about spending time obsessively modeling our new apartment, so we're almost done now with all the furniture...


Thingiverse link: http://www.thingiverse.com/thing:332507

Settings: MakerBot Replicator 2 on .3mm/low, as usual.

Technical notes, easiest-OpenSCAD-code-ever flavor: The design is just a sharp cuboid (see Day 248) with a smaller one taken out so that the bed can fit inside.

/////////////////////////////////////////////////////////////
// module for making bed frames /////////////////////////////

module bedframe(depth,length,height){
scale(s)
difference(){
// total outer size
cuboid(depth,length,height,sharp);
// take out inside
translate([2,2,-1]) cuboid(depth-4,length-4,height+2,sharp);
}
}

Monday, May 12, 2014

Day 259 - Workshop desk and kid-size bureau

This will be our last week of printing tiny furniture; after a few more days we'll have a full set and will post everything to the Thingiverse Customizer so that all the summer movers out there can print-and-plan their new spaces. Today we printed C's room, including a modular IKIEA Linnmon table-desk with corner piece and a small chest of possibly-discontinued IKEA Trofast drawers.


Thingiverse link: http://www.thingiverse.com/make:78721

Settings: Replicator 2 on .3mm/low, with the bureau printed on its back and the desks printed upside-down to enable printing without supports or raft.

Technical notes, OpenSCAD flavor: The desk module builds a simple inverted-C shape and the cornerdesk module is just with the same code with a cylinder removed from one corner.

/////////////////////////////////////////////////////////////
// module for making desks //////////////////////////////////

module desk(depth,length,height){
scale(s)
union(){
// top of desk
translate([0,0,height*.8]) cuboid(depth,length,height*.2,sharp);
// left side
cuboid(depth,length*.15,height,sharp);
// right side
translate([0,length*.85,0]) cuboid(depth,length*.15,height,sharp);
}
}

/////////////////////////////////////////////////////////////
// module for making corner desks ///////////////////////////

module cornerdesk(depth,length,height){
scale(s)
difference(){
// regular desk
union(){
// top of desk
translate([0,0,height*.8]) cuboid(depth,length,height*.2,sharp);
// left side
cuboid(depth,length*.15,height,sharp);
// right side
translate([0,length*.85,0]) cuboid(depth,length*.15,height,sharp);
}
// take out a corner circle
translate([0,0,-1]) cylinder(r=depth/2,h=height+2);
}
}

The bureau module is a modified version of the bookcase module from Day 232, with drawers as shifted two-up shelves that stick out instead of make holes. It's adorable and I wish we had more than one chest of drawers to print!

/////////////////////////////////////////////////////////////
// module for bureaus ///////////////////////////////////////

module bureau(depth,length,height,drawers){
scale(s)
union(){
// body of the bureau
cuboid(length,height,depth,sharp);
// put in some drawers
for (i = [1:1:drawers]){
translate([.075*length,i*(height-.1*height)/drawers-.15*height,0]) 
cuboid(.4*length,.15*height,depth*1.1,sharp);
translate([.525*length,i*(height-.1*height)/drawers-.15*height,0]) 
cuboid(.4*length,.15*height,depth*1.1,sharp);
}
}
}

Sunday, May 11, 2014

Day 258 - Sunday gift: Knots for Mom

It's Mother's Day so today I am printing something for my Mom. When I asked her what she would like me to print for her, she suggested something that she could give away to her friends instead of something for herself. Because she is a nice person and wants to do nice things for those around her, like all great moms! So I'm printing her a set of Rocking Knots that she can give away as she likes.

I think a huge part of being a mom is thinking of other people before yourself. For example, one time when we were kids a lot of toast had been made for breakfast and one of the pieces was burned. My Mom took that piece of toast and scraped the burned top layer off into the sink, and I remember her saying that it was the "Mommy toast". That's such a little thing, she probably doesn't even remember saying that. But I do, and to this day if I'm making toast with C and one of the pieces is burned I call it the Mommy toast and take it so that he doesn't have to.


Thingiverse link: http://www.thingiverse.com/make:77283

Settings: Printed on a Replicator 2 with our usual support-minimizing custom profile for knots.

Saturday, May 10, 2014

Day 257 - Saturday Guest: Scott Sherman's Isohedra

Today's post is contributed by Scott Sherman, otherwise known as loki3 on Shapeways, where he has a wide variety of exotic dice models, including a new kind of d4 and even a d5. You can read more about these models at his Fair Dice page. Since fair dice must have an equal probability of rolling any of their numbers, the topic of dice leads naturally into one about isohedra, polyhedra that have all faces the same and all faces in the same transitive relationship with each other. For example, every Catalan solid (see Day 212) is an isohedron. Welcome, Scott Sherman, isohedron master!

For most people, “dice” = the numbers 1 through 6 on a cube.  The first time I saw any other type of dice was the Platonic solids used by Dungeons and Dragons, with 4, 6, 8, 12 and 20 sides. Then, years later, I saw that D&D added a 10-sided die. 10 sides? That’s not a Platonic solid. Where did that come from? Are there other shapes that could be used for dice?

It turns out there’s a class of polyhedra known as “isohedra” that make fair dice. In an isohedron, every face has the same relationship to every other face, so there’s an equal chance of rolling any side. There are 30 classes of isohedra, which you can see by visiting Mathworld’s page on isohedra:


Those pictures are intriguing, but how would one go about creating an “octahedral pentagonal dodecahedron” if one were so inclined? Unfortunately, Mathworld doesn’t have much to say about many of those shapes. And, it turned out at the time I was looking into it, Google didn’t have much more to say on the subject.

So I set out to reverse engineer those polyhedra based on a few pictures. Many of them turned out to be far more interesting than I was expecting. Several turned out to be infinite families of polyhedra rather than just a single shape. I describe how you can construct many of these on my Isohedral Transforms page, but it’s more fun to simply play with them interactively on my Interactive Isohedra page.

Here’s one to try: On the Interactive Isohedra page, choose octahedral symmetry (the second option under Symmetry) and then select the button for pentagonal faces. In the graph in the lower left, click on "24y" and keep the mouse button pressed (or keep your finger on your tablet) and move around a little bit. You should see the shape morph into different isohedra that share the same overall symmetry. Here are some of the possibilities.



What I found interesting when I first played with that symmetry group was that it looked like I could create faces with bilateral symmetry, but it didn’t match any polyhedron I had seen before. If you pick right around x=0.43, y=0.25, you’ll see this shape. 

I call it the Bilateral Pentagonal Icositetrahedron. Pretty catchy, eh? Yeah, I’m thinking of a career in marketing. Here it is printed in Matte Bronze Steel from Shapeways:


Technical notes, OpenSCAD flavor: If you want to try modeling a Bilateral Pentagonal Icositetrahedron in OpenSCAD, use this script, which describes each of the vertices of the Bilateral Pentagonal Icositetrahedron and then lists the quintuples in which they should be made into pentagon faces to build the polyhedron:

points = [
 [0.5698403, 0.4301597, -0.2451223],
 [0.4301597, 0.5698403, 0.2451223],
 [0.4576581, 0.4576581, 0.4576581],
 [0.5698403, 0.2451223, 0.4301597],
 [0.7548777, 0, 0],
 [-0.2451223, 0.5698403, 0.4301597],
 [0.2451223, 0.4301597, 0.5698403],
 [0, 0.7548777, 0],
 [0.4301597, -0.2451223, 0.5698403],
 [0, 0, 0.7548777],
 [0.5698403, -0.2451223, -0.4301597],
 [0.4301597, 0.2451223, -0.5698403],
 [0.4576581, 0.4576581, -0.4576581],
 [-0.2451223, 0.4301597, -0.5698403],
 [0.2451223, 0.5698403, -0.4301597],
 [0, 0, -0.7548777],
 [-0.5698403, 0.4301597, 0.2451223],
 [-0.4301597, 0.5698403, -0.2451223],
 [-0.4576581, 0.4576581, -0.4576581],
 [-0.5698403, 0.2451223, -0.4301597],
 [-0.7548777, 0, 0],
 [-0.4301597, -0.2451223, -0.5698403],
 [-0.5698403, -0.2451223, 0.4301597],
 [-0.4301597, 0.2451223, 0.5698403],
 [-0.4576581, 0.4576581, 0.4576581],
 [-0.5698403, -0.4301597, -0.2451223],
 [-0.4301597, -0.5698403, 0.2451223],
 [-0.4576581, -0.4576581, 0.4576581],
 [0.2451223, -0.5698403, 0.4301597],
 [-0.2451223, -0.4301597, 0.5698403],
 [0, -0.7548777, 0],
 [-0.4576581, -0.4576581, -0.4576581],
 [0.2451223, -0.4301597, -0.5698403],
 [-0.2451223, -0.5698403, -0.4301597],
 [0.5698403, -0.4301597, 0.2451223],
 [0.4301597, -0.5698403, -0.2451223],
 [0.4576581, -0.4576581, -0.4576581],
 [0.4576581, -0.4576581, 0.4576581]
];
faces = [
 [0, 1, 2, 3, 4 ],
 [5, 6, 2, 1, 7 ],
 [8, 3, 2, 6, 9 ],
 [10, 11, 12, 0, 4 ],
 [13, 14, 12, 11, 15 ],
 [1, 0, 12, 14, 7 ],
 [16, 17, 18, 19, 20 ],
 [14, 13, 18, 17, 7 ],
 [21, 19, 18, 13, 15 ],
 [22, 23, 24, 16, 20 ],
 [6, 5, 24, 23, 9 ],
 [17, 16, 24, 5, 7 ],
 [25, 26, 27, 22, 20 ],
 [28, 29, 27, 26, 30 ],
 [23, 22, 27, 29, 9 ],
 [19, 21, 31, 25, 20 ],
 [32, 33, 31, 21, 15 ],
 [26, 25, 31, 33, 30 ],
 [34, 35, 36, 10, 4 ],
 [33, 32, 36, 35, 30 ],
 [11, 10, 36, 32, 15 ],
 [3, 8, 37, 34, 4 ],
 [29, 28, 37, 8, 9 ],
 [35, 34, 37, 28, 30 ]
];
polyhedron(points,faces);

Technical notes, nomenclature flavor (from mathgrrl):  A polyhedron is an isohedra if all of its faces are the same irregular polygon, and in addition the solid is "face-transitive", meaning that for any two faces on the polyhedron there is some rotation/reflection combination of the entire polyhedron that will take one face to the other. Catalan solids are all isohedra, but have an additional property: they are the duals of the Archimedian solids. This means that their duals have faces that are all regular polyhedra, which in turn means that every vertex of a Catalan solid has edges coming into it in evenly-distributed angles, like the evenly spaced spokes of a wheel. The duals of isohedra are polyhedra with combinations of regular and/or irregular polyhedron faces, and therefore the vertices of an isohedra can sometimes have incident edges that are irregularly spaced around the vertex. For example, the Bilateral Pentagonal Icositetrahedron above has some degree three vertices that have a "Y" shape instead of edges that divide the space around the vertices into thirds.

Friday, May 9, 2014

Day 256 - Friday Fail: Fixed-by-Tinkercad edition

Today we look at two objects that I had trouble printing on a Replicator 2 without doing some fixes. Usually when a model won't slice with MakerWare, I use MeshLab or TopMod to find and fix the problem. Sometimes this works and sometimes it doesn't. Today it didn't, and Tinkercad had to come to the rescue.

The first model we had a problem with was a lovely Bilateral Pentagonal Icositetrahedron sent to us by Scott Sherman (loki3 on Shapeways), who we met at G4G11. The model is great and even the idea of this isohedron is amazing, but its vertices were "mothy" (thanks M. for that word) and the model fell apart at the corners while I was trying to remove the supports.


These print fine on Shapeways (they are available in loki3's store), but with MakerWare something was going wrong. My guess is that there are just too many triangles at the corners where spheres were added to round out the connections between cylinders; or perhaps the meshes of the sphere vertices just weren't playing well with the meshes of the cylinder edges. When you open the file in MeshLab you can see the suspicious-looking vertex meshes:


I don't know how to fix this problem in MeshLab, and wasn't getting anywhere with TopMod either, so it was time for a Hail Mary pass to Tinkercad. Since Tinkercad can get slow with meshes that have too many triangles, I did a couple rounds of Quadratic Edge Collapse Decimation (a great future band name; also see Day 134) to the model first to reduce the number of triangles, and then imported the resulting lower-poly model to Tinkercad. It turns out that Tinkercad seems to reinterpret whatever mesh you give it; my guess is that this is something to do with keeping complexity low so its servers don't get overloaded. Or maybe it is due to Tinkercad trying to make hollow or open models into solid, closed models. Or maybe it is something else entirely, but in any case, sometimes importing an STL file to Tinkercad works fine, and sometimes it causes a problem (for example, with Mathematica-exported knots like the one in Day 11), and every once in a while it fixes a problem. This time was one of those whiles; after going through Tinkercad and back out again, this is what the mesh looked like in MeshLab:


At first glance this does not seem to be an improvement of the mesh, but it turns out that this model prints just fine, with sturdy vertices (that's another great band name right there). Below is a picture of how it came out; compare this model with the Pentagonal Icositetrahedron we printed on Day 197. And stay tuned for tomorrow's guest post about this and other isohedra from Scott Sherman!


The second model we had a problem with today was a Great Rhombic Tricontahedron model from Chris Wallace (kitwallace on Thingiverse), generated from his incredible Polyhedra Index that can produce OpenSCAD code for generating every polyhedra that anyone has ever heard of, ever. This particular polyhedron is the basis for the Frabjous puzzle that we discussed on Day 252, and it is a strange, self-intersecting beast. Apparently this was reflected in its mesh as well, because I could not seem to get MakerWare to slice it in a sensible way; it was as if parts of the model that needed support were invisible to MakerWare, and support would not be built to them. In addition everything was taking forever because the inside of the model (which nobody would see after being printed) was very intricate. A couple of Quadratic Edge Decimations in MeshLab allowed me to import the STL into Tinkercad, which apparently simplified the model enough to print. Except for one problem, which you can see here:


Well, you would be able to see it if I could photograph the translucent filament better. What you're seeing is the bottom of the model, where five points meet the build plate. In each case at least one of the points dislodged itself from the raft before things could get properly connected up. The model was just too pointy; or perhaps alternately, not all five of the corners were equally flush with the build plate, and so one or more of them was actually printing a layer or two in the air. Either way, the problem could be fixed with another hack in Tinkercad. After exporting from MakerWare (to preserve the five-points-down orientation), and then importing into Tinkercad, we grouped a large cubical hole with the bottom of the model to cut off the tips of the five points at the base. With these flatter points the model was able to print successfully:


Thursday, May 8, 2014

Day 255 - Sofabed and office chairs

Here's a secret: I might be a little bit obsessive. With the 3D printing. Of all the tiny furniture. I'm just saying, I think this might not be normal. But we press on...

Although we have to give away a lot of our current furniture to fit into our Brooklyn apartment, there is one important piece we actually have to acquire: a sofabed, for people who come to visit. The green sofabed design in the picture below has a panel that indicates the size of the bed when it is extended. The model is based on IKEA's Karlstad sofabed. We also updated our chair module to make rudimentary office chairs. This is a picture of our future office/guestroom:


Thingiverse link: http://www.thingiverse.com/make:77566

Settings: MakerBot Replicator 2 on .3mm/low with no raft and no supports.

Technical notes, OpenSCAD flavor: The sofabed module is just a simple modification of the sofa module from Day 248.

/////////////////////////////////////////////////////////////
// module for making sofa beds //////////////////////////////

module sofabed(depth1,depth2,length,height){
scale(s)
union(){
// back of sofa
cuboid(depth1/4,length,height,soft);
// left arm of sofa
cuboid(depth1,depth1/4,height*.6,soft);
// right arm of sofa
translate([0,length-depth1/4,0]) cuboid(depth1,depth1/4,height*.6,soft);
// cushions of sofa
cuboid(depth1,length,height*.4,soft);
// image of bed
cuboid(depth2,length,height*.1,soft);
}
}

The office chairs are a new option for the chair module from Day 253. We made a toggle so you can choose shape=straight or shape=roll. With roll the back and seat of the chair get softer corners, and the base is replaced by a cylinder meant to represent the rolly wheels on an office chair. The base is connected with a rectangle instead of a post so that the model can print on its side without any supports. It looks kind of like a dentist's or hairdresser's chair so if you're designing a dentist's office or hair salon, this model is for you.

/////////////////////////////////////////////////////////////
// module for chairs ////////////////////////////////////////

module chair(depth,length,height,shape){
scale(s)
union(){
// top of chair
if (shape=="straight")
translate([0,0,height*.4]) 
cuboid(depth,length,height*.1,sharp);
if (shape=="roll")
translate([0,0,height*.4]) 
cuboid(depth,length,height*.1,soft);
// back
if (shape=="straight")
cuboid(depth*.15,length,height,sharp);
if (shape=="roll")
translate([0,0,height*.4]) 
cuboid(depth*.15,length,height*.6,soft);
// front
if (shape=="straight")
translate([depth*.85,0,0]) 
cuboid(depth*.15,length,height*.5,sharp);
if (shape=="roll")
union(){
translate([depth*.85/2,0,0]) 
cuboid(depth*.15,length,height*.45,sharp);
translate([depth/2,length/2,0]) 
cylinder(r=length/2,h=height*.1);
}
}
}

Wednesday, May 7, 2014

Day 254 - Arcade machine and light tree

We are going to leave a lot of furniture behind in the upcoming downsizing move, but there are two pieces we absolutely cannot live without: our full-size Galaga/Ms.PacMan arcade cabinet and our light-up Vegas tree (which we got after lusting after similar trees at the Golden Nugget). Here's the 1:50 scale mockup of where they will live in the new apartment:


In real life they currently look like this:


Sadly, notice the absence of the piano in the apartment mockup. The role of piano will instead be played by a small, silent desk. We've also sold our drum set. Too loud, takes up too much space.  :(

Thingiverse link: COMING SOON

Settings: Replicator 2 on .3mm/low, as usual.

Technical notes, OpenSCAD flavor: Again starting from the parameters and cuboid module from Day 248, the arcade machine is just a cuboid with part of a cylinder taken out of it. We're not really going for realism here, just rough abstract representations. It's interesting to see how simple you can make an object and have it still be recognizable.

/////////////////////////////////////////////////////////////
// module for arcade machine ////////////////////////////////

module arcade(depth,length,height){
scale(s)
difference(){
// overall size of the machine
cuboid(depth,length,height,sharp);
// cutout for screen and controls
translate([depth*.9,length*.9,height*.7]) 
rotate(90,[1,0,0]) 
cylinder(r=height*.25,h=length*.8);
}
}

The light tree is a total hack. We thought about using the new Customizable Tree on Thingiverse, but we didn't need that much customization and complexity and we wanted to keep all our designs in one simple OpenSCAD document, so we just stuck some angled cylinders to a post to make an abstract tree shape.

/////////////////////////////////////////////////////////////
// module for trees /////////////////////////////////////////

module tree(radius,height){
scale(s)
union(){
// branches
translate([0,0,height*.5]) 
rotate(40,[1,0,0]) 
cylinder(r=radius*.2,h=height*.5);
translate([0,0,height*.5]) 
rotate(200,[0,0,1]) rotate(40,[1,0,0]) 
cylinder(r=radius*.2,h=height*.5);
translate([0,0,height*.4]) 
rotate(80,[0,0,1]) rotate(50,[1,0,0]) 
cylinder(r=radius*.2,h=height*.3);
translate([0,0,height*.6]) 
rotate(140,[0,0,1]) rotate(405,[1,0,0]) 
cylinder(r=radius*.2,h=height*.3);
translate([0,0,height*.45]) 
rotate(260,[0,0,1]) rotate(50,[1,0,0]) 
cylinder(r=radius*.2,h=height*.3);
translate([0,0,height*.8]) 
rotate(100,[0,0,1]) rotate(30,[1,0,0]) 
cylinder(r=radius*.2,h=height*.2);
translate([0,0,height*.7]) 
rotate(280,[0,0,1]) rotate(30,[1,0,0]) 
cylinder(r=radius*.2,h=height*.3);
// leg
cylinder(r=radius*.2,h=height*.8);
// base
cylinder(r=radius*.8,h=height*.1);
}
}

Tuesday, May 6, 2014

Day 253 - Dining chairs and kitchen stool

Continuing our 1:50 scale miniature furniture collection, today we added dining room chairs and four-legged stools.  The picture below shows what the dining area will look like in our new apartment.


Thingiverse link: COMING SOON with full customizable set when we're done.

Settings: Printed on a MakerBot Replicator 2 with .3mm/low resolution, no raft and no support.

Technical notes, OpenSCAD flavor: The code for these models starts with the parameters and cubiod module from Day 248, with the following code for the simple module that builds the chairs.  In this design I assume that the seat is always just under halfway the full height of the chair.  The model outputs upright chairs, so before printing you should lie them on their sides to eliminate the need for supports.

/////////////////////////////////////////////////////////////
// module for chairs ////////////////////////////////////////

module chair(depth,length,height){
scale(s)
union(){
// top of chair
translate([0,0,height*.4]) 
      cuboid(depth,length,height*.1,sharp);
// back
cuboid(depth*.15,length,height,sharp);
// front
translate([depth*.85,0,0]) 
      cuboid(depth*.15,length,height*.5,sharp);
}
}

The module for the stools makes a round top and four cylindrical legs. The legs have to be much wider than they would be in real life or else the models are too fragile at 1:50 scale. It looks natural enough when it is printed, however.

/////////////////////////////////////////////////////////////
// module for stools ////////////////////////////////////////

module stool(radius,height){
scale(s)
union(){
// top
cylinder(r=radius,h=height*.1);
// legs
rotate(0,[0,0,1])
translate([radius*.6,0,0]) 
cylinder(r=radius*.3,h=height);
rotate(90, [0,0,1])
translate([radius*.6,0,0]) 
cylinder(r=radius*.3,h=height);
rotate(180, [0,0,1])
translate([radius*.6,0,0]) 
cylinder(r=radius*.3,h=height);
rotate(270, [0,0,1])
translate([radius*.6,0,0]) 
cylinder(r=radius*.3,h=height);
}
}

Monday, May 5, 2014

Day 252 - Large Rhombic Tricontahedron

Today we printed a large copy of a Rhombic Tricontahedron (Day 203) to give to a doctor friend who is leading the pack of those trying to figure out a vision problem of mine. It is so great to have a doctor that is actually curious about solving a puzzle; so many others send me on my way if they don't see an immediate answer. One puzzle he's interested in is George Hart's Frabjous assembly, which is based on the Great Rhombic Tricontahedron, which itself is based on the Rhombic Tricontahedron we printed today (which while "large" is not "great").


Thingiverse link: http://www.thingiverse.com/make:76939

Settings: Printed on a Replicator 2 with custom MakerWare settings for raft and minimal supports.

Sunday, May 4, 2014

Day 251: Extended Billy bookcases

Continuing from yesterday, today we printed some IKEA Billy bookcases with height extenders. The height extenders are sold separately and come in both wide and thin versions. I know you can put them on the tall bookcases, and I'm hoping you can put them on the short versions as well. Rather than print the extenders and try to balance them on the bookcases, we just printed extended one-piece bookcases:


Here they are with their non-extended brothers, in the full set of Billy bookcase possibilities:



Settings: Printed on MakerBot Replicator 2 with .3mm/low settings, with models lying flat so that support is not needed.

Technical notes, dimension/OpenSCAD flavor: The new extended models were rendered with yesterdays' bookcase module, but taller:

// wide short billy with extender
//bookcase(depth=11,length=31.5,height=55.375,shelves=4);

// wide tall billy with extender
//bookcase(depth=11,length=31.5,height=93.125,shelves=7);

// thin short billy with extender
//bookcase(depth=11,length=15.75,height=55.375,shelves=4);

// thin tall billy with extender
bookcase(depth=11,length=15.75,height=93.125,shelves=7);

Saturday, May 3, 2014

Day 250: Billy bookcases

Most of our furniture consists of bookcases, and our go-to bookcases are from IKEA's Billy bookcase series. The Billys currently come in short and tall flavors, both of which can be either wide or thin, with one option for a deeper bookcase:


These take almost no time at all to print, so you can make lots of them to see what combinations might fit and look best in your space:



Settings: Printed on a Replicator 2 on .3mm/low setting, at 1:50 scale. 

Technical notes, OpenSCAD flavor: The code for these bookcases uses the scaling factors and cuboid module from Day 248. The bookcase models are made by making a cuboid shape to enclose the bookcase, taking away the inside, and then adding shelves. The most difficult part was getting the shelf heights and gaps right so that the code can accept any number of shelves and return an evenly-spaced bookcase. We decided to make these with no backs, but it would be easy to add backs to these if desired. They print lying down so that no supports are needed.

/////////////////////////////////////////////////////////////
// module for making bookcases //////////////////////////////

module bookcase(depth,length,height,shelves){
scale(s)
union(){
difference(){
// body of the bookcase
cuboid(length,height,depth,sharp);
// minus an inside
translate([.1*length,.1*length,-depth/2])
cuboid(.8*length,height-.2*length,2*depth,sharp);
}
// put in some shelves
for (i = [1:1:shelves-1]){
translate([0,i*(height-.1*length)/shelves,0]) 
cuboid(length,.1*length,depth,sharp);
}
}
}

The current line of Billy bookcases can then be made with the following renders (uncomment whichever one you want to make):

// wide short billy
//bookcase(depth=11,length=31.5,height=41.75,shelves=3);

// wide tall billy
//bookcase(depth=11,length=31.5,height=79.5,shelves=6);

// wide tall deep billy
//bookcase(depth=15.375,length=31.5,height=79.5,shelves=6);

// thin short billy
//bookcase(depth=11,length=15.75,height=41.75,shelves=3);

// thin tall billy
//bookcase(depth=11,length=15.75,height=79.5,shelves=6);

Friday, May 2, 2014

Day 249: Friday Fail - From OpenSCAD crashes to Beefy win!

Sometimes things just don't work and I don't know why. For example, the new version of OpenSCAD is great but I couldn't get it to run on my old Mac laptop; it would immediately quit upon opening. After a few weeks of frustration and unsuccessful Googling I finally stumbled across this handy OpenSCAD Forum post from tbuser, who was having the same problem; it turns out it was a problem with OS 10.7.5, and tp3 answered with a downloadable fix. Thank you tbuser and tp3 and the interwebs for fixing this problem! I still don't know what that was all about, but one of the best things about the internet is that is allows me to find a way to muddle through even when I'm thoroughly underqualified and have no idea what is going on.

In celebration of recovering from this week's fail we are printing tbuser's Beefy Trophy model from Thingiverse, which he built by combining an existing statue model with some beefy arms like those in atartanian's Beefy Arm Starter Kit.


Thingiverse link: http://www.thingiverse.com/make:76742

Settings: Printed on a Replicator 2 with .3mm/low settings and a raft, using the built-in supports from tbuser's model instead of the usual MakerWare supports. This is my first time printing with these cool fractal-post-support-thingys, which I imagine come from MeshMixer in some way that I should learn about:


In fact there are a lot of things that I need to learn about this summer, including:
  • AutoCad's MeshMixer, which tbuser used to mashup the statue with the beefy arms;
  • MakeHuman, crazy amazing open-source software that atartanian used to make the beefy arms;
  • Everything else: Rhinoceros, Grasshopper, Blender, Maya, how to cook with a gas stove, how to live in a big city, how to use all the buttons on my synthesizer, and how to find and properly wear a dress when it is necessary, even though I seem to be some strange mashup of lady and beefy arms. 

Thursday, May 1, 2014

Day 248: Thursday refactor - Sofa redesign

On Day 230 we printed some tiny sofas to try to figure out what will fit in our Brooklyn apartment this summer. (The answer: not much!)  In the comments, kitwallace suggested a very clean refactoring of our clunky OpenSCAD code, as well as a way to make the sofa dimensions more accurate while still being rounded. Today we reprinted our sofa models with this improved code, and now more things fit in our apartment! The new model is on the left, the old on the right:


Thingiverse link: COMING SOON - eventually we'll post a full customizable set of models...

Settings: MakerBot Replicator 2 with .3mm/low, as usual.

Technical notes, improved OpenSCAD flavor: The top of the code is the same as on Day 230, with scaling factors set so that we can measure our sofas in inches and then create them in OpenSCAD using millimeters so that they print at 1:50 scale. Note the "soft" factor for making soft corners on things like sofas and beds, and the "sharp" factor for making hard things like tables and desks.

/////////////////////////////////////////////////////////////
// parameters ///////////////////////////////////////////////

$fn = 12;     // facets
scale = 50;   // enter desired scaling factor here e.g. 50 means 1:50
m = 25.4;     // measurement unit conversion
      //(m=25.4 does 1:1 scale with inches entered)
      //(m=12*25.4 does 1:1 scale with feet entered)
      //(m=10 does 1:1 scale with cm entered)
      //(m=1000 does 1:1 scale with meters)
s = m/scale;  // scaling factor 
soft = 3*s;   // radius for soft bevels depends on scale
sharp = .2;   // radius for sharper edges

The next section is a neat cuboid module that save us work when constructing the sofa shapes from rectangular solids. The cuboid is made by forming a hull around spheres that are placed at its eight corners, and the coordinates of the centers of those spheres are defined so that the size of the sphere doesn't affect the overall dimensions of the object. In other words, sofas have corners that are rounded in, rather than sides that poof out, as we had in our previous model. It seems like a little thing but at 1:50 scale it can make a difference of a few inches, which is significant when trying to see if your furniture will pack into a small space!

/////////////////////////////////////////////////////////////
// module for cuboids ///////////////////////////////////////
// thanks, kitwallace! //////////////////////////////////////

module cuboid(depth,length,height,r) {
hull(){
translate([r,r,r]) sphere(r);
translate([depth-r,r,r]) sphere(r);
translate([depth-r,length-r,r]) sphere(r);
translate([r,length-r,r]) sphere(r);
translate([r,length-r,height-r]) sphere(r);
translate([depth-r,length-r,height-r]) sphere(r);
translate([depth-r,r,height-r]) sphere(r);
translate([r,r,height-r]) sphere(r);
}
}

Now that we have the cuboid module, it is easy to make a sofa shape out of four of those cuboids. Another improvement from our previous code is that the scale is built into the top level of the module instead of being factored into every dimension or translation.

/////////////////////////////////////////////////////////////
// module for making sofas //////////////////////////////////

module sofa(depth,length,height){
scale(s)
union(){
// back of sofa
cuboid(depth/4,length,height,soft);
// left arm of sofa
cuboid(depth,depth/4,height*.6,soft);
// right arm of sofa
translate([0,length-depth/4,0])
                    cuboid(depth,depth/4,height*.6,soft);
// cushions of sofa
cuboid(depth,length,height*.4,soft);
}
}

Finally, all that is left is to measure your sofa's dimensions and render with the "sofa" module. By the way, this one doesn't fit in our apartment, so let me know if you are in the market for a very nice brown loveseat.

/////////////////////////////////////////////////////////////
// render ///////////////////////////////////////////////////

// brown loveseat
sofa(depth=36,length=54,height=34);