include include /* [Clamp Dimensions] */ opening_capacity = 50; // [30:5:100] Maximum jaw opening (mm) throat_depth = 40; // [25:5:80] Throat depth from screw centerline (mm) frame_thickness = 14; // [10:1:22] Frame out-of-plane thickness / width (mm) frame_beam_height = 14; // [10:1:25] Frame beam profile depth (mm) flange_depth = 2.5; // [1.5:0.5:5] I-beam recess depth (mm) flange_wall = 2.5; // [1.5:0.5:5] I-beam perimeter wall thickness (mm) /* [Screw & Drive] */ screw_diameter = 8; // [8:1:14] Screw outer diameter (mm) screw_pitch = 2.0; // [1.5:0.5:3.0] Thread pitch (mm) thread_clearance = 0.3; // [0.1:0.05:0.6] Clearance on internal threads (mm) screw_total_length = 72; // [50:2:120] Total length of threaded section (mm) handle_type = "T-bar"; // [T-bar, Knob] Handle style handle_width = 46; // [30:2:70] Width of T-handle (mm) /* [Swivel Pad] */ pad_diameter = 16; // [12:1:25] Diameter of clamping pad (mm) pad_thickness = 6; // [4:1:10] Thickness of clamping pad (mm) ball_joint_diameter = 5.5; // [4.0:0.5:8.0] Swivel ball joint diameter (mm) /* [Display & Colors] */ view_mode = "print"; // [print: Print Layout (Flat), assembled: Assembled View] frame_color = "SteelBlue"; screw_color = "Gold"; handle_color = "DarkSlateGray"; pad_color = "OrangeRed"; $fn = 48; // Derived geometry constants boss_od = max(18, screw_diameter + 10); boss_len = 16; anvil_diameter = 16; anvil_height = 8; frame_inner_x = throat_depth; frame_inner_y = opening_capacity + 12; // Extra travel room for screw retraction frame_outer_x = frame_inner_x + frame_beam_height; frame_outer_y = frame_inner_y + 2 * frame_beam_height; // ========================================== // Master Assembly / Layout // ========================================== if (view_mode == "assembled") { // Frame color(frame_color) c_frame(); // Screw & Handle positioned in clamping mode clamping_pos = opening_capacity * 0.45; // Screw extended partly translate([0, frame_inner_y / 2 + boss_len / 2 - clamping_pos, 0]) { color(screw_color) screw_shaft(); translate([0, screw_total_length / 2 + 7, 0]) color(handle_color) t_handle(); translate([0, -screw_total_length / 2 - 3.5, 0]) rotate([0, 10, 0]) // slight tilt to illustrate swivel color(pad_color) swivel_pad(); } } else { // Print Layout: flat and ready for slicing // 1. Frame lying flat on XY color(frame_color) translate([0, 0, frame_thickness / 2]) c_frame(); // 2. Screw standing or lying flat color(screw_color) translate([frame_outer_x + 18, 0, screw_diameter / 2 + 0.5]) rotate([90, 0, 0]) screw_shaft(); // 3. T-Handle flat on bed color(handle_color) translate([frame_outer_x + 36, -15, 6]) rotate([0, 0, 90]) t_handle(); // 4. Swivel Pad flat with flat face on bed color(pad_color) translate([frame_outer_x + 36, 25, pad_thickness / 2]) rotate([180, 0, 0]) swivel_pad(); } // ========================================== // Frame Module // ========================================== module c_frame() { difference() { union() { // Main C-body extrusion with rounded outside corners linear_extrude(height = frame_thickness, center = true, convexity = 10) { difference() { // Outer rounded hull offset(r = 4) offset(delta = -4) { polygon(points = [ [-boss_od / 2 + 2, frame_inner_y / 2 + boss_len], [frame_outer_x, frame_inner_y / 2 + boss_len], [frame_outer_x, -frame_inner_y / 2 - anvil_height], [-anvil_diameter / 2, -frame_inner_y / 2 - anvil_height], [-anvil_diameter / 2, -frame_inner_y / 2], [frame_inner_x, -frame_inner_y / 2 + 6], [frame_inner_x, frame_inner_y / 2 - 6], [-boss_od / 2 + 2, frame_inner_y / 2] ]); } // Throat opening cutout polygon(points = [ [-boss_od, frame_inner_y / 2], [frame_inner_x, frame_inner_y / 2], [frame_inner_x, -frame_inner_y / 2], [-anvil_diameter, -frame_inner_y / 2] ]); } } // Upper threaded boss reinforcement translate([0, frame_inner_y / 2 + boss_len / 2, 0]) rotate([90, 0, 0]) cylinder(h = boss_len, d = boss_od, center = true); // Lower anvil pad (fixed jaw) translate([0, -frame_inner_y / 2 - anvil_height / 2, 0]) rotate([90, 0, 0]) cylinder(h = anvil_height, d = anvil_diameter, center = true); } // Internal M8 Lead Screw Thread in upper boss translate([0, frame_inner_y / 2 + boss_len + 1, 0]) rotate([90, 0, 0]) threaded_rod( d = screw_diameter + thread_clearance * 2, l = boss_len + 4, pitch = screw_pitch, internal = true, orient = BACK ); // I-Beam recess on TOP face (+Z) translate([0, 0, frame_thickness / 2 - flange_depth / 2 + 0.01]) i_beam_cutout(); // I-Beam recess on BOTTOM face (-Z) translate([0, 0, -frame_thickness / 2 + flange_depth / 2 - 0.01]) i_beam_cutout(); // Chamfer on anvil clamping surface translate([0, -frame_inner_y / 2, 0]) rotate([90, 0, 0]) cylinder(h = 0.8, d1 = anvil_diameter + 1, d2 = anvil_diameter - 1, center = true); } } // Recess cutout for I-beam cross-section module i_beam_cutout() { linear_extrude(height = flange_depth + 0.02, center = true) { offset(r = -flange_wall) { polygon(points = [ [boss_od / 2 - 1, frame_inner_y / 2 + boss_len - 2], [frame_outer_x - 1, frame_inner_y / 2 + boss_len - 2], [frame_outer_x - 1, -frame_inner_y / 2 - anvil_height + 2], [anvil_diameter / 2 - 1, -frame_inner_y / 2 - anvil_height + 2], [anvil_diameter / 2 - 1, -frame_inner_y / 2 + 2], [frame_inner_x, -frame_inner_y / 2 + 8], [frame_inner_x, frame_inner_y / 2 - 8], [boss_od / 2 - 1, frame_inner_y / 2 + 2] ]); } } } // ========================================== // Screw Shaft Module // ========================================== module screw_shaft() { union() { // Main Threaded Section threaded_rod( d = screw_diameter, l = screw_total_length, pitch = screw_pitch, orient = BACK ); // Top collar connecting to handle translate([0, screw_total_length / 2 + 3, 0]) rotate([90, 0, 0]) cylinder(h = 6, d = screw_diameter + 2, center = true); // Hex or squared keyed stud for handle press-fit/lock translate([0, screw_total_length / 2 + 7, 0]) rotate([90, 0, 0]) cylinder(h = 4, d = screw_diameter, $fn = 6, center = true); // Ball joint neck & ball at screw tip translate([0, -screw_total_length / 2, 0]) { // Neck rotate([90, 0, 0]) cylinder(h = 3, d = ball_joint_diameter * 0.55, center = false); // Ball joint translate([0, -3 - ball_joint_diameter / 2, 0]) sphere(d = ball_joint_diameter); } } } // ========================================== // T-Handle Module // ========================================== module t_handle() { difference() { union() { // Central hub cylinder(h = 12, d = screw_diameter + 5, center = true); // Crossbar wings hull() { translate([-handle_width / 2 + 4, 0, 0]) sphere(d = 8); translate([handle_width / 2 - 4, 0, 0]) sphere(d = 8); cylinder(h = 9, d = screw_diameter + 4, center = true); } // Textured grip ridges on ends for (side = [-1, 1]) { translate([side * (handle_width / 2 - 4), 0, 0]) sphere(d = 9); } } // Hex socket to lock onto screw shaft cylinder(h = 13, d = screw_diameter + 0.3, $fn = 6, center = true); // Ergonomic thumb scallops translate([0, 0, 6]) rotate([0, 90, 0]) cylinder(h = handle_width + 2, d = 4, center = true); } } // ========================================== // Swivel Pad Module // ========================================== module swivel_pad() { difference() { union() { // Main circular pad body with rounded outer edge cylinder(h = pad_thickness, d = pad_diameter, center = true); // Gripping knurled face ridges on the front clamping face for (i = [-3:1:3]) { translate([i * 2, 0, pad_thickness / 2]) cube([0.8, pad_diameter * 0.85, 0.6], center = true); } } // Chamfer outer rim translate([0, 0, pad_thickness / 2]) rotate_extrude() translate([pad_diameter / 2, 0, 0]) circle(r = 0.8); // Spherical socket for ball joint with snap-fit opening translate([0, 0, -pad_thickness / 2 + 2.8]) { // Ball cavity with clearance sphere(d = ball_joint_diameter + 0.35); // Entry funnel / snap neck translate([0, 0, -3]) cylinder(h = 4, d1 = ball_joint_diameter * 0.75, d2 = ball_joint_diameter * 0.65, center = true); // Expansion relief slits for easy snap-on action for (a = [0, 90]) { rotate([0, 0, a]) cube([ball_joint_diameter * 1.6, 0.9, 6], center = true); } } } }