fix usage and add child checks to transforms.scad

This commit is contained in:
Adrian Mariano 2022-03-30 20:02:48 -04:00
parent 155de32d9a
commit c82f8bebe4

View file

@ -75,8 +75,8 @@ _NO_ARG = [true,[123232345],false];
// Aliases: translate() // Aliases: translate()
// //
// Usage: As Module // Usage: As Module
// move([x=], [y=], [z=]) ... // move(v) children;
// move(v) ... // move([x=], [y=], [z=]) children;
// Usage: As a function to translate points, VNF, or Bezier patch // Usage: As a function to translate points, VNF, or Bezier patch
// pts = move(v, p); // pts = move(v, p);
// pts = move([x=], [y=], [z=], p=); // pts = move([x=], [y=], [z=], p=);
@ -140,14 +140,15 @@ _NO_ARG = [true,[123232345],false];
// pt4 = move(y=11, p=[[1,2,3],[4,5,6]]); // Returns: [[1,13,3], [4,16,6]] // pt4 = move(y=11, p=[[1,2,3],[4,5,6]]); // Returns: [[1,13,3], [4,16,6]]
// mat2d = move([2,3]); // Returns: [[1,0,2],[0,1,3],[0,0,1]] // mat2d = move([2,3]); // Returns: [[1,0,2],[0,1,3],[0,0,1]]
// mat3d = move([2,3,4]); // Returns: [[1,0,0,2],[0,1,0,3],[0,0,1,4],[0,0,0,1]] // mat3d = move([2,3,4]); // Returns: [[1,0,0,2],[0,1,0,3],[0,0,1,4],[0,0,0,1]]
module move(v=[0,0,0], p, x=0, y=0, z=0) { module move(v=[0,0,0], p) {
req_children($children);
assert(!is_string(v),"Module form of `move()` does not accept string `v` arguments"); assert(!is_string(v),"Module form of `move()` does not accept string `v` arguments");
assert(is_undef(p), "Module form `move()` does not accept p= argument."); assert(is_undef(p), "Module form `move()` does not accept p= argument.");
assert(is_vector(v) && (len(v)==3 || len(v)==2), "Invalid value for `v`") assert(is_vector(v) && (len(v)==3 || len(v)==2), "Invalid value for `v`")
translate(point3d(v)+[x,y,z]) children(); translate(point3d(v)) children();
} }
function move(v=[0,0,0], p=_NO_ARG, x=0, y=0, z=0) = function move(v=[0,0,0], p=_NO_ARG) =
is_string(v) ? ( is_string(v) ? (
assert(is_vnf(p) || is_path(p),"String movements only work with point lists and VNFs") assert(is_vnf(p) || is_path(p),"String movements only work with point lists and VNFs")
let( let(
@ -156,12 +157,12 @@ function move(v=[0,0,0], p=_NO_ARG, x=0, y=0, z=0) =
: v=="box" ? mean(pointlist_bounds(p)) : v=="box" ? mean(pointlist_bounds(p))
: assert(false,str("Unknown string movement ",v)) : assert(false,str("Unknown string movement ",v))
) )
move(-center,p=p, x=x,y=y,z=z) move(-center,p=p)
) )
: :
assert(is_vector(v) && (len(v)==3 || len(v)==2), "Invalid value for `v`") assert(is_vector(v) && (len(v)==3 || len(v)==2), "Invalid value for `v`")
let( let(
m = affine3d_translate(point3d(v)+[x,y,z]) m = affine3d_translate(point3d(v))
) )
p==_NO_ARG ? m : apply(m, p); p==_NO_ARG ? m : apply(m, p);
@ -171,7 +172,7 @@ function translate(v=[0,0,0], p=_NO_ARG) = move(v=v, p=p);
// Function&Module: left() // Function&Module: left()
// //
// Usage: As Module // Usage: As Module
// left(x) ... // left(x) children;
// Usage: Translate Points // Usage: Translate Points
// pts = left(x, p); // pts = left(x, p);
// Usage: Get Translation Matrix // Usage: Get Translation Matrix
@ -199,6 +200,7 @@ function translate(v=[0,0,0], p=_NO_ARG) = move(v=v, p=p);
// pt3 = left(3, p=[[1,2,3],[4,5,6]]); // Returns: [[-2,2,3], [1,5,6]] // pt3 = left(3, p=[[1,2,3],[4,5,6]]); // Returns: [[-2,2,3], [1,5,6]]
// mat3d = left(4); // Returns: [[1,0,0,-4],[0,1,0,0],[0,0,1,0],[0,0,0,1]] // mat3d = left(4); // Returns: [[1,0,0,-4],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
module left(x=0, p) { module left(x=0, p) {
req_children($children);
assert(is_undef(p), "Module form `left()` does not accept p= argument."); assert(is_undef(p), "Module form `left()` does not accept p= argument.");
assert(is_finite(x), "Invalid number") assert(is_finite(x), "Invalid number")
translate([-x,0,0]) children(); translate([-x,0,0]) children();
@ -213,7 +215,7 @@ function left(x=0, p=_NO_ARG) =
// Aliases: xmove() // Aliases: xmove()
// //
// Usage: As Module // Usage: As Module
// right(x) ... // right(x) children;
// Usage: Translate Points // Usage: Translate Points
// pts = right(x, p); // pts = right(x, p);
// Usage: Get Translation Matrix // Usage: Get Translation Matrix
@ -241,6 +243,7 @@ function left(x=0, p=_NO_ARG) =
// pt3 = right(3, p=[[1,2,3],[4,5,6]]); // Returns: [[4,2,3], [7,5,6]] // pt3 = right(3, p=[[1,2,3],[4,5,6]]); // Returns: [[4,2,3], [7,5,6]]
// mat3d = right(4); // Returns: [[1,0,0,4],[0,1,0,0],[0,0,1,0],[0,0,0,1]] // mat3d = right(4); // Returns: [[1,0,0,4],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
module right(x=0, p) { module right(x=0, p) {
req_children($children);
assert(is_undef(p), "Module form `right()` does not accept p= argument."); assert(is_undef(p), "Module form `right()` does not accept p= argument.");
assert(is_finite(x), "Invalid number") assert(is_finite(x), "Invalid number")
translate([x,0,0]) children(); translate([x,0,0]) children();
@ -251,6 +254,7 @@ function right(x=0, p=_NO_ARG) =
move([x,0,0],p=p); move([x,0,0],p=p);
module xmove(x=0, p) { module xmove(x=0, p) {
req_children($children);
assert(is_undef(p), "Module form `xmove()` does not accept p= argument."); assert(is_undef(p), "Module form `xmove()` does not accept p= argument.");
assert(is_finite(x), "Invalid number") assert(is_finite(x), "Invalid number")
translate([x,0,0]) children(); translate([x,0,0]) children();
@ -264,7 +268,7 @@ function xmove(x=0, p=_NO_ARG) =
// Function&Module: fwd() // Function&Module: fwd()
// //
// Usage: As Module // Usage: As Module
// fwd(y) ... // fwd(y) children;
// Usage: Translate Points // Usage: Translate Points
// pts = fwd(y, p); // pts = fwd(y, p);
// Usage: Get Translation Matrix // Usage: Get Translation Matrix
@ -292,6 +296,7 @@ function xmove(x=0, p=_NO_ARG) =
// pt3 = fwd(3, p=[[1,2,3],[4,5,6]]); // Returns: [[1,-1,3], [4,2,6]] // pt3 = fwd(3, p=[[1,2,3],[4,5,6]]); // Returns: [[1,-1,3], [4,2,6]]
// mat3d = fwd(4); // Returns: [[1,0,0,0],[0,1,0,-4],[0,0,1,0],[0,0,0,1]] // mat3d = fwd(4); // Returns: [[1,0,0,0],[0,1,0,-4],[0,0,1,0],[0,0,0,1]]
module fwd(y=0, p) { module fwd(y=0, p) {
req_children($children);
assert(is_undef(p), "Module form `fwd()` does not accept p= argument."); assert(is_undef(p), "Module form `fwd()` does not accept p= argument.");
assert(is_finite(y), "Invalid number") assert(is_finite(y), "Invalid number")
translate([0,-y,0]) children(); translate([0,-y,0]) children();
@ -306,7 +311,7 @@ function fwd(y=0, p=_NO_ARG) =
// Aliases: ymove() // Aliases: ymove()
// //
// Usage: As Module // Usage: As Module
// back(y) ... // back(y) children;
// Usage: Translate Points // Usage: Translate Points
// pts = back(y, p); // pts = back(y, p);
// Usage: Get Translation Matrix // Usage: Get Translation Matrix
@ -334,6 +339,7 @@ function fwd(y=0, p=_NO_ARG) =
// pt3 = back(3, p=[[1,2,3],[4,5,6]]); // Returns: [[1,5,3], [4,8,6]] // pt3 = back(3, p=[[1,2,3],[4,5,6]]); // Returns: [[1,5,3], [4,8,6]]
// mat3d = back(4); // Returns: [[1,0,0,0],[0,1,0,4],[0,0,1,0],[0,0,0,1]] // mat3d = back(4); // Returns: [[1,0,0,0],[0,1,0,4],[0,0,1,0],[0,0,0,1]]
module back(y=0, p) { module back(y=0, p) {
req_children($children);
assert(is_undef(p), "Module form `back()` does not accept p= argument."); assert(is_undef(p), "Module form `back()` does not accept p= argument.");
assert(is_finite(y), "Invalid number") assert(is_finite(y), "Invalid number")
translate([0,y,0]) children(); translate([0,y,0]) children();
@ -344,6 +350,7 @@ function back(y=0,p=_NO_ARG) =
move([0,y,0],p=p); move([0,y,0],p=p);
module ymove(y=0, p) { module ymove(y=0, p) {
req_children($children);
assert(is_undef(p), "Module form `ymove()` does not accept p= argument."); assert(is_undef(p), "Module form `ymove()` does not accept p= argument.");
assert(is_finite(y), "Invalid number") assert(is_finite(y), "Invalid number")
translate([0,y,0]) children(); translate([0,y,0]) children();
@ -357,7 +364,7 @@ function ymove(y=0,p=_NO_ARG) =
// Function&Module: down() // Function&Module: down()
// //
// Usage: As Module // Usage: As Module
// down(z) ... // down(z) children;
// Usage: Translate Points // Usage: Translate Points
// pts = down(z, p); // pts = down(z, p);
// Usage: Get Translation Matrix // Usage: Get Translation Matrix
@ -384,6 +391,7 @@ function ymove(y=0,p=_NO_ARG) =
// pt2 = down(3, p=[[1,2,3],[4,5,6]]); // Returns: [[1,2,0], [4,5,3]] // pt2 = down(3, p=[[1,2,3],[4,5,6]]); // Returns: [[1,2,0], [4,5,3]]
// mat3d = down(4); // Returns: [[1,0,0,0],[0,1,0,0],[0,0,1,-4],[0,0,0,1]] // mat3d = down(4); // Returns: [[1,0,0,0],[0,1,0,0],[0,0,1,-4],[0,0,0,1]]
module down(z=0, p) { module down(z=0, p) {
req_children($children);
assert(is_undef(p), "Module form `down()` does not accept p= argument."); assert(is_undef(p), "Module form `down()` does not accept p= argument.");
translate([0,0,-z]) children(); translate([0,0,-z]) children();
} }
@ -397,7 +405,7 @@ function down(z=0, p=_NO_ARG) =
// Aliases: zmove() // Aliases: zmove()
// //
// Usage: As Module // Usage: As Module
// up(z) ... // up(z) children;
// Usage: Translate Points // Usage: Translate Points
// pts = up(z, p); // pts = up(z, p);
// Usage: Get Translation Matrix // Usage: Get Translation Matrix
@ -424,6 +432,7 @@ function down(z=0, p=_NO_ARG) =
// pt2 = up(3, p=[[1,2,3],[4,5,6]]); // Returns: [[1,2,6], [4,5,9]] // pt2 = up(3, p=[[1,2,3],[4,5,6]]); // Returns: [[1,2,6], [4,5,9]]
// mat3d = up(4); // Returns: [[1,0,0,0],[0,1,0,0],[0,0,1,4],[0,0,0,1]] // mat3d = up(4); // Returns: [[1,0,0,0],[0,1,0,0],[0,0,1,4],[0,0,0,1]]
module up(z=0, p) { module up(z=0, p) {
req_children($children);
assert(is_undef(p), "Module form `up()` does not accept p= argument."); assert(is_undef(p), "Module form `up()` does not accept p= argument.");
assert(is_finite(z), "Invalid number"); assert(is_finite(z), "Invalid number");
translate([0,0,z]) children(); translate([0,0,z]) children();
@ -434,6 +443,7 @@ function up(z=0, p=_NO_ARG) =
move([0,0,z],p=p); move([0,0,z],p=p);
module zmove(z=0, p) { module zmove(z=0, p) {
req_children($children);
assert(is_undef(p), "Module form `zmove()` does not accept p= argument."); assert(is_undef(p), "Module form `zmove()` does not accept p= argument.");
assert(is_finite(z), "Invalid number"); assert(is_finite(z), "Invalid number");
translate([0,0,z]) children(); translate([0,0,z]) children();
@ -453,10 +463,10 @@ function zmove(z=0, p=_NO_ARG) =
// Function&Module: rot() // Function&Module: rot()
// //
// Usage: As a Module // Usage: As a Module
// rot(a, [cp], [reverse]) {...} // rot(a, [cp=], [reverse=]) children;
// rot([X,Y,Z], [cp], [reverse]) {...} // rot([X,Y,Z], [cp=], [reverse=]) children;
// rot(a, v, [cp], [reverse]) {...} // rot(a, v, [cp=], [reverse=]) children;
// rot(from, to, [a], [reverse]) {...} // rot(from=, to=, [a=], [reverse=]) children;
// Usage: As a Function to transform data in `p` // Usage: As a Function to transform data in `p`
// pts = rot(a, p=, [cp=], [reverse=]); // pts = rot(a, p=, [cp=], [reverse=]);
// pts = rot([X,Y,Z], p=, [cp=], [reverse=]); // pts = rot([X,Y,Z], p=, [cp=], [reverse=]);
@ -519,6 +529,7 @@ function zmove(z=0, p=_NO_ARG) =
// stroke(rot(30,p=path), closed=true); // stroke(rot(30,p=path), closed=true);
module rot(a=0, v, cp, from, to, reverse=false) module rot(a=0, v, cp, from, to, reverse=false)
{ {
req_children($children);
m = rot(a=a, v=v, cp=cp, from=from, to=to, reverse=reverse); m = rot(a=a, v=v, cp=cp, from=from, to=to, reverse=reverse);
multmatrix(m) children(); multmatrix(m) children();
} }
@ -556,7 +567,7 @@ function rot(a=0, v, cp, from, to, reverse=false, p=_NO_ARG, _m) =
// Function&Module: xrot() // Function&Module: xrot()
// //
// Usage: As Module // Usage: As Module
// xrot(a, [cp=]) ... // xrot(a, [cp=]) children;
// Usage: As a function to rotate points // Usage: As a function to rotate points
// rotated = xrot(a, p, [cp=]); // rotated = xrot(a, p, [cp=]);
// Usage: As a function to return rotation matrix // Usage: As a function to return rotation matrix
@ -585,6 +596,7 @@ function rot(a=0, v, cp, from, to, reverse=false, p=_NO_ARG, _m) =
// xrot(90) cylinder(h=50, r=10, center=true); // xrot(90) cylinder(h=50, r=10, center=true);
module xrot(a=0, p, cp) module xrot(a=0, p, cp)
{ {
req_children($children);
assert(is_undef(p), "Module form `xrot()` does not accept p= argument."); assert(is_undef(p), "Module form `xrot()` does not accept p= argument.");
if (a==0) { if (a==0) {
children(); // May be slightly faster? children(); // May be slightly faster?
@ -601,7 +613,7 @@ function xrot(a=0, p=_NO_ARG, cp) = rot([a,0,0], cp=cp, p=p);
// Function&Module: yrot() // Function&Module: yrot()
// //
// Usage: As Module // Usage: As Module
// yrot(a, [cp=]) ... // yrot(a, [cp=]) children;
// Usage: Rotate Points // Usage: Rotate Points
// rotated = yrot(a, p, [cp=]); // rotated = yrot(a, p, [cp=]);
// Usage: Get Rotation Matrix // Usage: Get Rotation Matrix
@ -630,6 +642,7 @@ function xrot(a=0, p=_NO_ARG, cp) = rot([a,0,0], cp=cp, p=p);
// yrot(90) cylinder(h=50, r=10, center=true); // yrot(90) cylinder(h=50, r=10, center=true);
module yrot(a=0, p, cp) module yrot(a=0, p, cp)
{ {
req_children($children);
assert(is_undef(p), "Module form `yrot()` does not accept p= argument."); assert(is_undef(p), "Module form `yrot()` does not accept p= argument.");
if (a==0) { if (a==0) {
children(); // May be slightly faster? children(); // May be slightly faster?
@ -646,7 +659,7 @@ function yrot(a=0, p=_NO_ARG, cp) = rot([0,a,0], cp=cp, p=p);
// Function&Module: zrot() // Function&Module: zrot()
// //
// Usage: As Module // Usage: As Module
// zrot(a, [cp=]) ... // zrot(a, [cp=]) children;
// Usage: As Function to rotate points // Usage: As Function to rotate points
// rotated = zrot(a, p, [cp=]); // rotated = zrot(a, p, [cp=]);
// Usage: As Function to return rotation matrix // Usage: As Function to return rotation matrix
@ -675,6 +688,7 @@ function yrot(a=0, p=_NO_ARG, cp) = rot([0,a,0], cp=cp, p=p);
// zrot(90) cube(size=[60,20,40], center=true); // zrot(90) cube(size=[60,20,40], center=true);
module zrot(a=0, p, cp) module zrot(a=0, p, cp)
{ {
req_children($children);
assert(is_undef(p), "Module form `zrot()` does not accept p= argument."); assert(is_undef(p), "Module form `zrot()` does not accept p= argument.");
if (a==0) { if (a==0) {
children(); // May be slightly faster? children(); // May be slightly faster?
@ -696,8 +710,8 @@ function zrot(a=0, p=_NO_ARG, cp) = rot(a, cp=cp, p=p);
// Function&Module: scale() // Function&Module: scale()
// Usage: As Module // Usage: As Module
// scale(SCALAR) ... // scale(SCALAR) children;
// scale([X,Y,Z]) ... // scale([X,Y,Z]) children;
// Usage: Scale Points // Usage: Scale Points
// pts = scale(v, p, [cp=]); // pts = scale(v, p, [cp=]);
// Usage: Get Scaling Matrix // Usage: Get Scaling Matrix
@ -747,7 +761,7 @@ function scale(v=1, p=_NO_ARG, cp=[0,0,0]) =
// //
// //
// Usage: As Module // Usage: As Module
// xscale(x, [cp=]) ... // xscale(x, [cp=]) children;
// Usage: Scale Points // Usage: Scale Points
// scaled = xscale(x, p, [cp=]); // scaled = xscale(x, p, [cp=]);
// Usage: Get Affine Matrix // Usage: Get Affine Matrix
@ -780,6 +794,7 @@ function scale(v=1, p=_NO_ARG, cp=[0,0,0]) =
// #stroke(path,closed=true); // #stroke(path,closed=true);
// stroke(xscale(2,p=path),closed=true); // stroke(xscale(2,p=path),closed=true);
module xscale(x=1, p, cp=0) { module xscale(x=1, p, cp=0) {
req_children($children);
assert(is_undef(p), "Module form `xscale()` does not accept p= argument."); assert(is_undef(p), "Module form `xscale()` does not accept p= argument.");
cp = is_num(cp)? [cp,0,0] : cp; cp = is_num(cp)? [cp,0,0] : cp;
if (cp == [0,0,0]) { if (cp == [0,0,0]) {
@ -800,7 +815,7 @@ function xscale(x=1, p=_NO_ARG, cp=0) =
// Function&Module: yscale() // Function&Module: yscale()
// //
// Usage: As Module // Usage: As Module
// yscale(y, [cp=]) ... // yscale(y, [cp=]) children;
// Usage: Scale Points // Usage: Scale Points
// scaled = yscale(y, p, [cp=]); // scaled = yscale(y, p, [cp=]);
// Usage: Get Affine Matrix // Usage: Get Affine Matrix
@ -833,6 +848,7 @@ function xscale(x=1, p=_NO_ARG, cp=0) =
// #stroke(path,closed=true); // #stroke(path,closed=true);
// stroke(yscale(2,p=path),closed=true); // stroke(yscale(2,p=path),closed=true);
module yscale(y=1, p, cp=0) { module yscale(y=1, p, cp=0) {
req_children($children);
assert(is_undef(p), "Module form `yscale()` does not accept p= argument."); assert(is_undef(p), "Module form `yscale()` does not accept p= argument.");
cp = is_num(cp)? [0,cp,0] : cp; cp = is_num(cp)? [0,cp,0] : cp;
if (cp == [0,0,0]) { if (cp == [0,0,0]) {
@ -853,7 +869,7 @@ function yscale(y=1, p=_NO_ARG, cp=0) =
// Function&Module: zscale() // Function&Module: zscale()
// //
// Usage: As Module // Usage: As Module
// zscale(z, [cp=]) ... // zscale(z, [cp=]) children;
// Usage: Scale Points // Usage: Scale Points
// scaled = zscale(z, p, [cp=]); // scaled = zscale(z, p, [cp=]);
// Usage: Get Affine Matrix // Usage: Get Affine Matrix
@ -886,6 +902,7 @@ function yscale(y=1, p=_NO_ARG, cp=0) =
// #stroke(path,closed=true); // #stroke(path,closed=true);
// stroke(zscale(2,path),closed=true); // stroke(zscale(2,path),closed=true);
module zscale(z=1, p, cp=0) { module zscale(z=1, p, cp=0) {
req_children($children);
assert(is_undef(p), "Module form `zscale()` does not accept p= argument."); assert(is_undef(p), "Module form `zscale()` does not accept p= argument.");
cp = is_num(cp)? [0,0,cp] : cp; cp = is_num(cp)? [0,0,cp] : cp;
if (cp == [0,0,0]) { if (cp == [0,0,0]) {
@ -909,7 +926,7 @@ function zscale(z=1, p=_NO_ARG, cp=0) =
// Function&Module: mirror() // Function&Module: mirror()
// Usage: As Module // Usage: As Module
// mirror(v) ... // mirror(v) children;
// Usage: As Function // Usage: As Function
// pt = mirror(v, p); // pt = mirror(v, p);
// Usage: Get Reflection/Mirror Matrix // Usage: Get Reflection/Mirror Matrix
@ -979,11 +996,11 @@ function mirror(v, p=_NO_ARG) =
// Function&Module: xflip() // Function&Module: xflip()
// //
// Usage: As Module // Usage: As Module
// xflip([x]) ... // xflip([x=]) children;
// Usage: As Function // Usage: As Function
// pt = xflip(p, [x]); // pt = xflip(p, [x]);
// Usage: Get Affine Matrix // Usage: Get Affine Matrix
// pt = xflip([x]); // mat = xflip([x=]);
// //
// Topics: Affine, Matrices, Transforms, Reflection, Mirroring // Topics: Affine, Matrices, Transforms, Reflection, Mirroring
// See Also: mirror(), yflip(), zflip() // See Also: mirror(), yflip(), zflip()
@ -998,8 +1015,8 @@ function mirror(v, p=_NO_ARG) =
// * Called as a function without a `p` argument, returns the affine3d 4x4 mirror matrix. // * Called as a function without a `p` argument, returns the affine3d 4x4 mirror matrix.
// //
// Arguments: // Arguments:
// x = The X coordinate of the plane of reflection. Default: 0
// p = If given, the point, path, patch, or VNF to mirror. Function use only. // p = If given, the point, path, patch, or VNF to mirror. Function use only.
// x = The X coordinate of the plane of reflection. Default: 0
// //
// Example: // Example:
// xflip() yrot(90) cylinder(d1=10, d2=0, h=20); // xflip() yrot(90) cylinder(d1=10, d2=0, h=20);
@ -1011,6 +1028,7 @@ function mirror(v, p=_NO_ARG) =
// color("blue", 0.25) left(5) cube([0.01,15,15], center=true); // color("blue", 0.25) left(5) cube([0.01,15,15], center=true);
// color("red", 0.333) yrot(90) cylinder(d1=10, d2=0, h=20); // color("red", 0.333) yrot(90) cylinder(d1=10, d2=0, h=20);
module xflip(p, x=0) { module xflip(p, x=0) {
req_children($children);
assert(is_undef(p), "Module form `zflip()` does not accept p= argument."); assert(is_undef(p), "Module form `zflip()` does not accept p= argument.");
translate([x,0,0]) translate([x,0,0])
mirror([1,0,0]) mirror([1,0,0])
@ -1032,11 +1050,11 @@ function xflip(p=_NO_ARG, x=0) =
// Function&Module: yflip() // Function&Module: yflip()
// //
// Usage: As Module // Usage: As Module
// yflip([y]) ... // yflip([y=]) children;
// Usage: As Function // Usage: As Function
// pt = yflip(p, [y]); // pt = yflip(p, [y]);
// Usage: Get Affine Matrix // Usage: Get Affine Matrix
// pt = yflip([y]); // mat = yflip([y=]);
// //
// Topics: Affine, Matrices, Transforms, Reflection, Mirroring // Topics: Affine, Matrices, Transforms, Reflection, Mirroring
// See Also: mirror(), xflip(), zflip() // See Also: mirror(), xflip(), zflip()
@ -1064,6 +1082,7 @@ function xflip(p=_NO_ARG, x=0) =
// color("blue", 0.25) back(5) cube([15,0.01,15], center=true); // color("blue", 0.25) back(5) cube([15,0.01,15], center=true);
// color("red", 0.333) xrot(90) cylinder(d1=10, d2=0, h=20); // color("red", 0.333) xrot(90) cylinder(d1=10, d2=0, h=20);
module yflip(p, y=0) { module yflip(p, y=0) {
req_children($children);
assert(is_undef(p), "Module form `yflip()` does not accept p= argument."); assert(is_undef(p), "Module form `yflip()` does not accept p= argument.");
translate([0,y,0]) translate([0,y,0])
mirror([0,1,0]) mirror([0,1,0])
@ -1085,11 +1104,11 @@ function yflip(p=_NO_ARG, y=0) =
// Function&Module: zflip() // Function&Module: zflip()
// //
// Usage: As Module // Usage: As Module
// zflip([z]) ... // zflip([z=]) children;
// Usage: As Function // Usage: As Function
// pt = zflip(p, [z]); // pt = zflip(p, [z]);
// Usage: Get Affine Matrix // Usage: Get Affine Matrix
// pt = zflip([z]); // mat = zflip([z=]);
// //
// Topics: Affine, Matrices, Transforms, Reflection, Mirroring // Topics: Affine, Matrices, Transforms, Reflection, Mirroring
// See Also: mirror(), xflip(), yflip() // See Also: mirror(), xflip(), yflip()
@ -1117,6 +1136,7 @@ function yflip(p=_NO_ARG, y=0) =
// color("blue", 0.25) down(5) cube([15,15,0.01], center=true); // color("blue", 0.25) down(5) cube([15,15,0.01], center=true);
// color("red", 0.333) cylinder(d1=10, d2=0, h=20); // color("red", 0.333) cylinder(d1=10, d2=0, h=20);
module zflip(p, z=0) { module zflip(p, z=0) {
req_children($children);
assert(is_undef(p), "Module form `zflip()` does not accept p= argument."); assert(is_undef(p), "Module form `zflip()` does not accept p= argument.");
translate([0,0,z]) translate([0,0,z])
mirror([0,0,1]) mirror([0,0,1])
@ -1137,7 +1157,7 @@ function zflip(p=_NO_ARG, z=0) =
// Function&Module: frame_map() // Function&Module: frame_map()
// Usage: As module // Usage: As module
// frame_map(v1, v2, v3, [reverse=]) { ... } // frame_map(v1, v2, v3, [reverse=]) children;
// Usage: As function to remap points // Usage: As function to remap points
// transformed = frame_map(v1, v2, v3, p=points, [reverse=]); // transformed = frame_map(v1, v2, v3, p=points, [reverse=]);
// Usage: As function to return a transformation matrix: // Usage: As function to return a transformation matrix:
@ -1216,6 +1236,7 @@ function frame_map(x,y,z, p=_NO_ARG, reverse=false) =
module frame_map(x,y,z,p,reverse=false) module frame_map(x,y,z,p,reverse=false)
{ {
req_children($children);
assert(is_undef(p), "Module form `frame_map()` does not accept p= argument."); assert(is_undef(p), "Module form `frame_map()` does not accept p= argument.");
multmatrix(frame_map(x,y,z,reverse=reverse)) multmatrix(frame_map(x,y,z,reverse=reverse))
children(); children();
@ -1224,7 +1245,7 @@ module frame_map(x,y,z,p,reverse=false)
// Function&Module: skew() // Function&Module: skew()
// Usage: As Module // Usage: As Module
// skew([sxy=], [sxz=], [syx=], [syz=], [szx=], [szy=]) ... // skew([sxy=], [sxz=], [syx=], [syz=], [szx=], [szy=]) children;
// Usage: As Function // Usage: As Function
// pts = skew(p, [sxy=], [sxz=], [syx=], [syz=], [szx=], [szy=]); // pts = skew(p, [sxy=], [sxz=], [syx=], [syz=], [szx=], [szy=]);
// Usage: Get Affine Matrix // Usage: Get Affine Matrix
@ -1276,6 +1297,7 @@ module frame_map(x,y,z,p,reverse=false)
// stroke(pts,closed=true,dots=true,dots_color="blue"); // stroke(pts,closed=true,dots=true,dots_color="blue");
module skew(p, sxy=0, sxz=0, syx=0, syz=0, szx=0, szy=0) module skew(p, sxy=0, sxz=0, syx=0, syz=0, szx=0, szy=0)
{ {
req_children($children);
assert(is_undef(p), "Module form `skew()` does not accept p= argument.") assert(is_undef(p), "Module form `skew()` does not accept p= argument.")
multmatrix( multmatrix(
affine3d_skew(sxy=sxy, sxz=sxz, syx=syx, syz=syz, szx=szx, szy=szy) affine3d_skew(sxy=sxy, sxz=sxz, syx=syx, syz=syz, szx=szx, szy=szy)
@ -1299,7 +1321,7 @@ function skew(p=_NO_ARG, sxy=0, sxz=0, syx=0, syz=0, szx=0, szy=0) =
/// Internal Function: is_2d_transform() /// Internal Function: is_2d_transform()
/// Usage: /// Usage:
/// x = is_2d_transform(t); /// bool = is_2d_transform(t);
/// Topics: Affine, Matrices, Transforms, Type Checking /// Topics: Affine, Matrices, Transforms, Type Checking
/// See Also: is_affine(), is_matrix() /// See Also: is_affine(), is_matrix()
/// Description: /// Description: