$fn=64; // --- Parameters --- // Outer dimensions of the display frame width = 200; depth = 150; height = 250; // Frame structure properties frame_thickness = 6; border_width = 15; // Acrylic panel fitment acrylic_thickness = 3; lip_width = 5; // How much the frame overlaps the acrylic on the inside module dust_cover_frame() { difference() { // Main outer block cube([width, depth, height]); // Hollow interior (open at the bottom) translate([frame_thickness, frame_thickness, -0.1]) cube([ width - 2*frame_thickness, depth - 2*frame_thickness, height - frame_thickness + 0.1 ]); // Front Window window_cutout( pos = [border_width, -0.1, border_width], size = [width - 2*border_width, frame_thickness + 0.2, height - 2*border_width], recess_pos = [border_width - lip_width, frame_thickness - acrylic_thickness, border_width - lip_width], recess_size = [width - 2*border_width + 2*lip_width, acrylic_thickness + 0.1, height - 2*border_width + 2*lip_width] ); // Back Window window_cutout( pos = [border_width, depth - frame_thickness - 0.1, border_width], size = [width - 2*border_width, frame_thickness + 0.2, height - 2*border_width], recess_pos = [border_width - lip_width, depth - frame_thickness - 0.1, border_width - lip_width], recess_size = [width - 2*border_width + 2*lip_width, acrylic_thickness + 0.1, height - 2*border_width + 2*lip_width] ); // Left Window window_cutout( pos = [-0.1, border_width, border_width], size = [frame_thickness + 0.2, depth - 2*border_width, height - 2*border_width], recess_pos = [frame_thickness - acrylic_thickness, border_width - lip_width, border_width - lip_width], recess_size = [acrylic_thickness + 0.1, depth - 2*border_width + 2*lip_width, height - 2*border_width + 2*lip_width] ); // Right Window window_cutout( pos = [width - frame_thickness - 0.1, border_width, border_width], size = [frame_thickness + 0.2, depth - 2*border_width, height - 2*border_width], recess_pos = [width - frame_thickness - 0.1, border_width - lip_width, border_width - lip_width], recess_size = [acrylic_thickness + 0.1, depth - 2*border_width + 2*lip_width, height - 2*border_width + 2*lip_width] ); // Top Window window_cutout( pos = [border_width, border_width, height - frame_thickness - 0.1], size = [width - 2*border_width, depth - 2*border_width, frame_thickness + 0.2], recess_pos = [border_width - lip_width, border_width - lip_width, height - frame_thickness - 0.1], recess_size = [width - 2*border_width + 2*lip_width, depth - 2*border_width + 2*lip_width, acrylic_thickness + 0.1] ); } } // Helper module to cut the window and its inner recess for the acrylic panel module window_cutout(pos, size, recess_pos, recess_size) { // Main window cutout (through the frame) translate(pos) cube(size); // Inner recess (lip) to hold the acrylic panel translate(recess_pos) cube(recess_size); } // Render the frame // Note: For optimal 3D printing, rotate 180 degrees around the X or Y axis // so the solid top face rests completely flat on the build plate. dust_cover_frame();