$fn=360; AXLE_DIAMETER=5; BASE_HEIGHT=100; BASE_LOWER_DIAMETER=100; BASE_UPPER_DIAMETER=50; TEST_TUBE_HEIGHT=150; TEST_TUBE_DIAMETER=10; TEST_TUBE_ANGLE=33; TEST_TUBE_SPREAD=90; module testTube(height, diameter) { cylinder(height, diameter, diameter); } module arrangedTestTubes(angle, spread, rotation) { rotate([0, 0, rotation]) { translate([0, spread, 10]) { rotate([angle, 0, 0]) { testTube(TEST_TUBE_HEIGHT, TEST_TUBE_DIAMETER); } } translate([0, -spread, 10]) { rotate([-angle, 0, 0]) { testTube(TEST_TUBE_HEIGHT, TEST_TUBE_DIAMETER); } } translate([spread, 0, 10]) { rotate([0, -angle, 0]) { testTube(TEST_TUBE_HEIGHT, TEST_TUBE_DIAMETER); } } translate([-spread, 0, 10]) { rotate([0, angle, 0]) { testTube(TEST_TUBE_HEIGHT, TEST_TUBE_DIAMETER); } } } } module base(height, lowerDiameter, upperDiameter) { cylinder(height, lowerDiameter, upperDiameter); } module axle(height, diameter) { translate([0, 0, -1]) { cylinder(height, diameter, diameter); } } module centrifuge() { difference() { base(BASE_HEIGHT, BASE_LOWER_DIAMETER, BASE_UPPER_DIAMETER); axle(BASE_HEIGHT + 2, AXLE_DIAMETER); arrangedTestTubes(TEST_TUBE_ANGLE, TEST_TUBE_SPREAD, 0); arrangedTestTubes(TEST_TUBE_ANGLE, TEST_TUBE_SPREAD, 45); } } centrifuge();