include include /* [Clamp Specifications] */ // Maximum distance between anvil and fully retracted pad max_opening = 50; // [30:5:100] // Distance from inner frame to clamping centerline throat_depth = 40; // [25:5:80] // Frame beam width (out of plane) frame_thickness = 12; // [8:1:20] // Frame beam height (profile depth) beam_height = 16; // [12:1:24] // I-beam flange thickness flange_thickness = 3.5; // [2:0.5:6] // I-beam web thickness web_thickness = 4.0; // [2:0.5:8] /* [Screw & Hardware] */ screw_diameter = 8; // [8:2:16] screw_pitch = 2.0; // [1.5:0.5:3.0] screw_clearance = 0.4; // [0.2:0.05:0.6] screw_length = 72; // [50:5:110] handle_length = 50; // [35:5:80] handle_diameter = 9; // [7:1:14] ball_diameter = 5.6; // [4:0.2:8] ball_neck = 3.8; // [3:0.2:6] /* [Swivel Pad] */ pad_diameter = 16; // [12:1:25] pad_thickness = 7; // [5:1:12] /* [Display & Colors] */ // Display arrangement layout_mode = "print"; // [print, assembled] frame_color = "#E65100"; // Frame color (Industrial Orange) screw_color = "#37474F"; // Screw & T-handle color (Dark Slate) pad_color = "#FFB300"; // Swivel pad color (Amber Yellow) $fn = 48; // Derived dimensions boss_outer_diameter = screw_diameter + 10; boss_height = 14; anvil_diameter = 16; anvil_height = 6; // Centerline of screw is at X = 0 // Throat depth reaches back to X = -throat_depth // Bottom anvil top is at Y = 0 // Top boss bottom is at Y = max_opening + pad_thickness + 4 module ibeam_profile(h, w, tf, tw, r=1.5) { // 2D I-beam profile cross section centered at [0,0] // h = total height (in plane of bending), w = width (thickness) difference() { rect([h, w], rounding=r); // Left web pocket translate([0, (w - tw)/2 + tw/2]) rect([h - 2*tf, (w - tw)/2 + 0.1], rounding=r/2); // Right web pocket translate([0, -((w - tw)/2 + tw/2)]) rect([h - 2*tf, (w - tw)/2 + 0.1], rounding=r/2); } } module clamp_frame() { top_y = max_opening + pad_thickness + 4; spine_x = -throat_depth; difference() { union() { // Main backbone & arms using continuous curved sweep or hull segments // Lower arm: from spine to anvil hull() { translate([spine_x + beam_height/2, 0, frame_thickness/2]) cube([beam_height, beam_height, frame_thickness], center=true); translate([-beam_height/2, -beam_height/2, frame_thickness/2]) cube([beam_height, beam_height, frame_thickness], center=true); } // Lower corner radius hull() { translate([spine_x, -beam_height/2, 0]) cylinder(r=beam_height/2, h=frame_thickness); translate([spine_x + beam_height/2, -beam_height/2, frame_thickness/2]) cube([beam_height, beam_height, frame_thickness], center=true); translate([spine_x, 0, frame_thickness/2]) cube([beam_height, beam_height, frame_thickness], center=true); } // Spine (vertical column) hull() { translate([spine_x, -beam_height/4, frame_thickness/2]) cube([beam_height, beam_height/2, frame_thickness], center=true); translate([spine_x, top_y + boss_height + beam_height/4, frame_thickness/2]) cube([beam_height, beam_height/2, frame_thickness], center=true); } // Upper corner radius hull() { translate([spine_x, top_y + boss_height, 0]) cylinder(r=beam_height/2, h=frame_thickness); translate([spine_x + beam_height/2, top_y + boss_height, frame_thickness/2]) cube([beam_height, beam_height, frame_thickness], center=true); translate([spine_x, top_y + boss_height - beam_height/4, frame_thickness/2]) cube([beam_height, beam_height, frame_thickness], center=true); } // Upper arm: from spine to top boss hull() { translate([spine_x + beam_height/2, top_y + boss_height/2, frame_thickness/2]) cube([beam_height, beam_height, frame_thickness], center=true); translate([0, top_y + boss_height/2, frame_thickness/2]) cylinder(r=boss_outer_diameter/2, h=frame_thickness, center=true); } // Threaded Boss on upper arm translate([0, top_y + boss_height/2, frame_thickness/2]) rotate([90, 0, 0]) cylinder(r=boss_outer_diameter/2, h=boss_height, center=true); // Anvil Boss on lower arm translate([0, -anvil_height/2, frame_thickness/2]) rotate([90, 0, 0]) cylinder(r=anvil_diameter/2, h=anvil_height, center=true); // Support gusset under anvil hull() { translate([0, -anvil_height, frame_thickness/2]) rotate([90,0,0]) cylinder(r=anvil_diameter/2, h=1, center=true); translate([-beam_height, -beam_height, frame_thickness/2]) cube([beam_height, 2, frame_thickness], center=true); } } // I-beam pockets (recesses on front and back faces) // Recess spine for (side = [-1, 1]) { z_offset = frame_thickness/2 + side * (frame_thickness/2 - flange_thickness/2); pocket_depth = (frame_thickness - web_thickness)/2 + 0.1; // Spine pocket translate([spine_x, (top_y + boss_height)/2, (side > 0 ? frame_thickness - pocket_depth : -0.1)]) cube([beam_height - 2*flange_thickness, top_y + boss_height - beam_height, pocket_depth + 0.1]); // Bottom arm pocket translate([(spine_x - beam_height/2)/2, -beam_height/2 + flange_thickness/2, (side > 0 ? frame_thickness - pocket_depth : -0.1)]) cube([abs(spine_x) - anvil_diameter/2 - 2, beam_height - 2*flange_thickness, pocket_depth + 0.1]); // Top arm pocket translate([(spine_x - beam_height/2)/2, top_y + boss_height/2 - (beam_height - 2*flange_thickness)/2, (side > 0 ? frame_thickness - pocket_depth : -0.1)]) cube([abs(spine_x) - boss_outer_diameter/2 - 2, beam_height - 2*flange_thickness, pocket_depth + 0.1]); } // M8 Internal Thread through top boss translate([0, top_y + boss_height + 1, frame_thickness/2]) rotate([90, 0, 0]) threaded_rod( d = screw_diameter + screw_clearance, l = boss_height + 3, pitch = screw_pitch, internal = true, orient = BACK ); // Anvil flat face cleanup at Y = 0 translate([-50, 0, -10]) cube([100, 20, 40]); } } module lead_screw() { union() { // M8 Threaded Rod Section threaded_rod( d = screw_diameter, l = screw_length, pitch = screw_pitch, bevel1 = true, orient = UP ); // Swivel Ball Joint at tip (Z = -screw_length/2) translate([0, 0, -screw_length/2]) { // Neck cylinder(r=ball_neck/2, h=3, center=false); // Ball translate([0, 0, -ball_diameter/2 + 0.5]) sphere(r=ball_diameter/2); } // T-Handle Transition Hub (at Z = +screw_length/2) translate([0, 0, screw_length/2]) { // Reinforcing collar cylinder(r1=screw_diameter/2 + 0.5, r2=handle_diameter/2, h=4); // T-handle bar translate([0, 0, 4 + handle_diameter/2]) { rotate([0, 90, 0]) cylinder(r=handle_diameter/2, h=handle_length, center=true); // Ergonomic rounded ends for (s = [-1, 1]) { translate([s * handle_length/2, 0, 0]) sphere(r=handle_diameter/2); } } } } } module swivel_pad() { socket_depth = ball_diameter * 0.75; difference() { union() { // Main disc with taper cylinder(r1=pad_diameter/2, r2=pad_diameter/2 - 1, h=pad_thickness - 2); translate([0, 0, pad_thickness - 2]) cylinder(r1=pad_diameter/2 - 1, r2=ball_neck/2 + 1.8, h=2); } // Spherical socket for snap-fit translate([0, 0, pad_thickness - ball_diameter/2 + 0.4]) sphere(r=ball_diameter/2 + 0.25); // Entry channel for ball snap translate([0, 0, pad_thickness - 2]) cylinder(r=ball_neck/2 + 0.35, h=3); // Snap-fit flex relief slits for (a = [0, 90]) { rotate([0, 0, a]) translate([-pad_diameter/2, -0.6, pad_thickness - socket_depth - 1]) cube([pad_diameter, 1.2, socket_depth + 2]); } // Anti-slip waffle grip texture on face (Z = 0) for (gx = [-pad_diameter/2 + 2 : 2.2 : pad_diameter/2 - 2]) { translate([gx, -pad_diameter/2, -0.01]) rotate([-45, 0, 0]) cube([0.8, pad_diameter * 1.5, 0.6]); } for (gy = [-pad_diameter/2 + 2 : 2.2 : pad_diameter/2 - 2]) { translate([-pad_diameter/2, gy, -0.01]) rotate([0, 45, 0]) cube([pad_diameter * 1.5, 0.8, 0.6]); } } } // Layout Selection if (layout_mode == "print") { // Print bed layout: Frame flat, Screw horizontal, Pad upright color(frame_color) translate([0, 0, 0]) clamp_frame(); color(screw_color) translate([28, 40, handle_diameter/2]) rotate([0, 90, 0]) lead_screw(); color(pad_color) translate([28, -10, 0]) swivel_pad(); } else { // Assembled View top_y = max_opening + pad_thickness + 4; screw_z_travel = 25; // clamping position color(frame_color) clamp_frame(); color(screw_color) translate([0, top_y + boss_height/2 + screw_z_travel, frame_thickness/2]) rotate([90, 0, 0]) lead_screw(); color(pad_color) translate([0, top_y + boss_height/2 + screw_z_travel - screw_length/2 - ball_diameter/2 - 1.5, frame_thickness/2]) rotate([-90, 0, 0]) swivel_pad(); }