3d-printing/gridfinity-bin-label/label.scad
Felipe M. e13e743d9d
Add battery symbol and switch box label preset to "PILAS"
Add sym_battery to the shared label decoration library: an upright cell
with a solid terminal nub and "+"/"-" marks in the hollow body. Register
it in symbol_shape and add it to the customizer dropdowns of both the bin
label and the box label.

Switch the gridfinity-box-label customizer defaults to a centered "PILAS"
text flanked by two battery symbols, replacing the M2-M5 screw preset.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018WMwnWKAqyrQveSoyi6o93
2026-09-09 22:31:46 +02:00

303 lines
9.2 KiB
OpenSCAD

// Original source: https://github.com/CullenJWebb/Cullenect-Labels
use <../lib/label-decorations/label-decorations.scad>
/* [General Settings] */
//I want to generate...
Select_Output=0; // [0:Label, 10:Socket test fit, 11:Socket Negative Volume]
//model = "" // ["Cullenect label","Socket test fit","Socket Negative Volume"]
// Width in gridfinity units
label_width = 1; // .1
// Generate V1 Latches for 1U labels?
backward_compatible = true;
// Deboss Text?
label_deboss = false;
/* [Label Text 1] */
// Multi-line text: use \n to split. Distance between line centers as a multiple of font size.
Text_Line_Spacing = 1.2; // .1
// Label Text
Text1 = "M5*8";
// Text Alignment
Text1_Align = "center"; // ["left","center","right"]
// Font Size
Text1_Font_Size = 4; // .1
// Font Family
Text1_Font = "Open Sans"; // [Open Sans, Open Sans Condensed, Ubuntu, Montserrat]
// Font Style
Text1_Font_Style = "Bold"; // [Regular,Black,Bold,ExtraBol,ExtraLight,Light,Medium,SemiBold,Thin,Italic,Black Italic,Bold Italic,ExtraBold Italic,ExtraLight Italic,Light Italic,Medium Italic,SemiBold Italic,Thin Italic]
// Adjust X and Y Position
Text1_XY = [0,0]; // .1
/* [Label Text 2] */
// Label Text
Text2 = "";
// Text Alignment
Text2_Align = "right"; // ["left","center","right"]
// Font Size
Text2_Font_Size = 4; // .1
// Font Family
Text2_Font = "Open Sans"; // [Open Sans, Open Sans Condensed, Ubuntu, Montserrat]
// Font Style
Text2_Font_Style = "Bold"; // [Regular,Black,Bold,ExtraBol,ExtraLight,Light,Medium,SemiBold,Thin,Italic,Black Italic,Bold Italic,ExtraBold Italic,ExtraLight Italic,Light Italic,Medium Italic,SemiBold Italic,Thin Italic]
// Adjust X and Y Position
Text2_XY = [-2,0]; // .1
/* [Symbol 1] */
// Symbol shape (set to "none" to omit)
Symbol1 = "side_pan"; // [none, hex_rounded, hex_flat, phillips, slotted, torx, square, pozidriv, bit_phillips, bit_slotted, bit_hex, bit_torx, bit_square, bit_pozidriv, side_cap, side_flat, side_pan, side_button, side_hex, washer, nut, printer, magnet, battery]
// Symbol Alignment
Symbol1_Align = "left"; // ["left","center","right"]
// Symbol diameter in mm
Symbol1_Size = 7; // .1
// Stroke thickness for symbol details (cross, slot, star arms)
Symbol1_Stroke = 1.0; // .1
// Adjust X and Y Position
Symbol1_XY = [1,0]; // .1
/* [Symbol 2] */
// Symbol shape (set to "none" to omit)
Symbol2 = "hex_rounded"; // [none, hex_rounded, hex_flat, phillips, slotted, torx, square, pozidriv, bit_phillips, bit_slotted, bit_hex, bit_torx, bit_square, bit_pozidriv, side_cap, side_flat, side_pan, side_button, side_hex, washer, nut, printer, magnet, battery]
// Symbol Alignment
Symbol2_Align = "right"; // ["left","center","right"]
// Symbol diameter in mm
Symbol2_Size = 7; // .1
// Stroke thickness for symbol details (cross, slot, star arms)
Symbol2_Stroke = 1.0; // .1
// Adjust X and Y Position
Symbol2_XY = [-2,0]; // .1
/* [Advanced] */
// Increase or decrease resolution of certain details
$fs = 0.01; // .01
// Use gridfinity U
gridfinity = true;
// Width of label in mm
labelXmm = 36.0; // .1
// Height of label in mm
labelYmm = 11.0; // .1
// Thickness of label in mm
labelZmm = 1.2; // .1
/* [Hidden] */
gridfinityX = 42; // Grid size for gridfinity units.
labelX = (gridfinity) ? (label_width * gridfinityX) - 6 : labelXmm;
labelY = (gridfinity) ? 11 : labelYmm;
labelZ = (gridfinity) ? 1.2 : labelZmm;
latchX = 0.2; // Width of socket on label walls
latchZ = 0.6; // Z-height of wall socket
decoration_extrude = 0.4;
decoration_z = labelZ - 0.2;
// V1 Label with new wall sockets
// Will only generate V1 label XY with V2 label Z
module Cullenect_Label_V1() {
// Variables
labelX_v1 = 36;
labelY_v1 = 11;
$midX1 = 4.695;
$midX2 = 10.18;
$midlatchX = 1.95;
$bottomX1 = 5.395;
$bottomX2 = 11.18;
$bottomlatchX = 0.95;
// Base below socket
// Base #1
color("Silver")
RoundedCube([$bottomX1, labelY_v1, 0.2], 0.5);
// Base #2
translate([$bottomX1 + $bottomlatchX,0,0])
color("Silver")
RoundedCube([$bottomX2, labelY_v1, 0.2], 0.5);
// Base #3
translate([$bottomX1 + $bottomlatchX + $bottomX2 + $bottomlatchX,0,0])
color("Silver")
RoundedCube([$bottomX2, labelY_v1, 0.2], 0.5);
// Base #4
translate([$bottomX1 + $bottomlatchX + $bottomX2 + $bottomlatchX + $bottomlatchX + $bottomX2,0,0])
color("Silver")
RoundedCube([$bottomX1, labelY_v1, 0.2], 0.5);
// Middle along socket
// Middle #1
translate([latchX,latchX,0.2])
color("Gray")
RoundedCube([$midX1, labelY_v1 - (latchX * 2), 0.6], 0.5);
// Middle #2
translate([latchX + $midX1 + $midlatchX,latchX,0.2])
color("Gray")
RoundedCube([$midX2, labelY_v1 - (latchX * 2), 0.6], 0.5);
// Middle #3
translate([latchX + $midX1 + $midlatchX + $midX2 + $midlatchX,latchX,0.2])
color("Gray")
RoundedCube([$midX2, labelY_v1 - (latchX * 2), 0.6], 0.5);
// Middle #4
translate([latchX + $midX1 + $midlatchX + $midX2 + $midlatchX + $midX2 + $midlatchX,latchX,0.2])
color("Gray")
RoundedCube([$midX1, labelY_v1 - (latchX * 2), 0.6], 0.5);
// Top above socket
translate([0,0,0.8])
color("Silver")
RoundedCube([labelX_v1, labelY_v1, 0.4], 0.5);
}
// V2 Label without backward compatibility
module Cullenect_Label_V2() {
// Label base below socket
color("Silver")
RoundedCube([labelX, labelY, 0.2], 0.5);
// Label middle within socket
translate([latchX,latchX,0])
color("Gray")
RoundedCube([labelX - (latchX * 2), labelY - (latchX * 2), labelZ - 0.2], 0.5);
// Label top above socket
translate([0,0,0.2 + latchZ])
color("Silver")
RoundedCube([labelX, labelY, (labelZ - 0.2) - latchZ], 0.5);
}
// Module to generate the correct label type
module Cullenect_Label() {
if (backward_compatible && gridfinity && (label_width == 1)){
Cullenect_Label_V1();
} else {
Cullenect_Label_V2();
}
}
// Combined text + symbol overlay using shared helpers
module label_decorations() {
color("Gray") {
label_text(Text1,
text_x(Text1_Align, Text1_XY.x, labelX),
(labelY / 2) + Text1_XY.y, decoration_z,
Text1_Font_Size, Text1_Font, Text1_Font_Style, Text1_Align,
decoration_extrude,
Text1_Font_Size * Text_Line_Spacing);
label_text(Text2,
text_x(Text2_Align, Text2_XY.x, labelX),
(labelY / 2) + Text2_XY.y, decoration_z,
Text2_Font_Size, Text2_Font, Text2_Font_Style, Text2_Align,
decoration_extrude,
Text2_Font_Size * Text_Line_Spacing);
label_symbol(Symbol1,
symbol_x(Symbol1_Align, Symbol1_Size, Symbol1_XY.x, labelX),
(labelY / 2) + Symbol1_XY.y, decoration_z,
Symbol1_Size, Symbol1_Stroke, decoration_extrude);
label_symbol(Symbol2,
symbol_x(Symbol2_Align, Symbol2_Size, Symbol2_XY.x, labelX),
(labelY / 2) + Symbol2_XY.y, decoration_z,
Symbol2_Size, Symbol2_Stroke, decoration_extrude);
}
}
// Join or difference the label and decorations
module cullenect_label_text(){
if (label_deboss) {
difference() {
Cullenect_Label();
label_decorations();
}
} else {
union() {
Cullenect_Label();
label_decorations();
}
}
}
*cullenect_label_text();
// Socket and Socket Negative Variables
socket_offset = 0.3;
socket_walls = 2;
socketX = labelX + socket_offset;
socketY = labelY + socket_offset;
ribZ = 0.4;
// Generate socket
module cullenect_socket(){
union(){
difference(){
translate([-socket_walls,-socket_walls,-1])
color("Silver")
RoundedCube([labelX + (socket_walls * 2), socketY + (socket_walls * 2), labelZ + 1], 0.2);
color("Gray")
RoundedCube([socketX, socketY, labelZ + 1], 0.5);
}
translate([0,0,0.2])
color("Silver")
cube([socketX, latchX, ribZ]);
translate([0, socketY - latchX,0.2])
color("Silver")
cube([socketX, latchX, ribZ]);
}
}
// Generate negative volume of socket
module cullenect_socket_negative(){
difference(){
color("Gray")
RoundedCube([socketX, socketY, labelZ], 0.5);
cullenect_socket();
}
}
// Vertical socket variables
vsocketY = labelZ - latchZ - 0.2; // define starting pos and depth
vsocketZ = socketY + 1; // Vertical height with 45 degree ceiling
// Generate vertical socket
// Unlike the h-socket and label this starts with the negative volume due to easier rounded edges
// Rounded edges are needed for the vertical printing of the ribbing
module cullenect_vertical_socket() {
difference(){
// Create base
union(){
cube([socketX, vsocketY / 2, vsocketZ]);// front of socket, no rounding
RoundedCube([socketX, vsocketY, vsocketZ], 0.1);// front of socket, rounded inside around rib
translate([0,vsocketY,0])
cube([socketX,latchZ,vsocketZ]); // Middle of socket, to be cut away later by rounded cube for rib
translate([-0.2,vsocketY + latchZ,0])
RoundedCube([socketX + 0.4, vsocketY, vsocketZ], 0.1);
}
// Remove rounded ribs
translate([-1,vsocketY,0])
RoundedCube([latchX + 1, latchZ, vsocketZ], 0.1);
translate([socketX - latchX,vsocketY,0])
RoundedCube([latchX + 1, latchZ, vsocketZ], 0.1);
// remove 45 degree top
translate([-2,labelZ / 2,vsocketY])
RoundedCube([latchX + 1, latchZ, vsocketZ], 0.1);
}
}
*cullenect_vertical_socket();
// Vertical Socket still under development
// Generate Selected Model...
module selected_model() {
if (Select_Output == 10) {cullenect_socket();}
else if (Select_Output == 11) {cullenect_socket_negative();}
else {cullenect_label_text();}
}
selected_model();