      SUBROUTINE GVTRAN (ERRNUM)


      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      INTEGER ERRNUM, PARLEL
      DATA PARLEL /1/
      VEWTYP = .FALSE.
      IF (PJTYP.NE.PARLEL) GO TO 500
      DO 20 I = 1, 4
         DO 10 J = 1, 4
            IF (I.EQ.J .AND. MXFORM(I,J).NE.1) GO TO 500
            IF (I.NE.J .AND. MXFORM(I,J).NE.0) GO TO 500
 10        CONTINUE
 20     CONTINUE
      IF (VEWPLN(1).NE.0 .OR. VEWPLN(2).NE.0) GO TO 500
      IF (VEWUP(1).NE.0 .OR. VEWUP(3).NE.0) GO TO 500
      IF (FCLIP) GO TO 500
        IF (BCLIP) GO TO 500
      IF (NDCSPC(3).NE.0) GO TO 500
      GO TO 600
 500    VEWTYP = .TRUE.
 600    CONTINUE
      WRNGVS = .FALSE.
      IF (VEWTYP) CALL GCHKVS (ERRNUM)
      IF (WRNGVS) RETURN
      IF (VEWTYP) CALL G3VIEW
      IF (.NOT.VEWTYP) CALL G2VIEW
      VEWSET = .TRUE.
      RETURN
      END
      SUBROUTINE GCHKVS (ERRNUM)

      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      REAL DIS, DXN, DYN, DZN, DXUP, DYUP, DZUP, COPZ, VRPZ, TEMP1,
     *  TEMP2, DCX, DCY, DCZ, VDX, VDY, VDZ, PDX, PDY, PDZ, TEMP0
      REAL COPX, COPY
        INTEGER PARLEL,PERSP,LEFT,ERRNUM
      EQUIVALENCE (DXN, VEWPLN(1)), (DYN, VEWPLN(2)), (DZN, VEWPLN(3))
     *  , (DXUP, VEWUP(1)), (DYUP, VEWUP(2)), (DZUP, VEWUP(3))
      EQUIVALENCE (DIRX, PJDIR(1)), (DIRY, PJDIR(2)), (DIRZ, PJDIR(3))
      EQUIVALENCE (COPX, PJPNT(1)), (COPY, PJPNT(2))
      EQUIVALENCE (COPZ, PJPNT(3)), (VRPZ, VEWREF(3))
      DATA PARLEL /1/
      DATA PERSP /2/
      DATA LEFT /2/
      IF (FDSET.AND.BDSET) GO TO 10
      IF (PJTYP.EQ.PERSP) GO TO 5
      IF (.NOT.FDSET) FDIS = -1.0E8
      IF (.NOT.BDSET) BDIS = 1.0E8
      GO TO 10
 5      CONTINUE
      IF (.NOT.FDSET) FDIS = PJPNT(3)
      IF (.NOT.BDSET) BDIS = 1.0E8
 10     CONTINUE
      TEMP1 = SQRT (DXN*DXN + DYN*DYN + DZN*DZN)
      TEMP2 = SQRT (DXUP*DXUP + DYUP*DYUP + DZUP*DZUP)
      TEMP0 = (DXN * DXUP + DYN * DYUP + DZN * DZUP)
      IF (ABS(ABS(TEMP0 / (TEMP1 * TEMP2) ) - 1.0 ) .LE. 1.0E-20 )
     *  GO TO 1000
      IF (PJTYP.EQ.PARLEL) GO TO 100
      IF ((.NOT.FCLIP).AND.(.NOT.BCLIP)) GO TO 100
      TEMP1 = VRPZ + FDIS * DZN
      TEMP2 = VRPZ + BDIS * DZN
      TEMP0 = VRPZ + COPZ
      IF (CRDSYS.EQ.LEFT) GO TO 50
      IF (TEMP2.LE.TEMP1 .AND. TEMP1.LE.TEMP0) GO TO 200
      GO TO 1100
 50     IF (TEMP2.GE.TEMP1 .AND. TEMP1.GE.TEMP0) GO TO 200
      GO TO 1100
 100    CONTINUE
      IF (PJTYP.NE.PARLEL) GO TO 200
      TEMP1 = DIRX*DXN + DIRY*DYN + DIRZ*DZN
      IF (ABS(TEMP1).LE.1.0E-10) GO TO 1200
      GO TO 300
 200    CONTINUE
      TEMP1 = SQRT (DXN*DXN + DYN*DYN + DZN*DZN)
      DCX = DXN / TEMP1
      DCY = DYN / TEMP1
      DCZ = DZN / TEMP1
      VDX = VEWDIS * DCX
      VDY = VEWDIS * DCY
      VDZ = VEWDIS * DCZ
      PDX =  VDX - COPX
      PDY =  VDY - COPY
      PDZ =  VDZ - COPZ
      TEMP1 = (PDX * DCX + PDY * DCY + PDZ * DCZ)
      IF (TEMP1.LE.1.0E-10) GO TO 1300
 300    CONTINUE
      IF (FDIS.NE.BDIS) GO TO 400
      IF (VEWPRT(3,1).NE.VEWPRT(3,2)) GO TO 1400
      GO TO 500
 400    IF (VEWPRT(3,1).NE.VEWPRT(3,2)) GO TO 500
      GO TO 1400
 500    RETURN
 1000   ERRNUM = 525
      GO TO 1500
 1100   ERRNUM = 526
      GO TO 1500
 1200   ERRNUM = 527
      GO TO 1500
 1300   ERRNUM = 528
      GO TO 1500
 1400   ERRNUM = 529
 1500   WRNGVS = .TRUE.
      RETURN
      END
      SUBROUTINE G3VIEW

      COMMON/TRX/BONDRY,RXFORM,SING,TXFORM
      REAL BONDRY(3,2),RXFORM(4,4),TXFORM(4,4)
      LOGICAL SING
      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      INTEGER LEFT, RIGHT, PERSP

      REAL DXN, DYN, DZN, DXUP, DYUP, DZUP, C1, C2, L, X3TP, Y3TP,
     *  TEMP, COSAL, SINAL, V(4,4), C(4,4), VRPX, VRPY, VRPZ, VPD,
     *  VDIRZ, DIRX, DIRY, DIRZ, VCOPX, VCOPY, VCOPZ, COPX, COPY,
     *  COPZ, UMAX, UMIN, VMAX, VMIN, SX, SY, SZ, VRPTX, VRPTY, VRPTZ
      EQUIVALENCE (DXN, VEWPLN(1)), (DYN, VEWPLN(2)),
     *  (DXUP, VEWUP(1)), (DYUP, VEWUP(2))
      EQUIVALENCE (VRPX, VEWREF(1)), (VRPY, VEWREF(2)),
     *   (DIRX, PJDIR(1)), (DIRY, PJDIR(2))
      EQUIVALENCE (COPX, PJPNT(1)), (COPY, PJPNT(2)),
     *  (VPD, VEWDIS)
      EQUIVALENCE (UMIN, WINDOW(1,1)), (UMAX, WINDOW(1,2)), (VMIN,
     *  WINDOW(2,1)), (VMAX, WINDOW(2,2))
      DATA LEFT /2/
      DATA RIGHT /1/
      DATA PERSP /2/
      DZN = VEWPLN(3)
      DZUP = VEWUP(3)
      COPZ = PJPNT(3)
      DIRZ = PJDIR(3)
      VRPZ = VEWREF(3)
      IF (CRDSYS.EQ.RIGHT) GO TO 5
      DZN = -DZN
      DZUP = -DZUP
      COPZ = -COPZ
      DIRZ = -DIRZ
      VRPZ = -VRPZ
 5      CONTINUE
      IF (DXN.EQ.0.AND.DZN.EQ.0) GO TO 175
      C1 = SQRT (DXN*DXN + DZN*DZN)
      C2 = SQRT (DYN*DYN + C1*C1)
       L = (ABS (DXN*DXUP + DYN*DYUP + DZN*DZUP))/(C2*C2)
      X3TP = (DXN*DZUP - DZN*DXUP)/C1
      Y3TP = -(((DXN*DXN + DZN*DZN) * (-DYUP + 2*L*DYN)) + (DYN * (DXN
     *  *DXUP + DZN*DZUP)))/(C1*C2)
      TEMP = SQRT (X3TP*X3TP + Y3TP*Y3TP)
      COSAL = Y3TP/TEMP
      SINAL = X3TP/TEMP
      CALL GIDENT (V,4)
      V(1,1) = (DXN*DYN*SINAL - DZN*COSAL*C2)/(C1*C2)
      V(1,2) = (-DYN*DXN*COSAL - DZN*SINAL*C2)/(C1*C2)
      V(1,3) = -DXN/C2
      V(2,1) = -C1*SINAL/C2
      V(2,2) = C1*COSAL/C2
      V(2,3) = -DYN/C2
      V(3,1) = (DXN*COSAL*C2 + DYN*DZN*SINAL)/(C1*C2)
      V(3,2) = (DXN*SINAL*C2 - DYN*DZN*COSAL)/(C1*C2)
      V(3,3) = -DZN/C2

      V(4,1) = (V(2,1) * VRPY) + (COSAL * (VRPX*DZN - VRPZ*DXN) +
     *            (V(2,3)*SINAL * (VRPX*DXN + VRPZ*DZN)))/C1
      V(4,2) = (V(2,2) * (-VRPY)) + (SINAL * (VRPX*DZN - VRPZ*DXN) -
     *            (V(2,3)*COSAL * (VRPX*DXN + VRPZ*DZN)))/C1
      V(4,3) = VPD * (V(2,3)*V(2,3) + V(1,3)*V(1,3) + V(3,3)*V(3,3))
     *           - (VRPX*V(1,3) + VRPY*V(2,3) + VRPZ*V(3,3))
 7      IF (PJTYP.EQ.PERSP) GO TO 100
      V(1,3) = -V(1,3)
      V(2,3) = -V(2,3)
      V(3,3) = -V(3,3)
      V(4,3) = -V(4,3)
 10     CONTINUE
      VDIRZ = V(1,3)*DIRX + V(2,3)*DIRY + V(3,3)*DIRZ
      C(1,1) = (DIRY * (V(1,1)*V(2,3) - V(1,3)*V(2,1)) + DIRZ *
     *            (V(1,1)*V(3,3) - V(1,3)*V(3,1))) / VDIRZ
      C(1,2) = (DIRY * (V(1,2)*V(2,3) - V(1,3)*V(2,2)) + DIRZ *
     *            (V(1,2)*V(3,3) - V(1,3)*V(3,2))) / VDIRZ
      C(2,1) = (DIRX * (V(2,1)*V(1,3) - V(2,3)*V(1,1)) + DIRZ *
     *            (V(2,1)*V(3,3) - V(2,3)*V(3,1))) / VDIRZ
      C(2,2) = (DIRX * (V(1,3)*V(2,2) - V(1,2)*V(2,3)) + DIRZ *
     *            (V(2,2)*V(3,3) - V(2,3)*V(3,2))) / VDIRZ
      C(3,1) = (DIRX * (V(3,1)*V(1,3) - V(3,3)*V(1,1)) + DIRY *
     *            (V(3,1)*V(2,3) - V(3,3)*V(2,1))) / VDIRZ
      C(3,2) = (DIRX * (V(1,3)*V(3,2) - V(1,2)*V(3,3)) + DIRY *
     *            (V(2,3)*V(3,2) - V(2,2)*V(3,3))) / VDIRZ
      C(4,1) = (DIRX * (V(4,1)*V(1,3) - V(4,3)*V(1,1)) + DIRY *
     *            (V(4,1)*V(2,3) - V(4,3)*V(2,1)) + DIRZ * (V(4,1)*
     *            V(3,3) - V(4,3)*V(3,1)))/VDIRZ
      C(4,2) = (DIRX * (V(1,3)*V(4,2) - V(1,2)*V(4,3)) + DIRY *
     *            (V(2,3)*V(4,2) - V(2,2)*V(4,3)) + DIRZ * (V(3,3)*
     *            V(4,2) - V(3,2)*V(4,3)))/VDIRZ
      DO 50 I = 1,4
         DO 40 J = 3,4
            C(I,J) = V(I,J)
 40        CONTINUE
 50     CONTINUE
      C(4,1) = C(4,1) - UMIN
      C(4,2) = C(4,2) - VMIN
      C(4,3) = C(4,3) - FDIS
      SX = 1./(UMAX - UMIN)
      SY = 1./(VMAX - VMIN)
      SZ = 1./(BDIS - FDIS)
      DO 60 I = 1,4
         C(I,1) = C(I,1) * SX
         C(I,2) = C(I,2) * SY
         C(I,3) = C(I,3) * SZ
 60     CONTINUE
      GO TO 200
 100    CONTINUE
      COPX = COPX + VRPX
      COPY = COPY + VRPY
      COPZ = COPZ + VRPZ
      V(4,1) = -V(1,1)*COPX - V(2,1)*COPY - V(3,1)*COPZ
      V(4,2) = -V(1,2)*COPX - V(2,2)*COPY - V(3,2)*COPZ
      V(4,3) = -V(1,3)*COPX - V(2,3)*COPY - V(3,3)*COPZ
      V(1,3) = -V(1,3)
      V(2,3) = -V(2,3)
      V(3,3) = -V(3,3)
      V(4,3) = -V(4,3)
 120    CONTINUE
      VRPTX = V(1,1) * VRPX + V(2,1) * VRPY + V(3,1) * VRPZ + V(4,1)
      VRPTY = V(1,2) * VRPX + V(2,2) * VRPY + V(3,2) * VRPZ + V(4,2)
      VRPTZ = V(1,3) * VRPX + V(2,3) * VRPY + V(3,3) * VRPZ + V(4,3)
      SZ = 1./(VRPTZ + BDIS)
      SX = (2. * VRPTZ * SZ)/(UMAX - UMIN)
      SY = (2. * VRPTZ * SZ)/(VMAX - VMIN)
      C1 = (-(2. * VRPTX + UMIN + UMAX) * SZ)/(UMAX - UMIN)
      C2 = (-(2. * VRPTY + VMIN + VMAX) * SZ)/(VMAX - VMIN)
      DO 150 I = 1,4
         C(I,1) = V(I,1) * SX + C1 * V(I,3)
         C(I,2) = V(I,2) * SY + C2 * V(I,3)
         C(I,3) = V(I,3) * SZ
         C(I,4) = V(I,4)
 150    CONTINUE
      GO TO 300
 175    CONTINUE
      X3TP = DXUP
      Y3TP = DZUP
      TEMP = SQRT (X3TP*X3TP + Y3TP*Y3TP)
      COSAL = Y3TP/TEMP
      SINAL = X3TP/TEMP
      CALL GIDENT (V,4)
      V(1,1) = COSAL
      V(1,2) = SINAL
      V(2,2) = 0.0
      V(2,3) = -1.0
      V(3,1) = -SINAL
      V(3,2) = COSAL
      V(3,3) = 0.0
      V(4,1) = VRPZ*SINAL - VRPX*COSAL
      V(4,2) = -VRPX*SINAL - VRPZ*COSAL
      V(4,3) = VRPY + VPD
      GO TO 7
 200    BONDRY(1,1) = 0.0
      BONDRY(1,2) = 1.0
      BONDRY(2,1) = 0.0
      BONDRY(2,2) = 1.0
      BONDRY(3,1) = 0.0
      BONDRY(3,2) = 1.0
      GO TO 400
 300    BONDRY(3,1) = (VRPTZ + FDIS)/(VRPTZ + BDIS)
      BONDRY(3,2) = 1.0
 400    CONTINUE
      CALL GMULT (MXFORM, C, TXFORM, 4, 4, 4)
      CALL GINV (TXFORM, RXFORM, SING)
      RETURN
      END
      SUBROUTINE G2VIEW

      COMMON/TRX/BONDRY,RXFORM,SING,TXFORM
      REAL BONDRY(3,2),RXFORM(4,4),TXFORM(4,4)
      LOGICAL SING
      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      REAL VRPX, VRPY, VRPZ, VPD, TEMP
      EQUIVALENCE (VRPX, VEWREF(1)), (VRPY, VEWREF(2)),
     *  (VRPZ, VEWREF(3)), (VPD, VEWDIS)
      CALL GIDENT (TXFORM, 4)
      TEMP = VRPZ + VPD
      TXFORM(4,1) = -VRPX
      TXFORM(4,2) = -VRPY
      TXFORM(4,3) = -TEMP
      BONDRY(1,1) = WINDOW(1,1)
      BONDRY(1,2) = WINDOW(1,2)
      BONDRY(2,1) = WINDOW(2,1)
      BONDRY(2,2) = WINDOW(2,2)
      BONDRY(3,1) = 0.0
      BONDRY(3,2) = 0.0
      CALL GINV (TXFORM, RXFORM, SING)
      RETURN
      END
       SUBROUTINE GMULT (A,B,C,M,IP,N)
       INTEGER M,N,IP
       REAL A(M,IP),B(IP,N),C(M,N)
      DO 50 I=1,M
        DO 40 J=1,N
          S = 0.0
          DO 30 K=1,IP
            S = S + A(I,K) * B(K,J)
30        CONTINUE
          C(I,J) = S
40       CONTINUE
50    CONTINUE
      RETURN
      END
      SUBROUTINE GIDENT (A,M)
      REAL A(M,M)
      DO 20 I=1,M
        DO 10 J=1,M
      A(I,J) = 1.0 * ((I/J) * (J/I))
10      CONTINUE
20    CONTINUE
      RETURN
      END
      SUBROUTINE GCVNDC

      COMMON/TRX/BONDRY,RXFORM,SING,TXFORM
      REAL BONDRY(3,2),RXFORM(4,4),TXFORM(4,4)
      LOGICAL SING
      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      COMMON/ATR/LWIDT,LWMAX,LSTYL,LSMAX,PEN,PENMAX,FONT,FONMAX,
     1     CHSIZ,CHSPC,CHPREC,CHPLN,PIKID,PIKMAX,CHPATH,CHJUST,
     2     MRKR,MRKMAX,CHARUP,CURPOS,BGDNDX,BGDCOL,BGDINT,
     3     LINNDX,LINCOL,LININT,FILNDX,FILCOL,FILINT,TEXNDX,
     4     TEXCOL,TEXINT,NDXMAX,PINTR,PEDGE,COLMOD
      INTEGER LSTYL,LSMAX,PEN,PENMAX,FONT,FONMAX,CHPREC,PIKID,
     1     PIKMAX,CHPATH,CHJUST(2),MRKR,MRKMAX,BGDNDX,LINNDX,
     2     FILNDX,TEXNDX,NDXMAX,PINTR,PEDGE,COLMOD
      REAL LWIDT,LWMAX,CHSIZ(2),CHSPC,CHPLN(3),CHARUP(3),CURPOS(4),
     1     BGDCOL(3),BGDINT,LINCOL(3),LININT,FILCOL(3),FILINT,
     2     TEXCOL(3),TEXINT
      COMMON/OPC/PMARK3,PMARK2,PLIN3,PLIN2,POLY3,POLY2,TEXT,MOVE,
     1     IMTRAN,HGHLTG,VSIBLE,DTECT,NWFRM,DELETS,DELETA,IMMEDV,
     2     PICCUR,BGNBAT,ENDBAT,CRSEG,CTSEG,CLOSRS,CLOSTS,RENAMS,
     3     INITDD,TERMDD,INTIZE,TRM,SNDC,INQDVC,COLR,BGCOLR,TENSTY,
     4     BGINTY,SNDX,BGINDX,COLNDX,INTNDX,IQCNDX,IQINDX,
     5     LNSTYL,ILNSTL,LNWITH,PENS,IDENSE,CHFONT,CHARSZ,CHARSP,
     6     STRROT,CHARPH,CHARJT,CHAREX,MRKSYM,PICK,ALLATR,POLEDG,
     7     POLINT,PIXCOL,PIXINT,PIXNDX,WRSCOL,WRSINT,WRSNDX,RRSCOL,
     8     RRSINT,RRSNDX,ESCAP,IESCAP,AMODE,OUTUNT
      INTEGER PMARK3,PMARK2,PLIN3,PLIN2,POLY3,POLY2,TEXT,MOVE,
     1     IMTRAN,HGHLTG,VSIBLE,DTECT,NWFRM,DELETS,DELETA,IMMEDV,
     2     PICCUR,BGNBAT,ENDBAT,CRSEG,CTSEG,CLOSRS,CLOSTS,RENAMS,
     3     INITDD,TERMDD,INTIZE,TRM,SNDC,INQDVC,COLR,BGCOLR,TENSTY,
     4     BGINTY,SNDX,BGINDX,COLNDX,INTNDX,IQCNDX,IQINDX,
     5     LNSTYL,ILNSTL,LNWITH,PENS,IDENSE,CHFONT,CHARSZ,CHARSP,
     6     STRROT,CHARPH,CHARJT,CHAREX,MRKSYM,PICK,ALLATR,POLEDG,
     7     POLINT,PIXCOL,PIXINT,PIXNDX,WRSCOL,WRSINT,WRSNDX,RRSCOL,
     8     RRSINT,RRSNDX,ESCAP,IESCAP,AMODE,OUTUNT
        COMMON /PAR/ PARRAY,MAXARY
        INTEGER*4 PARRAY(5000),MAXARY
      INTEGER PARLEL, LEFT, MRKCNT
      REAL P, Q
      INTEGER K, M
      INTEGER*4 CPARAY(5000), TPARAY(5000)
      REAL RARRAY(5000), CRARAY(5000), TRARAY(5000)
      EQUIVALENCE (PARRAY, CPARAY), (PARRAY, TPARAY)
      EQUIVALENCE (PARRAY, RARRAY), (CPARAY, CRARAY),
     *            (TPARAY, TRARAY)
      REAL ARRAY(4), P1(4), P2(4), Q1(4), Q2(4)
      REAL TEMPCP(4)
      INTEGER OP
      REAL NDCPT1(3), NDCPT2(3)
      LOGICAL IMAGE, IN, TRULIN(1500)
      DATA LEFT /2/
      DATA PARLEL /1/
      IMAGE = .FALSE.
      OP = PARRAY(2)
      ARRAY(1) = RARRAY(5)
      ARRAY(2) = RARRAY(6)
      ARRAY(3) = RARRAY(7)
      ARRAY(4) = 1.0
      IF (PJTYP.EQ.PARLEL) GO TO 50
      P = 1./(1.-BONDRY(3,1))
      Q = BONDRY(3,1)/(1.-BONDRY(3,1))
 50     CONTINUE
      DO 100 I = 1,4
         TEMPCP(I) = CURPOS(I)
 100    CONTINUE
      IF (CRDSYS.EQ.LEFT) TEMPCP(3) = -TEMPCP(3)
      IF (CRDSYS.EQ.LEFT) ARRAY(3) = -ARRAY(3)
      IF ((OP.EQ.PLIN2).OR.(OP.EQ.PLIN3)) GO TO 200
      IF (PARRAY(4).NE.3) GO TO 400
      CALL GMULT (ARRAY,TXFORM,P1,1,4,4)
      IF (.NOT.(WCLIP.OR.FCLIP.OR.BCLIP)) GO TO 110
      CRARAY(5) = P1(1)
      CRARAY(6) = P1(2)
      CRARAY(7) = P1(3)
      CALL GCPGEN (BONDRY, IN, TRULIN, IMAGE)
      IF (.NOT.IN) RETURN
      Q1(1) = CRARAY(5)
      Q1(2) = CRARAY(6)
      Q1(3) = CRARAY(7)
      GO TO 120
110   DO 115 I=1,4
        Q1(I) = P1(I)
115   CONTINUE
120   IF (PJTYP.EQ.PARLEL) GO TO 130
      Q1(4) = Q1(3)
      Q1(3) = Q1(3)*P - Q
      CALL GNDC (Q1(1)/Q1(4),Q1(2)/Q1(4),Q1(3)/Q1(4),NDCPT1)
      GO TO 140
130   CALL GNDC (Q1(1),Q1(2),Q1(3),NDCPT1)
140   TRARAY(5) = NDCPT1(1)
      TRARAY(6) = NDCPT1(2)
      TRARAY(7) = NDCPT1(3)
      CALL GSEND
      RETURN
 200  CONTINUE
      CALL GMULT (TEMPCP,TXFORM,P1,1,4,4)
      CALL GMULT (ARRAY,TXFORM,P2,1,4,4)
      IF (.NOT.(WCLIP.OR.FCLIP.OR.BCLIP)) GO TO 210
      CRARAY(5) = P1(1)
      CRARAY(6) = P1(2)
      CRARAY(7) = P1(3)
      CRARAY(8) = P2(1)
      CRARAY(9) = P2(2)
      CRARAY(10) = P2(3)
      CALL GCPGEN (BONDRY, IN, TRULIN, IMAGE)
      IF (.NOT.IN) RETURN
      Q1(1) = CRARAY(5)
      Q1(2) = CRARAY(6)
      Q1(3) = CRARAY(7)
      Q2(1) = CRARAY(8)
      Q2(2) = CRARAY(9)
      Q2(3) = CRARAY(10)
      GO TO 220
210   DO 215 I=1,4
        Q1(I) = P1(I)
        Q2(I) = P2(I)
215   CONTINUE
220   IF (PJTYP.EQ.PARLEL) GO TO 230
      Q1(4) = Q1(3)
      Q1(3) = Q1(3)*P - Q
      Q2(4) = Q2(3)
      Q2(3) = Q2(3)*P - Q

      CALL GNDC (Q1(1)/Q1(4),Q1(2)/Q1(4),Q1(3)/Q1(4),NDCPT1)
      CALL GNDC (Q2(1)/Q2(4),Q2(2)/Q2(4),Q2(3)/Q2(4),NDCPT2)
      GO TO 240
230   CALL GNDC (Q1(1),Q1(2),Q1(3),NDCPT1)
      CALL GNDC (Q2(1),Q2(2),Q2(3),NDCPT2)
240    TRARAY(5) = NDCPT1(1)
       TRARAY(6) = NDCPT1(2)
       TRARAY(7) = NDCPT1(3)
       TRARAY(8) = NDCPT2(1)
       TRARAY(9) = NDCPT2(2)
       TRARAY(10) = NDCPT2(3)
      TPARAY(1) = 10
      TPARAY(4) = 6
      CALL GSEND
      RETURN
 400  CONTINUE
      MRKCNT = PARRAY(4) / 3
      K = 5
      DO 410 I = 1,MRKCNT
         ARRAY(1) = RARRAY(K)
         ARRAY(2) = RARRAY(K+1)
         ARRAY(3) = RARRAY(K+2)
       ARRAY(4) = 1.0
         IF (CRDSYS.EQ.LEFT) ARRAY(3) = -ARRAY(3)
         CALL GMULT (ARRAY, TXFORM, P1, 1, 4, 4)
         CRARAY(K) = P1(1)
         CRARAY(K+1) = P1(2)
         CRARAY(K+2) = P1(3)
         K = K + 3
 410  CONTINUE
      IF (.NOT.(WCLIP.OR.FCLIP.OR.BCLIP)) GO TO 450
      CALL GCPGEN (BONDRY, IN, TRULIN, IMAGE)
 412  CONTINUE
      K = 5
      M = 5
      DO 430 I = 1,MRKCNT
         IF (.NOT.TRULIN(I)) GO TO 425
         ARRAY(1) = CRARAY(K)
         ARRAY(2) = CRARAY(K+1)
         ARRAY(3) = CRARAY(K+2)
      IF (PJTYP.EQ.PARLEL) GO TO 415
      ARRAY(4) = ARRAY(3)
      ARRAY(3) = ARRAY(3)*P - Q
      CALL GNDC (ARRAY(1)/ARRAY(4), ARRAY(2)/ARRAY(4),
     *           ARRAY(3)/ARRAY(4), NDCPT1)
      GO TO 420
 415  CONTINUE
      CALL GNDC (ARRAY(1), ARRAY(2), ARRAY(3), NDCPT1)
 420  CONTINUE
      TRARAY(M) = NDCPT1(1)
      TRARAY(M+1) = NDCPT1(2)
      TRARAY(M+2) = NDCPT1(3)
      M = M + 3
 425  CONTINUE
      K = K + 3
 430  CONTINUE
      TPARAY(1) = M - 1
      TPARAY(4) = M - 5
      CALL GSEND
      RETURN
 450  CONTINUE
      DO 460 I = 1,MRKCNT
         TRULIN(I) = .TRUE.
 460  CONTINUE
      GO TO 412
      END
      SUBROUTINE GCPGEN (BOUNDS, INOUT, TRULIN, IMAGE)
      COMMON/OPC/PMARK3,PMARK2,PLIN3,PLIN2,POLY3,POLY2,TEXT,MOVE,
     1     IMTRAN,HGHLTG,VSIBLE,DTECT,NWFRM,DELETS,DELETA,IMMEDV,
     2     PICCUR,BGNBAT,ENDBAT,CRSEG,CTSEG,CLOSRS,CLOSTS,RENAMS,
     3     INITDD,TERMDD,INTIZE,TRM,SNDC,INQDVC,COLR,BGCOLR,TENSTY,
     4     BGINTY,SNDX,BGINDX,COLNDX,INTNDX,IQCNDX,IQINDX,
     5     LNSTYL,ILNSTL,LNWITH,PENS,IDENSE,CHFONT,CHARSZ,CHARSP,
     6     STRROT,CHARPH,CHARJT,CHAREX,MRKSYM,PICK,ALLATR,POLEDG,
     7     POLINT,PIXCOL,PIXINT,PIXNDX,WRSCOL,WRSINT,WRSNDX,RRSCOL,
     8     RRSINT,RRSNDX,ESCAP,IESCAP,AMODE,OUTUNT
      INTEGER PMARK3,PMARK2,PLIN3,PLIN2,POLY3,POLY2,TEXT,MOVE,
     1     IMTRAN,HGHLTG,VSIBLE,DTECT,NWFRM,DELETS,DELETA,IMMEDV,
     2     PICCUR,BGNBAT,ENDBAT,CRSEG,CTSEG,CLOSRS,CLOSTS,RENAMS,
     3     INITDD,TERMDD,INTIZE,TRM,SNDC,INQDVC,COLR,BGCOLR,TENSTY,
     4     BGINTY,SNDX,BGINDX,COLNDX,INTNDX,IQCNDX,IQINDX,
     5     LNSTYL,ILNSTL,LNWITH,PENS,IDENSE,CHFONT,CHARSZ,CHARSP,
     6     STRROT,CHARPH,CHARJT,CHAREX,MRKSYM,PICK,ALLATR,POLEDG,
     7     POLINT,PIXCOL,PIXINT,PIXNDX,WRSCOL,WRSINT,WRSNDX,RRSCOL,
     8     RRSINT,RRSNDX,ESCAP,IESCAP,AMODE,OUTUNT
      COMMON /PAR/ PARRAY,MAXARY
      INTEGER*4 PARRAY(5000),MAXARY
      INTEGER IOPRAY(5000)
      EQUIVALENCE (PARRAY, IOPRAY)
      REAL BOUNDS(3,2), IORRAY(5000)
      EQUIVALENCE (IOPRAY, IORRAY)
      LOGICAL INOUT, TRULIN(1500)
      INTEGER OP, MRKCNT, ITYPE
      INTEGER K
      REAL P1(3), P2(3), Q1(3), Q2(3)
      OP = IOPRAY(2)
      IF ((OP.EQ.MOVE).OR.(OP.EQ.PMARK2).OR.(OP.EQ.PMARK3))
     *   GO TO 100
      IF ((OP.EQ.PLIN2).OR.(OP.EQ.PLIN3)) GO TO 200
      IF ((OP.EQ.POLY2).OR.(OP.EQ.POLY3)) GO TO 300
 100  CONTINUE
      IF (IOPRAY(4).NE.3) GO TO 500
      ITYPE = 1
      P1(1) = IORRAY(5)
      P1(2) = IORRAY(6)
      P1(3) = IORRAY(7)
      CALL GCLIP (P1, P2, Q1, Q2, ITYPE, INOUT, BOUNDS, IMAGE)
      IORRAY(5) = Q1(1)
      IORRAY(6) = Q1(2)
      IORRAY(7) = Q1(3)
      RETURN
 200  CONTINUE
      ITYPE = 2
      P1(1) = IORRAY(5)
      P1(2) = IORRAY(6)
      P1(3) = IORRAY(7)
      P2(1) = IORRAY(8)
      P2(2) = IORRAY(9)
      P2(3) = IORRAY(10)
      CALL GCLIP (P1, P2, Q1, Q2, ITYPE, INOUT, BOUNDS, IMAGE)
      IORRAY(5) = Q1(1)
      IORRAY(6) = Q1(2)
      IORRAY(7) = Q1(3)
      IORRAY(8) = Q2(1)
      IORRAY(9) = Q2(2)
      IORRAY(10) = Q2(3)
      RETURN
 300  CONTINUE
      CALL GPYCLP (BOUNDS, INOUT, TRULIN, IMAGE)
      RETURN
 500  CONTINUE
      MRKCNT = IOPRAY(4) / 3
      DO 510 I = 1,MRKCNT
         TRULIN(I) = .TRUE.
 510  CONTINUE
      K = 5
      ITYPE = 1
      DO 550 I = 1,MRKCNT
         P1(1) = IORRAY(K)
         P1(2) = IORRAY(K+1)
         P1(3) = IORRAY(K+2)
         CALL GCLIP (P1, P2, Q1, Q2, ITYPE, INOUT, BOUNDS, IMAGE)
         IF (.NOT.INOUT) TRULIN(I) = .FALSE.
         IORRAY(K) = Q1(1)
         IORRAY(K+1) = Q1(2)
         IORRAY(K+2) = Q1(3)
         K = K + 3
 550  CONTINUE
      RETURN
      END
      SUBROUTINE GCLIP (P1,P2,Q1,Q2,ITYPE,IN, BOUNDS, IMAGE)

      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3

      LOGICAL IN,ZERO1,ZERO2
      REAL P1(3), P2(3), Q1(3), Q2(3)
      INTEGER N1, N2, ICODE1(3,2), ICODE2(3,2)
      INTEGER ITYPE
      REAL BOUNDS(3,2)
      LOGICAL IMAGE
      N1 = 0
      N2 = 0
      IF (WCLIP) N1 = 1
      IF (FCLIP) N2 = 2
      IF (BCLIP) N2 = 3
      IF (FCLIP.AND.BCLIP) N2 = 5
      CALL GTSTIN (P1,ICODE1,N1,N2,ZERO1,BOUNDS,IMAGE)
      IF (ITYPE.NE.1) GO TO 50
      IN = ZERO1
      IF (.NOT.IN) RETURN
      DO 30 I=1,3
        Q1(I) = P1(I)
30    CONTINUE
      RETURN
 50   CALL GTSTIN (P2,ICODE2,N1,N2,ZERO2,BOUNDS,IMAGE)
      IF (.NOT.ZERO1.OR..NOT.ZERO2) GO TO 70
      IN = .TRUE.
      DO 60 I=1,3
        Q1(I) = P1(I)
        Q2(I) = P2(I)
60    CONTINUE
      RETURN
 70    IF (.NOT.ZERO1 .AND. .NOT.ZERO2) THEN
          IN = .FALSE.
          RETURN
       END IF
      IF (.NOT.ZERO1) THEN
         CALL GINSEC (P1,P2,Q1,ICODE1,N1,N2,IN,BOUNDS,IMAGE)
         DO 80 I=1,3
            Q2(I) = P2(I)
 80      CONTINUE
         IN = .TRUE.
         RETURN
      END IF
      IF (.NOT.ZERO2) THEN
         CALL GINSEC (P2,P1,Q2,ICODE2,N1,N2,IN,BOUNDS,IMAGE)
         DO 90 I=1,3
            Q1(I) = P1(I)
 90      CONTINUE
         IN = .TRUE.
         RETURN
      END IF
      END
      SUBROUTINE GTSTIN (P,ICODE,N1,N2,ZERO,BOUNDS,IMAGE)

      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      COMMON/TRX/BONDRY,RXFORM,SING,TXFORM
      REAL BONDRY(3,2),RXFORM(4,4),TXFORM(4,4)
      LOGICAL SING
      REAL P(3),EPS1, EPS2, EPS3, TEMP
      INTEGER ICODE(3,2), N1, N2
      INTEGER PARLEL
        LOGICAL ZERO, IMAGE
        REAL BOUNDS(3,2)
      DATA PARLEL /1/
        IF (IMAGE) GO TO 5
      IF (PJTYP.EQ.PARLEL) GO TO 3
      BOUNDS(1,1) = -ABS (P(3))
      BOUNDS(1,2) = ABS (P(3))
      BOUNDS(2,1) = -ABS (P(3))
      BOUNDS(2,2) = ABS (P(3))
      BOUNDS(3,1) = BONDRY(3,1)
      BOUNDS(3,2) = BONDRY(3,2)
      GO TO 5
 3      CONTINUE
        DO 2 I = 1,3
           DO 1 J = 1,2
              BOUNDS(I,J) = BONDRY(I,J)
 1         CONTINUE
 2      CONTINUE
 5      CONTINUE
      IF (IMAGE) GO TO 6
      TEMP = 10000.0
      EPS1 = ABS(BOUNDS(1,2)-BOUNDS(1,1))/10000.0
      EPS2 = ABS(BOUNDS(2,2)-BOUNDS(2,1))/10000.0
      IF (.NOT.FDSET .OR. .NOT.BDSET) TEMP = 1.0E10
      EPS3 = ABS(BOUNDS(3,2)-BOUNDS(3,1))/TEMP
      GO TO 7
 6      CONTINUE
      EPS1 = 0.001
      EPS2 = 0.001
      EPS3 = 0.001
 7      CONTINUE
      DO 20 I=1,3
        DO 10 J=1,2
          ICODE(I,J) = 0
10      CONTINUE
20    CONTINUE
      IF (N1.EQ.0) GO TO 50
40    IF ((P(1)+EPS1).LT.BOUNDS(1,1)) ICODE(1,1) = 1
      IF ((P(1)-EPS1).GT.BOUNDS(1,2)) ICODE(1,2) = 1
      IF ((P(2)+EPS2).LT.BOUNDS(2,1)) ICODE(2,1) = 1
      IF ((P(2)-EPS2).GT.BOUNDS(2,2)) ICODE(2,2) = 1
50    IF (N2.EQ.0) GO TO 100
      IF (N2.NE.2 .AND. N2.NE.5) GO TO 60
      IF ((P(3)+EPS3).LT.BOUNDS(3,1)) ICODE(3,1) = 1
 60     IF (N2.NE.3 .AND. N2.NE.5) GO TO 100
      IF ((P(3)-EPS3).GT.BOUNDS(3,2)) ICODE(3,2) = 1
100   ZERO = .TRUE.
      DO 150 I=1,3
        DO 140 J=1,2
        IF (ICODE(I,J).EQ.0) GO TO 140
        ZERO = .FALSE.
        RETURN
140     CONTINUE
150   CONTINUE
      RETURN
      END
      SUBROUTINE GINSEC (P1, P2, Q, ICODE, N1, N2, IN, BOUNDS, IMAGE)

      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      COMMON/TRX/BONDRY,RXFORM,SING,TXFORM
      REAL BONDRY(3,2),RXFORM(4,4),TXFORM(4,4)
      LOGICAL SING
      REAL P1(3), P2(3), Q(3), T
      INTEGER ICODE(3,2), JCODE(3,2), PERSP, N1, N2
      LOGICAL IN, ZERO, IMAGE
        REAL BOUNDS(3,2)
      DATA PERSP /2/
      IN = .FALSE.
      DO 10 I = 1,3
         DO 20 J = 1,2
            JCODE(I,J) = ICODE(I,J)
 20        CONTINUE
 10     CONTINUE
        IF (IMAGE) GO TO 25
        DO 16 I = 1,3
           DO 15 J = 1,2
              BOUNDS(I,J) = BONDRY(I,J)
 15        CONTINUE
 16     CONTINUE
      IF (PJTYP.EQ.PERSP) GO TO 200
 25     CONTINUE
      DO 100 I = 1,3
         DO 90 J = 1,2
            IF (JCODE(I,J).EQ.0) GO TO 90
              IF (I.EQ.3) GO TO 30
              M = 3
              K = 3 - I
              GO TO 40
 30           M = 1
              K = 2
 40           T = (BOUNDS(I,J)-P1(I)) / (P2(I)-P1(I))
              Q(M) = T * (P2(M)-P1(M)) + P1(M)
              Q(I) = BOUNDS(I,J)
              Q(K) = T * (P2(K)-P1(K)) + P1(K)
              CALL GTSTIN (Q, JCODE, N1, N2, ZERO, BOUNDS, IMAGE)
              IF (.NOT.ZERO) GO TO 90
              IN = .TRUE.
              RETURN
 90        CONTINUE
 100    CONTINUE
        RETURN
 200    CONTINUE
      DO 250 I = 1,2
         IF (JCODE(I,2).EQ.0) GO TO 250
           T = (P1(3)-P1(I)) / ((P1(3)-P1(I))-(P2(3)-P2(I)))
           K = 3 - I
           Q(K) = T * (P2(K)-P1(K)) + P1(K)
           Q(I) = T * (P2(I)-P1(I)) + P1(I)
           Q(3) = BOUNDS(I,2)
           CALL GTSTIN (Q, JCODE, N1, N2, ZERO, BOUNDS, IMAGE)
           IF (.NOT.ZERO) GO TO 250
           IN = .TRUE.
           RETURN
 250    CONTINUE
      DO 300 I = 1,2
           IF (JCODE(I,1).EQ.0) GO TO 300
           T = (P1(3)+P1(I)) / ((P1(I)-P2(I))+(P1(3)-P2(3)))
           K = 3 - I
           Q(K) = T * (P2(K)-P1(K)) + P1(K)
           Q(I) = T * (P2(I)-P1(I)) + P1(I)
           Q(3) = BOUNDS(I,1)
           CALL GTSTIN (Q, JCODE, N1, N2, ZERO, BOUNDS, IMAGE)
           IF (.NOT.ZERO) GO TO 300
           IN = .TRUE.
           RETURN
 300    CONTINUE
      DO 350 I = 1,2
           IF (JCODE(3,I).EQ.0) GO TO 350
           T = (BOUNDS(3,I)-P1(3)) / (P2(3)-P1(3))
           K = 3 - I
           Q(K) = T * (P2(K)-P1(K)) + P1(K)
           Q(I) = T * (P2(I)-P1(I)) + P1(I)
           Q(3) = BOUNDS(3,I)
           CALL GTSTIN (Q, JCODE, N1, N2, ZERO, BOUNDS, IMAGE)
           IF (.NOT.ZERO) GO TO 350
           IN = .TRUE.
           RETURN
 350    CONTINUE
        RETURN
        END
      SUBROUTINE GNDC (X,Y,Z,NDCPT)

      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      INTEGER PERSP
      REAL NDCPT(3)
      REAL UMIN, UMAX, VMIN, VMAX, XN, YN, ZN
      EQUIVALENCE (UMIN, WINDOW(1,1)), (UMAX, WINDOW(1,2))
      EQUIVALENCE (VMIN, WINDOW(2,1)), (VMAX, WINDOW(2,2))
      DATA PERSP /2/
      IF (VEWTYP) GO TO 100
      XN = VEWPRT(1,1) + (X-UMIN) * (VEWPRT(1,2) - VEWPRT(1,1)) /
     *       (UMAX - UMIN)
      YN = VEWPRT(2,1) + (Y-VMIN) * (VEWPRT(2,2) - VEWPRT(2,1)) /
     *       (VMAX - VMIN)
      ZN = Z
      GO TO 300
 100    CONTINUE
      IF (PJTYP.EQ.PERSP) GO TO 200
      XN = VEWPRT(1,1) + X * (VEWPRT(1,2) - VEWPRT(1,1))
      YN = VEWPRT(2,1) + Y * (VEWPRT(2,2) - VEWPRT(2,1))
      ZN = VEWPRT(3,1) + Z * (VEWPRT(3,2) - VEWPRT(3,1))
      GO TO 300
 200    CONTINUE
      XN = VEWPRT(1,1) + (X+1.) * 0.5 * (VEWPRT(1,2) - VEWPRT(1,1))
      YN = VEWPRT(2,1) + (Y+1.) * 0.5 * (VEWPRT(2,2) - VEWPRT(2,1))
      ZN = VEWPRT(3,1) + Z * (VEWPRT(3,2) - VEWPRT(3,1))
 300    CONTINUE
        NDCPT(1) = XN
        NDCPT(2) = YN
        NDCPT(3) = ZN
      RETURN
        END
      SUBROUTINE GWORLD (NDCPT,WORPOS)

      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      COMMON/TRX/BONDRY,RXFORM,SING,TXFORM
      REAL BONDRY(3,2),RXFORM(4,4),TXFORM(4,4)
      LOGICAL SING
      REAL NDCPT(3), WORPOS(3)
      REAL XN, YN, ZN, XP, YP, ZP, X, Y, Z, TEMP(3)
      REAL UMIN, UMAX, VMIN, VMAX
      INTEGER PERSP
      EQUIVALENCE (WINDOW(1,1), UMIN), (WINDOW(1,2), UMAX)
      EQUIVALENCE (WINDOW(2,1), VMIN), (WINDOW(2,2), VMAX)
      DATA PERSP /2/
      IF (VEWTYP) GO TO 100
      XN = UMIN + (NDCPT(1) - VEWPRT(1,1)) * (UMAX - UMIN)
     *     / (VEWPRT(1,2) - VEWPRT(1,1))
      YN = VMIN + (NDCPT(2) - VEWPRT(2,1)) * (VMAX - VMIN)
     *     / (VEWPRT(2,2) - VEWPRT(2,1))
      X = XN * RXFORM(1,1) + YN * RXFORM(2,1) + RXFORM(4,1)
      Y = XN * RXFORM(1,2) + YN * RXFORM(2,2) + RXFORM(4,2)
      Z = 0.0
      GO TO 300
 100  CONTINUE
      IF (PJTYP.EQ.PERSP) GO TO 200
      N = 3
      IF (VEWPRT(3,1).NE.VEWPRT(3,2)) GO TO 120
      N = 2
      TEMP(3) = 0.0
 120  CONTINUE
      DO 150 I = 1,N
         TEMP(I) = (NDCPT(I) - VEWPRT(I,1)) /
     *             (VEWPRT(I,2) - VEWPRT(I,1))
 150  CONTINUE
      XN = TEMP(1)
      YN = TEMP(2)
      ZN = TEMP(3)
      X = XN * RXFORM(1,1) + YN * RXFORM(2,1) + ZN * RXFORM(3,1)
     *    + RXFORM(4,1)
      Y = XN * RXFORM(1,2) + YN * RXFORM(2,2) + ZN * RXFORM(3,2)
     *    + RXFORM(4,2)
      Z = XN * RXFORM(1,3) + YN * RXFORM(2,3) + ZN * RXFORM(3,3)
     *    + RXFORM(4,3)
      GO TO 300
 200  CONTINUE
      XN = -1. + (NDCPT(1) - VEWPRT(1,1)) * 2. /
     *           (VEWPRT(1,2) - VEWPRT(1,1))
      YN = -1. + (NDCPT(2) - VEWPRT(2,1)) * 2. /
     *           (VEWPRT(2,2) - VEWPRT(2,1))
      IF (VEWPRT(3,1).NE.VEWPRT(3,2)) GO TO 220
      ZN = 0.0
      GO TO 250
 220  ZN = (NDCPT(3) - VEWPRT(3,1)) / (VEWPRT(3,2) - VEWPRT(3,1))
 250  CONTINUE
      ZP = BONDRY(3,1) / (1. - ZN * (1. - BONDRY(3,1)))
      XP = XN * ZP
      YP = YN * ZP
      X = XP * RXFORM(1,1) + YP * RXFORM(2,1) + ZP * RXFORM(3,1)
     *    + RXFORM(4,1)
      Y = XP * RXFORM(1,2) + YP * RXFORM(2,2) + ZP * RXFORM(3,2)
     *    + RXFORM(4,2)
      Z = XP * RXFORM(1,3) + YP * RXFORM(2,3) + ZP * RXFORM(3,3)
     *    + RXFORM(4,3)
 300  CONTINUE
      WORPOS(1) = X
      WORPOS(2) = Y
      WORPOS(3) = Z
      RETURN
      END
      SUBROUTINE GPLNDC
      COMMON/TRX/BONDRY,RXFORM,SING,TXFORM
      REAL BONDRY(3,2),RXFORM(4,4),TXFORM(4,4)
      LOGICAL SING
      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      COMMON /PAR/ PARRAY,MAXARY
      INTEGER*4 PARRAY(5000),MAXARY
      COMMON/OPC/PMARK3,PMARK2,PLIN3,PLIN2,POLY3,POLY2,TEXT,MOVE,
     1     IMTRAN,HGHLTG,VSIBLE,DTECT,NWFRM,DELETS,DELETA,IMMEDV,
     2     PICCUR,BGNBAT,ENDBAT,CRSEG,CTSEG,CLOSRS,CLOSTS,RENAMS,
     3     INITDD,TERMDD,INTIZE,TRM,SNDC,INQDVC,COLR,BGCOLR,TENSTY,
     4     BGINTY,SNDX,BGINDX,COLNDX,INTNDX,IQCNDX,IQINDX,
     5     LNSTYL,ILNSTL,LNWITH,PENS,IDENSE,CHFONT,CHARSZ,CHARSP,
     6     STRROT,CHARPH,CHARJT,CHAREX,MRKSYM,PICK,ALLATR,POLEDG,
     7     POLINT,PIXCOL,PIXINT,PIXNDX,WRSCOL,WRSINT,WRSNDX,RRSCOL,
     8     RRSINT,RRSNDX,ESCAP,IESCAP,AMODE,OUTUNT
      INTEGER PMARK3,PMARK2,PLIN3,PLIN2,POLY3,POLY2,TEXT,MOVE,
     1     IMTRAN,HGHLTG,VSIBLE,DTECT,NWFRM,DELETS,DELETA,IMMEDV,
     2     PICCUR,BGNBAT,ENDBAT,CRSEG,CTSEG,CLOSRS,CLOSTS,RENAMS,
     3     INITDD,TERMDD,INTIZE,TRM,SNDC,INQDVC,COLR,BGCOLR,TENSTY,
     4     BGINTY,SNDX,BGINDX,COLNDX,INTNDX,IQCNDX,IQINDX,
     5     LNSTYL,ILNSTL,LNWITH,PENS,IDENSE,CHFONT,CHARSZ,CHARSP,
     6     STRROT,CHARPH,CHARJT,CHAREX,MRKSYM,PICK,ALLATR,POLEDG,
     7     POLINT,PIXCOL,PIXINT,PIXNDX,WRSCOL,WRSINT,WRSNDX,RRSCOL,
     8     RRSINT,RRSNDX,ESCAP,IESCAP,AMODE,OUTUNT
      INTEGER*4 CPARAY(5000), TPARAY(5000)
      INTEGER*4 P1ARAY(5000)
      REAL R1ARAY(5000)
      EQUIVALENCE (P1ARAY, R1ARAY)
      EQUIVALENCE (PARRAY, CPARAY), (PARRAY, TPARAY)
      REAL RARRAY(5000), CRARAY(5000), TRARAY(5000)
      EQUIVALENCE (PARRAY, RARRAY), (CPARAY, CRARAY)
      EQUIVALENCE (TPARAY, TRARAY)
      REAL ARRAY(4), P1(4), P, Q, NDCPT(3)
      INTEGER K, IK
      INTEGER VERCNT, LEFT, PARLEL, OP
      INTEGER NLINES, LINENO, POINT
      LOGICAL BRKFLG
      LOGICAL PENDNG
      LOGICAL IN, IMAGE, TRULIN(1500)
      DATA LEFT /2/
      DATA PARLEL /1/
      IMAGE = .FALSE.
      OP = PARRAY(2)
      VERCNT = PARRAY(4)/3
      IF (PJTYP.EQ.PARLEL) GO TO 50
      P = 1./(1. - BONDRY(3,1))
      Q = BONDRY(3,1)/(1. - BONDRY(3,1))
 50   CONTINUE
      BRKFLG = .FALSE.
      K = 5
      DO 100 I = 1,VERCNT
         ARRAY(1) = RARRAY(K)
         ARRAY(2) = RARRAY(K+1)
         ARRAY(3) = RARRAY(K+2)
        ARRAY(4) = 1.0
         IF (CRDSYS.EQ.LEFT) ARRAY(3) = -ARRAY(3)
         CALL GMULT (ARRAY, TXFORM, P1, 1, 4, 4)
         CRARAY(K) = P1(1)
         CRARAY(K+1) = P1(2)
         CRARAY(K+2) = P1(3)
         K = K + 3
 100     CONTINUE
         IF (.NOT.(WCLIP.OR.FCLIP.OR.BCLIP)) GO TO 250
        IF ((OP.EQ.POLY2).OR.(OP.EQ.POLY3)) THEN
            CALL GCPGEN (BONDRY, IN, TRULIN, IMAGE)
        ELSE
           GO TO 1000
        END IF
         IF (.NOT.IN) RETURN
         VERCNT = PARRAY(4) / 3
 200     CONTINUE
      IF (VERCNT.LT.3) RETURN
 250       CONTINUE
         IF (PJTYP.EQ.PARLEL) GO TO 400
         K = 5
         DO 300 I = 1,VERCNT
            ARRAY(1) = CRARAY(K)
            ARRAY(2) = CRARAY(K+1)
            ARRAY(3) = CRARAY(K+2)
            ARRAY(4) = ARRAY(3)
            ARRAY(3) = ARRAY(3)*P - Q
            CALL GNDC (ARRAY(1)/ARRAY(4), ARRAY(2)/ARRAY(4),
     *                ARRAY(3)/ARRAY(4), NDCPT)
            TRARAY(K) = NDCPT(1)
            TRARAY(K+1) = NDCPT(2)
            TRARAY(K+2) = NDCPT(3)
            K = K + 3
 300     CONTINUE
         GO TO 600
 400     CONTINUE
         K = 5
         DO 500 I = 1,VERCNT
            ARRAY(1) = CRARAY(K)
            ARRAY(2) = CRARAY(K+1)
            ARRAY(3) = CRARAY(K+2)
            CALL GNDC (ARRAY(1), ARRAY(2), ARRAY(3), NDCPT)
            TRARAY(K) = NDCPT(1)
            TRARAY(K+1) = NDCPT(2)
            TRARAY(K+2) = NDCPT(3)
            K = K + 3
 500     CONTINUE
 600     CONTINUE
         TPARAY(1) = VERCNT*3 + 4
        TPARAY(4) = VERCNT*3
         CALL GSEND
       IF (.NOT.BRKFLG) RETURN
       IF (LINENO.EQ.NLINES) RETURN
       GO TO 1025
 1000       CONTINUE
       BRKFLG = .TRUE.
       DO 1010 I = 1,4
          P1ARAY(I) = PARRAY(I)
 1010       CONTINUE
       DO 1020 I = 5, PARRAY(1)
          R1ARAY(I) = RARRAY(I)
 1020       CONTINUE
       NLINES = (PARRAY(4)/3) - 1
        LINENO=0
        IK=5
 1025   CONTINUE
       PARRAY(1) = 10
       PARRAY(4) = 6
        VERCNT=1
        PENDNG=.FALSE.
        STARTP=IK
 1030       CONTINUE
       LINENO = LINENO + 1
       CRARAY(5) = R1ARAY(IK)
       CRARAY(6) = R1ARAY(IK+1)
       CRARAY(7) = R1ARAY(IK+2)
       CRARAY(8) = R1ARAY(IK+3)
       CRARAY(9) = R1ARAY(IK+4)
       CRARAY(10) = R1ARAY(IK+5)
       CALL GCPGEN (BONDRY, IN, TRULIN, IMAGE)
        IF (.NOT.IN)GO TO 1050
        PARRAY(1)=PARRAY(1)+3
        PARRAY(4)=PARRAY(4)+3
            R1ARAY(IK)=CRARAY(5)
            R1ARAY(IK+1)=CRARAY(6)
            R1ARAY(IK+2)=CRARAY(7)
        IF((CRARAY(8).NE.R1ARAY(IK+3)).OR.
     1     (CRARAY(9).NE.R1ARAY(IK+4)).OR.
     2     (CRARAY(10).NE.R1ARAY(IK+5)))THEN
               VERCNT=VERCNT+1
               SAVEX=CRARAY(8)
               SAVEY=CRARAY(9)
               SAVEZ=CRARAY(10)
               ENDP=IK+2
               POINT=5
               DO 1035 J=STARTP,ENDP
                   CRARAY(POINT)=R1ARAY(J)
                   POINT=POINT+1
 1035          CONTINUE
               CRARAY(POINT)=SAVEX
               POINT=POINT+1
               CRARAY(POINT)=SAVEY
               POINT=POINT+1
               CRARAY(POINT)=SAVEZ
               IK=IK+3
               GO TO 250
        ENDIF
        PENDNG=.TRUE.
        VERCNT=VERCNT+1
        IK=IK+3
        IF(LINENO.LT.NLINES) GO TO 1030
        ENDP=IK+5
        POINT=5
        DO 1040 J=STARTP,ENDP
            CRARAY(POINT)=R1ARAY(J)
            POINT=POINT+1
 1040   CONTINUE
        GO TO 250
 1050   IK=IK+3
        IF(PENDNG) GO TO 250
        IF(LINENO.LT.NLINES) GO TO 1030
          RETURN
         END
      SUBROUTINE GPYCLP (BOUNDS, INSIDE, TRULIN, IMAGE)
      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      COMMON/TRX/BONDRY,RXFORM,SING,TXFORM
      REAL BONDRY(3,2),RXFORM(4,4),TXFORM(4,4)
      LOGICAL SING
      COMMON /PAR/ PARRAY,MAXARY
      INTEGER*4 PARRAY(5000),MAXARY
       INTEGER MAX,MIN,X,Y,Z
       REAL ARRAY1(5000), RARRAY(5000)
       REAL CARRAY(5000),BOUNDS(3,2)
       INTEGER LEN,PARLEL,PROJ
       LOGICAL INSIDE,IMAGE,TRULIN(1500)
       EQUIVALENCE (PARRAY, RARRAY)
       DATA PARLEL /1/
       DATA MAX, MIN, X, Y, Z /1, 0, 0, 1, 2/
      IF (IMAGE) GO TO 20
      DO 15 I = 1,3
         DO 10 J = 1,2
            BOUNDS(I,J) = BONDRY(I,J)
 10      CONTINUE
 15   CONTINUE
      PROJ = PJTYP
      GO TO 30
 20   CONTINUE
      PROJ = PARLEL
 30   CONTINUE
      LEN = PARRAY(1)
      DO 35 I = 1,LEN
         CARRAY(I) = RARRAY(I)
 35   CONTINUE
       DO 40 I = 1,1500
         TRULIN(I) = .TRUE.
 40    CONTINUE
       CALL GCPBND(CARRAY,ARRAY1,LEN,PROJ,MAX,Y,TRULIN,BOUNDS(2,2))
       CALL GCPBND(ARRAY1,CARRAY,LEN,PROJ,MIN,Y,TRULIN,BOUNDS(2,1))
       CALL GCPBND(CARRAY,ARRAY1,LEN,PROJ,MAX,X,TRULIN,BOUNDS(1,2))
       CALL GCPBND(ARRAY1,CARRAY,LEN,PROJ,MIN,X,TRULIN,BOUNDS(1,1))
        IF(.NOT.(FCLIP.OR.BCLIP))GO TO 50
        IF(FCLIP.AND.BCLIP)THEN
          CALL GCPBND(CARRAY,ARRAY1,LEN,PROJ,MAX,Z,TRULIN,BOUNDS(3,2))
          CALL GCPBND(ARRAY1,CARRAY,LEN,PROJ,MIN,Z,TRULIN,BOUNDS(3,1))
          GO TO 50
        END IF
        IF(FCLIP)CALL GCPBND(CARRAY,ARRAY1,LEN,PROJ,MIN,Z,TRULIN,
     1                       BOUNDS(3,1))
        IF(BCLIP)CALL GCPBND(CARRAY,ARRAY1,LEN,PROJ,MAX,Z,TRULIN,
     1                       BOUNDS(3,2))
        DO 45 I = 1,LEN
           CARRAY(I) = ARRAY1(I)
 45     CONTINUE
 50    CONTINUE
       IF(LEN.GT.4)THEN
         INSIDE = .TRUE.
       ELSE
         INSIDE = .FALSE.
       END IF
       PARRAY(1) = LEN
       PARRAY(4) = LEN - 4
       DO 60 I = 5,LEN
          RARRAY(I) = CARRAY(I)
 60    CONTINUE
       RETURN
       END
      SUBROUTINE GCPBND (ARIN,AROUT,LEN,PROJ,MINMAX,VAR,TRULIN,PLN)
      COMMON /PAR/ PARRAY,MAXARY
      INTEGER*4 PARRAY(5000),MAXARY
       INTEGER FRSTIN,NEXPT,LASTIN,VAR,MINMAX,OP
       LOGICAL FRSTPT,TRULIN(1500)
       REAL ARIN(5000),AROUT(5000),T,PLN
       INTEGER PROJ,CURPT,VCNT,LEN,SIGN,PARLEL
       DATA PARLEL /1/
       FRSTPT = .TRUE.
       VCNT = 0
       NEXPT = 2
       IF(LEN.LE.4)THEN
         AROUT(1) = ARIN(1)
         AROUT(2) = ARIN(2)
         AROUT(3) = ARIN(3)
         AROUT(4) = ARIN(4)
         RETURN
       END IF
       DO 100 CURPT = 5,LEN,3
         IF(PROJ.EQ.PARLEL.OR.VAR.EQ.2)THEN
           IF(MINMAX.EQ.1)THEN
             IF(FRSTPT)THEN
               FRSTPT = .FALSE.
               IF(ARIN(CURPT+VAR).LE.PLN)THEN
                 LASTIN = 1
                 FRSTIN = 1
                 GO TO 40
               ELSE
                 LASTIN = 0
                 FRSTIN = 0
                 GO TO 100
               END IF
             END IF
             IF(ARIN(CURPT+VAR).GT.PLN.AND.LASTIN.EQ.1)GO TO 30
             IF(ARIN(VAR+CURPT).LE.PLN.AND.LASTIN.EQ.0)GO TO 30
             IF(ARIN(CURPT+VAR).LE.PLN.AND.LASTIN.EQ.1)GO TO 40
             GO TO 100
           ELSE
             IF(FRSTPT)THEN
               FRSTPT = .FALSE.
               IF(ARIN(CURPT+VAR).GE.PLN)THEN
                 LASTIN = 1
                 FRSTIN = 1
                 GO TO 40
               ELSE
                 LASTIN = 0
                 FRSTIN = 0
                 GO TO 100
               END IF
             END IF
             IF(ARIN(CURPT+VAR).LT.PLN.AND.LASTIN.EQ.1)GO TO 30
             IF(ARIN(CURPT+VAR).GE.PLN.AND.LASTIN.EQ.0)GO TO 30
             IF(ARIN(CURPT+VAR).GE.PLN.AND.LASTIN.EQ.1)GO TO 40
             GO TO 100
           END IF
       ELSE
         IF(MINMAX.EQ.1)THEN
           IF(FRSTPT)THEN
            FRSTPT = .FALSE.
          IF(ARIN(CURPT+VAR).LE.ABS(ARIN(CURPT+2)))THEN
              LASTIN = 1
              FRSTIN = 1
              GO TO 40
            ELSE
              LASTIN = 0
              FRSTIN = 0
              GO TO 100
            END IF
          END IF
        IF(ARIN(CURPT+VAR).GT.ABS(ARIN(CURPT+2)).AND.LASTIN.EQ.1)THEN
            GO TO 30
          END IF
        IF(ARIN(CURPT+VAR).LE.ABS(ARIN(CURPT+2)).AND.LASTIN.EQ.0)THEN
            GO TO 30
          END IF
        IF(ARIN(CURPT+VAR).LE.ABS(ARIN(CURPT+2)).AND.LASTIN.EQ.1)GOTO 40
          GO TO 100
         ELSE
           IF(FRSTPT)THEN
             FRSTPT = .FALSE.
           IF(ARIN(CURPT+VAR).GE.-ABS(ARIN(CURPT+2)))THEN
               LASTIN = 1
               FRSTIN = 1
               GO TO 40
             ELSE
               LASTIN = 0
               FRSTIN = 0
               GO TO 100
             END IF
           END IF
         IF(ARIN(CURPT+VAR).LT.-ABS(ARIN(CURPT+2)).AND.LASTIN.EQ.1)THEN
             GO TO 30
           END IF
         IF(ARIN(CURPT+VAR).GE.-ABS(ARIN(CURPT+2)).AND.LASTIN.EQ.0)THEN
             GO TO 30
           END IF
         IF(ARIN(CURPT+VAR).GE.-ABS(ARIN(CURPT+2)).AND.LASTIN.EQ.1)
     *       GO TO 40
           GO TO 100
         END IF
       END IF
 30    IF(PROJ.EQ.PARLEL.OR.VAR.EQ.2)THEN
         T = (PLN-ARIN(CURPT-3+VAR))/(ARIN(CURPT+VAR)-ARIN(CURPT-3+VAR))
       ELSE
         IF(MINMAX.EQ.1)THEN
           SIGN = 1
         ELSE
           SIGN = -1
         END IF
         T = (ARIN(CURPT-3+VAR)-SIGN*ARIN(CURPT-1))/(SIGN*(ARIN(CURPT+2)
     &      -ARIN(CURPT-1))-(ARIN(CURPT+VAR)-ARIN(CURPT-3+VAR)))
       END IF
       NEXPT = NEXPT + 3
       AROUT(NEXPT)=(ARIN(CURPT)-ARIN(CURPT-3))*T+ARIN(CURPT-3)
       AROUT(NEXPT+1)=(ARIN(CURPT+1)-ARIN(CURPT-2))*T+ARIN(CURPT-2)
       AROUT(NEXPT+2)=(ARIN(CURPT+2)-ARIN(CURPT-1))*T+ARIN(CURPT-1)
       VCNT = VCNT + 1
       TRULIN(VCNT) = .FALSE.
       IF(LASTIN.EQ.1)THEN
         LASTIN = 0
         GO TO 100
       ELSE
         LASTIN = 1
         GO TO 40
       END IF
 40    NEXPT = NEXPT + 3
       VCNT = VCNT + 1
       AROUT(NEXPT) = ARIN(CURPT)
       AROUT(NEXPT+1) = ARIN(CURPT+1)
       AROUT(NEXPT+2) = ARIN(CURPT+2)
 100   CONTINUE
      IF (VCNT.EQ.0) GO TO 200
      IF (FRSTIN.EQ.1) GO TO 200
      VCNT = VCNT + 1
      NEXPT = NEXPT + 3
      AROUT(NEXPT) = AROUT(5)
      AROUT(NEXPT+1) = AROUT(6)
      AROUT(NEXPT+2) = AROUT(7)
 200      CONTINUE
      LEN = VCNT*3 + 4
      AROUT(1) = LEN
      AROUT(4) = LEN - 4
      RETURN
      END
      SUBROUTINE GINV(MAT,MINV,SINGLE)
      REAL MAT(4,4), MINV(4,4), DET
      LOGICAL SINGLE
      DET = MAT(1,1)*(MAT(2,2)*MAT(3,3)-MAT(3,2)*MAT(2,3))
     1       -MAT(1,2)*(MAT(2,1)*MAT(3,3)-MAT(3,1)*MAT(2,3))
     2       +MAT(1,3)*(MAT(2,1)*MAT(3,2)-MAT(3,1)*MAT(2,2))

      IF (DET.EQ.0.0) THEN
            SINGLE=.TRUE.
            RETURN
      END IF
      MINV(1,1) = (MAT(2,2)*MAT(3,3)-MAT(3,2)*MAT(2,3))/DET
      MINV(2,1) = (MAT(3,1)*MAT(2,3)-MAT(2,1)*MAT(3,3))/DET
      MINV(3,1) = (MAT(2,1)*MAT(3,2)-MAT(3,1)*MAT(2,2))/DET
      MINV(4,1) = (MAT(2,2)*(MAT(3,1)*MAT(4,3)-MAT(4,1)*MAT(3,3))
     1             - MAT(2,1)*(MAT(3,2)*MAT(4,3)-MAT(4,2)*MAT(3,3))
     2             - MAT(2,3)*(MAT(3,1)*MAT(4,2)-MAT(4,1)*MAT(3,2)))/DET
      MINV(1,2) = (MAT(3,2)*MAT(1,3)-MAT(1,2)*MAT(3,3))/DET
      MINV(2,2) = (MAT(1,1)*MAT(3,3)-MAT(3,1)*MAT(1,3))/DET
      MINV(3,2) = (MAT(3,1)*MAT(1,2)-MAT(1,1)*MAT(3,2))/DET
      MINV(4,2) = (MAT(1,1)*(MAT(3,2)*MAT(4,3)-MAT(4,2)*MAT(3,3))
     1             - MAT(1,2)*(MAT(3,1)*MAT(4,3)-MAT(4,1)*MAT(3,3))
     2             + MAT(1,3)*(MAT(3,1)*MAT(4,2)-MAT(4,1)*MAT(3,2)))/DET
      MINV(1,3) = (MAT(1,2)*MAT(2,3)-MAT(2,2)*MAT(1,3))/DET
      MINV(2,3) = (MAT(2,1)*MAT(1,3)-MAT(1,1)*MAT(2,3))/DET
      MINV(3,3) = (MAT(1,1)*MAT(2,2)-MAT(2,1)*MAT(1,2))/DET
      MINV(4,3) = (MAT(1,2)*(MAT(2,1)*MAT(4,3)-MAT(4,1)*MAT(2,3))
     1             - MAT(1,1)*(MAT(2,2)*MAT(4,3)-MAT(4,2)*MAT(2,3))
     2             - MAT(1,3)*(MAT(2,1)*MAT(4,2)-MAT(4,1)*MAT(2,2)))/DET
      MINV(1,4) = 0.0
      MINV(2,4) = 0.0
      MINV(3,4) = 0.0
      MINV(4,4) = 1.0
      SINGLE = .FALSE.
      RETURN
      END
      SUBROUTINE GIMAGE
      COMMON /VEW/ NDCSPC, VEWPRT, WINDOW, VEWREF,
     1  VEWPLN, VEWUP, PJTYP, PJDIR, PJPNT, VEWDIS, FDIS,
     2  BDIS,MXFORM,NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSYS,
     3  CRDSET,VPRTFG,VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3,
     4  VIWUP,VIWPN,PRJDIR
      REAL NDCSPC(3), VEWPRT(3,2), WINDOW(2,2), VEWREF(4),
     1  VEWPLN(4), VEWUP(4), PJDIR(4), PJPNT(4), VEWDIS, FDIS,
     2  BDIS,MXFORM(4,4),VIWUP(3),VIWPN(3),PRJDIR(3)
      INTEGER PJTYP, CRDSYS
      LOGICAL NDCUSE,FDSET,BDSET,WCLIP,FCLIP,BCLIP,CRDSET,VPRTFG,
     1    VEWTYP,WRNGVS,VEWSET,PRMUSE,VEWUSE,WORLD3
      COMMON /PAR/ PARRAY,MAXARY
      INTEGER*4 PARRAY(5000),MAXARY
      COMMON /STB/ FILE,TABLE,FLPNTR,FLEND,STEND,
     1     SGTMAX,MATRIX,XFMMAT,ROTATE,IMAGE,MATPTR
      INTEGER STEND,SGTMAX,MATPTR
      INTEGER*4 FILE(30000),TABLE(5,1000),FLPNTR,FLEND
      REAL MATRIX(4,4),XFMMAT(4,3,1000),ROTATE(3,1000)
      LOGICAL IMAGE
      REAL ARRAY(4), P1(4)
      REAL RARRAY(5000), TRARAY(5000), R1ARAY(5000)
      INTEGER*4 TPARAY(5000), P1ARAY(5000)
      EQUIVALENCE (PARRAY, RARRAY), (PARRAY, TPARAY)
      EQUIVALENCE (P1ARAY, R1ARAY), (RARRAY, TRARAY)
      REAL BOUNDS(3,2), IXFORM(4,4)
      INTEGER OP, LENGTH, PRMCNT, LINENO, NLINES
      LOGICAL INSIDE, IMAGE1, IDENT, TRULIN(1500)
      DATA ARRAY(4) /1.0/
      DATA BOUNDS(1,1), BOUNDS(2,1), BOUNDS(3,1) /3*0.0/
      IMAGE1 = .TRUE.
      INSIDE = .TRUE.
      IDENT = .TRUE.
      BOUNDS(1,2) = NDCSPC(1)
      BOUNDS(2,2) = NDCSPC(2)
      BOUNDS(3,2) = NDCSPC(3)
      IXFORM(1,4) = 0.0
      IXFORM(2,4) = 0.0
      IXFORM(3,4) = 0.0
      IXFORM(4,4) = 1.0
      DO 25 I = 1,4
         DO 25 J = 1,3
            IXFORM(I,J) = XFMMAT(I,J,MATPTR)
         CONTINUE
 25      CONTINUE
      DO 50 I = 1, 4
         DO 50 J = 1, 4
            IF (I.EQ.J.AND.IXFORM(I,J).NE.1.0) THEN
             IDENT = .FALSE.
             GO TO 60
            END IF
            IF (I.NE.J.AND.IXFORM(I,J).NE.0.0) THEN
               IDENT = .FALSE.
               GO TO 60
            END IF
           CONTINUE
 50      CONTINUE
      IF (IDENT) RETURN
 60      CONTINUE
      OP = PARRAY(2)
      LENGTH = PARRAY(4)
      PRMCNT = LENGTH / 3
      K = 5
      DO 75 I = 1, PRMCNT
         ARRAY(1) = RARRAY(K)
         ARRAY(2) = RARRAY(K+1)
         ARRAY(3) = RARRAY(K+2)
         CALL GMULT (ARRAY, IXFORM, P1, 1, 4, 4)
         RARRAY(K) = P1(1)
         RARRAY(K+1) = P1(2)
         RARRAY(K+2) = P1(3)
         K = K + 3
 75      CONTINUE
      IF (OP.GT.8) RETURN
      GO TO (100, 100, 200, 200, 300, 300, 400, 100), OP
 100      CONTINUE
      CALL GCPGEN (BOUNDS, INSIDE, TRULIN, IMAGE1)
      IF (LENGTH.NE.3) GO TO 120
      IF (.NOT.INSIDE) RETURN
      CALL GDSPCH
      RETURN
 120      CONTINUE
      K = 5
      M = 5
      DO 130 I = 1, PRMCNT
         IF (.NOT.TRULIN(I)) GO TO 125
         TRARAY(M) = RARRAY(K)
         TRARAY(M+1) = RARRAY(K+1)
         TRARAY(M+2) = RARRAY(K+2)
         M = M + 3
 125         CONTINUE
         K = K + 3
 130      CONTINUE
      TPARAY(1) = M - 1
      TPARAY(4) = M - 5
      CALL GDSPCH
      RETURN
 200      CONTINUE
      DO 210 I = 1, 4
         P1ARAY(I) = PARRAY(I)
 210      CONTINUE
      DO 220 I = 5, PARRAY(1)
         R1ARAY(I) = RARRAY(I)
 220      CONTINUE
      NLINES = (PARRAY(4) / 3) - 1
      PARRAY(1) = 10
      PARRAY(4) = 6
      IK = 5
      LINENO = 0
 230      CONTINUE
      LINENO = LINENO + 1
      RARRAY(5) = R1ARAY(IK)
      RARRAY(6) = R1ARAY(IK+1)
      RARRAY(7) = R1ARAY(IK+2)
      RARRAY(8) = R1ARAY(IK+3)
      RARRAY(9) = R1ARAY(IK+4)
      RARRAY(10) = R1ARAY(IK+5)
      IK = IK + 3
      CALL GCPGEN (BOUNDS, INSIDE, TRULIN, IMAGE1)
      IF (INSIDE) CALL GDSPCH
      IF (LINENO.LT.NLINES) GO TO 230
      RETURN
 300      CONTINUE
      CALL GCPGEN (BOUNDS, INSIDE, TRULIN, IMAGE1)
      IF (PARRAY(4).EQ.3) PARRAY(2) = 8
      IF (.NOT.INSIDE) RETURN
      CALL GDSPCH
      RETURN
 400      CONTINUE
      RETURN
      END
**IN -1
