$fn=64; // --- Parameters --- w = 110; // Total width of the base d = 35; // Total depth h_base = 15; // Base height w_arch = 50; // Arch inner width (cable passage) pw = 25; // Pillar width h_pillars = 35; // Pillar height to start of arch block_h = 10; // Height of individual stone blocks gap = 1.5; // Mortar gap width groove_depth = 2; // Depth of the mortar grooves // --- Main Assembly --- union() { // 1. Base with cable guide slots difference() { // Main base block translate([0, 0, h_base/2]) cube([w, d, h_base], center=true); // Base horizontal decorative groove translate([0, 0, h_base/2]) difference() { cube([w+2, d+2, gap], center=true); cube([w-groove_depth*2, d-groove_depth*2, gap+2], center=true); } // Cable guide U-slots for(x=[-18 : 12 : 18]) { translate([x, 0, h_base - 4.5]) rotate([90, 0, 0]) cylinder(r=4.5, h=d+2, center=true); translate([x, 0, h_base - 2.25]) cube([9, d+2, 4.5], center=true); } } // 2. Pillar bases (flared for stability and medieval look) pillar_base(-(w_arch+pw)/2); pillar_base((w_arch+pw)/2); // 3. Stone Pillars stone_pillar(-(w_arch+pw)/2); stone_pillar((w_arch+pw)/2); // 4. Stone Arch translate([0, 0, h_base + h_pillars]) rotate([90, 0, 0]) difference() { // Main arch body cylinder(r=w_arch/2 + pw, h=d, center=true); // Inner cutout cylinder(r=w_arch/2, h=d+2, center=true); // Cut bottom half to make it a semicircle translate([0, -(w_arch/2 + pw + 1)/2, 0]) cube([w_arch + pw*2 + 2, w_arch/2 + pw + 1, d+2], center=true); // Radial mortar grooves for voussoirs (arch stones) for(a=[0 : 180/7 : 180]) { rotate([0, 0, a]) translate([w_arch/2 + pw/2, 0, 0]) difference() { cube([pw+2, gap, d+2], center=true); cube([pw-groove_depth*2, gap+2, d-groove_depth*2], center=true); } } } // 5. Keystone translate([0, 0, h_base + h_pillars + w_arch/2 + pw/2]) rotate([90, 0, 0]) hull() { translate([0, pw/2 + 2, 0]) cube([18, 1, d+2], center=true); translate([0, -pw/2 - 2, 0]) cube([12, 1, d+2], center=true); } } // --- Modules --- // Creates a flared base for the pillars module pillar_base(x_pos) { translate([x_pos, 0, h_base + 2]) hull() { translate([0, 0, 2]) cube([pw, d, 0.1], center=true); translate([0, 0, -2]) cube([pw+4, d+4, 4], center=true); } } // Creates a pillar with simulated stone blocks using surface grooves module stone_pillar(x_pos) { translate([x_pos, 0, h_base + h_pillars/2]) difference() { // Solid core cube([pw, d, h_pillars], center=true); // Horizontal mortar grooves for(z=[-h_pillars/2 + block_h : block_h : h_pillars/2 - 1]) { translate([0, 0, z]) difference() { cube([pw+2, d+2, gap], center=true); cube([pw-groove_depth*2, d-groove_depth*2, gap+2], center=true); } } // Vertical staggered mortar grooves for(i=[0 : h_pillars/block_h - 1]) { z = -h_pillars/2 + block_h/2 + i*block_h; x_offset = (i%2 == 0) ? 0 : pw/4; translate([0, 0, z]) difference() { union() { translate([x_offset, 0, 0]) cube([gap, d+2, block_h+2], center=true); translate([0, x_offset, 0]) cube([pw+2, gap, block_h+2], center=true); } // Protect the core so the cuts are only on the surface cube([pw-groove_depth*2, d-groove_depth*2, block_h+4], center=true); } } } }