--- /dev/null
+eps = 0.01;
+infty = 1000;
+
+motor_diam = 18;
+wall = 1.5;
+
+cyl_h = 30;
+clip_angle = 40;
+
+module fin() {
+ assign(h1 = cyl_h, h2 = 20, h_off = 50, w = 30, fin_w = 1.0)
+ translate([0, -fin_w/2, 0])
+ hull() {
+ cube([eps, fin_w, h1]);
+ translate([w, 0, h_off])
+ cube([eps, fin_w, h2]);
+ };
+};
+
+module body() {
+ difference() {
+ cylinder(r = motor_diam/2 + wall, h = cyl_h);
+ translate([0, 0, -infty/2])
+ cylinder(r = motor_diam/2, h = infty);
+ for (a = [-clip_angle/2, clip_angle/2])
+ rotate([0, 0, a])
+ translate([0, -wall/2, cyl_h/2])
+ cube([infty, wall, infty]);
+ };
+
+ for (a = [60, 180, 300]) {
+ rotate([0, 0, a])
+ translate([motor_diam/2 + wall/2, 0, 0])
+ fin();
+ };
+
+ translate([motor_diam/2 + wall + 3, 0, 0])
+ difference() {
+ union() {
+ cylinder(r = 3 + wall, h = 5);
+ translate([-3 -wall, -3 -wall, 0])
+ cube([3 + wall, 6 + 2*wall, 5]);
+ };
+ translate([0, 0, -infty/2])
+ cylinder(r = 3, h = infty);
+ };
+};
+
+body();
+