174 lines
5.9 KiB
OpenSCAD
174 lines
5.9 KiB
OpenSCAD
|
echo("Added library: box_laser");
|
||
|
echo("Usage: Box2D();");
|
||
|
echo("Box2D (CUBE = [100, 200, 50], MATERIAL = 3, SIDE_TABS = 1, BOTTOM = true, BOTTOM_TABS = 3, TOP = true, TOP_TABS = 4, PADDING = 4, PROJECTION = false)");
|
||
|
|
||
|
module Box2D (CUBE = [100, 200, 50], MATERIAL = 3, SIDE_TABS = 1, BOTTOM = true, BOTTOM_TABS = 3, TOP = true, TOP_TABS = 4, PADDING = 4, PROJECTION = false) {
|
||
|
X = CUBE[0]; //WIDTH
|
||
|
Y = CUBE[1]; //LENGTH
|
||
|
Z = CUBE[2]; //HEIGHT
|
||
|
|
||
|
echo("MATERIAL", MATERIAL);
|
||
|
echo("X", X);
|
||
|
echo("Y", Y);
|
||
|
echo("Z", Z);
|
||
|
echo("SIDE_TABS", SIDE_TABS);
|
||
|
echo("BOTTOM", BOTTOM);
|
||
|
echo("BOTTOM_TABS", BOTTOM_TABS);
|
||
|
echo("TOP", TOP);
|
||
|
echo("TOP_TABS", TOP_TABS);
|
||
|
echo("PADDING", PADDING);
|
||
|
|
||
|
module Side (x, y) {
|
||
|
difference () {
|
||
|
cube([x, y, MATERIAL], center = true);
|
||
|
|
||
|
translate([(x / 2) - (MATERIAL/2) + 0.1, 0, 0 ]) {
|
||
|
rotate([0, 0, 90]) {
|
||
|
Tabs(y, SIDE_TABS, false);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
translate([-(x / 2) + (MATERIAL/2) - 0.1, 0, 0 ]) {
|
||
|
rotate([0, 0, 90]) {
|
||
|
Tabs(y, SIDE_TABS, true);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Bottom
|
||
|
if (BOTTOM && BOTTOM_TABS != 0) {
|
||
|
translate([0, (y / 2) - (MATERIAL/2) + 0.1, 0 ]) {
|
||
|
Tabs(x, BOTTOM_TABS, true);
|
||
|
}
|
||
|
} else if (BOTTOM && BOTTOM_TABS == 0) {
|
||
|
translate([0, (y / 2) - (MATERIAL/2) + 0.1, 0 ]) {
|
||
|
cube([X, MATERIAL, MATERIAL], center = true);
|
||
|
}
|
||
|
}
|
||
|
//Top
|
||
|
if (TOP && TOP_TABS != 0) {
|
||
|
translate([0, -(y / 2) + (MATERIAL/2) - 0.1, 0 ]) {
|
||
|
Tabs(x, TOP_TABS, true);
|
||
|
}
|
||
|
} else if (TOP && TOP_TABS == 0) {
|
||
|
translate([0, -(y / 2) + (MATERIAL/2) - 0.1, 0 ]) {
|
||
|
cube([X, MATERIAL, MATERIAL], center = true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module Bottom () {
|
||
|
difference () {
|
||
|
cube([X, Y, MATERIAL], center = true);
|
||
|
if (BOTTOM_TABS != 0) {
|
||
|
translate([(X / 2) - (MATERIAL / 2) + 0.1, 0, 0 ]) {
|
||
|
rotate([0, 0, 90]) {
|
||
|
Tabs(Y, BOTTOM_TABS, false);
|
||
|
}
|
||
|
}
|
||
|
translate([-(X / 2) + (MATERIAL / 2) - 0.1, 0, 0 ]) {
|
||
|
rotate([0, 0, 90]) {
|
||
|
Tabs(Y, BOTTOM_TABS, false);
|
||
|
}
|
||
|
}
|
||
|
translate([0, (Y / 2) - (MATERIAL / 2) + 0.1, 0 ]) {
|
||
|
Tabs(X, BOTTOM_TABS, false);
|
||
|
}
|
||
|
translate([0, (-Y / 2) + (MATERIAL / 2) - 0.1, 0 ]) {
|
||
|
Tabs(X, BOTTOM_TABS, false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module Top () {
|
||
|
difference () {
|
||
|
cube([X, Y, MATERIAL], center = true);
|
||
|
if (TOP_TABS != 0) {
|
||
|
translate([(X / 2) - (MATERIAL / 2) + 0.1, 0, 0 ]) {
|
||
|
rotate([0, 0, 90]) {
|
||
|
Tabs(Y, TOP_TABS, false);
|
||
|
}
|
||
|
}
|
||
|
translate([-(X / 2) + (MATERIAL / 2) - 0.1, 0, 0 ]) {
|
||
|
rotate([0, 0, 90]) {
|
||
|
Tabs(Y, TOP_TABS, false);
|
||
|
}
|
||
|
}
|
||
|
translate([0, (Y / 2) - (MATERIAL / 2) + 0.1, 0 ]) {
|
||
|
Tabs(X, TOP_TABS, false);
|
||
|
}
|
||
|
translate([0, (-Y / 2) + (MATERIAL / 2) - 0.1, 0 ]) {
|
||
|
Tabs(X, TOP_TABS, false);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module Inner () {
|
||
|
cube([X - (MATERIAL * 2), Y - (MATERIAL * 2), MATERIAL], center = true);
|
||
|
}
|
||
|
|
||
|
module Tabs (side, number, positive) {
|
||
|
size = side / (number * 2);
|
||
|
if (positive) {
|
||
|
Tab_build (side, size, number);
|
||
|
} else {
|
||
|
difference () {
|
||
|
cube([side, MATERIAL, MATERIAL], center = true);
|
||
|
Tab_build(side, size, number);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module Tab_build (side, size, number) {
|
||
|
for (i = [0 : number]) {
|
||
|
x = (size * (i * 2)) - side/2;
|
||
|
translate([x, 0, 0]) {
|
||
|
cube([size, MATERIAL, MATERIAL], center = true);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//SIDES X
|
||
|
if (PROJECTION) {
|
||
|
projection(cut = true) {
|
||
|
Side(X, Z, 2);
|
||
|
translate([X + PADDING, 0, 0]) Side(X, Z, 2);
|
||
|
//SIDES Y
|
||
|
translate([(X * 1.5) + (Y / 2) + (PADDING * 2), 0, 0]) Side(Y, Z, 2);
|
||
|
translate([(X * 1.5) + (Y /2) + (PADDING * 2), Z + PADDING, 0]) Side(Y, Z, 2);
|
||
|
|
||
|
if (BOTTOM) {
|
||
|
translate([0, (Y / 2) + (Z / 2) + PADDING, 0]) Bottom();
|
||
|
if (BOTTOM_TABS == 0) {
|
||
|
translate([0, (Y / 2) + (Z / 2) + PADDING, 0]) Inner();
|
||
|
}
|
||
|
}
|
||
|
if (TOP) {
|
||
|
translate([X + PADDING, (Y / 2) + (Z / 2) + PADDING, 0]) Top();
|
||
|
if (TOP_TABS == 0) {
|
||
|
translate([X + PADDING, (Y / 2) + (Z / 2) + PADDING, 0]) Inner();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
Side(X, Z, 2);
|
||
|
translate([X + PADDING, 0, 0]) Side(X, Z, 2);
|
||
|
//SIDES Y
|
||
|
translate([(X * 1.5) + (Y / 2) + (PADDING * 2), 0, 0]) Side(Y, Z, 2);
|
||
|
translate([(X * 1.5) + (Y /2) + (PADDING * 2), Z + PADDING, 0]) Side(Y, Z, 2);
|
||
|
|
||
|
if (BOTTOM) {
|
||
|
translate([0, (Y / 2) + (Z / 2) + PADDING, 0]) Bottom();
|
||
|
if (BOTTOM_TABS == 0) {
|
||
|
translate([0, (Y / 2) + (Z / 2) + PADDING, 0]) Inner();
|
||
|
}
|
||
|
}
|
||
|
if (TOP) {
|
||
|
translate([X + PADDING, (Y / 2) + (Z / 2) + PADDING, 0]) Top();
|
||
|
if (TOP_TABS == 0) {
|
||
|
translate([X + PADDING, (Y / 2) + (Z / 2) + PADDING, 0]) Inner();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|