$fn=64; // --- Parameters --- wall_hole_diameter = 50; // Standard 50mm wall hole insert_depth = 20; // Depth of the wall sleeve frame_width = 65; // Outer width of the stone frame frame_thickness = 6; // Thickness of the frame on the wall cable_hole_width = 30; // Width of the passthrough doorway groove_depth = 1.5; // Depth of the stone grooves groove_width = 1.5; // Width of the stone grooves // Calculated centers and bounds door_arch_y = 5; door_bottom_y = -15; frame_arch_y = 5; frame_bottom_y = -25; module dungeon_door_passthrough() { difference() { union() { // Wall Insert Sleeve translate([0, 0, -insert_depth]) cylinder(h=insert_depth, d=wall_hole_diameter); // Front Frame (Stone Arch Base) hull() { translate([0, frame_arch_y, 0]) cylinder(h=frame_thickness, d=frame_width); translate([-frame_width/2, frame_bottom_y, 0]) cube([frame_width, 1, frame_thickness]); } } // Hollow out the sleeve (Inner circle for cable room) translate([0, 0, -insert_depth - 1]) cylinder(h=insert_depth + 2, d=wall_hole_diameter - 4); // Cable Cutout (Dungeon Doorway) hull() { translate([0, door_arch_y, -insert_depth - 1]) cylinder(h=insert_depth + frame_thickness + 2, d=cable_hole_width); translate([-cable_hole_width/2, door_bottom_y, -insert_depth - 1]) cube([cable_hole_width, 1, insert_depth + frame_thickness + 2]); } // Stone Block Grooves (Radial cuts for the arch) for (a = [15, 45, 75, 105, 135, 165]) { translate([0, frame_arch_y, frame_thickness - groove_depth]) rotate([0, 0, a]) translate([cable_hole_width/2 - 2, -groove_width/2, 0]) cube([frame_width/2 + 4, groove_width, groove_depth + 1]); } // Stone Block Grooves (Horizontal cuts for the pillars) for (y = [frame_bottom_y + 8 : 10 : door_arch_y - 2]) { translate([-frame_width/2 - 1, y, frame_thickness - groove_depth]) cube([frame_width + 2, groove_width, groove_depth + 1]); } } } dungeon_door_passthrough();