// Blade Dimensions diameter = 100; // Base diameter height = 100; // Height of the rotor wall_thickness = 6; // Wall thickness tolerance = 2; // Tolerance between stator and rotor number_of_ports = 6; // Number of ports [2:8] port_height = 50; // Height of the port pressure_zone = 0.4; // Define this globally with an appropriate default value mounting_hole_diameter = 4; // Diameter of mounting holes mounting_hole_offset = 20; // Radial distance from center to hole centers number_of_mounting_holes = 4; // Number of mounting holes mounting_hole_bore = 8; // Diameter of mounting holes counterbore round_radius = 4; motor_shaft_diameter = 5; hub_height = 10; motor_width = 20; // Diameter of the motor shaft $fn = 128; // Number of fragments diameter = 100; blade_width = 5; blade_length = diameter; // Blade Height blade_height = 10; // Number of ports/blades number_of_ports = 5; // Pressure zone percentage pressure_zone = 0.4; // 30% of diameter module impeller_blades() { difference() { intersection() { // Column with full diameter cylinder(d = diameter, h = blade_height); // Blades union() { //rotate([180, 180, 180]) for (i = [0:360/number_of_ports:360]) { rotate([0, 0, i - 90]) translate([0, diameter / 2, 0]) rotate([0, 0, 10]) translate([-blade_width, -diameter / 2, 0]) linear_extrude(height = blade_height, twist = 0, slices=360) square([blade_width, blade_length]); } } } // Subtract core cylinder translate([0, 0, -1]) cylinder(d = diameter * pressure_zone, h = blade_height + 2); } } module ports() { radius = diameter / 2; angle = 360 / number_of_ports / 2; rotate([0, 0, 180 / number_of_ports]) for (i = [0:360/number_of_ports:360]) { rotate([0, 0, i]) translate([0, 0, (height - port_height) / 2]) linear_extrude(height = port_height) polygon(concat( [[0, 0]], // Center point [for (j = [0 : $fn]) [radius * cos(angle * j / $fn), radius * sin(angle * j / $fn)]] )); } } // Optional: If you want to render the blades independently for testing impeller_blades(); ports();