// Parametric D-Shaped Locking Carabiner (Keychain Replica) // Inspired by Petzl Am'D Ball-Lock Carabiner /* [Dimensions] */ // Total overall length of the carabiner (mm) total_length = 60; // [40:1:120] // Overall width of the carabiner (mm) total_width = 37; // [25:1:80] // Frame bar thickness / diameter (mm) frame_thickness = 5.2; // [3:0.2:10] // Gate locking sleeve outer diameter (mm) sleeve_diameter = 7.8; // [5:0.2:14] /* [Features] */ // Add keychain ring hole in the spine keychain_hole = true; // Keychain hole inner diameter (mm) keychain_hole_diameter = 3.5; // [2:0.5:6] /* [Colors] */ frame_color = "#C0C5C8"; // Metallic Silver/Grey gate_color = "#D8DCE0"; // Bright Aluminum sleeve_color = "#222222"; // Matte Black ball_color = "#00C853"; // Bright Safety Green pin_color = "#D4AF37"; // Brass / Silver Pin /* [Quality] */ $fn = 48; // Scale factors relative to nominal 60x37 design scale_x = total_width / 37; scale_y = total_length / 60; scale_z = frame_thickness / 5.2; module carabiner_frame_2d() { // 2D profile matching asymmetric D-shape difference() { // Outer perimeter hull() { // Spine top curve translate([-11 * scale_x, 19 * scale_y]) circle(r = 7.5 * scale_x); // Spine bottom curve translate([-11 * scale_x, -19 * scale_y]) circle(r = 7.5 * scale_x); // Top basket outer nose translate([11 * scale_x, 18 * scale_y]) circle(r = 7.5 * scale_x); // Bottom basket outer hinge translate([8 * scale_x, -20 * scale_y]) circle(r = 6.5 * scale_x); // Spine outward bulge translate([-13 * scale_x, 0]) circle(r = 6.0 * scale_x); } // Inner cutout hull() { // Top inner basket translate([7 * scale_x, 16 * scale_y]) circle(r = 4.5 * scale_x); // Spine top inner translate([-8 * scale_x, 14 * scale_y]) circle(r = 4.0 * scale_x); // Spine bottom inner translate([-7 * scale_x, -14 * scale_y]) circle(r = 4.0 * scale_x); // Bottom inner rope basket translate([4 * scale_x, -16 * scale_y]) circle(r = 4.5 * scale_x); // Gate area inner clearance translate([7 * scale_x, 0]) circle(r = 4.5 * scale_x); } } } // 3D Frame with rounded profile (minkowski with small sphere / round cross-section) module rounded_frame() { t = frame_thickness; // Base extrusion with bevel/rounding intersection() { // Primary 2.5D hull linear_extrude(height = t, center = true, convexity = 10) carabiner_frame_2d(); // Edge rounding profile via scaling squashed sphere or side-profile mask union() { // Frame body with rounded edges hull() { translate([0, 0, 0]) linear_extrude(height = t - 1.6 * scale_z, center = true, convexity = 10) carabiner_frame_2d(); linear_extrude(height = t, center = true, convexity = 10) offset(r = -0.8 * scale_x) carabiner_frame_2d(); } } } } module carabiner_frame() { difference() { rounded_frame(); // Gate opening cut (where gate mechanism sits) translate([11 * scale_x, 0, 0]) rotate([0, 0, -4]) cube([15 * scale_x, 31 * scale_y, t_cut], center = true); // Keychain hole in top corner of spine if enabled if (keychain_hole) { translate([-13 * scale_x, 20 * scale_y, 0]) cylinder(h = frame_thickness * 2, d = keychain_hole_diameter, center = true); } // Spine I-beam style lightweight recessed groove / branding recess translate([-16.5 * scale_x, 0, frame_thickness / 2]) cube([2 * scale_x, 24 * scale_y, 0.8 * scale_z], center = true); translate([-16.5 * scale_x, 0, -frame_thickness / 2]) cube([2 * scale_x, 24 * scale_y, 0.8 * scale_z], center = true); } // Top Keylock Nose Hood (carabiner nose that mates with gate) color(frame_color) translate([10.2 * scale_x, 15.5 * scale_y, 0]) rotate([0, 0, -4]) { difference() { cylinder(r = 3.2 * scale_x, h = frame_thickness, center = true); // Keylock slot cut translate([-2 * scale_x, -1.5 * scale_y, 0]) cube([4 * scale_x, 4 * scale_y, frame_thickness * 1.1], center = true); } } // Bottom Hinge Pivot Lug color(frame_color) translate([8.2 * scale_x, -17.5 * scale_y, 0]) rotate([0, 0, -4]) { cylinder(r = 3.2 * scale_x, h = frame_thickness, center = true); } } t_cut = frame_thickness * 2.5; // Gate barrel & lock sleeve module locking_gate() { gate_angle = -4; // slight tilt matching Am'D gate line gate_center_x = 9.4 * scale_x; gate_center_y = -0.5 * scale_y; gate_len = 31 * scale_y; sleeve_len = 19 * scale_y; sleeve_r = sleeve_diameter / 2; gate_r = 2.4 * scale_x; translate([gate_center_x, gate_center_y, 0]) rotate([0, 0, gate_angle]) { // Inner Gate Body (Aluminum rod) color(gate_color) { cylinder(r = gate_r, h = gate_len - 1, center = true); // Top Nose interface cap (Keylock pin) translate([0, gate_len / 2 - 2 * scale_y, 0]) sphere(r = gate_r); } // Ball-Lock Barrel Sleeve (Black sleeve with ergonomic facets) color(sleeve_color) { difference() { union() { // Main sleeve cylinder with faceted taper hull() { translate([0, -sleeve_len / 2 + 1.5, 0]) cylinder(r = sleeve_r, h = 3, center = true); translate([0, sleeve_len / 2 - 2, 0]) cylinder(r = sleeve_r * 0.92, h = 4, center = true); } // Ergonomic ribbing on the back of sleeve translate([-sleeve_r * 0.7, 0, 0]) cube([sleeve_r * 0.6, sleeve_len * 0.7, sleeve_r * 1.5], center = true); } // Green Ball Oval Thumb Pocket translate([0, 2 * scale_y, sleeve_r * 0.55]) scale([1, 1.6, 1]) sphere(r = 3.2 * scale_x); // Bayonet L-Slot for locking pin translate([0, -sleeve_len / 2 + 4 * scale_y, 0]) { rotate([90, 0, 0]) cylinder(r = 1.3 * scale_x, h = sleeve_r * 2.5, center = true); translate([0, -1 * scale_y, sleeve_r * 0.4]) cube([1.5 * scale_x, 4 * scale_y, sleeve_r], center = true); } // Top Gate Clearance Cutout translate([0, sleeve_len / 2 - 1 * scale_y, sleeve_r * 0.5]) cube([sleeve_r * 2.2, 5 * scale_y, sleeve_r * 1.2], center = true); } } // Safety Green Indicator Ball color(ball_color) { translate([0, 2 * scale_y, sleeve_r * 0.45]) sphere(r = 1.8 * scale_x); } // Brass/Silver Bayonet Lock Pin color(pin_color) { translate([0, -sleeve_len / 2 + 4 * scale_y, 0]) rotate([90, 0, 0]) cylinder(r = 1.0 * scale_x, h = sleeve_r * 2 + 0.5, center = true); // Bottom Gate Hinge Rivet Pin translate([0, -gate_len / 2 + 2 * scale_y, 0]) rotate([0, 90, 0]) cylinder(r = 0.9 * scale_x, h = frame_thickness + 0.4, center = true); } } } // Complete Assembled Carabiner module petzl_amd_carabiner() { color(frame_color) carabiner_frame(); locking_gate(); } // Render the model petzl_amd_carabiner();