From 31e750b4d8f8183df79198576ad538d5414b9fc1 Mon Sep 17 00:00:00 2001 From: Cory Locklear Date: Sat, 13 Jun 2026 13:06:17 -0400 Subject: [PATCH] Added extra depth, ability to print front slice --- ring-solar-siding-adapter.scad | 42 ++++++++++++++++++++++++++-------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/ring-solar-siding-adapter.scad b/ring-solar-siding-adapter.scad index 1f81f21..b8e73ed 100644 --- a/ring-solar-siding-adapter.scad +++ b/ring-solar-siding-adapter.scad @@ -22,6 +22,7 @@ bead_coping_radius = 10.00; // Semicircle radius for bead groove (measured bead_coping_offset_top = 11.00; // Distance from plate top to groove center (tune on wall) flat_upper_ratio = 0.55; // Fraction of plate height that stays flat at the top bottom_taper_depth_ratio = 1.6; // Rear depth at plate bottom = min_wall_thickness * this (outward from flat shelf) +rear_extension = 7.5; // Extra depth toward wall; front face + bead groove stay fixed vs front/top course_pitch = 165.1; profile_segments = 8; profile_mode = "curved"; // [curved, stepped] @@ -34,8 +35,9 @@ mount_hole_dia = 4.5; mount_hole_x = 0; /* [Export] */ -part_mode = "full"; // [full, profile_strip] +part_mode = "full"; // [full, profile_strip, front_slice] profile_strip_width = 20; +front_slice_depth = 3.5; // [2:0.5:8] /* [Hidden] */ $fn = 64; @@ -52,6 +54,9 @@ function projection_z() = siding_projection - rear_clearance; function face_inset_z() = projection_z() - face_inset_depth; +// Flat rear shelf shifted toward the wall; bead groove keeps absolute depth at face_inset_z. +function flat_rear_z() = face_inset_z() - rear_extension; + function bead_coping_y_center() = plate_height - bead_coping_offset_top; // Bottom of flat rear shelf (flat_upper_ratio measured from plate top downward). @@ -59,24 +64,23 @@ function face_y_flat_end() = plate_height * (1 - flat_upper_ratio); // Rear depth where the bottom taper ends (outward from flat shelf, in wall-thickness units). function bottom_rear_z() = - face_inset_z() + min_wall_thickness * bottom_taper_depth_ratio; + flat_rear_z() + min_wall_thickness * bottom_taper_depth_ratio; -// Slow taper from bottom_rear_z at the plate bottom up to the flat shelf. +// Slow taper from bottom_rear_z at the plate bottom up to the flat rear shelf. function lower_curve_z(y) = let( y1 = face_y_flat_end(), t = y / max(y1, epsilon), ease = pow(sin(t * 90), 1.4), z_bottom = bottom_rear_z(), - z_top = face_inset_z() + z_top = flat_rear_z() ) z_top + (z_bottom - z_top) * (1 - ease); function stepped_rear_z(y) = - y >= face_y_flat_end() ? face_inset_z() : bottom_rear_z(); + y >= face_y_flat_end() ? flat_rear_z() : bottom_rear_z(); -// Concave bead coping on the rear face near the plate top. -// Flat chord at face_inset_z; arc scoops into the plate (toward the front). +// Bead coping: fixed depth vs front/top. Flat chord at face_inset_z; arc scoops into plate. function bead_coping_rear_z(y) = let( r = bead_coping_radius, @@ -84,7 +88,7 @@ function bead_coping_rear_z(y) = dy = y - bead_coping_y_center(), disc = r * r - dy * dy ) - disc >= 0 ? shelf + sqrt(disc) : shelf; + disc >= 0 ? shelf + sqrt(disc) : flat_rear_z(); // Flat top shelf + bead cavity + lower taper. function rear_z_at(y) = @@ -109,7 +113,9 @@ function max_rear_z() = let(pts = rear_profile_points()) max([for (p = pts) p[1]]); -function front_z() = max_rear_z() + min_wall_thickness; +// Front face anchored to bead groove + min wall (independent of rear_extension). +function front_z() = + face_inset_z() + bead_coping_radius + min_wall_thickness; function rear_y_min() = min([for (p = rear_profile_points()) p[1]]); @@ -170,6 +176,16 @@ module rounded_body(width) { } } +// Keep only the front face cap for fit-checking width, height, and hole placement. +module front_slice_mask(width) { + fz = front_z(); + translate([plate_height / 2, fz - front_slice_depth / 2, 0]) + cube( + [plate_height + 2 * epsilon, front_slice_depth + 2 * epsilon, width + 2 * epsilon], + center = true + ); +} + module adapter_plate() { width = part_mode == "profile_strip" ? profile_strip_width : plate_width; if (part_mode == "full") { @@ -177,6 +193,14 @@ module adapter_plate() { rounded_body(width); mount_holes(); } + } else if (part_mode == "front_slice") { + intersection() { + difference() { + rounded_body(width); + mount_holes(); + } + front_slice_mask(width); + } } else { rounded_body(width); }