$fn = 64; // --- Parameters --- arm_length = 120; // Total length of each arm from the outer corner arm_width = 30; // Width of the clamping arms thickness = 20; // Thickness of the square hole_diameter = 10; // Diameter of holes for clamps or bench dogs hole_spacing = 20; // Spacing between the clamping holes relief_radius = 4; // Inner corner relief radius for sawdust clearance corner_radius = 3; // Rounding radius for the outer edges module woodworking_corner_clamp() { difference() { // Main body: Extruded L-shape with rounded outer corners linear_extrude(height = thickness) { difference() { // Use offset to round outer corners while keeping the inner corner sharp offset(r = corner_radius) { offset(r = -corner_radius) { union() { square([arm_length, arm_width]); square([arm_width, arm_length]); } } } // Sawdust relief cut at the exact inner corner // Ensures perfectly flush seating even if wood edges have tear-out or debris translate([arm_width, arm_width]) circle(r = relief_radius); } } // Clamping holes along the X-axis arm for (x = [arm_width + 20 : hole_spacing : arm_length - 10]) { translate([x, arm_width / 2, -1]) cylinder(h = thickness + 2, d = hole_diameter); } // Clamping holes along the Y-axis arm for (y = [arm_width + 20 : hole_spacing : arm_length - 10]) { translate([arm_width / 2, y, -1]) cylinder(h = thickness + 2, d = hole_diameter); } // Central clamping hole at the corner intersection translate([arm_width / 2, arm_width / 2, -1]) cylinder(h = thickness + 2, d = hole_diameter); // Optional: Chamfer the bottom edges of the holes slightly for easier bolt insertion // (Achieved simply by using a slightly larger cylinder at the very bottom/top if needed, // but kept to straight cylinders here for maximum printability and simplicity). } } // Render the part woodworking_corner_clamp();