diameter = 140; leg_width = 5; leg_height = 10; deflector_width = 10; center_empty_diameter = 30; num_rings = 4; base_height = 3; spike_top_diameter = 1; spike_height = 10; spike_spacing = 10; $fn = 150; epsilon = 0.1; legs(diameter, leg_height, leg_width, deflector_width, center_empty_diameter) base(diameter, base_height, leg_width, num_rings) for (i = [1 : num_rings]) { ring_offset = diameter / num_rings; spikes((ring_offset * i) - leg_width, spike_height, leg_width, spike_top_diameter, spike_spacing); } module legs(diameter, height, leg_width, curve_width, center_empty_diameter) { color("yellow") union() { length = (diameter - center_empty_diameter) / 2; width = leg_width + curve_width; for (i = [0, 90, 180, 270]) { rotate([0, 0, i]) { translate([-width + (leg_width / 2), center_empty_diameter / 2, 0]) { difference() { cube([width, length, height]); translate([0, -epsilon, height]) { rotate([-90, 0, 0]) { cylinder(r=curve_width, h=length + 2 * epsilon); } } } } } } } translate([0, 0, height]) children(); } module base(diameter, height, width, num_rings) { color("green") union() { ring_offset = diameter / num_rings; for (i = [1 : num_rings]) { ring(ring_offset * i, height, width); } intersection() { inner_base(diameter, height, width); x(diameter, height, width); } } translate([0, 0, height]) children(); } module ring(diameter, height, width) { difference() { cylinder(h=height, d=diameter); inner_base(diameter, height, width); } } module inner_base(diameter, height, width) { translate([0, 0, -epsilon]) { cylinder(h=height + (epsilon * 2), d=diameter - (width * 2)); } } module x(diameter, height, width) { translate([-diameter / 2, -width / 2, 0]) { cube([diameter, width, height]); } rotate([0, 0, 90]) { translate([-diameter / 2, -width / 2, 0]) { cube([diameter, width, height]); } } } module spikes(diameter, height, bottom_width, top_width, spacing) { circumference = diameter * PI; spikes = floor(circumference / (bottom_width + spacing)); color("blue") for (i = [0 : spikes - 1]) { rotate([0, 0, i * (360 / spikes)]) { translate([diameter / 2, 0, 0]) { cylinder(h=height, d1=bottom_width, d2=top_width); } } } }