From 201b62784142fcc157b8d71ba75e4d3eec5084e5 Mon Sep 17 00:00:00 2001 From: Cal Corum Date: Sat, 20 Dec 2025 18:13:43 -0600 Subject: [PATCH] Add asymmetric offset GFCI plate variant MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New plate with off-center opening: - Total width: 177.8mm (7 inches) - Left of opening: 63.5mm (2.5 inches) - Right of opening: 114.3mm (4.5 inches) - Height unchanged: 230mm Opening and screw holes remain at origin (X=0). Includes 2D template SVG for paper test-fit. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- ...gfci-paddle-switch-extended-offset-2d.scad | 48 ++++++ ...paddle-switch-extended-offset-template.svg | 77 ++++++++++ .../gfci-paddle-switch-extended-offset.scad | 138 ++++++++++++++++++ 3 files changed, 263 insertions(+) create mode 100644 light-switches/gfci-paddle-switch-extended-offset-2d.scad create mode 100644 light-switches/gfci-paddle-switch-extended-offset-template.svg create mode 100644 light-switches/gfci-paddle-switch-extended-offset.scad diff --git a/light-switches/gfci-paddle-switch-extended-offset-2d.scad b/light-switches/gfci-paddle-switch-extended-offset-2d.scad new file mode 100644 index 0000000..3584087 --- /dev/null +++ b/light-switches/gfci-paddle-switch-extended-offset-2d.scad @@ -0,0 +1,48 @@ +// 2D projection for paper test fit - OFFSET VERSION +// Print this at 100% scale (no scaling) + +include + +// Asymmetric plate dimensions +plate_left = 63.5; // mm (2.5 inches) +plate_right = 114.3; // mm (4.5 inches) +plate_width = 177.8; // mm (7 inches total) +plate_x_offset = 25.4; // mm (1 inch) - plate center offset +plate_height = 230.0; +plate_corner_radius = 3.0; + +opening_width = 34.0; +opening_height = 67.0; +opening_corner_radius = 2.0; + +// Main screw holes (pill-shaped) +screw_hole_height = 6.0; +screw_hole_width = 14.0; +screw_hole_spacing = 83.3; + +// Outer screw holes (circular) +outer_screw_hole_offset = 6.35; +outer_screw_hole_diameter = 2.68; + +$fn = 64; + +difference() { + // Plate body (offset in X) + translate([plate_x_offset, 0]) + rect([plate_width, plate_height], rounding=plate_corner_radius); + + // Opening (at origin) + rect([opening_width, opening_height], rounding=opening_corner_radius); + + // Main screw holes (pill-shaped, at origin) + translate([0, screw_hole_spacing/2]) + rect([screw_hole_width, screw_hole_height], rounding=screw_hole_height/2); + translate([0, -screw_hole_spacing/2]) + rect([screw_hole_width, screw_hole_height], rounding=screw_hole_height/2); + + // Outer screw holes (circular, at origin) + translate([0, screw_hole_spacing/2 + outer_screw_hole_offset]) + circle(d=outer_screw_hole_diameter); + translate([0, -screw_hole_spacing/2 - outer_screw_hole_offset]) + circle(d=outer_screw_hole_diameter); +} diff --git a/light-switches/gfci-paddle-switch-extended-offset-template.svg b/light-switches/gfci-paddle-switch-extended-offset-template.svg new file mode 100644 index 0000000..a54e0fe --- /dev/null +++ b/light-switches/gfci-paddle-switch-extended-offset-template.svg @@ -0,0 +1,77 @@ + + + +OpenSCAD Model + + diff --git a/light-switches/gfci-paddle-switch-extended-offset.scad b/light-switches/gfci-paddle-switch-extended-offset.scad new file mode 100644 index 0000000..2270c71 --- /dev/null +++ b/light-switches/gfci-paddle-switch-extended-offset.scad @@ -0,0 +1,138 @@ +// GFCI Paddle Switch Plate - Extended Size with X Offset +// Custom oversized plate with OFF-CENTER paddle opening +// Opening and screw holes at X=0, plate extends asymmetrically + +include + +/* [Plate Dimensions] */ +// Asymmetric plate: 2.5" left of center, 4.5" right of center +plate_left = 63.5; // mm (2.5 inches) - distance from center to left edge +plate_right = 114.3; // mm (4.5 inches) - distance from center to right edge +plate_width = 177.8; // mm - total X dimension (7 inches) +plate_x_offset = 25.4; // mm (1 inch) - plate center offset from opening +plate_height = 230.0; // mm - Y dimension (unchanged) +plate_thickness = 5.0; // mm - Z dimension + +/* [Bevel Settings] */ +bevel_inset = 1.82; // mm - how much smaller bottom is per side + +/* [Recess Settings] */ +recess_enabled = true; +recess_depth = 2.0; // mm - depth of recess (from bottom) +recess_inset = 8.0; // mm - inset from outer edge + +/* [Paddle Opening] */ +// Rectangular opening for paddle switch (same as standard plate) +opening_width = 34.0; // mm - width of opening +opening_height = 67.0; // mm - height of opening + +/* [Corner Rounding] */ +plate_corner_radius = 3.0; // mm +opening_corner_radius = 2.0; // mm + +/* [Screw Holes] */ +screw_holes_enabled = true; +screw_hole_height = 6.0; // mm - vertical dimension (was diameter) +screw_hole_width = 14.0; // mm - horizontal dimension (250% of height) +screw_hole_spacing = 83.3; // mm - distance between main screw holes + +// Outer screw holes (smaller, beyond the main holes) +outer_screw_holes_enabled = true; +outer_screw_hole_offset = 6.35; // mm (0.25 inches) beyond main holes +outer_screw_hole_diameter = 2.68; // mm (67% of main hole diameter) + +/* [Resolution] */ +$fn = 64; + +// ============================================ +// CALCULATED VALUES +// ============================================ + +bottom_width = plate_width - (bevel_inset * 2); +bottom_height = plate_height - (bevel_inset * 2); +recess_width = plate_width - (recess_inset * 2); +recess_height = plate_height - (recess_inset * 2); + +// ============================================ +// MODULES +// ============================================ + +module plate_body() { + // Flipped for printing: front face (larger) at Z=0, back (smaller) at Z=5 + // This eliminates overhang on beveled edges + // Offset in X so opening remains at origin + translate([plate_x_offset, 0, 0]) + prismoid( + size1 = [plate_width, plate_height], // front face (larger) at bottom + size2 = [bottom_width, bottom_height], // back face (smaller) at top + h = plate_thickness, + rounding = plate_corner_radius, + anchor = BOTTOM + ); +} + +module back_recess() { + if (recess_enabled) { + recess_rounding = max(0.5, plate_corner_radius - recess_inset/4); + // Recess now at top (Z=5) since plate is flipped for printing + // Offset in X to match plate body + translate([plate_x_offset, 0, plate_thickness - recess_depth - 0.01]) + prismoid( + size1 = [recess_width, recess_height], + size2 = [recess_width, recess_height], + h = recess_depth + 0.02, + rounding = recess_rounding, + anchor = BOTTOM + ); + } +} + +// 2D paddle opening shape (simple rectangle with rounded corners) +module paddle_opening_2d() { + rect([opening_width, opening_height], rounding=opening_corner_radius); +} + +module paddle_opening_3d() { + translate([0, 0, -0.1]) + linear_extrude(height = plate_thickness + 0.2) + paddle_opening_2d(); +} + +module screw_holes() { + if (screw_holes_enabled) { + // Top main screw hole (pill-shaped, horizontal) + translate([0, screw_hole_spacing/2, -0.1]) + linear_extrude(height = plate_thickness + 0.2) + rect([screw_hole_width, screw_hole_height], rounding=screw_hole_height/2); + + // Bottom main screw hole (pill-shaped, horizontal) + translate([0, -screw_hole_spacing/2, -0.1]) + linear_extrude(height = plate_thickness + 0.2) + rect([screw_hole_width, screw_hole_height], rounding=screw_hole_height/2); + } + + if (outer_screw_holes_enabled) { + // Top outer screw hole (above top main hole) + translate([0, screw_hole_spacing/2 + outer_screw_hole_offset, -0.1]) + cylinder(h = plate_thickness + 0.2, d = outer_screw_hole_diameter); + + // Bottom outer screw hole (below bottom main hole) + translate([0, -screw_hole_spacing/2 - outer_screw_hole_offset, -0.1]) + cylinder(h = plate_thickness + 0.2, d = outer_screw_hole_diameter); + } +} + +// ============================================ +// MAIN ASSEMBLY +// ============================================ + +module gfci_paddle_plate_extended() { + difference() { + plate_body(); + back_recess(); + paddle_opening_3d(); + screw_holes(); + } +} + +gfci_paddle_plate_extended();