home *** CD-ROM | disk | FTP | other *** search
- REM name: postrim.cdl
-
- REM date: 030789 simon izraelevitz
-
- REM task: trims/extends a line to a position
-
- REM -----------------------------------------------
-
- CLEAR
- accuracy = 0.00005
- ARRAY vm[9]
-
- :ind_ln
- REM *** get line
- SET mask,2
- GETENT "Indicate line to trim or extend.", etype
- IF (@KEY <= -2)
- GOTO exit
-
- p1wx = @FLTDAT[0]
- p1wy = @FLTDAT[1]
- p1wz = @FLTDAT[2]
- p2wx = @FLTDAT[3]
- p2wy = @FLTDAT[4]
- p2wz = @FLTDAT[5]
-
- REM *** store present construction view
- CALL memcpy,vm,0,@CVIEWMAT,0,9
-
- REM *** define line unit vector, in world coord.
- dx = p2wx - p1wx
- dy = p2wy - p1wy
- dz = p2wz - p1wz
- magn = sqrt(dx*dx + dy*dy + dz*dz)
- IF (magn <= accuracy)
- GOTO error2
- uwx = dx/magn
- uwy = dy/magn
- uwz = dz/magn
-
- REM *** save cursor pick
- crvx = @XCURSOR
- crvy = @YCURSOR
- crvz = @DEPTH
-
- REM *** map line to view coord.
- CALL xfmwv,vm,p1wx,p1wy,p1wz,p1vx,p1vy,p1vz
- CALL xfmwv,vm,p2wx,p2wy,p2wz,p2vx,p2vy,p2vz
-
- REM *** define line unit vector, x and y view coord only.
- dx = p2vx - p1vx
- dy = p2vy - p1vy
- vmagn = sqrt(dx*dx + dy*dy)
- uvx = dx/vmagn
- uvy = dy/vmagn
-
- REM *** get position to trim/extend to
- :get_pos
- defopt = 1
- GETPOS "Indicate trim/extend position.",defopt
- ON (@KEY + 3) GOTO exit,ind_ln,get_pos,
- psvx = @XVIEW
- psvy = @YVIEW
- psvz = @DEPTH
-
- REM *** projection from cursor pick to line
- val1 = (crvx - p1vx)*uvx + (crvy - p1vy)*uvy
-
- REM *** projection from position to line
- val2 = (psvx - p1vx)*uvx + (psvy - p1vy)*uvy
- IF (abs(val2 - val1) <= accuracy)
- GOTO error2
-
- REM *** compute projection point on line
- pjvx = p1vx + val2*uvx
- pjvy = p1vy + val2*uvy
- pjvz = (p2vz-p1vz)*val2/vmagn + p1vz
-
- REM *** map projection point to world and delete line
- CALL xfmvw,vm,pjvx,pjvy,pjvz,pjwx,pjwy,pjwz
- DELENT
-
- REM *** define direction flag
- dir = (val2 - val1)/abs(val2 - val1)
- IF (dir > 0)
- GOTO flag1
- IF (dir < 0)
- GOTO flag2
-
- :flag1
- LINE p1wx,p1wy,p1wz,pjwx,pjwy,pjwz
- GOTO ind_ln
-
- :flag2
- LINE pjwx,pjwy,pjwz,p2wx,p2wy,p2wz
- GOTO ind_ln
-
- :error1
- PROMPT " Ambiguos direction... Indicate position again "
- WAIT 2
- GOTO ind_ln
-
- :error2
- PROMPT " Zero length line... Select again."
- WAIT 2
- GOTO ind_ln
-
- :exit
- SET mask
- EXIT