Speed optimizations for incompletely rounded cuboid()s.

This commit is contained in:
Garth Minette 2020-10-04 21:07:16 -07:00
parent b602aee292
commit 74de24bbce
2 changed files with 65 additions and 62 deletions

View file

@ -63,9 +63,9 @@
// cuboid(40) show_anchors();
module cuboid(
size=[1,1,1],
p1=undef, p2=undef,
chamfer=undef,
rounding=undef,
p1, p2,
chamfer,
rounding,
edges=EDGES_ALL,
except_edges=[],
trimcorners=true,
@ -73,6 +73,49 @@ module cuboid(
spin=0,
orient=UP
) {
module corner_shape(corner) {
e = corner_edges(edges, corner);
cnt = sum(e);
r = first_defined([chamfer, rounding, 0]);
$fn = is_finite(chamfer)? 4 : segs(r);
translate(vmul(corner,size/2-[r,r,r])) {
if (cnt == 0) {
cube(r*2, center=true);
} else if (cnt == 1) {
if (e.x) xcyl(l=r*2, r=r);
if (e.y) ycyl(l=r*2, r=r);
if (e.z) zcyl(l=r*2, r=r);
} else if (cnt == 2) {
if (!e.x) {
intersection() {
ycyl(l=r*2, r=r);
zcyl(l=r*2, r=r);
}
} else if (!e.y) {
intersection() {
xcyl(l=r*2, r=r);
zcyl(l=r*2, r=r);
}
} else {
intersection() {
xcyl(l=r*2, r=r);
ycyl(l=r*2, r=r);
}
}
} else {
if (trimcorners) {
spheroid(r=r, style="octa");
} else {
intersection() {
xcyl(l=r*2, r=r);
ycyl(l=r*2, r=r);
zcyl(l=r*2, r=r);
}
}
}
}
}
size = scalar_vec3(size);
edges = edges(edges, except=except_edges);
if (!is_undef(p1)) {
@ -156,32 +199,15 @@ module cuboid(
}
}
} else {
difference() {
cube(size, center=true);
// Chamfer edges
for (i = [0:3], axis=[0:2]) {
if (edges[axis][i]>0) {
translate(vmul(EDGE_OFFSETS[axis][i], size/2)) {
rotate(majrots[axis]) {
zrot(45) cube([chamfer*sqrt(2), chamfer*sqrt(2), size[axis]+0.01], center=true);
}
}
}
}
// Chamfer triple-edge corners.
if (trimcorners) {
for (za=[-1,1], ya=[-1,1], xa=[-1,1]) {
if (corner_edge_count(edges, [xa,ya,za]) > 2) {
translate(vmul([xa,ya,za]/2, size-[1,1,1]*chamfer*4/3)) {
rot(from=UP, to=[xa,ya,za]) {
cube(chamfer*3, anchor=BOTTOM);
}
}
}
}
}
hull() {
corner_shape([-1,-1,-1]);
corner_shape([ 1,-1,-1]);
corner_shape([-1, 1,-1]);
corner_shape([ 1, 1,-1]);
corner_shape([-1,-1, 1]);
corner_shape([ 1,-1, 1]);
corner_shape([-1, 1, 1]);
corner_shape([ 1, 1, 1]);
}
}
} else if (rounding != undef) {
@ -258,38 +284,15 @@ module cuboid(
}
}
} else {
difference() {
cube(size, center=true);
// Round edges.
for (i = [0:3], axis=[0:2]) {
if (edges[axis][i]>0) {
difference() {
translate(vmul(EDGE_OFFSETS[axis][i], size/2)) {
rotate(majrots[axis]) cube([rounding*2, rounding*2, size[axis]+0.1], center=true);
}
translate(vmul(EDGE_OFFSETS[axis][i], size/2 - [1,1,1]*rounding)) {
rotate(majrots[axis]) cyl(h=size[axis]+0.2, r=rounding, $fn=sides);
}
}
}
}
// Round triple-edge corners.
if (trimcorners) {
for (za=[-1,1], ya=[-1,1], xa=[-1,1]) {
if (corner_edge_count(edges, [xa,ya,za]) > 2) {
difference() {
translate(vmul([xa,ya,za], size/2)) {
cube(rounding*2, center=true);
}
translate(vmul([xa,ya,za], size/2-[1,1,1]*rounding)) {
spheroid(r=rounding, style="octa", $fn=sides);
}
}
}
}
}
hull() {
corner_shape([-1,-1,-1]);
corner_shape([ 1,-1,-1]);
corner_shape([-1, 1,-1]);
corner_shape([ 1, 1,-1]);
corner_shape([-1,-1, 1]);
corner_shape([ 1,-1, 1]);
corner_shape([-1, 1, 1]);
corner_shape([ 1, 1, 1]);
}
}
} else {

View file

@ -8,7 +8,7 @@
//////////////////////////////////////////////////////////////////////
BOSL_VERSION = [2,0,438];
BOSL_VERSION = [2,0,439];
// Section: BOSL Library Version Functions