Renamed exterior fillets to rounding

This commit is contained in:
Revar Desmera 2019-04-24 19:42:38 -07:00
parent eed35ad9b4
commit 42d1a45ca6
5 changed files with 188 additions and 187 deletions

View file

@ -78,19 +78,20 @@ module angle_pie_mask(
// Module: cylinder_mask()
// Usage: Mask objects
// cylinder_mask(l, r|d, chamfer, [chamfang], [from_end], [circum], [overage], [ends_only], [orient], [anchor]);
// cylinder_mask(l, r|d, fillet, [circum], [overage], [ends_only], [orient], [anchor]);
// cylinder_mask(l, r|d, [chamfer1|fillet1], [chamfer2|fillet2], [chamfang1], [chamfang2], [from_end], [circum], [overage], [ends_only], [orient], [anchor]);
// cylinder_mask(l, r|d, rounding, [circum], [overage], [ends_only], [orient], [anchor]);
// cylinder_mask(l, r|d, [chamfer1|rounding1], [chamfer2|rounding2], [chamfang1], [chamfang2], [from_end], [circum], [overage], [ends_only], [orient], [anchor]);
// Usage: Masking operators
// cylinder_mask(l, r|d, chamfer, [chamfang], [from_end], [circum], [overage], [ends_only], [orient], [anchor]) ...
// cylinder_mask(l, r|d, fillet, [circum], [overage], [ends_only], [orient], [anchor]) ...
// cylinder_mask(l, r|d, [chamfer1|fillet1], [chamfer2|fillet2], [chamfang1], [chamfang2], [from_end], [circum], [overage], [ends_only], [orient], [anchor]) ...
// cylinder_mask(l, r|d, rounding, [circum], [overage], [ends_only], [orient], [anchor]) ...
// cylinder_mask(l, r|d, [chamfer1|rounding1], [chamfer2|rounding2], [chamfang1], [chamfang2], [from_end], [circum], [overage], [ends_only], [orient], [anchor]) ...
// Description:
// If passed children, bevels/chamfers and/or rounds/fillets one or
// both ends of the origin-centered cylindrical region specified. If
// passed no children, creates a mask to bevel/chamfer and/or round/fillet
// If passed children, bevels/chamfers and/or rounds one or both
// ends of the origin-centered cylindrical region specified. If
// passed no children, creates a mask to bevel/chamfer and/or round
// one or both ends of the cylindrical region. Difference the mask
// from the region, making sure the center of the mask object is anchored
// exactly with the center of the cylindrical region to be chamferred.
// from the region, making sure the center of the mask object is
// anchored exactly with the center of the cylindrical region to
// be chamferred.
// Arguments:
// l = Length of the cylindrical/conical region.
// r = Radius of cylindrical region to chamfer.
@ -105,9 +106,9 @@ module angle_pie_mask(
// chamfang = Angle of chamfers/bevels in degrees from the length axis of the region. (Default: 45)
// chamfang1 = Angle of chamfer/bevel of the axis-negative end of the region, in degrees from the length axis.
// chamfang2 = Angle of chamfer/bevel of the axis-positive end of the region, in degrees from the length axis.
// fillet = The radius of the fillets on the ends of the region. Default: none.
// fillet1 = The radius of the fillet on the axis-negative end of the region.
// fillet2 = The radius of the fillet on the axis-positive end of the region.
// rounding = The radius of the rounding on the ends of the region. Default: none.
// rounding1 = The radius of the rounding on the axis-negative end of the region.
// rounding2 = The radius of the rounding on the axis-positive end of the region.
// circum = If true, region will circumscribe the circle of the given radius/diameter.
// from_end = If true, chamfer/bevel size is measured from end of region. If false, chamfer/bevel is measured outset from the radius of the region. (Default: false)
// overage = The extra thickness of the mask. Default: `10`.
@ -120,7 +121,7 @@ module angle_pie_mask(
// cylinder_mask(l=100, r1=60, r2=30, chamfer=10, from_end=true);
// }
// Example:
// cylinder_mask(l=100, r=50, chamfer1=10, fillet2=10) {
// cylinder_mask(l=100, r=50, chamfer1=10, rounding2=10) {
// cube([100,50,100], center=true);
// }
module cylinder_mask(
@ -129,7 +130,7 @@ module cylinder_mask(
d=undef, d1=undef, d2=undef,
chamfer=undef, chamfer1=undef, chamfer2=undef,
chamfang=undef, chamfang1=undef, chamfang2=undef,
fillet=undef, fillet1=undef, fillet2=undef,
rounding=undef, rounding1=undef, rounding2=undef,
circum=false, from_end=false,
overage=10, ends_only=false,
orient=ORIENT_Z, anchor=CENTER
@ -143,13 +144,13 @@ module cylinder_mask(
ang2 = first_defined([chamfang2, chamfang, 90-vang]);
cham1 = first_defined([chamfer1, chamfer, 0]);
cham2 = first_defined([chamfer2, chamfer, 0]);
fil1 = first_defined([fillet1, fillet, 0]);
fil2 = first_defined([fillet2, fillet, 0]);
fil1 = first_defined([rounding1, rounding, 0]);
fil2 = first_defined([rounding2, rounding, 0]);
maxd = max(r1,r2);
if ($children > 0) {
difference() {
children();
cylinder_mask(l=l, r1=sc*r1, r2=sc*r2, chamfer1=cham1, chamfer2=cham2, chamfang1=ang1, chamfang2=ang2, fillet1=fil1, fillet2=fil2, orient=orient, from_end=from_end);
cylinder_mask(l=l, r1=sc*r1, r2=sc*r2, chamfer1=cham1, chamfer2=cham2, chamfang1=ang1, chamfang2=ang2, rounding1=fil1, rounding2=fil2, orient=orient, from_end=from_end);
}
} else {
orient_and_anchor([2*r1, 2*r1, l], orient, anchor, chain=true) {
@ -166,7 +167,7 @@ module cylinder_mask(
if (fil1>0) down(l/2+overage) cylinder(r=maxd+overage, h=fil1+overage, center=false);
}
}
cyl(r1=sc*r1, r2=sc*r2, l=l, chamfer1=cham1, chamfer2=cham2, chamfang1=ang1, chamfang2=ang2, from_end=from_end, fillet1=fil1, fillet2=fil2);
cyl(r1=sc*r1, r2=sc*r2, l=l, chamfer1=cham1, chamfer2=cham2, chamfang1=ang1, chamfang2=ang2, from_end=from_end, rounding1=fil1, rounding2=fil2);
}
children();
}
@ -371,26 +372,26 @@ module chamfer_hole_mask(r=undef, d=undef, chamfer=0.25, ang=45, from_end=false,
// Section: Filleting/Rounding
// Section: Rounding
// Module: fillet_mask()
// Module: rounding_mask()
// Usage:
// fillet_mask(l|h, r, [orient], [anchor])
// rounding_mask(l|h, r, [orient], [anchor])
// Description:
// Creates a shape that can be used to fillet a vertical 90 degree edge.
// Difference it from the object to be filletted. The center of the mask
// object should align exactly with the edge to be filletted.
// Creates a shape that can be used to round a vertical 90 degree edge.
// Difference it from the object to be rounded. The center of the mask
// object should align exactly with the edge to be rounded.
// Arguments:
// l = Length of mask.
// r = Radius of the fillet.
// r = Radius of the rounding.
// orient = Orientation of the mask. Use the `ORIENT_` constants from `constants.h`. Default: vertical.
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: centered.
// Example:
// difference() {
// cube(size=100, center=false);
// #fillet_mask(l=100, r=25, orient=ORIENT_Z, anchor=UP);
// #rounding_mask(l=100, r=25, orient=ORIENT_Z, anchor=UP);
// }
module fillet_mask(l=undef, r=1.0, orient=ORIENT_Z, anchor=CENTER, h=undef)
module rounding_mask(l=undef, r=1.0, orient=ORIENT_Z, anchor=CENTER, h=undef)
{
l = first_defined([l, h, 1]);
sides = quantup(segs(r),4);
@ -406,73 +407,73 @@ module fillet_mask(l=undef, r=1.0, orient=ORIENT_Z, anchor=CENTER, h=undef)
}
// Module: fillet_mask_x()
// Module: rounding_mask_x()
// Usage:
// fillet_mask_x(l, r, [anchor])
// rounding_mask_x(l, r, [anchor])
// Description:
// Creates a shape that can be used to fillet a 90 degree edge oriented
// along the X axis. Difference it from the object to be filletted.
// Creates a shape that can be used to round a 90 degree edge oriented
// along the X axis. Difference it from the object to be rounded.
// The center of the mask object should align exactly with the edge to
// be filletted.
// be rounded.
// Arguments:
// l = Length of mask.
// r = Radius of the fillet.
// r = Radius of the rounding.
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: centered.
// Example:
// difference() {
// cube(size=100, center=false);
// #fillet_mask_x(l=100, r=25, anchor=RIGHT);
// #rounding_mask_x(l=100, r=25, anchor=RIGHT);
// }
module fillet_mask_x(l=1.0, r=1.0, anchor=CENTER) fillet_mask(l=l, r=r, orient=ORIENT_X, anchor=anchor) children();
module rounding_mask_x(l=1.0, r=1.0, anchor=CENTER) rounding_mask(l=l, r=r, orient=ORIENT_X, anchor=anchor) children();
// Module: fillet_mask_y()
// Module: rounding_mask_y()
// Usage:
// fillet_mask_y(l, r, [anchor])
// rounding_mask_y(l, r, [anchor])
// Description:
// Creates a shape that can be used to fillet a 90 degree edge oriented
// along the Y axis. Difference it from the object to be filletted.
// Creates a shape that can be used to round a 90 degree edge oriented
// along the Y axis. Difference it from the object to be rounded.
// The center of the mask object should align exactly with the edge to
// be filletted.
// be rounded.
// Arguments:
// l = Length of mask.
// r = Radius of the fillet.
// r = Radius of the rounding.
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: centered.
// Example:
// difference() {
// cube(size=100, center=false);
// right(100) #fillet_mask_y(l=100, r=25, anchor=BACK);
// right(100) #rounding_mask_y(l=100, r=25, anchor=BACK);
// }
module fillet_mask_y(l=1.0, r=1.0, anchor=CENTER) fillet_mask(l=l, r=r, orient=ORIENT_Y, anchor=anchor) children();
module rounding_mask_y(l=1.0, r=1.0, anchor=CENTER) rounding_mask(l=l, r=r, orient=ORIENT_Y, anchor=anchor) children();
// Module: fillet_mask_z()
// Module: rounding_mask_z()
// Usage:
// fillet_mask_z(l, r, [anchor])
// rounding_mask_z(l, r, [anchor])
// Description:
// Creates a shape that can be used to fillet a 90 degree edge oriented
// along the Z axis. Difference it from the object to be filletted.
// Creates a shape that can be used to round a 90 degree edge oriented
// along the Z axis. Difference it from the object to be rounded.
// The center of the mask object should align exactly with the edge to
// be filletted.
// be rounded.
// Arguments:
// l = Length of mask.
// r = Radius of the fillet.
// r = Radius of the rounding.
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: centered.
// Example:
// difference() {
// cube(size=100, center=false);
// #fillet_mask_z(l=100, r=25, anchor=UP);
// #rounding_mask_z(l=100, r=25, anchor=UP);
// }
module fillet_mask_z(l=1.0, r=1.0, anchor=CENTER) fillet_mask(l=l, r=r, orient=ORIENT_Z, anchor=anchor) children();
module rounding_mask_z(l=1.0, r=1.0, anchor=CENTER) rounding_mask(l=l, r=r, orient=ORIENT_Z, anchor=anchor) children();
// Module: fillet()
// Module: rounding()
// Usage:
// fillet(fillet, size, [edges]) ...
// rounding(r, size, [edges]) ...
// Description:
// Fillets the edges of a cuboid region containing the given children.
// Rounds the edges of a cuboid region containing the given children.
// Arguments:
// fillet = Radius of the fillet. (Default: 1)
// r = Radius of the rounding. (Default: 1)
// size = The size of the rectangular cuboid we want to chamfer.
// edges = Which edges do we want to chamfer. Recommend to use EDGE constants from constants.scad.
// Description:
@ -484,45 +485,45 @@ module fillet_mask_z(l=1.0, r=1.0, anchor=CENTER) fillet_mask(l=l, r=r, orient=O
// [X+Y+, X-Y+, X-Y-, X+Y-]
// ]
// Example(FR):
// fillet(fillet=10, size=[50,100,150], $fn=24) {
// rounding(r=10, size=[50,100,150], $fn=24) {
// cube(size=[50,100,150], center=true);
// }
// Example(FR,FlatSpin):
// fillet(fillet=10, size=[50,50,75], edges=EDGES_TOP - EDGE_TOP_LF + EDGE_FR_RT, $fn=24) {
// rounding(r=10, size=[50,50,75], edges=EDGES_TOP - EDGE_TOP_LF + EDGE_FR_RT, $fn=24) {
// cube(size=[50,50,75], center=true);
// }
module fillet(fillet=1, size=[1,1,1], edges=EDGES_ALL)
module rounding(r=1, size=[1,1,1], edges=EDGES_ALL)
{
difference() {
children();
difference() {
cube(size, center=true);
cuboid(size+[1,1,1]*0.01, fillet=fillet, edges=edges, trimcorners=true);
cuboid(size+[1,1,1]*0.01, rounding=r, edges=edges, trimcorners=true);
}
}
}
// Module: fillet_angled_edge_mask()
// Module: rounding_angled_edge_mask()
// Usage:
// fillet_angled_edge_mask(h, r, [ang], [orient], [anchor]);
// rounding_angled_edge_mask(h, r, [ang], [orient], [anchor]);
// Description:
// Creates a vertical mask that can be used to fillet the edge where two
// Creates a vertical mask that can be used to round the edge where two
// face meet, at any arbitrary angle. Difference it from the object to
// be filletted. The center of the mask should align exactly with the
// edge to be filletted.
// be rounded. The center of the mask should align exactly with the
// edge to be rounded.
// Arguments:
// h = height of vertical mask.
// r = radius of the fillet.
// r = radius of the rounding.
// ang = angle that the planes meet at.
// orient = Orientation of the mask. Use the `ORIENT_` constants from `constants.h`. Default: `ORIENT_Z`.
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: `CENTER`.
// Example:
// difference() {
// angle_pie_mask(ang=70, h=50, d=100);
// #fillet_angled_edge_mask(h=51, r=20.0, ang=70, $fn=32);
// #rounding_angled_edge_mask(h=51, r=20.0, ang=70, $fn=32);
// }
module fillet_angled_edge_mask(h=1.0, r=1.0, ang=90, orient=ORIENT_Z, anchor=CENTER)
module rounding_angled_edge_mask(h=1.0, r=1.0, ang=90, orient=ORIENT_Z, anchor=CENTER)
{
sweep = 180-ang;
n = ceil(segs(r)*sweep/360);
@ -545,16 +546,16 @@ module fillet_angled_edge_mask(h=1.0, r=1.0, ang=90, orient=ORIENT_Z, anchor=CEN
}
// Module: fillet_angled_corner_mask()
// Module: rounding_angled_corner_mask()
// Usage:
// fillet_angled_corner_mask(fillet, ang, [orient], [anchor]);
// rounding_angled_corner_mask(r, ang, [orient], [anchor]);
// Description:
// Creates a shape that can be used to fillet the corner of an angle.
// Difference it from the object to be filletted. The center of the mask
// object should align exactly with the point of the corner to be filletted.
// Creates a shape that can be used to round the corner of an angle.
// Difference it from the object to be rounded. The center of the mask
// object should align exactly with the point of the corner to be rounded.
// Arguments:
// fillet = radius of the fillet.
// ang = angle between planes that you need to fillet the corner of.
// r = Radius of the rounding.
// ang = Angle between planes that you need to round the corner of.
// orient = Orientation of the mask. Use the `ORIENT_` constants from `constants.h`. Default: `ORIENT_Z`.
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: `CENTER`.
// Example:
@ -562,26 +563,26 @@ module fillet_angled_edge_mask(h=1.0, r=1.0, ang=90, orient=ORIENT_Z, anchor=CEN
// difference() {
// angle_pie_mask(ang=ang, h=50, r=200);
// up(50/2) {
// #fillet_angled_corner_mask(fillet=20, ang=ang);
// zrot_copies([0, ang]) right(200/2) fillet_mask_x(l=200, r=20);
// #rounding_angled_corner_mask(r=20, ang=ang);
// zrot_copies([0, ang]) right(200/2) rounding_mask_x(l=200, r=20);
// }
// fillet_angled_edge_mask(h=51, r=20, ang=ang);
// rounding_angled_edge_mask(h=51, r=20, ang=ang);
// }
module fillet_angled_corner_mask(fillet=1.0, ang=90, orient=ORIENT_Z, anchor=CENTER)
module rounding_angled_corner_mask(r=1.0, ang=90, orient=ORIENT_Z, anchor=CENTER)
{
dx = fillet / tan(ang/2);
dx = r / tan(ang/2);
dx2 = dx / cos(ang/2) + 1;
fn = quantup(segs(fillet), 4);
orient_and_anchor([2*dx2, 2*dx2, fillet*2], orient, anchor, chain=true) {
fn = quantup(segs(r), 4);
orient_and_anchor([2*dx2, 2*dx2, r*2], orient, anchor, chain=true) {
difference() {
down(fillet) cylinder(r=dx2, h=fillet+1, center=false);
down(r) cylinder(r=dx2, h=r+1, center=false);
yflip_copy() {
translate([dx, fillet, -fillet]) {
translate([dx, r, -r]) {
hull() {
sphere(r=fillet, $fn=fn);
down(fillet*3) sphere(r=fillet, $fn=fn);
sphere(r=r, $fn=fn);
down(r*3) sphere(r=r, $fn=fn);
zrot_copies([0,ang]) {
right(fillet*3) sphere(r=fillet, $fn=fn);
right(r*3) sphere(r=r, $fn=fn);
}
}
}
@ -592,27 +593,27 @@ module fillet_angled_corner_mask(fillet=1.0, ang=90, orient=ORIENT_Z, anchor=CEN
}
// Module: fillet_corner_mask()
// Module: rounding_corner_mask()
// Usage:
// fillet_corner_mask(r, [anchor]);
// rounding_corner_mask(r, [anchor]);
// Description:
// Creates a shape that you can use to round 90 degree corners on a fillet.
// Difference it from the object to be filletted. The center of the mask
// object should align exactly with the corner to be filletted.
// Creates a shape that you can use to round 90 degree corners.
// Difference it from the object to be rounded. The center of the mask
// object should align exactly with the corner to be rounded.
// Arguments:
// r = radius of corner fillet.
// r = Radius of corner rounding.
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: `CENTER`.
// Example:
// fillet_corner_mask(r=20.0);
// rounding_corner_mask(r=20.0);
// Example:
// difference() {
// cube(size=[30, 50, 80], center=true);
// translate([0, 25, 40]) fillet_mask_x(l=31, r=15);
// translate([15, 0, 40]) fillet_mask_y(l=51, r=15);
// translate([15, 25, 0]) fillet_mask_z(l=81, r=15);
// translate([15, 25, 40]) #fillet_corner_mask(r=15);
// translate([0, 25, 40]) rounding_mask_x(l=31, r=15);
// translate([15, 0, 40]) rounding_mask_y(l=51, r=15);
// translate([15, 25, 0]) rounding_mask_z(l=81, r=15);
// translate([15, 25, 40]) #rounding_corner_mask(r=15);
// }
module fillet_corner_mask(r=1.0, anchor=CENTER)
module rounding_corner_mask(r=1.0, anchor=CENTER)
{
orient_and_anchor([2*r, 2*r, 2*r], ORIENT_Z, anchor, chain=true) {
difference() {
@ -626,46 +627,46 @@ module fillet_corner_mask(r=1.0, anchor=CENTER)
}
// Module: fillet_cylinder_mask()
// Module: rounding_cylinder_mask()
// Usage:
// fillet_cylinder_mask(r, fillet);
// rounding_cylinder_mask(r, rounding);
// Description:
// Create a mask that can be used to round the end of a cylinder.
// Difference it from the cylinder to be filletted. The center of the
// Difference it from the cylinder to be rounded. The center of the
// mask object should align exactly with the center of the end of the
// cylinder to be filletted.
// cylinder to be rounded.
// Arguments:
// r = radius of cylinder to fillet. (Default: 1.0)
// fillet = radius of the edge filleting. (Default: 0.25)
// r = Radius of cylinder. (Default: 1.0)
// rounding = Radius of the edge rounding. (Default: 0.25)
// Example:
// difference() {
// cylinder(r=50, h=50, center=false);
// up(50) #fillet_cylinder_mask(r=50, fillet=10);
// up(50) #rounding_cylinder_mask(r=50, rounding=10);
// }
// Example:
// difference() {
// cylinder(r=50, h=100, center=false);
// up(75) fillet_cylinder_mask(r=50, fillet=10);
// up(75) rounding_cylinder_mask(r=50, rounding=10);
// }
module fillet_cylinder_mask(r=1.0, fillet=0.25)
module rounding_cylinder_mask(r=1.0, rounding=0.25)
{
cylinder_mask(l=fillet*3, r=r, fillet2=fillet, overage=fillet, ends_only=true, anchor=DOWN) children();
cylinder_mask(l=rounding*3, r=r, rounding2=rounding, overage=rounding, ends_only=true, anchor=DOWN) children();
}
// Module: fillet_hole_mask()
// Module: rounding_hole_mask()
// Usage:
// fillet_hole_mask(r|d, fillet);
// rounding_hole_mask(r|d, rounding);
// Description:
// Create a mask that can be used to round the edge of a circular hole.
// Difference it from the hole to be filletted. The center of the
// Difference it from the hole to be rounded. The center of the
// mask object should align exactly with the center of the end of the
// hole to be filletted.
// hole to be rounded.
// Arguments:
// r = Radius of hole to fillet.
// d = Diameter of hole to fillet.
// fillet = Radius of the filleting. (Default: 0.25)
// r = Radius of hole.
// d = Diameter of hole to rounding.
// rounding = Radius of the rounding. (Default: 0.25)
// overage = The extra thickness of the mask. Default: `0.1`.
// orient = Orientation of the mask. Use the `ORIENT_` constants from `constants.h`. Default: `ORIENT_Z`.
// anchor = Alignment of the mask. Use the constants from `constants.h`. Default: `CENTER`.
@ -673,18 +674,18 @@ module fillet_cylinder_mask(r=1.0, fillet=0.25)
// difference() {
// cube([150,150,100], center=true);
// cylinder(r=50, h=100.1, center=true);
// up(50) #fillet_hole_mask(r=50, fillet=10);
// up(50) #rounding_hole_mask(r=50, rounding=10);
// }
// Example:
// fillet_hole_mask(r=40, fillet=20, $fa=2, $fs=2);
module fillet_hole_mask(r=undef, d=undef, fillet=0.25, overage=0.1, orient=ORIENT_Z, anchor=CENTER)
// rounding_hole_mask(r=40, rounding=20, $fa=2, $fs=2);
module rounding_hole_mask(r=undef, d=undef, rounding=0.25, overage=0.1, orient=ORIENT_Z, anchor=CENTER)
{
r = get_radius(r=r, d=d, dflt=1);
orient_and_anchor([2*(r+fillet), 2*(r+fillet), fillet*2], orient, anchor, chain=true) {
orient_and_anchor([2*(r+rounding), 2*(r+rounding), rounding*2], orient, anchor, chain=true) {
rotate_extrude(convexity=4) {
difference() {
right(r-overage) fwd(fillet) square(fillet+overage, center=false);
right(r+fillet) fwd(fillet) circle(r=fillet);
right(r-overage) fwd(rounding) square(rounding+overage, center=false);
right(r+rounding) fwd(rounding) circle(r=rounding);
}
}
children();

View file

@ -576,7 +576,7 @@ module metric_bolt(
}
}
} else if (headtype == "pan") {
cyl(l=H*0.75, d=D, fillet2=H*0.75/2, anchor=DOWN);
cyl(l=H*0.75, d=D, rounding2=H*0.75/2, anchor=DOWN);
} else if (headtype == "round") {
top_half(D) zscale(H*0.75/D*2) sphere(d=D);
} else if (headtype == "button") {

View file

@ -43,14 +43,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Module: cuboid()
//
// Description:
// Creates a cube or cuboid object, with optional chamfering or filleting/rounding.
// Creates a cube or cuboid object, with optional chamfering or rounding.
//
// Arguments:
// size = The size of the cube.
// chamfer = Size of chamfer, inset from sides. Default: No chamferring.
// fillet = Radius of fillet for edge rounding. Default: No filleting.
// edges = Edges to chamfer/fillet. Use `EDGE` constants from constants.scad. Default: `EDGES_ALL`
// trimcorners = If true, rounds or chamfers corners where three chamferred/filleted edges meet. Default: `true`
// rounding = Radius of the edge rounding. Default: No rounding.
// edges = Edges to chamfer/rounding. Use `EDGE` constants from constants.scad. Default: `EDGES_ALL`
// trimcorners = If true, rounds or chamfers corners where three chamferred/rounded edges meet. Default: `true`
// p1 = Align the cuboid's corner at `p1`, if given. Forces `anchor=ALLNEG`.
// p2 = If given with `p1`, defines the cornerpoints of the cuboid.
// anchor = The side of the part to anchor to. Use constants from `constants.scad`. Default: `CENTER`
@ -69,20 +69,20 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Example: Rectangular cube with chamferred edges, without trimmed corners.
// cuboid([30,40,50], chamfer=5, trimcorners=false);
// Example: Rectangular cube with rounded edges and corners.
// cuboid([30,40,50], fillet=10);
// cuboid([30,40,50], rounding=10);
// Example: Rectangular cube with rounded edges, without trimmed corners.
// cuboid([30,40,50], fillet=10, trimcorners=false);
// cuboid([30,40,50], rounding=10, trimcorners=false);
// Example: Rectangular cube with only some edges chamferred.
// cuboid([30,40,50], chamfer=5, edges=EDGE_TOP_FR+EDGE_TOP_RT+EDGE_FR_RT, $fn=24);
// Example: Rectangular cube with only some edges rounded.
// cuboid([30,40,50], fillet=5, edges=EDGE_TOP_FR+EDGE_TOP_RT+EDGE_FR_RT, $fn=24);
// cuboid([30,40,50], rounding=5, edges=EDGE_TOP_FR+EDGE_TOP_RT+EDGE_FR_RT, $fn=24);
// Example: Standard Connectors
// cuboid(40, chamfer=5) show_anchors();
module cuboid(
size=[1,1,1],
p1=undef, p2=undef,
chamfer=undef,
fillet=undef,
rounding=undef,
edges=EDGES_ALL,
trimcorners=true,
anchor=CENTER,
@ -92,16 +92,16 @@ module cuboid(
if (!is_undef(p1)) {
if (!is_undef(p2)) {
translate(pointlist_bounds([p1,p2])[0]) {
cuboid(size=vabs(p2-p1), chamfer=chamfer, fillet=fillet, edges=edges, trimcorners=trimcorners, anchor=ALLNEG) children();
cuboid(size=vabs(p2-p1), chamfer=chamfer, rounding=rounding, edges=edges, trimcorners=trimcorners, anchor=ALLNEG) children();
}
} else {
translate(p1) {
cuboid(size=size, chamfer=chamfer, fillet=fillet, edges=edges, trimcorners=trimcorners, anchor=ALLNEG) children();
cuboid(size=size, chamfer=chamfer, rounding=rounding, edges=edges, trimcorners=trimcorners, anchor=ALLNEG) children();
}
}
} else {
if (chamfer != undef) assert(chamfer <= min(size)/2, "chamfer must be smaller than half the cube width, length, or height.");
if (fillet != undef) assert(fillet <= min(size)/2, "fillet must be smaller than half the cube width, length, or height.");
if (rounding != undef) assert(rounding <= min(size)/2, "rounding radius must be smaller than half the cube width, length, or height.");
majrots = [[0,90,0], [90,0,0], [0,0,0]];
orient_and_anchor(size, ORIENT_Z, anchor, center=center, noncentered=ALLPOS, chain=true) {
if (chamfer != undef) {
@ -141,20 +141,20 @@ module cuboid(
}
}
}
} else if (fillet != undef) {
sides = quantup(segs(fillet),4);
} else if (rounding != undef) {
sides = quantup(segs(rounding),4);
sc = 1/cos(180/sides);
isize = [for (v = size) max(0.001, v-2*fillet)];
isize = [for (v = size) max(0.001, v-2*rounding)];
if (edges == EDGES_ALL) {
minkowski() {
cube(isize, center=true);
if (trimcorners) {
sphere(r=fillet*sc, $fn=sides);
sphere(r=rounding*sc, $fn=sides);
} else {
intersection() {
zrot(180/sides) cylinder(r=fillet*sc, h=fillet*2, center=true, $fn=sides);
rotate([90,0,0]) zrot(180/sides) cylinder(r=fillet*sc, h=fillet*2, center=true, $fn=sides);
rotate([0,90,0]) zrot(180/sides) cylinder(r=fillet*sc, h=fillet*2, center=true, $fn=sides);
zrot(180/sides) cylinder(r=rounding*sc, h=rounding*2, center=true, $fn=sides);
rotate([90,0,0]) zrot(180/sides) cylinder(r=rounding*sc, h=rounding*2, center=true, $fn=sides);
rotate([0,90,0]) zrot(180/sides) cylinder(r=rounding*sc, h=rounding*2, center=true, $fn=sides);
}
}
}
@ -167,10 +167,10 @@ module cuboid(
if (edges[axis][i]>0) {
difference() {
translate(vmul(EDGE_OFFSETS[axis][i], size/2)) {
rotate(majrots[axis]) cube([fillet*2, fillet*2, size[axis]+0.1], center=true);
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]*fillet)) {
rotate(majrots[axis]) zrot(180/sides) cylinder(h=size[axis]+0.2, r=fillet*sc, center=true, $fn=sides);
translate(vmul(EDGE_OFFSETS[axis][i], size/2 - [1,1,1]*rounding)) {
rotate(majrots[axis]) zrot(180/sides) cylinder(h=size[axis]+0.2, r=rounding*sc, center=true, $fn=sides);
}
}
}
@ -182,10 +182,10 @@ module cuboid(
if (corner_edge_count(edges, [xa,ya,za]) > 2) {
difference() {
translate(vmul([xa,ya,za], size/2)) {
cube(fillet*2, center=true);
cube(rounding*2, center=true);
}
translate(vmul([xa,ya,za], size/2-[1,1,1]*fillet)) {
zrot(180/sides) sphere(r=fillet*sc*sc, $fn=sides);
translate(vmul([xa,ya,za], size/2-[1,1,1]*rounding)) {
zrot(180/sides) sphere(r=rounding*sc*sc, $fn=sides);
}
}
}
@ -291,9 +291,9 @@ module prismoid(
// size1 = [width, length] of the bottom of the prism.
// size2 = [width, length] of the top of the prism.
// h = Height of the prism.
// r = radius of vertical edge fillets.
// r1 = radius of vertical edge fillets at bottom.
// r2 = radius of vertical edge fillets at top.
// r = radius of vertical edge rounding.
// r1 = radius of vertical edge rounding at bottom.
// r2 = radius of vertical edge rounding at top.
// shift = [x, y] amount to shift the center of the top with respect to the center of the bottom.
// orient = Orientation of the prismoid. Use the `ORIENT_` constants from `constants.scad`. Default: `ORIENT_Z`.
// anchor = Alignment of the prismoid by the axis-negative (`size1`) end. Use the constants from `constants.scad`. Default: `BOTTOM`.
@ -410,10 +410,10 @@ module right_triangle(size=[1, 1, 1], orient=ORIENT_Y, anchor=ALLNEG, center=und
//
// Description:
// Creates cylinders in various anchors and orientations,
// with optional fillets and chamfers. You can use `r` and `l`
// with optional rounding and chamfers. You can use `r` and `l`
// interchangably, and all variants allow specifying size
// by either `r`|`d`, or `r1`|`d1` and `r2`|`d2`.
// Note that that chamfers and fillets cannot cross the
// Note that that chamfers and rounding cannot cross the
// midpoint of the cylinder's length.
//
// Usage: Normal Cylinders
@ -426,11 +426,11 @@ module right_triangle(size=[1, 1, 1], orient=ORIENT_Y, anchor=ALLNEG, center=und
// cyl(l|h, r|d, chamfer2, [chamfang2], [from_end], [circum], [realign], [orient], [anchor], [center]);
// cyl(l|h, r|d, chamfer1, chamfer2, [chamfang1], [chamfang2], [from_end], [circum], [realign], [orient], [anchor], [center]);
//
// Usage: Rounded/Filleted Cylinders
// cyl(l|h, r|d, fillet, [circum], [realign], [orient], [anchor], [center]);
// cyl(l|h, r|d, fillet1, [circum], [realign], [orient], [anchor], [center]);
// cyl(l|h, r|d, fillet2, [circum], [realign], [orient], [anchor], [center]);
// cyl(l|h, r|d, fillet1, fillet2, [circum], [realign], [orient], [anchor], [center]);
// Usage: Rounded End Cylinders
// cyl(l|h, r|d, rounding, [circum], [realign], [orient], [anchor], [center]);
// cyl(l|h, r|d, rounding1, [circum], [realign], [orient], [anchor], [center]);
// cyl(l|h, r|d, rounding2, [circum], [realign], [orient], [anchor], [center]);
// cyl(l|h, r|d, rounding1, rounding2, [circum], [realign], [orient], [anchor], [center]);
//
// Arguments:
// l / h = Length of cylinder along oriented axis. (Default: 1.0)
@ -448,9 +448,9 @@ module right_triangle(size=[1, 1, 1], orient=ORIENT_Y, anchor=ALLNEG, center=und
// chamfang1 = The angle in degrees of the chamfer on the axis-negative end of the cylinder.
// chamfang2 = The angle in degrees of the chamfer on the axis-positive end of the cylinder.
// from_end = If true, chamfer is measured from the end of the cylinder, instead of inset from the edge. Default: `false`.
// fillet = The radius of the fillets on the ends of the cylinder. Default: none.
// fillet1 = The radius of the fillet on the axis-negative end of the cylinder.
// fillet2 = The radius of the fillet on the axis-positive end of the cylinder.
// rounding = The radius of the rounding on the ends of the cylinder. Default: none.
// rounding1 = The radius of the rounding on the axis-negative end of the cylinder.
// rounding2 = The radius of the rounding on the axis-positive end of the cylinder.
// realign = If true, rotate the cylinder by half the angle of one face.
// orient = Orientation of the cylinder. Use the `ORIENT_` constants from `constants.scad`. Default: vertical.
// anchor = Alignment of the cylinder. Use the constants from `constants.scad`. Default: centered.
@ -476,19 +476,19 @@ module right_triangle(size=[1, 1, 1], orient=ORIENT_Y, anchor=ALLNEG, center=und
// cyl(l=40, d=40, chamfer=7, chamfang=30, from_end=true);
// }
//
// Example: Rounding/Filleting
// cyl(l=40, d=40, fillet=10);
// Example: Rounding
// cyl(l=40, d=40, rounding=10);
//
// Example: Heterogenous Chamfers and Fillets
// Example: Heterogenous Chamfers and Rounding
// ydistribute(80) {
// // Shown Front to Back.
// cyl(l=40, d=40, fillet1=15, orient=ORIENT_X);
// cyl(l=40, d=40, rounding1=15, orient=ORIENT_X);
// cyl(l=40, d=40, chamfer2=5, orient=ORIENT_X);
// cyl(l=40, d=40, chamfer1=12, fillet2=10, orient=ORIENT_X);
// cyl(l=40, d=40, chamfer1=12, rounding2=10, orient=ORIENT_X);
// }
//
// Example: Putting it all together
// cyl(l=40, d1=25, d2=15, chamfer1=10, chamfang1=30, from_end=true, fillet2=5);
// cyl(l=40, d1=25, d2=15, chamfer1=10, chamfang1=30, from_end=true, rounding2=5);
//
// Example: Standard Connectors
// xdistribute(40) {
@ -502,7 +502,7 @@ module cyl(
d=undef, d1=undef, d2=undef,
chamfer=undef, chamfer1=undef, chamfer2=undef,
chamfang=undef, chamfang1=undef, chamfang2=undef,
fillet=undef, fillet1=undef, fillet2=undef,
rounding=undef, rounding1=undef, rounding2=undef,
circum=false, realign=false, from_end=false,
orient=ORIENT_Z, anchor=CENTER, center=undef
) {
@ -516,7 +516,7 @@ module cyl(
phi = atan2(l, r1-r2);
orient_and_anchor(size1, orient, anchor, center=center, size2=size2, geometry="cylinder", chain=true) {
zrot(realign? 180/sides : 0) {
if (!any_defined([chamfer, chamfer1, chamfer2, fillet, fillet1, fillet2])) {
if (!any_defined([chamfer, chamfer1, chamfer2, rounding, rounding1, rounding2])) {
cylinder(h=l, r1=r1*sc, r2=r2*sc, center=true, $fn=sides);
} else {
vang = atan2(l, r1-r2)/2;
@ -524,8 +524,8 @@ module cyl(
chang2 = 90-first_defined([chamfang2, chamfang, 90-vang]);
cham1 = first_defined([chamfer1, chamfer]) * (from_end? 1 : tan(chang1));
cham2 = first_defined([chamfer2, chamfer]) * (from_end? 1 : tan(chang2));
fil1 = first_defined([fillet1, fillet]);
fil2 = first_defined([fillet2, fillet]);
fil1 = first_defined([rounding1, rounding]);
fil2 = first_defined([rounding2, rounding]);
if (chamfer != undef) {
assert(chamfer <= r1, "chamfer is larger than the r1 radius of the cylinder.");
assert(chamfer <= r2, "chamfer is larger than the r2 radius of the cylinder.");
@ -539,18 +539,18 @@ module cyl(
assert(cham2 <= r2, "chamfer2 is larger than the r2 radius of the cylinder.");
assert(cham2 <= l/2, "chamfer2 is larger than half the length of the cylinder.");
}
if (fillet != undef) {
assert(fillet <= r1, "fillet is larger than the r1 radius of the cylinder.");
assert(fillet <= r2, "fillet is larger than the r2 radius of the cylinder.");
assert(fillet <= l/2, "fillet is larger than half the length of the cylinder.");
if (rounding != undef) {
assert(rounding <= r1, "rounding is larger than the r1 radius of the cylinder.");
assert(rounding <= r2, "rounding is larger than the r2 radius of the cylinder.");
assert(rounding <= l/2, "rounding is larger than half the length of the cylinder.");
}
if (fil1 != undef) {
assert(fil1 <= r1, "fillet1 is larger than the r1 radius of the cylinder.");
assert(fil1 <= l/2, "fillet1 is larger than half the length of the cylinder.");
assert(fil1 <= r1, "rounding1 is larger than the r1 radius of the cylinder.");
assert(fil1 <= l/2, "rounding1 is larger than half the length of the cylinder.");
}
if (fil2 != undef) {
assert(fil2 <= r2, "fillet2 is larger than the r1 radius of the cylinder.");
assert(fil2 <= l/2, "fillet2 is larger than half the length of the cylinder.");
assert(fil2 <= r2, "rounding2 is larger than the r1 radius of the cylinder.");
assert(fil2 <= l/2, "rounding2 is larger than half the length of the cylinder.");
}
dy1 = first_defined([cham1, fil1, 0]);

View file

@ -2120,7 +2120,7 @@ module extrude_arc(arc=90, sa=0, r=undef, d=undef, orient=ORIENT_Z, anchor=CENTE
// Arguments:
// r = Radius to round all concave and convex corners to.
// or = Radius to round only outside (convex) corners to. Use instead of `r`.
// ir = Radius to round/fillet only inside (concave) corners to. Use instead of `r`.
// ir = Radius to round only inside (concave) corners to. Use instead of `r`.
// Examples(2D):
// round2d(r=10) {square([40,100], center=true); square([100,40], center=true);}
// round2d(or=10) {square([40,100], center=true); square([100,40], center=true);}
@ -2142,9 +2142,9 @@ module round2d(r, or, ir)
// Arguments:
// thickness = Thickness of the shell. Positive to expand outward, negative to shrink inward, or a two-element list to do both.
// or = Radius to round convex corners/pointy bits on the outside of the shell.
// ir = Radius to round/fillet concave corners on the outside of the shell.
// ir = Radius to round concave corners on the outside of the shell.
// round = Radius to round convex corners/pointy bits on the inside of the shell.
// fill = Radius to round/fillet concave corners on the inside of the shell.
// fill = Radius to round concave corners on the inside of the shell.
// Examples(2D):
// shell2d(10) {square([40,100], center=true); square([100,40], center=true);}
// shell2d(-10) {square([40,100], center=true); square([100,40], center=true);}

View file

@ -95,20 +95,20 @@ function hex_offsets(n, d, lev=0, arr=[]) =
// Module: wiring()
// Description:
// Returns a 3D object representing a bundle of wires that follow a given path,
// with the corners filleted to a given radius. There are 17 base wire colors.
// with the corners rounded to a given radius. There are 17 base wire colors.
// If you have more than 17 wires, colors will get re-used.
// Usage:
// wiring(path, wires, [wirediam], [fillet], [wirenum], [bezsteps]);
// wiring(path, wires, [wirediam], [rounding], [wirenum], [bezsteps]);
// Arguments:
// path = The 3D polyline path that the wire bundle should follow.
// wires = The number of wires in the wiring bundle.
// wirediam = The diameter of each wire in the bundle.
// fillet = The radius that the path corners will be filleted to.
// rounding = The radius that the path corners will be rounded to.
// wirenum = The first wire's offset into the color table.
// bezsteps = The corner fillets in the path will be converted into this number of segments.
// bezsteps = The corner roundings in the path will be converted into this number of segments.
// Example:
// wiring([[50,0,-50], [50,50,-50], [0,50,-50], [0,0,-50], [0,0,0]], fillet=10, wires=13);
module wiring(path, wires, wirediam=2, fillet=10, wirenum=0, bezsteps=12) {
// wiring([[50,0,-50], [50,50,-50], [0,50,-50], [0,0,-50], [0,0,0]], rounding=10, wires=13);
module wiring(path, wires, wirediam=2, rounding=10, wirenum=0, bezsteps=12) {
colors = [
[0.2, 0.2, 0.2], [1.0, 0.2, 0.2], [0.0, 0.8, 0.0], [1.0, 1.0, 0.2],
[0.3, 0.3, 1.0], [1.0, 1.0, 1.0], [0.7, 0.5, 0.0], [0.5, 0.5, 0.5],
@ -117,7 +117,7 @@ module wiring(path, wires, wirediam=2, fillet=10, wirenum=0, bezsteps=12) {
[0.6, 0.6, 1.0],
];
offsets = hex_offsets(wires, wirediam);
bezpath = fillet_path(path, fillet);
bezpath = fillet_path(path, rounding);
poly = simplify3d_path(path3d(bezier_polyline(bezpath, bezsteps)));
n = max(segs(wirediam), 8);
r = wirediam/2;