$fn=64; // --- Parameters --- cable_diameter = 7; // Inner diameter for the hidden vertical cable wall_thickness = 2.5; // Thickness of the pole walls height = 150; // Total height of the banner pole banner_width = 60; // Width of the banner fabric banner_thickness = 3; // Thickness of the fabric slit_width = 5.5; // Width of the rear slit (slightly smaller than cable to snap in) // --- Derived Dimensions --- pole_outer = cable_diameter + (wall_thickness * 2); crossbar_height = height - 20; fabric_height = crossbar_height + 5; union() { // 1. Vertical Pole (Cable Hider) difference() { // Main pole body cylinder(d=pole_outer, h=height); // Hollow center for the cable translate([0, 0, -1]) cylinder(d=cable_diameter, h=height + 2); // Rear slit to snap over the wall cable translate([-slit_width/2, -pole_outer, -1]) cube([slit_width, pole_outer, height + 2]); } // Top Pole Finial translate([0, 0, height]) cylinder(d1=pole_outer, d2=2, h=8); translate([0, 0, height + 8]) sphere(d=4); // 2. Banner Fabric difference() { // Main fabric block (intersects slightly with pole for manifold mesh) translate([-banner_width/2, pole_outer/2 - 0.5, 0]) cube([banner_width, banner_thickness + 0.5, fabric_height]); // Swallowtail cut at the bottom // Designed to leave two flat feet on the sides for easy, supportless 3D printing translate([0, pole_outer/2 - 1, 0]) hull() { translate([-banner_width/2 + 10, 0, -1]) cube([banner_width - 20, banner_thickness + 2, 1]); translate([0, 0, 25]) cube([0.1, banner_thickness + 2, 0.1]); } } // 3. Top Crossbar // Embedded into the fabric front so it doesn't require supports translate([0, pole_outer/2 + banner_thickness/2, crossbar_height]) rotate([0, 90, 0]) cylinder(d=5, h=banner_width + 4, center=true); // Crossbar Finials translate([-(banner_width + 4)/2, pole_outer/2 + banner_thickness/2, crossbar_height]) sphere(d=7); translate([(banner_width + 4)/2, pole_outer/2 + banner_thickness/2, crossbar_height]) sphere(d=7); // 4. Medieval Shield Emblem translate([0, pole_outer/2 + banner_thickness - 0.5, height/2 - 15]) { // Shield Base hull() { translate([-13, 0, 15]) cube([26, 2, 15]); translate([0, 0, 0]) cube([0.1, 2, 0.1]); } // Raised Cross Detail translate([0, 1.5, 15]) { cube([4, 2, 26], center=true); translate([0, 0, 3]) cube([22, 2, 4], center=true); } } }