-
-
Save groovenectar/92174cb1c98c1089347e to your computer and use it in GitHub Desktop.
// More information: https://danielupshaw.com/openscad-rounded-corners/ | |
// Set to 0.01 for higher definition curves (renders slower) | |
$fs = 0.15; | |
module roundedcube(size = [1, 1, 1], center = false, radius = 0.5, apply_to = "all") { | |
// If single value, convert to [x, y, z] vector | |
size = (size[0] == undef) ? [size, size, size] : size; | |
translate_min = radius; | |
translate_xmax = size[0] - radius; | |
translate_ymax = size[1] - radius; | |
translate_zmax = size[2] - radius; | |
diameter = radius * 2; | |
obj_translate = (center == false) ? | |
[0, 0, 0] : [ | |
-(size[0] / 2), | |
-(size[1] / 2), | |
-(size[2] / 2) | |
]; | |
translate(v = obj_translate) { | |
hull() { | |
for (translate_x = [translate_min, translate_xmax]) { | |
x_at = (translate_x == translate_min) ? "min" : "max"; | |
for (translate_y = [translate_min, translate_ymax]) { | |
y_at = (translate_y == translate_min) ? "min" : "max"; | |
for (translate_z = [translate_min, translate_zmax]) { | |
z_at = (translate_z == translate_min) ? "min" : "max"; | |
translate(v = [translate_x, translate_y, translate_z]) | |
if ( | |
(apply_to == "all") || | |
(apply_to == "xmin" && x_at == "min") || (apply_to == "xmax" && x_at == "max") || | |
(apply_to == "ymin" && y_at == "min") || (apply_to == "ymax" && y_at == "max") || | |
(apply_to == "zmin" && z_at == "min") || (apply_to == "zmax" && z_at == "max") | |
) { | |
sphere(r = radius); | |
} else { | |
rotate = | |
(apply_to == "xmin" || apply_to == "xmax" || apply_to == "x") ? [0, 90, 0] : ( | |
(apply_to == "ymin" || apply_to == "ymax" || apply_to == "y") ? [90, 90, 0] : | |
[0, 0, 0] | |
); | |
rotate(a = rotate) | |
cylinder(h = diameter, r = radius, center = true); | |
} | |
} | |
} | |
} | |
} | |
} | |
} |
I have forked and mostly rewritten the module in order to remove some limitations, one being the one reported above by thunfischbrot back in 2015:
// Changed to remove some limitations:
//
// 1. Allow radius>length for rounded corners in one axis only (problem reported on original page in 2015)
// 2. Remove limitation where for apply_to=(x|y|z)max or (x|y|z)min the dimension of the corresponding perpendicular
// axis had to be at least 3 times the radius because of fixed cylinder height. Now cylinder height is always computed not
// to interfere with opposite corner
Thanks a lot for this. I just started using open scad and couldn't figure out how to make nice rounded edges. I tried minkowski
but it totally messed up the dimensions and position of the object.
This works great. It's quite slow though, taking now few seconds to render when I change any parameteres.
Thanks a lot for this. I just started using open scad and couldn't figure out how to make nice rounded edges. I tried
minkowski
but it totally messed up the dimensions and position of the object.This works great. It's quite slow though, taking now few seconds to render when I change any parameteres.
Thanks for the feedback!! Yes, quite slow, but.... there's a workflow to get around this... You can raise the $fs
value while you're developing the model, then lower it when you're ready for a production build.. It's been a while so I can't remember the various effects... but I wonder if a value of $fs = 0.5;
or more would be usable while working on the model
I tried
minkowski
but it totally messed up the dimensions and position of the object.
This is not caused by an issue in the minkowski method. Instead this behaviour is inherent to it, because the two shapes are added to one another. If you want to correct for these shifts, I can present you a piece of code that "corrects" for shifts using rectangular shapes.
Hi Daniel.
I'm running into a bug which rears its ugly head when one tries to set a radius for the cylinder of a single-axis rounding and the radius is larger than one or more of the dimensions of the object. I have an object where the thickness is 0.125
and the radius is 0.325
. It makes the thickness of the object larger to compensate, which kinda sucks. It seems like the problem lies with the definitions of the translate
variables at the top. If I can find the time, I will see about submitting a fix later.
Hi Daniel.
I'm running into a bug which rears its ugly head when one tries to set a radius for the cylinder of a single-axis rounding and the radius is larger than one or more of the dimensions of the object. I have an object where the thickness is
0.125
and the radius is0.325
. It makes the thickness of the object larger to compensate, which kinda sucks. It seems like the problem lies with the definitions of thetranslate
variables at the top. If I can find the time, I will see about submitting a fix later.
It looks like @ggs67's fork fixes this. I think it would be a good idea to replace your code with theirs.
I'm running into a bug which rears its ugly head when one tries to set a radius for the cylinder of a single-axis rounding and the radius is larger than one or more of the dimensions of the object. I have an object where the thickness is
0.125
and the radius is0.325
. It makes the thickness of the object larger to compensate, which kinda sucks. It seems like the problem lies with the definitions of thetranslate
variables at the top. If I can find the time, I will see about submitting a fix later.It looks like @ggs67's fork fixes this. I think it would be a good idea to replace your code with theirs.
Yes, I'm glad you found that. It's been a while since I've been able to design or print but was aware of some forks... would you say that's the most ideal one to redirect people to when that issue crops up? https://gist.github.com/ggs67/ff6ba8caf5a1871d285c5c758dce0575
If someone has legally obtained a copyrighted work, they are free to use it in any way they want. The statement about use in the .scad file has no effect.
/Russ, 12 years as the VP in charge of License Approval for the Open Source Initiative.