$fn = 64; // --- Parameters --- stand_width = 60; // Width of the stand stand_depth = 85; // Total depth of the base thickness = 6; // Thickness of the structural lines angle = 60; // Viewing angle in degrees backrest_length = 85; // Length of the back support lip_height = 18; // Height of the front lip phone_space = 15; // Gap for the phone (accommodates cases) // --- Calculated Values --- back_y = 28; lip_y = back_y - phone_space - thickness; brace_l = backrest_length * 0.65; // --- 2D Profile --- module stand_profile() { union() { // Base hull() { translate([0, 0]) circle(d=thickness); translate([stand_depth, 0]) circle(d=thickness); } // Backrest hull() { translate([back_y, 0]) circle(d=thickness); translate([back_y + backrest_length*cos(angle), backrest_length*sin(angle)]) circle(d=thickness); } // Front Lip hull() { translate([lip_y, 0]) circle(d=thickness); translate([lip_y, lip_height]) circle(d=thickness); } // Rear Support Brace hull() { translate([stand_depth, 0]) circle(d=thickness); translate([back_y + brace_l*cos(angle), brace_l*sin(angle)]) circle(d=thickness); } } } // --- 3D Extrusion & Orientation --- // Rotates the 2D profile to stand upright and aligns it flush with the XYZ planes translate([0, thickness/2, thickness/2]) rotate([90, -90, 0]) linear_extrude(height=stand_width, convexity=5) stand_profile();