mirror of
https://github.com/BelfrySCAD/BOSL2.git
synced 2025-01-01 09:49:45 +00:00
Speed optimizations for incompletely rounded cuboid()s.
This commit is contained in:
parent
b602aee292
commit
74de24bbce
2 changed files with 65 additions and 62 deletions
125
shapes.scad
125
shapes.scad
|
@ -63,9 +63,9 @@
|
||||||
// cuboid(40) show_anchors();
|
// cuboid(40) show_anchors();
|
||||||
module cuboid(
|
module cuboid(
|
||||||
size=[1,1,1],
|
size=[1,1,1],
|
||||||
p1=undef, p2=undef,
|
p1, p2,
|
||||||
chamfer=undef,
|
chamfer,
|
||||||
rounding=undef,
|
rounding,
|
||||||
edges=EDGES_ALL,
|
edges=EDGES_ALL,
|
||||||
except_edges=[],
|
except_edges=[],
|
||||||
trimcorners=true,
|
trimcorners=true,
|
||||||
|
@ -73,6 +73,49 @@ module cuboid(
|
||||||
spin=0,
|
spin=0,
|
||||||
orient=UP
|
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);
|
size = scalar_vec3(size);
|
||||||
edges = edges(edges, except=except_edges);
|
edges = edges(edges, except=except_edges);
|
||||||
if (!is_undef(p1)) {
|
if (!is_undef(p1)) {
|
||||||
|
@ -156,32 +199,15 @@ module cuboid(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
difference() {
|
hull() {
|
||||||
cube(size, center=true);
|
corner_shape([-1,-1,-1]);
|
||||||
|
corner_shape([ 1,-1,-1]);
|
||||||
// Chamfer edges
|
corner_shape([-1, 1,-1]);
|
||||||
for (i = [0:3], axis=[0:2]) {
|
corner_shape([ 1, 1,-1]);
|
||||||
if (edges[axis][i]>0) {
|
corner_shape([-1,-1, 1]);
|
||||||
translate(vmul(EDGE_OFFSETS[axis][i], size/2)) {
|
corner_shape([ 1,-1, 1]);
|
||||||
rotate(majrots[axis]) {
|
corner_shape([-1, 1, 1]);
|
||||||
zrot(45) cube([chamfer*sqrt(2), chamfer*sqrt(2), size[axis]+0.01], center=true);
|
corner_shape([ 1, 1, 1]);
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (rounding != undef) {
|
} else if (rounding != undef) {
|
||||||
|
@ -258,38 +284,15 @@ module cuboid(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
difference() {
|
hull() {
|
||||||
cube(size, center=true);
|
corner_shape([-1,-1,-1]);
|
||||||
|
corner_shape([ 1,-1,-1]);
|
||||||
// Round edges.
|
corner_shape([-1, 1,-1]);
|
||||||
for (i = [0:3], axis=[0:2]) {
|
corner_shape([ 1, 1,-1]);
|
||||||
if (edges[axis][i]>0) {
|
corner_shape([-1,-1, 1]);
|
||||||
difference() {
|
corner_shape([ 1,-1, 1]);
|
||||||
translate(vmul(EDGE_OFFSETS[axis][i], size/2)) {
|
corner_shape([-1, 1, 1]);
|
||||||
rotate(majrots[axis]) cube([rounding*2, rounding*2, size[axis]+0.1], center=true);
|
corner_shape([ 1, 1, 1]);
|
||||||
}
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
BOSL_VERSION = [2,0,438];
|
BOSL_VERSION = [2,0,439];
|
||||||
|
|
||||||
|
|
||||||
// Section: BOSL Library Version Functions
|
// Section: BOSL Library Version Functions
|
||||||
|
|
Loading…
Reference in a new issue