$fn = 64; /* [Easel Parameters] */ easel_width = 35; // Width of the easel stand easel_height = 60; // Height of the backrest base_length = 40; // Depth of the base for stability wall_thickness = 3; // Thickness of the walls and base slot_width = 6; // Width of the card slot (fits sleeved cards and toploaders) lip_height = 10; // Height of the front retaining lip tilt_angle = 15; // Tilt angle of the card in degrees /* [Rib Parameters] */ rib_thickness = 3; // Thickness of the central support rib rib_height_factor = 0.6;// How high the support rib goes (ratio of backrest height) rib_length_factor = 0.8;// How far back the support rib goes (ratio of base length) module trading_card_easel() { union() { // Main body shell rotate([90, 0, 0]) linear_extrude(easel_width, center=true) union() { // Base plate translate([-slot_width - wall_thickness, 0]) { square([base_length + slot_width + wall_thickness, wall_thickness]); // Rounded ends for the base translate([0, wall_thickness/2]) circle(d=wall_thickness); translate([base_length + slot_width + wall_thickness, wall_thickness/2]) circle(d=wall_thickness); } // Backrest translate([0, wall_thickness]) rotate([0, 0, -tilt_angle]) { square([wall_thickness, easel_height]); // Rounded top translate([wall_thickness/2, easel_height]) circle(d=wall_thickness); } // Front lip translate([-slot_width - wall_thickness, wall_thickness]) { square([wall_thickness, lip_height]); // Rounded top translate([wall_thickness/2, lip_height]) circle(d=wall_thickness); } } // Central support rib rotate([90, 0, 0]) linear_extrude(rib_thickness, center=true) polygon([ [wall_thickness / 2, wall_thickness], [base_length * rib_length_factor, wall_thickness], [ (easel_height * rib_height_factor) * sin(tilt_angle) + wall_thickness / 2, (easel_height * rib_height_factor) * cos(tilt_angle) + wall_thickness ] ]); } } // Render the easel trading_card_easel();