ecr = 4; // edge cylinder radius epl = ecr * 0.33; // edge protrusion length epw = ecr * 0.33; // edge protrusion width epn = 13; // edge protrusion number sh = 10; ar = 25; ph = sh * 0.75; // pore height pr = ecr * 4; // pore radius ptl = ecr*1.5; // pore teeth length ptw = epw*1; // pore teeth width ptn = 24; // number of pore teeth xw = 0.35; // extrude width bwl = 80; // bubble wand length bww = 10; // bubble wand width //rotate([-45,45,30]){ { // triangularish thingy translate([0,0,sh/2]) difference(){ cylinder(r=pr + ecr*2.75, h=sh, center=true); cylinder(r=pr + ecr*1.25, h=sh+xw, center=true); for(r = [1:3]){ rotate([0,0,r*120+90]) translate([pr+ecr*2,0,0]) cylinder(r=ecr*2, h=sh+xw, center=true); } } translate([0,0,sh/2-xw/2]) for(r = [0:2]){ for(i = [1:10]){ rotate([0,0,60*i/10-3 + r*120]) translate([pr + ecr*1.25-epl*1/4,0,0]) cube([epl,epw,sh-xw], center=true); } } // triangularish end points translate([0,0,sh/2]) for(r = [1:3]){ for(d = [-20,20]){ rotate([0,0,r*120+d]) { translate([0,pr+ecr*2,0]) { cylinder(r=ecr, h=sh, center=true); for(i = [1:epn]){ rotate([0,0,360*i/epn]) translate([epl/4+ecr,0,0]) cube([epl,epw,sh-xw], center=true); } } } } } // pore translate([0,0,ph/2]){ difference(){ cylinder(r=ar, h=ph, center=true); cylinder(r=pr, h=ph+xw, center=true); } translate([0,0,-xw/2]) for(i = [1:ptn]){ rotate([0,0,360*i/ptn+180/ptn]) translate([pr-ptl*2/5,0,0]) cube([ptl,ptw,ph-xw], center=true); } } //bubble wand end translate([0,-pr-bwl/2-ecr*2.25,ph/2]){ cube([bww,bwl,ph], center=true); translate([0,-bwl/2,0]) cylinder(r=bww/2, h=ph, center=true); } }