!! Copyright (C) Stichting Deltares, 2005-2020. !! !! 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_MAIN USE WINTERACTER USE RESOURCE USE IMODVAR USE MOD_PREF_PAR, ONLY : PREFVAL USE MOD_OSD, ONLY : OSD_GETENV USE MODPLOT USE MOD_IDFPLOT USE MOD_UTL USE MOD_POLYGON_PAR USE MOD_POLYGON_UTL USE MOD_ISG_PAR USE MOD_IPF_PAR USE MOD_PLUGIN_PAR USE MOD_PLUGIN USE MOD_IDF USE MOD_PROFILE_PAR USE MOD_MANAGER_UTL USE MOD_PLINES_TRACE, ONLY : TRACE_3D_INIT USE MOD_POLYGON USE MOD_LEGPLOT USE MOD_MODEL, ONLY : MODEL1MOUSEMOVE,MODEL1INIT USE MOD_ISG USE MOD_IR, ONLY : IR1INIT USE MOD_RO_SCEN, ONLY : ROSCENINIT USE MOD_MANAGER USE MOD_PMANAGER, ONLY : PMANAGER_UTL_SHOW USE MOD_IPFGETVALUE, ONLY : IPFGETVALUE_MAIN USE MOD_PREF, ONLY : PREFMAIN USE MOD_IDFGETVALUE, ONLY : IDFGETVALUE_MAIN USE MOD_INFO, ONLY : INFOMAIN USE MOD_IDFTIMESERIE, ONLY : IDFTIMESERIE_MAIN USE MOD_SETTINGS, ONLY : SETTINGS_MAIN USE MOD_ASC2IDF, ONLY : ASC2IDF_EXPORTASC USE MOD_IDFEDIT, ONLY : IDFEDITINIT USE MOD_EXTRACTIPF, ONLY : EXTRACTIPF1INIT USE MOD_TOOLS, ONLY : TOOLS_INIT USE MOD_CREATEIDF, ONLY : CREATEIDF1INIT USE MOD_CREATEISG, ONLY : CREATEISG1INIT USE MOD_PLINES, ONLY : PLINES1INIT USE MOD_SPOINTS,ONLY : STARTP1_INIT USE MOD_LEGEND, ONLY : LEG_MAIN,LEG_CREATE_INIT USE MOD_MATH, ONLY : MATH1MAIN USE MOD_3D, ONLY : IMOD3D_INIT,IMOD3D_MENUSELECT !,IMOD3D_CLOSE USE MOD_3D_SETTINGS, ONLY : IMOD3D_DISPLAY_UPDATE USE MOD_IMPORT, ONLY : IMPORT_MAIN USE MOD_SCENTOOL, ONLY : ST1INIT USE MOD_NC2IDF, ONLY : NC2IDF_EXPORTNC,NC2IDF_EXPORTNC_CLOSE USE MOD_TOPO, ONLY : TOPO1MAIN,TOPOINIT USE MOD_GENPLOT, ONLY : TOPOSHPTOGEN USE MOD_SOBEK, ONLY : SOBEK1MAIN USE MOD_SOLID, ONLY : SOLID_INIT USE MOD_ABOUT, ONLY : IMOD_AGREEMENT,IMOD_ABOUT,IMOD_ACKNOWLEDGEMENT USE MOD_QUICKOPEN, ONLY : IDFQUICKOPEN_INIT USE MOD_CREATEGEN, ONLY : CREATEGEN1INIT USE MOD_CREATEIPF, ONLY : CREATEIPF1MAIN,CREATEIPF1INIT USE MOD_BATCH_MAIN, ONLY : CREATEIMODBATCHINIT USE MOD_SUBSURFEX, ONLY : SUBSURFEXINIT USE MOD_WBAL_ANALYSE, ONLY : WBAL_ANALYSE_INIT USE MOD_MOVIE, ONLY : MOVIE_CREATE_INIT,MOVIE_PLAY_INIT USE MOD_GEOCONNECT, ONLY: GC_MAIN_INIT USE MOD_DEVWEL USE MOD_DEMO USE MOD_START USE MOD_IPEST_ANALYSER, ONLY : IPEST_ANALYSE_INIT USE MOD_MSPINSPECTOR, ONLY : MSPINSPECTOR_INIT USE MOD_UZFANALYSER, ONLY : UZFANALYSER_INIT CONTAINS !###====================================================================== SUBROUTINE IMOD1MENU(ITYPE,MESSAGE,MOUSEX,MOUSEY) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE REAL(KIND=DP_KIND),INTENT(IN) :: MOUSEX,MOUSEY INTEGER,INTENT(IN) :: ITYPE INTEGER :: IKILL SELECT CASE (ITYPE) !## some menu-topic selected CASE(MENUSELECT) CALL IMOD1MENUSELECT(MESSAGE) !## close selected window - if root window terminate iMOD CASE(TIMEREXPIRED) SELECT CASE (MESSAGE%VALUE1) CASE(1) CALL MAIN_UTL_SAVE_IMF(TRIM(PREFVAL(1))//'\IMFILES\AUTOSAVE-IMOD_'//TRIM(OSD_GETENV('USERNAME'))//'.IMF',0) CASE(2) CALL PLUGIN_EXE_CHECK_RUN(1,IKILL) END SELECT !## close selected window - if root window terminate iMOD CASE(CLOSEREQUEST) CALL PLUGIN_EXE_CHECK_RUN(0,IKILL) IF(IKILL.EQ.0)THEN IF(IMODCLOSE(MESSAGE%WIN))THEN; ENDIF ENDIF !## mouse move CASE(MOUSEMOVE) CALL IMOD1MOUSEMOVE(MESSAGE,MOUSEX,MOUSEY) !## mouse released CASE(MOUSEBUTUP) CALL IMOD1MOUSEBUTUP(MESSAGE) !## mouse pressed CASE(MOUSEBUTDOWN) CALL IMOD1MOUSEBUTDOWN(MESSAGE,MOUSEX,MOUSEY) !## bitmap scrolled, renew top-left pixel coordinates CASE (BITMAPSCROLLED) MPW%IX=MESSAGE%VALUE1; MPW%IY=MESSAGE%VALUE2 !## exposed/resized CASE (EXPOSE,RESIZE) CALL IMOD1EXPOSERESIZE() END SELECT END SUBROUTINE IMOD1MENU !###====================================================================== SUBROUTINE IMOD1MOUSEMOVE(MESSAGE,MOUSEX,MOUSEY) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE REAL(KIND=DP_KIND),INTENT(IN) :: MOUSEX,MOUSEY INTEGER :: ITAB !## model tool CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_RUNMODEL,2).EQ.1)THEN IF(MODEL1MOUSEMOVE(MOUSEX,MOUSEY,IDOWN,DOWNX,DOWNY))RETURN !## solid tool ELSEIF(WMENUGETSTATE(ID_SOLIDS,2).EQ.1)THEN CALL WDIALOGSELECT(ID_DSOLID) CALL WDIALOGGETTAB(IDF_TAB1,ITAB) IF(ITAB.EQ.ID_DSOLIDTAB1)THEN IF(IDOWN.NE.5.AND.IDOWN.NE.8)CALL IMODINFOPLOT(MESSAGE,MOUSEX,MOUSEY) RETURN ENDIF ENDIF SELECT CASE (IDOWN) !## left mouse button pressed CASE (4) IF(CRDITYPE.GT.0.AND.CRDITYPE.LE.3)THEN CALL POLYGON1ADJUSTSHAPE(MOUSEX,MOUSEY,DOWNX,DOWNY) ELSEIF(SUM(IMOVELG).GT.0)THEN CALL IDFPLOT_FEATURES_LEGEND_MOVE(MOUSEX,MOUSEY,DOWNX,DOWNY) ELSEIF(SUM(IMOVESC).GT.0)THEN CALL IDFPLOT_FEATURES_SCALE_MOVE(MOUSEX,MOUSEY,DOWNX,DOWNY) ELSEIF(SUM(IMOVEAX).GT.0)THEN CALL IDFPLOT_FEATURES_AXES_MOVE(MOUSEX,MOUSEY,DOWNX,DOWNY) ENDIF !## ctrl+left/middle mouse button CASE (8) !5,8) CALL IDFMOVEIT(REAL(MESSAGE%GX,8),REAL(MESSAGE%GY,8),0) !## no mouse button pressed CASE (0) ICRD=0; CRDITYPE=0 !## get nearby location of shape-definition IF(SHP%NPOL.GT.0)CALL POLYGON1MOUSEMOVE(MOUSEX,MOUSEY,1) !## try positioning features IF(CRDITYPE.EQ.0)THEN CALL IDFPLOT_FEATURES_LEGEND_SELECT(MOUSEX,MOUSEY) IF(SUM(IMOVELG).EQ.0)THEN !## try scalebar moving CALL IDFPLOT_FEATURES_SCALE_SELECT(MOUSEX,MOUSEY) !## try axes moving IF(SUM(IMOVESC).EQ.0)CALL IDFPLOT_FEATURES_AXES_SELECT(MOUSEX,MOUSEY) ENDIF ENDIF END SELECT !## get name of current visible idf-map - not during map-moving IF(IDOWN.NE.5.AND.IDOWN.NE.8)CALL IMODINFOPLOT(MESSAGE,MOUSEX,MOUSEY) END SUBROUTINE IMOD1MOUSEMOVE !###====================================================================== SUBROUTINE IMOD1MOUSEBUTUP(MESSAGE) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE !## mouse released SELECT CASE (MESSAGE%VALUE1) !## left/middle/right mouse button released CASE (1,2,3) SELECT CASE (IDOWN) CASE (4) !## refresh position of legend IF(CRDITYPE.LT.0)CALL IDFPLOTFAST(0) IF(SUM(IMOVESC).GT.0)THEN CALL IDFPLOTFAST(0) CALL IDFPLOT_FEATURES_SCALE_DRAWBOX() ENDIF IF(SUM(IMOVEAX).GT.0)THEN CALL IDFPLOTFAST(0) CALL IDFPLOT_FEATURES_AXES_DRAWBOX() ENDIF IF(SUM(IMOVELG).GT.0)THEN CALL IDFPLOTFAST(0) CALL IDFPLOT_FEATURES_LEGEND_DRAWBOX() ENDIF !## ctrl-left - stop moving CASE (8) CALL IDFMOVEPLOT(0) CALL IDFMOVECLOSE(0) CALL MANAGER_UTL_MENUFIELDS(ID_MOVEMAP,0,1) !## shift-left CASE (6) END SELECT END SELECT IDOWN=0 END SUBROUTINE IMOD1MOUSEBUTUP !###====================================================================== SUBROUTINE IMOD1MOUSEBUTDOWN(MESSAGE,MOUSEX,MOUSEY) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE REAL(KIND=DP_KIND),INTENT(IN) :: MOUSEX,MOUSEY INTEGER :: ITAB IDOWN=MESSAGE%VALUE2 ! SELECT CASE (MESSAGE%VALUE2) ! CASE (MODCTRL,MODSHIFT) ! IF(GKEYPRESSED.GT.0)THEN ! GKEYPRESSED=0 ! ELSE ! GKEYPRESSED=MESSAGE%VALUE2 ! ENDIF ! END SELECT SELECT CASE (IDOWN) !## left CASE (4,5) DOWNX=MOUSEX DOWNY=MOUSEY !## check whether line will be selected in case of isgedit only! IF(WMENUGETSTATE(ID_ISGEDIT,2).EQ.1)THEN CALL WDIALOGSELECT(ID_DISGEDIT) CALL WDIALOGGETTAB(IDF_TAB,ITAB) SELECT CASE (ITAB) CASE (ID_DISGEDITTAB1) CALL ISGCHECKISG(MOUSEX,MOUSEY,0) CASE DEFAULT !## check polygon CALL POLYGON1SELECT() END SELECT ELSE !## check whether polygon tab is active for startpoint IF(WMENUGETSTATE(ID_SPOINTS,2).EQ.1)THEN CALL WDIALOGSELECT(ID_DSPOINTS) CALL WDIALOGGETTAB(ID_DTAB,ITAB) IF(ITAB.EQ.ID_DSPTAB1)CALL POLYGON1SELECT() !## check whether polygon tab is active for solids ELSEIF(WMENUGETSTATE(ID_SOLIDS,2).EQ.1)THEN CALL WDIALOGSELECT(ID_DSOLID) CALL WDIALOGGETTAB(IDF_TAB1,ITAB) IF(ITAB.EQ.ID_DSOLIDTAB2)CALL POLYGON1SELECT() ELSE !## check polygon CALL POLYGON1SELECT() ENDIF ENDIF !## ctrl-left/middle - start moving CASE (8) CALL MANAGER_UTL_MENUFIELDS(ID_MOVEMAP,1,0) CALL IDFMOVEINIT(1,0) CALL WCURSORSHAPE(ID_CURSORHANDGREP) PX=INT(MESSAGE%XPIX) PY=IH-INT(MESSAGE%YPIX) !## shift-left - inzoomen CASE (6) CALL IDFZOOM(ID_ZOOMINMAP,MOUSEX,MOUSEY,0) CALL IDFPLOTFAST(1) ! CALL WGRCURSORPOS(MESSAGE%GX,MESSAGE%GY) !## right CASE (16) !## node on polygon selected IF(CRDITYPE.EQ.1)THEN IF(SHPI.LE.SIZE(SHP%POL))THEN IF(SHP%POL(SHPI)%N.GT.2)CALL WMENUFLOATING(ID_MENU3,MESSAGE%X,MESSAGE%Y) ENDIF !## legend on map selected ELSEIF(CRDITYPE.LT.0)THEN CALL WMENUFLOATING(ID_MENU8,MESSAGE%X,MESSAGE%Y) ELSE IF(WMENUGETSTATE(ID_ISGEDIT,2).EQ.1)THEN IF(ISELISG.NE.0)THEN CALL WMENUFLOATING(ID_MENU5,MESSAGE%X,MESSAGE%Y) ELSE CALL WMENUFLOATING(ID_MENU1,MESSAGE%X,MESSAGE%Y) ENDIF ELSE CALL WMENUFLOATING(ID_MENU1,MESSAGE%X,MESSAGE%Y) ENDIF ENDIF !## ctrl right CASE (17) !## shift right CASE (18) CALL IDFZOOM(ID_ZOOMOUTMAP,MOUSEX,MOUSEY,0) CALL IDFPLOTFAST(1) CALL WGRCURSORPOS(MESSAGE%GX,MESSAGE%GY) END SELECT END SUBROUTINE IMOD1MOUSEBUTDOWN !###====================================================================== SUBROUTINE IMOD1EXPOSERESIZE() !###====================================================================== IMPLICIT NONE CALL WINDOWSELECT(0) END SUBROUTINE IMOD1EXPOSERESIZE !###====================================================================== SUBROUTINE IMOD1MENUSELECT(MESSAGE) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE INTEGER :: I,IP,JP,IB,JB,N CHARACTER(LEN=256) :: FNAME INTEGER,DIMENSION(:),POINTER :: ICOLS SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPENFILES) CALL UTL_LISTOPENFILES() !## import deviated wells CASE (ID_IMPORT_DEVWELLS) CALL DEVWELL_IMPORT('','',ICOLS,0) CASE (ID_IMPORT_DEVWELLS_MULTIPLE) CALL DEVWELL_IMPORT_MULTIPLE() CASE (ID_IMPORTKEYPILLARS) CALL DEVFAULT_IMPORT() CASE (ID_IMPORTSHAPEFILE) CALL TOPOSHPTOGEN() CASE (ID_IMPORTGENFILE) CALL POLYGON_UTL_CONVERTGEN() CASE(ID_IDEBUGLEVEL0,ID_IDEBUGLEVEL1,ID_IDEBUGLEVEL4) IF(WMENUGETSTATE(ID_IDEBUGLEVEL0,2).EQ.1)CALL WMENUSETSTATE(ID_IDEBUGLEVEL0,2,0) IF(WMENUGETSTATE(ID_IDEBUGLEVEL1,2).EQ.1)CALL WMENUSETSTATE(ID_IDEBUGLEVEL1,2,0) IF(WMENUGETSTATE(ID_IDEBUGLEVEL4,2).EQ.1)CALL WMENUSETSTATE(ID_IDEBUGLEVEL4,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) IF(MESSAGE%VALUE1.EQ.ID_IDEBUGLEVEL0)ICDEBUGLEVEL=DBGSILENT IF(MESSAGE%VALUE1.EQ.ID_IDEBUGLEVEL1)ICDEBUGLEVEL=DBGSTDOUT IF(MESSAGE%VALUE1.EQ.ID_IDEBUGLEVEL4)ICDEBUGLEVEL=DBGMSGBOX !## turn new idebuglevel CALL UTL_DEBUGLEVEL(1) CASE (ID_QUICKOPEN) CALL IDFQUICKOPEN_INIT(2,(/'MODELS '/)) !## edit/create solids CASE (ID_SOLIDS) CALL SOLID_INIT() !## 3d CASE (ID_3DTOOL) ISOLID=0 CALL IMOD3D_INIT(0,0) !## agreement CASE(ID_UAGREEMENT) I=1; CALL IMOD_AGREEMENT(I) !## about CASE (ID_ABOUT) CALL IMOD_ABOUT() CASE (ID_ACKNOWLEDGEMENT) CALL IMOD_ACKNOWLEDGEMENT() !## display of idf info or ipf info CASE (ID_IMODINFO,ID_INFO) CALL INFOMAIN() CALL MANAGER_UTL_FILL() !## start imod batch CASE (ID_IMODBATCH) CALL CREATEIMODBATCHINIT CASE (ID_ANALYSEIPF) CALL IPFGETVALUE_MAIN() !## display settings for plotting purposes CASE (ID_IPFCONFIGURE,ID_IFFCONFIGURE,ID_GENCONFIGURE,ID_ISGCONFIGURE) CALL SETTINGS_MAIN() CALL IDFPLOTFAST(0) CALL MANAGER_UTL_UPDATE() !## export/convert GEN files CASE (ID_GENEXPORT) CALL POLYGON1_UTL_EXPORTGEN() !## export CASE (ID_POSTSCRIPT) IF(UTL_WSELECTFILE('Postscript File (*.ps)|*.ps|', & SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,'Save current view as BMP,PCX,PNG-file'))THEN IP=WINFOGRHARDCOPY(PAPERWIDTH) !## in points JP=WINFOGRHARDCOPY(PAPERHEIGHT) !## in points IB=WINFOBITMAP(MPW%IBITMAP,BITMAPWIDTH) JB=WINFOBITMAP(MPW%IBITMAP,BITMAPHEIGHT) CALL IGRSELECT(2,MPW%IBITMAP) !, OPTIONAL IDRIVR Image dump driver number : ! PostScript (2) PostScript/EPS (X Windows default) ! RasterPrinter (4) HP (PCL) or Epson (ESC/P or ESC/P2) printer ! WinPrintMgr (10) Windows Print Manager (Windows default) CALL IGRPRINTIMAGESELECT(2) !EPS CALL IGRPRINTIMAGEOPTIONS(1,IP) !## adjust image height JB=IP*REAL(JB)/REAL(IB); CALL IGRPRINTIMAGEOPTIONS(2,JB) CALL IGRPRINTIMAGEOPTIONS(3,0) !## horizontal adjustment CALL IGRPRINTIMAGEOPTIONS(4,0) !## vertical adjustment ! CALL WPRINTIMAGEOPTIONS(4,FNAME) ! IF(WINFODIALOG(4).NE.1)RETURN CALL IGRPRINTIMAGE(FNAME) CALL IGRSELECT(DRAWWIN) CALL WINDOWSELECT(0) ENDIF !## bmp/pcx/png CASE (ID_RASTER) IF(.NOT.UTL_WSELECTFILE('All Known Files (*.bmp;*.pcx;*.png;*.jpg)|*.bmp;*.pcx;*.png;*.jpg|BitMap (*.bmp)|*.bmp| & ZSoft PC Paintbrush (*.pcx)|*.pcx|Portable Network Graphic image (*.png)|*.png|JPEG Image (*.jpg)|*.jpg|',& SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,& 'Save Current Image to BitMap (*.bmp;*.pcx;*.png;*.jpg)'))RETURN CALL WBITMAPSAVE(MPW%IBITMAP,FNAME) !## printen CASE (ID_PRINT) IF(.FALSE.)then CALL IGRHARDCOPYSELECT(1,10) CALL WHARDCOPYOPTIONS(4)!IUNITS,FILENAME) ! IWPAPER=InfoGrHardcopy(PaperWidth) ! IHPAPER=InfoGrHardcopy(PaperHEIGHT) !###image ratio given by options 1,2 ! RAT=InfoGrHardcopy(AspectRatio) !## hoeveel inch CQ points is dit ! IWINCH=IWPAPER*39.37*72.0 ! IHINCH=IHPAPER*39.37*72.0 !1M=39.37INCH*PT ! CALL IGRHARDCOPYOPTIONS(1,IWPAPER) !IMAGEWIDTH ! CALL IGRHARDCOPYOPTIONS(2,IHPAPER) !IMAGEHEIGHT ! CALL IGRHARDCOPYOPTIONS(3,IHORADJ) ! CALL IGRHARDCOPYOPTIONS(4,IVERADJ) ! WRITE(*,*) IWPAPER,IHPAPER,IWINCH,IHINCH,RAT IF(WINFODIALOG(4).NE.1)RETURN CALL IGRINIT('H') ! HARDCOPY ONLY OUTPUT CALL IGRCOLOURMODEL(24) CALL IGRHARDCOPY(DOCNAME='IMOD PRINT') ! INITIATE HARDCOPY CALL IDFPLOTFAST(0)!(1) CALL IGRHARDCOPY('S') ! SEND DATA TO PRINTER CALL IGRINIT('') ! RE-ENABLE GRAPHICS CALL IGRCOLOURMODEL(24) ELSE CALL IGRSELECT(2,MPW%IBITMAP) CALL IGRPRINTIMAGESELECT(10) !PRINT MANAGER CALL WPRINTIMAGEOPTIONS(4) IF(WINFODIALOG(4).NE.1)RETURN CALL IGRPRINTIMAGE() CALL IGRSELECT(DRAWWIN) CALL WINDOWSELECT(0) ENDIF !## start new plot CASE (ID_NEW) IF(IMODCLOSE(MPW%IWIN))THEN CALL IMODINIT() CALL START_MAIN(I) IF(I.EQ.0)THEN; CALL WINDOWCLOSE(); STOP; ENDIF CALL IDFZOOM(ID_DGOTOXY,0.0D0,0.0D0,0) CALL IDFPLOTFAST(1) IF(DEMO%IDEMO.GT.0)CALL DEMO_MAIN() ENDIF !## stop iMOD CASE(ID_QUIT) IF(IMODCLOSE(0))THEN; ENDIF !## save drawing CASE (ID_OPEN) CALL MAIN_UTL_LOAD_SAVE_IMF(MESSAGE%VALUE1,I) CALL IDFPLOTFAST(1) IF(DEMO%IDEMO.GT.0)CALL DEMO_MAIN() CASE (ID_SAVE,ID_SAVEAS) CALL MAIN_UTL_LOAD_SAVE_IMF(MESSAGE%VALUE1,I) !## view idf-files CASE (ID_OPENIDF) N=0; DO I=1,MXMPLOT; IF(MP(I)%IACT)N=N+1; ENDDO CALL MANAGER_UTL_ADDFILE() IF(N.EQ.0)CALL IDFZOOM(ID_ZOOMFULLMAP,0.0D0,0.0D0,0); CALL IDFPLOTFAST(1) !## sort selected IDF files CASE(ID_SORTTTOB) CALL MANAGERSORT_KEYWORD() CASE(ID_SORTALPHA_AZ,ID_SORTALPHA_ZA) CALL MANAGERSORT_ALPHA(MESSAGE%VALUE1) !## export maps CASE (ID_MAPEXPORT1,ID_MAPEXPORT2,ID_MAPEXPORT3) CALL ASC2IDF_EXPORTASC(MESSAGE%VALUE1) CASE (ID_MAPEXPORTNC1,ID_MAPEXPORTNC2,ID_MAPEXPORTNC3) CALL NC2IDF_EXPORTNC(MESSAGE%VALUE1) CALL NC2IDF_EXPORTNC_CLOSE() !## zooming maps CASE(ID_ZOOMINMAP,ID_ZOOMOUTMAP,ID_ZOOMRECTANGLEMAP,ID_ZOOMFULLMAP,ID_ZOOMTAG,ID_ZOOMPREVIOUS,ID_ZOOMNEXT) CALL MANAGER_UTL_MENUFIELDS(MESSAGE%VALUE1,1,0) CALL IDFZOOM(MESSAGE%VALUE1,(MPW%XMAX+MPW%XMIN)/2.0D0,(MPW%YMAX+MPW%YMIN)/2.0D0,0) CALL IDFPLOTFAST(1) CALL IMOD3D_DISPLAY_UPDATE(MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX) CALL MANAGER_UTL_MENUFIELDS(MESSAGE%VALUE1,0,1) !## redraw image CASE (ID_REDRAW) CALL IDFPLOTFAST(1) !## idf-values CASE(ID_IDFVALUE) CALL IDFGETVALUE_MAIN() CALL WINDOWSELECT(0) !## idf group CASE(ID_IDFGROUP) FNAME='' IF(MANAGER_UTL_GROUP(FNAME))THEN CALL MANAGER_UTL_ADDFILE(FNAME) CALL IDFPLOTFAST(1) ENDIF !## idf ungroup CASE(ID_IDFUNGROUP) CALL MANAGER_UTL_UNGROUP() CASE(ID_IDFSHAPEVALUEPOINTS,ID_IDFSHAPEVALUERECTANGLE,ID_IDFSHAPEVALUEPOLYGON,ID_IDFSHAPEVALUECIRCLE) IF(WMENUGETSTATE(ID_IDFSHAPEVALUEPOINTS,2).EQ.1) CALL WMENUSETSTATE(ID_IDFSHAPEVALUEPOINTS,2,0) IF(WMENUGETSTATE(ID_IDFSHAPEVALUERECTANGLE,2).EQ.1)CALL WMENUSETSTATE(ID_IDFSHAPEVALUERECTANGLE,2,0) IF(WMENUGETSTATE(ID_IDFSHAPEVALUEPOLYGON,2).EQ.1) CALL WMENUSETSTATE(ID_IDFSHAPEVALUEPOLYGON,2,0) IF(WMENUGETSTATE(ID_IDFSHAPEVALUECIRCLE,2).EQ.1) CALL WMENUSETSTATE(ID_IDFSHAPEVALUECIRCLE,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) !## get how idfgetvalue will be presented CASE(ID_IDFGETVALUE_NONE,ID_IDFGETVALUE_ALL,ID_IDFGETVALUE_FIRST) IF(WMENUGETSTATE(ID_IDFGETVALUE_NONE,2).EQ.1) CALL WMENUSETSTATE(ID_IDFGETVALUE_NONE,2,0) IF(WMENUGETSTATE(ID_IDFGETVALUE_ALL,2).EQ.1) CALL WMENUSETSTATE(ID_IDFGETVALUE_ALL,2,0) IF(WMENUGETSTATE(ID_IDFGETVALUE_FIRST,2).EQ.1)CALL WMENUSETSTATE(ID_IDFGETVALUE_FIRST,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) !## idf-edit CASE(ID_IDFEDIT) CALL IDFEDITINIT() !## ISG-edit CASE(ID_ISGEDIT) CALL ISGEDITINIT() !## start segment-edit CASE (ID_ISGISPSTART) CALL ISGISPSTART() !## reset segment-edit CASE (ID_ISGISPRESET) CALL ISGISPRESET() !## save segment-edit CASE (ID_ISGISPSAVE) CALL ISGISPSAVE() !## stop segment-edit CASE(ID_ISGISPSTOP) CALL ISGISPSTOP(0) !## open attributes CASE(ID_ISGATTRIBUTES) CALL ISGATTRIBUTES() !## add cross-section/calculation points to segment CASE(ID_ADDCROSSSECTION,ID_DELETECROSSSECTION,ID_MOVECROSSSECTION, & ID_ADDCALCPOINT ,ID_DELETECALCPOINT ,ID_MOVECALCPOINT, & ID_ADDWEIR ,ID_DELETEWEIR ,ID_MOVEWEIR, & ID_ADDQH ,ID_DELETEQH ,ID_MOVEQH) CALL ISGPOSITIONCRSCLC(MESSAGE%VALUE1) !## delete segment CASE (ID_ISGDEL) 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 ISGDEL(); CALL ISGDELCLOSE() CALL WCURSORSHAPE(CURARROW) ENDIF !## adjust show-mode segments CASE(ID_ISGNODES,ID_ISGCLCNODES,ID_ISGCRSSCTNS,ID_ISGSEGNODES,ID_ISGSTUWEN,ID_ISGQHR,ID_ISGSFR,ID_ISGSFC) I=WMENUGETSTATE(MESSAGE%VALUE1,2) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,ABS(I-1)) I=WMENUGETSTATE(ID_ISGEDIT,2) IF(I.EQ.1)THEN CALL WDIALOGSELECT(ID_DISGEDIT) IF(MESSAGE%VALUE1.EQ.ID_ISGNODES) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1 ,I) IF(MESSAGE%VALUE1.EQ.ID_ISGCLCNODES)CALL WDIALOGPUTCHECKBOX(IDF_CHECK2 ,I) IF(MESSAGE%VALUE1.EQ.ID_ISGCRSSCTNS)CALL WDIALOGPUTCHECKBOX(IDF_CHECK3 ,I) IF(MESSAGE%VALUE1.EQ.ID_ISGSEGNODES)CALL WDIALOGPUTCHECKBOX(IDF_CHECK4 ,I) IF(MESSAGE%VALUE1.EQ.ID_ISGSTUWEN) CALL WDIALOGPUTCHECKBOX(IDF_CHECK5 ,I) IF(MESSAGE%VALUE1.EQ.ID_ISGQHR) CALL WDIALOGPUTCHECKBOX(IDF_CHECK6 ,I) IF(MESSAGE%VALUE1.EQ.ID_ISGSFR) CALL WDIALOGPUTCHECKBOX(IDF_CHECK9 ,I) IF(MESSAGE%VALUE1.EQ.ID_ISGSFC) CALL WDIALOGPUTCHECKBOX(IDF_CHECK10,I) ENDIF CALL IDFPLOTFAST(0) !## adjust accuracy CASE(ID_LOWACCURACY,ID_MEDIUMACCURACY,ID_HIGHACCURACY,ID_EXCELLENTACCURACY) IF(WMENUGETSTATE(ID_LOWACCURACY,2).EQ.1) CALL WMENUSETSTATE(ID_LOWACCURACY,2,0) IF(WMENUGETSTATE(ID_MEDIUMACCURACY,2).EQ.1) CALL WMENUSETSTATE(ID_MEDIUMACCURACY,2,0) IF(WMENUGETSTATE(ID_HIGHACCURACY,2).EQ.1) CALL WMENUSETSTATE(ID_HIGHACCURACY,2,0) IF(WMENUGETSTATE(ID_EXCELLENTACCURACY,2).EQ.1) CALL WMENUSETSTATE(ID_EXCELLENTACCURACY,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) CALL IDFPLOTFAST(0) !## adjust units CASE(ID_UNITSMETER,ID_UNITSFEET) IF(WMENUGETSTATE(ID_UNITSMETER,2).EQ.1)CALL WMENUSETSTATE(ID_UNITSMETER,2,0) IF(WMENUGETSTATE(ID_UNITSFEET,2).EQ.1) CALL WMENUSETSTATE(ID_UNITSFEET,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) IF(MESSAGE%VALUE1.EQ.ID_UNITSMETER)IMOD_IUNITS=1 IF(MESSAGE%VALUE1.EQ.ID_UNITSFEET) IMOD_IUNITS=2 CALL IDFPLOTFAST(0) CASE (ID_IDFRASTERLINES,ID_IDFEXTENT,ID_IDFINDICES) I=WMENUGETSTATE(MESSAGE%VALUE1,2) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,ABS(I-1)) CALL IDFPLOTFAST(0) CASE(ID_MOVEMAP) CALL MANAGER_UTL_MENUFIELDS(MESSAGE%VALUE1,1,0) CALL IDFMOVE(0) CALL MANAGER_UTL_MENUFIELDS(MESSAGE%VALUE1,0,1) !## legend adjustments CASE (ID_CDLNL,ID_CDLL,ID_TDLNL,ID_TDLL,ID_TDUV,ID_CDUV) CALL LEG_CREATE_INIT(MESSAGE%VALUE1) CALL IDFPLOTFAST(1) !## plot legend on map CASE(ID_PLOTLEGEND) CALL LEGPLOT_PLOT_INIT() CALL IDFPLOTFAST(1) CASE(ID_LEGENDCOLUMNS1,ID_LEGENDCOLUMNS2,ID_LEGENDCOLUMNS3,ID_LEGENDCOLUMNS4,ID_LEGENDCOLUMNS5) IF(WMENUGETSTATE(ID_LEGENDCOLUMNS1,2).EQ.1)CALL WMENUSETSTATE(ID_LEGENDCOLUMNS1,2,0) IF(WMENUGETSTATE(ID_LEGENDCOLUMNS2,2).EQ.1)CALL WMENUSETSTATE(ID_LEGENDCOLUMNS2,2,0) IF(WMENUGETSTATE(ID_LEGENDCOLUMNS3,2).EQ.1)CALL WMENUSETSTATE(ID_LEGENDCOLUMNS3,2,0) IF(WMENUGETSTATE(ID_LEGENDCOLUMNS4,2).EQ.1)CALL WMENUSETSTATE(ID_LEGENDCOLUMNS4,2,0) IF(WMENUGETSTATE(ID_LEGENDCOLUMNS5,2).EQ.1)CALL WMENUSETSTATE(ID_LEGENDCOLUMNS5,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) CALL LEGPLOT_PLOTUPDATE() !## adjust legend CASE(ID_ADJUSTLEGEND) IF(LEG_MAIN(0))CALL IDFPLOTFAST(1) !## synchronize legends CASE(ID_SYNLEGENDS) IF(LEG_MAIN(-1))CALL IDFPLOTFAST(1) !## adjust preference dialog CASE (ID_PREFERENCES) CALL PREFMAIN() !## math calc idf. CASE (ID_IDFCALC) CALL MATH1MAIN() !## view manager CASE (ID_MANAGER) CALL MANAGER_UTL_SHOW() !## view manager CASE (ID_PMANAGER) CALL PMANAGER_UTL_SHOW(0) !## view subsurface explorer CASE (ID_SUBSURFEX) CALL SUBSURFEXINIT() !## profiles CASE (ID_PROFILE) ISOLID=0 CALL PROFILE_INIT() CALL UTL_PLOT2BITMAP() !## timeseries CASE (ID_TIMESERIES) CALL IDFTIMESERIE_MAIN() CALL MAIN_UTL_TIMERS() !## movietool CASE (ID_MOVIE_CREATE) CALL MOVIE_CREATE_INIT() CASE (ID_MOVIE_PLAY) CALL MOVIE_PLAY_INIT() !## model-manager CASE (ID_RUNMODEL) CALL MODEL1INIT() !## import modflow model CASE (ID_IMPORTMODFLOW) CALL IMPORT_MAIN() !## import modflow model CASE (ID_IMPORTSOBEK) CALL SOBEK1MAIN() !## start waterbalance analyse CASE (ID_WBAL_ANALYSE) CALL WBAL_ANALYSE_INIT('',0) !## start ipest analyser CASE (ID_IPESTANALYSER) CALL IPEST_ANALYSE_INIT() !## scenario tool CASE (ID_SCENTOOL) CALL ST1INIT() !## plugin tool manager CASE(ID_TI1,ID_TI2,ID_TI3,ID_TI4) IF(WMENUGETSTATE(ID_TI1,2).EQ.1) CALL WMENUSETSTATE(ID_TI1,2,0) IF(WMENUGETSTATE(ID_TI2,2).EQ.1) CALL WMENUSETSTATE(ID_TI2,2,0) IF(WMENUGETSTATE(ID_TI3,2).EQ.1) CALL WMENUSETSTATE(ID_TI3,2,0) IF(WMENUGETSTATE(ID_TI4,2).EQ.1) CALL WMENUSETSTATE(ID_TI4,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) CALL PLUGIN_SETTIMER() CASE(ID_MANAGE_PLUGIN1,ID_MANAGE_PLUGIN2) CALL PLUGIN_MAIN(MESSAGE%VALUE1) CASE(ID_PLUGIN1,ID_PLUGIN2,ID_PLUGIN3,ID_PLUGIN4,ID_PLUGIN5, & ID_PLUGIN6,ID_PLUGIN7,ID_PLUGIN8,ID_PLUGIN9,ID_PLUGIN10) CALL PLUGIN_EXE(MESSAGE%VALUE1) !## GeoConnect tool CASE(ID_GEOCONNECT) CALL GC_MAIN_INIT() !## startpoints CASE (ID_SPOINTS) CALL STARTP1_INIT() !## pathlines CASE (ID_PATHLINES) CALL PLINES1INIT() CASE (ID_MSPANALYSER) CALL MSPINSPECTOR_INIT() CASE (ID_UZFANALYSER) CALL UZFANALYSER_INIT() CASE (ID_INTERACTIVEPATHLINES_DEF,ID_INTERACTIVEPATHLINES_MANUAL) I=WMENUGETSTATE(ID_INTERACTIVEPATHLINES_DEF,2) IF(I.EQ.1)THEN CALL WMENUSETSTATE(ID_INTERACTIVEPATHLINES_DEF,2,0) CALL WMENUSETSTATE(ID_INTERACTIVEPATHLINES_MANUAL,2,1) ELSE CALL WMENUSETSTATE(ID_INTERACTIVEPATHLINES_DEF,2,1) CALL WMENUSETSTATE(ID_INTERACTIVEPATHLINES_MANUAL,2,0) ENDIF CASE (ID_INTERACTIVEPATHLINES) IF(TRACE_3D_INIT(''))CALL IMOD3D_INIT(0,1); DEMO%IDEMO=0 !## (tools) waterbalance; GxG; compute timeseries CASE (ID_WBAL_GENERATE,ID_GXG,ID_TS,ID_MEAN) CALL TOOLS_INIT(MESSAGE%VALUE1) !## ipf extract CASE (ID_EXTRACTIPF) CALL EXTRACTIPF1INIT() !## ir-manager CASE (ID_IRDATABASE) CALL IR1INIT() !## ro-tool ro (equivalent of waternood) CASE (ID_ROTOOL) CALL ROSCENINIT() !## copy to clipboard CASE (ID_COPY) CALL IMOD1CLIPBOARD() !## draw topography CASE (ID_TOPOGRAPHY) CALL TOPOINIT(); CALL IDFPLOTFAST(0) !## add topo-information CASE (ID_ADDTOPO) CALL TOPO1MAIN() CALL MANAGER_UTL_UPDATE() CALL IDFZOOM(ID_DGOTOXY,0.0D0,0.0D0,0) CALL IDFPLOTFAST(0) !## select transparancy of bitmaps CASE(ID_TOPOTRANSPARANCY0,ID_TOPOTRANSPARANCY10,ID_TOPOTRANSPARANCY25,ID_TOPOTRANSPARANCY50,ID_TOPOTRANSPARANCY75,ID_TOPOTRANSPARANCY90) IF(WMENUGETSTATE(ID_TOPOTRANSPARANCY0,2).EQ.1) CALL WMENUSETSTATE(ID_TOPOTRANSPARANCY0,2,0) IF(WMENUGETSTATE(ID_TOPOTRANSPARANCY10,2).EQ.1)CALL WMENUSETSTATE(ID_TOPOTRANSPARANCY10,2,0) IF(WMENUGETSTATE(ID_TOPOTRANSPARANCY25,2).EQ.1)CALL WMENUSETSTATE(ID_TOPOTRANSPARANCY25,2,0) IF(WMENUGETSTATE(ID_TOPOTRANSPARANCY50,2).EQ.1)CALL WMENUSETSTATE(ID_TOPOTRANSPARANCY50,2,0) IF(WMENUGETSTATE(ID_TOPOTRANSPARANCY75,2).EQ.1)CALL WMENUSETSTATE(ID_TOPOTRANSPARANCY75,2,0) IF(WMENUGETSTATE(ID_TOPOTRANSPARANCY90,2).EQ.1)CALL WMENUSETSTATE(ID_TOPOTRANSPARANCY90,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) CALL IDFPLOTFAST(0) CASE(ID_COLOURTONE) I=WMENUGETSTATE(ID_COLOURTONE,2) I=ABS(I-1) CALL WMENUSETSTATE(ID_COLOURTONE,2,I) CALL WMENUSETSTATE(ID_GREYTONES1,1,I) CALL WMENUSETSTATE(ID_GREYTONES2,1,I) CALL WMENUSETSTATE(ID_GREYTONES3,1,I) CALL IDFPLOTFAST(0) CASE(ID_GREYTONES1,ID_GREYTONES2,ID_GREYTONES3) IF(WMENUGETSTATE(ID_GREYTONES1,2).EQ.1)CALL WMENUSETSTATE(ID_GREYTONES1,2,0) IF(WMENUGETSTATE(ID_GREYTONES2,2).EQ.1)CALL WMENUSETSTATE(ID_GREYTONES2,2,0) IF(WMENUGETSTATE(ID_GREYTONES3,2).EQ.1)CALL WMENUSETSTATE(ID_GREYTONES3,2,0) CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) CALL IDFPLOTFAST(0) !## adjust accuracy/show visible extent CASE (ID_TRANSPARANTIDF,ID_TRANSPARANTNODATAIDF,ID_SHOWOPAQUE) CALL WINDOWSELECT(0) IF(WMENUGETSTATE(MESSAGE%VALUE1,2).EQ.1)THEN CALL WMENUSETSTATE(MESSAGE%VALUE1,2,0) ELSE CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) ENDIF CALL IDFPLOTFAST(1) !## autosave CASE (ID_AUTOSAVE) CALL WINDOWSELECT(0) IF(WMENUGETSTATE(MESSAGE%VALUE1,2).EQ.1)THEN CALL WMENUSETSTATE(MESSAGE%VALUE1,2,0) CALL WMENUSETSTRING(MESSAGE%VALUE1,'AutoSave Off') CALL WMESSAGETIMER(0,1) ELSE CALL WMENUSETSTATE(MESSAGE%VALUE1,2,1) CALL WMENUSETSTRING(MESSAGE%VALUE1,'AutoSave On (1 minute)') CALL WMESSAGETIMER(60*1000,1,IREPEAT=1) !minutes ENDIF CASE (ID_HELP) CALL UTL_GETHELP('','') CASE (ID_DELNODE) CALL POLYGON1DELNODE() CASE (ID_LINECOLOR) CALL POLYGON1LINECOLOR() CASE (ID_LTHICKNESS1,ID_LTHICKNESS2,ID_LTHICKNESS3) CALL POLYGON1LINETHICKNESS(MESSAGE%VALUE1) CASE (ID_LOADMASK,ID_SAVEMASK) CALL MAIN_UTL_LOAD_SAVE_IMFMASK(MESSAGE%VALUE1) CASE (ID_ZOOMMASK) CALL IMODZOOMMASK() CASE (ID_GOTOXY) CALL IMODGOTOXY CASE (ID_DISTANCE) CALL UTL_MEASUREMAIN() CASE (ID_CREATEGEN) CALL CREATEGEN1INIT() CASE (ID_CREATEIPF) CALL CREATEIPF1INIT() CASE (ID_ISGGEN_CREATEISGRIV,ID_ISGGEN_CREATEISGSFR) CALL CREATEISG1INIT(MESSAGE%VALUE1) CASE (ID_CREATEIDF_IPF,ID_CREATEIDF_GEN,ID_CREATEIDF_IFF,ID_CREATEIDF_SCRATCH) CALL CREATEIDF1INIT(MESSAGE%VALUE1) CASE(ID_SHOWSCALEBAR,ID_SHOWAXES,ID_SHOWNARROW,ID_SHOWRASTERLINES) I=WMENUGETSTATE(MESSAGE%VALUE1,2); I=ABS(I-1); CALL WMENUSETSTATE(MESSAGE%VALUE1,2,I) CALL IDFPLOTFAST(1) CASE (ID_FCUREXT,ID_FENTDOM,ID_DESELECTALL,ID_FZOOMBOX) CALL CREATEIPF1MAIN(MENUSELECT,MESSAGE) END SELECT END SUBROUTINE IMOD1MENUSELECT !###====================================================================== SUBROUTINE IMOD1CLIPBOARD !###====================================================================== IMPLICIT NONE INTEGER :: IX1,IY1,IX2,IY2,IW,IH,IHANDLE REAL(KIND=DP_KIND) :: OFFSTTXT !## copy whole image if axes are absent IF(WMENUGETSTATE(ID_SHOWAXES,2).EQ.0)THEN CALL WCLIPBOARDPUTBITMAP(MPW%IBITMAP) ELSE CALL IGRSELECT(DRAWBITMAP,MPW%IBITMAP) OFFSTTXT=1.5D0*0.020D0 IW=WINFODRAWABLE(DRAWABLEWIDTH) IH=WINFODRAWABLE(DRAWABLEHEIGHT) IX1=(AX_XP1-OFFSTTXT)*IW IX2=(AX_XP2+OFFSTTXT)*IW IY1=(AX_YP1-OFFSTTXT)*IH IY2=(AX_YP2+OFFSTTXT)*IH !## include scalebar CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_SHOWSCALEBAR,2).EQ.1)THEN IX1=MIN(IX1,INT(SB_XP1*IW)) IX2=MAX(IX2,INT(SB_XP2*IW)) IY1=MIN(IY1,INT(SB_YP1*IH)) IY2=MAX(IY2,INT(SB_YP2*IH)) ENDIF IF(WMENUGETSTATE(ID_PLOTLEGEND,2).EQ.1)THEN IX1=MIN(IX1,INT(LG_XP1*IW)) IX2=MAX(IX2,INT(LG_XP2*IW)) IY1=MIN(IY1,INT(LG_YP1)*IH) IY2=MAX(IY2,INT(LG_YP2)*IH) ENDIF IX1=MAX(0,IX1); IY1=MAX(0,IY1) IX2=MIN(IW,IX2); IY2=MIN(IW,IY2) CALL WBITMAPGET(IHANDLE,1,IX1,(IH-IY1),IX2,(IH-IY2)) CALL WCLIPBOARDPUTBITMAP(IHANDLE) CALL WBITMAPDESTROY(IHANDLE) CALL IGRSELECT(DRAWWIN) CALL WINDOWSELECT(MPW%IWIN) CALL WBITMAPVIEW(MPW%IBITMAP,MPW%IX,MPW%IY,MODELESS) ENDIF END SUBROUTINE IMOD1CLIPBOARD !###====================================================================== SUBROUTINE IMODINFOPLOT(MESSAGE,MOUSEX,MOUSEY) !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE REAL(KIND=DP_KIND),INTENT(IN) :: MOUSEX,MOUSEY INTEGER :: IPLOT IF(MESSAGE%WIN.NE.0.AND.MPW%XMAX-MPW%XMIN.GT.0.0D0.AND.MPW%YMAX-MPW%YMIN.GT.0.0D0)THEN !## evaluate which idf currently selected CALL WINDOWSELECT(0) DO IPLOT=1,MXMPLOT IF(DRWLIST(IPLOT).EQ.1)THEN IF(MP(IPLOT)%IDF%XMIN.LE.MOUSEX.AND.MP(IPLOT)%IDF%XMAX.GE.MOUSEX.AND. & MP(IPLOT)%IDF%YMIN.LE.MOUSEY.AND.MP(IPLOT)%IDF%YMAX.GE.MOUSEY)THEN CALL WINDOWOUTSTATUSBAR(4,'Visible Map: '//TRIM(MP(IPLOT)%IDFNAME)) EXIT ENDIF ENDIF END DO IF(IPLOT.GT.MXMPLOT)CALL WINDOWOUTSTATUSBAR(4,'') CALL WINDOWOUTSTATUSBAR(1,'X:'//TRIM(RTOS(MOUSEX,'G',10))//' m, Y:'//TRIM(RTOS(MOUSEY,'G',10))//' m') ELSE CALL WINDOWOUTSTATUSBAR(1,''); CALL WINDOWOUTSTATUSBAR(2,''); CALL WINDOWOUTSTATUSBAR(4,'') ENDIF END SUBROUTINE IMODINFOPLOT !###====================================================================== LOGICAL FUNCTION IMODCLOSE(CODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: CODE INTEGER :: IPLOT,I INTEGER,DIMENSION(22) :: ID DATA ID/ID_RUNMODEL,ID_IRDATABASE,ID_IDFEDIT,ID_ISGEDIT,ID_SPOINTS, & ID_WBAL_GENERATE,ID_WBAL_ANALYSE,ID_GXG,ID_MEAN,ID_TS,ID_CREATEGEN,ID_CREATEIDF_IPF,ID_CREATEIDF_GEN, & ID_CREATEIDF_IFF,ID_EXTRACTIPF,ID_PROFILE,ID_TIMESERIES,ID_MANAGER,ID_ANALYSEIPF, & ID_ANALYSEIPF,ID_SCENTOOL,ID_MOVIE/ IMODCLOSE=.FALSE. !## termimate iMOD IF(CODE.EQ.0)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONOK,'Are you sure to terminate iMOD session ?','Question') IF(WINFODIALOG(4).NE.1)RETURN ELSE CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONOK,'Are you sure to refresh iMOD ?','Question') IF(WINFODIALOG(4).NE.1)RETURN ENDIF IDIAGERROR=0 DO I=1,SIZE(ID) CALL MAIN_UTL_INACTMODULE(ID(I)); IF(IDIAGERROR.EQ.1)RETURN END DO !## termimate iMOD IF(CODE.EQ.0)THEN; CALL WINDOWCLOSE(); STOP; ENDIF !## close manager if opened! CALL MANAGER_UTL_CLOSE() CALL WINDOWCLOSECHILD(MPW%IWIN) IF(MPW%IBITMAP.NE.0)CALL WBITMAPDESTROY(MPW%IBITMAP) !## no bitmap anymore MPW%IBITMAP=0 !## remove/destroy all plots that were placed on current window DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%IACT)THEN MP(IPLOT)%IACT=.FALSE. ENDIF END DO IMODCLOSE=.TRUE. END FUNCTION IMODCLOSE !###====================================================================== SUBROUTINE MAIN_UTL_LOAD_SAVE_IMFMASK(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: IU,I CHARACTER(LEN=256) :: FNAME SELECT CASE (ID) CASE (ID_SAVEMASK) FNAME=TRIM(PREFVAL(1))//'\MASKS\*.msk' IF(.NOT.UTL_WSELECTFILE('iMOD Mask File (*.msk)|*.msk|',SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,& FNAME,'Select iMOD Mask File (*.msk)'))RETURN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',FORM='UNFORMATTED',ACTION='WRITE,DENYREAD') MASKXMIN=MPW%XMIN MASKXMAX=MPW%XMAX MASKYMIN=MPW%YMIN MASKYMAX=MPW%YMAX WRITE(IU) MASKXMIN,MASKXMAX,MASKYMIN,MASKYMAX !coordinates current bitmap (m) CLOSE(IU) CASE(ID_LOADMASK) FNAME=TRIM(PREFVAL(1))//'\MASKS\*.msk' IF(.NOT.UTL_WSELECTFILE('iMOD Mask File (*.msk)|*.msk|',LOADDIALOG+PROMPTON+DIRCHANGE+APPENDEXT+MUSTEXIST,& FNAME,'Select iMOD Mask File (*.msk)'))RETURN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',FORM='UNFORMATTED',ACTION='READ,DENYWRITE') READ(IU) MASKXMIN,MASKXMAX,MASKYMIN,MASKYMAX !coordinates current bitmap (m) CLOSE(IU) CALL IMODZOOMMASK() END SELECT CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_ZOOMMASK,ITEMENABLED).NE.1)CALL WMENUSETSTATE(ID_ZOOMMASK,ITEMENABLED,1) I=INDEX(FNAME,'\',.TRUE.)+1 CALL WMENUSETSTRING(ID_ZOOMMASK,'Mask Zoom: '//TRIM(FNAME(I:))) END SUBROUTINE MAIN_UTL_LOAD_SAVE_IMFMASK !###====================================================================== SUBROUTINE IMODZOOMMASK() !###====================================================================== IMPLICIT NONE MPW%XMIN=MASKXMIN MPW%XMAX=MASKXMAX MPW%YMIN=MASKYMIN MPW%YMAX=MASKYMAX CALL IDFPLOTFAST(1) END SUBROUTINE IMODZOOMMASK !###====================================================================== SUBROUTINE IMODGOTOXY() !###====================================================================== IMPLICIT NONE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,IDX,I,K,IOS,IPLOT,ICOL,IROW CHARACTER(LEN=10) :: CVALUE REAL(KIND=DP_KIND) :: XC,YC CALL WDIALOGLOAD(ID_DGOTOXY,ID_DGOTOXY) XC=(MPW%XMIN+MPW%XMAX)/2.0D0 YC=(MPW%YMIN+MPW%YMAX)/2.0D0 CALL WDIALOGPUTDOUBLE(IDF_DOUBLE1,XC,'(F15.3)') CALL WDIALOGPUTDOUBLE(IDF_DOUBLE2,YC,'(F15.3)') DO IPLOT=1,MXMPLOT; IF(MP(IPLOT)%ISEL)EXIT; END DO IF(IPLOT.GT.MXMPLOT)IPLOT=1 IF(MPW%NACT.GT.0)CALL WDIALOGPUTMENU(IDF_MENU2,MP%ALIAS,MPW%NACT,IPLOT) CALL IMODGOTOFIELDS() CALL UTL_DIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_RADIO1,IDF_RADIO2,IDF_MENU2) CALL IMODGOTOFIELDS() END SELECT CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,K) I=INFOERROR(1) I=0 CALL WDIALOGGETMENU(IDF_MENU1,IDX,CVALUE) IF(INFOERROR(1).NE.0)I=I+1 READ(CVALUE,*,IOSTAT=IOS) IDX IF(IOS.NE.0)I=I+1 IF(IDX.LE.0)I=I+1 IF(K.EQ.1)THEN CALL WDIALOGGETDOUBLE(IDF_DOUBLE1,XC) IF(INFOERROR(1).NE.0)I=I+1 CALL WDIALOGGETDOUBLE(IDF_DOUBLE2,YC) IF(INFOERROR(1).NE.0)I=I+1 ELSEIF(K.EQ.2)THEN CALL WDIALOGGETMENU(IDF_MENU2,IPLOT) CALL WDIALOGGETINTEGER(IDF_INTEGER3,ICOL) CALL WDIALOGGETINTEGER(IDF_INTEGER4,IROW) !## check whether xmax=xmin+ncol*cs = only for constant dx/dy IF(IDFREAD(MP(IPLOT)%IDF,MP(IPLOT)%IDFNAME,0))THEN IF(MP(IPLOT)%IDF%IEQ.EQ.0)THEN XC=MP(IPLOT)%IDF%XMIN+(REAL(ICOL,8)-0.5D0)*MP(IPLOT)%IDF%DX YC=MP(IPLOT)%IDF%YMAX-(REAL(IROW,8)-0.5D0)*MP(IPLOT)%IDF%DY ELSE XC=(MP(IPLOT)%IDF%SX(ICOL-1)+MP(IPLOT)%IDF%SX(ICOL))/2.0D0 YC=(MP(IPLOT)%IDF%SY(IROW-1)+MP(IPLOT)%IDF%SY(IROW))/2.0D0 ENDIF CLOSE(MP(IPLOT)%IDF%IU) ELSE I=1 ENDIF ENDIF IF(I.EQ.0)THEN MPW%XMIN=XC-REAL(IDX,8); MPW%XMAX=XC+REAL(IDX,8) MPW%YMIN=YC-REAL(IDX,8); MPW%YMAX=YC+REAL(IDX,8) CALL IDFZOOM(ID_DGOTOXY,0.0D0,0.0D0,0) CALL IDFPLOTFAST(1) EXIT ELSE CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Errors found in input fields!','Error') ENDIF CASE (IDHELP) CALL UTL_GETHELP('3.3.2','VMO.GotoXY') CASE (IDCANCEL) EXIT END SELECT !## bitmap scrolled, renew top-left pixel coordinates CASE (BITMAPSCROLLED) MPW%IX=MESSAGE%VALUE1 MPW%IY=MESSAGE%VALUE2 END SELECT END DO CALL WDIALOGSELECT(ID_DGOTOXY); CALL WDIALOGUNLOAD() END SUBROUTINE IMODGOTOXY !###====================================================================== SUBROUTINE IMODGOTOFIELDS() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,K,IPLOT,IRADIO CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,IRADIO) IF(MPW%NACT.GT.0)THEN CALL WDIALOGGETMENU(IDF_MENU2,IPLOT) IF(MP(IPLOT)%IPLOT.EQ.1)THEN CALL WDIALOGFIELDSTATE(IDOK,1) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,1) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,1) CALL WDIALOGRANGEINTEGER(IDF_INTEGER3,1,MP(IPLOT)%IDF%NCOL) CALL WDIALOGRANGEINTEGER(IDF_INTEGER4,1,MP(IPLOT)%IDF%NROW) CALL WDIALOGPUTSTRING(IDF_RADIO2,'iCOL (max. '//TRIM(ITOS(MP(IPLOT)%IDF%NCOL))//')'//CHAR(13)// & 'iROW (max. '//TRIM(ITOS(MP(IPLOT)%IDF%NROW))//')') ELSEIF(MP(IPLOT)%IPLOT.EQ.2)THEN CALL WDIALOGPUTSTRING(IDF_RADIO2,'IPF selected !') CALL WDIALOGFIELDSTATE(IDOK,IRADIO) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,0) ELSEIF(MP(IPLOT)%IPLOT.EQ.3)THEN CALL WDIALOGPUTSTRING(IDF_RADIO2,'IFF selected !') CALL WDIALOGFIELDSTATE(IDOK,IRADIO) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,0) ELSEIF(MP(IPLOT)%IPLOT.EQ.4)THEN CALL WDIALOGPUTSTRING(IDF_RADIO2,'ISG selected !') CALL WDIALOGFIELDSTATE(IDOK,IRADIO) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,0) ELSEIF(MP(IPLOT)%IPLOT.EQ.6)THEN CALL WDIALOGPUTSTRING(IDF_RADIO2,'GEN selected !') CALL WDIALOGFIELDSTATE(IDOK,IRADIO) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,0) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,0) ENDIF ELSE CALL WDIALOGPUTSTRING(IDF_RADIO2,'No Files active') CALL WDIALOGFIELDSTATE(IDF_RADIO2,0) CALL WDIALOGPUTRADIOBUTTON(IDF_RADIO1) ENDIF CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,I) IF(I.EQ.1)THEN J=1 K=2 ELSE J=2 K=1 ENDIF CALL WDIALOGFIELDSTATE(IDF_DOUBLE1,J) CALL WDIALOGFIELDSTATE(IDF_DOUBLE2,J) CALL WDIALOGFIELDSTATE(IDF_INTEGER3,K) CALL WDIALOGFIELDSTATE(IDF_INTEGER4,K) CALL WDIALOGFIELDSTATE(IDF_MENU2,K) CALL WDIALOGFIELDSTATE(IDF_LABEL5,K) END SUBROUTINE IMODGOTOFIELDS !###====================================================================== SUBROUTINE IMODINIT() !###====================================================================== IMPLICIT NONE LOGICAL :: LEX PLOTNAME='iMOD-Map Configuration' !## start graphical window CALL WINDOWOPENCHILD(MPW%IWIN, & FLAGS=SYSMENUON+MINBUTTON+MAXBUTTON+INSIDEPARENT+MAXWINDOW, & TITLE=PLOTNAME) !## root window - size for the bitmap MPW%DIX =WINFOWINDOW(WINDOWWIDTH) MPW%DIY =WINFOWINDOW(WINDOWHEIGHT) MPW%IBITMAP=0 !## compute start pixels such that mid of plot is in screen centre MPW%IX=(MPW%DIX/2)-(WINFOWINDOW(WINDOWWIDTH)/2) MPW%IY=(MPW%DIY/2)-(WINFOWINDOW(WINDOWHEIGHT)/2) !## transform it into a bitmap viewer CALL WBITMAPCREATE(MPW%IBITMAP,MPW%DIX,MPW%DIY) CALL WINDOWSELECT(MPW%IWIN) CALL WBITMAPVIEW(MPW%IBITMAP,MPW%IX,MPW%IY,MODELESS) !## coordinates of current zoom-level MPW%XMIN=-10.0D0 MPW%YMIN=-10.0D0 MPW%XMAX= 10.0D0 MPW%YMAX= 10.0D0 !## location scalebar SB_XP1=0.750D0 SB_YP1=0.075D0 SB_XP2=0.950D0 SB_YP2=0.175D0 IMOVESC=0 AX_XP1=0.03D0 !0.022D0 AX_YP1=0.038D0 AX_XP2=0.97D0 AX_YP2=0.95D0 IMOVEAX=0 LG_XP1=0.45D0 LG_YP1=0.40D0 LG_XP2=0.55D0 LG_YP2=0.60D0 IMOVELG=0 !## number of active plots MPW%NACT =0 MP%IACT =.FALSE. MP%ISEL =.FALSE. IMFFNAME ='' DRWLIST =0 CALL MANAGER_UTL_FILL() CALL MANAGER_UTL_UPDATE() NGEN=0 CALL GEN_UPDATE() !## no bmp active NBMP=0 IF(LEN_TRIM(PREFVAL(2)).GT.0)THEN INQUIRE(FILE=TRIM(PREFVAL(2)),EXIST=LEX) ELSE LEX=.FALSE. ENDIF IF(LEX)THEN IF(WMENUGETSTATE(ID_TOPOGRAPHY,1).EQ.0)THEN CALL WMENUSETSTATE(ID_TOPOGRAPHY,1,1) CALL WMENUSETSTATE(ID_TOPOTRANSPARANCY,1,1) ENDIF ELSE IF(WMENUGETSTATE(ID_TOPOGRAPHY,1).EQ.1)THEN CALL WMENUSETSTATE(ID_TOPOGRAPHY,1,0) CALL WMENUSETSTATE(ID_TOPOTRANSPARANCY,1,0) ENDIF ENDIF CALL WMENUSETSTATE(ID_SHOWNARROW,1,0) IF(LEN_TRIM(PREFVAL(11)).GT.0)THEN INQUIRE(FILE=PREFVAL(11),EXIST=LEX) IF(LEX)CALL WMENUSETSTATE(ID_SHOWNARROW,1,1) ENDIF CALL IMODINITMESSAGE() CALL UTL_MESSAGEHANDLE(1) CALL WINDOWSELECT(0) CALL WMENUSETSTATE(ID_SAVEAS,1,1) CALL WMENUSETSTATE(ID_SAVE,1,0) CALL WINDOWSELECT(MPW%IWIN) END SUBROUTINE IMODINIT !###====================================================================== SUBROUTINE IMODINITMESSAGE() !###====================================================================== IMPLICIT NONE !## turn imod-messages on IMESSAGE=0 IMESSAGE(EXPOSE)=1 IMESSAGE(RESIZE)=1 IMESSAGE(TABCHANGED)=1 IMESSAGE(EDITORCOMMAND)=1 IMESSAGE(FIELDCHANGED)=1 IMESSAGE(MOUSEBUTDOWN)=1 IMESSAGE(MOUSEBUTUP)=1 IMESSAGE(MOUSEMOVE)=1 IMESSAGE(TIMEREXPIRED)=1 IMESSAGE(BITMAPSCROLLED)=1 END SUBROUTINE IMODINITMESSAGE END MODULE MOD_MAIN