$fn = 64; // --- Parameters --- // Wall Mount / Base mount_width = 40; mount_height = 95; base_thickness = 5; // ArtArsenal / French Cleat Rail Mount cleat_depth = 12; cleat_height = 20; // Airbrush Holder Fork fork_length = 55; fork_thickness = 15; airbrush_body_dia = 16; slot_width = 11; // Cable Management Spool spool_dia = 22; spool_length = 35; lip_dia = 35; lip_thickness = 4; // Recommended print orientation: // Lay flat on its side (rotate 90 degrees on X or Y axis) for support-free printing. airbrush_station(); module airbrush_station() { union() { // Base Plate translate([-mount_width/2, 0, -mount_height]) cube([mount_width, base_thickness, mount_height]); // Wall Rail Cleat (Back) cleat_profile(); // Lower Standoff / Bumper (Back) // Keeps the holder vertically aligned against the wall translate([-mount_width/2, -cleat_depth/2, -mount_height]) cube([mount_width, cleat_depth/2, 10]); // Airbrush Holder Fork (Front) difference() { // Rounded fork body hull() { translate([-mount_width/2, base_thickness, -fork_thickness]) cube([mount_width, 1, fork_thickness]); translate([-mount_width/2 + 5, base_thickness + fork_length - 5, -fork_thickness]) cylinder(r=5, h=fork_thickness); translate([mount_width/2 - 5, base_thickness + fork_length - 5, -fork_thickness]) cylinder(r=5, h=fork_thickness); } // Central resting hole for airbrush translate([0, base_thickness + fork_length - 16, -fork_thickness - 1]) cylinder(d=airbrush_body_dia, h=fork_thickness + 2); // Countersink to securely seat and protect the airbrush translate([0, base_thickness + fork_length - 16, -4]) cylinder(d1=airbrush_body_dia, d2=airbrush_body_dia + 12, h=5); // Front entry slot for the neck/trigger area translate([-slot_width/2, base_thickness + fork_length - 16, -fork_thickness - 1]) cube([slot_width, 30, fork_thickness + 2]); } // Cable Management Spool (Front, Lower) translate([0, base_thickness, -mount_height + lip_dia/2 + 5]) { rotate([-90, 0, 0]) { // Main spool shaft cylinder(d=spool_dia, h=spool_length); // Retaining lip translate([0, 0, spool_length]) hull() { cylinder(d=lip_dia, h=lip_thickness); translate([0, 4, 0]) cylinder(d=lip_dia, h=lip_thickness); // Extended upward } } } // Structural support rib for the spool hull() { translate([-3, base_thickness, -mount_height + lip_dia/2 + 5]) cube([6, spool_length - 5, 1]); translate([-3, base_thickness, -fork_thickness - 1]) cube([6, 1, 1]); } } } module cleat_profile() { // Generates a standard 45-degree downward hook for wall rails translate([-mount_width/2, 0, 0]) rotate([0, 90, 0]) linear_extrude(mount_width) polygon([ [0, 0], // Top against backplate [cleat_height, 0], // Bottom against backplate [cleat_height, -cleat_depth/2], // Bottom outer edge [cleat_height/2, -cleat_depth], // Hook inner tip [0, -cleat_depth] // Top outer edge ]); }