OpenSCAD
$fn=50;
difference(){
union(){
difference(){
hull(){
translate([100,0,0]) {cylinder(h=10,r=10);}
cylinder(h=10,r=10);}
hull(){
translate([100,0,2]) {cylinder(h=10,r=8);}
translate([0,0,2]) {cylinder(h=10,r=8);}
}
}
translate([50,0,0]) {cylinder(h=20,r=10);}
translate([0,0,-10]) {cylinder(h=12,r=2);}
translate([100,0,-10]) {cylinder(h=12,r=2);}
}
translate([50,0,-1]) {cylinder(h=22,r1=2,r2=5);}
}
hull(){
translate([-10,-1,0]){cube([2,2,10]);}
translate([43,-1,0]){cube([2,2,20]);}
}
hull(){
translate([57,-1,0]){cube([2,2,20]);}
translate([107,-1,0]){cube([2,2,10]);}
}
translate([0,0,0]) {cylinder(h=10,d=5);}
translate([100,0,0]) {cylinder(h=10,d=5);}