From fdac4545e856670a6f1ee4a791d92e230adccab7 Mon Sep 17 00:00:00 2001 From: Revar Desmera Date: Wed, 4 Oct 2023 22:33:53 -0700 Subject: [PATCH] Added generic_airplane(), show_transform_list() --- attachments.scad | 88 ++++++++++++++++++++++++++++++++++++- examples/spring_handle.scad | 45 +++++++++++++++++++ 2 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 examples/spring_handle.scad diff --git a/attachments.scad b/attachments.scad index 3657741..838b77c 100644 --- a/attachments.scad +++ b/attachments.scad @@ -3587,7 +3587,7 @@ module show_anchors(s=10, std=true, custom=true) { // Synopsis: Shows a 3d anchor orientation arrow. // SynTags: Geom // Topics: Attachments -// See Also: anchor_arrow2d(), show_anchors(), expose_anchors(), frame_ref() +// See Also: anchor_arrow2d(), show_anchors(), expose_anchors(), frame_ref(), generic_airplane() // Usage: // anchor_arrow([s], [color], [flag], [anchor=], [orient=], [spin=]) [ATTACHMENTS]; // Description: @@ -3628,7 +3628,7 @@ module anchor_arrow(s=10, color=[0.333,0.333,1], flag=true, $tag="anchor-arrow", // Topics: Attachments // See Also: anchor_arrow(), show_anchors(), expose_anchors(), frame_ref() // Usage: -// anchor_arrow2d([s], [color], [flag]); +// anchor_arrow2d([s], [color]); // Description: // Show an anchor orientation arrow. // Arguments: @@ -3668,6 +3668,90 @@ module expose_anchors(opacity=0.2) { +// Module: show_transform_list() +// Synopsis: Shows a list of transforms and how they connect. +// SynTags: Geom +// Topics: Attachments +// See Also: generic_airplane(), anchor_arrow(), show_anchors(), expose_anchors(), frame_ref() +// Usage: +// show_transform_list(tlist, [s]); +// show_transform_list(tlist) {CHILDREN}; +// Description: +// Given a list of transformation matrices, shows the position and orientation of each one. +// A line is drawn from each transform position to the next one, and an orientation indicator is +// shown at each position. If a child is passed, that child will be used as the orientation indicator. +// By default, a {{generic_airplane()}} is used as the orientation indicator. +// Arguments: +// s = Length of the {{generic_airplane()}}. Default: 5 +// Example: +// tlist = [ +// zrot(90), +// zrot(90) * fwd(30) * zrot(30), +// zrot(90) * fwd(30) * zrot(30) * +// fwd(35) * xrot(-30), +// zrot(90) * fwd(30) * zrot(30) * +// fwd(35) * xrot(-30) * fwd(40) * yrot(15), +// ]; +// show_transform_list(tlist, s=20); +// Example: +// tlist = [ +// zrot(90), +// zrot(90) * fwd(30) * zrot(30), +// zrot(90) * fwd(30) * zrot(30) * +// fwd(35) * xrot(-30), +// zrot(90) * fwd(30) * zrot(30) * +// fwd(35) * xrot(-30) * fwd(40) * yrot(15), +// ]; +// show_transform_list(tlist) frame_ref(); +module show_transform_list(tlist, s=5) { + path = [for (m = tlist) apply(m, [0,0,0])]; + stroke(path, width=s*0.03); + for (m = tlist) { + multmatrix(m) { + if ($children>0) children(); + else generic_airplane(s=s); + } + } +} + + +// Module: generic_airplane() +// Synopsis: Shows a generic airplane shape, useful for viewing orientations. +// SynTags: Geom +// Topics: Attachments +// See Also: anchor_arrow(), show_anchors(), expose_anchors(), frame_ref() +// Usage: +// generic_airplane([s]); +// Description: +// Creates a generic airplane shape. This can be useful for viewing the orientation of 3D transforms. +// Arguments: +// s = Length of the airplane. Default: 5 +// Example: +// generic_airplane(s=20); +module generic_airplane(s=5) { + $fn = max(segs(0.05*s), 12); + color("#ddd") + fwd(s*0.05) + ycyl(l=0.7*s, d=0.1*s) { + attach(FWD) top_half(s=s) zscale(2) sphere(d=0.1*s); + attach(BACK,FWD) ycyl(l=0.2*s, d1=0.1*s, d2=0.05*s) { + yrot_copies([-90,0,90]) + prismoid(s*[0.01,0.2], s*[0.01,0.05], + h=0.2*s, shift=s*[0,0.15], anchor=BOT); + } + yrot_copies([-90,90]) + prismoid(s*[0.01,0.2], s*[0.01,0.05], + h=0.5*s, shift=s*[0,0.15], anchor=BOT); + } + color("#777") zcopies(0.1*s) sphere(d=0.02*s); + back(0.09*s) { + color("#f00") right(0.46*s) sphere(d=0.04*s); + color("#0f0") left(0.46*s) sphere(d=0.04*s); + } +} + + + // Module: frame_ref() // Synopsis: Shows axis orientation arrows. // SynTags: Geom diff --git a/examples/spring_handle.scad b/examples/spring_handle.scad new file mode 100644 index 0000000..1299894 --- /dev/null +++ b/examples/spring_handle.scad @@ -0,0 +1,45 @@ +include + +$fn = 45; +wire_d = 2; +spring_l = 100; +spring_d = 20; +rod_d = 10; +loops = 17; +tight_loops=3; + +tpart = tight_loops/loops; +lpart = wire_d * tight_loops / 100; +r_table = [ + [0.00, 0], + [0+tpart, 0], + [0.5, 1], + [1-tpart, 0], + [1.00, 0], +]; +l_table = [ + [0.00, -0.50], + [0+tpart, -0.5+lpart], + [1-tpart, +0.5-lpart], + [1.00, +0.50], +]; +lsteps = 45; +tsteps = loops * lsteps; +path = [ + for (i = [0:1:tsteps]) + let( + u = i / tsteps, + a = u * 360 * loops, + r = lookup(u, r_table) * spring_d/2 + wire_d/2 + rod_d/2, + z = lookup(u, l_table) * spring_l, + pt = [r*cos(a), r*sin(a), z] + ) pt +]; +yrot(90) { + color("lightblue") + path_sweep(circle(d=wire_d), path); + cylinder(d=rod_d, h=spring_l+10, center=true); +} + + +// vim: expandtab tabstop=4 shiftwidth=4 softtabstop=4 nowrap