C MODI      SOURCE    PV        20/08/20    21:15:04     10699          
C   MODIFICATION INTERACTIVE DE MAILLAGE
C
      SUBROUTINE MODI
      IMPLICIT INTEGER(I-N)
-INC CCREEL

-INC PPARAM
-INC CCOPTIO
-INC CCGEOME
-INC SMELEME
-INC SMCOORD
      SEGMENT ICPR(nbpts)
      SEGMENT IVU(ITE)
      SEGMENT NTSEG(LTSEGS)
      SEGMENT /KON1/(KON(NBCON,NMAX)),KON2.KON1
      SEGMENT XPROJ(3,ITE)
      SEGMENT IDCP(ITE)
      SEGMENT IMILL(ITE)
      SEGMENT IBOUJ(ITE)
      COMMON /CMODI/LIGMAX,XPREC,YPREC
      DIMENSION XTR(40),YTR(40),ZTR(40)
      CHARACTER*4 JPROJ,CMOT
      CHARACTER*9 ZONE,ZONE1,ZONE2,ZONE3,ZONE4,ZONF1,ZONF2,ZONF3,ZONF4
      CHARACTER*3 CREP
      LOGICAL VALEUR,FENET
      CHARACTER*4 ITOPT(5)
      CHARACTER*6 LEGEND(7)
      LOGICAL LBLANC
C#      real*8 ddec
      real ddec
      DATA JPROJ/'PROJ'/,ITOPT/'PLAN','SPHE','CYLI','CONI','TORI'/
      DATA LBLANC/.FALSE./
      do i=1,40
        ztr(i)=0
      enddo
      LPROJ=0
      IBOUJ=0
      IPREM=0
      INITIA=0
      JOEIL=0
      DIOCA2=DIOCAD
      LIGMAX=32
      IMILL=0
      KON1=0
      KON2=0
      ICPR=0
      IDCP=0
      IVU=0
      NTSEG=0
      SEGACT MCOORD*MOD
      FENET=.TRUE.
      VALEUR=.FALSE.
      ICACHE=0
      IF (IDIM.EQ.3) ICACHE=1
      CALL LIROBJ('MAILLAGE',MELEME,1,IRET)
      IF (IDIM.EQ.3) CALL LIROBJ('POINT ',JOEIL,1,IRETOU)
      IF (IERR.NE.0) RETURN
      SEGINI ICPR
      ITE=0
      SEGACT MELEME
      IPT1=MELEME
      DO 40 I=1,MAX(1,LISOUS(/1))
         IF (LISOUS(/1).NE.0) IPT1=LISOUS(I)
         SEGACT IPT1
         DO  J=1,IPT1.NUM(/1)
            DO  K=1,IPT1.NUM(/2)
               IPOIT=IPT1.NUM(J,K)
               IF (ICPR(IPOIT).EQ.0) THEN
                 ITE=ITE+1
                 ICPR(IPOIT)=ITE
               ENDIF
            ENDDO
         ENDDO
  40  CONTINUE
      SEGINI XPROJ
      SEGINI IBOUJ
      CALL PROMOD(ICPR,XPROJ,JOEIL,1,IBOUJ)
      IVPR=ICPR(/1)
      SEGINI IDCP
      DO 60 I=1,NBPTS
         IP=ICPR(I)
         IF (IP.EQ.0) GOTO 60
         IDCP(IP)=I
  60  CONTINUE
*  SI REAFFICHAGE IL SE FAIT A PARTIR D'ICI
 1000 CONTINUE
      IF (IMILL.NE.0) SEGSUP IMILL
      SEGINI IMILL
      IPT1=MELEME
      NBCON=9
      NBCONR=NBCON-1
      NMAX=(12*ITE)/NBCON+200
      IF (KON1.NE.0) SEGSUP KON1
      SEGINI KON1
*   KON EST INITIALISE A ZERO
*   REMPLISSAGE DU TABLEAU DES CONNECTIONS
      ICHAIN=ITE
      DO 285 IO=1,MAX(1,LISOUS(/1))
         IF (LISOUS(/1).NE.0) IPT1=LISOUS(IO)
         SEGACT IPT1
         K=IPT1.ITYPEL
*
         IDEP=LPT(K)
         IFIN1=IDEP+2*LPL(K)-2
         IFIN2=IFIN1
         IF (LPL(K).EQ.0) THEN
           IF (LPT(K).EQ.0)THEN
             GOTO 270
            ELSE
C             Polygone
              IFIN1=IDEP+2*IPT1.NUM(/1)-2
              IFIN2=IFIN1 -2
            ENDIF
         ENDIF
         DO 260 I=1,IPT1.NUM(/2)
            IS=1
            DO 250 J=IDEP,IFIN1,2
               IF (J.LE.IFIN2) THEN
                 N1=ICPR(IPT1.NUM(KSEGM(J),I))
                 N2=ICPR(IPT1.NUM(KSEGM(J+1),I))
               ELSE
C                Polygone
                 N1=ICPR(IPT1.NUM(KSEGM(IFIN2+1),I))
                 N2=ICPR(IPT1.NUM(KSEGM(1),I))
               ENDIF
               NI=N1
               NJ=N2
               IF (N1*N2.EQ.0) GOTO 290
               IPO=0
 110           CONTINUE
               NII=NI
 120           DO 170 K=1,NBCONR
                  IF (KON(K,NI).GE.NJ) GOTO 130
                  KSAUV1=NJ
                  GOTO 200
 130              IF (KON(K,NI).NE.NJ) GOTO 170
                  JJ=0
 140              DO 150 II=1,NBCONR
                     IF (KON(II,NJ).EQ.NII) THEN
                        GOTO 160
                     ENDIF
 150              CONTINUE
                  IF (KON(NBCON,NJ).NE.0) THEN
                     NJ=KON(NBCON,NJ)
                     GOTO 140
                  ENDIF
 160             CONTINUE
                 GOTO 250
 170          CONTINUE
              IF (KON(NBCON,NI).EQ.0) GOTO 180
              NI=KON(NBCON,NI)
              GOTO 120
 180          KSAUV1=NJ
 190          ICHAIN=ICHAIN+1
              IF (ICHAIN.EQ.NMAX) GOTO 290
              KON(NBCON,NI)=ICHAIN
              K=1
              NI=ICHAIN
 200          KSAUV=KON(K,NI)
              KON(K,NI)=KSAUV1
              KSAUV1=KSAUV
              IF (KSAUV.EQ.0) GOTO 240
              KDEP=K+1
              IF (KDEP.EQ.NBCON) GOTO 230
 210          DO 220 KHE=KDEP,NBCONR
                 KSAUV=KON(KHE,NI)
                 KON(KHE,NI)=KSAUV1
                 IF (KSAUV.EQ.0) GOTO 240
                 KSAUV1=KSAUV
 220          CONTINUE
 230          IF (KON(NBCON,NI).EQ.0) GOTO 190
              NI=KON(NBCON,NI)
              KDEP=1
              GOTO 210
 240          IF (NJ.NE.N2.OR.IPO.EQ.1) GOTO 250
              NI=N2
              NJ=N1
              IPO=1
              GOTO 110
 250       CONTINUE
 260     CONTINUE
 270     CONTINUE
 285  CONTINUE
      GOTO 300
 290  CALL ERREUR(23)
      RETURN
 300  CONTINUE
*
C#      XMIN=xgrand
      XMIN=xsgran
      XMAX=-XMIN
      YMIN=XMIN
      TMIN=XMIN
      YMAX=XMAX
      TMAX=XMAX
      DO 400 I=1,ITE
         XMIN=MIN(XMIN,XPROJ(1,I))
         XMAX=MAX(XMAX,XPROJ(1,I))
         YMIN=MIN(YMIN,XPROJ(2,I))
         YMAX=MAX(YMAX,XPROJ(2,I))
         TMIN=MIN(TMIN,XPROJ(3,I))
         TMAX=MAX(TMAX,XPROJ(3,I))
 400  CONTINUE
      XDEC=XMAX-XMIN
      YDEC=YMAX-YMIN
      DDEC=MAX(XDEC,YDEC)*0.01
C#      DDEC=MAX(DDEC,xpetit)
      DDEC=MAX(DDEC,xspeti)
      XMAX=XMAX+DDEC
      XMIN=XMIN-DDEC
      YMIN=YMIN-DDEC
      YMAX=YMAX+DDEC
      IF (INITIA.EQ.0) THEN
         INITIA=1
         XMI=XMIN
         XMA=XMAX
         YMI=YMIN
         YMA=YMAX
      ENDIF
*
      IF (IPREM.EQ.0.AND.IDIM.EQ.3) THEN
         CALL TRINIT(25,DIOCA2,DIOCA2,TITREE,0.15,VALEUR,NCOUMA)
         CALL DFENET(0.,80.,0.,25.,-1.,1.,X1,X2,Y1,Y2,.TRUE.)
         CALL MOIN(LPROJ,LPPR1,LPPR2,LPPR3,LPPR4)
         IPREM=1
      ENDIF
 405  CONTINUE
      CALL TRINIT(25,DIOCA2,DIOCA2,TITREE,0.15,VALEUR,NCOUMA)
      CALL DFENET(0.,80.,0.,25.,-1.,1.,X1,X2,Y1,Y2,.TRUE.)
      CALL CHCOUL(0)
*      OBTENIR LES BONNES VALEURS DU CADRE
      CALL TRLABL(0.,16.,0.,'Cadre actuel ci dessous',23,1.)
      CALL TRLABL(0.,2.,0.,'   Xmin',7,1.)
      CALL TRLABL(0.,4.,0.,'   Xmax',7,1.)
      CALL TRLABL(0.,6.,0.,'   Ymin',7,1.)
      CALL TRLABL(0.,8.,0.,'   Ymax',7,1.)
      WRITE (ZONE1,FMT='(G9.2)') XMI
      CALL TRLABL(40.,2.,0.,ZONE1,9,1.)
      WRITE (ZONE2,FMT='(G9.2)') XMA
      CALL TRLABL(40.,4.,0.,ZONE2,9,1.)
      WRITE (ZONE3,FMT='(G9.2)') YMI
      CALL TRLABL(40.,6.,0.,ZONE3,9,1.)
      WRITE (ZONE4,FMT='(G9.2)') YMA
      CALL TRLABL(40.,8.,0.,ZONE4,9,1.)
      GOTO 404
 403  CONTINUE
      CALL TRMESS('Valeur incorrecte recommencez')
 404  CONTINUE
      LEGEND(1)=' '
      LEGEND(2)='Xmin ?'
      LEGEND(3)='Xmax ?'
      LEGEND(4)='Ymin ?'
      LEGEND(5)='Ymax ?'
      LEGEND(6)='Auto'
      LEGEND(7)='Cont'
      CALL MENU(LEGEND,7,6)
      CALL TRAFF(ICLE)
      IF (ICLE.EQ.5) THEN
      INCLE=0
        XMI=XMIN
        XMA=XMAX
        YMI=YMIN
        YMA=YMAX
      ELSEIF (ICLE.EQ.6) THEN
      INCLE=0
      ELSEIF (ICLE.EQ.1) THEN
      CALL TRGET('NOUVELLE VALEUR DE XMIN :',ZONF1)
      INCLE=1
      IF (ZONF1.NE.ZONE1) READ  (ZONF1,FMT='(G9.2)',ERR=403) XMI
      ELSEIF (ICLE.EQ.2) THEN
      CALL TRGET('NOUVELLE VALEUR DE XMAX :',ZONF2)
      INCLE=1
      IF (ZONF2.NE.ZONE2) READ  (ZONF2,FMT='(G9.2)',ERR=403) XMA
      ELSEIF (ICLE.EQ.3) THEN
      CALL TRGET('NOUVELLE VALEUR DE YMIN :',ZONF3)
      INCLE=1
      IF (ZONF3.NE.ZONE3) READ  (ZONF3,FMT='(G9.2)',ERR=403) YMI
      ELSEIF (ICLE.EQ.4) THEN
      CALL TRGET('NOUVELLE VALEUR DE YMAX :',ZONF4)
      INCLE=1
      IF (ZONF4.NE.ZONE4) READ  (ZONF4,FMT='(G9.2)',ERR=403) YMA
      ENDIF
      IF (INCLE.EQ.1) GOTO 405
      CALL TRINIT(25,DIOCA2,DIOCA2,TITREE,0.15,VALEUR,NCOUMA)
      CALL DFENET(XMI,XMA,YMI,YMA,-1.,1.,X1,X2,Y1,Y2,FENET)
*  POUR TRAVAILLER EN NON SEGMENTE
      XPREC=(XMA-XMI)/100
      YPREC=(YMA-YMI)/100
      XPREC=MAX(XPREC,YPREC)
      YPREC=MAX(XPREC,YPREC)
*   INITIALISATION DE IVU
*   IVU=1  PT VU
*   IVU<>1 PT PAS VU
      IF (IVU.NE.0) SEGSUP IVU
      SEGINI IVU
      DO 410 I=1,ITE
         IVU(I)=1
 410  CONTINUE
      IF (ICACHE.NE.0) THEN
         MCOUP=0
         CALL TIRET3(XPROJ,MELEME,ICPR,XMIN,XMAX,YMIN,YMAX,IVU,NELEM,
     #    TMIN,TMAX,MCOUP)
         SEGACT ICPR
      ENDIF
      IF (NTSEG.NE.0) SEGSUP NTSEG
      IF (ICACHE.EQ.1) THEN
            LTSEGS=1000
            SEGINI NTSEG
            LTSEG=0
      ENDIF
      CALL CHCOUL(2)
      IF (KON2.NE.0) SEGSUP KON2
      SEGINI,KON2=KON1
      SEGACT KON1*MOD
      ITR=1
      KAUX=1
 500  K=KAUX
      IF (IVU(KAUX).NE.1) GOTO 530
      KAUXR=KAUX
 510  DO 520 KL=1,NBCONR
      ITRA=KON(KL,K)
      IF (ITRA.LT.0) GOTO 520
      IF (ITRA.EQ.0) GOTO 530
      IF (IVU(ITRA).EQ.1) GOTO 540
 520  CONTINUE
      K=KON(NBCON,K)
      IF (K.NE.0) GOTO 510
 530  KAUX=KAUX+1
      IF (KAUX.EQ.ITE+1) GOTO 630
      GOTO 500
 540  CONTINUE
      IF (ITR.GT.1) THEN
       CALL POLRL(ITR,XTR,YTR,ZTR)
      ENDIF
      ITR=1
      XTR(1)=XPROJ(1,KAUXR)
      YTR(1)=XPROJ(2,KAUXR)
      KPRESS=KAUXR
      GOTO 560
 550  KL=1
 560  DO 570 L=KL,NBCONR
      M=KON(L,K)
      IF (M.EQ.0) GOTO 500
      IF (M.LT.0) GOTO 570
      IF (IVU(M).NE.1) GOTO 570
      GOTO 580
 570  CONTINUE
      K=KON(NBCON,K)
      IF (K.EQ.0) GOTO 500
      GOTO 550
 580  CONTINUE
      ITR=ITR+1
      XTR(ITR)=XPROJ(1,M)
      YTR(ITR)=XPROJ(2,M)
      IF (ITR.EQ.40) THEN
       CALL POLRL(ITR,XTR,YTR,ZTR)
       XTR(1)=XTR(ITR)
       YTR(1)=YTR(ITR)
       ITR=1
      ENDIF
      KON(L,K)=-KON(L,K)
      M1=M
 590  DO 600 L=1,NBCONR
      IF (KON(L,M1).EQ.0) GOTO 620
      IF (KON(L,M1).EQ.KPRESS) GOTO 610
 600  CONTINUE
      M1=KON(NBCON,M1)
      IF (M1.EQ.0) GOTO 620
      GOTO 590
 610  KON(L,M1)=-KON(L,M1)
 620  KPRESS=M
      K=KPRESS
      GOTO 550
 630  CONTINUE
      IF (ITR.GT.1) CALL POLRL(ITR,XTR,YTR,ZTR)
      ITR=1
      IF (ICACHE.EQ.0) GOTO 670
C  ON REMPLIT ISEGM AVEC LES SEGMENTS EN PARTIE VU
      DO 660 K=1,ITE
      IF (IVU(K).NE.1) GOTO 660
      KK=K
 640  DO 650 KL=1,NBCONR
      ITRA=KON(KL,KK)
      IF (ITRA.LT.0) GOTO 650
      IF (ITRA.EQ.0) GOTO 660
      IF (LTSEGS-LTSEG.LT.10) THEN
              LTSEGS=LTSEGS+1000
              SEGADJ NTSEG
      ENDIF
      NTSEG(LTSEG+1)=K
      NTSEG(LTSEG+2)=ITRA
      NTSEG(LTSEG+3)=2
      LTSEG=LTSEG+3
 650  CONTINUE
      KK=KON(NBCON,KK)
      IF (KK.NE.0) GOTO 640
 660  CONTINUE
 670  CONTINUE
      SEGDES KON1
      IF (ICACHE.NE.0) THEN
      CALL DICHO3(XPROJ,MELEME,ICPR,XMIN,XMAX,
     #  YMIN,YMAX,IVU,NTSEG,NELEM,IDCOUL,IDCOUL,LBLANC,LTSEG)
      SEGACT MELEME
      DO 671 IO=1,LISOUS(/1)
      IPT1=LISOUS(IO)
      SEGACT IPT1
 671  CONTINUE
      ENDIF
 1010 CONTINUE
      CALL MENUU
      CALL TRAFF(ICLE)
*  DEMANDE DE REAFFICHAGE
      IF (ICLE.EQ.11) GOTO 1000
*  DEPLACEMENT DE NOEUD
      IF (ICLE.EQ.1) THEN
      CALL MODP(XPROJ,IVU,KON2,ICPR,IDCP,IBOUJ)
      GOTO 1010
      ENDIF
*  NOMMER UN NOEUD
      IF (ICLE.EQ.2) THEN
          CALL MONO(XPROJ,IVU,IDCP)
          GOTO 1010
      ENDIF
*  SUPPRIMER UN ELEMENT
      IF (ICLE.EQ.3) THEN
          CALL MOSU(XPROJ,IVU,ICPR,MELEME)
          GOTO 1010
      ENDIF
*  CREATION D'UN ELEMENT
      IF (ICLE.EQ.4) THEN
          CALL MOCR(XPROJ,IVU,IDCP,MELEME,ICPR,ITE,IMILL,TMIN,IBOUJ)
          GOTO 1010
       ENDIF
*  NOMMER UN ENSEMBLE D'ELEMENT
      IF (ICLE.EQ.5) THEN
          CALL MONL(XPROJ,IVU,ICPR,MELEME)
          GOTO 1010
       ENDIF
*  ECRITURE COORDONNEES
      IF (ICLE.EQ.6) THEN
          CALL MOCO(XPROJ,IVU,KON2,IDCP,ICPR,IBOUJ)
          GOTO 1010
      ENDIF
*  AFFICHAGE NOMS DES POINTS
      IF (ICLE.EQ.7) THEN
          CALL MOPO(XPROJ,ICPR,IVU)
          GOTO 1010
      ENDIF
*  AFFICHAGE CONTOUR
      IF (ICLE.EQ.8) THEN
          CALL MOCT(XPROJ,ICPR,IVU,MELEME)
          GOTO 1010
      ENDIF
*  DEMANDE DE ZOOM
      IF (ICLE.EQ.9) THEN
        CALL TRMESS('Entrez le premier point pour le zoom')
          CALL TRDIG(X1,Y1,INCLE)
        CALL TRMESS('Entrez le second point pour le zoom')
          CALL TRDIG(X2,Y2,INCLE)
          XMI=MIN(X1,X2)
          XMA=MAX(X1,X2)
          YMI=MIN(Y1,Y2)
          YMA=MAX(Y1,Y2)
          GOTO 1000
      ENDIF
*  RECENTRAGE DES NOEUDS MILIEUX
      IF (ICLE.EQ.10) THEN
          CALL MOCE(MELEME,XPROJ,ICPR,IBOUJ)
          GOTO 1000
      ENDIF
      IF (ICLE.LT.0) GOTO 1010
      CALL PROMOD(ICPR,XPROJ,JOEIL,2,IBOUJ)
      IF (LPROJ.EQ.0) GOTO 2100
      NBELEM=0
      DO 2000 I=1,ITE
       IF (IBOUJ(I).EQ.0) GOTO 2000
       NBELEM=NBELEM+1
 2000 CONTINUE
      IF (NBELEM.EQ.0) GOTO 2100
      NBNN=1
      NBREF=0
      NBSOUS=0
      SEGINI MELEME
      ITYPEL=1
      ICC=0
      DO 2010 I=1,ITE
       IF (IBOUJ(I).EQ.0) GOTO 2010
       ICC=ICC+1
       NUM(1,ICC)=IDCP(I)
 2010 CONTINUE
*  TORE
      IF (LPROJ.EQ.5) THEN
       CALL ECROBJ('POINT ',LPPR4)
       CALL ECROBJ('POINT ',LPPR3)
       CALL ECROBJ('POINT ',LPPR2)
       CALL ECROBJ('POINT ',LPPR1)
*  CONE
      ELSEIF (LPROJ.EQ.4) THEN
       CALL ECROBJ('POINT ',LPPR3)
       CALL ECROBJ('POINT ',LPPR2)
       CALL ECROBJ('POINT ',LPPR1)
*  CYLINDRE
      ELSEIF (LPROJ.EQ.3) THEN
       CALL ECROBJ('POINT ',LPPR3)
       CALL ECROBJ('POINT ',LPPR2)
       CALL ECROBJ('POINT ',LPPR1)
*  SPHERE
      ELSEIF (LPROJ.EQ.2) THEN
       CALL ECROBJ('POINT ',LPPR2)
       CALL ECROBJ('POINT ',LPPR1)
*  PLAN
      ELSEIF (LPROJ.EQ.1) THEN
       CALL ECROBJ('POINT ',LPPR3)
       CALL ECROBJ('POINT ',LPPR2)
       CALL ECROBJ('POINT ',LPPR1)
      ENDIF
      CALL ECRCHA(ITOPT(LPROJ))
      CALL ECROBJ('POINT ',IVPR)
      CALL ECRCHA(JPROJ)
      CALL ECROBJ('MAILLAGE',MELEME)
      CALL DEPLAC
      SEGSUP MELEME
 2100 CONTINUE
      SEGSUP XPROJ,ICPR,IVU
      IF (NTSEG.NE.0) SEGSUP NTSEG
      IF (KON1.NE.0) SEGSUP KON1
      IF (KON2.NE.0) SEGSUP KON2
      IF (IDCP.NE.0) SEGSUP IDCP
      IF (IMILL.NE.0) SEGSUP IMILL
      IF (IBOUJ.NE.0) SEGSUP IBOUJ
* LB
      CALL TRMFIN
      RETURN
*LB
      END








 
 
 
 
