$fn=64; // --- Parameters --- staff_height = 200; // Total height of the staff shaft staff_radius = 12; // Radius of the main shaft base_radius = 20; // Radius of the flared bottom base cable_diameter = 6; // Diameter of the cable channel cable_opening = 3.5; // Width of the snap-fit slot for the cable crystal_radius = 18; // Radius of the magic crystal at the top crystal_height = 60; // Total height of the top crystal ring_spacing = 40; // Spacing between decorative grip rings module wizard_staff() { union() { difference() { // Main Body (Shaft + Base + Rings) union() { // Central shaft cylinder(h=staff_height, r=staff_radius); // Flared base for stability and aesthetics cylinder(h=25, r1=base_radius, r2=staff_radius); // Decorative grip rings for(z = [40 : ring_spacing : staff_height - 20]) { translate([0, 0, z]) rotate_extrude() translate([staff_radius, 0, 0]) circle(r=2.5); } // Crystal holder prongs // Positioned at 45-degree angles to avoid the cable channel for(i = [45 : 90 : 315]) { rotate([0, 0, i]) translate([staff_radius - 2.5, 0, staff_height - 10]) rotate([0, 20, 0]) cylinder(h=35, r1=3, r2=1); } } // --- Cable Management Cutouts --- // Vertical cable channel running the entire length channel_offset = staff_radius - cable_diameter/2; translate([channel_offset, 0, -1]) { // The circular hollow for the cable cylinder(h=staff_height + 2, d=cable_diameter); // The snap-fit opening slot extending to the outside translate([0, -cable_opening/2, 0]) cube([base_radius * 2, cable_opening, staff_height + 2]); } // Hollow out the top center (for an LED or cable termination) translate([0, 0, staff_height - 10]) cylinder(h=12, r=staff_radius - 4); // Internal routing hole connecting the vertical channel to the center hollow translate([0, 0, staff_height - 8]) rotate([0, 90, 0]) cylinder(h=staff_radius + 2, d=cable_diameter); } // --- Magic Crystal --- // Intersects with the prongs, 6-sided for easy 3D printing without supports translate([0, 0, staff_height + crystal_height/2 + 2]) { // Top half of the crystal cylinder(h=crystal_height/2, r1=crystal_radius, r2=0, $fn=6); // Bottom half of the crystal rotate([180, 0, 0]) cylinder(h=crystal_height/2, r1=crystal_radius, r2=0, $fn=6); } } } // Render the model wizard_staff();