home *** CD-ROM | disk | FTP | other *** search
-
- REM date: 030787 simon izraelevitz
-
- REM task: creates a line tangent to an arc or circle and
- REM parallel to another 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]
-
- :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)
- IF (magn <= accuracy)
- GOTO error2
- 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 *** distance from center of arc to line
- dist1 = abs(cvx*xc + cvy*yc + ind)/sqrt(xc*xc + yc*yc)
-
- REM *** distance from cursor pick to line
- dist2 = abs(crvx*xc + crvy*yc + ind)/sqrt(xc*xc + yc*yc)
-
- REM *** calculate vector normal to base line in the direction
- REM of the cursor pick
- pdist = abs((crvx - p1vx)*uvx + (crvy - p1vy)*uvy)
- pjx = p1vx + pdist*uvx
- pjy = p1vy + pdist*uvy
- cjvx = (crvx - pjx)/dist2
- cjvy = (crvy - pjy)/dist2
-
- REM *** define solution flag
- IF (dist1 >= rad)
- GOTO flag1
- IF (dist2 >= rad)
- GOTO flag2
- GOTO flag3
-
- :flag1
- flag = (dist2 - dist1)/(abs(dist2 - dist1))
- GOTO distance
-
- :flag2
- flag = 1
- GOTO distance
-
- :flag3
- flag = -1
-
- :distance
- REM *** distance from solution tangent line to base line
- dis = abs(dist1 + flag*rad)
-
- REM *** solution line, view coord
- s1vx = p1vx + (dis*cjvx)
- s1vy = p1vy + (dis*cjvy)
- s1vz = p1vz
- s2vx = p2vx + (dis*cjvx)
- s2vy = p2vy + (dis*cjvy)
- s2vz = p2vz
-
- REM *** map line to world coord.
- CALL xfmvw,avm,s1vx,s1vy,s1vz,s1wx,s1wy,s1wz
- CALL xfmvw,avm,s2vx,s2vy,s2vz,s2wx,s2wy,s2wz
-
- 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