mirror of
https://github.com/JustinSDK/dotSCAD.git
synced 2025-01-17 14:18:13 +01:00
253 lines
6.1 KiB
OpenSCAD
253 lines
6.1 KiB
OpenSCAD
use <voxel/vx_circle.scad>;
|
|
use <voxel/vx_polygon.scad>;
|
|
|
|
w = 5;
|
|
merged_dino = false;
|
|
eye_spacing = 0.4;
|
|
base_x_blocks = 10;
|
|
base_y_blocks = 6;
|
|
|
|
part = "DEMO"; // [DINO, EYE, CACTUS, BASE, DEMO]
|
|
|
|
module chrome_dino(w, merged = false) {
|
|
module body(w) {
|
|
difference() {
|
|
polygon([
|
|
[0, 0],
|
|
[0, w],
|
|
[-3 * w, w],
|
|
[-3 * w, 2 * w],
|
|
[-4 * w, 2 * w],
|
|
[-4 * w, 3 * w],
|
|
[-5 * w, 3 * w],
|
|
[-5 * w, 9 * w],
|
|
[-4 * w, 9 * w],
|
|
[-4 * w, 7 * w],
|
|
[-3 * w, 7 * w],
|
|
[-3 * w, 6 * w],
|
|
[-2 * w, 6 * w],
|
|
[-2 * w, 5 * w],
|
|
[0, 5 * w],
|
|
[0, 6 * w],
|
|
[w, 6 * w],
|
|
[w, 7 * w],
|
|
[3 * w, 7 * w],
|
|
[3 * w, 8 * w],
|
|
[4 * w, 8 * w],
|
|
[4 * w, 9 * w],
|
|
[5 * w, 9 * w],
|
|
[5 * w, 15 * w],
|
|
[6 * w, 15 * w],
|
|
[6 * w, 16 * w],
|
|
[14 * w, 16 * w],
|
|
[14 * w, 15 * w],
|
|
[15 * w, 15 * w],
|
|
[15 * w, 11 * w],
|
|
[11 * w, 11 * w],
|
|
[11 * w, 10 * w],
|
|
[13 * w, 10 * w],
|
|
[13 * w, 9 * w],
|
|
[10 * w, 9 * w],
|
|
[10 * w, 3 * w],
|
|
[9 * w, 3 * w],
|
|
[9 * w, 2 * w],
|
|
[8 * w, 2 * w],
|
|
[8 * w, w],
|
|
[7 * w, w],
|
|
[7 * w, 0],
|
|
]);
|
|
|
|
translate([7 * w, 14 * w]) square(w, center = true);
|
|
}
|
|
}
|
|
|
|
module hand(w) {
|
|
polygon([
|
|
[10 * w, 7 * w],
|
|
[12 * w, 7 * w],
|
|
[12 * w, 5 * w],
|
|
[11 * w, 5 * w],
|
|
[11 * w, 6 * w],
|
|
[10 * w, 6 * w]
|
|
]);
|
|
}
|
|
|
|
module leg_l(w) {
|
|
polygon([
|
|
[5 * w, 0],
|
|
[5 * w, -w],
|
|
[6 * w, -w],
|
|
[6 * w, -4 * w],
|
|
[8 * w, -4 * w],
|
|
[8 * w, -3 * w],
|
|
[7 * w, -3 * w],
|
|
[7 * w, 0],
|
|
]);
|
|
}
|
|
|
|
module leg_r(w) {
|
|
polygon([
|
|
[w, 0],
|
|
[w, -4 * w],
|
|
[3 * w, -4 * w],
|
|
[3 * w, -3 * w],
|
|
[2 * w, -3 * w],
|
|
[2 * w, -2 * w],
|
|
[3 * w, -2 * w],
|
|
[3 * w, -w],
|
|
[4 * w, -w],
|
|
[4 * w, 0]
|
|
]);
|
|
}
|
|
|
|
module dino_left(w) {
|
|
linear_extrude(w * 2.5) body(w);
|
|
linear_extrude(w * 2) {
|
|
hand(w);
|
|
leg_l(w);
|
|
}
|
|
}
|
|
|
|
module dino_right(w) {
|
|
linear_extrude(w * 2.5) mirror([1, 0, 0]) body(w);
|
|
linear_extrude(w * 2) mirror([1, 0, 0]) {
|
|
hand(w);
|
|
leg_r(w);
|
|
}
|
|
}
|
|
|
|
if(merged) {
|
|
dino_left(w);
|
|
translate([0, 0, w * 5]) rotate([0, 180, 0]) dino_right(w);
|
|
} else {
|
|
translate([w * 6, 0, 0]) dino_left(w);
|
|
translate([w * -6, 0, 0]) dino_right(w);
|
|
}
|
|
}
|
|
|
|
module blocks(points) {
|
|
for(pt = points) {
|
|
translate(pt) square(1);
|
|
};
|
|
}
|
|
|
|
module cactus(w) {
|
|
linear_extrude(w * 3) {
|
|
translate([2 * w, w * 7])
|
|
scale(w)
|
|
blocks(
|
|
vx_polygon([
|
|
[0, 2],
|
|
[3, 2],
|
|
[5, 4],
|
|
[5, 10],
|
|
[5, 10],
|
|
[3, 10],
|
|
[3, 6],
|
|
[0, 4],
|
|
|
|
], filled = true)
|
|
);
|
|
|
|
translate([-2 * w, w * 5])
|
|
scale(w)
|
|
blocks(
|
|
vx_polygon([
|
|
[-1, 0],
|
|
[-3, 0],
|
|
[-6, 2],
|
|
[-6, 6],
|
|
[-6, 6],
|
|
[-4, 6],
|
|
[-4, 4],
|
|
[-1, 2],
|
|
|
|
], filled = true)
|
|
);
|
|
|
|
scale(w)
|
|
blocks(
|
|
vx_polygon([
|
|
[-2, 0],
|
|
[2, 0],
|
|
[2, 20],
|
|
[1, 22],
|
|
[0, 22],
|
|
[-1, 22],
|
|
[-2, 20]
|
|
], filled = true)
|
|
);
|
|
}
|
|
}
|
|
|
|
module base(w, base_x_blocks, base_y_blocks) {
|
|
linear_extrude(w) {
|
|
translate([0, -w])
|
|
square([base_x_blocks * w, base_y_blocks * w + 2 * w]);
|
|
|
|
translate([0, base_y_blocks * w / 2])
|
|
scale(w)
|
|
blocks(vx_circle(base_y_blocks / 2, filled = true));
|
|
|
|
translate([base_x_blocks * w, base_y_blocks * w / 2])
|
|
scale(w)
|
|
blocks(vx_circle(base_y_blocks / 2, filled = true));
|
|
}
|
|
}
|
|
|
|
module eye(w, eye_spacing) {
|
|
translate([0, 0, -eye_spacing])
|
|
rotate([0, -90, 0])
|
|
linear_extrude(w * 5)
|
|
offset(delta = -eye_spacing) square(w);
|
|
}
|
|
|
|
if(part == "DINO") {
|
|
chrome_dino(w, merged_dino);
|
|
}
|
|
else if(part == "EYE") {
|
|
eye(w, eye_spacing);
|
|
}
|
|
else if(part == "CACTUS") {
|
|
cactus(w);
|
|
}
|
|
else if(part == "BASE") {
|
|
base(w, base_x_blocks, base_y_blocks);
|
|
}
|
|
else if(part == "DEMO") {
|
|
wd = 5;
|
|
translate([0, wd * 5.5, wd * 5])
|
|
rotate([90, 0, 0]) {
|
|
color("DimGray") chrome_dino(wd, true);
|
|
color("white")
|
|
linear_extrude(wd * 5)
|
|
translate([7 * wd, 14 * wd]) square(wd, center = true);
|
|
}
|
|
color("white") base(wd, 10, 6);
|
|
|
|
translate([wd * 25, wd * 10, 0]) {
|
|
translate([wd * 4.25, wd * 4.25, 0])
|
|
color("SlateGray")
|
|
rotate([90, 0, 0])
|
|
cactus(wd);
|
|
|
|
color("white") base(wd, 10, 6);
|
|
}
|
|
|
|
translate([-wd * 35, wd * 10, 0]) {
|
|
color("SlateGray") {
|
|
translate([wd * 4.25, wd * 4, 0])
|
|
rotate([90, 0, 0])
|
|
mirror([1, 0, 0])
|
|
cactus(wd);
|
|
|
|
scale(0.75)
|
|
translate([wd * 30, wd * 5, 0])
|
|
rotate([90, 0, 0])
|
|
cactus(wd);
|
|
}
|
|
color("white") base(wd, 30, 6);
|
|
}
|
|
|
|
}
|