home *** CD-ROM | disk | FTP | other *** search
-
- REM date: 030789 simon izraelevitz
-
- REM task: creates a line tangent to an arc or circle and
- REM perpendicular to a line. Works from any view
-
- REM restrictions: arc and line must be coplanars.
- REM -----------------------------------------------
-
- CLEAR
- accuracy = 0.00005
- ARRAY vm[9]
- ARRAY vm1[9]
-
- :ind_ln
- REM *** get base line
- SET mask,2
- GETENT "Indicate line", 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 *** 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
-
- :ind_arc
- REM *** get arc
- SET mask,3
- GETENT "Indicate arc or circle", etype
- ON (@KEY + 3) GOTO exit,ind_ln,ind_arc,
- cvx = @FLTDAT[0]
- cvy = @FLTDAT[1]
- cvz = @FLTDAT[2]
- rad = @FLTDAT[3]
- arcview = @INTDAT[8]
-
- REM *** save cursor pick
- crvx = @XCURSOR
- crvy = @YCURSOR
-
- REM *** define arc view
- GETVIEW arcview,avm
-
- REM *** store present construction view
- CALL memcpy,vm,0,@CVIEWMAT,0,9
-
- REM *** map arc view z-axis to present view
- CALL xfmwv,vm,avm[2],avm[5],avm[8],av,bv,cv
- dv = -cvz
- REM *** calculate intersection of cursor pick and plane of definition
- REM of arc
- crvz = -(av*crvx + bv*crvy + dv)/cv
-
- REM *** map cursor pick to arc view coord.
- CALL xfmvw,vm,crvx,crvy,crvz,crwx,crwy,crwz
- CALL xfmwv,avm,crwx,crwy,crwz,crvx,crvy,crvz
-
- REM *** map line to arc view coord.
- CALL xfmwv,avm,p1wx,p1wy,p1wz,p1vx,p1vy,p1vz
- CALL xfmwv,avm,p2wx,p2wy,p2wz,p2vx,p2vy,p2vz
-
- REM *** check if line and arc are coplanar
- IF ((abs(p1vz-cvz) > accuracy) || (abs(p2vz-cvz) > accuracy))
- GOTO error1
-
- REM *** define line unit vector, arc view coord.
- dx = p2vx - p1vx
- dy = p2vy - p1vy
- dz = p2vz - p1vz
- magn = sqrt(dx*dx + dy*dy + dz*dz)
- uvx = dx/magn
- uvy = dy/magn
- uvz = dz/magn
-
- REM *** line coefficients, arc view coord
- xc = uvy
- yc = -uvx
- ind = p1vy*uvx - p1vx*uvy
-
- REM *** projection from center of arc to line
- val1 = (cvx - p1vx)*uvx + (cvy - p1vy)*uvy
-
- REM *** projection from cursor pick to line
- val2 = (crvx - p1vx)*uvx + (crvy - p1vy)*uvy
-
- REM *** define solution direction
- IF (val2 >= val1)
- GOTO flag1
- IF (val2 < val1)
- GOTO flag2
-
- :flag1
- val = val1 + rad
- GOTO make_ln
-
- :flag2
- val = val1 - rad
- rad = -rad
- GOTO make_ln
-
- :make_ln
- REM *** map arc center to world
- CALL xfmvw,avm,cvx,cvy,cvz,cwx,cwy,cwz
- s1wx = cwx + rad*uwx
- s1wy = cwy + rad*uwy
- s1wz = cwz + rad*uwz
- s2wx = p1wx + val*uwx
- s2wy = p1wy + val*uwy
- s2wz = p1wz + val*uwz
- LINE s1wx,s1wy,s1wz,s2wx,s2wy,s2wz
- GOTO ind_arc
-
- :error1
- PROMPT " Base line and arc are not coplanar...Select again "
- WAIT 2
- GOTO ind_ln
-
- :error2
- PROMPT " Zero length line... Select again."
- WAIT 2
- GOTO ind_ln
-
- :exit
- SET mask
- EXIT