mcopy/scad/box_laser.scad

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();
}
}
}
}