$fn = 64; // Hardware required for assembly: // - 1x M4x20mm bolt and nut (for the adjustable wall mount friction hinge) // - 1x M3x20mm bolt or a piece of filament (for the clip jaw pivot) // - 1x Standard ballpoint pen spring (approx 4-5mm diameter) // --------------------------------------------------------- // Part 1: Wall Rail Mount (French Cleat Style) // --------------------------------------------------------- module wall_mount() { difference() { union() { // Main backplate cube([30, 40, 4]); // Bottom standoff (keeps the plate parallel to the wall) translate([0, 0, 4]) cube([30, 4, 6]); // Top rail cleat (45-degree angled hook) translate([0, 30, 4]) cube([30, 10, 6]); // Spacer hull() { translate([0, 30, 4]) cube([30, 1, 6]); // Front face of spacer translate([0, 24, 4]) cube([30, 1, 1]); // Angled hook tip } // Friction hinge tabs for the adjustable arm translate([6, 10, 4]) cube([4, 15, 14]); translate([20, 10, 4]) cube([4, 15, 14]); translate([8, 20, 18]) rotate([0, 90, 0]) cylinder(h=4, r=6, center=true); translate([22, 20, 18]) rotate([0, 90, 0]) cylinder(h=4, r=6, center=true); } // M4 bolt hole for the friction hinge translate([-1, 20, 18]) rotate([0, 90, 0]) cylinder(h=32, r=2.2); } } // --------------------------------------------------------- // Part 2: Lower Clip Jaw & Adjustable Arm // --------------------------------------------------------- module lower_jaw() { difference() { union() { // Main clip bed translate([0, -10, 0]) cube([15, 60, 4]); // Thumb grip ridge translate([0, -10, 4]) cube([15, 3, 2]); // Hinge block connecting to the wall mount translate([3, -16, 0]) cube([9, 16, 10]); translate([7.5, -10, 10]) rotate([0, 90, 0]) cylinder(h=9, r=6, center=true); // Pivot tabs for the upper clip jaw translate([0, 20, 4]) cube([3, 10, 6]); translate([12, 20, 4]) cube([3, 10, 6]); translate([1.5, 25, 10]) rotate([0, 90, 0]) cylinder(h=3, r=4, center=true); translate([13.5, 25, 10]) rotate([0, 90, 0]) cylinder(h=3, r=4, center=true); // Spring alignment peg translate([7.5, 5, 4]) cylinder(h=2, r=2); // Front gripping teeth translate([0, 45, 4]) cube([15, 5, 6]); } // M4 clearance hole for wall mount connection translate([-1, -10, 10]) rotate([0, 90, 0]) cylinder(h=20, r=2.2); // M3 clearance hole for the jaw pivot translate([-1, 25, 10]) rotate([0, 90, 0]) cylinder(h=20, r=1.8); } } // --------------------------------------------------------- // Part 3: Upper Clip Jaw // --------------------------------------------------------- module upper_jaw() { difference() { union() { // Main clip bed translate([0, -10, 0]) cube([15, 60, 4]); // Thumb grip ridge translate([0, -10, 4]) cube([15, 3, 2]); // Central pivot tab (fits between lower jaw tabs) translate([3.5, 20, 4]) cube([8, 10, 6]); translate([7.5, 25, 10]) rotate([0, 90, 0]) cylinder(h=8, r=4, center=true); // Spring alignment peg translate([7.5, 5, 4]) cylinder(h=2, r=2); // Front gripping teeth translate([0, 45, 4]) cube([15, 5, 6]); } // M3 clearance hole for the jaw pivot translate([-1, 25, 10]) rotate([0, 90, 0]) cylinder(h=20, r=1.8); } } // --------------------------------------------------------- // Print Layout (Flat on the bed, no supports needed) // --------------------------------------------------------- wall_mount(); translate([40, 15, 0]) lower_jaw(); translate([65, 15, 0]) upper_jaw();