!! Copyright (C) Stichting Deltares, 2005-2014. !! !! This file is part of iMOD. !! !! This program is free software: you can redistribute it and/or modify !! it under the terms of the GNU General Public License as published by !! the Free Software Foundation, either version 3 of the License, or !! (at your option) any later version. !! !! This program is distributed in the hope that it will be useful, !! but WITHOUT ANY WARRANTY; without even the implied warranty of !! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the !! GNU General Public License for more details. !! !! You should have received a copy of the GNU General Public License !! along with this program. If not, see . !! !! Contact: imod.support@deltares.nl !! Stichting Deltares !! P.O. Box 177 !! 2600 MH Delft, The Netherlands. !! MODULE MOD_ISG USE WINTERACTER USE RESOURCE USE MOD_COLOURS USE MOD_ISG_TRAPEZIUM, ONLY : ISGCOMPUTETRAPEZIUM USE MOD_POLYGON_PAR USE MOD_PREF_PAR, ONLY : PREFVAL USE MOD_UTL, ONLY : ITOS,INVERSECOLOUR,UTL_MESSAGEHANDLE,UTL_CAP,EQUALNAMES,UTL_FILLDATES,RTOS,UTL_IDFSNAPTOGRID,UTL_GETUNIT,& UTL_JDATETOIDATE,UTL_WSELECTFILE,IDFPLOT1BITMAP,IDFPLOT2BITMAP,UTL_IDATETOJDATE,UTL_GENLABELSDEALLOCATE,UTL_DATA_CSV,NL,& ICOL_VAR,VAR,IACT_VAR,CCNST,UTL_IDFGETCLASS,UTL_IDFCRDCOR USE DATEVAR USE MOD_POLYGON_UTL, ONLY : POLYGON1FIELDS,POLYGON1IMAGES,POLYGON1INIT,POLYGON1CLOSE USE MOD_POLYGON_DRAW, ONLY : POLYGON1DRAWSHAPE USE MOD_IDF, ONLY : IDFREAD,IDFREADSCALE,IDFDEALLOCATE,IDFCOPY,IDFNULLIFY,IDFIROWICOL,IDFGETLOC,IDFALLOCATEX,IDFDEALLOCATEX USE MODPLOT USE MOD_ISG_PAR USE MOD_OSD, ONLY : OSD_OPEN USE MOD_ISG_GRID, ONLY : ISG2GRIDGETDIMENSION,ISG2GRIDMAIN USE MOD_ISG_ADJ, ONLY : ISGADJUSTFIELDS,ISGADJUSTFIELDSTAB,ISGADJUSTCOMPUTEXY USE MOD_ISG_PLOT, ONLY : ISGPLOTSHAPE USE MOD_ISG_UTL USE IMODVAR, ONLY : IDIAGERROR USE IMOD, ONLY : IDFINIT REAL,PARAMETER,PRIVATE :: RNODATA=-99999.99 CONTAINS !###==================================================================== SUBROUTINE ISGEDITMAIN(ITYPE,MESSAGE) !###==================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE TYPE(WIN_MESSAGE) :: DMESSAGE INTEGER,INTENT(IN) :: ITYPE INTEGER :: ISAVE,I,IRGB,JTYPE CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE (ITYPE) CASE(TABCHANGED) !## new tab SELECT CASE (MESSAGE%VALUE2) CASE (ID_DISGEDITTAB1) ISGSHAPES=SHPNO !## remove polygons ... CALL POLYGON1DRAWSHAPE(1,SHPNO) SHPNCRD(1:SHPNO)=-1*SHPNCRD(1:SHPNO) !## draw selected segements CALL ISGCHECKISG(0.0,0.0,1) CASE (ID_DISGEDITTAB2,ID_DISGEDITTAB3,ID_DISGEDITTAB4,ID_DISGEDITTAB5,ID_DISGEDITTAB6,ID_DISGEDITTAB7) IF(MESSAGE%VALUE1.EQ.ID_DISGEDITTAB1)THEN !## remove selected segment IF(SHPNO.GT.0)CALL POLYGON1DRAWSHAPE(SHPNO,SHPNO) SHPNO =ISGSHAPES SHPNCRD(1:SHPNO)=-1*SHPNCRD(1:SHPNO) !## draw polygons CALL POLYGON1DRAWSHAPE(1,SHPNO) CALL POLYGON1FIELDS(ID_DISGEDITTAB2) ENDIF CALL ISGADJUSTFIELDS() IF(MESSAGE%VALUE2.EQ.ID_DISGEDITTAB4)CALL ISGADJUSTFIELDSTAB(ID_DISGEDITTAB4,4) IF(MESSAGE%VALUE2.EQ.ID_DISGEDITTAB5)CALL ISGADJUSTFIELDSTAB(ID_DISGEDITTAB5,2) IF(MESSAGE%VALUE2.EQ.ID_DISGEDITTAB6)CALL ISGADJUSTFIELDSTAB(ID_DISGEDITTAB6,3) IF(MESSAGE%VALUE2.EQ.ID_DISGEDITTAB7)CALL ISGADJUSTFIELDSTAB(ID_DISGEDITTAB7,4) END SELECT CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU1) CALL ISGCHECKISG(0.0,0.0,1) CASE (IDF_CHECK7) CALL IDFPLOTFAST(1) CASE (IDF_CHECK1,IDF_CHECK2,IDF_CHECK3,IDF_CHECK4,IDF_CHECK5,IDF_CHECK6) CALL WDIALOGSELECT(ID_DISGEDIT) CALL WDIALOGGETCHECKBOX(MESSAGE%VALUE2,I) CALL WINDOWSELECT(0) IF(MESSAGE%VALUE2.EQ.IDF_CHECK1)CALL WMENUSETSTATE(ID_ISGNODES,2,I) IF(MESSAGE%VALUE2.EQ.IDF_CHECK2)CALL WMENUSETSTATE(ID_ISGCLCNODES,2,I) IF(MESSAGE%VALUE2.EQ.IDF_CHECK3)CALL WMENUSETSTATE(ID_ISGCRSSCTNS,2,I) IF(MESSAGE%VALUE2.EQ.IDF_CHECK4)CALL WMENUSETSTATE(ID_ISGSEGNODES,2,I) IF(MESSAGE%VALUE2.EQ.IDF_CHECK5)CALL WMENUSETSTATE(ID_ISGSTUWEN,2,I) IF(MESSAGE%VALUE2.EQ.IDF_CHECK6)CALL WMENUSETSTATE(ID_ISGQHR,2,I) CASE (IDF_STRING1,IDF_STRING2,IDF_STRING3,IDF_STRING4,IDF_STRING5,IDF_STRING6) CALL WDIALOGSELECT(ID_DISGEDIT) IF(MESSAGE%VALUE2.EQ.IDF_STRING1)IRGB=ICLRND IF(MESSAGE%VALUE2.EQ.IDF_STRING2)IRGB=ICLRSD IF(MESSAGE%VALUE2.EQ.IDF_STRING3)IRGB=ICLRSC IF(MESSAGE%VALUE2.EQ.IDF_STRING4)IRGB=ICLRSP IF(MESSAGE%VALUE2.EQ.IDF_STRING5)IRGB=ICLRST IF(MESSAGE%VALUE2.EQ.IDF_STRING6)IRGB=ICLRQH CALL WSELECTCOLOUR(IRGB) IF(WINFODIALOG(4).EQ.1)THEN IF(MESSAGE%VALUE2.EQ.IDF_STRING1)ICLRND=IRGB IF(MESSAGE%VALUE2.EQ.IDF_STRING2)ICLRSD=IRGB IF(MESSAGE%VALUE2.EQ.IDF_STRING3)ICLRSC=IRGB IF(MESSAGE%VALUE2.EQ.IDF_STRING4)ICLRSP=IRGB IF(MESSAGE%VALUE2.EQ.IDF_STRING5)ICLRST=IRGB IF(MESSAGE%VALUE2.EQ.IDF_STRING6)ICLRQH=IRGB CALL WDIALOGCOLOUR(MESSAGE%VALUE2,INVERSECOLOUR(IRGB),IRGB) IF(MESSAGE%VALUE2.EQ.IDF_STRING1)CALL WMENUSETSTATE(ID_ISGNODES,2,1) IF(MESSAGE%VALUE2.EQ.IDF_STRING2)CALL WMENUSETSTATE(ID_ISGCLCNODES,2,1) IF(MESSAGE%VALUE2.EQ.IDF_STRING3)CALL WMENUSETSTATE(ID_ISGCRSSCTNS,2,1) IF(MESSAGE%VALUE2.EQ.IDF_STRING4)CALL WMENUSETSTATE(ID_ISGSEGNODES,2,1) IF(MESSAGE%VALUE2.EQ.IDF_STRING5)CALL WMENUSETSTATE(ID_ISGSTUWEN,2,1) IF(MESSAGE%VALUE2.EQ.IDF_STRING6)CALL WMENUSETSTATE(ID_ISGQHR,2,1) CALL IDFPLOTFAST(1) ENDIF END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%WIN) CASE (ID_DISGEDIT) SELECT CASE (MESSAGE%VALUE1) CASE (ID_UPDATE) CALL IDFPLOTFAST(1) CASE(IDHELP) CALL IMODGETHELP('4.4.3','MMO.IGO.ISGEdit') CASE(IDCANCEL) CALL ISGEDITCLOSE(1) END SELECT CASE (ID_DISGEDITTAB1) SELECT CASE (MESSAGE%VALUE1) CASE (ID_GRID) CALL ISGGRIDMAIN() CASE (ID_PROFILE) CALL ISGPROFILE CASE (ID_DRAW) CALL ISGADD() CASE(ID_ZOOMTO) CALL ISGZOOMTO() CASE (ID_SAVE) ISAVE=0; CALL ISGSAVE(ISAVE,0) CASE(ID_SAVEAS) ISAVE=2; CALL ISGSAVE(ISAVE,0) CASE (ID_FIND) CALL ISGFIND() CASE (ID_RECORDS) CALL ISGATTRIBUTES() CASE(ID_DELETE) CALL WDIALOGGETMENU(IDF_MENU1,ISG(1:NISG)%ILIST) CALL WINDOWSELECT(0) IF(SUM(ISG(1:NISG)%ILIST).EQ.1)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete segment ['//TRIM(ISG(ISELISG)%SNAME)//'] ?','Question') IF(WINFODIALOG(4).EQ.1)THEN CALL WCURSORSHAPE(CURHOURGLASS) CALL WINDOWOUTSTATUSBAR(4,'Removing '//TRIM(ISG(ISELISG)%SNAME)//' ...') CALL ISGDEL() CALL ISGDELCLOSE() CALL WCURSORSHAPE(CURARROW) ENDIF ELSE CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the selected segments ?','Question') IF(WINFODIALOG(4).EQ.1)THEN CALL WCURSORSHAPE(CURHOURGLASS) I=0 DO I=I+1 IF(I.GT.NISG)EXIT IF(ISG(I)%ILIST.EQ.1)THEN ISELISG=I CALL WMESSAGEPEEK(JTYPE,DMESSAGE) CALL WINDOWOUTSTATUSBAR(4,'Removing '//TRIM(ISG(ISELISG)%SNAME)//' ...') CALL ISGDEL() I=I-1 ENDIF END DO CALL ISGDELCLOSE() CALL WCURSORSHAPE(CURARROW) ENDIF ENDIF CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(4,'') END SELECT END SELECT END SELECT END SUBROUTINE ISGEDITMAIN !###==================================================================== SUBROUTINE ISGPROFILE() !###==================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE CALL WDIALOGSELECT(ID_DISGEDITTAB1) CALL WDIALOGGETMENU(IDF_MENU1,ISG(1:NISG)%ILIST) IF(SUM(ISG(1:NISG)%ILIST).NE.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to select just 1 Segment before entering the length-profiles','Oops!') RETURN ENDIF CALL UTL_MESSAGEHANDLE(0) CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(4,'Getting data ...') DO ISELISG=1,NISG IF(ISG(ISELISG)%ILIST.EQ.1)EXIT END DO CALL WDIALOGLOAD(ID_DISGPROFILE,ID_DISGPROFILE) CALL WDIALOGPUTMENU(IDF_MENU1,ISG%SNAME,NISG,ISELISG) CALL WDIALOGPUTIMAGE(ID_ZOOMIN,ID_ICONZOOMIN) CALL WDIALOGPUTIMAGE(ID_ZOOMOUT,ID_ICONZOOMOUT) CALL WDIALOGPUTIMAGE(ID_ZOOMFULL,ID_ICONZOOMFULL) CALL WDIALOGPUTIMAGE(ID_ZOOMBOX,ID_ICONZOOMBOX) CALL WDIALOGPUTIMAGE(ID_MOVE,ID_ICONMOVE) CALL WDIALOGCLEARFIELD(IDF_LABEL3) CALL WDIALOGCLEARFIELD(IDF_LABEL5) CALL WDIALOGCLEARFIELD(IDF_LABEL6) CALL WDIALOGCLEARFIELD(IDF_LABEL7) CALL WDIALOGCOLOUR(IDF_LABEL3,INVERSECOLOUR(ICLRSD),ICLRSD) CALL WDIALOGCOLOUR(IDF_LABEL5,INVERSECOLOUR(ICLRST),ICLRST) CALL WDIALOGCOLOUR(IDF_LABEL6,INVERSECOLOUR(ICLRSC),ICLRSC) CALL WDIALOGCOLOUR(IDF_LABEL7,INVERSECOLOUR(ICLRQH),ICLRQH) CALL WDIALOGSHOW(-1,-1,0,3) CALL ISGPROFILEGETDATES() CALL ISGPROFILEDATA() CALL UTL_MESSAGEHANDLE(1) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (MOUSEMOVE) CALL ISGPROFILENAMES(MESSAGE%GX,MESSAGE%GY,0,(/0,0,0,0/)) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (IDF_CHECK1,IDF_CHECK2,IDF_CHECK3,IDF_CHECK4) CALL ISGPROFILEDATA() CASE (IDF_MENU1) CALL ISGPROFILEGETDATES() CALL ISGPROFILEDATA() CASE (IDF_MENU2) CALL ISGPROFILEDATA() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_ZOOMIN,ID_ZOOMOUT,ID_ZOOMFULL,ID_ZOOMBOX,ID_MOVE) CASE (IDOK,IDCANCEL) EXIT CASE (IDHELP) CALL IMODGETHELP('4.4.3.4','MMO.IGO.IE.Prof') END SELECT CASE (EXPOSE,RESIZE) CALL ISGPROFILEDATA() END SELECT ENDDO IF(ALLOCATED(IDATES))DEALLOCATE(IDATES) IF(ALLOCATED(CDATES))DEALLOCATE(CDATES) CALL WDIALOGSELECT(ID_DISGPROFILE) CALL WDIALOGUNLOAD() CALL IGRSELECT(DRAWWIN,MPW%IWIN) END SUBROUTINE ISGPROFILE !###==================================================================== SUBROUTINE ISGPROFILENAMES(X,Y,IPLOT,ICHECK) !###==================================================================== IMPLICIT NONE INTEGER,PARAMETER :: N=7 REAL,INTENT(IN) :: X,Y INTEGER,INTENT(IN) :: IPLOT INTEGER,DIMENSION(4),INTENT(IN) :: ICHECK INTEGER :: I,I1,I2,IISG REAL :: MIND,YS,DS,DX CHARACTER(LEN=30) :: CNAME REAL,DIMENSION(4) :: AREA,GNIT CALL WDIALOGPUTREAL(IDF_REAL1,X) CALL WDIALOGPUTREAL(IDF_REAL2,Y) CALL WDIALOGGETMENU(IDF_MENU1,IISG) DS=1.0/REAL(N) YS=0.0 IF(IPLOT.EQ.1)THEN AREA(1)=WINFOGRREAL(GRAPHICSAREAMINX) AREA(2)=WINFOGRREAL(GRAPHICSAREAMAXX) AREA(3)=WINFOGRREAL(GRAPHICSAREAMINY) AREA(4)=WINFOGRREAL(GRAPHICSAREAMAXY) GNIT(1)=WINFOGRREAL(GRAPHICSUNITMINX) GNIT(2)=WINFOGRREAL(GRAPHICSUNITMAXX) GNIT(3)=WINFOGRREAL(GRAPHICSUNITMINY) GNIT(4)=WINFOGRREAL(GRAPHICSUNITMAXY) CALL IGRAREA(AREA(1),AREA(4),AREA(2),1.0) CALL IGRUNITS(GNIT(1),0.0,GNIT(2),1.0) CALL IGRCOLOURN(WRGB(50,50,50)) YS=1.0 DO I=1,N-2 YS=YS-DS CALL IGRJOIN(GNIT(1),YS+(0.5*DS),GNIT(2),YS+(0.5*DS)) END DO YS= 1.0 DX=(GNIT(2)-GNIT(1))/250.0 ENDIF YS=YS-DS CALL IGRCOLOURN(ICLRSD) !#calc.points I1 =ISG(IISG)%ICLC I2 =ISG(IISG)%ICLC+ISG(IISG)%NCLC-1 MIND =10.0E10 DO I=I1,I2 IF(ABS(ISD(I)%DIST-X).LT.MIND)THEN CNAME=ISD(I)%CNAME MIND=ABS(ISD(I)%DIST-X) ENDIF IF(IPLOT.EQ.1)CALL IGRRECTANGLE(ISD(I)%DIST-DX,YS,ISD(I)%DIST+DX,YS-DS) END DO CALL WDIALOGPUTSTRING(IDF_LABEL3,CNAME) YS=YS-DS CALL IGRCOLOURN(ICLRST) !#structures IF(ISG(IISG)%NSTW.LE.0)THEN CALL WDIALOGCLEARFIELD(IDF_LABEL5) ELSE I1 =ISG(IISG)%ISTW I2 =ISG(IISG)%ISTW+ISG(IISG)%NSTW-1 MIND =10.0E10 DO I=I1,I2 IF(ABS(IST(I)%DIST-X).LT.MIND)THEN CNAME=IST(I)%CNAME MIND=ABS(IST(I)%DIST-X) ENDIF IF(IPLOT.EQ.1)CALL IGRRECTANGLE(IST(I)%DIST-DX,YS,IST(I)%DIST+DX,YS-DS) END DO CALL WDIALOGPUTSTRING(IDF_LABEL5,CNAME) ENDIF YS=YS-DS CALL IGRCOLOURN(ICLRSC) !#cross-sections IF(ISG(IISG)%NCRS.LE.0)THEN CALL WDIALOGCLEARFIELD(IDF_LABEL6) ELSE I1 =ISG(IISG)%ICRS I2 =ISG(IISG)%ICRS+ISG(IISG)%NCRS-1 MIND =10.0E10 DO I=I1,I2 IF(ABS(ISC(I)%DIST-X).LT.MIND)THEN CNAME=ISC(I)%CNAME MIND=ABS(ISC(I)%DIST-X) ENDIF IF(IPLOT.EQ.1)CALL IGRRECTANGLE(ISC(I)%DIST-DX,YS,ISC(I)%DIST+DX,YS-DS) END DO CALL WDIALOGPUTSTRING(IDF_LABEL6,CNAME) ENDIF YS=YS-DS CALL IGRCOLOURN(ICLRQH) !#qh-relationships IF(ISG(IISG)%NQHR.LE.0)THEN CALL WDIALOGCLEARFIELD(IDF_LABEL7) ELSE I1 =ISG(IISG)%IQHR I2 =ISG(IISG)%IQHR+ISG(IISG)%NQHR-1 MIND =10.0E10 DO I=I1,I2 IF(ABS(ISQ(I)%DIST-X).LT.MIND)THEN CNAME=ISQ(I)%CNAME MIND=ABS(ISQ(I)%DIST-X) ENDIF IF(IPLOT.EQ.1)CALL IGRRECTANGLE(ISQ(I)%DIST-DX,YS,ISQ(I)%DIST+DX,YS-DS) END DO CALL WDIALOGPUTSTRING(IDF_LABEL7,CNAME) ENDIF IF(IPLOT.EQ.1)THEN CALL IGRAREA(AREA(1),AREA(3),AREA(2),AREA(4)) CALL IGRUNITS(GNIT(1),GNIT(3),GNIT(2),GNIT(4)) ENDIF END SUBROUTINE ISGPROFILENAMES !###==================================================================== SUBROUTINE ISGPROFILEGETDATES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,N,IISG CALL WDIALOGGETMENU(IDF_MENU1,IISG) !# get max. number of idates() N=0 !#calc. points DO I=ISG(IISG)%ICLC,ISG(IISG)%ICLC+ISG(IISG)%NCLC-1 N=N+ISD(I)%N END DO !#structures DO I=ISG(IISG)%ISTW,ISG(IISG)%ISTW+ISG(IISG)%NSTW-1 N=N+IST(I)%N END DO IF(ALLOCATED(IDATES))DEALLOCATE(IDATES) ALLOCATE(IDATES(N)) !#find them ... !#calc. points N=0 DO I=ISG(IISG)%ICLC,ISG(IISG)%ICLC+ISG(IISG)%NCLC-1 DO J=ISD(I)%IREF,ISD(I)%IREF+ISD(I)%N-1 N =N+1 IDATES(N)=DATISD(J)%IDATE END DO END DO !#structures DO I=ISG(IISG)%ISTW,ISG(IISG)%ISTW+ISG(IISG)%NSTW-1 DO J=IST(I)%IREF,IST(I)%IREF+IST(I)%N-1 N =N+1 IDATES(N)=DATIST(J)%IDATE END DO END DO !#sort them CALL SHELLSORT_INT(N,IDATES) !#remove doubles I=1 J=1 DO I=I+1 IF(I.EQ.N)EXIT IF(IDATES(I).NE.IDATES(I-1))THEN J =J+1 IDATES(J)=IDATES(I) ENDIF END DO N=J IF(ALLOCATED(CDATES))DEALLOCATE(CDATES) ALLOCATE(CDATES(N)) DO I=1,N WRITE(CDATES(I),'(I8)') IDATES(I) END DO CALL WDIALOGPUTMENU(IDF_MENU2,CDATES,N,1) END SUBROUTINE ISGPROFILEGETDATES !###==================================================================== SUBROUTINE ISGPROFILEDATA() !###==================================================================== IMPLICIT NONE REAL,ALLOCATABLE,DIMENSION(:) :: XSTG,XSTW,XBOT,XCRS,XQHR REAL,ALLOCATABLE,DIMENSION(:) :: YSTG,YBOT INTEGER :: NSTG,NBOT,NCRS,NQHR,NSTW INTEGER :: IISG,I,II,J,K,IDATE REAL :: XMIN,XMAX,YMIN,YMAX,H1,H2 INTEGER,DIMENSION(4) :: ICHECK CHARACTER(LEN=8) :: TMP_DATE CALL WDIALOGGETMENU(IDF_MENU1,IISG) CALL WDIALOGGETMENU(IDF_MENU2,IDATE) TMP_DATE=CDATES(IDATE) READ(TMP_DATE,'(I8)') IDATE ! READ(CDATES(IDATE),'(I8)') IDATE CALL WDIALOGGETCHECKBOX(IDF_CHECK1,ICHECK(1)) IF(ISG(IISG)%NSTW.GT.0)THEN CALL WDIALOGFIELDSTATE(IDF_CHECK2,1) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,ICHECK(2)) ELSE CALL WDIALOGFIELDSTATE(IDF_CHECK2,0) ICHECK(2)=0 ENDIF IF(ISG(IISG)%NCRS.GT.0)THEN CALL WDIALOGFIELDSTATE(IDF_CHECK3,1) CALL WDIALOGGETCHECKBOX(IDF_CHECK3,ICHECK(3)) ELSE CALL WDIALOGFIELDSTATE(IDF_CHECK3,0) ICHECK(3)=0 ENDIF IF(ISG(IISG)%NQHR.GT.0)THEN CALL WDIALOGFIELDSTATE(IDF_CHECK4,1) CALL WDIALOGGETCHECKBOX(IDF_CHECK4,ICHECK(4)) ELSE CALL WDIALOGFIELDSTATE(IDF_CHECK4,0) ICHECK(4)=0 ENDIF IF(ALLOCATED(XSTG))DEALLOCATE(XSTG) IF(ALLOCATED(XSTW))DEALLOCATE(XSTW) IF(ALLOCATED(YSTG))DEALLOCATE(YSTG) IF(ALLOCATED(XBOT))DEALLOCATE(XBOT) IF(ALLOCATED(YBOT))DEALLOCATE(YBOT) IF(ALLOCATED(XCRS))DEALLOCATE(XCRS) IF(ALLOCATED(XQHR))DEALLOCATE(XQHR) NSTG=ISG(IISG)%NCLC+2*ISG(IISG)%NSTW+2 NBOT=ISG(IISG)%NCLC+2 NCRS=ISG(IISG)%NCRS NQHR=ISG(IISG)%NQHR NSTW=ISG(IISG)%NSTW ALLOCATE(XSTG(NSTG),YSTG(NSTG)) ALLOCATE(XBOT(NBOT),YBOT(NBOT)) ALLOCATE(XSTW(NSTW)) ALLOCATE(XCRS(NCRS)) ALLOCATE(XQHR(NQHR)) !#calc. points J=0 DO I=ISG(IISG)%ICLC,ISG(IISG)%ICLC+ISG(IISG)%NCLC-1 DO K=ISD(I)%IREF,ISD(I)%IREF+ISD(I)%N-1 IF(DATISD(K)%IDATE.GE.IDATE)EXIT END DO IF(K.LE.ISD(I)%IREF+ISD(I)%N-1)THEN J =J+1 XSTG(J)=ISD(I)%DIST XBOT(J)=ISD(I)%DIST YSTG(J)=DATISD(K)%WLVL YBOT(J)=DATISD(K)%BTML IF(I.EQ.ISG(IISG)%ICLC) H1=YSTG(J) IF(I.EQ.ISG(IISG)%ICLC+ISG(IISG)%NCLC-1)H2=YSTG(J) ENDIF END DO !#structures II=0 DO I=ISG(IISG)%ISTW,ISG(IISG)%ISTW+ISG(IISG)%NSTW-1 DO K=IST(I)%IREF,IST(I)%IREF+IST(I)%N-1 IF(DATIST(K)%IDATE.GE.IDATE)EXIT END DO IF(K.LE.IST(I)%IREF+IST(I)%N-1)THEN J =J+1 II =II+1 XSTG(J) =IST(I)%DIST XSTW(II)=IST(I)%DIST YSTG(J)=DATIST(K)%WLVL_UP J =J+1 !#depends on flow-direction IF(H1.LT.H2)THEN XSTG(J)=IST(I)%DIST-0.01 ELSE XSTG(J)=IST(I)%DIST+0.01 ENDIF YSTG(J)=DATIST(K)%WLVL_DOWN ENDIF END DO !#cross-sections J=0 DO I=ISG(IISG)%ICRS,ISG(IISG)%ICRS+ISG(IISG)%NCRS-1 J =J+1 XCRS(J)=ISC(I)%DIST END DO !#qh-relationships J=0 DO I=ISG(IISG)%IQHR,ISG(IISG)%IQHR+ISG(IISG)%NQHR-1 J =J+1 XQHR(J)=ISQ(I)%DIST END DO !#scale vertical on horizontal to yield ratio 1:1 (for text-plotting) XMIN=MINVAL(XSTG(1:NSTG-2)) XMAX=MAXVAL(XSTG(1:NSTG-2)) YMAX=-10.0E10 YMIN= 10.0E10 YMIN=MIN(YMIN,MINVAL(YSTG(1:NSTG-2))) YMAX=MAX(YMAX,MAXVAL(YSTG(1:NSTG-2))) YMIN=MIN(YMIN,MINVAL(YBOT(1:NBOT-2))) YMAX=MAX(YMAX,MAXVAL(YBOT(1:NBOT-2))) CALL ISGPROFILEEXTENT(XMIN,XMAX,YMIN,YMAX) !#sort on x CALL UTL_QKSORT2(XSTG,YSTG,NSTG,NSTG-2) CALL UTL_QKSORT2(XBOT,YBOT,NBOT,NBOT-2) !##extent polygons for each attribute J =NSTG-1 XSTG(J)=XMAX YSTG(J)=YMIN J =J+1 XSTG(J)=XMIN YSTG(J)=YMIN J =NBOT-1 XBOT(J)=XMAX YBOT(J)=YMIN J =J+1 XBOT(J)=XMIN YBOT(J)=YMIN !#start plotting waterlevels incl. structures CALL ISGPROFILEPLOT(XSTG,YSTG,NSTG,1,WRGB(119,219,214),ICLRSD,ICHECK(1),YMIN) ! waterlevel - filled+vert.lines CALL ISGPROFILEPLOT(XSTW,XSTW,NSTW,2,WRGB(0,0,0) ,ICLRST,ICHECK(2),YMIN) ! structures - vert.lines CALL ISGPROFILEPLOT(XCRS,XCRS,NCRS,3,WRGB(0,0,0) ,ICLRSC,ICHECK(3),YMIN) ! cross-sections - vert.lines CALL ISGPROFILEPLOT(XQHR,XQHR,NQHR,4,WRGB(0,0,0) ,ICLRQH,ICHECK(4),YMIN) ! qh-relations - vert.lines CALL ISGPROFILEPLOT(XBOT,YBOT,NBOT,5,WRGB(160,136,121),ICLRSD,0 ,YMIN) ! bottomlevel - filled-no lines CALL ISGPROFILENAMES(XSTG(1),YSTG(1),1,ICHECK) IF(ALLOCATED(XSTG))DEALLOCATE(XSTG) IF(ALLOCATED(YSTG))DEALLOCATE(YSTG) IF(ALLOCATED(XBOT))DEALLOCATE(XBOT) IF(ALLOCATED(YBOT))DEALLOCATE(YBOT) IF(ALLOCATED(XCRS))DEALLOCATE(XCRS) IF(ALLOCATED(XQHR))DEALLOCATE(XQHR) IF(ALLOCATED(XSTW))DEALLOCATE(XSTW) END SUBROUTINE ISGPROFILEDATA !###==================================================================== SUBROUTINE ISGPROFILEPLOT(X,Y,NDIM,ITOPIC,ICLR,JCLR,ICHECK,YMIN) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ITOPIC,NDIM,ICLR,ICHECK,JCLR REAL,INTENT(IN) :: YMIN REAL,INTENT(IN),DIMENSION(NDIM) :: X,Y INTEGER :: I SELECT CASE (ITOPIC) !#waterlevels/bottomlevels CASE (1,5) CALL IGRCOLOURN(ICLR) CALL IGRPOLYGONCOMPLEX(X,Y,NDIM) END SELECT IF(ICHECK.EQ.0)RETURN CALL IGRCOLOURN(JCLR) DO I=1,NDIM CALL IGRJOIN(X(I),YMIN,X(I),Y(I)) ENDDO END SUBROUTINE ISGPROFILEPLOT !###==================================================================== SUBROUTINE ISGPROFILEEXTENT(XMIN,XMAX,YMIN,YMAX) !###==================================================================== IMPLICIT NONE REAL,PARAMETER :: EDGE=0.01 !% REAL,PARAMETER :: TEDGE=0.15 !% REAL,INTENT(INOUT) :: XMIN,XMAX,YMIN,YMAX INTEGER :: IW,IH REAL :: FC,DX,DY CALL IGRFILLPATTERN(SOLID) IW=WINFODIALOGFIELD(IDF_PICTURE1,FIELDWIDTH) IH=WINFODIALOGFIELD(IDF_PICTURE1,FIELDHEIGHT) FC=REAL(IW)/REAL(IH) CALL IGRSELECT(DRAWFIELD,IDF_PICTURE1) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRUNITS(0.0,0.0,1.0,1.0) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRRECTANGLE(0.0,0.0,1.0,1.0) IF(FC.GT.1.0)THEN CALL IGRAREA(EDGE/FC,EDGE,1.0-(EDGE/FC),1.0-TEDGE) ELSE CALL IGRAREA(EDGE,EDGE/FC,1.0-EDGE,1.0-(TEDGE/FC)) ENDIF DX=(XMAX-XMIN)/100.0 DY=(YMAX-YMIN)/100.0 IF(DY.EQ.0.0)DY=0.5 !WRITE(*,*) XMIN-DX,YMIN-DY,XMAX+DX,YMAX+DY CALL IGRUNITS(XMIN-DX,YMIN-DY,XMAX+DX,YMAX+DY) YMIN=YMIN-DY END SUBROUTINE ISGPROFILEEXTENT !###==================================================================== SUBROUTINE ISGFIND() !###==================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,I INTEGER,ALLOCATABLE,DIMENSION(:) :: ILIST,JLIST CHARACTER(LEN=50),ALLOCATABLE,DIMENSION(:) :: SNAME IF(ALLOCATED(ILIST))DEALLOCATE(ILIST) IF(ALLOCATED(JLIST))DEALLOCATE(JLIST) IF(ALLOCATED(SNAME))DEALLOCATE(SNAME) ALLOCATE(ILIST(NISG),SNAME(NISG),JLIST(NISG)) CALL WDIALOGLOAD(ID_DISGFIND,ID_DISGFIND) CALL ISGFINDFIELDS() CALL WDIALOGFIELDSTATE(IDOK,I) CALL WDIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (IDF_CHECK1,IDF_CHECK2,IDF_CHECK3,IDF_CHECK4,IDF_CHECK5) CALL ISGFINDFIELDS() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDCANCEL) EXIT CASE (ID_GETTHEM) CALL ISGFINDIT(ILIST,JLIST,SNAME) CASE (IDOK) CALL WDIALOGGETMENU(IDF_MENU1,JLIST) EXIT CASE (IDHELP) CALL IMODGETHELP('4.4.3.3','MMO.IGO.IE.Search') END SELECT END SELECT ENDDO CALL WDIALOGSELECT(ID_DISGFIND) CALL WDIALOGUNLOAD() IF(MESSAGE%VALUE1.EQ.IDOK)THEN ISG%ILIST=0 DO I=1,NISG IF(ILIST(I).GT.0.AND.ILIST(I).LE.NISG)ISG(ILIST(I))%ILIST=1 END DO CALL WDIALOGSELECT(ID_DISGEDITTAB1) CALL WDIALOGPUTMENU(IDF_MENU1,ISG%SNAME,NISG,ISG%ILIST) CALL ISGFIELDS() CALL IDFPLOTFAST(1) ENDIF IF(ALLOCATED(ILIST))DEALLOCATE(ILIST) IF(ALLOCATED(JLIST))DEALLOCATE(JLIST) IF(ALLOCATED(SNAME))DEALLOCATE(SNAME) END SUBROUTINE ISGFIND !###==================================================================== SUBROUTINE ISGFINDFIELDS() !###==================================================================== IMPLICIT NONE INTEGER,DIMENSION(5) :: IOPT INTEGER :: I CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IOPT(1)) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IOPT(2)) CALL WDIALOGGETCHECKBOX(IDF_CHECK3,IOPT(3)) CALL WDIALOGGETCHECKBOX(IDF_CHECK4,IOPT(4)) CALL WDIALOGGETCHECKBOX(IDF_CHECK5,IOPT(5)) I=0 IF(SUM(IOPT).NE.0)I=1 CALL WDIALOGFIELDSTATE(ID_GETTHEM,I) END SUBROUTINE ISGFINDFIELDS !###==================================================================== SUBROUTINE ISGFINDIT(ILIST,JLIST,SNAME) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(OUT),DIMENSION(NISG) :: ILIST,JLIST CHARACTER(LEN=*),INTENT(OUT),DIMENSION(NISG) :: SNAME INTEGER :: I,J,K,ICASE CHARACTER(LEN=30) :: STRING INTEGER,DIMENSION(5) :: IOPT LOGICAL :: LEX CALL WDIALOGGETSTRING(IDF_STRING1,STRING) IF(TRIM(STRING).EQ.'')STRING='*' CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IOPT(1)) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IOPT(2)) CALL WDIALOGGETCHECKBOX(IDF_CHECK3,IOPT(3)) CALL WDIALOGGETCHECKBOX(IDF_CHECK4,IOPT(4)) CALL WDIALOGGETCHECKBOX(IDF_CHECK5,IOPT(5)) CALL WDIALOGGETCHECKBOX(IDF_CHECK6,ICASE) ILIST=0 K =0 !#number of segments DO I=1,NISG LEX=.FALSE. !## segment names IF(IOPT(1).EQ.1)THEN IF(ICASE.EQ.0)THEN LEX=EQUALNAMES(TRIM(UTL_CAP(STRING,'U')),TRIM(UTL_CAP(ISG(I)%SNAME,'U'))) ELSEIF(ICASE.EQ.1)THEN LEX=EQUALNAMES(TRIM(STRING),TRIM(ISG(I)%SNAME)) ENDIF ENDIF !## calc.pnts IF(.NOT.LEX.AND.IOPT(2).EQ.1)THEN DO J=ISG(I)%ICLC,ISG(I)%ICLC+ISG(I)%NCLC-1 IF(ICASE.EQ.0)THEN LEX=EQUALNAMES(TRIM(UTL_CAP(STRING,'U')),TRIM(UTL_CAP(ISD(J)%CNAME,'U'))) ELSEIF(ICASE.EQ.1)THEN LEX=EQUALNAMES(TRIM(STRING),TRIM(ISD(J)%CNAME)) ENDIF IF(LEX)EXIT END DO ENDIF !## structures IF(.NOT.LEX.AND.IOPT(3).EQ.1)THEN DO J=ISG(I)%ISTW,ISG(I)%ISTW+ISG(I)%NSTW-1 IF(ICASE.EQ.0)THEN LEX=EQUALNAMES(TRIM(UTL_CAP(STRING,'U')),TRIM(UTL_CAP(IST(J)%CNAME,'U'))) ELSEIF(ICASE.EQ.1)THEN LEX=EQUALNAMES(TRIM(STRING),TRIM(IST(J)%CNAME)) ENDIF IF(LEX)EXIT ENDDO ENDIF !#cross-sections IF(.NOT.LEX.AND.IOPT(4).EQ.1)THEN DO J=ISG(I)%ICRS,ISG(I)%ICRS+ISG(I)%NCRS-1 IF(ICASE.EQ.0)THEN LEX=EQUALNAMES(TRIM(UTL_CAP(STRING,'U')),TRIM(UTL_CAP(ISC(J)%CNAME,'U'))) ELSEIF(ICASE.EQ.1)THEN LEX=EQUALNAMES(TRIM(STRING),TRIM(ISC(J)%CNAME)) ENDIF IF(LEX)EXIT END DO ENDIF !## qh-relationships IF(.NOT.LEX.AND.IOPT(5).EQ.1)THEN DO J=ISG(I)%IQHR,ISG(I)%IQHR+ISG(I)%NQHR-1 IF(ICASE.EQ.0)THEN LEX=EQUALNAMES(TRIM(UTL_CAP(STRING,'U')),TRIM(UTL_CAP(ISQ(J)%CNAME,'U'))) ELSEIF(ICASE.EQ.1)THEN LEX=EQUALNAMES(TRIM(STRING),TRIM(ISQ(J)%CNAME)) ENDIF IF(LEX)EXIT END DO ENDIF !#name found within current segment IF(LEX)THEN K =K+1 ILIST(K)=I JLIST(K)=1 SNAME(K)=ISG(I)%SNAME ENDIF END DO IF(K.GT.0)THEN CALL WDIALOGFIELDSTATE(IDOK,1) CALL WDIALOGPUTMENU(IDF_MENU1,SNAME,K,JLIST) ELSE CALL WDIALOGFIELDSTATE(IDOK,0) CALL WDIALOGCLEARFIELD(IDF_MENU1) ENDIF CALL WDIALOGPUTSTRING(IDF_LABEL3,TRIM(ITOS(K))//' Segments Found') END SUBROUTINE ISGFINDIT !###==================================================================== SUBROUTINE ISGZOOMTO() !###==================================================================== IMPLICIT NONE INTEGER :: IS,I,J REAL :: MINX,MAXX,MINY,MAXY,X,Y CALL WDIALOGSELECT(ID_DISGEDITTAB1) CALL WDIALOGGETMENU(IDF_MENU1,ISG(1:NISG)%ILIST) IF(SUM(ISG(1:NISG)%ILIST).EQ.0)RETURN J=0 DO IS=1,NISG !#selected, get minx,maxx,miny,maxy IF(ISG(IS)%ILIST.EQ.1)THEN DO I=ISG(IS)%ISEG,ISG(IS)%ISEG+ISG(IS)%NSEG-1 J=J+1 IF(J.EQ.1)THEN MINX=ISP(I)%X MAXX=MINX MINY=ISP(I)%Y MAXY=MINY ELSE MINX=MIN(MINX,ISP(I)%X) MAXX=MAX(MAXX,ISP(I)%X) MINY=MIN(MINY,ISP(I)%Y) MAXY=MAX(MAXY,ISP(I)%Y) ENDIF ENDDO ENDIF END DO MPW%XMIN=MINX MPW%XMAX=MAXX MPW%YMIN=MINY MPW%YMAX=MAXY !#increase window to count for y-size! X =(MPW%XMAX-MPW%XMIN)/4.0 Y =(MPW%YMAX-MPW%YMIN)/4.0 MPW%XMAX=MPW%XMAX+X MPW%XMIN=MPW%XMIN-X MPW%YMAX=MPW%YMAX+Y MPW%YMIN=MPW%YMIN-Y CALL IDFPLOTFAST(1) END SUBROUTINE ISGZOOMTO !###==================================================================== SUBROUTINE ISGGRIDMAIN() !###==================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE LOGICAL :: LOKAY CALL WDIALOGLOAD(ID_DISGEDITGRID,ID_DISGEDITGRID) CALL WDIALOGTITLE('ISG Rasterize') CALL WDIALOGPUTMENU(IDF_MENU1,CDATE,12,4) CALL WDIALOGPUTMENU(IDF_MENU2,CDATE,12,3) CALL WDIALOGPUTINTEGER(IDF_INTEGER1,14) CALL WDIALOGPUTINTEGER(IDF_INTEGER2,28) CALL WDIALOGPUTINTEGER(IDF_INTEGER3,1996) CALL WDIALOGPUTINTEGER(IDF_INTEGER4,2004) CALL WDIALOGPUTREAL(IDF_REAL1,25.0,'(F10.2)') CALL WDIALOGPUTREAL(IDF_REAL2,0.1,'(F10.2)') CALL WDIALOGSPINNERSTEP(IDF_REAL2,0.1,1.0) CALL WDIALOGPUTSTRING(IDF_LABEL2,'Minimal Waterdepth (m). Only to be used for the computation of the conductance.') CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU1,IDF_INTEGER1) CALL UTL_FILLDATES(IDF_INTEGER4,IDF_MENU2,IDF_INTEGER2) IF(SUM(ISG%NSTW).EQ.0)CALL WDIALOGFIELDSTATE(IDF_CHECK1,0) !## not allowed to compute weirs CALL ISGGRIDFIELDS() CALL WDIALOGSELECT(ID_DISGEDITTAB1) CALL WDIALOGGETMENU(IDF_MENU1,ISG(1:NISG)%ILIST) CALL WDIALOGSELECT(ID_DISGEDITGRID) IF(SUM(ISG(1:NISG)%ILIST).EQ.0)THEN CALL WDIALOGFIELDSTATE(IDF_RADIO5,0) ELSE CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO5) ENDIF CALL WDIALOGSHOW(0,0,0,2) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_CHECK1) CALL ISGGRIDFIELDS() CASE (IDF_INTEGER2,IDF_MENU1,IDF_INTEGER1, & IDF_INTEGER4,IDF_MENU2,IDF_INTEGER3) CALL UTL_FILLDATES(IDF_INTEGER3,IDF_MENU1,IDF_INTEGER1) CALL UTL_FILLDATES(IDF_INTEGER4,IDF_MENU2,IDF_INTEGER2) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK) CALL ISGGRIDSTART(LOKAY) IF(LOKAY)EXIT CASE (IDCANCEL) EXIT CASE (IDHELP) CALL IMODGETHELP('4.4.3.5','MMO.IGO.IE.Rast') END SELECT END SELECT ENDDO CALL WDIALOGSELECT(ID_DISGEDITGRID) CALL WDIALOGUNLOAD() END SUBROUTINE ISGGRIDMAIN !###====================================================================== SUBROUTINE ISGGRIDSTART(LOKAY) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE LOGICAL,INTENT(OUT) :: LOKAY INTEGER :: I,J,K,NROW,NCOL,ITYPE,IU,NLAY CHARACTER(LEN=256) :: LINE INTEGER,DIMENSION(11) :: ID DATA ID/IDF_LABEL1 ,IDF_LABEL3 ,IDF_LABEL5 ,IDF_LABEL7 ,IDF_LABEL9,IDF_LABEL11,IDF_LABEL13, & IDF_LABEL23,IDF_LABEL15,IDF_LABEL17,IDF_LABEL19/ REAL(KIND=8) :: IRECDBL TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:) :: TOP,BOT LOKAY=.FALSE. CALL WDIALOGUNDEFINED(0) CALL WDIALOGSELECT(ID_DISGEDITGRID) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,ISS) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO3,IDIM) CALL WDIALOGGETREAL(IDF_REAL1,CS) IF(CS.LE.0.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should give a cellsize greater dan 0.0!','Error'); RETURN ENDIF IF(ISS.EQ.2)THEN CALL WDIALOGGETINTEGER(IDF_INTEGER1,I); CALL WDIALOGGETINTEGER(IDF_INTEGER3,J); CALL WDIALOGGETMENU(IDF_MENU1,K) SDATE=J*10000+K*100+I CALL WDIALOGGETINTEGER(IDF_INTEGER2,I); CALL WDIALOGGETINTEGER(IDF_INTEGER4,J); CALL WDIALOGGETMENU(IDF_MENU2,K) EDATE=J*10000+K*100+I IF(SDATE.GT.EDATE)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You should specify the startdate to be earlier than/equal to the enddate',& 'Error'); RETURN ENDIF ENDIF CALL WDIALOGGETREAL(IDF_REAL2,MINDEPTH) CALL WDIALOGGETREAL(IDF_REAL3,NODATA) CALL WDIALOGGETREAL(IDF_REAL4,MAXWIDTH) CALL WDIALOGGETSTRING(IDF_STRING1,POSTFIX) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,ICDIST) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO6,IAVERAGE) CALL WDIALOGLOAD(ID_DISGEDITGRIDINFO,ID_DISGEDITGRIDINFO) CALL WDIALOGTITLE('ISG Rasterize Info') DO I=1,SIZE(ID) CALL WDIALOGPUTSTRING(ID(I),TRIM(FNAME(I))//TRIM(POSTFIX)//'.IDF') END DO IF(ICDIST.EQ.0)THEN DO I=9,SIZE(ID); CALL WDIALOGFIELDSTATE(ID(I),3); END DO CALL WDIALOGFIELDSTATE(IDF_LABEL16,3) CALL WDIALOGFIELDSTATE(IDF_LABEL18,3) CALL WDIALOGFIELDSTATE(IDF_LABEL21,3) ELSE CALL WDIALOGPUTSTRING(IDF_LABEL2,'Stages based upon linear interpolation of waterlevels within calculation points. '// & 'These will contain the effects of structures as well !') ENDIF IF(ISS.EQ.1)CALL WDIALOGPUTSTRING(IDF_LABEL22,'Attribute values will be computed as MEAN value over all periods '// & 'that EXIST within data') IF(ISS.EQ.2)CALL WDIALOGPUTSTRING(IDF_LABEL22,'Attribute values will be computed as MEDIAN values between the periods '// & TRIM(ITOS(SDATE))//' and '//TRIM(ITOS(EDATE))) CALL ISG2GRIDGETDIMENSION(IDIM,XMIN,YMIN,XMAX,YMAX,NROW,NCOL,CS) CALL WDIALOGPUTREAL(IDF_REAL1,XMIN,'(F10.2)'); CALL WDIALOGPUTREAL(IDF_REAL2,XMAX,'(F10.2)') CALL WDIALOGPUTREAL(IDF_REAL3,YMIN,'(F10.2)'); CALL WDIALOGPUTREAL(IDF_REAL4,YMAX,'(F10.2)') CALL WDIALOGPUTINTEGER(IDF_INTEGER1,NCOL); CALL WDIALOGPUTINTEGER(IDF_INTEGER2,NROW) IRECDBL=(DBLE(NROW)*DBLE(NCOL)*4.0D0)/2.0D0**30 CALL WDIALOGPUTREAL(IDF_INTEGER3,REAL(IRECDBL)) CALL WDIALOGPUTIMAGE(ID_CALC,ID_ICONCALC,1) CALL WDIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_CALC) CALL WDIALOGGETREAL(IDF_REAL1,XMIN); CALL WDIALOGGETREAL(IDF_REAL2,XMAX) CALL WDIALOGGETREAL(IDF_REAL3,YMIN); CALL WDIALOGGETREAL(IDF_REAL4,YMAX) CALL UTL_IDFSNAPTOGRID(XMIN,XMAX,YMIN,YMAX,CS,NCOL,NROW) CALL WDIALOGPUTREAL(IDF_REAL1,XMIN,'(F10.2)'); CALL WDIALOGPUTREAL(IDF_REAL2,XMAX,'(F10.2)') CALL WDIALOGPUTREAL(IDF_REAL3,YMIN,'(F10.2)'); CALL WDIALOGPUTREAL(IDF_REAL4,YMAX,'(F10.2)') CALL WDIALOGPUTINTEGER(IDF_INTEGER1,NCOL); CALL WDIALOGPUTINTEGER(IDF_INTEGER2,NROW) IRECDBL=(DBLE(NROW)*DBLE(NCOL)*4.0D0)/2.0D0**30 CALL WDIALOGPUTREAL(IDF_INTEGER3,REAL(IRECDBL)) CASE (IDCANCEL,IDOK) EXIT END SELECT END SELECT ENDDO CALL WDIALOGGETREAL(IDF_REAL1,XMIN); CALL WDIALOGGETREAL(IDF_REAL2,XMAX) CALL WDIALOGGETREAL(IDF_REAL3,YMIN); CALL WDIALOGGETREAL(IDF_REAL4,YMAX) CALL UTL_IDFSNAPTOGRID(XMIN,XMAX,YMIN,YMAX,CS,NCOL,NROW) CALL WDIALOGUNLOAD() IF(MESSAGE%VALUE1.EQ.IDCANCEL)RETURN CALL UTL_MESSAGEHANDLE(0) CALL WINDOWSELECT(0) ISIMGRO=0 DDATE=0 WDEPTH=0.0 ROOT=TRIM(PREFVAL(1))//'\TMP' NLAY=1; ALLOCATE(TOP(NLAY),BOT(NLAY)) DO I=1,NLAY; CALL IDFNULLIFY(TOP(I)); ENDDO DO I=1,NLAY; CALL IDFNULLIFY(BOT(I)); ENDDO ISAVE=1; LOKAY=ISG2GRIDMAIN(0,NLAY,TOP,BOT) CALL IDFDEALLOCATE(TOP,SIZE(TOP)); DEALLOCATE(TOP) CALL IDFDEALLOCATE(BOT,SIZE(BOT)); DEALLOCATE(BOT) CALL UTL_MESSAGEHANDLE(1) IF(LOKAY)THEN J=SIZE(ID); IF(ICDIST.EQ.0)J=9 DO I=1,J IF(I.EQ.2)CALL IDFINIT(IDFNAMEGIVEN=TRIM(PREFVAL(1))//'\TMP\'//TRIM(FNAME(I))//TRIM(POSTFIX)//'.IDF',LPLOT=.TRUE.) IF(I.NE.2)CALL IDFINIT(IDFNAMEGIVEN=TRIM(PREFVAL(1))//'\TMP\'//TRIM(FNAME(I))//TRIM(POSTFIX)//'.IDF',LPLOT=.FALSE.) END DO ENDIF END SUBROUTINE ISGGRIDSTART !###====================================================================== SUBROUTINE ISGGRIDFIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL WDIALOGSELECT(ID_DISGEDITGRID) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) I=ABS(I-1) CALL WDIALOGFIELDSTATE(IDF_INTEGER1,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER2,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,I) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,I) CALL WDIALOGFIELDSTATE(IDF_MENU1,I) CALL WDIALOGFIELDSTATE(IDF_MENU2,I) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,I) END SUBROUTINE ISGGRIDFIELDS !###==================================================================== SUBROUTINE ISGADD() !###==================================================================== IMPLICIT NONE INTEGER,PARAMETER :: MAXCRD=50 REAL,DIMENSION(:),ALLOCATABLE :: XCRD,YCRD INTEGER :: NCRD,I,ISEG,ICLC,ICRS,ISTW,IQHR REAL :: TDIST ALLOCATE(XCRD(MAXCRD),YCRD(MAXCRD)) CALL IMODMEASURE(XCRD,YCRD,MAXCRD,NCRD) IF(NCRD.LE.1)THEN DEALLOCATE(XCRD,YCRD) RETURN ENDIF TDIST=0.0 DO I=1,NCRD-1 TDIST=TDIST+SQRT((XCRD(I)-XCRD(I+1))**2.0+(YCRD(I)-YCRD(I+1))**2.0) END DO CALL ISGMEMORYISG(1) ISEG=NISP+1 ICLC=NISD+1 ICRS=NISC+1 ISTW=0!NIST IQHR=0!NISQ ISG(NISG)%SNAME='segment '//TRIM(ITOS(NISG)) ISG(NISG)%ISEG =ISEG ISG(NISG)%ICLC =ICLC ISG(NISG)%ICRS =ICRS ISG(NISG)%ISTW =ISTW ISG(NISG)%IQHR =IQHR ISG(NISG)%NSEG =0 ISG(NISG)%NCLC =0 ISG(NISG)%NCRS =0 ISG(NISG)%NSTW =0 ISG(NISG)%NQHR =0 CALL ISGMEMORYISP(NCRD,NISG,ISEG) !##put them properly within xyISG-array DO I=1,NCRD ISP(ISEG+I-1)%X=XCRD(I) ISP(ISEG+I-1)%Y=YCRD(I) END DO CALL ISGMEMORYISD(2,NISG,ICLC) ISD(ICLC)%N =0 ISD(ICLC)%IREF =0 ISD(ICLC)%DIST =0.0 ISD(ICLC)%CNAME ='CalcPnt FROM' ISD(ICLC+1)%N =0 ISD(ICLC+1)%IREF =0 ISD(ICLC+1)%DIST =TDIST ISD(ICLC+1)%CNAME='CalcPnt TO' DO I=0,1 ISD(ICLC+I)%IREF=NDISD+1 CALL ISGMEMORYDATISD(1,ICLC+I,ISEG) DATISD(ISEG)%IDATE=20081104 DATISD(ISEG)%WLVL =1.0 DATISD(ISEG)%BTML =0.0 DATISD(ISEG)%RESIS=1.0 DATISD(ISEG)%INFF =0.3 ENDDO CALL ISGMEMORYISC(1,NISG,ICRS) ISC(ICRS)%N =0 ISC(ICRS)%IREF =NDISC+1 ISC(ICRS)%DIST =TDIST/2.0 ISC(ICRS)%CNAME='CrossSection' CALL ISGMEMORYDATISC(3,ICRS,ISEG) DATISC(ISEG)%DISTANCE =-5.0 DATISC(ISEG)%BOTTOM = 5.0 DATISC(ISEG)%KM =25.0 DATISC(ISEG+1)%DISTANCE= 0.0 DATISC(ISEG+1)%BOTTOM = 0.0 DATISC(ISEG+1)%KM =25.0 DATISC(ISEG+2)%DISTANCE= 5.0 DATISC(ISEG+2)%BOTTOM = 5.0 DATISC(ISEG+2)%KM =25.0 DEALLOCATE(XCRD,YCRD) CALL WDIALOGSELECT(ID_DISGEDITTAB1) !#no selection otherwise line should be selected at once!!! ISG%ILIST=0 CALL WDIALOGPUTMENU(IDF_MENU1,ISG%SNAME,NISG,ISG%ILIST) CALL ISGFIELDS() CALL IDFPLOTFAST(1) END SUBROUTINE ISGADD !###==================================================================== SUBROUTINE ISGDEL() !###==================================================================== IMPLICIT NONE INTEGER :: ICLC,NCLC,ICRS,NCRS,ISEG,NSEG,I,ISTW,NSTW,IQHR,NQHR !#remove all calculation points on segment ICLC=ISG(ISELISG)%ICLC NCLC=ISG(ISELISG)%NCLC DO I=1,NCLC CALL ISGDELISD(ISELISG,ICLC) END DO !#remove all cross-sections on segment ICRS=ISG(ISELISG)%ICRS NCRS=ISG(ISELISG)%NCRS DO I=1,NCRS CALL ISGDELISC(ISELISG,ICRS) END DO !#remove all weirs on segment ISTW=ISG(ISELISG)%ISTW NSTW=ISG(ISELISG)%NSTW DO I=1,NSTW CALL ISGDELIST(ISELISG,ISTW) END DO !#remove all qh relationships on segment IQHR=ISG(ISELISG)%IQHR NQHR=ISG(ISELISG)%NQHR DO I=1,NQHR CALL ISGDELISQ(ISELISG,IQHR) END DO !#remove segment ISEG=ISG(ISELISG)%ISEG NSEG=ISG(ISELISG)%NSEG CALL ISGDELISP(ISELISG) !#remove entire segment in isg() variable ISG(ISELISG:NISG-1)=ISG(ISELISG+1:NISG) NISG =NISG-1 END SUBROUTINE ISGDEL !###==================================================================== SUBROUTINE ISGDELCLOSE() !###==================================================================== IMPLICIT NONE CALL WDIALOGSELECT(ID_DISGEDITTAB1) IF(NISG.GT.0)THEN ISG%ILIST=0 CALL WDIALOGPUTMENU(IDF_MENU1,ISG%SNAME,NISG,ISG%ILIST) ELSE NISG=0 CALL WDIALOGCLEARFIELD(IDF_MENU1) ENDIF CALL ISGFIELDS() !#none selected ISELISG=0 !#remove current line IF(SHPNO.GT.0)CALL POLYGON1DRAWSHAPE(SHPNO,SHPNO) SHPNO=ISGSHAPES CALL IDFPLOTFAST(1) END SUBROUTINE ISGDELCLOSE !###==================================================================== SUBROUTINE ISGATTRIBUTESMATH() !###==================================================================== IMPLICIT NONE END SUBROUTINE ISGATTRIBUTESMATH !###==================================================================== SUBROUTINE ISGATTRIBUTESSAVEOPEN(ID) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: ITAB CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGGETTAB(IDF_TAB1,ITAB) IF(ITAB.EQ.ID_DISGATTRIBUTESTAB1)THEN CALL ISGATTRIBUTESGETISDVALUES() CALL ISGATTRIBUTESSAVEOPENISD(ID) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB2)THEN CALL ISGATTRIBUTESGETISCVALUES() CALL ISGATTRIBUTESSAVEOPENISC(ID) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB3)THEN CALL ISGATTRIBUTESGETISPVALUES() CALL ISGATTRIBUTESSAVEOPENISP(ID) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB4)THEN CALL ISGATTRIBUTESGETISTVALUES() CALL ISGATTRIBUTESSAVEOPENIST(ID) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB5)THEN CALL ISGATTRIBUTESGETISQVALUES() CALL ISGATTRIBUTESSAVEOPENISQ(ID) ENDIF END SUBROUTINE ISGATTRIBUTESSAVEOPEN !###====================================================================== SUBROUTINE ISGATTRIBUTESSAVEOPENISD(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: IU,I,J,K,IOS CHARACTER(LEN=256) :: FNAME,LINE CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB1) CALL WDIALOGGETMENU(IDF_MENU1,J) IF(ID.EQ.ID_SAVEAS)THEN IF(.NOT.UTL_WSELECTFILE('Save Comma Separated File (*.csv)|*.csv|',& SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Save Comma Separated File (*.csv)'))RETURN IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE') WRITE(IU,'(A)') 'Date,WaterLevel,BottomLevel,Resistance,Inf.Factor' DO I=1,TISD(J) LINE=TRIM(ITOS(DATISD2(J,I)%IDATE))//','//TRIM(RTOS(DATISD2(J,I)%WLVL,'F',3)) //','//TRIM(RTOS(DATISD2(J,I)%BTML,'F',3))// & ','//TRIM(RTOS(DATISD2(J,I)%RESIS,'F',2))//','//TRIM(RTOS(DATISD2(J,I)%INFF,'F',2)) WRITE(IU,'(A)') TRIM(LINE) END DO CLOSE(IU) ELSEIF(ID.EQ.ID_OPEN)THEN IF(.NOT.UTL_DATA_CSV((/'Date ','WaterLevel ','BottomLevel ', & 'Resistance ','InfiltrationFactor'/)))RETURN TISD(J)=NL IF(ISDMAXROW.LT.TISD(J))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Maximum number of records to be read is '//TRIM(ITOS(ISDMAXROW))//CHAR(13)// & 'iMOD is reading '//TRIM(ITOS(TISD(J)))//' records only, rest will be left out!','Warning') ENDIF DO I=1,MIN(ISDMAXROW,TISD(J)) !## number of variables DO K=1,5 IF(IACT_VAR(K).EQ.1)THEN IF(CCNST(K).EQ.'')THEN LINE=VAR(ICOL_VAR(K),I) ELSE LINE=CCNST(K) ENDIF IF(K.EQ.1)READ(LINE,*,IOSTAT=IOS) DATISD2(J,I)%IDATE IF(K.EQ.2)READ(LINE,*,IOSTAT=IOS) DATISD2(J,I)%WLVL IF(K.EQ.3)READ(LINE,*,IOSTAT=IOS) DATISD2(J,I)%BTML IF(K.EQ.4)READ(LINE,*,IOSTAT=IOS) DATISD2(J,I)%RESIS IF(K.EQ.5)READ(LINE,*,IOSTAT=IOS) DATISD2(J,I)%INFF IF(IOS.NE.0)THEN TISD(J)=I-1 CALL WMESSAGEBOX(COMMONOK,EXCLAMATIONICON,COMMONOK,'Error reading column '//TRIM(ITOS(K))//' for row '// & TRIM(ITOS(I)),'Error') !EXIT EXIT ENDIF ENDIF ENDDO ENDDO CALL UTL_GENLABELSDEALLOCATE() CALL ISGATTRIBUTESPUTISDVALUES() CALL ISGATTRIBUTESUPDATEPLOTS() ENDIF END SUBROUTINE ISGATTRIBUTESSAVEOPENISD !###====================================================================== SUBROUTINE ISGATTRIBUTESSAVEOPENISC(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: I,J,K,IU,IOS CHARACTER(LEN=256) :: FNAME,LINE CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGGETMENU(IDF_MENU1,J) IF(ID.EQ.ID_SAVEAS)THEN IF(.NOT.UTL_WSELECTFILE('Save Comma Separated File (*.csv)|*.csv|',& SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Save Comma Separated File (*.csv)'))RETURN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE') IF(ISCN(J).EQ.1)THEN WRITE(IU,'(A)') 'Y,Z,KM' ELSEIF(ISCN(J).EQ.-1)THEN WRITE(IU,'(A)') 'X,Y,Z' ENDIF DO I=1,TISC(J) LINE=TRIM(RTOS(DATISC2(J,I)%DISTANCE,'F',3)) //','//TRIM(RTOS(DATISC2(J,I)%BOTTOM,'F',3))// & ','//TRIM(RTOS(DATISC2(J,I)%KM,'F',2)) WRITE(IU,'(A)') TRIM(LINE) END DO CLOSE(IU) ELSEIF(ID.EQ.ID_OPEN)THEN IF(ISCN(J).EQ.1)THEN IF(.NOT.UTL_DATA_CSV((/'Distance ','BottomLevel','KM '/)))RETURN ELSEIF(ISCN(J).EQ.-1)THEN IF(.NOT.UTL_DATA_CSV((/'X-crd. ','Y-crd. ','Z-value '/)))RETURN ENDIF TISC(J)=NL IF(ISCMAXROW.LT.TISC(J))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Maximum number of records to be read is '//TRIM(ITOS(ISCMAXROW))//CHAR(13)// & 'iMOD is reading '//TRIM(ITOS(TISC(J)))//' records only, rest will be left out!','Warning') ENDIF DO I=1,MIN(ISCMAXROW,TISC(J)) !## number of variables DO K=1,3 IF(IACT_VAR(K).EQ.1)THEN IF(CCNST(K).EQ.'')THEN LINE=VAR(ICOL_VAR(K),I) ELSE LINE=CCNST(K) ENDIF IF(K.EQ.1)READ(LINE,*,IOSTAT=IOS) DATISC2(J,I)%DISTANCE IF(K.EQ.2)READ(LINE,*,IOSTAT=IOS) DATISC2(J,I)%BOTTOM IF(K.EQ.3)READ(LINE,*,IOSTAT=IOS) DATISC2(J,I)%KM IF(IOS.NE.0)THEN TISC(J)=I-1 CALL WMESSAGEBOX(COMMONOK,EXCLAMATIONICON,COMMONOK,'Error reading column '//TRIM(ITOS(K))//' for row '//TRIM(ITOS(I)),'Error') !exit EXIT ENDIF ENDIF ENDDO ENDDO CALL UTL_GENLABELSDEALLOCATE() CALL ISGATTRIBUTESPUTISCVALUES() CALL ISGATTRIBUTESUPDATEPLOTS() ENDIF END SUBROUTINE ISGATTRIBUTESSAVEOPENISC !###====================================================================== SUBROUTINE ISGATTRIBUTESSAVEOPENIST(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: IU,I,J,K,IOS CHARACTER(LEN=256) :: FNAME,LINE CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB4) CALL WDIALOGGETMENU(IDF_MENU1,J) IF(ID.EQ.ID_SAVEAS)THEN IF(.NOT.UTL_WSELECTFILE('Save Comma Separated File (*.csv)|*.csv|',& SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Save Comma Separated File (*.csv)'))RETURN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE') WRITE(IU,'(A)') 'Date,UpWaterLevel,DownWaterLevel' DO I=1,TIST(J) LINE=TRIM(ITOS(DATIST2(J,I)%IDATE)) //','//TRIM(RTOS(DATIST2(J,I)%WLVL_UP,'F',3))// & ','//TRIM(RTOS(DATIST2(J,I)%WLVL_DOWN,'F',3)) WRITE(IU,'(A)') TRIM(LINE) END DO CLOSE(IU) ELSEIF(ID.EQ.ID_OPEN)THEN IF(.NOT.UTL_DATA_CSV((/'Date ','UpWaterLevel ','DownWaterLevel'/)))RETURN TIST(J)=NL IF(ISCMAXROW.LT.TIST(J))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Maximum number of records to be read is '//TRIM(ITOS(ISTMAXROW))//CHAR(13)// & 'iMOD is reading '//TRIM(ITOS(TIST(J)))//' records only, rest will be left out!','Warning') ENDIF DO I=1,MIN(ISTMAXROW,TIST(J)) !## number of variables DO K=1,3 IF(IACT_VAR(K).EQ.1)THEN IF(CCNST(K).EQ.'')THEN LINE=VAR(ICOL_VAR(K),I) ELSE LINE=CCNST(K) ENDIF IF(K.EQ.1)READ(LINE,*,IOSTAT=IOS) DATIST2(J,I)%IDATE IF(K.EQ.2)READ(LINE,*,IOSTAT=IOS) DATIST2(J,I)%WLVL_UP IF(K.EQ.3)READ(LINE,*,IOSTAT=IOS) DATIST2(J,I)%WLVL_DOWN IF(IOS.NE.0)THEN TIST(J)=I-1 CALL WMESSAGEBOX(COMMONOK,EXCLAMATIONICON,COMMONOK,'Error reading column '//TRIM(ITOS(K))//' for row '//TRIM(ITOS(I)),'Error') !EXIT EXIT ENDIF ENDIF ENDDO ENDDO CALL UTL_GENLABELSDEALLOCATE() CALL ISGATTRIBUTESPUTISTVALUES() CALL ISGATTRIBUTESUPDATEPLOTS() ENDIF END SUBROUTINE ISGATTRIBUTESSAVEOPENIST !###====================================================================== SUBROUTINE ISGATTRIBUTESSAVEOPENISQ(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: IU,I,J,K,IOS CHARACTER(LEN=256) :: FNAME,LINE CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB5) CALL WDIALOGGETMENU(IDF_MENU1,J) IF(ID.EQ.ID_SAVEAS)THEN IF(.NOT.UTL_WSELECTFILE('Save Comma Separated File |*.csv|',& SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Save Comma Separated File (*.csv)'))RETURN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE') WRITE(IU,'(A)') 'Q-summer,H-summer,Q-winter,H-winter' DO I=1,TISQ(J) LINE=TRIM(RTOS(DATISQ2(J,I)%QZ,'F',3))//','//TRIM(RTOS(DATISQ2(J,I)%HZ,'F',3))//','// & TRIM(RTOS(DATISQ2(J,I)%QW,'F',3))//','//TRIM(RTOS(DATISQ2(J,I)%HW,'F',3)) WRITE(IU,'(A)') TRIM(LINE) END DO CLOSE(IU) ELSEIF(ID.EQ.ID_OPEN)THEN IF(.NOT.UTL_DATA_CSV((/'Q-summer','H-summer','Q-winter','H-winter'/)))RETURN TISQ(J)=NL IF(ISQMAXROW.LT.TISQ(J))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Maximum number of records to be read is '//TRIM(ITOS(ISQMAXROW))//CHAR(13)// & 'iMOD is reading '//TRIM(ITOS(TISQ(J)))//' records only, rest will be left out!','Warning') ENDIF DO I=1,MIN(ISQMAXROW,TISQ(J)) !## number of variables DO K=1,4 IF(IACT_VAR(K).EQ.1)THEN IF(CCNST(K).EQ.'')THEN LINE=VAR(ICOL_VAR(K),I) ELSE LINE=CCNST(K) ENDIF IF(K.EQ.1)READ(LINE,*,IOSTAT=IOS) DATISQ2(J,I)%QZ IF(K.EQ.2)READ(LINE,*,IOSTAT=IOS) DATISQ2(J,I)%HZ IF(K.EQ.3)READ(LINE,*,IOSTAT=IOS) DATISQ2(J,I)%QW IF(K.EQ.4)READ(LINE,*,IOSTAT=IOS) DATISQ2(J,I)%HW IF(IOS.NE.0)THEN TISQ(J)=I-1 CALL WMESSAGEBOX(COMMONOK,EXCLAMATIONICON,COMMONOK,'Error reading column '//TRIM(ITOS(K))//' for row '//TRIM(ITOS(I)),'Error') !EXIT EXIT ENDIF ENDIF ENDDO ENDDO CALL UTL_GENLABELSDEALLOCATE() CALL ISGATTRIBUTESPUTISQVALUES() CALL ISGATTRIBUTESUPDATEPLOTS() ENDIF END SUBROUTINE ISGATTRIBUTESSAVEOPENISQ !###====================================================================== SUBROUTINE ISGATTRIBUTESSAVEOPENISP(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: IU,I,IOS CHARACTER(LEN=256) :: FNAME,LINE IF(ID.EQ.ID_SAVEAS)THEN IF(.NOT.UTL_WSELECTFILE('iMOD Generate File (*.gen)|*.gen|',& SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Save iMOD Generate File (*.gen)'))RETURN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',ACTION='WRITE') WRITE(IU,*) ISELISG,TRIM(ISG(ISELISG)%SNAME) DO I=1,TISP LINE=TRIM(RTOS(ISP2(I)%X,'F',3))//','//TRIM(RTOS(ISP2(I)%Y,'F',3)) WRITE(IU,'(A)') TRIM(LINE) END DO WRITE(IU,'(A)') 'END' WRITE(IU,'(A)') 'END' CLOSE(IU) ELSEIF(ID.EQ.ID_OPEN)THEN IF(.NOT.UTL_WSELECTFILE('iMOD Generate File (*.gen)|*.gen|',& LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Load iMOD Generate File (*.gen)'))RETURN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',ACTION='READ,DENYWRITE') READ(IU,*) TISP=0 I =0 DO I=I+1 IF(SIZE(ISP2).LT.I)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Maximum number of records to be read is '//& TRIM(ITOS(SIZE(ISP2)))//','//CHAR(13)//'rest will be left out!','Warning') EXIT ENDIF READ(IU,*,IOSTAT=IOS) ISP2(I)%X,ISP2(I)%Y IF(IOS.NE.0)EXIT TISP=TISP+1 END DO CLOSE(IU) CALL ISGATTRIBUTESPUTISPVALUES() CALL ISGATTRIBUTESUPDATEPLOTS() ENDIF END SUBROUTINE ISGATTRIBUTESSAVEOPENISP !###==================================================================== SUBROUTINE ISGATTRIBUTESUPDATEPLOTS() !###==================================================================== IMPLICIT NONE INTEGER :: ITAB CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGGETTAB(IDF_TAB1,ITAB) !## calculation points IF(ITAB.EQ.ID_DISGATTRIBUTESTAB1)THEN CALL WDIALOGFIELDSTATE(IDF_MENU1,1) CALL ISGATTRIBUTESGETISDVALUES() CALL ISGATTRIBUTESPUTISDVALUES() CALL ISGATTRIBUTESPLOTISD() !## cross-sections ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB2)THEN CALL WDIALOGFIELDSTATE(IDF_MENU1,2) CALL ISGATTRIBUTESGETISCVALUES() CALL ISGATTRIBUTESPUTISCVALUES() CALL ISGATTRIBUTESPLOTISC() !## nodes/points ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB3)THEN CALL WDIALOGFIELDSTATE(IDF_MENU1,2) CALL ISGATTRIBUTESGETISPVALUES() CALL ISGATTRIBUTESPLOTISP() !## weirs/structures ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB4)THEN CALL WDIALOGFIELDSTATE(IDF_MENU1,2) CALL ISGATTRIBUTESGETISTVALUES() CALL ISGATTRIBUTESPUTISTVALUES() CALL ISGATTRIBUTESPLOTIST() !## qh-relationships ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB5)THEN CALL WDIALOGFIELDSTATE(IDF_MENU1,2) CALL ISGATTRIBUTESGETISQVALUES() CALL ISGATTRIBUTESPUTISQVALUES() CALL ISGATTRIBUTESPLOTISQ() ENDIF END SUBROUTINE ISGATTRIBUTESUPDATEPLOTS ! !###==================================================================== ! SUBROUTINE ISGATTRIBUTESSORT(ID) ! !###==================================================================== ! IMPLICIT NONE ! INTEGER,INTENT(IN) :: ID ! CALL WDIALOGSELECT(ID) ! !CALL WGRIDSORT(IDF_GRID1,1) !,1,10) ! END SUBROUTINE ISGATTRIBUTESSORT !###==================================================================== SUBROUTINE ISGATTRIBUTESPLOTISD() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,K,XMIN,XMAX,X1,X2 REAL :: Y1,Y2,DX,DY,YMIN,YMAX CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB1) CALL WDIALOGGETMENU(IDF_MENU1,J) I=1 IF(TISD(J).LE.1)I=3 CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGFIELDSTATE(IDF_REAL1,I) CALL WDIALOGFIELDSTATE(IDF_REAL2,3) CALL WDIALOGFIELDSTATE(IDF_STRING1,I) CALL WDIALOGFIELDSTATE(IDF_LABEL4,I) IF(I.EQ.3)THEN CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRUNITS(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL WDIALOGPUTSTRING(IDF_LABEL4,'No Value : ') RETURN ENDIF CALL WDIALOGPUTSTRING(IDF_LABEL4,'Current Value : ') CALL WDIALOGGETMENU(IDF_MENU1,I) CALL ISGATTRIBUTESPLOTISDEXTENT(XMIN,XMAX,YMIN,YMAX,I,J) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL IGRFILLPATTERN(SOLID) DX=REAL(XMAX-XMIN)/25.0 IF(DX.EQ.0.0)DX=1.0 DY=(YMAX-YMIN)/25.0 IF(DY.EQ.0.0)DY=1.0 CALL IGRUNITS(REAL(XMIN)-DX,YMIN-DY,REAL(XMAX)+DX,YMAX+DY) IF(I.EQ.1)CALL IGRCOLOURN(WRGB(0,0,255)) IF(I.EQ.2)CALL IGRCOLOURN(WRGB(0,255,0)) IF(I.EQ.3)CALL IGRCOLOURN(WRGB(255,0,0)) IF(I.EQ.4)CALL IGRCOLOURN(WRGB(0,255,255)) SELECT CASE (I) CASE (1) DO K=1,TISD(J)-1 X1=UTL_IDATETOJDATE(DATISD2(J,K)%IDATE) X2=UTL_IDATETOJDATE(DATISD2(J,K+1)%IDATE) Y1=DATISD2(J,K)%WLVL Y2=DATISD2(J,K+1)%WLVL CALL IGRJOIN(REAL(X1),Y1,REAL(X2),Y1) CALL IGRJOIN(REAL(X2),Y1,REAL(X2),Y2) ENDDO CASE(2) DO K=1,TISD(J)-1 X1=UTL_IDATETOJDATE(DATISD2(J,K)%IDATE) X2=UTL_IDATETOJDATE(DATISD2(J,K+1)%IDATE) Y1=DATISD2(J,K)%BTML Y2=DATISD2(J,K+1)%BTML CALL IGRJOIN(REAL(X1),Y1,REAL(X2),Y1) CALL IGRJOIN(REAL(X2),Y1,REAL(X2),Y2) END DO CASE (3) DO K=1,TISD(J)-1 X1=UTL_IDATETOJDATE(DATISD2(J,K)%IDATE) X2=UTL_IDATETOJDATE(DATISD2(J,K+1)%IDATE) Y1=DATISD2(J,K)%RESIS Y2=DATISD2(J,K+1)%RESIS CALL IGRJOIN(REAL(X1),Y1,REAL(X2),Y1) CALL IGRJOIN(REAL(X2),Y1,REAL(X2),Y2) END DO CASE (4) DO K=1,TISD(J)-1 X1=UTL_IDATETOJDATE(DATISD2(J,K)%IDATE) X2=UTL_IDATETOJDATE(DATISD2(J,K+1)%IDATE) Y1=DATISD2(J,K)%INFF Y2=DATISD2(J,K+1)%INFF CALL IGRJOIN(REAL(X1),Y1,REAL(X2),Y1) CALL IGRJOIN(REAL(X2),Y1,REAL(X2),Y2) END DO END SELECT CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRUNITS(0.0,0.0,1.0,1.0) CALL WDIALOGSELECT(ID_DISGATTRIBUTES) END SUBROUTINE ISGATTRIBUTESPLOTISD !###==================================================================== SUBROUTINE ISGATTRIBUTESPLOTISDMOUSE(X1,Y1,X2,Y2) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: X1,Y1 REAL,INTENT(OUT) :: Y2 INTEGER,INTENT(OUT) :: X2 INTEGER :: I,J,XMIN,XMAX REAL :: YMIN,YMAX CHARACTER(LEN=18) :: LABEL CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB1) CALL WDIALOGGETMENU(IDF_MENU1,J) IF(TISD(J).LE.1)RETURN CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGGETMENU(IDF_MENU1,I,LABEL) CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGPUTSTRING(IDF_LABEL4,'Current '//TRIM(LABEL)//'-value : ') CALL ISGATTRIBUTESPLOTISDEXTENT(XMIN,XMAX,YMIN,YMAX,I,J) X2=REAL(XMIN)+X1*REAL(XMAX-XMIN) Y2=REAL(YMIN)+Y1*REAL(YMAX-YMIN) END SUBROUTINE ISGATTRIBUTESPLOTISDMOUSE !###==================================================================== SUBROUTINE ISGATTRIBUTESPLOTISDEXTENT(XMIN,XMAX,YMIN,YMAX,I,J) !###==================================================================== IMPLICIT NONE REAL,INTENT(OUT) :: YMIN,YMAX INTEGER,INTENT(OUT) :: XMIN,XMAX INTEGER,INTENT(IN) :: I,J XMIN=MINVAL(DATISD2(J,1:TISD(J))%IDATE) XMAX=MAXVAL(DATISD2(J,1:TISD(J))%IDATE) XMIN=UTL_IDATETOJDATE(XMIN) XMAX=UTL_IDATETOJDATE(XMAX) SELECT CASE (I) CASE (1) YMIN=MINVAL(DATISD2(J,1:TISD(J))%WLVL) YMAX=MAXVAL(DATISD2(J,1:TISD(J))%WLVL) CASE (2) YMIN=MINVAL(DATISD2(J,1:TISD(J))%BTML) YMAX=MAXVAL(DATISD2(J,1:TISD(J))%BTML) CASE (3) YMIN=MINVAL(DATISD2(J,1:TISD(J))%RESIS) YMAX=MAXVAL(DATISD2(J,1:TISD(J))%RESIS) CASE (4) YMIN=MINVAL(DATISD2(J,1:TISD(J))%INFF) YMAX=MAXVAL(DATISD2(J,1:TISD(J))%INFF) END SELECT IF(YMAX.EQ.YMIN)THEN YMIN=YMIN-0.5 YMAX=YMAX+0.5 ENDIF END SUBROUTINE ISGATTRIBUTESPLOTISDEXTENT !###==================================================================== SUBROUTINE ISGATTRIBUTESPLOTISC() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,ITRAP,ISYM,NDIM,NSYM,NTRAP,IROW,ICOL,ICLR REAL :: XMIN,YMIN,XMAX,YMAX,DX,DY,AORG,ATRAP REAL,ALLOCATABLE,DIMENSION(:) :: XIN,YIN,XSYM,YSYM REAL,ALLOCATABLE,DIMENSION(:,:) :: XTRAP,YTRAP !## double X-Y pairs plot with max.maxrow points CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGGETMENU(IDF_MENU1,J) I=1; IF(ISCN(J).LT.0)I=3 CALL WDIALOGFIELDSTATE(IDF_CHECK1,I) CALL WDIALOGFIELDSTATE(IDF_CHECK2,I) CALL WDIALOGFIELDSTATE(IDF_REAL1,I) CALL WDIALOGFIELDSTATE(IDF_REAL2,I) CALL WDIALOGFIELDSTATE(ID_PICK,ABS(3-I)+1) CALL WDIALOGFIELDSTATE(ID_TABLE,ABS(3-I)+1) ISYM=0; ITRAP=0 IF(ISCN(J).GT.0)THEN CALL WDIALOGGETCHECKBOX(IDF_CHECK1,ISYM) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,ITRAP) ENDIF I=1; IF(TISC(J).LE.1)I=3 CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGFIELDSTATE(IDF_REAL1,I) CALL WDIALOGFIELDSTATE(IDF_REAL2,I) CALL WDIALOGFIELDSTATE(IDF_STRING1,3) CALL WDIALOGFIELDSTATE(IDF_LABEL4,I) IF(I.EQ.3)THEN CALL IGRAREA(0.0,0.0,1.0,1.0); CALL IGRAREACLEAR(); RETURN ENDIF CALL WDIALOGPUTSTRING(IDF_LABEL4,'Current value within figure : ') !## distance/x XMIN=MINVAL(DATISC2(J,1:TISC(J))%DISTANCE) XMAX=MAXVAL(DATISC2(J,1:TISC(J))%DISTANCE) !## bottom/y YMIN=MINVAL(DATISC2(J,1:TISC(J))%BOTTOM) YMAX=MAXVAL(DATISC2(J,1:TISC(J))%BOTTOM) IF(ITRAP.EQ.1.OR.ISYM.EQ.1)THEN NDIM=TISC(J)*2 ALLOCATE(XIN(NDIM),YIN(NDIM),XSYM(NDIM),YSYM(NDIM)) ALLOCATE(XTRAP(4,NDIM),YTRAP(4,NDIM)) XIN(1:TISC(J))=DATISC2(J,1:TISC(J))%DISTANCE YIN(1:TISC(J))=DATISC2(J,1:TISC(J))%BOTTOM NSYM=TISC(J) CALL ISGCOMPUTETRAPEZIUM(XIN,YIN,XSYM,YSYM,XTRAP,YTRAP,NTRAP,NDIM,NSYM,AORG,ATRAP) IF(NSYM.LE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Crosssection incorrect','Error') ELSE IF(ISYM.EQ.1)THEN XMAX=MAX(MAXVAL(XSYM(1:NSYM)),XMAX) XMIN=MIN(MINVAL(XSYM(1:NSYM)),XMIN) YMAX=MAX(MAXVAL(YSYM(1:NSYM)),YMAX) YMIN=MIN(MINVAL(YSYM(1:NSYM)),YMIN) ENDIF IF(ITRAP.EQ.1)THEN XMAX=MAX(MAXVAL(XTRAP(2,1:NTRAP)),XMAX) XMIN=MIN(MINVAL(XTRAP(1,1:NTRAP)),XMIN) YMAX=MAX(MAXVAL(YTRAP(2,1:NTRAP)),YMAX) YMIN=MIN(MINVAL(YTRAP(3,1:NTRAP)),YMIN) ENDIF ENDIF ENDIF DX=(XMAX-XMIN)/100.0; DY=(YMAX-YMIN)/100.0 XMAX=XMAX+DX; XMIN=XMIN-DX; YMAX=YMAX+DY; YMIN=YMIN-DY IF(ISCN(J).EQ.1)THEN CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL IGRUNITS(XMIN,YMIN,XMAX,YMAX) CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) IF(ITRAP.EQ.1.OR.ISYM.EQ.1)THEN IF(ITRAP.EQ.1)THEN CALL IGRPLOTMODE(MODEAND) CALL IGRFILLPATTERN(SOLID) DO I=1,NTRAP CALL IGRCOLOURN(ICOLOR(I)) CALL IGRPOLYGONCOMPLEX(XTRAP(:,I),YTRAP(:,I),4) END DO CALL IGRPLOTMODE(MODECOPY) CALL IGRFILLPATTERN(OUTLINE) CALL WDIALOGFIELDSTATE(IDF_REAL2,1) CALL WDIALOGPUTREAL(IDF_REAL2,ATRAP) ELSE CALL WDIALOGFIELDSTATE(IDF_REAL2,2) CALL WDIALOGCLEARFIELD(IDF_REAL2) ENDIF IF(ISYM.EQ.1)THEN CALL IGRCOLOURN(WRGB(255,0,0)) CALL IGRLINEWIDTH(3) DO I=2,NSYM CALL IGRJOIN(XSYM(I-1),YSYM(I-1),XSYM(I),YSYM(I)) END DO CALL IGRLINEWIDTH(1) CALL WDIALOGFIELDSTATE(IDF_REAL1,1) CALL WDIALOGPUTREAL(IDF_REAL1,AORG) ELSE CALL WDIALOGFIELDSTATE(IDF_REAL1,2) CALL WDIALOGCLEARFIELD(IDF_REAL1) ENDIF IF(ALLOCATED(XIN))DEALLOCATE(XIN) IF(ALLOCATED(YIN))DEALLOCATE(YIN) IF(ALLOCATED(XSYM))DEALLOCATE(XSYM) IF(ALLOCATED(YSYM))DEALLOCATE(YSYM) IF(ALLOCATED(XTRAP))DEALLOCATE(XTRAP) IF(ALLOCATED(YTRAP))DEALLOCATE(YTRAP) ELSE CALL WDIALOGFIELDSTATE(IDF_REAL1,2) CALL WDIALOGCLEARFIELD(IDF_REAL1) CALL WDIALOGFIELDSTATE(IDF_REAL2,2) CALL WDIALOGCLEARFIELD(IDF_REAL2) ENDIF !## plot 1d cross-section CALL IGRCOLOURN(WRGB(0,255,0)) CALL IGRLINEWIDTH(2) DO I=2,TISC(J) CALL IGRJOIN(DATISC2(J,I-1)%DISTANCE,DATISC2(J,I-1)%BOTTOM,DATISC2(J,I)%DISTANCE,DATISC2(J,I)%BOTTOM) END DO CALL IGRLINEWIDTH(1) !## plot 2d cross-section ELSEIF(ISCN(J).EQ.-1)THEN CALL ISGATTRIBUTES_2DCROSS_PLOT(J) ENDIF CALL WDIALOGSELECT(ID_DISGATTRIBUTES) END SUBROUTINE ISGATTRIBUTESPLOTISC !###==================================================================== SUBROUTINE ISGATTRIBUTES_2DCROSS_PLOT(J) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: J TYPE(IDFOBJ) :: IDF REAL :: X1,X2,Y1,Y2,WIDTH,HEIGHT INTEGER :: IROW,ICOL,ICLR,I !## read IDF with bathemetry IF(.NOT.ISGATTRIBUTES_2DCROSS_READ(J,IDF))RETURN X1=IDF%XMIN-0.5*IDF%DX; X2=IDF%XMAX+0.5*IDF%DX; Y1=IDF%YMIN-0.5*IDF%DY; Y2=IDF%YMAX+0.5*IDF%DY WIDTH =REAL(WINFODRAWABLE(DRAWABLEWIDTH)) HEIGHT=REAL(WINFODRAWABLE(DRAWABLEHEIGHT)) CALL UTL_IDFCRDCOR(X1,X2,Y1,Y2,WIDTH,HEIGHT) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL IGRUNITS(X1,Y1,X2,Y2) CALL IGRFILLPATTERN(SOLID) DO IROW=1,IDF%NROW; Y2=IDF%YMAX-(IROW-1)*IDF%DY; Y1=Y2-IDF%DY; DO ICOL=1,IDF%NCOL IF(IDF%X(ICOL,IROW).EQ.IDF%NODATA)CYCLE X1=IDF%XMIN+(ICOL-1)*IDF%DX; X2=X1+IDF%DX IF(ICROSS_ZVAL.NE.0)THEN ICLR=UTL_IDFGETCLASS(MP(ICROSS_ZVAL)%LEG,IDF%X(ICOL,IROW)) CALL IGRCOLOURN(ICLR) CALL IGRFILLPATTERN(SOLID) CALL IGRRECTANGLE(X1,Y1,X2,Y2) ENDIF CALL IGRCOLOURN(WRGB(0,0,0)) CALL IGRFILLPATTERN(OUTLINE) CALL IGRRECTANGLE(X1,Y1,X2,Y2) ENDDO; ENDDO CALL IDFDEALLOCATEX(IDF) CALL IGRCOLOURN(WRGB(0,0,0)) DO I=2,TISP CALL IGRJOIN(ISP2(I-1)%X,ISP2(I-1)%Y,ISP2(I)%X,ISP2(I)%Y) END DO END SUBROUTINE ISGATTRIBUTES_2DCROSS_PLOT !###==================================================================== SUBROUTINE ISGATTRIBUTESPLOTIST() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,K,XMIN,XMAX,X1,X2 REAL :: Y1,Y2,DX,DY,YMIN,YMAX CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB4) CALL WDIALOGGETMENU(IDF_MENU1,J) I=1 IF(TIST(J).LE.1)I=3 CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGFIELDSTATE(IDF_REAL1,I) CALL WDIALOGFIELDSTATE(IDF_REAL2,3) CALL WDIALOGFIELDSTATE(IDF_STRING1,I) CALL WDIALOGFIELDSTATE(IDF_LABEL4,I) IF(I.EQ.3)THEN CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRUNITS(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL WDIALOGPUTSTRING(IDF_LABEL4,'No Value : ') RETURN ENDIF CALL WDIALOGPUTSTRING(IDF_LABEL4,'Current Value : ') CALL WDIALOGGETMENU(IDF_MENU1,I) !distance XMIN=MINVAL(DATIST2(J,1:TIST(J))%IDATE) XMAX=MAXVAL(DATIST2(J,1:TIST(J))%IDATE) XMIN=UTL_IDATETOJDATE(XMIN) XMAX=UTL_IDATETOJDATE(XMAX) !wl_up YMIN=MINVAL(DATIST2(J,1:TIST(J))%WLVL_UP) YMAX=MAXVAL(DATIST2(J,1:TIST(J))%WLVL_UP) !wl_down YMIN=MIN(YMIN,MINVAL(DATIST2(J,1:TIST(J))%WLVL_DOWN)) YMAX=MAX(YMAX,MAXVAL(DATIST2(J,1:TIST(J))%WLVL_DOWN)) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL IGRFILLPATTERN(SOLID) DX=REAL(XMAX-XMIN)/25.0 IF(DX.EQ.0.0)DX=1.0 DY=REAL(YMAX-YMIN)/25.0 IF(DY.EQ.0.0)DY=1.0 CALL IGRUNITS(REAL(XMIN)-DX,YMIN-DY,REAL(XMAX)+DX,YMAX+DY) DO I=1,2 IF(I.EQ.1)THEN CALL IGRCOLOURN(WRGB(0,0,255)) DO K=1,TIST(J)-1 X1=UTL_IDATETOJDATE(DATIST2(J,K)%IDATE) X2=UTL_IDATETOJDATE(DATIST2(J,K+1)%IDATE) Y1=DATIST2(J,K)%WLVL_UP Y2=DATIST2(J,K+1)%WLVL_UP CALL IGRJOIN(REAL(X1),Y1,REAL(X2),Y1) CALL IGRJOIN(REAL(X2),Y1,REAL(X2),Y2) ENDDO ELSEIF(I.EQ.2)THEN CALL IGRCOLOURN(WRGB(0,255,0)) DO K=1,TIST(J)-1 X1=UTL_IDATETOJDATE(DATIST2(J,K)%IDATE) X2=UTL_IDATETOJDATE(DATIST2(J,K+1)%IDATE) Y1=DATIST2(J,K)%WLVL_DOWN Y2=DATIST2(J,K+1)%WLVL_DOWN CALL IGRJOIN(REAL(X1),Y1,REAL(X2),Y1) CALL IGRJOIN(REAL(X2),Y1,REAL(X2),Y2) ENDDO ENDIF END DO END SUBROUTINE ISGATTRIBUTESPLOTIST !###==================================================================== SUBROUTINE ISGATTRIBUTESPLOTISQ() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,K REAL :: Y1,Y2,DX,DY,YMIN,YMAX,XMIN,XMAX,X1,X2 CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB5) CALL WDIALOGGETMENU(IDF_MENU1,J) I=1 IF(TISQ(J).LE.1)I=3 CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGFIELDSTATE(IDF_REAL1,I) CALL WDIALOGFIELDSTATE(IDF_REAL2,I) CALL WDIALOGFIELDSTATE(IDF_STRING1,3) CALL WDIALOGFIELDSTATE(IDF_LABEL4,I) IF(I.EQ.3)THEN CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRUNITS(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL WDIALOGPUTSTRING(IDF_LABEL4,'No Value : ') RETURN ENDIF CALL WDIALOGPUTSTRING(IDF_LABEL4,'Current Value : ') CALL WDIALOGGETMENU(IDF_MENU1,I) !q XMIN=MINVAL(DATISQ2(J,1:TISQ(J))%QZ) XMAX=MAXVAL(DATISQ2(J,1:TISQ(J))%QZ) XMIN=MIN(XMIN,MINVAL(DATISQ2(J,1:TISQ(J))%QW)) XMAX=MAX(XMAX,MAXVAL(DATISQ2(J,1:TISQ(J))%QW)) !h YMIN=MINVAL(DATISQ2(J,1:TISQ(J))%HZ) YMAX=MAXVAL(DATISQ2(J,1:TISQ(J))%HZ) YMIN=MIN(YMIN,MINVAL(DATISQ2(J,1:TISQ(J))%HW)) YMAX=MAX(YMAX,MAXVAL(DATISQ2(J,1:TISQ(J))%HW)) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL IGRFILLPATTERN(SOLID) DX=(XMAX-XMIN)/25.0 IF(DX.EQ.0.0)DX=1.0 DY=(YMAX-YMIN)/25.0 IF(DY.EQ.0.0)DY=1.0 CALL IGRUNITS(XMIN-DX,YMIN-DY,XMAX+DX,YMAX+DY) CALL IGRCOLOURN(WRGB(0,0,255)) DO K=1,TISQ(J)-1 X1=DATISQ2(J,K)%QZ X2=DATISQ2(J,K+1)%QZ Y1=DATISQ2(J,K)%HZ Y2=DATISQ2(J,K+1)%HZ CALL IGRJOIN(X1,Y1,X2,Y2) ENDDO CALL IGRCOLOURN(WRGB(255,0,0)) DO K=1,TISQ(J)-1 X1=DATISQ2(J,K)%QW X2=DATISQ2(J,K+1)%QW Y1=DATISQ2(J,K)%HW Y2=DATISQ2(J,K+1)%HW CALL IGRJOIN(X1,Y1,X2,Y2) ENDDO END SUBROUTINE ISGATTRIBUTESPLOTISQ !###==================================================================== SUBROUTINE ISGATTRIBUTESPLOTISP() !###==================================================================== IMPLICIT NONE INTEGER :: I REAL :: XMIN,YMIN,XMAX,YMAX,DX,DY,XMID,YMID,WIDTH,HEIGHT I=1 IF(TISP.LE.1)I=3 CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGFIELDSTATE(IDF_REAL1,I) CALL WDIALOGFIELDSTATE(IDF_REAL2,I) CALL WDIALOGFIELDSTATE(IDF_STRING1,3) !date string CALL WDIALOGFIELDSTATE(IDF_LABEL4,I) IF(I.EQ.3)THEN CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() RETURN ENDIF CALL WDIALOGPUTSTRING(IDF_LABEL4,'Current value (xcrd,ycrd) : ') !distance XMIN=MINVAL(ISP2(1:TISP)%X) XMAX=MAXVAL(ISP2(1:TISP)%X) !bottom YMIN=MINVAL(ISP2(1:TISP)%Y) YMAX=MAXVAL(ISP2(1:TISP)%Y) DX =XMAX-XMIN DY =YMAX-YMIN XMID=XMIN+DX/2.0 YMID=YMIN+DY/2.0 DX =(MAX(DX,DY))/2.0 DX =DX+DX/10.0 XMAX=XMID+DX XMIN=XMID-DX YMAX=YMID+DX YMIN=YMID-DX WIDTH =REAL(WINFODRAWABLE(DRAWABLEWIDTH)) HEIGHT=REAL(WINFODRAWABLE(DRAWABLEHEIGHT)) CALL UTL_IDFCRDCOR(XMIN,XMAX,YMIN,YMAX,WIDTH,HEIGHT) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL IGRUNITS(XMIN,YMIN,XMAX,YMAX) CALL IGRCOLOURN(WRGB(0,0,0)) DO I=2,TISP CALL IGRJOIN(ISP2(I-1)%X,ISP2(I-1)%Y,ISP2(I)%X,ISP2(I)%Y) END DO END SUBROUTINE ISGATTRIBUTESPLOTISP !###====================================================================== SUBROUTINE ISGATTRIBUTESCOPY() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ISEL,JSEL,ITYPE,I,J,ITAB CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGGETTAB(IDF_TAB1,ITAB) !##selected calculation point/crosssection CALL WDIALOGSELECT(ITAB) CALL WDIALOGGETMENU(IDF_MENU1,ISEL) CALL WDIALOGLOAD(ID_DCOPYLEGEND) CALL WDIALOGTITLE('Copy data from : ') IF(ITAB.EQ.ID_DISGATTRIBUTESTAB1)THEN CALL WDIALOGPUTMENU(IDF_MENU1,ISD%CNAME,NISD,1) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB4)THEN CALL WDIALOGPUTMENU(IDF_MENU1,IST%CNAME,NIST,1) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB5)THEN CALL WDIALOGPUTMENU(IDF_MENU1,ISQ%CNAME,NISQ,1) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB2)THEN CALL WDIALOGPUTMENU(IDF_MENU1,ISC%CNAME,NISC,1) ENDIF CALL WDIALOGSHOW(-1,-1,0,3) JSEL=0 DO WHILE(.TRUE.) CALL WMESSAGE(ITYPE,MESSAGE) IF(ITYPE.EQ.PUSHBUTTON.AND.MESSAGE%VALUE1.EQ.IDCANCEL)EXIT IF(ITYPE.EQ.PUSHBUTTON.AND.MESSAGE%VALUE1.EQ.IDOK)THEN CALL WDIALOGGETMENU(IDF_MENU1,JSEL) EXIT ENDIF END DO CALL WDIALOGUNLOAD() IF(JSEL.EQ.0)RETURN IF(ITAB.EQ.ID_DISGATTRIBUTESTAB1)THEN I =ISD(JSEL)%IREF J =I+ISD(JSEL)%N-1 DATISD2(ISEL,1:J-I+1)=DATISD(I:J) TISD(ISEL)=ISD(JSEL)%N CALL ISGATTRIBUTESPUTISDVALUES() ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB2)THEN I =ISC(JSEL)%IREF J =I+ISC(JSEL)%N-1 DATISC2(ISEL,1:J-I+1)=DATISC(I:J) TISC(ISEL)=ISC(JSEL)%N CALL ISGATTRIBUTESPUTISCVALUES() ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB4)THEN I =IST(JSEL)%IREF J =I+IST(JSEL)%N-1 DATIST2(ISEL,1:J-I+1)=DATIST(I:J) TIST(ISEL)=IST(JSEL)%N CALL ISGATTRIBUTESPUTISTVALUES() ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB5)THEN I =ISQ(JSEL)%IREF J =I+ISQ(JSEL)%N-1 DATISQ2(ISEL,1:J-I+1)=DATISQ(I:J) TISQ(ISEL)=ISQ(JSEL)%N CALL ISGATTRIBUTESPUTISQVALUES() ENDIF CALL ISGATTRIBUTESUPDATEPLOTS() END SUBROUTINE ISGATTRIBUTESCOPY !###====================================================================== SUBROUTINE ISGATTRIBUTESRENAME() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,ISEL,I,J,ITAB CHARACTER(LEN=30) :: CVALUE CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGGETTAB(IDF_TAB1,ITAB) CALL WDIALOGLOAD(ID_DSCENNAME,ID_DSCENNAME) CALL WDIALOGTITLE('Give New Name : ') IF(ITAB.EQ.ID_DISGATTRIBUTESTAB1)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB1) CALL WDIALOGGETMENU(IDF_MENU1,ISEL) CALL WDIALOGSELECT(ID_DSCENNAME) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Rename Calculation Point') I=ISG(ISELISG)%ICLC J=I+ISG(ISELISG)%NCLC-1 CALL WDIALOGPUTMENU(IDF_MENU1,ISD(I:J)%CNAME,ISG(ISELISG)%NCLC,ISEL) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB2)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGGETMENU(IDF_MENU1,ISEL) CALL WDIALOGSELECT(ID_DSCENNAME) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Rename Cross-Section') I=ISG(ISELISG)%ICRS J=I+ISG(ISELISG)%NCRS-1 CALL WDIALOGPUTMENU(IDF_MENU1,ISC(I:J)%CNAME,ISG(ISELISG)%NCRS,ISEL) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB4)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB4) CALL WDIALOGGETMENU(IDF_MENU1,ISEL) CALL WDIALOGSELECT(ID_DSCENNAME) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Rename Structure') I=ISG(ISELISG)%ISTW J=I+ISG(ISELISG)%NSTW-1 CALL WDIALOGPUTMENU(IDF_MENU1,IST(I:J)%CNAME,ISG(ISELISG)%NSTW,ISEL) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB5)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB5) CALL WDIALOGGETMENU(IDF_MENU1,ISEL) CALL WDIALOGSELECT(ID_DSCENNAME) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Rename Qh-relationship') I=ISG(ISELISG)%IQHR J=I+ISG(ISELISG)%NQHR-1 CALL WDIALOGPUTMENU(IDF_MENU1,ISQ(I:J)%CNAME,ISG(ISELISG)%NQHR,ISEL) ENDIF CALL WDIALOGSHOW(0,0,-1,3) DO CALL WMESSAGE(ITYPE,MESSAGE) IF(ITYPE.EQ.PUSHBUTTON)THEN SELECT CASE(MESSAGE%VALUE1) CASE(IDOK,IDCANCEL) EXIT CASE(IDHELP) CALL IMODGETHELP('4.4.3.2','MMO.IGO.IE.Attr') END SELECT ENDIF ENDDO CALL WDIALOGGETMENU(IDF_MENU1,ITYPE,CVALUE) CALL WDIALOGUNLOAD() IF(MESSAGE%VALUE1.EQ.IDCANCEL)RETURN IF(ITAB.EQ.ID_DISGATTRIBUTESTAB1)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB1) ISD(I+ISEL-1)%CNAME=CVALUE CALL WDIALOGPUTMENU(IDF_MENU1,ISD(I:J)%CNAME,ISG(ISELISG)%NCLC,ISEL) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB2)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) ISC(I+ISEL-1)%CNAME=CVALUE CALL WDIALOGPUTMENU(IDF_MENU1,ISC(I:J)%CNAME,ISG(ISELISG)%NCRS,ISEL) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB4)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB4) IST(I+ISEL-1)%CNAME=CVALUE CALL WDIALOGPUTMENU(IDF_MENU1,IST(I:J)%CNAME,ISG(ISELISG)%NSTW,ISEL) ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB5)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB5) ISQ(I+ISEL-1)%CNAME=CVALUE CALL WDIALOGPUTMENU(IDF_MENU1,ISQ(I:J)%CNAME,ISG(ISELISG)%NQHR,ISEL) ENDIF CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL ISGATTRIBUTESUPDATEPLOTS() END SUBROUTINE ISGATTRIBUTESRENAME !###==================================================================== SUBROUTINE ISGPOSITIONCRSCLC(ID) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: IDIST REAL :: XINTER,YINTER IF(ID.EQ.ID_DELETECROSSSECTION)THEN IF(ISG(ISELISG)%NCRS.LE.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You may not remove the last cross-section!'//CHAR(13)// & 'Each segment needs at least 1 cross-section','Information') RETURN ENDIF ELSEIF(ID.EQ.ID_DELETECALCPOINT)THEN IF(ISG(ISELISG)%NCLC.LE.2)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You may not remove the last TWO Calculation Points!'//CHAR(13)// & 'Each segment needs at least 2 Calculation Points','Information') RETURN ENDIF ENDIF !##get position in x/y coordinates and first coming node after x/y coordinates IF(ID.EQ.ID_ADDCALCPOINT.OR. & ID.EQ.ID_DELETECALCPOINT.OR. & ID.EQ.ID_MOVECALCPOINT)CALL ISGGETPOS(1,IDIST,XINTER,YINTER) IF(ID.EQ.ID_ADDCROSSSECTION.OR. & ID.EQ.ID_DELETECROSSSECTION.OR. & ID.EQ.ID_MOVECROSSSECTION)CALL ISGGETPOS(2,IDIST,XINTER,YINTER) IF(ID.EQ.ID_ADDWEIR.OR. & ID.EQ.ID_DELETEWEIR.OR. & ID.EQ.ID_MOVEWEIR)CALL ISGGETPOS(3,IDIST,XINTER,YINTER) IF(ID.EQ.ID_ADDQH.OR. & ID.EQ.ID_DELETEQH.OR. & ID.EQ.ID_MOVEQH)CALL ISGGETPOS(4,IDIST,XINTER,YINTER) IF(IDIST.LE.0)RETURN IF(ID.EQ.ID_ADDCROSSSECTION) CALL ISGCROSSSECTIONADD(IDIST,XINTER,YINTER) IF(ID.EQ.ID_DELETECROSSSECTION)CALL ISGCROSSSECTIONDELETE(IDIST,XINTER,YINTER) IF(ID.EQ.ID_MOVECROSSSECTION) CALL ISGCROSSSECTIONMOVE(IDIST,XINTER,YINTER) IF(ID.EQ.ID_ADDCALCPOINT) CALL ISGCALCPOINTADD(IDIST,XINTER,YINTER) IF(ID.EQ.ID_DELETECALCPOINT) CALL ISGCALCPOINTDELETE(IDIST,XINTER,YINTER) IF(ID.EQ.ID_MOVECALCPOINT) CALL ISGCALCPOINTMOVE(IDIST,XINTER,YINTER) IF(ID.EQ.ID_ADDWEIR) CALL ISGWEIRADD(IDIST,XINTER,YINTER) IF(ID.EQ.ID_DELETEWEIR) CALL ISGWEIRDELETE(IDIST,XINTER,YINTER) IF(ID.EQ.ID_MOVEWEIR) CALL ISGWEIRMOVE(IDIST,XINTER,YINTER) IF(ID.EQ.ID_ADDQH) CALL ISGQHADD(IDIST,XINTER,YINTER) IF(ID.EQ.ID_DELETEQH) CALL ISGQHDELETE(IDIST,XINTER,YINTER) IF(ID.EQ.ID_MOVEQH) CALL ISGQHMOVE(IDIST,XINTER,YINTER) END SUBROUTINE ISGPOSITIONCRSCLC !###==================================================================== SUBROUTINE ISGCROSSSECTIONADD(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST INTEGER :: N,IPOS,ISEG REAL :: TDIST CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Do you want to SAVE Added Cross-Section?','Question') IF(WINFODIALOG(4).NE.1)RETURN !## get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) !## get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,2) N=3 !## increase memory CALL ISGMEMORYISC(1,ISELISG,IPOS) ISC(IPOS)%N =0 ISC(IPOS)%IREF =NDISC+1 ISC(IPOS)%DIST =TDIST ISC(IPOS)%CNAME='C.Section '//TRIM(ITOS(ISG(ISELISG)%NCRS)) CALL ISGMEMORYDATISC(N,IPOS,ISEG) DATISC(ISEG)%DISTANCE =-5.0 DATISC(ISEG)%BOTTOM = 5.0 DATISC(ISEG)%KM =25.0 DATISC(ISEG+1)%DISTANCE= 0.0 DATISC(ISEG+1)%BOTTOM = 0.0 DATISC(ISEG+1)%KM =25.0 DATISC(ISEG+2)%DISTANCE= 5.0 DATISC(ISEG+2)%BOTTOM = 5.0 DATISC(ISEG+2)%KM =25.0 !DO I=1,NDISC ! WRITE(*,*) I,DATISC(I) !END DO CALL IDFPLOTFAST(1) END SUBROUTINE ISGCROSSSECTIONADD !###==================================================================== SUBROUTINE ISGCROSSSECTIONDELETE(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST REAL :: TDIST INTEGER :: IPOS !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,2) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the selected cross-section: [ '// & TRIM(ISC(IPOS)%CNAME)//' ]','Question') IF(WINFODIALOG(4).NE.1)RETURN CALL ISGDELISC(ISELISG,IPOS) CALL IDFPLOTFAST(1) END SUBROUTINE ISGCROSSSECTIONDELETE !###==================================================================== SUBROUTINE ISGCROSSSECTIONMOVE(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST REAL :: TDIST,X,Y INTEGER :: JDIST,IPOS !## get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) IF(IDIST.LE.0)RETURN !## get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,2) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to move the selected cross-section: [ '// & TRIM(ISC(IPOS)%CNAME)//' ]','Question') IF(WINFODIALOG(4).NE.1)RETURN !## get new position !## get position in x/y coordinates and first coming node after x/y coordinates CALL ISGGETPOS(2,JDIST,X,Y) IF(JDIST.LE.0)RETURN !## get distance on segment CALL ISGGETPOSDISTANCE(X,Y,TDIST,JDIST) ISC(IPOS)%DIST=TDIST CALL IDFPLOTFAST(1) END SUBROUTINE ISGCROSSSECTIONMOVE !###==================================================================== SUBROUTINE ISGCALCPOINTADD(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST INTEGER :: IPOS,N,ISEG REAL :: TDIST CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Do you want to SAVE Added Calculation Point ? ','Question') IF(WINFODIALOG(4).NE.1)RETURN !## get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) !## get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,1) N=1 !## increase memory CALL ISGMEMORYISD(1,ISELISG,IPOS) ISD(IPOS)%N =0 ISD(IPOS)%IREF =NDISD+1 ISD(IPOS)%DIST =TDIST ISD(IPOS)%CNAME='Calc.Pnt '//TRIM(ITOS(ISG(ISELISG)%NCLC)) CALL ISGMEMORYDATISD(N,IPOS,ISEG) DATISD(ISEG)%IDATE=20081104 DATISD(ISEG)%WLVL =1.0 DATISD(ISEG)%BTML =0.0 DATISD(ISEG)%RESIS=1.0 DATISD(ISEG)%INFF =0.3 CALL IDFPLOTFAST(1) END SUBROUTINE ISGCALCPOINTADD !###==================================================================== SUBROUTINE ISGCALCPOINTDELETE(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST REAL :: TDIST INTEGER :: IPOS !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,1) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the selected Calculation Point : [ '// & TRIM(ISD(IPOS)%CNAME)//' ]','Question') IF(WINFODIALOG(4).NE.1)RETURN CALL ISGDELISD(ISELISG,IPOS) CALL IDFPLOTFAST(1) END SUBROUTINE ISGCALCPOINTDELETE !###==================================================================== SUBROUTINE ISGCALCPOINTMOVE(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST REAL :: TDIST,X,Y INTEGER :: JDIST,IPOS !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) IF(IDIST.LE.0)RETURN !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,1) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to move the selected Calculation Point : [ '// & TRIM(ISD(IPOS)%CNAME)//' ]','Question') IF(WINFODIALOG(4).NE.1)RETURN !##get new position !##get position in x/y coordinates and first coming node after x/y coordinates CALL ISGGETPOS(2,JDIST,X,Y) IF(JDIST.LE.0)RETURN !#get distance on segment CALL ISGGETPOSDISTANCE(X,Y,TDIST,JDIST) ISD(IPOS)%DIST=TDIST CALL IDFPLOTFAST(1) END SUBROUTINE ISGCALCPOINTMOVE !###==================================================================== SUBROUTINE ISGWEIRADD(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST INTEGER :: IPOS,N,ISEG REAL :: TDIST CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Do you want to SAVE Added Structure ? ','Question') IF(WINFODIALOG(4).NE.1)RETURN !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,3) N=1 !ISG(ISELISG)%ISTW=MAX(1,ISG(ISELISG)%ISTW) !##increase memory CALL ISGMEMORYIST(1,ISELISG,IPOS) !WRITE(*,*) ISELISG,IPOS IST(IPOS)%N =0 IST(IPOS)%IREF =NDIST+1 IST(IPOS)%DIST =TDIST IST(IPOS)%CNAME='Weir '//TRIM(ITOS(ISG(ISELISG)%NSTW)) !WRITE(*,*) 'IPOS=',IPOS !WRITE(*,*) IST(IPOS) !DO I=1,NIST ! WRITE(*,*) IST(I) !ENDDO !DO I=1,NIST ! WRITE(*,*) IST(I) !END DO CALL ISGMEMORYDATIST(N,IPOS,ISEG) !WRITE(*,*) IPOS,ISEG DATIST(ISEG)%IDATE =20081104 DATIST(ISEG)%WLVL_UP =1.0 DATIST(ISEG)%WLVL_DOWN=0.0 !DO I=1,NDIST ! WRITE(*,*) DATIST(I) !END DO CALL IDFPLOTFAST(1) END SUBROUTINE ISGWEIRADD !###==================================================================== SUBROUTINE ISGWEIRDELETE(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST REAL :: TDIST INTEGER :: IPOS !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,3) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the selected Structure : [ '// & TRIM(IST(IPOS)%CNAME)//' ]','Question') IF(WINFODIALOG(4).NE.1)RETURN CALL ISGDELIST(ISELISG,IPOS) CALL IDFPLOTFAST(1) END SUBROUTINE ISGWEIRDELETE !###==================================================================== SUBROUTINE ISGWEIRMOVE(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST REAL :: TDIST,X,Y INTEGER :: JDIST,IPOS !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) IF(IDIST.LE.0)RETURN !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,3) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to move the selected Structure : [ '// & TRIM(IST(IPOS)%CNAME)//' ]','Question') IF(WINFODIALOG(4).NE.1)RETURN !##get new position !##get position in x/y coordinates and first coming node after x/y coordinates CALL ISGGETPOS(3,JDIST,X,Y) IF(JDIST.LE.0)RETURN !#get distance on segment CALL ISGGETPOSDISTANCE(X,Y,TDIST,JDIST) IST(IPOS)%DIST=TDIST CALL IDFPLOTFAST(1) END SUBROUTINE ISGWEIRMOVE !###==================================================================== SUBROUTINE ISGQHADD(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST INTEGER :: IPOS,N,ISEG REAL :: TDIST CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Do you want to SAVE Added Qh-relationship ?','Question') IF(WINFODIALOG(4).NE.1)RETURN !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,4) N=2 !ISG(ISELISG)%IQHR=MAX(1,ISG(ISELISG)%IQHR) !##increase memory CALL ISGMEMORYISQ(1,ISELISG,IPOS) ISQ(IPOS)%N =0 ISQ(IPOS)%IREF =NDISQ+1 ISQ(IPOS)%DIST =TDIST ISQ(IPOS)%CNAME='QH '//TRIM(ITOS(ISG(ISELISG)%NQHR)) !DO I=1,NIST ! WRITE(*,*) IST(I) !END DO CALL ISGMEMORYDATISQ(N,IPOS,ISEG) DATISQ(ISEG)%QZ =1.0 DATISQ(ISEG)%HZ =1.0 DATISQ(ISEG+1)%QZ=2.0 DATISQ(ISEG+1)%HZ=1.5 DATISQ(ISEG)%QW =0.5 DATISQ(ISEG)%HW =1.0 DATISQ(ISEG+1)%QW=1.75 DATISQ(ISEG+1)%HW=1.5 !DO I=1,NDIST ! WRITE(*,*) DATIST(I) !END DO CALL IDFPLOTFAST(1) END SUBROUTINE ISGQHADD !###==================================================================== SUBROUTINE ISGQHDELETE(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST REAL :: TDIST INTEGER :: IPOS !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,4) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to delete the selected Qh-relationship : [ '// & TRIM(ISQ(IPOS)%CNAME)//' ]','Question') IF(WINFODIALOG(4).NE.1)RETURN CALL ISGDELISQ(ISELISG,IPOS) CALL IDFPLOTFAST(1) END SUBROUTINE ISGQHDELETE !###==================================================================== SUBROUTINE ISGQHMOVE(IDIST,XINTER,YINTER) !###==================================================================== IMPLICIT NONE REAL,INTENT(IN) :: XINTER,YINTER INTEGER,INTENT(IN) :: IDIST REAL :: TDIST,X,Y INTEGER :: JDIST,IPOS !#get distance on segment CALL ISGGETPOSDISTANCE(XINTER,YINTER,TDIST,IDIST) IF(IDIST.LE.0)RETURN !#get nearest id and record-position CALL ISGGETPOSID(TDIST,IPOS,4) CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to move the selected Qh-relationship : [ '// & TRIM(ISQ(IPOS)%CNAME)//' ]','Question') IF(WINFODIALOG(4).NE.1)RETURN !##get new position !##get position in x/y coordinates and first coming node after x/y coordinates CALL ISGGETPOS(4,JDIST,X,Y) IF(JDIST.LE.0)RETURN !#get distance on segment CALL ISGGETPOSDISTANCE(X,Y,TDIST,JDIST) ISQ(IPOS)%DIST=TDIST CALL IDFPLOTFAST(1) END SUBROUTINE ISGQHMOVE !###==================================================================== SUBROUTINE ISGGETPOS(ISHAPE,IDIST,XINTER,YINTER) !###==================================================================== ! idist=first coming node in xyISG()-vector after xinter,yinter IMPLICIT NONE INTEGER,INTENT(OUT) :: IDIST INTEGER,INTENT(IN) :: ISHAPE REAL,INTENT(OUT) :: XINTER,YINTER TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,ISTATUS,ISEG,I REAL :: DX,DY,X1,X2,X3,X4,X5,Y1,Y2,Y3,Y4,Y5,DIST,TDIST,D D=(MPW%XMAX-MPW%XMIN)/200.0 CALL IDFPLOT1BITMAP() CALL IGRPLOTMODE(MODEXOR) ICLRSD=INVERSECOLOUR(ICLRSD) ICLRSC=INVERSECOLOUR(ICLRSC) X5 =0.0 Y5 =0.0 IDIST=0 DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (MOUSEBUTDOWN) SELECT CASE (MESSAGE%VALUE1) CASE (1) EXIT CASE (3) IDIST=0 EXIT END SELECT CASE (MOUSEMOVE) CALL IDFPLOT1BITMAP() CALL ISGPLOTSHAPE(ISHAPE,X5,Y5,D) I =0 DO ISEG=ISG(ISELISG)%ISEG+1,ISG(ISELISG)%ISEG+ISG(ISELISG)%NSEG-1 DX=ISP(ISEG)%X-ISP(ISEG-1)%X DY=ISP(ISEG)%Y-ISP(ISEG-1)%Y X1=ISP(ISEG-1)%X Y1=ISP(ISEG-1)%Y X2=ISP(ISEG)%X Y2=ISP(ISEG)%Y X3=MESSAGE%GX Y3=MESSAGE%GY X4=X3-DY Y4=Y3+DX CALL IGRINTERSECTLINE(X1,Y1,X2,Y2,X3,Y3,X4,Y4,XINTER,YINTER,ISTATUS) IF(ISTATUS.EQ.3.OR.ISTATUS.EQ.5)THEN DIST=SQRT((XINTER-X3)**2.0+(YINTER-Y3)**2.0) IF(I.EQ.0)THEN I =1 TDIST=DIST IDIST=ISEG X5 =XINTER Y5 =YINTER ELSE IF(DIST.LT.TDIST)THEN TDIST=DIST IDIST=ISEG X5 =XINTER Y5 =YINTER ENDIF ENDIF ENDIF ENDDO CALL ISGPLOTSHAPE(ISHAPE,X5,Y5,D) CALL IDFPLOT2BITMAP() END SELECT ENDDO !##remove cross-section from CALL IDFPLOT1BITMAP() CALL ISGPLOTSHAPE(ISHAPE,X5,Y5,D) CALL IDFPLOT2BITMAP() CALL IGRPLOTMODE(MODECOPY) ICLRSD=INVERSECOLOUR(ICLRSD) ICLRSC=INVERSECOLOUR(ICLRSC) XINTER=X5 YINTER=Y5 END SUBROUTINE ISGGETPOS !###====================================================================== SUBROUTINE ISGISPRESET() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,NSEG !#remove current line CALL POLYGON1DRAWSHAPE(SHPNO,SHPNO) SHPI =MAXSHAPES+1 SHPNO=SHPI I =ISG(ISELISG)%ISEG NSEG=ISG(ISELISG)%NSEG J =I+NSEG-1 SHPNCRD(SHPI)=NSEG SHPXC(1:NSEG,SHPI)=ISP(I:J)%X SHPYC(1:NSEG,SHPI)=ISP(I:J)%Y !#draw new line CALL POLYGON1DRAWSHAPE(1,SHPNO) END SUBROUTINE ISGISPRESET !###====================================================================== SUBROUTINE ISGISPSAVE() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,DN REAL :: TD SHPI=MAXSHAPES+1 DN =SHPNCRD(SHPI)-ISG(ISELISG)%NSEG !#increase memory CALL ISGMEMORYISP(DN,ISELISG,J) TD=0.0 DO I=1,SHPNCRD(SHPI) ISP(J+I-1)%X=SHPXC(I,SHPI) ISP(J+I-1)%Y=SHPYC(I,SHPI) IF(I.GE.2)TD=TD+SQRT((SHPXC(I,SHPI)-SHPXC(I-1,SHPI))**2.0+(SHPYC(I,SHPI)-SHPYC(I-1,SHPI))**2.0) ENDDO CALL ISGISPADJUST(TD) CALL IDFPLOTFAST(1) END SUBROUTINE ISGISPSAVE !###====================================================================== SUBROUTINE ISGISPADJUST(TD) !###====================================================================== IMPLICIT NONE REAL,INTENT(IN) :: TD REAL :: D INTEGER :: I,J !##make sure calculation points do not exceed new segment length DO I=ISG(ISELISG)%ICLC,ISG(ISELISG)%ICLC+ISG(ISELISG)%NCLC-1 IF(ISD(I)%DIST.GT.TD)ISD(I)%DIST=TD END DO !##find max. to be maximum now again D=0.0 DO I=ISG(ISELISG)%ICLC,ISG(ISELISG)%ICLC+ISG(ISELISG)%NCLC-1 IF(ISD(I)%DIST.GT.D)THEN D=ISD(I)%DIST J=I ENDIF END DO ISD(J)%DIST=TD !##make sure cross-section do not exceed new segment length DO I=ISG(ISELISG)%ICRS,ISG(ISELISG)%ICRS+ISG(ISELISG)%NCRS-1 IF(ISC(I)%DIST.GT.TD)ISC(I)%DIST=TD END DO END SUBROUTINE ISGISPADJUST !###====================================================================== SUBROUTINE ISGISPSTOP(CODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: CODE IF(CODE.EQ.0)THEN IDIAGERROR=0 IF(ISELISG.EQ.0)RETURN ENDIF IDIAGERROR=1 IF(CODE.EQ.1)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'Are you sure to leave this editing mode ?','Question') IF(WINFODIALOG(4).NE.1)RETURN ENDIF !#none selected ISELISG=0 !#remove current line CALL POLYGON1DRAWSHAPE(SHPNO,SHPNO) SHPNO=ISGSHAPES CALL WCURSORSHAPE(CURARROW) IDIAGERROR=0 END SUBROUTINE ISGISPSTOP !###====================================================================== SUBROUTINE ISGCHECKISG(X,Y,CODE) !###====================================================================== IMPLICIT NONE REAL,PARAMETER :: SCALEXY=1.0/100.0 INTEGER,INTENT(IN) :: CODE REAL,INTENT(IN) :: X,Y INTEGER :: IISG,ISEG,NSEG,I,J,ITAB,IOS,N,M REAL :: DIST,DX,DY,MINDIST LOGICAL :: LEX CALL WDIALOGSELECT(ID_DISGEDIT) CALL WDIALOGGETTAB(IDF_TAB,ITAB) LEX=.FALSE. IF(CODE.EQ.0)THEN !#wrong tab-selected IF(ITAB.NE.ID_DISGEDITTAB1)RETURN !#already selected IF(ISELISG.NE.0)RETURN DX=((MPW%XMAX-MPW%XMIN)*SCALEXY)**2.0 DY=((MPW%YMAX-MPW%YMIN)*SCALEXY)**2.0 MINDIST=SQRT(DX+DY) DIST =10.0E10 ISELISG=0 DO IISG=1,NISG DO ISEG=ISG(IISG)%ISEG,ISG(IISG)%ISEG+ISG(IISG)%NSEG-1 DX=(X-ISP(ISEG)%X)**2.0 DY=(Y-ISP(ISEG)%Y)**2.0 DX=DX+DY IF(DX.NE.0.0)DX=SQRT(DX) IF(DX.LT.DIST)THEN DIST =MIN(DIST,DX) ISELISG=IISG ENDIF ENDDO END DO IF(DIST.LE.MINDIST.AND.ISELISG.GT.0)LEX=.TRUE. ELSEIF(CODE.EQ.1)THEN CALL WDIALOGSELECT(ID_DISGEDITTAB1) !## already selected IF(ISELISG.NE.0)THEN CALL ISGISPSTOP(0) IF(IDIAGERROR.EQ.1)THEN ISG%ILIST=0 ISG(ISELISG)%ILIST=1 CALL WDIALOGSELECT(ID_DISGEDITTAB1) CALL WDIALOGPUTOPTION(IDF_MENU1,ISG(1:NISG)%ILIST) RETURN ENDIF ENDIF CALL WDIALOGGETMENU(IDF_MENU1,ISG(1:NISG)%ILIST) IF(SUM(ISG(1:NISG)%ILIST).EQ.1)THEN DO ISELISG=1,NISG IF(ISG(ISELISG)%ILIST.EQ.1)EXIT END DO ENDIF IF(ISELISG.GT.0.AND.ISELISG.LE.NISG)LEX=.TRUE. ENDIF IF(LEX)THEN NSEG=ISG(ISELISG)%NSEG !## copy coordinates - to shape definition SHPNO =MAXSHAPES+1 SHPI =MAXSHAPES+1 SHPIACT(SHPI) =1 SHPNAME(SHPI) =ISG(ISELISG)%SNAME SHPCOLOR(SHPI)=WRGB(0,255,0) SHPNCRD(SHPI) =NSEG SHPTYPE(SHPI) =ID_LINE SHPWIDTH(SHPI)=3 !## maximum is for UTL_INSIDEPOLYGON etc. IF(ASSOCIATED(SHPXC))THEN IF(SIZE(SHPXC,1).LT.NSEG.OR.SIZE(SHPXC,2).LT.SHPNO)THEN ALLOCATE(CSHPXC(NSEG,MAXSHAPES+1),STAT=IOS) N=SIZE(SHPXC,1) M=SIZE(SHPXC,2) DO I=1,N; DO J=1,M; CSHPXC(I,J)=SHPXC(I,J); ENDDO; ENDDO DEALLOCATE(SHPXC) SHPXC=>CSHPXC ENDIF ENDIF IF(ASSOCIATED(SHPYC))THEN IF(SIZE(SHPYC,1).LT.NSEG.OR.SIZE(SHPYC,2).LT.SHPNO)THEN ALLOCATE(CSHPYC(NSEG,MAXSHAPES+1)) N=SIZE(SHPYC,1) M=SIZE(SHPYC,2) DO I=1,N; DO J=1,M; CSHPYC(I,J)=SHPYC(I,J); ENDDO; ENDDO DEALLOCATE(SHPYC) SHPYC=>CSHPYC ENDIF ENDIF I =ISG(ISELISG)%ISEG J =I+NSEG-1 SHPXC(1:NSEG,SHPI)=ISP(I:J)%X SHPYC(1:NSEG,SHPI)=ISP(I:J)%Y CALL POLYGON1DRAWSHAPE(SHPNO,SHPNO) ELSE ISELISG=0 SHPI =1 !## remove current line CALL POLYGON1DRAWSHAPE(SHPNO,SHPNO) SHPNO =ISGSHAPES IF(ALLOCATED(SHPIACT))SHPIACT=0 ENDIF IF(CODE.EQ.0)THEN CALL WDIALOGSELECT(ID_DISGEDITTAB1) ISG%ILIST=0 IF(ISELISG.GT.0)ISG(ISELISG)%ILIST=1 CALL WDIALOGPUTOPTION(IDF_MENU1,ISG(1:NISG)%ILIST) ENDIF CALL ISGFIELDS() CALL ISGADJUSTFIELDS() END SUBROUTINE ISGCHECKISG !###====================================================================== SUBROUTINE ISGEDITINIT() !###====================================================================== IMPLICIT NONE INTEGER :: IPLOT,I,ISAVE CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_ISGEDIT,2).EQ.1)THEN CALL ISGEDITCLOSE(1); RETURN ENDIF CALL MAIN1INACTMODULE(ID_ISGEDIT) !## other module no closed, no approvement given IF(IDIAGERROR.EQ.1)RETURN CALL WMENUSETSTATE(ID_ISGEDIT,2,1) !## how many isg files selected NISGFILES=0 DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.MP(IPLOT)%IPLOT.EQ.4)THEN NISGFILES=NISGFILES+1 IISGPLOT =IPLOT ENDIF END DO CALL WDIALOGLOAD(ID_DISGEDIT,ID_DISGEDIT) IF(NISGFILES.GT.1)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONNO,'You have selected more than one ISG file.'//CHAR(13)// & 'Do you want iMOD to merge them ? ','Question') IF(WINFODIALOG(4).NE.1)THEN CALL ISGEDITCLOSE(0); RETURN ENDIF ENDIF IF(ALLOCATED(ISGIU))DEALLOCATE(ISGIU); ALLOCATE(ISGIU(MAXFILES,NISGFILES)) !## open all isg files IF(NISGFILES.GT.1)THEN IISGPLOT=0 DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.MP(IPLOT)%IPLOT.EQ.4)THEN IISGPLOT=IISGPLOT+1 ISGFNAME=TRIM(MP(IPLOT)%IDFNAME) CALL UTL_GETUNITSISG(ISGIU(:,IISGPLOT),ISGFNAME,'OLD') ENDIF END DO ELSE ISGFNAME=TRIM(MP(IISGPLOT)%IDFNAME) CALL UTL_GETUNITSISG(ISGIU(:,1),ISGFNAME,'OLD') ENDIF !## something went wrong IF(MINVAL(ISGIU).LE.0)THEN CALL ISGCLOSEFILES() CALL ISGEDITCLOSE(0) RETURN ENDIF !## read isg's CALL UTL_MESSAGEHANDLE(0) CALL WINDOWSELECT(0) IF(NISGFILES.EQ.1)CALL WINDOWOUTSTATUSBAR(4,'Reading '//TRIM(ISGFNAME)//' ...') IF(NISGFILES.GT.1)CALL WINDOWOUTSTATUSBAR(4,'Reading and Merging '//TRIM(ITOS(NISGFILES))//' ISG-file(s) ...') !## to be consistent with multi-isg files to be read! CALL ISGREAD() CALL UTL_MESSAGEHANDLE(1) !## close files CALL ISGCLOSEFILES() !## error occured in reading isg-file IF(NISG.LT.0)THEN CALL ISGEDITCLOSE(0) RETURN ENDIF !## save in case of merging IF(NISGFILES.GT.1)THEN ISAVE=2 CALL ISGSAVE(ISAVE,0) IF(ISAVE.NE.1)THEN CALL ISGEDITCLOSE(1) RETURN ENDIF ENDIF CALL WDIALOGSELECT(ID_DISGEDITTAB1) CALL WDIALOGPUTIMAGE(ID_ZOOMTO,ID_ICONZOOMTO,1) CALL WDIALOGPUTIMAGE(ID_FIND,ID_ICONFIND,1) CALL WDIALOGPUTIMAGE(ID_RECORDS,ID_ICONEDITATTRIB,1) CALL WDIALOGPUTIMAGE(ID_PROFILE,ID_ICONPROFILE,1) CALL WDIALOGPUTIMAGE(ID_DELETE,ID_ICONDELETE,1) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS,1) CALL WDIALOGPUTIMAGE(ID_SAVE,ID_ICONSAVE,1) CALL WDIALOGPUTIMAGE(ID_GRID,ID_ICONGRID,1) CALL WDIALOGPUTIMAGE(ID_DRAW,ID_ICONDRAW,1) CALL POLYGON1IMAGES(ID_DISGEDITTAB2) CALL WDIALOGSELECT(ID_DISGEDITTAB3) CALL WDIALOGPUTIMAGE(ID_LOAD,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS,1) CALL WDIALOGSELECT(ID_DISGEDITTAB4) CALL WDIALOGPUTIMAGE(ID_LOAD,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD1,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD2,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD3,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD4,ID_ICONOPEN,1) CALL WDIALOGSELECT(ID_DISGEDITTAB5) CALL WDIALOGPUTIMAGE(ID_LOAD,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD1,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD2,ID_ICONOPEN,1) CALL WDIALOGSELECT(ID_DISGEDITTAB6) CALL WDIALOGPUTIMAGE(ID_LOAD,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD1,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD2,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD3,ID_ICONOPEN,1) CALL WDIALOGSELECT(ID_DISGEDITTAB7) CALL WDIALOGPUTIMAGE(ID_LOAD,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD1,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD2,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD3,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(IDF_LOAD4,ID_ICONOPEN,1) DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.MP(IPLOT)%IPLOT.EQ.4)EXIT END DO IISGPLOT=IPLOT ISGFNAME=TRIM(MP(IISGPLOT)%IDFNAME) CALL WDIALOGSELECT(ID_DISGEDIT) CALL WDIALOGTITLE('ISG Edit: '//TRIM(MP(IISGPLOT)%ALIAS)) ISG%ILIST=0 CALL WDIALOGSELECT(ID_DISGEDITTAB1) CALL WDIALOGPUTMENU(IDF_MENU1,ISG%SNAME,NISG,ISG%ILIST) CALL ISGFIELDS() CALL WDIALOGSELECT(ID_DISGEDIT) CALL WDIALOGCOLOUR(IDF_STRING1,INVERSECOLOUR(ICLRND),ICLRND) CALL WDIALOGCOLOUR(IDF_STRING2,INVERSECOLOUR(ICLRSD),ICLRSD) CALL WDIALOGCOLOUR(IDF_STRING3,INVERSECOLOUR(ICLRSC),ICLRSC) CALL WDIALOGCOLOUR(IDF_STRING4,INVERSECOLOUR(ICLRSP),ICLRSP) CALL WDIALOGCOLOUR(IDF_STRING5,INVERSECOLOUR(ICLRST),ICLRST) CALL WDIALOGCOLOUR(IDF_STRING6,INVERSECOLOUR(ICLRQH),ICLRQH) CALL WINDOWSELECT(0) I=WMENUGETSTATE(ID_ISGNODES,2) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1,I) I=WMENUGETSTATE(ID_ISGCLCNODES,2) CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,I) I=WMENUGETSTATE(ID_ISGCRSSCTNS,2) CALL WDIALOGPUTCHECKBOX(IDF_CHECK3,I) I=WMENUGETSTATE(ID_ISGSEGNODES,2) CALL WDIALOGPUTCHECKBOX(IDF_CHECK4,I) I=WMENUGETSTATE(ID_ISGSTUWEN,2) CALL WDIALOGPUTCHECKBOX(IDF_CHECK5,I) I=WMENUGETSTATE(ID_ISGQHR,2) CALL WDIALOGPUTCHECKBOX(IDF_CHECK6,I) CALL POLYGON1INIT() CALL ISGADJUSTFIELDS() CALL WDIALOGSELECT(ID_DISGEDIT) CALL WDIALOGSHOW(-0,65,0,2) ISGSHAPES=0; ICROSS_PNTR=0; ICROSS_ZVAL=0 END SUBROUTINE ISGEDITINIT !###====================================================================== SUBROUTINE ISGFIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL WDIALOGSELECT(ID_DISGEDITTAB1) IF(NISG.GT.0)THEN CALL WDIALOGGETMENU(IDF_MENU1,ISG(1:NISG)%ILIST) I=1 IF(SUM(ISG(1:NISG)%ILIST).LE.0)I=0 ELSE I=0 ENDIF CALL WDIALOGFIELDSTATE(ID_ZOOMTO,I) CALL WDIALOGFIELDSTATE(ID_DELETE,I) CALL WDIALOGFIELDSTATE(ID_PROFILE,I) CALL WDIALOGSELECT(ID_DISGEDIT) CALL WDIALOGFIELDSTATE(IDF_CHECK7,I) IF(I.EQ.0)CALL WDIALOGPUTCHECKBOX(IDF_CHECK7,I) !#only of not selected anything yet! !IF(ISELISG.NE.0)I=0 END SUBROUTINE ISGFIELDS !###====================================================================== SUBROUTINE ISGEDITCLOSE(ICODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ICODE IDIAGERROR=1 CALL ISGISPSTOP(ICODE) IF(IDIAGERROR.EQ.1)RETURN IDIAGERROR=1 CALL POLYGON1DRAWSHAPE(1,SHPNO) CALL POLYGON1CLOSE() !## deallocate memory CALL ISGDEAL() IF(ALLOCATED(ISGIU))DEALLOCATE(ISGIU) CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_ISGEDIT,2).EQ.1)THEN; CALL WDIALOGSELECT(ID_DISGEDIT); CALL WDIALOGUNLOAD(); ENDIF CALL WMENUSETSTATE(ID_ISGEDIT,2,0) IDIAGERROR=0 CALL IDFPLOTFAST(1) END SUBROUTINE ISGEDITCLOSE !###==================================================================== SUBROUTINE ISGATTRIBUTESSAVE() !###==================================================================== IMPLICIT NONE CALL UTL_MESSAGEHANDLE(0) CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(4,'Storing data ...') CALL ISGATTRIBUTESSAVEISPVALUES() CALL ISGATTRIBUTESSAVEISDVALUES() CALL ISGATTRIBUTESSAVEISCVALUES() CALL ISGATTRIBUTESSAVEISTVALUES() CALL ISGATTRIBUTESSAVEISQVALUES() CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGGETSTRING(IDF_STRING2,ISG(ISELISG)%SNAME) CALL UTL_MESSAGEHANDLE(1) END SUBROUTINE ISGATTRIBUTESSAVE !###==================================================================== SUBROUTINE ISGATTRIBUTESSAVEISDVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,K,L,DN K=ISG(ISELISG)%ICLC-1 DO I=1,ISG(ISELISG)%NCLC K =K+1 DN =TISD(I)-ISD(K)%N !#increase memory CALL ISGMEMORYDATISD(DN,K,J) DO L=1,TISD(I) DATISD(J+L-1)=DATISD2(I,L) ENDDO ENDDO END SUBROUTINE ISGATTRIBUTESSAVEISDVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESSAVEISCVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,K,L,DN K=ISG(ISELISG)%ICRS-1 DO I=1,ISG(ISELISG)%NCRS K =K+1 DN =TISC(I)-ABS(ISC(K)%N) !## increase memory CALL ISGMEMORYDATISC(DN,K,J) DO L=1,TISC(I) DATISC(J+L-1)=DATISC2(I,L) ENDDO ISC(K)%N=ISCN(I)*ABS(ISC(K)%N) ENDDO END SUBROUTINE ISGATTRIBUTESSAVEISCVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESSAVEISTVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,K,L,DN K=ISG(ISELISG)%ISTW-1 DO I=1,ISG(ISELISG)%NSTW K =K+1 DN =TIST(I)-IST(K)%N !#increase memory CALL ISGMEMORYDATIST(DN,K,J) DO L=1,TIST(I) DATIST(J+L-1)=DATIST2(I,L) ENDDO ENDDO END SUBROUTINE ISGATTRIBUTESSAVEISTVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESSAVEISQVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,K,L,DN K=ISG(ISELISG)%IQHR-1 DO I=1,ISG(ISELISG)%NQHR K =K+1 DN =TISQ(I)-ISQ(K)%N !#increase memory CALL ISGMEMORYDATISQ(DN,K,J) DO L=1,TISQ(I) DATISQ(J+L-1)=DATISQ2(I,L) ENDDO ENDDO END SUBROUTINE ISGATTRIBUTESSAVEISQVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESSAVEISPVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,DN REAL :: TD DN=TISP-ISG(ISELISG)%NSEG !#increase memory CALL ISGMEMORYISP(DN,ISELISG,J) TD=0.0 DO I=1,TISP ISP(J+I-1)=ISP2(I) IF(I.GE.2)TD=TD+SQRT((ISP2(I-1)%X-ISP2(I)%X)**2.0+(ISP2(I-1)%Y-ISP2(I)%Y)**2.0) ENDDO CALL ISGISPADJUST(TD) END SUBROUTINE ISGATTRIBUTESSAVEISPVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESPUTISDVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB1) CALL WDIALOGGETMENU(IDF_MENU1,J) CALL WDIALOGCLEARFIELD(IDF_GRID1) CALL WGRIDPUTINTEGER(IDF_GRID1,1,DATISD2(J,:)%IDATE,TISD(J)) CALL WGRIDPUTREAL(IDF_GRID1,2,DATISD2(J,:)%WLVL,TISD(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,3,DATISD2(J,:)%BTML,TISD(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,4,DATISD2(J,:)%RESIS,TISD(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,5,DATISD2(J,:)%INFF,TISD(J),'(F10.2)') I=ISG(ISELISG)%ICLC-1+J CALL WDIALOGPUTREAL(IDF_REAL1,ISD(I)%DIST) END SUBROUTINE ISGATTRIBUTESPUTISDVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESPUTISCVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGGETMENU(IDF_MENU1,J) CALL WDIALOGCLEARFIELD(IDF_GRID1) IF(ISCN(J).EQ.1)THEN CALL WGRIDLABELCOLUMN(IDF_GRID1,1,'Dist.') CALL WGRIDLABELCOLUMN(IDF_GRID1,2,'Z') CALL WGRIDLABELCOLUMN(IDF_GRID1,3,'kM') CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1) ELSEIF(ISCN(J).EQ.-1)THEN CALL WGRIDLABELCOLUMN(IDF_GRID1,1,'X-crd.') CALL WGRIDLABELCOLUMN(IDF_GRID1,2,'Y-crd.') CALL WGRIDLABELCOLUMN(IDF_GRID1,3,'Z-val.') CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO2) ENDIF CALL WGRIDPUTREAL(IDF_GRID1,1,DATISC2(J,:)%DISTANCE,TISC(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,2,DATISC2(J,:)%BOTTOM,TISC(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,3,DATISC2(J,:)%KM,TISC(J),'(F10.2)') I=ISG(ISELISG)%ICRS-1+J CALL WDIALOGPUTREAL(IDF_REAL3,ISC(I)%DIST) END SUBROUTINE ISGATTRIBUTESPUTISCVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESPUTISTVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J IF(ISG(ISELISG)%NSTW.EQ.0)RETURN ! Select currently displayed sub CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB4) CALL WDIALOGGETMENU(IDF_MENU1,J) CALL WDIALOGCLEARFIELD(IDF_GRID1) CALL WGRIDPUTINTEGER(IDF_GRID1,1,DATIST2(J,:)%IDATE,TIST(J)) CALL WGRIDPUTREAL(IDF_GRID1,2,DATIST2(J,:)%WLVL_UP,TIST(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,3,DATIST2(J,:)%WLVL_DOWN,TIST(J),'(F10.2)') I=ISG(ISELISG)%ISTW-1+J CALL WDIALOGPUTREAL(IDF_REAL1,IST(I)%DIST) END SUBROUTINE ISGATTRIBUTESPUTISTVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESPUTISQVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J IF(ISG(ISELISG)%NQHR.EQ.0)RETURN ! Select currently displayed sub CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB5) CALL WDIALOGGETMENU(IDF_MENU1,J) CALL WDIALOGCLEARFIELD(IDF_GRID1) CALL WGRIDPUTREAL(IDF_GRID1,1,DATISQ2(J,:)%QZ,TISQ(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,2,DATISQ2(J,:)%HZ,TISQ(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,3,DATISQ2(J,:)%QW,TISQ(J),'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,4,DATISQ2(J,:)%HW,TISQ(J),'(F10.2)') I=ISG(ISELISG)%IQHR-1+J CALL WDIALOGPUTREAL(IDF_REAL1,ISQ(I)%DIST) END SUBROUTINE ISGATTRIBUTESPUTISQVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESPUTISPVALUES() !###==================================================================== IMPLICIT NONE CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB3) CALL WDIALOGCLEARFIELD(IDF_GRID1) CALL WGRIDPUTREAL(IDF_GRID1,1,ISP2%X,TISP,'(F10.2)') CALL WGRIDPUTREAL(IDF_GRID1,2,ISP2%Y,TISP,'(F10.2)') END SUBROUTINE ISGATTRIBUTESPUTISPVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESGETISDVALUES() !###==================================================================== IMPLICIT NONE INTEGER,PARAMETER :: INODATA=0 INTEGER :: I,J,IDBG CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB1) CALL WDIALOGGETMENU(IDF_MENU1,J) !## use previous one ... IF(SELISD.GT.0)J=SELISD J=MIN(J,ISG(ISELISG)%NCLC) CALL WDIALOGUNDEFINED(INODATA,RNODATA) IDBG=INFOERROR(DEBUGLEVEL) CALL IDEBUGLEVEL(0) CALL WGRIDGETINTEGER(IDF_GRID1,1,DATISD2(J,:)%IDATE,ISDMAXROW) CALL WGRIDGETREAL(IDF_GRID1,2,DATISD2(J,:)%WLVL,ISDMAXROW) CALL WGRIDGETREAL(IDF_GRID1,3,DATISD2(J,:)%BTML,ISDMAXROW) CALL WGRIDGETREAL(IDF_GRID1,4,DATISD2(J,:)%RESIS,ISDMAXROW) CALL WGRIDGETREAL(IDF_GRID1,5,DATISD2(J,:)%INFF,ISDMAXROW) CALL IDEBUGLEVEL(IDBG) TISD(J)=0 DO I=1,ISDMAXROW !## determine fullfillness of current row i IF(DATISD2(J,I)%IDATE.EQ.INODATA)EXIT IF(DATISD2(J,I)%WLVL.EQ.RNODATA) EXIT IF(DATISD2(J,I)%BTML.EQ.RNODATA) EXIT IF(DATISD2(J,I)%RESIS.EQ.RNODATA)EXIT IF(DATISD2(J,I)%INFF.EQ.RNODATA) EXIT TISD(J)=TISD(J)+1 END DO CALL SORTEMI(1,TISD(J),DATISD2(J,:)%IDATE,4,DATISD2(J,:)%WLVL,DATISD2(J,:)%BTML,DATISD2(J,:)%RESIS,DATISD2(J,:)%INFF & ,DATISD2(J,:)%WLVL,DATISD2(J,:)%WLVL,DATISD2(J,:)%WLVL) !## use new one next time ... CALL WDIALOGGETMENU(IDF_MENU1,J) SELISD=J END SUBROUTINE ISGATTRIBUTESGETISDVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESGETISCVALUES() !###==================================================================== IMPLICIT NONE INTEGER :: I,J,IDBG CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGGETMENU(IDF_MENU1,J) !## use previous one ... IF(SELISC.GT.0)J=SELISC J=MIN(J,ISG(ISELISG)%NCRS) CALL WDIALOGUNDEFINED(RVALUE=RNODATA) IDBG=INFOERROR(DEBUGLEVEL) CALL IDEBUGLEVEL(0) CALL WGRIDGETREAL(IDF_GRID1,1,DATISC2(J,:)%DISTANCE,ISCMAXROW) CALL WGRIDGETREAL(IDF_GRID1,2,DATISC2(J,:)%BOTTOM,ISCMAXROW) CALL WGRIDGETREAL(IDF_GRID1,3,DATISC2(J,:)%KM,ISCMAXROW) CALL IDEBUGLEVEL(IDBG) TISC(J)=0 DO I=1,ISCMAXROW !## determine fullfillness of current row i IF(DATISC2(J,I)%DISTANCE.EQ.RNODATA)EXIT IF(DATISC2(J,I)%BOTTOM.EQ.RNODATA)EXIT IF(DATISC2(J,I)%KM.EQ.RNODATA)EXIT TISC(J)=TISC(J)+1 END DO !## sort whenever 1d cross-sections are concerned IF(ISCN(J).EQ.1)THEN CALL SORTEM(1,TISC(J),DATISC2(J,:)%DISTANCE,2,DATISC2(J,:)%BOTTOM,DATISC2(J,:)%KM,DATISC2(J,:)%KM,DATISC2(J,:)%KM & ,DATISC2(J,:)%KM,DATISC2(J,:)%KM,DATISC2(J,:)%KM) ENDIF !## use new one next time ... CALL WDIALOGGETMENU(IDF_MENU1,J) SELISC=J END SUBROUTINE ISGATTRIBUTESGETISCVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESGETISTVALUES() !###==================================================================== IMPLICIT NONE INTEGER,PARAMETER :: INODATA=0 ! REAL,PARAMETER :: RNODATA=-999.99 INTEGER :: I,J,IDBG CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB4) CALL WDIALOGGETMENU(IDF_MENU1,J) !## use previous one ... IF(SELIST.GT.0)J=SELIST J=MIN(J,ISG(ISELISG)%NSTW) CALL WDIALOGUNDEFINED(INODATA,RNODATA) IDBG=INFOERROR(DEBUGLEVEL) CALL IDEBUGLEVEL(0) CALL WGRIDGETINTEGER(IDF_GRID1,1,DATIST2(J,:)%IDATE,ISTMAXROW) CALL WGRIDGETREAL(IDF_GRID1,2,DATIST2(J,:)%WLVL_UP,ISTMAXROW) CALL WGRIDGETREAL(IDF_GRID1,3,DATIST2(J,:)%WLVL_DOWN,ISTMAXROW) CALL IDEBUGLEVEL(IDBG) TIST(J)=0 DO I=1,ISTMAXROW !## determine fullfillness of current row i IF(DATIST2(J,I)%IDATE.EQ.INODATA)EXIT IF(DATIST2(J,I)%WLVL_UP.EQ.RNODATA) EXIT IF(DATIST2(J,I)%WLVL_DOWN.EQ.RNODATA) EXIT TIST(J)=TIST(J)+1 END DO CALL SORTEMI(1,TIST(J),DATIST2(J,:)%IDATE,2,DATIST2(J,:)%WLVL_UP,DATIST2(J,:)%WLVL_DOWN,DATIST2(J,:)%WLVL_UP,DATIST2(J,:)%WLVL_UP & ,DATIST2(J,:)%WLVL_UP,DATIST2(J,:)%WLVL_UP ,DATIST2(J,:)%WLVL_UP) !## use new one next time ... CALL WDIALOGGETMENU(IDF_MENU1,J) SELIST=J END SUBROUTINE ISGATTRIBUTESGETISTVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESGETISQVALUES() !###==================================================================== IMPLICIT NONE INTEGER,PARAMETER :: INODATA=0 ! REAL,PARAMETER :: RNODATA=-999.99 INTEGER :: I,J,IDBG CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB5) CALL WDIALOGGETMENU(IDF_MENU1,J) !## use previous one ... IF(SELISQ.GT.0)J=SELISQ J=MIN(J,ISG(ISELISG)%NQHR) CALL WDIALOGUNDEFINED(INODATA,RNODATA) IDBG=INFOERROR(DEBUGLEVEL) CALL IDEBUGLEVEL(0) CALL WGRIDGETREAL(IDF_GRID1,1,DATISQ2(J,:)%QZ,ISQMAXROW) CALL WGRIDGETREAL(IDF_GRID1,2,DATISQ2(J,:)%HZ,ISQMAXROW) CALL WGRIDGETREAL(IDF_GRID1,3,DATISQ2(J,:)%QW,ISQMAXROW) CALL WGRIDGETREAL(IDF_GRID1,4,DATISQ2(J,:)%HW,ISQMAXROW) CALL IDEBUGLEVEL(IDBG) TISQ(J)=0 DO I=1,ISQMAXROW !## determine fullfillness of current row i IF(DATISQ2(J,I)%QZ.EQ.RNODATA) EXIT IF(DATISQ2(J,I)%HZ.EQ.RNODATA) EXIT IF(DATISQ2(J,I)%QW.EQ.RNODATA) EXIT IF(DATISQ2(J,I)%HW.EQ.RNODATA) EXIT TISQ(J)=TISQ(J)+1 END DO CALL SORTEM(1,TISQ(J),DATISQ2(J,:)%QZ,3,DATISQ2(J,:)%HZ,DATISQ2(J,:)%QW,DATISQ2(J,:)%HW,DATISQ2(J,:)%HW & ,DATISQ2(J,:)%HW,DATISQ2(J,:)%HW,DATISQ2(J,:)%HW) !## use new one next time ... CALL WDIALOGGETMENU(IDF_MENU1,J) SELISQ=J END SUBROUTINE ISGATTRIBUTESGETISQVALUES !###==================================================================== SUBROUTINE ISGATTRIBUTESGETISPVALUES() !###==================================================================== IMPLICIT NONE ! REAL,PARAMETER :: RNODATA=-999.99 INTEGER :: I,IDBG CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB3) CALL WDIALOGUNDEFINED(RVALUE=RNODATA) IDBG=INFOERROR(DEBUGLEVEL) CALL IDEBUGLEVEL(0) CALL WGRIDGETREAL(IDF_GRID1,1,ISP2%X,ISPMAXROW) CALL WGRIDGETREAL(IDF_GRID1,2,ISP2%Y,ISPMAXROW) CALL IDEBUGLEVEL(IDBG) TISP=0 DO I=1,ISPMAXROW !## determine fullfillness of current row i IF(ISP2(I)%X.EQ.RNODATA)EXIT IF(ISP2(I)%Y.EQ.RNODATA)EXIT TISP=TISP+1 ENDDO END SUBROUTINE ISGATTRIBUTESGETISPVALUES !###====================================================================== SUBROUTINE ISGATTRIBUTES() !###====================================================================== IMPLICIT NONE INTEGER :: ITYPE,I,J,IOS,ITAB,IX TYPE(WIN_MESSAGE) :: MESSAGE CHARACTER(LEN=8) :: CDATE REAL :: Y LOGICAL :: LEX CALL WDIALOGSELECT(ID_DISGEDITTAB1) CALL WDIALOGGETMENU(IDF_MENU1,ISG(1:NISG)%ILIST) IF(SUM(ISG(1:NISG)%ILIST).NE.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to select just 1 Segment before entering the attributes-dialog','Oops!') RETURN ENDIF DO ISELISG=1,NISG; IF(ISG(ISELISG)%ILIST.EQ.1)EXIT; END DO CALL WDIALOGLOAD(ID_DISGATTRIBUTES,ID_DISGATTRIBUTES) CALL WDIALOGPUTSTRING(IDF_GROUP1,'Attributes for segment: '//TRIM(ISG(ISELISG)%SNAME)) CALL WDIALOGPUTSTRING(IDF_STRING2,TRIM(ISG(ISELISG)%SNAME)) CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB3) CALL WDIALOGPUTIMAGE(ID_OPEN, ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS,1) ISPMAXROW=WINFOGRID(IDF_GRID1,GRIDROWSMAX) CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGPUTIMAGE(ID_RENAME,ID_ICONRENAME,1) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS,1) CALL WDIALOGPUTIMAGE(ID_COPY,ID_ICONCOPY,1) CALL WDIALOGPUTIMAGE(ID_UPDATE,ID_ICONREDRAW,1) CALL WDIALOGPUTIMAGE(ID_MATH,ID_ICONCALC,1) CALL WDIALOGPUTIMAGE(ID_PICK,ID_ICONSELECTPOINT,1) CALL WDIALOGPUTIMAGE(ID_TABLE,ID_ICONEDITATTRIB,1) ISCMAXROW=WINFOGRID(IDF_GRID1,GRIDROWSMAX) CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB1) CALL WDIALOGPUTIMAGE(ID_RENAME,ID_ICONRENAME,1) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS,1) CALL WDIALOGPUTIMAGE(ID_COPY,ID_ICONCOPY,1) CALL WDIALOGPUTIMAGE(ID_UPDATE,ID_ICONREDRAW,1) CALL WDIALOGPUTIMAGE(ID_MATH,ID_ICONCALC,1) ISDMAXROW=WINFOGRID(IDF_GRID1,GRIDROWSMAX) CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB4) CALL WDIALOGPUTIMAGE(ID_RENAME,ID_ICONRENAME,1) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS,1) CALL WDIALOGPUTIMAGE(ID_COPY,ID_ICONCOPY,1) CALL WDIALOGPUTIMAGE(ID_UPDATE,ID_ICONREDRAW,1) CALL WDIALOGPUTIMAGE(ID_MATH,ID_ICONCALC,1) ISTMAXROW=WINFOGRID(IDF_GRID1,GRIDROWSMAX) CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB5) CALL WDIALOGPUTIMAGE(ID_RENAME,ID_ICONRENAME,1) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS,1) CALL WDIALOGPUTIMAGE(ID_COPY,ID_ICONCOPY,1) CALL WDIALOGPUTIMAGE(ID_UPDATE,ID_ICONREDRAW,1) CALL WDIALOGPUTIMAGE(ID_MATH,ID_ICONCALC,1) ISQMAXROW=WINFOGRID(IDF_GRID1,GRIDROWSMAX) SELISD=0; SELISC=0; SELIST=0; SELISQ=0 LEX=.FALSE. !## record position - waterlevels IF(ISGATTRIBUTESREADISDVALUE())THEN !## record position - cross-section IF(ISGATTRIBUTESREADISCVALUE(ID_DISGATTRIBUTESTAB2))THEN !## record position - structures IF(ISGATTRIBUTESREADISTVALUE())THEN !## record position - qh-relationships IF(ISGATTRIBUTESREADISQVALUE())THEN !## put coordinates for selected segment IF(ISGATTRIBUTESREADISPVALUE())LEX=.TRUE. ENDIF ENDIF ENDIF ENDIF !## read everything IF(LEX)THEN !## put selected values for current cross-section CALL ISGATTRIBUTESPUTISCVALUES() !## put selected values for current calculation point CALL ISGATTRIBUTESPUTISDVALUES() !## put selected values for current weir point CALL ISGATTRIBUTESPUTISTVALUES() !## put selected values for current qh relationship CALL ISGATTRIBUTESPUTISQVALUES() !## put selected values for current segment CALL ISGATTRIBUTESPUTISPVALUES() CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL IGRSELECT(3,IDF_PICTURE1) CALL WCURSORSHAPE(CURARROW) CALL WDIALOGSELECT(ID_DMANAGER) CALL WDIALOGHIDE() CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGPUTMENU(IDF_MENU1,(/'Waterlevels ','BottomLevels','Resistance ','Inf.factor '/),4,1) CALL WDIALOGSHOW(-1,-1,0,3) !123456789012 !## read values from dialog CALL ISGATTRIBUTESUPDATEPLOTS() DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (MOUSEMOVE) IF(MESSAGE%WIN.EQ.ID_DISGATTRIBUTES)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTES) I=WINFODIALOGFIELD(IDF_REAL1,FIELDSTATE) IF(I.EQ.1)THEN ! CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGGETTAB(IDF_TAB1,ITAB) !## waterlevels, etc. IF(ITAB.EQ.ID_DISGATTRIBUTESTAB1.OR. & ITAB.EQ.ID_DISGATTRIBUTESTAB4)THEN IF(ITAB.EQ.ID_DISGATTRIBUTESTAB1)CALL ISGATTRIBUTESPLOTISDMOUSE(MESSAGE%GX,MESSAGE%GY,IX,Y) IF(ITAB.EQ.ID_DISGATTRIBUTESTAB4)THEN IX=INT(MESSAGE%GX) Y =MESSAGE%GY ENDIF CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGPUTREAL(IDF_REAL1,Y,'(F10.2)') I=UTL_JDATETOIDATE(IX) WRITE(CDATE,'(I8)',IOSTAT=IOS) I IF(IOS.EQ.0)CALL WDIALOGPUTSTRING(IDF_STRING1,CDATE(1:4)//'-'//CDATE(5:6)//'-'//CDATE(7:8)) !## cross-section/qh relationships/coordinates ELSEIF(ITAB.EQ.ID_DISGATTRIBUTESTAB2.OR. & ITAB.EQ.ID_DISGATTRIBUTESTAB3.OR. & ITAB.EQ.ID_DISGATTRIBUTESTAB5)THEN CALL WDIALOGPUTREAL(IDF_REAL1,MESSAGE%GY,'(F10.2)') CALL WDIALOGPUTREAL(IDF_REAL2,MESSAGE%GX,'(F10.2)') ENDIF ENDIF ENDIF CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (IDF_CHECK1,IDF_CHECK2) IF(MESSAGE%WIN.EQ.ID_DISGATTRIBUTESTAB2)CALL ISGATTRIBUTESUPDATEPLOTS() CASE (IDF_RADIO1,IDF_RADIO2) IF(MESSAGE%WIN.EQ.ID_DISGATTRIBUTESTAB2)THEN IF(MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)THEN CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGGETMENU(IDF_MENU1,J) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) ISCN(J)=1; IF(I.EQ.2)ISCN(J)=-1 CALL ISGATTRIBUTESUPDATEPLOTS() CALL ISGATTRIBUTESPUTISCVALUES() ENDIF ENDIF END SELECT SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU1) !## read adjustments first before putting new ones! CALL ISGATTRIBUTESUPDATEPLOTS() IF(MESSAGE%WIN.EQ.ID_DISGATTRIBUTESTAB1)THEN !## put selected values for current calculation point CALL ISGATTRIBUTESPUTISDVALUES() !## read/plot new puttings CALL ISGATTRIBUTESUPDATEPLOTS() ELSEIF(MESSAGE%WIN.EQ.ID_DISGATTRIBUTESTAB2)THEN !## put selected values for current cross-section CALL ISGATTRIBUTESPUTISCVALUES() !## read/plot new puttings CALL ISGATTRIBUTESUPDATEPLOTS() ELSEIF(MESSAGE%WIN.EQ.ID_DISGATTRIBUTESTAB4)THEN !## put selected values for current weir point CALL ISGATTRIBUTESPUTISTVALUES() !## read/plot new puttings CALL ISGATTRIBUTESUPDATEPLOTS() ELSEIF(MESSAGE%WIN.EQ.ID_DISGATTRIBUTESTAB5)THEN !## put selected values for current qh relationship CALL ISGATTRIBUTESPUTISQVALUES() !## read/plot new puttings CALL ISGATTRIBUTESUPDATEPLOTS() ENDIF END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_PICK) CALL ISGATTRIBUTES_2DCROSS() CALL ISGATTRIBUTESUPDATEPLOTS() CASE (ID_TABLE) CALL ISGATTRIBUTESUPDATEPLOTS() CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGGETMENU(IDF_MENU1,J) IF(ISGATTRIBUTES_2DCROSS_TABLE(J))CALL ISGATTRIBUTESPUTISCVALUES() !## compute something CASE (ID_MATH) CALL ISGATTRIBUTESMATH() !## rename name cross-section CASE (ID_RENAME) CALL ISGATTRIBUTESRENAME() !## copy cross-section definition from other cross-section CASE (ID_COPY) CALL ISGATTRIBUTESCOPY() !## plot cross-section/heads CASE (ID_UPDATE) CALL ISGATTRIBUTESUPDATEPLOTS() !## open/save data CASE (ID_OPEN,ID_SAVEAS) CALL ISGATTRIBUTESSAVEOPEN(MESSAGE%VALUE1) CASE (IDOK) CALL ISGATTRIBUTESUPDATEPLOTS() CALL ISGATTRIBUTESSAVE() EXIT CASE (IDHELP) CALL IMODGETHELP('4.4.3.2','MMO.IGO.IE.Attr') CASE (IDCANCEL) ! CALL ISGATTRIBUTESUPDATEPLOTS() ! CALL WMESSAGEBOX(YESNOCANCEL,QUESTIONICON,COMMONNO,'Do you want to take any adjustments made ?', & ! 'Question') ! IF(WINFODIALOG(4).GT.0)THEN ! IF(WINFODIALOG(4).EQ.1)CALL ISGATTRIBUTESSAVE() EXIT ! ENDIF END SELECT CASE (EXPOSE,RESIZE,TABCHANGED) CALL ISGATTRIBUTESUPDATEPLOTS() END SELECT ENDDO ENDIF CALL WDIALOGSELECT(ID_DISGATTRIBUTES) CALL WDIALOGUNLOAD() IF(ALLOCATED(DATISD2))DEALLOCATE(DATISD2) IF(ALLOCATED(DATISC2))DEALLOCATE(DATISC2) IF(ALLOCATED(DATIST2))DEALLOCATE(DATIST2) IF(ALLOCATED(DATISQ2))DEALLOCATE(DATISQ2) IF(ALLOCATED(TISD))DEALLOCATE(TISD) IF(ALLOCATED(TISC))DEALLOCATE(TISC) IF(ALLOCATED(ISCN))DEALLOCATE(ISCN) IF(ALLOCATED(TIST))DEALLOCATE(TIST) IF(ALLOCATED(TISQ))DEALLOCATE(TISQ) CALL IGRSELECT(DRAWWIN,MPW%IWIN) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRUNITS(MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX) CALL IDFPLOTFAST(1) END SUBROUTINE ISGATTRIBUTES !###==================================================================== SUBROUTINE ISGATTRIBUTES_2DCROSS() !###==================================================================== IMPLICIT NONE INTEGER :: ITYPE,J TYPE(WIN_MESSAGE) :: MESSAGE CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGGETMENU(IDF_MENU1,J) CALL WDIALOGLOAD(ID_DISGCROSS2D,ID_DISGCROSS2D) J=ISG(ISELISG)%ICRS-1+J CALL WDIALOGPUTSTRING(IDF_LABEL3,'Cross-Section:'//TRIM(ISC(J)%CNAME)) ICROSS_PNTR=MAX(1,ICROSS_PNTR); ICROSS_ZVAL=MAX(1,ICROSS_ZVAL) CALL WDIALOGPUTMENU(IDF_MENU1,MP%ALIAS,MPW%NACT,ICROSS_PNTR) CALL WDIALOGPUTMENU(IDF_MENU2,MP%ALIAS,MPW%NACT,ICROSS_ZVAL) CALL WDIALOGSHOW(-1,-1,0,2) !123456789012 DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU1) END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK) CALL WDIALOGGETMENU(IDF_MENU1,ICROSS_PNTR) CALL WDIALOGGETMENU(IDF_MENU2,ICROSS_ZVAL) IF(ISGATTRIBUTES_2DCROSS_ADD(J))EXIT CASE (IDCANCEL) EXIT END SELECT END SELECT ENDDO CALL WDIALOGSELECT(ID_DISGCROSS2D); CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DISGATTRIBUTES) END SUBROUTINE ISGATTRIBUTES_2DCROSS !###==================================================================== LOGICAL FUNCTION ISGATTRIBUTES_2DCROSS_ADD(J) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: J TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:) :: ICROSS INTEGER :: I,IROW,ICOL,IPNT,NPNT REAL :: IP,TD,ZVAL,XC,YC ISGATTRIBUTES_2DCROSS_ADD=.FALSE. IF(MP(ICROSS_PNTR)%IPLOT.NE.1.OR.MP(ICROSS_ZVAL)%IPLOT.NE.1)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'You need to select IDF files only!','Error') RETURN ENDIF ALLOCATE(ICROSS(2)); DO I=1,SIZE(ICROSS); CALL IDFNULLIFY(ICROSS(I)); ENDDO IF(.NOT.IDFREAD(ICROSS(1),MP(ICROSS_PNTR)%IDFNAME,1))RETURN CALL IDFCOPY(ICROSS(1),ICROSS(2)) IF(.NOT.IDFREADSCALE(MP(ICROSS_ZVAL)%IDFNAME,ICROSS(2),2,1,0.0,0))RETURN !## number of nodes on segment NPNT=ISG(ISELISG)%NSEG; IPNT=ISG(ISELISG)%ISEG !## compute correct x/y coordinate of current cross-section CALL ISGADJUSTCOMPUTEXY(IPNT,NPNT,ISC(J)%DIST,TD) CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2) CALL WDIALOGCLEARFIELD(IDF_GRID1) CALL IDFIROWICOL(ICROSS(1),IROW,ICOL,ISGX,ISGY) IF(IROW.NE.0.AND.ICOL.NE.0)THEN IP=ICROSS(1)%X(ICOL,IROW) IF(IP.NE.ICROSS(1)%NODATA)THEN I=0; DO IROW=1,ICROSS(1)%NROW; DO ICOL=1,ICROSS(1)%NCOL !## location of gridcell equal to pointer value at location of cross-section IF(ICROSS(1)%X(ICOL,IROW).EQ.IP)THEN ZVAL=ICROSS(2)%X(ICOL,IROW) IF(ZVAL.NE.ICROSS(2)%NODATA)THEN I=I+1 IF(I.GT.ISCMAXROW)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Maximum number of records to be read is '//TRIM(ITOS(ISCMAXROW))//CHAR(13)// & 'Current bathemetry exceeds these number of records, rest will be left out!','Error') RETURN ENDIF CALL IDFGETLOC(ICROSS(1),IROW,ICOL,XC,YC) CALL WGRIDPUTCELLREAL(IDF_GRID1,1,I,XC,'(F10.2)') CALL WGRIDPUTCELLREAL(IDF_GRID1,2,I,YC,'(F10.2)') CALL WGRIDPUTCELLREAL(IDF_GRID1,3,I,ZVAL,'(F10.2)') ENDIF ENDIF ENDDO; ENDDO ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Pointer value is equal to nodata value','Error') ENDIF ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Position of cross-section is outside Pointer IDF','Error') ENDIF CALL IDFDEALLOCATE(ICROSS,SIZE(ICROSS)); DEALLOCATE(ICROSS) IF(I.EQ.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'No Bathemetry found with values not equal to its NodataValue','Error') ELSE ISGATTRIBUTES_2DCROSS_ADD=.TRUE. ENDIF END FUNCTION ISGATTRIBUTES_2DCROSS_ADD !###====================================================================== LOGICAL FUNCTION ISGATTRIBUTES_2DCROSS_TABLE(J) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: J INTEGER :: I,ITYPE,IROW,ICOL,IPLTCLR,ICLR TYPE(WIN_MESSAGE) :: MESSAGE TYPE(IDFOBJ) :: IDF ISGATTRIBUTES_2DCROSS_TABLE=.FALSE. IF(.NOT.ISGATTRIBUTES_2DCROSS_READ(J,IDF))RETURN CALL WDIALOGLOAD(ID_DIDFEDITTABLE,ID_DIDFEDITTABLE) IF(IDF%NROW.GT.WINFOGRID(IDF_GRID1,GRIDROWSMAX))THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD can not present results in table'//CHAR(13)// & 'with more than '//TRIM(ITOS(WINFOGRID(IDF_GRID1,GRIDROWSMAX)))//' rows','Warning') CALL WDIALOGUNLOAD(); CALL IDFDEALLOCATEX(IDF) RETURN ENDIF CALL WDIALOGSELECT(ID_DIDFEDITTABLE); CALL WDIALOGPUTINTEGER(IDF_INTEGER1,30) CALL WDIALOGSELECT(ID_DIDFEDITTABLE); CALL WDIALOGSHOW(0,0,0,3) CALL WDIALOGFIELDOPTIONS(IDF_GRID1,EDITFIELDCHANGED,1) CALL WDIALOGUNDEFINED(RVALUE=IDF%NODATA) IF(ICROSS_ZVAL.EQ.0)THEN CALL WDIALOGFIELDSTATE(IDF_CHECK1,0) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1,0) ENDIF CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IPLTCLR) CALL ISGATTRIBUTES_2DCROSS_TABLEVALUES(IDF%NCOL,IDF%NROW,IDF%X,IDF%NODATA,IPLTCLR) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE1) CASE (IDF_CHECK1) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IPLTCLR) CALL ISGATTRIBUTES_2DCROSS_TABLEVALUES(IDF%NCOL,IDF%NROW,IDF%X,IDF%NODATA,IPLTCLR) CASE (IDF_GRID1) CALL WGRIDPOS(MESSAGE%X,ICOL,IROW) CALL WGRIDGETCELLREAL(IDF_GRID1,ICOL,IROW,IDF%X(ICOL,IROW)) IF(IDF%X(ICOL,IROW).NE.IDF%NODATA)THEN IF(IPLTCLR.EQ.1)THEN ICLR=UTL_IDFGETCLASS(MP(ICROSS_ZVAL)%LEG,IDF%X(ICOL,IROW)) CALL WGRIDCOLOURCELL(IDF_GRID1,ICOL,IROW,-1,ICLR) ELSE CALL WGRIDCOLOURCELL(IDF_GRID1,ICOL,IROW,-1,-1) ENDIF ENDIF END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_WIDTH) CALL ISGATTRIBUTES_2DCROSS_TABLEVALUES(IDF%NCOL,IDF%NROW,IDF%X,IDF%NODATA,IPLTCLR) CASE (IDOK) TISC(J)=0; DO IROW=1,IDF%NROW; DO ICOL=1,IDF%NCOL CALL WGRIDGETCELLREAL(IDF_GRID1,ICOL,IROW,IDF%X(ICOL,IROW)) IF(IDF%X(ICOL,IROW).NE.IDF%NODATA)THEN TISC(J)=TISC(J)+1 CALL IDFGETLOC(IDF,IROW,ICOL,DATISC2(J,TISC(J))%DISTANCE,DATISC2(J,TISC(J))%BOTTOM) DATISC2(J,TISC(J))%KM=IDF%X(ICOL,IROW) ENDIF ENDDO; ENDDO ISGATTRIBUTES_2DCROSS_TABLE=.TRUE.; EXIT CASE (IDCANCEL) EXIT CASE (IDHELP) CALL IMODGETHELP('4.1.4.3','MMO.IDO.IE.Calc') END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD(); CALL WDIALOGSELECT(ID_DISGATTRIBUTESTAB2); CALL IDFDEALLOCATEX(IDF) END FUNCTION ISGATTRIBUTES_2DCROSS_TABLE !###====================================================================== SUBROUTINE ISGATTRIBUTES_2DCROSS_TABLEVALUES(NC,NR,X,NODATA,IPLTCLR) !###====================================================================== IMPLICIT NONE REAL,INTENT(IN) :: NODATA INTEGER,INTENT(IN) :: NR,NC,IPLTCLR REAL,INTENT(IN),DIMENSION(NC,NR) :: X INTEGER,ALLOCATABLE,DIMENSION(:) :: IC,WC INTEGER :: ICOL,IROW,ICLR,I CALL WDIALOGSELECT(ID_DIDFEDITTABLE); CALL WDIALOGGETINTEGER(IDF_INTEGER1,I); CALL WGRIDROWS(IDF_GRID1,NR) ALLOCATE(IC(NC),WC(NC)); IC=1; WC=I; CALL WGRIDCOLUMNS(IDF_GRID1,NC,IC); DEALLOCATE(IC,WC) DO ICOL=1,NC; CALL WGRIDLABELCOLUMN(IDF_GRID1,ICOL,TRIM(ITOS(ICOL))); ENDDO DO IROW=1,NR; CALL WGRIDLABELROW (IDF_GRID1,IROW,TRIM(ITOS(IROW))); ENDDO CALL WDIALOGSELECT(ID_DIDFEDITTABLE) DO IROW=1,NR; DO ICOL=1,NC IF(X(ICOL,IROW).NE.NODATA)THEN CALL WGRIDPUTCELLREAL(IDF_GRID1,ICOL,IROW,X(ICOL,IROW)) IF(IPLTCLR.EQ.1)THEN ICLR=UTL_IDFGETCLASS(MP(ICROSS_ZVAL)%LEG,X(ICOL,IROW)) CALL WGRIDCOLOURCELL(IDF_GRID1,ICOL,IROW,-1,ICLR) ENDIF ENDIF ENDDO; ENDDO END SUBROUTINE ISGATTRIBUTES_2DCROSS_TABLEVALUES END MODULE MOD_ISG