use // Body parameters length_above = 25; top_diameter = 11.6; // Original: 11.6 mm pinch_length = 8; pinch_gap = 1; pinch_diameter_difference = 0.5; pinch_minimum_diameter = 7; screw_outer_diameter = 12; screw_inner_diameter = 8.5; screw_start_height = 9; screw_pitch = ThreadPitch(screw_outer_diameter); // Tolerances for threads thread_gap = 0.3; // Pen hole pen_hole_diameter = 6.1; nut_bottom_diameter = 15; nut_top_diameter = 10; nut_knurl_height = 10; // > screw_thread_length nut_knurl_size = 0.5; nut_knurl_count = 36; nut_thread_extend = 1; hook_width_shrink = 0.3; // Shrink original size hook_squeeze = 0.25; $fn = 48; $eps = 0.1; screw_thread_length = length_above - pinch_length - screw_start_height; module holder() { difference() { union() { // Base shape rotate_extrude() polygon([ [0, -4.8], [9.25 / 2, -4.8], [9.55 / 2, -4.8], [9.55 / 2, -hook_squeeze], [top_diameter / 2, (top_diameter - 9.55) / 2 - hook_squeeze], // 45° draft [top_diameter / 2, screw_start_height - nut_thread_extend], [screw_inner_diameter / 2, screw_start_height - nut_thread_extend], [screw_inner_diameter / 2, length_above - pinch_length], [pinch_minimum_diameter / 2 + pinch_diameter_difference / 4, length_above], [0, length_above] ]); // Retention hooks intersection() { rotate_extrude() polygon([ [9.55 / 2, -4.8], [11.3 / 2, (11.3 - 9.55) / 2 - 4.8], [11.3 / 2, 2.4 - 4.8], [9.55 / 2 + 0.3, 2.4 - 4.8], [9.55 / 2, 2.4 - 0.3 - 4.8] ]); cube([20, 4.5 - hook_width_shrink, length_above + 4.8], true); } // Outer thread translate([0, 0, screw_start_height - nut_thread_extend]) ScrewThread(screw_outer_diameter - thread_gap / 2, screw_thread_length + nut_thread_extend, pitch = screw_pitch); } // Pen hole union() { translate([0, 0, -4.8 - $eps]) cylinder(d = pen_hole_diameter, h = length_above + 4.8 - pinch_length + 2 * $eps); translate([0, 0, length_above - pinch_length]) cylinder(h = pinch_length + $eps, d1 = pen_hole_diameter, d2 = pen_hole_diameter - pinch_diameter_difference / 2); } for(angle = [0, 90]) { translate([0, 0, length_above + $eps]) rotate([-90, 0, angle]) linear_extrude(screw_outer_diameter + $eps, center = true) polygon([ [pinch_gap / 2, 0], [0, pinch_length + $eps], [-pinch_gap / 2, 0] ]); } } } module nut() { ScrewHole(screw_outer_diameter + thread_gap / 2, screw_thread_length + nut_thread_extend, pitch=screw_pitch) rotate_extrude() polygon([ [screw_inner_diameter / 2, 0], [nut_bottom_diameter / 2, 0], [nut_bottom_diameter / 2, nut_knurl_height], [nut_top_diameter / 2, screw_thread_length + pinch_length], [pinch_minimum_diameter / 2, screw_thread_length + pinch_length], [screw_outer_diameter / 2, screw_thread_length], [screw_inner_diameter / 2, screw_thread_length], ]); for(i = [0:nut_knurl_count - 1]) { rotate([0, 0, i * 360 / nut_knurl_count]) translate([-nut_knurl_size / 2, nut_bottom_diameter / 2 - nut_knurl_size / 2, 0]) cube([nut_knurl_size, nut_knurl_size, nut_knurl_height]); } } // nut(); holder(); //difference() { // union() { // holder(); // translate([0, 0, screw_start_height]) // nut(); // } // cube([100, 100, 100]); //}