diff --git a/README.md b/README.md index 4e2969e5..1e8a03a6 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ I've been using OpenSCAD for years and created some funny things. Some of them i - 3D - [line3d](https://openhome.cc/eGossip/OpenSCAD/lib-line3d.html) + - [polyline3d](https://openhome.cc/eGossip/OpenSCAD/lib-polyline3d.html) - Transformations - [hollow_out](https://openhome.cc/eGossip/OpenSCAD/lib-hollow_out.html) diff --git a/docs/images/lib-polyline3d-1.JPG b/docs/images/lib-polyline3d-1.JPG new file mode 100644 index 00000000..8b9b7ea4 Binary files /dev/null and b/docs/images/lib-polyline3d-1.JPG differ diff --git a/docs/images/lib-polyline3d-2.JPG b/docs/images/lib-polyline3d-2.JPG new file mode 100644 index 00000000..500db4c6 Binary files /dev/null and b/docs/images/lib-polyline3d-2.JPG differ diff --git a/docs/images/lib-polyline3d-3.JPG b/docs/images/lib-polyline3d-3.JPG new file mode 100644 index 00000000..6e3c8288 Binary files /dev/null and b/docs/images/lib-polyline3d-3.JPG differ diff --git a/docs/images/lib-polyline3d-4.JPG b/docs/images/lib-polyline3d-4.JPG new file mode 100644 index 00000000..74669449 Binary files /dev/null and b/docs/images/lib-polyline3d-4.JPG differ diff --git a/docs/lib-polyline3d.md b/docs/lib-polyline3d.md new file mode 100644 index 00000000..5a69e6c7 --- /dev/null +++ b/docs/lib-polyline3d.md @@ -0,0 +1,65 @@ +# polyline3d + +Creates a polyline from a list of `[x, y, z]` coordinates. It depends on the `line3d` module so you have to `include` line3d.scad. + +## Parameters + +- `points` : The list of `[x, y, z]` points of the polyline. : A vector of 3 element vectors. The points are indexed from 0 to n-1. +- `thickness` : The line thickness. +- `startingStyle` : The end-cap style of the starting point. The value must be `CAP_BUTT`, `CAP_CIRCLE` or `CAP_SPHERE` (defined in line3d.scad). The default value is `CAP_CIRCLE`. +- endingStyle : The end-cap style of the ending point. The value must be `CAP_BUTT`, `CAP_CIRCLE` or `CAP_SPHERE` (defined in line3d.scad). The default value is `CAP_CIRCLE`. +- `fn` : It controlls the `$fn` value used by the `circle` and `sphere` module. The default value is `24`. + +## Examples + + polyline3d( + points = [ + [1, 2, 1], + [-5, -4, 2], + [-5, 3, 3], + [5, 5, 4] + ], + thickness = 1 + ); + +![polyline3d](images/lib-polyline3d-1.JPG) + + polyline3d( + points = [ + [1, 2, 1], + [-5, -4, 2], + [-5, 3, 3], + [5, 5, 4] + ], + thickness = 1, + endingStyle = CAP_SPHERE + ); + +![polyline3d](images/lib-polyline3d-2.JPG) + + polyline3d( + points = [ + [1, 2, 1], + [-5, -4, 2], + [-5, 3, 3], + [5, 5, 4] + ], + thickness = 1, + startingStyle = CAP_SPHERE, + endingStyle = CAP_SPHERE + ); + +![polyline3d](images/lib-polyline3d-3.JPG) + + r = 20; + h = 5; + fa = 15; + circles = 10; + + points = [ + for(a = [0:fa:360 * circles]) + [r * cos(a), r * sin(a), h / (360 / fa) * (a / fa)] + ]; + polyline3d(points, thickness = 1); + +![polyline3d](images/lib-polyline3d-4.JPG) \ No newline at end of file diff --git a/src/polyline3d.scad b/src/polyline3d.scad new file mode 100644 index 00000000..4c64db3f --- /dev/null +++ b/src/polyline3d.scad @@ -0,0 +1,35 @@ +/** +* polyline3d.scad +* +* Creates a 3D polyline from a list of `[x, y, z]` coordinates. +* It depends on the line3d module so you have to include line3d.scad. +* +* @copyright Justin Lin, 2017 +* @license https://opensource.org/licenses/lgpl-3.0.html +* +* @see https://openhome.cc/eGossip/OpenSCAD/lib-polyline3d.html +* +**/ + +module polyline3d(points, thickness, startingStyle = CAP_CIRCLE, endingStyle = CAP_CIRCLE, fn = 24) { + module line_segment(index) { + styles = index == 1 ? [startingStyle, CAP_BUTT] : ( + index == len(points) - 1 ? [CAP_SPHERE, endingStyle] : [ + CAP_SPHERE, CAP_BUTT + ] + ); + + line3d(points[index - 1], points[index], thickness, + p1Style = styles[0], p2Style = styles[1], + fn = fn); + } + + module polyline3d_inner(points, index) { + if(index < len(points)) { + line_segment(index); + polyline3d_inner(points, index + 1); + } + } + + polyline3d_inner(points, 1); +} \ No newline at end of file