// Two-Piece Split Ring Tube Clamp for 25 mm OD Tube // With M4 clamping flanges and slotted mounting foot /* [General Settings] */ // Display mode part_display = "both"; // [both:Both Halves (Side-by-Side), assembled:Assembled, lower:Lower Half Only, upper:Upper Half Only] // Explode distance when assembled explode_distance = 0; // [0:1:50] // Spacing between halves when displayed side-by-side part_spacing = 68; // [40:1:120] /* [Tube Clamp Dimensions] */ // Outer diameter of the tube to be clamped tube_diameter = 25.0; // [10:0.5:60] // Wall thickness around the tube wall_thickness = 4.0; // [2:0.5:10] // Width (depth) of the clamp along tube axis clamp_width = 12.0; // [6:1:40] // Clamping gap between halves for tight compression clamping_gap = 1.0; // [0:0.1:3] /* [Flange & Clamping Bolts] */ // Clamping bolt hole diameter (4.5mm for M4) flange_hole_diameter = 4.5; // [3:0.1:8] // Distance from tube outer surface to bolt hole center flange_hole_offset = 8.0; // [4:0.5:20] // Flange thickness (height of clamping ears) flange_thickness = 5.0; // [3:0.5:10] // Outer margin beyond the bolt hole center flange_edge_margin = 4.5; // [2:0.5:10] // Smooth fillet radius on flange corners flange_corner_radius = 2.0; // [0:0.5:5] /* [Mounting Foot (Lower Half)] */ // Total width of the mounting foot foot_width = 64.0; // [35:1:100] // Thickness of the mounting foot plate foot_thickness = 4.0; // [2:0.5:10] // Foot depth along tube axis foot_depth = 12.0; // [6:1:40] // Width of the mounting slots (4.5mm for M4) slot_width = 4.5; // [3:0.1:8] // Total length of the mounting slots slot_length = 9.0; // [4.5:0.5:20] // Center-to-center distance between mounting slots slot_spacing = 46.0; // [20:1:80] /* [Colors] */ lower_color = "SteelBlue"; upper_color = "SkyBlue"; fastener_color = "LightGray"; /* [Quality] */ $fn = 90; // Derived parameters r_inner = tube_diameter / 2; r_outer = r_inner + wall_thickness; hole_x = r_inner + flange_hole_offset; flange_max_x = hole_x + flange_edge_margin; half_gap = clamping_gap / 2; // --- Main Assembly Logic --- if (part_display == "both") { // Show lower half flat on bed and upper half side-by-side translate([-part_spacing / 2, 0, 0]) color(lower_color) lower_clamp_half(); translate([part_spacing / 2, 0, 0]) color(upper_color) upper_clamp_half(); } else if (part_display == "assembled") { translate([0, 0, explode_distance]) color(upper_color) upper_clamp_half(); translate([0, 0, -explode_distance]) color(lower_color) lower_clamp_half(); } else if (part_display == "lower") { color(lower_color) lower_clamp_half(); } else if (part_display == "upper") { color(upper_color) upper_clamp_half(); } // --- Component Modules --- // Upper Clamp Half (with flanges on both sides) module upper_clamp_half() { difference() { // Outer body linear_extrude(height = clamp_width, center = true) { difference() { union() { // Semicircular top arch intersection() { circle(r = r_outer); translate([-r_outer - 5, half_gap]) square([2 * r_outer + 10, r_outer + 5]); } // Left flange flange_2d_profile(side = -1, upper = true); // Right flange flange_2d_profile(side = 1, upper = true); } // Inner tube clearance circle(r = r_inner); } } // Flange bolt holes (left and right) translate([-hole_x, 0, 0]) cylinder(d = flange_hole_diameter, h = 3 * clamp_width, center = true); translate([hole_x, 0, 0]) cylinder(d = flange_hole_diameter, h = 3 * clamp_width, center = true); // Clamping gap split plane cut translate([-flange_max_x - 5, -r_outer - 10, -clamp_width]) cube([2 * flange_max_x + 10, r_outer + 10 + half_gap, 2 * clamp_width + 5]); } } // Lower Clamp Half (with flanges and flat mounting foot) module lower_clamp_half() { foot_y_top = -r_outer; foot_y_bottom = foot_y_top - foot_thickness; difference() { union() { // Main clamp ring body and flanges linear_extrude(height = clamp_width, center = true) { difference() { union() { // Semicircular bottom arch intersection() { circle(r = r_outer); translate([-r_outer - 5, -r_outer - 5]) square([2 * r_outer + 10, r_outer + 5 - half_gap]); } // Left flange flange_2d_profile(side = -1, upper = false); // Right flange flange_2d_profile(side = 1, upper = false); // Gusset/support transition from clamp ring down to flat foot polygon(points = [ [-r_outer * 0.95, -r_outer * 0.3], [-foot_width / 2 + 3, foot_y_top], [foot_width / 2 - 3, foot_y_top], [r_outer * 0.95, -r_outer * 0.3] ]); } // Inner tube bore circle(r = r_inner); } } // Flat mounting foot plate translate([-foot_width / 2, foot_y_bottom, -foot_depth / 2]) rounded_cube_xy([foot_width, foot_thickness, foot_depth], r = 2.0); } // Flange bolt holes (left and right) translate([-hole_x, 0, 0]) cylinder(d = flange_hole_diameter, h = 3 * clamp_width, center = true); translate([hole_x, 0, 0]) cylinder(d = flange_hole_diameter, h = 3 * clamp_width, center = true); // Clamping gap split cut translate([-flange_max_x - 5, -half_gap, -clamp_width]) cube([2 * flange_max_x + 10, r_outer + 10, 2 * clamp_width + 5]); // Tube inner bore clean clearance cylinder(r = r_inner, h = 3 * clamp_width, center = true); // Mounting Foot Slots (two Ø4.5 mm slots) translate([-slot_spacing / 2, foot_y_top + 5, 0]) rotate([90, 0, 0]) linear_extrude(height = foot_thickness + 10) hull() { translate([- (slot_length - slot_width) / 2, 0]) circle(d = slot_width); translate([ (slot_length - slot_width) / 2, 0]) circle(d = slot_width); } translate([slot_spacing / 2, foot_y_top + 5, 0]) rotate([90, 0, 0]) linear_extrude(height = foot_thickness + 10) hull() { translate([- (slot_length - slot_width) / 2, 0]) circle(d = slot_width); translate([ (slot_length - slot_width) / 2, 0]) circle(d = slot_width); } } } // 2D Flange Ear Profile module flange_2d_profile(side = 1, upper = true) { x_dir = side; // 1 for right, -1 for left y_dir = upper ? 1 : -1; hull() { // Base connection to clamp cylinder translate([x_dir * (r_inner + 1), y_dir * half_gap]) square([1, flange_thickness]); // Outer rounded tip of flange translate([x_dir * (flange_max_x - flange_corner_radius), y_dir * (half_gap + flange_thickness - flange_corner_radius)]) circle(r = flange_corner_radius); translate([x_dir * (flange_max_x - flange_corner_radius), y_dir * (half_gap + flange_corner_radius)]) circle(r = flange_corner_radius); } } // Helper: 3D box with rounded corners in X-Z plane module rounded_cube_xy(size, r = 2) { x = size[0]; y = size[1]; z = size[2]; hull() { translate([r, 0, r]) rotate([-90, 0, 0]) cylinder(r = r, h = y); translate([x - r, 0, r]) rotate([-90, 0, 0]) cylinder(r = r, h = y); translate([r, 0, z - r]) rotate([-90, 0, 0]) cylinder(r = r, h = y); translate([x - r, 0, z - r]) rotate([-90, 0, 0]) cylinder(r = r, h = y); } }