102 lines
2.3 KiB
OpenSCAD
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]);
|
|
}
|
|
} |