! last update feb 10 2002 add lock/unlock ! Last change: IPK 2 Mar 1999 12:05 pm SUBROUTINE SELNODE(ISW) USE WINTERACTER USE BLKMAP USE BLK1MOD USE BLK2MOD include 'd.inc' dimension xot(100),yot(100) ! INCLUDE 'BLK1.COM' ! INCLUDE 'BLK2.COM' ! dimension nodlist(maxp),RLAY(9) ! DIMENSION ICN(MAXP) character*1 iflag CHARACTER*1 ANS,ANSW(10) CHARACTER*63 STRELS DATA ANSW/'m','a','f','s','k','u','t','w','h','q'/ DATA STRELS/' You have tried set to set elevation with no mapfile"'/ DATA ISWBAK,ISWBAKAG/0,0/ ! ! save nhtp etc nhtps=nhtp nbrs=nbrr nmessv=nmess if(isw .eq. 0 .or. isw .eq. 4) then CALL GETPOLY(XOT,YOT,NPTS) ! look for points inside polygon ndlist=0 do j=1,np if(inskp(j) .eq. 0) then inswt=0 call cpoly(xot,yot,npts,cord(j,1),cord(j,2),inswt) if(inswt .eq. 1) then call rred fpn=j x = cord(j,1) y = cord(j,2) - .11 call numbr(x,y,ht,fpn,0.0,-1) ndlist=ndlist+1 nodlist(ndlist)=j endif endif enddo call rblue elseif(isw .eq. 1) then ! ! Add all nodes to list ! NDLIST=0 DO J=1,NP IF(INEW(J) .EQ. 1) THEN NDLIST=NDLIST+1 NODLIST(NDLIST)=J ENDIF END DO elseif(isw .eq. 2) then ! Get inactive nodes DO I=1,NP ICN(I) = 0 ENDDO DO J = 1, NE IF( IMAT(J) .NE. 0 ) THEN DO K = 1, 8 IF( NOP(J,K) .GT. 0) THEN ICN(NOP(J,K))=999 ENDIF ENDDO ENDIF END DO ! ! Add nodes to list ! NDLIST=0 DO J=1,NP IF(ICN(J) .EQ. 0 .AND. INEW(J) .EQ. 1) THEN NDLIST=NDLIST+1 NODLIST(NDLIST)=J ENDIF END DO elseif(isw .eq. 3) then NS=1 call wdialogload(IDD_SELELTYP) ierr=infoerror(1) CALL WDialogPutInteger(IDF_INTEGER1,NS) CALL WDialogSelect(IDD_SELELTYP) ierr=infoerror(1) CALL WDialogShow(-1,-1,0,ModaL) ierr=infoerror(1) do IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN CALL WDialogGetInteger(IDF_INTEGER1,NS) go to 80 ENDIF enddo 80 CONTINUE DO I=1,NP ICN(I) = 0 ENDDO NDLIST=0 DO K=1,NE IF(IMAT(K) .EQ. NS) THEN DO L=1,8 NST=NOP(K,L) IF(NST .GT. 0) THEN IF(ICN(NST) .EQ. 0) THEN NDLIST=NDLIST+1 NODLIST(NDLIST)=NST ICN(NST)=1 ENDIF ENDIF ENDDO ENDIF ENDDO endif ! NEW MOVE OPERATION IF(ISW .EQ. 4) THEN CALL MVGRP(NDLIST,NODLIST) nhtp=nhtps nbrr=nbrs nmess=nmessv call hedr RETURN ENDIF nbrr=0 nhtp=14 call hedr CALL XYLOC(xscrn1,yscrn1,iflag,ibox) if(ibox .eq. 1 .or. iflag .eq. 'd') then do n=1,ndlist j=nodlist(n) call deletn(j) enddo elseif(ibox .eq. 2 .or. iflag .eq. 'e') then do n=1,ndlist j=nodlist(n) wd(j)=-9999. enddo elseif(ibox .eq. 3 .or. iflag .eq. 't') then ! ! Establish size for range ! ! IF(IMP .EQ. 0) THEN ! CALL SYMBL(0.,7.25,0.20,STRELS,0.,63) ! nhtp=nhtps ! nbrr=nbrs ! nmess=nmessv ! call hedr ! RETURN ! endif 100 CONTINUE NHTP = 16 NMESS = 0 NBRR = 0 CALL HEDR ! ! Get answer ! 110 call xyloc(XPT,YPT,ANS,IBOX) IF(IRMAIN .EQ. 1) RETURN IF(ANS .EQ. 'c') THEN if(ibox .eq. 0) go to 110 ANS=ANSW(IBOX) ENDIF IF(ANS .EQ. 'm') THEN ! ! This option allows changes to bottom elevations ! IF(ISWBAKAG .EQ. 0) CALL SETBACK(ISWBAK,ISWBAKAG) CALL ADDPTH2(NODLIST,NDLIST,ISWBAK) GO TO 220 ELSEIF (ANS .EQ. 'a') THEN ! ! All nodes ! ISWT = -1 ELSEIF(ANS .EQ. 'f') THEN ! ! Fill nodes ! ISWT = 0 ! ELSEIF(ANS .EQ. 's') THEN ! ! Single node at a time ! ! ISWT = 1 !ipk feb02 add lock/unlock and remove cdata ! ELSEIF(ANS .EQ. 'w') THEN ! ! This option allows changes to nodal widths ! ! CALL ADDWID ! IF(IRMAIN .EQ. 1) RETURN ! GO TO 100 ! ! Call to help screen ! ELSEIF(ANS .EQ. 'h') THEN CALL HELPS(4) IF(IRMAIN .EQ. 1) RETURN GO TO 100 ! ELSEIF(ANS .EQ. 'q') THEN ! ! Writeout and return ! CALL WRTOUT(0) RETURN ENDIF IF(IMP .EQ. 0) THEN CALL SYMBL(0.,7.25,0.20,STRELS,0.,63) go to 100 endif ! ! Establish size for range ! !!!!!!!!!!!!!!!!!!!!!!!!! IF(ISWTAGN .EQ. 0) THEN ! IF(IRECD .EQ. 2) THEN ! iswtintp=0 ! iswtagn=0 ! go to 210 ! ENDIF CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Do you wish to interpolate '//& CHAR(13)//'from the triangulated map file?' ,& 'Select Interpolation method?') ! If answer 'Yes' set interpolate switch to 1 ! IF (WInfoDialog(4) .EQ. 2) then iswtintp=0 ELSE iswtintp=1 ENDIF CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Ask this question again?'//& CHAR(13)//' ' ,& 'Ask again?') ! If answer 'Yes' set again switch to 0 ! IF (WInfoDialog(4) .EQ. 2) then iswtagn=1 ELSE iswtagn=0 ENDIF ENDIF 210 CONTINUE !!!!!!!!!!!!!!!!!!!!!!!!!!!! IF(ISWTINTP .EQ. 0) THEN call setrng(xnears,nmap) iswt=0 do n=1,ndlist m=nodlist(n) !ipk feb02 !ipk jan08 chnage subscript if(lock(m) .eq. 0) CALL SETELV(XNEARS,NMAP,M,ISWT) enddo ELSE if(nelts .eq. 0) then CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'No triangulated exists'//& CHAR(13)//'Do you wish to triangulate now?' ,& 'NO TRIANGULATION AVAILABLE?') ! If answer 'Yes' set triangulate now ! IF (WInfoDialog(4) .EQ. 2) then return ELSE call triang ENDIF endif do n=1,ndlist m=nodlist(n) write(155,*) 'selt',m !ipk mar20 if(iswt .eq. 0 .and. wd(m) .gt. -4400.) cycle if(lock(m) .eq. 0) CALL TRIANINT(NMAP,M,ISWT,ITIME) enddo ENDIF 220 CONTINUE elseif(ibox .eq. 4 .or. iflag .eq. 'l') then ! Define layers call openlay NHTP=0 NBRR=0 NMESS=45 CALL HEDR NMESS=4 xprt=3.2 ! ! call getint(nlay) call GETLAYDAT(NLAY,ipos,RLAY) ILAYTP=IPOS do n=1,ndlist j=nodlist(n) lay(j)=nlay DO I=1,NLAY WTLAY(J,I)=RLAY(I) ENDDO enddo REWIND 102 DO J=1,NP IF(LAY(J) .GT. -9998) THEN if(ILAYTP .eq. 1) then write(102,6000) J,LAY(J),(WTLAY(J,I),I=1,LAY(J)) 6000 format('LD2 ',2i8,9F8.2) else write(102,6001) J,LAY(J),(WTLAY(J,I),I=1,LAY(J)) 6001 format('LD3 ',2i8,9F8.2) endif ENDIF ENDDO nlayd=1 !ipk feb02 add lcok/unlock elseif(ibox .eq. 5 .or. iflag .eq. 'k') then do n=1,ndlist j=nodlist(n) lock(j)=1 enddo elseif(ibox .eq. 6 .or. iflag .eq. 'u') then do n=1,ndlist j=nodlist(n) lock(j)=0 enddo elseif(ibox .eq. 7 .or. iflag .eq. 'f') then do n=1,np list(n)=0 enddo do n=1,ndlist list(nodlist(n))=1 enddo call deln2(np,0) endif ! CALL PLOTOT(1) nhtp=nhtps nbrr=nbrs nmess=nmessv call hedr RETURN END SUBROUTINE SELELT(ISW) USE BLK1MOD save fracd dimension xot(100),yot(100) ! INCLUDE 'BLK1.COM' ! dimension nodlist(maxp) character*1 iflag data itime/0/ if(itime .eq. 0) then mat=0 itime=1 endif IF(ISW .EQ. 2) GO TO 200 CALL GETPOLY(XOT,YOT,NPTS) ! ! save nhtp etc nhtps=nhtp nbrs=nbrr nmessv=nmess ! look for points inside polygon ndlist=0 nefl=0 do n=1,ne ieswt=0 if(ieskp(n) .eq. 0) then ieswt=1 do m=1,ncorn(n) j=nop(n,m) if(j .gt. 0) then inswt=0 call cpoly(xot,yot,npts,cord(j,1),cord(j,2),inswt) if(inswt .eq. 1) then ! call rred ! fpn=j ! x = cord(j,1) ! y = cord(j,2) - .11 ! call numbr(x,y,ht,fpn,0.0,-1) ndlist=ndlist+1 nodlist(ndlist)=j else ieswt=0 endif endif enddo endif if(ieswt .eq. 1) then nefl=nefl+1 neflag(nefl)=n ! call rcyan ! fpn = n ! x = xc(n) ! y = yc(n) + .01 ! call numbr(x,y,0.20,fpn,0.0,-1) call fillem(n) endif enddo call rblue GO TO 300 200 CONTINUE ! ! save nhtp etc nhtps=nhtp nbrs=nbrr nmessv=nmess NEFL=0 CALL GETFRAC(FRACD) call plotot(0) DO N=1,NE IF(EDIF(N) .GT. (1.-FRACD)*EDIF(0)) THEN nefl=nefl+1 neflag(nefl)=n call fillem(n) ENDIF ENDDO 300 CONTINUE if(isw .eq. 0 .OR. ISW .EQ. 2) then nbrr=0 nhtp=15 call hedr CALL XYLOC(xscrn1,yscrn1,iflag,ibox) if(ibox .eq. 1 .or. iflag .eq. 'd') then do n=1,nefl j=neflag(n) call deltel(j) enddo nefl=0 elseif(ibox .eq. 2 .or. iflag .eq. 'e') then call refb elseif(ibox .eq. 3 .or. iflag .eq. 't') then nhtp=0 nbrr=4 NMESS=45 call hedr nmess=2 call getint(mat) ipsw(7)=1 ipsw(5)=0 do n=1,nefl j=neflag(n) imat(j) = mat enddo nefl=0 elseif(ibox .eq. 4 .or. iflag .eq. 'm') then ! ! simplify layout ! IECHG=0 !IPK MAY03 ICHG=0 CALL SMFY !ipk dec11 elseif(ibox .eq. 5 .or. iflag .eq. 'g') then ! ! form group ! CALL FORMGP endif CALL PLOTOT(1) nhtp=nhtps nbrr=nbrs nmess=nmessv call clrbox call hedr else call extract(NODLIST,NDLIST) ! display extracted file CALL PLOTOT(1) nhtp=nhtps nbrr=nbrs nmess=nmessv call clrbox call hedr endif RETURN END SUBROUTINE CPOLY(XOT,YOT,NPTS,X,Y,INSWT) DIMENSION XOT(*),YOT(*) REAL*8 X,Y DATA PI/3.14159/ SUMA=0 DO N=1,NPTS-1 ANG1=ATAN2(YOT(N+1)-Y,XOT(N+1)-X) ANG2=ATAN2(YOT(N)-Y,XOT(N)-X) DIFA=ANG2-ANG1 IF(ABS(DIFA) .GT. PI) THEN IF(DIFA .LT. -PI) DIFA=DIFA+2.*PI IF(DIFA .GT. PI) DIFA=DIFA-2.*PI ENDIF SUMA=SUMA+DIFA ENDDO IF(ABS(SUMA) .GT. PI) THEN INSWT=1 ELSE INSWT=0 ENDIF RETURN END SUBROUTINE GETPOLY(XOT,YOT,NPTS) USE BLK1MOD dimension xot(*),yot(*) ! INCLUDE 'BLK1.COM' ! CHARACTER*23 SELN3 CHARACTER*32 SELN CHARACTER*24 SELN2 CHARACTER*1 IFLAG data SELN/' Click at points to form polygon'/ data SELN2/' Click next point '/ data SELN3/' Click last point again'/ 80 CALL CLRBOX nhtp=0 nbrr=5 nmess=0 call hedr CALL SYMBL(0.,7.70,0.20,SELN,0.,32) ! 100 continue ! ! Get cursor location ! CALL XYLOC(xscrn,yscrn,iflag,ibox) IF(IRMAIN .EQ. 1) RETURN ! if (iflag .eq. 'q') return ! if(iflag .eq. 'c') then xot(1)=xscrn yot(1)=yscrn npts=1 ! ! This option is creating an inset locations ! 120 continue CALL XYLOC(xscrn1,yscrn1,iflag,ibox) IF(IRMAIN .EQ. 1) RETURN if(ibox .eq. 6 .or. iflag .eq. 'b') then npts=npts-1 go to 120 endif if(iflag .eq. 'c') then ! ! Look for a screen size ! 122 continue xsiz=abs(xscrn1-xscrn) ysiz=abs(yscrn1-yscrn) !ipk jun96 test for zero sizes if(xsiz .lt. 0.001 .or. ysiz .lt. 0.001) then CALL CLRBOX call hedr CALL SYMBL(0.,7.70,0.20,seln3,0.,23) go to 120 endif npts=npts+1 xot(npts)=xscrn1 yot(npts)=yscrn1 call DASHLN(xot,yot,npts,1) CALL CLRBOX call hedr CALL SYMBL(0.,7.70,0.20,seln2,0.,24) CALL XYLOC(xscrn1,yscrn1,iflag,ibox) IF(IRMAIN .EQ. 1) RETURN if(ibox .eq. 6 .or. iflag .eq. 'b') then npts=npts-1 go to 120 elseif(ibox .eq. 7 .or. iflag .eq. 'n') then npts=npts+1 xot(npts)=xot(1) yot(npts)=yot(1) call DASHLN(xot,yot,npts,1) go to 280 else go to 122 endif endif ENDIF 280 continue RETURN END subroutine extract(NODLIST,NDLIST) USE WINTERACTER USE BLK1MOD INCLUDE 'BFILES.I90' ! include 'blk1.com' include 'd.inc' DIMENSION NODLIST(*) CHARACTER(LEN=256) :: FILTER CHARACTER(LEN=255) :: FNAME,FNAMRM ! select filename for new file FILTER ="Rm1 file -- *.rm1|*.rm1|" CALL WSelectFile(Filter,SaveDialog+PromptOn+AppendExt+DirChange,FNAME,'Filename for extracted file') IF (WInfoDialog(ExitButtonCommon).EQ.CommonOpen) THEN GO TO 200 ELSE GO TO 500 ENDIF 200 CONTINUE CALL IlowerCase(FNAME) ITOTFIL=ITOTFIL+1 FNAMEOUT(ITOTFIL)=FNAME ! save current file IFILOUT=IACTVFIL+50 CALL WRTFIL(IFILOUT) ! create network structure CALL ZERORELM(NODLIST,NDLIST) IACTVFIL=ITOTFIL ! save new structure IOT = 20 FNAMRM=FNAME igfgsw=0 close(iot) OPEN(IOT,FILE=FNAME,STATUS='UNKNOWN') ! ! Check if file cords format to be short or long ! ! CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Do you wish to save'//& CHAR(13)//'coordinates in long format?' ,& 'Coordinate save format') ! ! If answer 'No', use short format ! IF (WInfoDialog(4) .EQ. 2) then ntempin=0 else ntempin=2 END IF ! call wrtout(1) CLOSE (IOT) OPEN(IOT,FILE=FNAMRM,STATUS='UNKNOWN') 500 continue return end SUBROUTINE ZERORELM(NODLIST,NDLIST) USE BLK1MOD ! INCLUDE 'BLK1.COM' ! dimension nodlist(*) DO N=1,NP ! search nodlist do k=1,ndlist if(n .eq. nodlist(K)) go to 300 enddo call deletn(n) 300 continue ENDDO ! reset NP do k=np,1,-1 if(inew(k) .gt. 0) then np=k go to 350 endif enddo 350 continue ! reset NE do k=ne,1,-1 if(imat(k) .gt. 0) then ne=k go to 400 endif enddo 400 continue RETURN END SUBROUTINE GETFRAC(FRACD) ! ! Generate continuity lines ! USE WINTERACTER save include 'd.inc' ! ! Declare window-type and message variables ! TYPE(WIN_STYLE) :: WINDOW TYPE(WIN_MESSAGE) :: MESSAGE integer :: I1,I2,I3,ITIME,IPOS REAL :: FRACD data itime/0/ IF(ITIME .EQ. 0) THEN FRACD=0.1 itime=1 ENDIF call wdialogload(IDD_SETSEL) ierr=infoerror(1) CALL WDialogSelect(IDD_SETSEL) ierr=infoerror(1) CALL WDialogPutReal(IDF_REAL1,FRACD) CALL WDialogShow(-1,-1,0,Modal) ierr=infoerror(1) do ! IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN CALL WDialoggetReal(IDF_REAL1,FRACD) GO TO 100 ENDIF enddo 100 CONTINUE return end SUBROUTINE FINDTYP USE WINTERACTER USE BLKMAP USE BLK1MOD USE BLK2MOD character*1 iflag include 'd.inc' DATA NS/1/ call wdialogload(IDD_SELELTYP) ierr=infoerror(1) CALL WDialogPutInteger(IDF_INTEGER1,NS) CALL WDialogSelect(IDD_SELELTYP) ierr=infoerror(1) CALL WDialogShow(-1,-1,0,ModaL) ierr=infoerror(1) do IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN CALL WDialogGetInteger(IDF_INTEGER1,NS) go to 80 ENDIF enddo 80 CONTINUE ICLL=4 call clscrn call plotot(0) nefl=0 DO N=1,NE IF(IMAT(N) .EQ. NS) THEN CALL FILLEMC(N,ICLL) nefl=nefl+1 neflag(nefl)=n ENDIF ENDDO nbrr=0 nhtp=15 call hedr CALL XYLOC(xscrn1,yscrn1,iflag,ibox) if(ibox .eq. 1 .or. iflag .eq. 'd') then do n=1,nefl j=neflag(n) call deltel(j) enddo nefl=0 elseif(ibox .eq. 2 .or. iflag .eq. 'e') then call refb elseif(ibox .eq. 3 .or. iflag .eq. 't') then nhtp=0 nbrr=4 NMESS=45 call hedr nmess=2 call getint(mat) ipsw(7)=1 ipsw(5)=0 do n=1,nefl j=neflag(n) imat(j) = mat enddo nefl=0 elseif(ibox .eq. 4 .or. iflag .eq. 'm') then ! ! simplify layout ! IECHG=0 !IPK MAY03 ICHG=0 CALL SMFY !ipk dec11 elseif(ibox .eq. 5 .or. iflag .eq. 'g') then ! ! form group ! CALL FORMGP elseif(ibox .eq. 6) then do n=1,nefl j=neflag(n) do jj=1,8 if(nop(j,jj) .ne. 0) then wd(nop(j,jj))=-9999. endif enddo enddo endif RETURN END SUBROUTINE MVGRP(NDLIST,NODLIST) USE WINTERACTER USE BLK1MOD INCLUDE 'TXFRM.COM' dimension nodlist(maxp),RLAY(9) character*1 iflag ! GET AMOUNT OF SHIFT IN PAGE UNITS 200 continue NHTP = 16 NMESS = 47 NBRR = 0 CALL HEDR CALL xyloc(xscrn1,yscrn1,iflag,ibox) CALL XYLOC(XSCRN2,YSCRN2,IFLAG,IBOX) XSHIFT=XSCRN2-XSCRN1 YSHIFT=YSCRN2-YSCRN1 ! APPLY SHIFT TO NODES IN THE LIST DO N=1,NDLIST CORD(NODLIST(N),1)=CORD(NODLIST(N),1)+XSHIFT CORD(NODLIST(N),2)=CORD(NODLIST(N),2)+YSHIFT ENDDO CALL PLOTOT(0) CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Do you wish to save'//& CHAR(13)//'new coordinate location?' ,& 'COORDINATE MOVE') IF (WInfoDialog(4) .EQ. 2) then ! revert to old DO N=1,NDLIST CORD(NODLIST(N),1)=(XUSR(NODLIST(N))+XS)/TXSCAL CORD(NODLIST(N),2)=(YUSR(NODLIST(N))+YS)/TXSCAL ENDDO CALL PLOTOT(0) CALL WMessageBox(YesNo,QuestionIcon,CommonOK,'Do you wish to '//& CHAR(13)//'try again?' ,& 'COORDINATE MOVE') IF (WInfoDialog(4) .EQ. 2) then return else go to 200 endif else ! accept END IF RETURN END