$fs=0.2; screw_diam=3.4; extra_radius = 0.1; // OD = outside diameter, corner to corner. m3_nut_od = 6.1; m3_nut_radius = m3_nut_od/2 + 0.2 + extra_radius; m3_washer_radius = 3.5 + extra_radius; // Major diameter of metric 3mm thread. m3_major = 2.85; m3_radius = screw_diam/2; m3_wide_radius = m3_radius + 0.2; separation = 40; // Distance between ball joint mounting faces. offset = 20; // Same as DELTA_EFFECTOR_OFFSET in Marlin. mount_radius = 24.8/2; // Hotend mounting screws, standard would be 25mm. hotend_radius = 9; // Hole for the hotend (J-Head diameter is 16mm). height = 8; cone_r1 = 2.5; cone_r2 = 14; // ptfe holder parameters: plate_base=height/2+5; plate_thick=3; holder_base=plate_base+plate_thick; ptfe_diam=3.9; ptfe_fudge_diam=ptfe_diam+1.5; column_height=10; screw_spacing=ptfe_diam+5; column_width=screw_spacing+7; screw_height=column_height/2; plate_width=(mount_radius+3.5)*2; plate_depth=column_width; // fan mount parameters: fan_wire_radius = 1; fh_length = 15; fh_radius = 3; fh_offset = plate_depth/2; module effector() { difference() { union() { if (do_effector) { cylinder(r=offset-3, h=height, center=true, $fn=60); for (a = [60:120:359]) rotate([0, 0, a]) { rotate([0, 0, 30]) translate([offset-2, 0, 0]) cube([10, 13, height], center=true); for (s = [-1, 1]) scale([s, 1, 1]) { translate([0, offset, 0]) difference() { intersection() { cube([separation, 40, height], center=true); translate([0, -4, 0]) rotate([0, 90, 0]) cylinder(r=10, h=separation, center=true); translate([separation/2-7, 0, 0]) rotate([0, 90, 0]) cylinder(r1=cone_r2, r2=cone_r1, h=14, center=true, $fn=24); } rotate([0, 90, 0]) cylinder(r=m3_radius, h=separation+1, center=true, $fn=12); rotate([90, 0, 90]) cylinder(r=m3_nut_radius, h=separation-24, center=true, $fn=6); } } } } if (do_ptfe) { // PTFE holder base plate: translate([-plate_depth/2, -plate_width/2, plate_base]) cube([plate_depth, plate_width, plate_thick]); // PTFE holder block: translate([0, -column_width/2, holder_base-0.1]) cube([column_width/2, column_width, column_height+0.1]); // fan wire holder block: translate([fh_offset, -(plate_width/2), plate_base+fh_radius]) rotate([-90, 0, 0]) cylinder(r=fh_radius, h=fh_length); } } // hotend recess: translate([0, 0, (-height/2)-0.1]) cylinder(r=hotend_radius, h=(height/2)+0.1); // wider hole for whole ptfe tube (not part of clamp) translate([0, 0, -0.1]) cylinder(r=ptfe_fudge_diam/2, h=holder_base+0.15); translate([0, 0, holder_base]) cylinder(r1=ptfe_fudge_diam/2, r2=ptfe_diam/2, h=(ptfe_fudge_diam-ptfe_diam)/2); // hotend mounting holes translate([0, mount_radius, (-(height/2))-0.1]) cylinder(r=m3_wide_radius, h=height+holder_base+10, $fn=12); translate([0, -mount_radius, (-(height/2))-0.1]) cylinder(r=m3_wide_radius, h=height+holder_base+10, $fn=12); // the PTFE goes here: translate([0, -0.1, 0]) cylinder(r=(ptfe_diam/2),h=holder_base+column_height+0.2); // the PTFE holder screws go here: translate([-0.1, screw_spacing/2, screw_height+holder_base]) rotate([0, 90, 0]) cylinder(r=screw_diam/2, h=(column_width/2)+0.2); translate([-0.1, -screw_spacing/2, screw_height+holder_base]) rotate([0, 90, 0]) cylinder(r=screw_diam/2, h=(column_width/2)+0.2); translate([column_width/2, -screw_spacing/2, screw_height+holder_base]) rotate([0, 90, 0]) cylinder(r=3.3, h=(fh_radius*2)); // the fan holder wire goes here: translate([fh_offset, (-(plate_width/2))-0.1, plate_base+fh_radius]) rotate([-90, 0, 0]) cylinder(r=fan_wire_radius, h=fh_length+0.2); } } if (do_effector && do_ptfe) { translate([0, 0, height/2]) effector(); } else if (do_effector) { translate([0, 0, height/2]) rotate([180,0,0]) effector(); } else { translate([0, 0, plate_base]) effector(); }