Files

99 lines
2.8 KiB
OpenSCAD

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);
}
}
}
}