Badge Holder
Lanyard style badge holder. Takes a standard credit-card-sized badge.
It is based on this design. The changes I made improve ruggedness by re-enforcing the clip-hole and increasing the overall thickness. I also adjusted the hexagon design because I didn't like how the hexagons were aligned.
It requires supports to print, a single wall to support the edge of the overhang is enough. In Cura that requires these settings:
- Support Pattern: Grid
- Support Density: 0%
- Support X/Y Distance: 2.5mm
- Enable Support Interface: No
$fn=80;
module backArea() {
translate([4.5,4.5,0]) cube([80,48,2]);
}
module blank() {
scale(25.4) rotate([90,0,0]) import("reference/thingiverse-2810500.stl"); // https://www.thingiverse.com/thing:2810500
translate([2,5,0]) cube([85,50,1]);
translate([91,20,0]) cube([4,18,1]);
}
module blankBottom() {
intersection() {
blank();
cube([98,57.2,1]);
}
}
module blankTop() {
intersection() {
blank();
translate([0,0,1]) cube([98,57.2,3]);
}
}
module extendedBlank() {
blankBottom();
translate([0,0,1]) {
linear_extrude(0.5) projection() blankBottom();
}
translate([0,0,0.5]) {
blankTop();
clipRenforcement();
}
}
module clipRenforcement() {
translate([92.5,23.48,0.5]) {
hull() {
cylinder(d=11, h=1.5);
translate([0,10.2,0]) cylinder(d=11, h=1.5);
}
}
}
module clipHole() {
translate([92.65,23.48,0]) {
hull() {
cylinder(d=4.5, h=20);
translate([0,10.2,0]) cylinder(d=4.5, h=20);
}
}
}
module hexagon(diameter) {
rotate([0,0,30]) cylinder(d=diameter,h=2, $fn=6);
}
module hexagons() {
diameter=10;
for(x = [1 : 1 : 8]) {
for(y = [1 : 1 : 20]) {
gap=0;
offsetX = ((y/2) == round(y/2)) ? (diameter/2)-(gap/2):0;
offsetY = 3;
translate([((diameter-gap)*x)-offsetX,((diameter-gap-1)*y)-offsetY,0]) hexagon(diameter);
}
}
}
module triangle(size) {
cylinder(d=size,h=2, $fn=3);
}
module triangles() {
size=10;
for(x = [1 : 1 : 8]) {
for(y = [1 : 1 : 20]) {
gap=5;
offsetX = ((y/2) == round(y/2)) ? (size/2)-(gap/2):2;
offsetY = 3;
translate([((size-gap)*x)-offsetX,((size-gap-1)*y)-offsetY,0]) rotate([0,0,180*y]) triangle(size);
}
}
}
module star(size) {
rotate([0,0,0]) cylinder(d=size,h=2, $fn=3);
rotate([0,0,60]) cylinder(d=size,h=2, $fn=3);
}
module stars() {
size=11;
for(x = [1 : 1 : 8]) {
for(y = [1 : 1 : 20]) {
gap=-2;
offsetX = ((y/2) == round(y/2)) ? (size/2)-(gap/2):0;
offsetY = 3;
translate([((size-gap)*x)-offsetX,((size-gap-1)*y)-offsetY,0]) rotate([0,0,180*y]) star(size);
}
}
}
module wineGlass() {
linear_extrude(height=2) projection(cut=true) {
scale(0.03) surface(file="reference/wine-glass.png", center=true, invert=true, convexity=5);
}
}
module wineGlasses() {
for(x = [1 : 1 : 5]) {
for(y = [1 : 1 : 5]) {
gapX=17;
gapY=9;
offsetX = ((y/2) == round(y/2)) ? (gapX/2):0;
offsetY = 3;
translate([(gapX*x)-offsetX,(gapY*y)-offsetY,0]) rotate([0,0,-90]) wineGlass();
}
}
}
module badgeHolder() {
difference() {
union() {
extendedBlank();
translate([0,0,0.5]) {
clipRenforcement();
}
}
clipHole();
}
}
module holderWithHexagons() {
difference() {
badgeHolder();
union() {
intersection() {
backArea();
hexagons();
}
}
}
}
module holderWithStars() {
difference() {
badgeHolder();
union() {
intersection() {
backArea();
translate([-1,2,0]) stars();
}
}
}
}
module holderWithWineGlasses() {
difference() {
badgeHolder();
translate([-8,4.5,0]) wineGlasses();
}
}
holderWithHexagons();
//Part: holderWithHexagons();
//Part: holderWithStars();
//Part: holderWithWineGlasses();