OpenSCAD
$fn=50;
difference(){
minkowski(){
sphere(1);
hull(){
cylinder(h=1,d=25,center=true);
translate([100,0,0]){cylinder(h=1,d=25,center=true);}
translate([50,30,0]){cylinder(h=1,d=20,center=true);}
translate([50,-30,0]){cylinder(h=1,d=20,center=true);}
}
}translate([50,0,-4]){cylinder(h=8,d=2);}
}
difference(){
translate([0,0,-20]){cylinder(h=25,d=18);}
translate([0,0,-21]){cylinder(h=2,d=5);}
}
difference(){
translate([100,0,-20]){cylinder(h=25,d=18);}
translate([100,0,-21]){cylinder(h=2,d=5);}
}
translate([0,-95,5]){
difference(){
translate([0,100,0]){
translate([90,-10,-1.5]){cube([10,10,4]);}
difference(){
minkowski(){
sphere(7);
union(){
translate([0,-10,-1.5+13]){cube([100,10,20]);}
translate([0,-10,-1.5]){cube([10,10,20]);}
translate([90,-10,-1.5]){cube([10,10,20]);}
}
}
translate([0,-15,-16]){cube([120,20,10]);}
}
}
for (i=[0:3]) {
translate([-7,105-4,8*i]){
rotate([45,0,0]){cube([114,14,2]);}} translate([-7,85-7,8*i+10]){
rotate([-45,0,0]){cube([114,14,2]);}}
}
minkowski(){
cylinder(h=30,d=2);
union(){
translate([0,95-1,10]){cube([100,2,30]);}
translate([+2,95-3,10]){cube([40,6,30]);}
translate([60-2,95-3,10]){cube([40,6,30]);}
translate([50,95+0,0]){cylinder(h=40,r1=2,r2=4.5);}
}
}
}
}