showAssembled=1; $fn=20; flagHeight=20; flagWidth=29; flagDepth=10; flagThickness=1.5; baseThickness=4; chainHolderDiameter=4; gutterHeight=5; gutterWidth=4; // slice it for printing if (showAssembled) { wholeModel(); } else { translate([0,0,baseThickness]) rotate([180,0,180]) difference(){ wholeModel(); translate([-50,-50,baseThickness]) cube(100); } translate([-20,0,-baseThickness]) difference(){ wholeModel(); translate([-50,-50,-100+baseThickness]) cube(100); } } module wholeModel(){ difference() { union() { translate([0,-gutterWidth/2,gutterHeight/2-(gutterHeight-1)]){ cube([flagDepth,flagWidth-gutterWidth,gutterHeight-2], center=true); } translate([0,-gutterWidth,(flagHeight-gutterHeight)/2]){ cube([flagDepth,flagWidth,flagHeight-gutterHeight], center=true); } translate([0,-(flagWidth+20)/2,baseThickness/2]){ difference(){ cube([flagDepth,20,baseThickness], center=true); translate([0,0,0]) cylinder(h=baseThickness+1,r=2.5,center=true); } } } // thin flag /*translate([-flagThickness,flagWidth*.25,(flagHeight-gutterHeight)/2-1]){ cube([flagDepth,flagWidth,flagHeight], center=true); }*/ // screw hole translate([0,-flagWidth*.45,flagHeight/2]) rotate([0,0,0]) cylinder(h=flagHeight+1,d=2.3, center=true); } } module chainHolder() { translate([-flagDepth/3,-flagWidth/2+2,0]) rotate([0,90,0]) cylinder(h=flagDepth/2+1,d=chainHolderDiameter, center=true); translate([flagDepth/3,-flagWidth/2+2,0]) rotate([0,90,0]) cylinder(h=flagDepth/2+1,d=chainHolderDiameter, center=true); translate([0,-flagWidth/2+2,0]) rotate([0,90,0]) cylinder(h=flagDepth,d=1, center=true); }