Patricia’s OpenSCAD Projects

First OpenSCAD Design

I followed mathcodeprint ‘s tutorial on how to make a box because I was struggling with writing code and understanding it. Their videos have been really helpful so far so go check them out!!! I do have a tip when writing this code: Watch your brackets!!! () [] {} I keep forgetting the bracket system [] with in the ().

Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright

I started with a 30x30x30 cube. In order to make the corners rounded a minkowski code line has to be written to use both objects to make a rounded object. I took my 30x30x30 cube and wrote a minkowski code that uses a sphere of 1. OpenSCAD takes that sphere of 1 and moves it around the edges of the cube and the edges become rounded with the sphere 1 dimensions.

Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright
Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright

The next two pictures are getting the cube ready to be hollowed out. I made a slightly larger cube 35x35x20 and translated it up from the center of the origin. The next step in the third picture would be to subtract that difference from the rounded cube. I used the difference tag to remove the top of the cube.

Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright
Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright

Now to hollow out the center. I took the first minkowski cube and copied the code down and modified the dimensions to give me a 3 millimeter thickness and adjusted the height slightly. I needed this cube to be the inside compartment difference. I dragged the end } tag for the difference down and differenced that inside cube from the first to make the compartment.

Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright
Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright

The last part is a little more challenging to think about. Instead of a cube (it looks like it) I used a square with a circle of one. The square needs to be where it can take off 1 millimeter around the inner edge of the bottom of the box and following the rounded corners. I wrote another minkowski tag for both the square and the circle so it can be a rounded shape. I extruded the square to an extrude of 5 and transformed it down by -1 on the Z axis. I moved my difference } down to include the difference of the shape to make the inner rim of the box.

My planned changes for this box would be to go back in and do some final adjustments to the inner rim, make a matching lid, and customize the box by adding text or something else to it.

Code for this project and references below.

//Tutorial for code help from mathcodeprint https://www.youtube.com/watch?v=lPgLZgnbREk

//Base box set up
$fn=50;

difference(){
minkowski(){
cube([30,30,30], center = true);
sphere(1);
}

//Deleting top to eventually open box

translate([0,0,10])cube([35,35,20], center = true);


//Inner compartment

minkowski(){
cube([27,27,20], center = true);
sphere(1);
}


translate([0,0,-1]){
linear_extrude(5){
minkowski(){
square([28,28], center = true);
circle(1);
}
}
}
}

References

OpenSCAD-Project Enclosure-Create round corners with Minkowski Sum by mathcodeprint

Second OpenSCAD Design

I followed another tutorial from mathcodeprint on Youtube. I made my own building brick by following along with their video.

Tutorial Toy Brick Video Credit: mathcodeprint
Toy Brick: Patricia Wright

I started off with two cubes. I resized them and used a difference tag to subtract the second one from the first one to make the opening in the brick. Next I made three cylinders (one for the top and two for the bottom). I took the difference for the bottom cylinders to make the round pegs that would help hold the brick together with another. The top cylinders needed more work to them. There’s two “for” tags that go along with the top cylinders to make the pegs. They have the i and j variables to them. Adjusting the third number in the translate adjusts the spacing between the pegs. These two variables were added into the translate tag for the cylinders. Messing with the i variable number increases/decreases pegs. The j variable is set to 1 because I just needed an extra row. More can be added for bigger bricks. There are text tag strings also attached with the cylinders because they need to be inside those tags to appear properly on top of the cylinder pegs.

Tutorial Toy Brick Video Credit: mathcodeprint
Toy Brick: Patricia Wright

The same goes for the inside cylinder pegs. They need a for tag to make a row of pegs. For this brick size I needed 5 for the inside of the brick. Their position was translated so they can fit in the center of the brick. This was an easy tutorial to follow along. I did have some hang ups that took some time to look for mistakes in my code when I was trying to get the text to appear right on top of the cylinder pegs. Another thing I learned too with the text string is that the first one needs to be the text near the origin (0,0) because OpenSCAD works from the origin and out. So “BRICKS” needed to be first in that text sequence.

//Tutorial for code help from mathcodeprint https://www.youtube.com/watch?v=ecd_eWPnynk

$fn=50;

pegtext2=[["B","R","I","C","K","S"],["B","U","I","L","D"]];

difference(){
    cube([55.80,16.80,9.60]);
    translate([1.45,1.45])
    cube([52.90,13.90,8.60]);
}

translate([3.90,3.90])
for (j=[0:1] ){
    for (i=[0:5] ){
    translate([i*9.5,j*9.5,9.60]){
    cylinder(h=1.8,r=2.42);
    translate([0,0,1.8])
    linear_extrude(.4)
    text(pegtext2[j][i], 1.5,halign= "center", valign= "center");
    }
  }  
}

translate([7.90,7.90])
for (k=[0:4]){
    translate([k*9.5,0])
    difference(){
    cylinder(h=8.6,r=3.25);
    cylinder(h=8.6,r=2.40);
    }
}

References

OpenSCAD Tutorial for Beginners – Model a Toy Brick by mathcodeprint

Iterate One of My OpenSCAD Projects

I followed the tutorial from mathcodeprint to finish up making a lid for the other half of the box I made.

Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright

The first part was easy. I took a copy of the box to modify. The next part I couldn’t get to work quite right. I was able to get the differences to finally work on the extruded squares that I would be making the outer lid ring. The main difference tag from the lid did not want to apply from the square ring to subtract the difference of the square object to the lid to make the rim. So I went to plan B. I took the square ring and adjusted the settings of the ring to manually make the outer lid ring. It should still work to slide into fit with the bottom half. I also adjusted the distance of the inner difference with the bottom half of the box and made it a little longer so the box lid has a better fit.

Tutorial Box Video Credit: mathcodeprint
Cube Box: Patricia Wright

Last I added my initials to the box. I couldn’t get the difference tag to play nicely with the text to do an engraving, but that’s okay. It seems like the difference tag is very particular to what order the code needs to be in. I’m still working on trying to understand it. My goals for this was to get a matching lid that can work with it and maybe personalize it. For going with a plan B it still came out great.

//Tutorial for code help from mathcodeprint https://www.youtube.com/watch?v=lPgLZgnbREk

//Base box set up
$fn=50;

difference(){
minkowski(){
cube([30,30,30], center = true);
sphere(1);
}

//Deleting top to eventually open box

translate([0,0,10])cube([35,35,20], center = true);


//Inner compartment

minkowski(){
cube([27,27,20], center = true);
sphere(1);
}


translate([0,0,-1.5]){
linear_extrude(5){
minkowski(){
square([28,28], center = true);
circle(1);
}
}
}
}

//Lid for box. New code for second half of box. Tutorial for code help from mathcodeprint https://www.youtube.com/watch?v=11xHKq7Q-nY

translate([40,0,0])
difference(){
minkowski(){
cube([30,30,30], center = true);
sphere(1);
}

//Deleting top to open lid box

translate([0,0,10])cube([35,35,20], center = true);


//Inner compartment

minkowski(){
cube([27,27,20], center = true);
sphere(1);
}
}

//Making rim for lid
translate([40,0,-0.5])
difference(){
linear_extrude(2){
minkowski(){
square([28,28], center = true);
circle(1);
}
}

translate([0,0,-0.001]){
linear_extrude(3){
minkowski(){
square([27,27], center = true);
circle(1);
}
}
}

}

//Text
translate([50,0,-16])
rotate([0,180])
linear_extrude(0.5){
text("PW");

References

OpenSCAD – Project Enclosure – Part 2 – The Lid by mathcodeprint

Randomness

Object Credit: Patricia Wright
Code credit: mathgrrl

I decided to keep it simple for now with randomness. The code is still difficult for me to understand, but I changed it up. Going for a cherry pie object, maybe even a pizza, or meatballs with out the spaghetti. I don’t know if I can adjust each individual object in the cluster yet, but that could be something to do.

Object Credit: Patricia Wright
Code credit: mathgrrl

I changed the color to red and rotated the group of random objects, and also changed them to spheres. I wanted them to sit on the dish that I made from a cylinder. I changed the amount to the max of 10. I forgot to move the seed number for the first two screenshots.

Object Credit: Patricia Wright
Code credit: mathgrrl

I really want to learn how to make the row of random objects into another shape. Instead of a line I would want to change it into a circle. I also want to figure out how to increase the number further and have it in additional random rings. I don’t thing each ring will be a complete ring once I figure it out. It’ll be random placing spheres on the plate.

Object Credit: Patricia Wright
Code credit: mathgrrl

I think I have to fiddle with the object code at the bottom to change the randomness shape. I’m thinking I have to change the i variable too since it’s connected with the spheres. That’s what I’m thinking about changing with improvements. I’d also like to see if it’s possible to make a random pile of spheres. It’d make for an interesting pie.

//Credit for code: mathgrrl https://geekhaus.com/3Dpuzzles/2020/04/20/adding-randomness-to-your-designs/

///////////////////////////////////////////////////////////////////
// CONTROLLING THE RANDOMNESS

// controls scaling of elements in random subsequence1
// number from 0 (min allowable) to 10 (max allowable)
style1 = 7; 

// controls likelihood of true/false in random subsequence2
// number from 0 (always false) to 10 (always true)
style2 = 10;

///////////////////////////////////////////////////////////////////
// RANDOM SEED

// LET OPENSCAD CHOOSE A RANDOM SEED
random_seed = floor(rands(1,9999999,1)[0]);

// OR TYPE IN A SEED MANUALLY
// Overrides the slider seed unless set to 0
custom_seed = 0;

// set the random seed
seed = (custom_seed==0) ? random_seed : custom_seed;

// Show random seed? (it won't print even if you say yes)
show_seed = "yes"; //[yes:Yes,no:No]

// Create a string to output the random seed
// thank you laird for showing me how to do this with your code
// from http://www.thingiverse.com/thing:188481
labelString=str(floor(seed/1000000)%10, floor(seed/100000)%10, 
                floor(seed/10000)%10, floor(seed/1000)%10, 
                floor(seed/100)%10, floor(seed/10)%10, 
                floor(seed/1)%10);

// Display the random seed in the render (F5 only)
if(show_seed=="yes"){
    translate([0,-50,0]) 
        color("gray")
        %linear_extrude(height=1)
            text(labelString,size=4,halign="center");
}

// Output the random seed in the log
echo(labelString);

///////////////////////////////////////////////////////////////////
// RANDOM SEQUENCES

// construct the main random sequence
// a list of random real numbers in [0,10] based on the chosen seed
maxSteps=30*1;
random = rands(0,10,maxSteps,seed);
echo(random);

// subsequence of 10 items from the main sequence
// weighted by style1
subrandom1 = [for(i=[0:10-1]) random[i]*style1];
echo(subrandom1);

// subsequence of another 10 items from the main sequence
// output as true/false verdicts by comparison to style2
subrandom2 = [for(i=[10:10+10-1]) random[i]<=style2]; 
echo(subrandom2);

///////////////////////////////////////////////////////////////////
// EXAMPLE RENDERS

// example: flat base based on overall size parameters
cylinder(h = 8, r1 = 35, r2 = 45, center = true);
// example: cubes 
// heights based on subrandom1, visibility based on subrandom2
color("red")
rotate(a=[90,0,0])
translate([0,5,-20]){
for (i=[0:10-1]){
    if (subrandom2[i]==true){
        translate([(i-5)*(100/12)+100/24,0,5+subrandom1[i]/2]) 
        sphere(2, $fn=50, subrandom1[i],center=true);
    }
}
}

References

Adding randomness to your designs by mathgrrl

Final Randomness OpenSCAD Project

I’m sorry for the long code below, but I wanted to try and make a mandala type of design in OpenSCAD. This design is 20 arms plus the main arm for a total of 21 arms. The angel for rotation is 15 degrees. The randomness of each dot from the start of the arm is from 5 to 13.

Object Credit: Patricia Wright
Code credit: mathgrrl

I’m happy with the result. The screen shots make it hard to see some circles. Each cylinder has a certain number of randomness attached to the radius. The inner most circle not counting the center dot is radius * randomness of 5. The second dot is radius * randomness of 6.

Object Credit: Patricia Wright
Code credit: mathgrrl

In this screenshot it looks like the dots ripple out in size which is really interesting. It’s hard to see in the second screen shot the last row is a low number of randomness. I believe it’s a randomness of 1 because if it was zero I think it would disappear.

Object Credit: Patricia Wright
Code credit: mathgrrl

It’s hard to see the seed number because I had to zoom out but it’s in the code to display it. This is another one of my favorites because it looks like the start of a ripple effect. With additional arms at an angle of 15 degrees it would fill up the circle.

///////////////////////////////////////////////////////////////////
// CHOOSE ONE RANDOM SEED AND THEN A RANDOM LIST

// LET OPENSCAD CHOOSE A RANDOM SEED
random_seed = floor(rands(1,9999999,1)[0]);

// OR TYPE IN A SEED MANUALLY
// Overrides the slider seed unless set to 0
custom_seed = 0;

// set the random seed
seed = (custom_seed==0) ? random_seed : custom_seed;

// a list of 30 random real numbers in [0,10] based on the chosen seed
// to use these in the code type random[0], random[1], random[2], and so on
maxSteps=30;
random = rands(0,10,maxSteps,seed);

///////////////////////////////////////////////////////////////////
// DISPLAY THE SEED 

// Show random seed? (it won't print even if you say yes)
show_seed = "yes"; //[yes:Yes,no:No]

// Create a string to output the random seed
// thank you laird for showing me how to do this with your code
// from http://www.thingiverse.com/thing:188481
labelString=str(floor(seed/1000000)%10, floor(seed/100000)%10, 
                floor(seed/10000)%10, floor(seed/1000)%10, 
                floor(seed/100)%10, floor(seed/10)%10, 
                floor(seed/1)%10);

// Display the random seed in the render (F5 only)
if(show_seed=="yes"){
    translate([0,-30,0]) 
        color("gray")
        %linear_extrude(height=1)
            text(labelString,size=4,halign="center");
}

// Also output the random seed and the resulting list of random numbers in the log
echo(labelString);
echo(random);

///////////////////////////////////////////////////////////////////
// OK NOW MAKE SOMETHING!
//center of pattern
cylinder(h=1*random[0]+10, r=2*random[1]);
//arm of pattern
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}

//arm 2
rotate([0,0,-15])
translate([-20,-10,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 3
rotate([0,0,-30])
translate([-25,-15,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}

//arm 4
rotate([0,0,-45])
translate([-30,-20,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}

//arm 5
rotate([0,0,-60])
translate([-35,-25,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 6
rotate([0,0,-75])
translate([-40,-30,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 7
rotate([0,0,-90])
translate([-45,-35,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 8
rotate([0,0,-105])
translate([-50,-40,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 9
rotate([0,0,-120])
translate([-55,-45,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 10
rotate([0,0,-135])
translate([-60,-50,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 11
rotate([0,0,-150])
translate([-65,-55,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}

//arm 12
rotate([0,0,-165])
translate([-70,-60,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 13
rotate([0,0,-180])
translate([-75,-65,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 14
rotate([0,0,-195])
translate([-80,-70,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 15
rotate([0,0,-210])
translate([-85,-75,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 16
rotate([0,0,-225])
translate([-90,-80,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 17
rotate([0,0,-240])
translate([-105,-85,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 18
rotate([0,0,-255])
translate([-120,-90,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 19
rotate([0,0,-270])
translate([-135,-95,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}
//arm 20
rotate([0,0,-285])
translate([-150,-110,0]){
translate([15,-25,0]){
  cylinder(h=1*random[0]+10, r=2*random[5]);  
}

translate([25,-45,0]){
  cylinder(h=1*random[0]+10, r=2*random[6]);  
}

translate([45,-65,0]){
  cylinder(h=1*random[0]+10, r=2*random[7]);  
}

translate([75,-85,0]){
  cylinder(h=1*random[0]+10, r=2*random[8]);  
}

translate([105,-105,0]){
  cylinder(h=1*random[0]+10, r=2*random[9]);  
}

translate([145,-125,0]){
  cylinder(h=1*random[0]+10, r=2*random[10]);  
}

translate([185,-145,0]){
  cylinder(h=1*random[0]+10, r=2*random[11]);  
}

translate([225,-165,0]){
  cylinder(h=1*random[0]+10, r=2*random[12]);  
}

translate([265,-185,0]){
  cylinder(h=1*random[0]+10, r=2*random[13]);  
}
}

References

Adding randomness to your designs by mathgrrl