home *** CD-ROM | disk | FTP | other *** search
- /* CMD: Recursive Clone
- * Clone With transformed Object !! STILL EXPERIMENTAL !! */
- /* Wed Dec 30 13:14:49 1992 */
-
- ax.1='X'
- ax.2='Y'
- ax.3='Z'
- address "LWModelerARexx.port"
- call addlib "LWModelerARexx.port", 0
- SIGNAL ON ERROR
- SIGNAL ON SYNTAX
- call addlib "rexxsupport.library", 0, -30, 0
- call addlib "rexxmathlib.library", 0, -30, 0
- sysnam = 'Recursive Transform Clone'
- filnam = 'T:RClone.state'
- version = sysnam' v. 1.0'
-
- empty=emptylayers()
- layer=curlayer()
- olayer=layer
- if empty~="" then do
- layer=word(empty,1)
- slayer=word(empty,2)
- empty=1
- end
- else do /* Need 1 layer to transform in */
- call notify(1,'!'sysnam,'@Sorry, No Scratch Layer Available')
- exit
- end
-
- if slayer="" then do /* Use second layer, if available for finished object */
- if ~notify(2,'!'sysnam,'@No Scratch Layers Available','@Transform Original?') then exit
- slayer=olayer
- end
- else do
- call COPY
- call 'SETLAYER 'slayer
- call PASTE
- end
-
- lev=0
- cnt='0,0,0'
- mov='0,0,0'
- rot='0,0,0'
- scl='1,1,1'
- sym=1
-
- if (exists(filnam)) then do
- if (~open(state, filnam, 'R')) then break
- if (readln(state) ~= version) then break
- lev = readln(state)
- cnt=readln(state)
- mov=readln(state)
- rot=readln(state)
- scl=readln(state)
- sym=readln(state)
- call close state
- end
- say cnt mov scl rot
-
- call req_begin sysnam
-
- /* id_txt = req_addcontrol('Danger ', 'T','This one can go wild...') */
- id_lev = req_addcontrol("Level [<5]", 'N')
- id_cnt = req_addcontrol("Center", 'V', 0)
- id_scl = req_addcontrol("Scale", 'V', 0)
- id_rot = req_addcontrol("Rotate", 'V', 0)
- id_mov = req_addcontrol("Move", 'V', 0)
- id_sym = req_addcontrol("Rotational Symmetry", 'CH','OFF X Y Z')
- id_deg = req_addcontrol("Degree of Symmetry, n:",'N')
-
- call req_setval id_lev, lev,1
- call req_setval id_sym, sym,1
- call req_setval id_deg, 6,6
- call req_setval id_cnt, translate(cnt,' ',','),0
- call req_setval id_scl, translate(scl,' ',','),1
- call req_setval id_rot, translate(rot,' ',','),0
- call req_setval id_mov, translate(mov,' ',','),0
-
- if (~req_post()) then do
- call req_end
- exit
- end
-
- lev=req_getval(id_lev)
- if lev>4 then lev=4
- deg=req_getval(id_deg)
- sym=req_getval(id_sym)
- t= req_getval(id_cnt)
- parse var t cx cy cz
- t= req_getval(id_scl)
- parse var t sx sy sz
- t= req_getval(id_rot)
- parse var t rx ry rz
- t= req_getval(id_mov)
- parse var t mx my mz
-
- cnt= cx','cy','cz
- mov= mx','my','mz
- rot= rx','ry','rz
- scl= sx','sy','sz
-
- if (open(state, filnam, 'W')) then do
- call writeln state, version
- call writeln state, lev
- call writeln state, cnt
- call writeln state, mov
- call writeln state, rot
- call writeln state, scl
- call writeln state, sym
- call close state
- end
-
- call req_end
-
- sym=sym-1
- Ax=Ax.sym
-
- /* Can accumulate transformations either by transforming object or transform,
- i.e. F(A)->A' ==> F(A')->A'' vs F'(A)->A'' There are differences...
- */
-
- call COPY
- call 'SETLAYER 'layer
- if empty then call PASTE
- do i=0 to lev
- call COPY
- call 'SETLAYER 'slayer /* Hold present level here */
- call PASTE
- if sym~=0 then call symmetrize(Ax,deg)
- call 'SETLAYER 'layer /* Back to work layer */
- do n=0 to i
- if sym~=0 then call symmetrize(Ax,deg)
- call transform( mov, rot, scl, cnt)
- end
- call COPY
- call 'SETLAYER 'slayer
- call PASTE /* Add next level in, cut over to work layer */
- call CUT
- call 'SETLAYER 'layer
- call PASTE
-
- /* cx=cx*sx; cy=cy*sy; cz=cz*sz */
- /* rx=rx*sx; ry=ry*sy; rz=rz*sz */
- cx=cx+mx; cy=cy+my; cz=cz+mz /* Move Center */
- cnt= cx','cy','cz
- mx=mx*sx; my=my*sy; mz=mz*sz
- mov= mx','my','mz
- /* rot= rx','ry','rz */
- /* scl= sx','sy','sz */
- end
-
- call 'SETLAYER 'layer /* Clean up... */
- call CUT
- call 'SETLAYER 'slayer
- call PASTE
- exit
-
- SYNTAX:
- ERROR:
- say 'Sorry, Error #'RC' on line 'SIGL' has been detected.'
- say errortext(rc)
- say sourceline(SIGL)
- t=notify(1,'!Total Bummer Dude!','!An error has been detected.','@'ErrorText(rc),'Line 'SIGL)
- call end_all
- exit
-
- Symmetrize:
- arg axis, degree
- astep=360/degree
- a=0
- call 'COPY' /* Get 0° version */
- do i=1 to degree-1
- call 'ROTATE (astep,'axis',0)
- call 'PASTE' /* Put down 0° version */
- a=a+astep
- end
- return
-
- Transform:
- arg mov, rot, scl, cnt
- parse var rot rx','ry','rz
- if rx~=0 then call 'ROTATE C['cnt'] Axis=X ang'rx /* Interpret rotations as sequential operations */
- if ry~=0 then call 'ROTATE C['cnt'] Axis=Y ang'ry
- if rz~=0 then call 'ROTATE C['cnt'] Axis=Z ang'rz
- call 'MOVE O['mov']'
- call 'SCALE C['cnt'] F['scl']'
- return
-
-
- /* ROTATE(angle<number>, axis<X|Y|Z>, [center<vector>]) */