Openscad Parametric Twist Containers

I printed one of the twist containers that Devin Montes made, and it turned out great. I had to make some of my own, so I could have any number of sides that I wanted. The idea is that there are two twisted prisms, where one is just slightly bigger than the other. If you get the tolerance right they will just barely slide past one another, which makes it hard for the air to get out. I designed them using the program openscad.

Since there is an inside and an outside the model should be saved as two stl files. I accomplished this with a shell script and an if statement with the input from the command. Here is the shell script:

#!/bin/sh
openscad -DPART='"inside"' -o inside.stl twist.scad
openscad -DPART='"outside"' -o outside.stl twist.scad

And then for openscad there needs to be an if statement to use this input. If the part is equal to "inside" then render the inside. Otherwise, if it equals "outside", render the outside. And if it is neither of those, display both for preview purposes. Here is the import part of the openscad code:

if (PART == "inside") {
        inside();
} else if (PART == "outside") {
        outside();
} else {
    inside();
    translate([size*2,0,0]) outside();
}

If the arguments say inside, it renders the inside. If they say outside, it renders the outside. Otherwise, it will preview both. Here is the full openscad code:

$fn=256; //resolution of shape, turn higher for more tris

height=100; //The height of the container

tolerance=1; //The distance between the outer and the inner vases

size=70; //Approximately the diameter of the container

roundness=20; //The radius of the corners

twist=-90; //Amount it twists by, negative to get a right handed container

chamfer_thickness=1; //How tall the chamfer is

chamfer_width=1; //How far in the chamfer goes

sides=3; //Number of sides on the container

base_thickness=3; //How tall the grip on the base is

base_width=2; //How for out the grip on the base is


base_slope=base_width/base_thickness; //How steep the grip is


module base() { //Make a circle for every side, and evenly space them
    hull() {
        for (i=[1:sides])
                        rotate(360/sides*i)translate([size/2-roundness,0,0])circle(roundness);
        }
}

module handle() { //Make two tapered prisms, and put them together
    translate([0,0,-base_thickness])
    linear_extrude(base_thickness/2,scale=(size+base_slope*base_thickness)/size)base();
    scale([1,1,-1])
    linear_extrude(base_thickness/2,scale=(size+base_slope*base_thickness)/size)base();
}

module chamfer() { //Make a taped prism for the top chamfer
        rotate([0,0,-twist])translate([0,0,height-chamfer_thickness])
        linear_extrude(chamfer_thickness,scale=(size-chamfer_width)/size)
        base();
}

//The inside is the combination of a twisted prism, the base, and the chamfer
module inside() {
    union() {
        handle();
            linear_extrude(height-chamfer_thickness,slices=$fn,twist=twist)base();
            chamfer();
    }
}

//The outside is just a twisted prism, just slightly bigger than the inside
module outside() {
        linear_extrude(height,slices=$fn,twist=twist)
        offset(tolerance)base();
}

//Get part information from the command line, so that both the inside and the outside can be rendered automatically
PART=undef;

if (PART == "inside") {
        inside();
} else if (PART == "outside") {
        outside();
} else {
    inside();
    translate([size*2,0,0]) outside();
}