spego/Lego.scad

102 lines
2.3 KiB
OpenSCAD

/* [Lego Type] */
type = "brick"; // ["brick":Brick, "plate":Plate, "slope45":"Slope 45"]
studs_x = 4;
studs_y = 2;
slice_x = false;
/* [Hidden] */
block_height =
(type == "brick" || type == "slope45") ? 9.6 :
type == "plate" ? 3.2 :
0;
length_per_stud = 31.8 / 4;
wall_width = 1.6;
ceiling_width = 1;
$fs = 1;
assert(block_height > 0, "Invalid block height. Perhaps type is not correct?");
assert(studs_x >= studs_y, "studs_x must be equal or larger than studs_y");
module stud() {
cylinder(d = 4.8, h = 1.8);
}
module studs() {
for (x = [0:studs_x-1], y = [0:studs_y-1])
translate([(x+0.5) * length_per_stud, (y+0.5) * length_per_stud, 0])
stud();
}
module base() {
width = (studs_y + (type == "slope45" ? 1 : 0)) * length_per_stud;
length = studs_x * length_per_stud;
difference() {
cube([ length, width, block_height ]);
translate([wall_width, wall_width, -ceiling_width]) {
difference() {
cube([
length - wall_width * 2,
width - wall_width * 2,
block_height
]);
if (type == "slope45") {
translate([-wall_width, width-wall_width/2-wall_width*1.4, 3.2])
rotate([45, 0, 0])
cube([length + 2, length_per_stud, block_height]);
}
}
}
}
}
module pillar() {
cylinder(h = block_height, d = 6.48);
}
module small_pillar() {
cylinder(h = block_height, d = 3.2);
}
module pillars() {
if (type == "slope45") {
for (x = [0:studs_x-2], y = [0:studs_y-1])
translate([(x+1) * length_per_stud, (y+1) * length_per_stud, 0])
pillar();
} else if (studs_x >= 2 && studs_y >= 2) {
for (x = [0:studs_x-2], y = [0:studs_y-2])
translate([(x+1) * length_per_stud, (y+1) * length_per_stud, 0])
pillar();
} else if (studs_x >= 2) {
for (x = [0:studs_x-2])
translate([(x+1) * length_per_stud, length_per_stud/2, 0])
small_pillar();
}
}
module block() {
width = (studs_y + (type == "slope45" ? 1 : 0)) * length_per_stud;
length = studs_x * length_per_stud;
difference() {
union() {
base();
pillars();
translate([0, 0, block_height])
studs();
}
if (type == "slope45") {
translate([-1, width-wall_width, 3.2])
rotate([45, 0, 0])
translate([0, 1, -10])
cube([length + 2, 10, 20]);
}
}
}
difference() {
color([0.9, 0.8, 0])
block();
if (slice_x) {
translate([10, -10, -10])
cube([100, 100, 100]);
}
}