$fn=64; // --- Parameters --- panel_width = 120; panel_height = 90; panel_thickness = 2; tab_width = 80; tab_height = 6; tab_thickness = 2.6; // Slightly thinner than 3mm for clearance emboss_thickness = 1.5; border_width = 3; // --- Modules --- // Generates a classic layered pine tree module pine_tree(h, w) { // Trunk translate([-w/10, 0]) square([w/5, h/4]); // Needles/Branches translate([0, h*0.15]) polygon([[-w/2, 0], [w/2, 0], [0, h*0.4]]); translate([0, h*0.35]) polygon([[-w/2.2, 0], [w/2.2, 0], [0, h*0.4]]); translate([0, h*0.55]) polygon([[-w/2.5, 0], [w/2.5, 0], [0, h*0.45]]); } // Generates a fluffy deciduous tree module round_tree(h, r) { // Trunk translate([-r/4, 0]) square([r/2, h/2]); // Leaves translate([0, h*0.5]) circle(r); translate([-r*0.75, h*0.45]) circle(r*0.7); translate([r*0.75, h*0.45]) circle(r*0.7); translate([0, h*0.75]) circle(r*0.9); } // Generates the 2D forest layout module forest_scene() { intersection() { // Bounding box to keep everything on the panel square([panel_width, panel_height]); union() { // Sun / Moon translate([panel_width * 0.85, panel_height * 0.75]) circle(r=10); // Rolling Hills translate([panel_width * 0.2, 0]) scale([2.5, 1]) circle(r=20); translate([panel_width * 0.8, 0]) scale([3, 1.2]) circle(r=22); translate([panel_width * 0.5, 0]) scale([3.5, 0.8]) circle(r=25); square([panel_width, 15]); // Fill bottom gap // Trees translate([15, 10]) pine_tree(45, 25); translate([35, 12]) round_tree(40, 14); translate([60, 15]) pine_tree(55, 30); translate([85, 10]) round_tree(35, 12); translate([105, 12]) pine_tree(50, 28); // Outer Frame difference() { square([panel_width, panel_height]); translate([border_width, border_width]) square([panel_width - border_width*2, panel_height - border_width*2]); } } } } // --- Assembly --- union() { // Main Backdrop Panel cube([panel_width, panel_height, panel_thickness]); // Mounting Tab (Tapered for easy slotting, extends into baseplate) // Adding 0.1 to height to ensure manifold overlap with the main panel translate([(panel_width - tab_width)/2, -tab_height, (panel_thickness - tab_thickness)/2]) linear_extrude(tab_thickness) polygon([ [2, 0], [tab_width - 2, 0], [tab_width, tab_height + 0.1], [0, tab_height + 0.1] ]); // Embossed Forest Details translate([0, 0, panel_thickness]) linear_extrude(emboss_thickness) forest_scene(); }