diff --git a/README.md b/README.md index 92a557cb..9922abd1 100644 --- a/README.md +++ b/README.md @@ -74,14 +74,9 @@ Too many dependencies? Because OpenSCAD doesn't provide namespace management, I - [box_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-box_extrude.html) - [ellipse_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-ellipse_extrude.html) - [stereographic_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-stereographic_extrude.html) - - [path_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-path_extrude.html) - - [ring_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-ring_extrude.html) - - [helix_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-helix_extrude.html) - - [golden_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-golden_spiral_extrude.html) - - [archimedean_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-archimedean_spiral_extrude.html) - - [sphere_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-sphere_spiral_extrude.html) + - [rounded_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-rounded_extrude.html) -- Shape +- 2D Shape - [shape_taiwan](https://openhome.cc/eGossip/OpenSCAD/lib-shape_taiwan.html) - [shape_arc](https://openhome.cc/eGossip/OpenSCAD/lib-shape_arc.html) - [shape_pie](https://openhome.cc/eGossip/OpenSCAD/lib-shape_pie.html) @@ -90,7 +85,15 @@ Too many dependencies? Because OpenSCAD doesn't provide namespace management, I - [shape_trapezium](https://openhome.cc/eGossip/OpenSCAD/lib-shape_trapezium.html) - [shape_pentagram](https://openhome.cc/eGossip/OpenSCAD/lib-shape_pentagram.html) - [shape_superformula](https://openhome.cc/eGossip/OpenSCAD/lib-shape_superformula.html) - + +- 2D Shape Extrusion + - [path_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-path_extrude.html) + - [ring_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-ring_extrude.html) + - [helix_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-helix_extrude.html) + - [golden_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-golden_spiral_extrude.html) + - [archimedean_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-archimedean_spiral_extrude.html) + - [sphere_spiral_extrude](https://openhome.cc/eGossip/OpenSCAD/lib-sphere_spiral_extrude.html) + - Other - [turtle2d](https://openhome.cc/eGossip/OpenSCAD/lib-turtle2d.html) - [turtle3d](https://openhome.cc/eGossip/OpenSCAD/lib-turtle3d.html) diff --git a/docs/images/lib-rounded_extrude-1.JPG b/docs/images/lib-rounded_extrude-1.JPG new file mode 100644 index 00000000..eb6ad8a9 Binary files /dev/null and b/docs/images/lib-rounded_extrude-1.JPG differ diff --git a/docs/lib-rounded_extrude.md b/docs/lib-rounded_extrude.md new file mode 100644 index 00000000..69e501d7 --- /dev/null +++ b/docs/lib-rounded_extrude.md @@ -0,0 +1,28 @@ +# rounded_extrude + +Extrudes a 2D object roundly from 0 to 180 degrees. + +## Parameters + +- `size` : The size of A retangle which can cover the 2D object. Accepts single value, square with both sides this length. It also accepts 2 value array `[x, y]`, rectangle with dimensions `x` and `y`. +- `round_r` : The radius when extruding roundly. +- `angle` : 0 to 180 degrees. The default value is 90 degrees. +- `convexity`, `twist`: The same as respective parameters of `linear_extrude`. +- `$fa`, `$fs`, `$fn` : Used to control the round fragments. Check [the circle module](https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Using_the_2D_Subsystem#circle) for more details. + +## Examples + + include ; + + $fn = 48; + + circle_r = 10; + round_r = 5; + + rounded_extrude(circle_r * 2, round_r) + circle(circle_r); + + translate([0, 0, round_r]) + cylinder(h = 20, r1 = circle_r + round_r, r2 = 0); + +![rounded_extrude](images/lib-rounded_extrude-1.JPG) diff --git a/src/rounded_extrude.scad b/src/rounded_extrude.scad new file mode 100644 index 00000000..abd7931b --- /dev/null +++ b/src/rounded_extrude.scad @@ -0,0 +1,67 @@ +/** +* rounded_extrude.scad +* +* Extrudes a 2D object roundly from 0 to 180 degrees. +* +* @copyright Justin Lin, 2017 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib-rounded_extrude.html +* +**/ + +include <__private__/__frags.scad>; +include <__private__/__is_vector.scad>; + +module rounded_extrude(size, round_r, angle = 90, twist = 0, convexity = 10) { + + is_vt = __is_vector(size); + x = is_vt ? size[0] : size; + y = is_vt ? size[1] : size; + + q_corner_frags = __frags(round_r) / 4; + + step_a = angle / q_corner_frags; + twist_step = twist / q_corner_frags; + + module layers(pre_x, pre_y, pre_h = 0, i = 1) { + module one_layer(current_a) { + wx = pre_x; + wy = pre_y; + + h = (round_r - pre_h) - round_r * cos(current_a); + + d_leng = + round_r * (sin(current_a) - sin(step_a * (i - 1))); + + sx = (d_leng * 2 + wx) / wx; + sy = (d_leng * 2 + wy) / wy; + + translate([0, 0, pre_h]) + rotate(-twist_step * (i - 1)) + linear_extrude( + h, + slices = 1, + scale = [sx, sy], + convexity = convexity, + twist = twist_step + ) scale([wx / x, wy / y]) + children(); + + layers(wx * sx, wy * sy, h + pre_h, i + 1) + children(); + + } + + if(i <= q_corner_frags) { + one_layer(i * step_a) + children(); + } else if(i - q_corner_frags < 1) { + one_layer(q_corner_frags * step_a) + children(); + } + } + + layers(x, y) + children(); +} \ No newline at end of file