Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
/*
 * This file:
 *   http://anggtwu.net/myqdraw/mydraw3d.mac.html
 *   http://anggtwu.net/myqdraw/mydraw3d.mac
 *          (find-angg "myqdraw/mydraw3d.mac")
 * Author: Eduardo Ochs <eduardoochs@gmail.com>
 *
 * (defun e () (interactive) (find-angg "myqdraw/mydraw3d.mac"))
 *
 * Introduction
 * ============
 * `qdraw' is a front-end for `draw2d'. Its main part is a translator,
 * `qdraw1', that is implemented as a big `case' - look:
 *
 *   (find-myqdrawfile "qdraw.mac" "qdraw1([qda]) :=")
 *   (find-myqdrawfile "qdraw.mac" "qdraw1([qda]) :=" "local (goodargs,")
 *   (find-myqdrawfile "qdraw.mac" "case  lw")
 *   (find-myqdrawfile "qdraw.mac" "case  lw" "if qtop = lw then")
 *
 * `myqdraw' is my front-end for `qdraw'. Look:
 *
 *   (find-myqdrawfile "myqdraw3.mac")
 *   (find-myqdrawfile "myqdraw3.mac" "but it flattens its arguments")
 *
 * This file, `mydraw3d.mac' is an attempt to implement something
 * similar to `qdraw'/`mywdraw', but for `draw3d', and using an
 * associative array - `mydraw3d_translate_op' - instead of a big
 * `case'.
 *
 * «.array»			(to "array")
 * «.array-tests»		(to "array-tests")
 * «.core»			(to "core")
 * «.core-tests»		(to "core-tests")
 * «.options»			(to "options")
 * «.numerozinhos»		(to "numerozinhos")
 * «.numerozinhos-tests»	(to "numerozinhos-tests")
 * «.addz»			(to "addz")
 * «.addz-tests»		(to "addz-tests")
 * «.surface»			(to "surface")
 * «.surface-tests»		(to "surface-tests")
 * «.squares»			(to "squares")
 * «.squares-tests»		(to "squares-tests")
 * «.topdf»			(to "topdf")
 * «.topdf-test»		(to "topdf-test")
 *   «.flipbook-anim»		(to "flipbook-anim")
*/



/* «array»  (to ".array")
 * (find-maximanode "arrayinfo")
*/
array_keys(a)   := map('first,rest(rest(apply('arrayinfo,[a]))));
array_has (a,k) := member(k, array_keys(a));
array_get (a,k) := subvar(a,k);

/* «array-tests»  (to ".array-tests")
*
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
aa['bb] : "bbb";
aa['cc] : "ccc";
array_keys( aa);
array_keys('aa);
array_has ('aa, 'bb);
array_has ('aa, 'dd);
array_get ('aa, 'bb);
array_get ('aa, 'dd);

*/



/* «core»  (to ".core")
*/
mydraw3d            ([os]) := apply('draw3d, mydraw3d_translate(os));
mydraw3d_translate  ([os]) := flatten([map('mydraw3d_translate_1, flatten([os]))]);
mydraw3d_translate_1 (o)   :=
  if   array_has(mydraw3d_translate_op,op(o))
  then apply(mydraw3d_translate_op[op(o)], args(o))
  else error(format("mydraw3d_translate_op[~a] failed", string(op(o))));

mydraw3d_equal       (a,b) := a=b;
mydraw3d_transpose0    (m) := args(transpose(apply('matrix, m)));
mydraw3d_polyline   (xyzs) :=
  [points_joined   = true,
   point_type      = -1,
   apply('points, mydraw3d_transpose0(xyzs))];

mydraw3d_translate_op["="]       : 'mydraw3d_equal;
mydraw3d_translate_op['polyline] : 'mydraw3d_polyline;

/* «core-tests»  (to ".core-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
array_keys( mydraw3d_translate_op);
array_keys('mydraw3d_translate_op);

mydraw3d_equal(a,b) := b=a;
mydraw3d_equal(a,b) := a=b;

mydraw3d_equal            (4,5);
mydraw3d_translate_op["="];
mydraw3d_translate_op["="](4,5);
mydraw3d_translate_1      (4=5);
mydraw3d_translate        (4=5);
mydraw3d_translate  (2=3, [4=5], [[6=7, 8=9]]);

mydraw3d_polyline              ([[1,2,3],[4,5,6]]);
mydraw3d_translate_op['polyline];
mydraw3d_translate    (polyline([[1,2,3],[4,5,6]]));

*/


/* «options»  (to ".options")
 * (find-maximanode "proportional_axes" "xyz")
 * (find-maximanode "axis_3d")
 * (find-maximanode "surface_hide")
*/
mydraw3d_prop  ()             := 'proportional_axes='xyz;
mydraw3d_noaxes()             := 'axis_3d=false;
mydraw3d_hide  ()             := 'surface_hide=true;
mydraw3d_translate_op['prop]   : 'mydraw3d_prop;
mydraw3d_translate_op['noaxes] : 'mydraw3d_noaxes;
mydraw3d_translate_op['hide]   : 'mydraw3d_hide;




/* «numerozinhos»  (to ".numerozinhos")
*/
numerozinhos(expr) ::=
  apply(matrix,
        makelist(makelist(ev(expr), x, xmin,xmax),
                 y, seqby(ymax,ymin,-1)))$

/* «numerozinhos-tests»  (to ".numerozinhos-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
[xmin,ymin, xmax,ymax] : [0,0, 4,3];
numerozinhos([x,y]);

*/



/* «addz»  (to ".addz")
*/
mydraw3d_z            (x,y)    := 0;                     /* dummy */
mydraw3d_addz         (xy)     := [xy[1],xy[2],mydraw3d_z(xy[1],xy[2])];
mydraw3d_addzs        (xys)    := map('mydraw3d_addz, xys);
mydraw3d_polyline_xy  (xys)    := mydraw3d_polyline(mydraw3d_addzs(xys));
mydraw3d_polyline_xy_3(P,v,ts) := mydraw3d_polyline_xy(makelist(P+t*v, t, ts));

mydraw3d_translate_op['polyline_xy]   :
             'mydraw3d_polyline_xy;
mydraw3d_translate_op['polyline_xy_3] :
             'mydraw3d_polyline_xy_3;


/* «addz-tests»  (to ".addz-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");

q(t)   := max(0, t-2);
r(t)   := min(q(t), 2);
S(x,y) := max(r(x), r(y));

mydraw3d_z(x,y)   := S(x,y);

mydraw3d_addz([3,4]);
mydraw3d_addzs([[1,2],[3,4]]);
mydraw3d_polyline_xy([[1,2],[3,4]]);

line_at_x(x)  := polyline_xy_3([x,0], [0,1], seq(0,6));
line_at_y(y)  := polyline_xy_3([0,y], [1,0], seq(0,6));
lines_at_xs() := map('line_at_x, seq(0,6));
lines_at_ys() := map('line_at_y, seq(0,6));
lines_diag()  := polyline_xy_3([2,2], [1,1], seq(0,2));

drawing : [lines_at_xs(), lines_at_ys(), lines_diag()];
mydraw3d(drawing);
mydraw3d(drawing, axis_3d=false, proportional_axes=xyz);

*/


/* «surface»  (to ".surface")
 * (find-maximanode "explicit")
 * (find-maximanode "xu_grid")
*/
mydraw3d_surface () := explicit(mydraw3d_z(x,y), x,xmin,xmax, y,ymin,ymax);

mydraw3d_translate_op['surface] :
             'mydraw3d_surface;

/* «surface-tests»  (to ".surface-tests")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
[xmin,ymin, xmax,ymax] : [0,0, 6,6];
q(t)   := max(0, t-2);
r(t)   := min(q(t), 2);
S(x,y) := max(r(x), r(y));
mydraw3d_z(x,y) := S(x,y);
mydraw3d(surface());
mydraw3d(surface(), surface_hide=true);
mydraw3d(surface(), surface_hide=true, xu_grid=10, yv_grid=50);
numerozinhos(S(x,y));

*/



/* «squares»  (to ".squares")
*/
mydraw3d_square(xy_sw) := block(
  [xy_nw,xy_ne,xy_se, xy_m, z_nw,z_ne,z_sw,z_se, z_m, good_se,good_ne],
   xy_nw : xy_sw + [0,1],
   xy_ne : xy_sw + [1,1],
   xy_se : xy_sw + [1,0],
   xy_m  : xy_sw + [1/2,1/2],
   z_nw  : apply('mydraw3d_z, xy_nw),
   z_ne  : apply('mydraw3d_z, xy_ne),
   z_sw  : apply('mydraw3d_z, xy_sw),
   z_se  : apply('mydraw3d_z, xy_se),
   z_m   : apply('mydraw3d_z, xy_m),
   good_se : is((z_nw-z_m) = (z_m-z_se)),
   good_ne : is((z_ne-z_m) = (z_m-z_sw)),
   [z_nw, z_ne, z_sw, z_se, z_m, good_se, good_ne],
   if good_se and good_ne then polyline_xy([xy_nw,xy_ne,xy_se,xy_sw,xy_nw])
   elseif good_ne then [polyline_xy([xy_nw,xy_ne,xy_sw,xy_nw]),
                        polyline_xy([xy_ne,xy_se,xy_sw,xy_ne])]
   elseif good_se then [polyline_xy([xy_nw,xy_ne,xy_se,xy_nw]),
                        polyline_xy([xy_nw,xy_sw,xy_se,xy_nw])]
   else []
  );

mydraw3d_squares() :=
  create_list(mydraw3d_square([x,y]),
              x,seq(xmin,xmax-1),
              y,seq(ymin,ymax-1));



/* «squares-tests»  (to ".squares-tests")
** (find-es "maxima" "2024.2-C3-piramide")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
[xmin,ymin, xmax,ymax] : [0,0, 10,10];

p(t)   := min(t-2,8-t);
q(t)   := max(0,p(t));
R(x,y) := min(q(x),q(y));
mydraw3d_z(x,y) := R(x,y);

mydraw3d(mydraw3d_squares(), noaxes(), prop());
mydraw3d(surface(),          noaxes(), prop());

W(x,y) := max(-6+x+y, 1);
S(x,y) := min(R(x,y), W(x,y));
mydraw3d_z(x,y) := S(x,y);

mydraw3d(mydraw3d_squares(), noaxes(), prop());
mydraw3d(mydraw3d_squares(), noaxes(), prop(), view=[40,19]);
mydraw3d(surface(),          noaxes(), prop());
mydraw3d(surface(),          noaxes(), prop(), hide());

*/



/* «topdf»  (to ".topdf")
 * (find-myqdraw "topdf2.mac" "myqdrawp")
 * (find-myqdraw "topdf2.mac" "myqdrawp" "myqdrawp ([qargs])")
 * (find-myqdraw "topdf2.mac" "more")
*/
mydraw3dp ([drargs]) := (topdf_incr(), topdf_ret(mydraw3d(topdf_more_body(), drargs)));


/* «topdf-test»  (to ".topdf-test")
* (find-sh0 "ls -lAF /tmp/frame*")
* (find-sh0 "rm   -v /tmp/frame*")
* (eepitch-maxima)
* (eepitch-kill)
* (eepitch-maxima)
load("mydraw3d.mac");
load("topdf2.mac");
mydraw3dp ([drargs]) := (topdf_incr(), topdf_ret(mydraw3d(topdf_more_body(), drargs)));

[topdf_a,topdf_b,topdf_c,topdf_n] : ["/tmp/", "", "frame", 0];
[xmin,ymin, xmax,ymax] : [0,0, 6,6];
q(t)   := max(0, t-2);
r(t)   := min(q(t), 2);
S(x,y) := max(r(x), r(y));
mydraw3d_z(x,y) := S(x,y);
drawing()       := [mydraw3d_squares(), noaxes(), prop()];

myqdrawp_to_screen();
myqdrawp_to_new_pdf();
mydraw3dp(drawing(), view=[40,19]);
mydraw3dp(drawing(), view=[40,20]);
mydraw3dp(drawing(), view=[40,21]);
mydraw3dp(drawing(), view=[40,22]);

** «flipbook-anim»  (to ".flipbook-anim")
* (eepitch-bash)
* (eepitch-kill)
* (eepitch-bash)
add_1zs    () { for i in $*; do echo $i 1-z; done; }
cutext     () { echo $1 | rev | cut -f2- -d. | rev; }
jpgtogif   () { echo convert $1 $(cutext $1).gif;
                     convert $1 $(cutext $1).gif; }
jpgstogifs () { for i in $*; do jpgtogif $i; done; }

rm -fv   /tmp/frame_*.jpg
rm -fv   /tmp/frames*.pdf
rm -fv   /tmp/frame*.gif
ls -lAF  /tmp/frame*

                       add_1zs /tmp/frame_*.pdf
qpdf --empty --pages $(add_1zs /tmp/frame_*.pdf) -- /tmp/frames.pdf
pdftoppm -jpeg -jpegopt quality=80 -r 150 -sep _ /tmp/frames.pdf /tmp/frame
jpgstogifs /tmp/frame*.jpg
gifsicle --colors 256 --loop --delay 20 /tmp/frame_*.gif > /tmp/frames.gif

rm -fv   /tmp/frame_*.jpg
rm -fv   /tmp/frame_*.gif
ls -lAF  /tmp/frame*

# (find-pdf-page "/tmp/frames.pdf")
#    (brg "file:///tmp/frames.gif")

*/