162 lines
No EOL
3.9 KiB
OpenSCAD
162 lines
No EOL
3.9 KiB
OpenSCAD
/*
|
|
Created by Kevin Gravier
|
|
https://www.thingiverse.com/mrkmg/about
|
|
|
|
My take on a top and bottom fillet for a 3d shape.
|
|
|
|
Available Modules:
|
|
|
|
topBottomFillet(b, t, r, s, e)
|
|
b = z of bottom of 3d object
|
|
t = z of top of 3d object
|
|
r = radius of fillet
|
|
s = steps of filler (smaller is smoother)
|
|
e = enabled (pass e = 0 to disable fillet for faster preview)
|
|
|
|
topFillet(t, r, s, e)
|
|
t = z of top of 3d object
|
|
r = radius of fillet
|
|
s = steps of filler (smaller is smoother)
|
|
e = enabled (pass e = 0 to disable fillet for faster preview)
|
|
|
|
bottomFillet(b, r, s, e)
|
|
b = z of bottom of 3d object
|
|
r = radius of fillet
|
|
s = steps of filler (smaller is smoother)
|
|
e = enabled (pass e = 0 to disable fillet for faster preview)
|
|
|
|
*/
|
|
|
|
enable = 1;
|
|
|
|
// Example, hard edges
|
|
translate([0, 20, 0])
|
|
topBottomFillet(b = 0, t = 10, r = 2, s = 20, e = enable)
|
|
linear_extrude(10, scale = 1.2)
|
|
difference() {
|
|
union() {
|
|
square([10, 10], true);
|
|
translate([-15, 0]) circle(15);
|
|
}
|
|
translate([-15, 0]) circle(8);
|
|
translate([-15, 0]) square([13, 13], center = true);
|
|
}
|
|
|
|
// Example, soft edges
|
|
use <fillets2d.scad>;
|
|
translate([0, -20, 0])
|
|
topBottomFillet(b = 0, t = 10, r = 1, s = 10, e = enable)
|
|
linear_extrude(10)
|
|
rounding2d(1)
|
|
fillet2d(1)
|
|
difference() {
|
|
union() {
|
|
square([10, 10], true);
|
|
translate([-15, 0]) circle(15);
|
|
}
|
|
translate([-15, 0]) circle(8);
|
|
translate([-15, 0]) square([13, 13], center = true);
|
|
}
|
|
|
|
|
|
// Example, text
|
|
translate([-60, 40])
|
|
rotate([0, 0, -90])
|
|
topBottomFillet(b = 0, t = 3, r = .5, s = 5, e = enable)
|
|
linear_extrude(3)
|
|
text("Fillets!", size = 20);
|
|
|
|
|
|
// Library
|
|
|
|
function filletDepth(r, d, i) = r * cos(asin(d * i / r));
|
|
|
|
module topBottomFillet(b = 0, t = 2, r = 1, s = 4, e = 1) {
|
|
if (e == 1) {
|
|
topFilletPeice(t = t, r = r, s = s) children(0);
|
|
bottomFilletPeice(b = b, r = r, s = s) children(0);
|
|
|
|
render()
|
|
difference() {
|
|
children(0);
|
|
|
|
translate([0, 0, t - r])
|
|
linear_extrude(r + 1)
|
|
offset(delta = 1e5)
|
|
projection()
|
|
children(0);
|
|
|
|
translate([0, 0, b - 1])
|
|
linear_extrude(r + 1)
|
|
offset(delta = 1e5)
|
|
projection()
|
|
children(0);
|
|
|
|
}
|
|
}
|
|
if (e == 0) children(0);
|
|
}
|
|
|
|
module topFillet(t = 2, r = 1, s = 4, e = 1) {
|
|
if (e == 1) {
|
|
topFilletPeice(t = t, r = r, s = s) children(0);
|
|
|
|
render()
|
|
difference() {
|
|
children(0);
|
|
translate([0, 0, t-r])
|
|
linear_extrude(r + 1)
|
|
offset(delta = 1e5)
|
|
projection()
|
|
children(0);
|
|
}
|
|
}
|
|
if (e == 0) children(0);
|
|
}
|
|
|
|
module bottomFillet(b = 0, r = 1, s = 4, e = 1) {
|
|
if (e == 1) {
|
|
bottomFilletPeice(b = b, r = r, s = s) children(0);
|
|
|
|
render()
|
|
difference() {
|
|
children(0);
|
|
translate([0, 0, b - r - 1])
|
|
linear_extrude(r + 1)
|
|
offset(delta = 1e5)
|
|
projection()
|
|
children(0);
|
|
}
|
|
}
|
|
if (e == 0) children(0);
|
|
}
|
|
|
|
module topFilletPeice(t = 2, r = 1, s = 4) {
|
|
d = r/s;
|
|
|
|
for (i = [0:s]) {
|
|
x = filletDepth(r, d, i);
|
|
z = d * (s - i + 1);
|
|
translate([0, 0, t - z])
|
|
linear_extrude(d)
|
|
offset(delta = -r + x)
|
|
projection(true)
|
|
translate([0, 0, -t + z])
|
|
children(0);
|
|
}
|
|
}
|
|
|
|
module bottomFilletPeice(b = 0, r =1, s = 4) {
|
|
d = r/s;
|
|
|
|
for (i = [0:s]) {
|
|
x = filletDepth(r, d, i);
|
|
z = d * (s - i);
|
|
translate([0, 0, b + z])
|
|
linear_extrude(d)
|
|
offset(delta = -r + x)
|
|
projection(true)
|
|
translate([0, 0, b - z])
|
|
children(0);
|
|
}
|
|
} |