Skip to content

Instantly share code, notes, and snippets.

@ednisley
Created June 16, 2022 22:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ednisley/1ba30fb2a6f56815cbdd649b45855a15 to your computer and use it in GitHub Desktop.
Save ednisley/1ba30fb2a6f56815cbdd649b45855a15 to your computer and use it in GitHub Desktop.
OpenSCAD source code: base and top for sticky trap sheets
// Sticky Sheet Cage
// Ed Nisley KE4ZNU May 2021
Layout = "Build"; // [Build, Show, Cap, Attachment]
Bracket = "Ski"; // [Angle, Ski, Post]
//- Extrusion parameters must match reality!
/* [Hidden] */
ThreadThick = 0.25;
ThreadWidth = 0.40;
HoleWindage = 0.2;
Protrusion = 0.1; // make holes end cleanly
inch = 25.4;
ID = 0;
OD = 1;
LENGTH = 2;
function IntegerMultiple(Size,Unit) = Unit * ceil(Size / Unit);
//----------------------
// Dimensions
Sheet = [1,100,150]; // sticky sheet
Grid = 0.5*inch;
Cage = [2*Grid + 5.0, 8*Grid + 5.0, 12*Grid + 2.0]; // grid wire cage bent around sheet
CageRad = 2.5; // wire bending radius
CageThick = 2.0; // grid thickness
WallThick = 3.0; // min wall and bottom thickness
Recess = 5.0; // inset to capture cage edge
Plate = [Cage.x,Cage.y,Recess] + [2*WallThick,2*WallThick,WallThick];
PlateRad = 5.0;
SkiPole = [20.0,20.0 + 2*WallThick,50];
AnglePlate = [30,30,50];
ScrewClear = 5.0;
BuildGap = 5.0;
//----------------------
// Useful routines
module PolyCyl(Dia,Height,ForceSides=0) { // based on nophead's polyholes
Sides = (ForceSides != 0) ? ForceSides : (ceil(Dia) + 2);
FixDia = Dia / cos(180/Sides);
cylinder(r=(FixDia + HoleWindage)/2,
h=Height,
$fn=Sides);
}
//----------------------
// Pieces
module Cap() {
union() {
difference() {
hull()
for (i=[-1,1], j=[-1,1])
translate([i*(Plate.x/2 - PlateRad),j*(Plate.y/2 - PlateRad),0])
cylinder(r=PlateRad,h=Plate.z,$fn=12);
translate([0,0,Plate.z - Recess])
hull()
for (i=[-1,1], j=[-1,1])
translate([i*(Cage.x/2 - CageRad),j*(Cage.y/2 - CageRad),0])
cylinder(r=CageRad,h=Plate.z,$fn=12);
}
difference() {
Strut = Cage.x - 2*CageThick;
Latch = [Cage.x,WallThick,0.75*Plate.z];
union() {
for (j=[-1,1])
translate([0,j*2.5*Grid,Plate.z])
cube([Strut,WallThick,2*Plate.z],center=true);
for (j=[-1,1])
translate([0,j*2.5*Grid,2*Plate.z - Latch.z/2])
cube(Latch,center=true);
}
translate([0,0,2*Plate.z + (Cage.z - Sheet.z)/4])
rotate([0,45,0])
cube([Strut/sqrt(2),Plate.y,Strut/sqrt(2)],center=true);
}
}
}
module Attachment() {
if (Bracket == "Angle") {
translate([0,Plate.y/2,0])
rotate(45)
difference() {
union() {
cube(AnglePlate,center=false);
rotate(-45)
translate([0,WallThick,Plate.z/2])
cube([Plate.x - 2*PlateRad,4*WallThick,Plate.z],center=true);
}
translate([WallThick,WallThick,-Protrusion])
cube(AnglePlate + [0,0,2*Protrusion],center=false);
translate([AnglePlate.x/2,-Protrusion,2*AnglePlate.z/3])
rotate([-90,0,0])
PolyCyl(ScrewClear,2*AnglePlate.x,6);
translate([-Protrusion,AnglePlate.x/2,1*AnglePlate.z/3])
rotate([90,0,90])
PolyCyl(ScrewClear,2*AnglePlate.x,6);
}
}
else if (Bracket == "Ski") {
translate([0,Plate.y/2 + SkiPole[OD]/2,0])
difference() {
union() {
PolyCyl(SkiPole[OD],SkiPole[LENGTH],24);
translate([0,-3*WallThick,Plate.z/2])
cube([Plate.x - 2*PlateRad,4*WallThick,Plate.z],center=true);
}
translate([0,0,-2*WallThick])
PolyCyl(SkiPole[ID],SkiPole[LENGTH],24);
}
}
}
//----------------------
// Build it
if (Layout == "Cap")
Cap();
if (Layout == "Attachment") {
Attachment();
}
if (Layout == "Show") {
translate([0,0,Sheet.z/2 + Plate.z])
color("Yellow")
cube(Sheet,center=true);
Cap();
Attachment();
translate([0,0,Sheet.z + 2*Plate.z])
rotate([180,0,0])
Cap();
}
if (Layout == "Build") {
translate([-(Plate.x/2 + BuildGap),0,0]) {
Cap();
Attachment();
}
translate([(Plate.x/2 + BuildGap),0,0])
Cap();
}
@ednisley
Copy link
Author

More details on my blog at https://wp.me/poZKh-a55

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment