$fn = 64; /* [Display Settings] */ // Number of display rows num_tiers = 4; // Width of the slots (60mm fits vertical ID cards, 90mm fits horizontal) tag_width = 60; // Thickness of the slots (allow extra clearance for easy insertion) tag_thickness = 2.5; // How deep the tag sits in the slot slot_depth = 12; // Tilt angle of the tags (degrees leaning back) slot_angle = 15; /* [Base Dimensions] */ // Depth of each step tier_depth = 25; // Height difference between steps tier_height = 20; // Height of the lowest step base_height = 20; // Thickness of the side walls wall_thickness = 5; // Calculated overall dimensions overall_width = tag_width + (wall_thickness * 2); overall_depth = num_tiers * tier_depth; module id_tag_display() { // Note: The model is left solid. For 3D printing, it is highly recommended // to print with low infill (e.g., 10-15% gyroid) to save material while // avoiding the need for internal bridging supports that a hollow shell would require. difference() { // Main Body (Stepped Stand) union() { for (i = [0 : num_tiers - 1]) { translate([0, i * tier_depth, 0]) cube([overall_width, tier_depth, base_height + (i * tier_height)]); } } // Subtracted Tag Slots for (i = [0 : num_tiers - 1]) { tier_z = base_height + (i * tier_height); // Center the slot on the tier's depth translate([wall_thickness, (i * tier_depth) + (tier_depth / 2), tier_z]) rotate([-slot_angle, 0, 0]) // Translate down into the body, and center the thickness translate([0, -tag_thickness / 2, -slot_depth]) // Make the cutter extra tall to cleanly break the top surface cube([tag_width, tag_thickness, slot_depth * 3]); } } } // Render the model id_tag_display();