99 lines
2.8 KiB
OpenSCAD
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);
|
|
}
|
|
}
|
|
}
|
|
} |