!! 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_PROFILE !## external modules USE WINTERACTER USE RESOURCE USE MODPLOT, ONLY : MP,MPW,DRWLIST,MXMPLOT,MXCLR,MXCGRAD,ZM USE MOD_PREF_PAR, ONLY : PREFVAL USE IMODVAR, ONLY : IDIAGERROR USE MOD_UTL, ONLY : ITOS,RTOS,UTL_GETUNIT,UTL_CLOSEUNITS,UTL_HIDESHOWDIALOG,INVERSECOLOUR,UTL_DRAWLEGENDBOX,UTL_DIST,UTL_EQUALS_REAL,NEWLINE, & UTL_READARRAY,UTL_FILLARRAY,UTL_GETUNIQUE,UTL_IDFCRDCOR,UTL_IDFGETCLASS,UTL_MESSAGEHANDLE,UTL_WSELECTFILE,UTL_CAP,& UTL_PROFILE_COMPVIEWBOX,UTL_PROFILE_GETVIEWBOX USE MOD_IFF, ONLY : UTL_GETUNITIFF,IFFPLOT USE MOD_IPF, ONLY : IPFPLOT,IPFREAD,IPFINIT USE MOD_IPF_PAR, ONLY : IPF,NIPF,NLITHO,BH USE MOD_PROFILE_UTL USE MOD_MANAGER, ONLY : MANAGERUPDATE,MANAGERCLOSE USE MOD_IDF, ONLY : IDFGETVAL,IDFREAD,IDFDEALLOCATEX,IDFIROWICOL USE MOD_IDF_PAR, ONLY : IDFTRANSFORM USE MOD_INTERSECT, ONLY : INTERSECT_EQUI,INTERSECT_NONEQUI,INTERSECT_DEALLOCATE USE MOD_INTERSECT_PAR, ONLY : XA,YA,LN USE MOD_PROF_PAR USE MOD_IDFGETVALUE, ONLY : IDFGETVALUE_COLOURCELL USE MOD_IPFGETVALUE, ONLY : IPFGETVALUE_QUICKVIEW,IPFGETVALUE_QUICKVIEW_INIT,IPFGETVALUE_QUICKVIEW_CLOSE,GXMIN,GYMIN,GXMAX,GYMAX USE MOD_IPFGETVALUE_COLOURS, ONLY : IPFGETVALUE_PLOTCOLOURS,IPFGETVALUE_OPENSAVECOLOURS,IPFGETVALUE_GETCOLOURS USE MOD_LEGEND, ONLY : LEGMAIN,LEGCREATEINIT USE MOD_LEGEND_UTL, ONLY : LEGREAD,LEGALLOCATE,LEGDEALLOCATE USE MOD_MDF, ONLY : READMDF,WRITEMDF,MDFDEALLOCATE,READMDF_GETN,MDF USE MOD_COLOURS, ONLY : ICOLOR,MAXCOLOUR USE MOD_POLINT, ONLY : POL1LOCATE USE MOD_IPF_LABEL, ONLY : IMOD3D_LABELS USE MOD_OSD, ONLY : OSD_OPEN USE MOD_SOLID_PROFILE, ONLY : SOLIDPROFILEDRAW,SOLIDPROFILEMOUSE,SOLIDPROFILEADJUST,SOLIDPROFILEDELETE,SOLIDPROFILEFITDRILL, & SOLIDPROFILEDELNODE,SOLIDPROFILELINECOLOR,SOLIDPROFILELINETHICKNESS,SOLIDPROFILEMINMAX, & SOLIDPLOTLOCATIONCROSSSECTIONS,ILOCK,ISSNAP,IFIND,SOLIDPROFILEFIT,SOLIDPROFILEDRAW_POLYGON,SOLIDPROFILEDRAW_MASK, & SOLIDPROFILEDRAW_INTERSECTIONS USE MOD_SOLID_PAR, ONLY : ISPF,NSPF,SPF,IMASK USE IMOD USE MOD_GEN2GEN_PUZZLE, ONLY : GENFNAME,PUZZLEMAIN !## local module variables TYPE(WIN_MESSAGE),PRIVATE :: MESSAGE INTEGER,PRIVATE :: ITYPE TYPE(AXESOBJ),PRIVATE :: AXES INTEGER,DIMENSION(7),PRIVATE :: IPRF INTEGER,PRIVATE :: NPIPET INTEGER,PRIVATE :: ICURSOR_SOLID,ICRD_SOLID,JCRD_SOLID,IELEV_SOLID,IDOWN_SOLID,ICURSOR_BITMAP,ICRD_BITMAP INTEGER,PRIVATE :: LMBXPIX,LMBYPIX,ISOL,JSOLID INTEGER,PRIVATE :: IQUICK !INTEGER,PRIVATE :: LINEWIDTHPLOT=3 !INTEGER,PRIVATE :: LINECOLORPLOT=WRGB(255,0,0) !INTEGER,PRIVATE :: ICLRRASTER=WRGB(191,191,191) !INTEGER,PRIVATE :: ICLRKNIKCP=WRGB(255,0,0) !INTEGER,PRIVATE :: ICLRVIEWAR=INVERSECOLOUR(WRGB(255,0,0)) CONTAINS !###====================================================================== SUBROUTINE PROFILE_INIT() !###====================================================================== IMPLICIT NONE INTEGER :: ICONFIG,I CALL MAIN1INACTMODULE(ID_PROFILE) IF(IDIAGERROR.EQ.1)RETURN CALL WMENUSETSTATE(ID_PROFILE,2,1) !## neccessary for plotting drills CALL WDIALOGLOAD(ID_DIPFINFO,ID_DIPFINFO) CALL WDIALOGLOAD(ID_DIPFINFOSERIE,ID_DIPFINFOSERIE) CALL WDIALOGLOAD(ID_DSERIESPROP,ID_DSERIESPROP) CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGGETREAL(IDF_REAL2,XSIGHT) !## allready loaded from solid IF(ISOLID.EQ.0)CALL WDIALOGLOAD(ID_DSERIES,ID_DSERIES) CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGPUTIMAGE(ID_DRAW,ID_ICONDRAW,1) CALL WDIALOGPUTIMAGE(ID_PROP,ID_ICONPROPERTIES,1) CALL WDIALOGPUTIMAGE(ID_FLIP,ID_ICONFLIP,1) CALL WDIALOGPUTIMAGE(ID_LEGEND,ID_ICONLEGEND,1) CALL WDIALOGPUTIMAGE(ID_MOVIE,ID_ICONMOVIE,1) CALL WDIALOGPUTIMAGE(ID_SNAPPEN,ID_ICONSNAPPEN,1) CALL WDIALOGPUTIMAGE(ID_INFO,ID_ICONINFO,1) CALL WDIALOGPUTIMAGE(ID_ZOOMINMAP,ID_ICONZOOMIN,1) CALL WDIALOGPUTIMAGE(ID_ZOOMOUTMAP,ID_ICONZOOMOUT,1) CALL WDIALOGPUTIMAGE(ID_ZOOMFULLMAP,ID_ICONZOOMFULL,1) CALL WDIALOGPUTIMAGE(ID_ZOOMRECTANGLEMAP,ID_ICONZOOMBOX,1) CALL WDIALOGPUTIMAGE(ID_MOVEMAP,ID_ICONMOVE,1) CALL WDIALOGPUTIMAGE(ID_ZOOMPREVIOUS,ID_ICONZOOMPREVIOUS,1) CALL WDIALOGPUTIMAGE(ID_ZOOMNEXT,ID_ICONZOOMNEXT,1) !## zoomprevious and zoomnext settings I=0; IF(ZM%IZOOM.GT.1)I=1 CALL WDIALOGFIELDSTATE(ID_ZOOMPREVIOUS,I) I=0; IF(ZM%IZOOM.LT.ZM%NZOOM)I=1 CALL WDIALOGFIELDSTATE(ID_ZOOMNEXT,I) CALL WDIALOGLOAD(ID_DSERIESMOVIE,ID_DSERIESMOVIE) CALL WDIALOGPUTIMAGE(ID_LEFT,ID_ICONLEFT,1) CALL WDIALOGPUTIMAGE(ID_FASTLEFT,ID_ICONFASTLEFT,1) CALL WDIALOGPUTIMAGE(ID_TOTALLEFT,ID_ICONTOTALLEFT,1) CALL WDIALOGPUTIMAGE(ID_RIGHT,ID_ICONRIGHT,1) CALL WDIALOGPUTIMAGE(ID_FASTRIGHT,ID_ICONFASTRIGHT,1) CALL WDIALOGPUTIMAGE(ID_TOTALRIGHT,ID_ICONTOTALRIGHT,1) CALL WDIALOGPUTIMAGE(ID_STOP,ID_ICONSTOP,1) CALL WDIALOGSELECT(ID_DSERIESPROPTAB1) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1,IBLOCKLINES) !## blocklines CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,IBLOCKFILLS) !## blockfilles CALL WDIALOGGETMENU(IDF_MENU4,ICONFIG) CALL WDIALOGPUTSTRING(IDF_STRING1,PROFILE_CONFIGTXT(ICONFIG)) CALL WDIALOGSELECT(ID_DSERIESPROPTAB2) CALL WDIALOGPUTIMAGE(ID_SAVE,ID_ICONSAVEAS,1) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN,1) CALL WDIALOGSELECT(ID_DSERIESPROPTAB6) CALL WDIALOGPUTIMAGE(ID_OPEN,ID_ICONOPEN) CALL WDIALOGPUTIMAGE(ID_SAVEAS,ID_ICONSAVEAS) CALL IPFGETVALUE_PLOTCOLOURS(ID_DSERIESPROPTAB6) CALL WDIALOGSELECT(ID_DSERIESTAB1) !## close manager if opened! CALL UTL_HIDESHOWDIALOG(ID_DMANAGER,0) !## minimize window "0" CALL WINDOWSELECT(MPW%IWIN) CALL WINDOWSIZEPOS(ISTATE=WINHIDDEN) ICLRRASTER=WRGB(191,191,191) ICLRKNIKCP=WRGB(255,0,0) ICLRVIEWAR=INVERSECOLOUR(WRGB(255,0,0)) LINEWIDTHPLOT=3 LINECOLORPLOT=INVERSECOLOUR(WRGB(255,0,0)) IQUICK=0 CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(2,'') CALL WINDOWOUTSTATUSBAR(3,'') CALL WINDOWOUTSTATUSBAR(4,'') CALL PROFILE_MAIN() END SUBROUTINE PROFILE_INIT !###==================================================================== SUBROUTINE PROFILE_CREATEWINDOWS() !###==================================================================== IMPLICIT NONE INTEGER :: I,IW,IH CALL PROFILE_CLOSEWINDOWS() !## create new windows ALLOCATE(IWINPROFILE(NSCREEN),IBITMAP(NSCREEN),GRAPHUNITS(6,NSCREEN),GRAPHAREA(4,NSCREEN)) DO I=1,NSCREEN IF(I.EQ.1)THEN !## create new window, inside parent-window CALL WINDOWOPENCHILD(IWINPROFILE(I),FLAGS=SYSMENUON+MINBUTTON+MAXBUTTON+INSIDEPARENT+MAXWINDOW+STATUSBAR, & TOOLID=(/0,0,ID_TOOLBAR2,0/),TITLE='iMOD Cross-Section CHILD window') ELSE !## create new window, floated CALL WINDOWOPENCHILD(IWINPROFILE(I),FLAGS=SYSMENUON+MINBUTTON+MAXBUTTON+STATUSBAR, & !+OWNEDBYPARENT, & TOOLID=(/0,0,ID_TOOLBAR2,0/),TITLE='iMOD Cross-Section FLOATING window', & WIDTH=INT(MPW%DIX/1.5),HEIGHT=INT(MPW%DIY/1.5)) ENDIF CALL WINDOWSTATUSBARPARTS(2,(/3000,-1/),(/1,1/)) CALL IGRSELECT(DRAWWIN,IWINPROFILE(I)) IW=WINFODRAWABLE(DRAWABLEWIDTH) IH=WINFODRAWABLE(DRAWABLEHEIGHT) CALL WBITMAPCREATE(IBITMAP(I),IW,IH) GRAPHAREA(1,I) =0.0 !## xmin GRAPHAREA(2,I) =0.0 !## ymin GRAPHAREA(3,I) =1.0 !## xmax GRAPHAREA(4,I) =1.0 !## ymax GRAPHUNITS(1,I)=0.0 !## xmin GRAPHUNITS(2,I)=0.0 !## ymin GRAPHUNITS(3,I)=1.0 !## xmax GRAPHUNITS(4,I)=1.0 !## ymax GRAPHUNITS(5,I)=0.0 !## y2min GRAPHUNITS(6,I)=1.0 !## y2max CALL WMENUSETSTATE(ID_BITMAP,2,PBITMAP%IACT) ENDDO END SUBROUTINE PROFILE_CREATEWINDOWS !###==================================================================== SUBROUTINE PROFILE_CLOSEWINDOWS() !###==================================================================== IMPLICIT NONE INTEGER :: I !## remove existing windows IF(ALLOCATED(IWINPROFILE))THEN DO I=1,SIZE(IWINPROFILE); CALL WINDOWCLOSECHILD(IWINPROFILE(I)); ENDDO DEALLOCATE(IWINPROFILE) ENDIF IF(ALLOCATED(IBITMAP))THEN DO I=1,SIZE(IBITMAP) IF(IBITMAP(I).NE.0)CALL WBITMAPDESTROY(IBITMAP(I)) ENDDO DEALLOCATE(IBITMAP) ENDIF IF(ALLOCATED(GRAPHUNITS))DEALLOCATE(GRAPHUNITS) IF(ALLOCATED(GRAPHAREA))DEALLOCATE(GRAPHAREA) END SUBROUTINE PROFILE_CLOSEWINDOWS !###==================================================================== SUBROUTINE PROFILE_MAIN() !###==================================================================== IMPLICIT NONE INTEGER :: IEXIT !## initialisation, array (de)allocation e.g. CALL PROFILE_ALLOCATE() !## create windows CALL PROFILE_CREATEWINDOWS() CALL PROFILE_FIELDTOOLBAR(0,0) IXY =0 IP =0 NXY =0 XPOS =0.0 XMIN =0.0 XMAX =0.0 YMIN =0.0 YMAX =0.0 ISNAP=0 IDOWN=0 IDOWN_SOLID=0 ICURSOR_SOLID=0 ICRD_SOLID=0 IELEV_SOLID=0 ICURSOR_BITMAP=0 ICRD_BITMAP=0 !## draw first selected cross-section if solid tool is active IF(ISOLID.EQ.1)CALL SOLIDPROFILEUPDATECROSS(0) DO !## get messages CALL WMESSAGE(ITYPE,MESSAGE) IF(IQUICK.EQ.1)THEN CALL IPFGETVALUE_QUICKVIEW(ITYPE,MESSAGE,IWINPROFILE(1),1,IEXIT) IF(IEXIT.EQ.1)THEN CALL UTL_HIDESHOWDIALOG(ID_DSERIES,2) CALL WDIALOGLOAD(ID_DIPFINFOSERIE,ID_DIPFINFOSERIE) !## redraw cross-sections CALL PROFILE_CREATEWINDOWS() CALL PROFILE_PLOT() IQUICK=0; ITYPE=0 ENDIF !## message allready processed by quickview IF(IEXIT.EQ.-1)ITYPE=0 ENDIF SELECT CASE (ITYPE) !## message from fieldchanged CASE (TABCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (ID_DSERIESTAB1) MESSAGE%WIN=ID_DSERIESTAB1 CALL PROFILE_EXPOSE() END SELECT !## message from fieldchanged CASE (FIELDCHANGED) SELECT CASE (MESSAGE%WIN) CASE (ID_DSERIESTAB2) CALL SOLIDPROFILEMAIN(ITYPE,MESSAGE,IEXIT) CASE DEFAULT CALL PROFILE_FIELDCHANGED() END SELECT !## message from pushbutton CASE(PUSHBUTTON) SELECT CASE (MESSAGE%WIN) CASE (ID_DSERIESTAB2) CALL SOLIDPROFILEMAIN(ITYPE,MESSAGE,IEXIT) IF(IEXIT.EQ.1)EXIT CASE DEFAULT CALL PROFILE_PUSHBUTTON(IEXIT) IF(IEXIT.EQ.1)EXIT END SELECT !## messages from menu CASE (MENUSELECT) CALL PROFILE_MENUSELECT() !## mouse move CASE(MOUSEMOVE) CALL PROFILE_MOUSEMOVE() !## mouse released CASE(MOUSEBUTUP) CALL PROFILE_MOUSEBUTUP() !## mouse pressed CASE(MOUSEBUTDOWN) CALL PROFILE_MOUSEBUTDOWN() !## close selected window - if root window terminate iMOD CASE(CLOSEREQUEST) IF(IP.EQ.0)THEN CALL WCURSORSHAPE(CURARROW) EXIT ENDIF CASE(RESIZE) CALL PROFILE_RESIZE() CASE(EXPOSE) CALL PROFILE_EXPOSE() END SELECT ENDDO IF(NXY.GT.0)CALL PROFILE_CLEAR() !## herstel selektie MP%ISEL=LISEL CALL UTL_MESSAGEHANDLE(0) CALL PROFILE_CLOSE() CALL UTL_MESSAGEHANDLE(1) END SUBROUTINE PROFILE_MAIN !###====================================================================== SUBROUTINE SOLIDPROFILEMAIN(ITYPE,MESSAGE,IEXIT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: IEXIT TYPE(WIN_MESSAGE),INTENT(IN) :: MESSAGE INTEGER,INTENT(IN) :: ITYPE SELECT CASE(ITYPE) CASE(FIELDCHANGED) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_CHECK1) CALL WDIALOGSELECT(ID_DSERIESTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,ILOCK) CASE (IDF_CHECK2) CALL WDIALOGSELECT(ID_DSERIESTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IMASK) CALL PROFILE_PLOT() CASE (IDF_CHECK3) CALL WDIALOGSELECT(ID_DSERIESTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK3,ISSNAP) CASE (IDF_CHECK4) CALL WDIALOGSELECT(ID_DSERIESTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK4,IFIND) ISOLID=1 CALL PROFILE_PLOT() CASE (IDF_MENU1) ISOLID=1; CALL SOLIDPROFILEUPDATECROSS(1) END SELECT CASE(PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (ID_NEW) !## start drawing a cross-section without those extra lines ISOLID=1; CALL SOLIDPROFILEFIT(1) CALL SOLIDPROFILEUPDATECROSS(1) CASE (ID_DELETE) CALL SOLIDPROFILEDELETE() CALL SOLIDPROFILEUPDATECROSS(1) !## fit cross-section to current cross-sectional lines CASE (ID_FIT) ISOLID=1 CALL SOLIDPROFILEFIT(0) CALL SOLIDPROFILEUPDATECROSS(1) CASE (ID_FITDRILL) ISOLID=1 CALL SOLIDPROFILEFITDRILL() CALL SOLIDPROFILEUPDATECROSS(1) CASE (IDHELP) CALL IMODGETHELP('5.4.2','TMO.ST.CrossSec') CASE(IDCANCEL,ID_CLOSE) IF(IP.EQ.0)IEXIT=1 END SELECT END SELECT END SUBROUTINE SOLIDPROFILEMAIN !###====================================================================== SUBROUTINE SOLIDPROFILEUPDATECROSS(IMODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IMODE INTEGER :: I,IACT REAL :: BMPX1,BMPY1,BMPX2,BMPY2 CALL WDIALOGSELECT(ID_DSERIESTAB2) !## copy settings for background-bitmap IF(ISPF.GT.0.AND.ISPF.LE.SIZE(SPF).AND.IMODE.EQ.1)THEN !## get correct x- and y-coordinates CALL PROFILE_EXTENT_GRAPH(1) CALL IGRUNITSFROMPIXELS(PBITMAP%IX1,PBITMAP%IY1,PBITMAP%GX1,PBITMAP%GY1,IORIGIN=1) CALL IGRUNITSFROMPIXELS(PBITMAP%IX2,PBITMAP%IY2,PBITMAP%GX2,PBITMAP%GY2,IORIGIN=1) SPF(ISPF)%PBITMAP=PBITMAP ENDIF ISPF=0 IF(NSPF.GT.0)CALL WDIALOGGETMENU(IDF_MENU1,ISPF) IF(ISPF.LE.0)RETURN !## copy saved settings for current background-bitmap PBITMAP=SPF(ISPF)%PBITMAP CALL PROFILE_CLEAR() !## put the right coordinates ... NXY=SPF(ISPF)%NXY IF(ASSOCIATED(XY))DEALLOCATE(XY); IF(ASSOCIATED(XYLABEL))DEALLOCATE(XYLABEL) ALLOCATE(XY(2,MAX(MXCRD,NXY))); XY=0.0 ALLOCATE(XYLABEL(MAX(MXCRD,NXY))); XYLABEL='' DO I=1,NXY XY(1,I)=SPF(ISPF)%X(I) XY(2,I)=SPF(ISPF)%Y(I) END DO CALL PROFILE_COMPUTEPLOT() CALL PROFILE_IDFMINMAX() IACT=PBITMAP%IACT PBITMAP%IACT=0 CALL PROFILE_PLOT() PBITMAP%IACT=IACT !## get correct dimensions whenever a bitmap has been read IF(PBITMAP%IACT.EQ.1)THEN CALL PROFILE_EXTENT_GRAPH(1) CALL IGRUNITSTOPIXELS(PBITMAP%GX1,PBITMAP%GY1,PBITMAP%IX1,PBITMAP%IY1,IORIGIN=1) CALL IGRUNITSTOPIXELS(PBITMAP%GX2,PBITMAP%GY2,PBITMAP%IX2,PBITMAP%IY2,IORIGIN=1) !## read bitmap - if available CALL PROFILE_BACKGROUND_BITMAP_READ() CALL PROFILE_PLOT() ENDIF XPOS=0.0 CALL PROFILE_CLEAR() CALL PROFILE_COORDINATES(0) CALL PROFILE_FIELDTOOLBAR(0,1) END SUBROUTINE SOLIDPROFILEUPDATECROSS !###==================================================================== SUBROUTINE PROFILE_MOUSEBUTUP() !###==================================================================== IMPLICIT NONE LOGICAL :: LEX INTEGER :: I SELECT CASE (MESSAGE%VALUE1) !## left mouse button CASE (1) IF(LMOVEPROF)THEN LMOVEPROF=.FALSE. XPOS=0.0 CALL WCURSORSHAPE(CURARROW) ENDIF IF(MESSAGE%WIN.EQ.ID_DSERIESTAB1)THEN !## profile drawing for iff's en ipf's during shiftmode IF(IDOWN.EQ.0)THEN IF(MXNIFF.GT.0)KU=ABS(KU) NIPF=ABS(NIPF) LEX=MXNIFF.GT.0 IF(.NOT.LEX)LEX=NIPF.GT.0 IF(ALLOCATED(IPIPET))NPIPET=SIZE(IPIPET) IF(.NOT.LEX)LEX=ALLOCATED(IPIPET) IF(LEX)CALL PROFILE_PLOT() ENDIF ELSE DO I=1,SIZE(IWINPROFILE) IF(MESSAGE%WIN.EQ.IWINPROFILE(I))IDOWN_SOLID=0 ENDDO IELEV_SOLID=0; ICURSOR_BITMAP=0 ENDIF END SELECT END SUBROUTINE PROFILE_MOUSEBUTUP !###==================================================================== SUBROUTINE PROFILE_MOUSEBUTDOWN() !###==================================================================== IMPLICIT NONE INTEGER :: IIPF,I !## snap coordinates ... yes-or-no CALL PROFILE_SNAPCOORDINATES() SELECT CASE (MESSAGE%VALUE1) CASE (1) IF(MESSAGE%WIN.EQ.ID_DSERIESTAB1)THEN !## draw profile IF(IP.EQ.1)THEN IDOWN =1 NXY =NXY+1 IF(NXY.GT.MXCRD)THEN NXY =MXCRD ELSE XY(1,NXY) =MESSAGE%GX XY(2,NXY) =MESSAGE%GY ENDIF ENDIF !## move profile currently drawn IF(NXY.GT.0.AND.IP.EQ.0)THEN IF(WINFOMOUSE(MOUSECURSOR).EQ.ID_CURSORMOVE.OR. & WINFOMOUSE(MOUSECURSOR).EQ.ID_CURSORADJUSTPOINT)THEN LMOVEPROF=.TRUE. PROFX =MESSAGE%GX PROFY =MESSAGE%GY ENDIF ENDIF !## no profile drawing for iff's en ipf's during shiftmode IF(MXNIFF.GT.0)KU=-1*ABS(KU) NIPF=-1*ABS(NIPF) ELSE DO I=1,SIZE(IWINPROFILE) IF(MESSAGE%WIN.EQ.IWINPROFILE(I))IDOWN_SOLID=1 ENDDO !## pushlocation LMBXPIX=MESSAGE%XPIX; LMBYPIX=MESSAGE%YPIX ENDIF CASE (3) IF(MESSAGE%WIN.EQ.ID_DSERIESTAB1)THEN !## dropdown menu IF(IP.EQ.0)THEN CALL WMENUFLOATING(ID_MENU4,MESSAGE%X,MESSAGE%Y) ELSEIF(IP.EQ.1)THEN !## remove last line IF(IDOWN.EQ.1)THEN !## if only one point before break, add last point IF(NXY.EQ.1)THEN NXY =NXY+1 XY(1,NXY) =MESSAGE%GX XY(2,NXY) =MESSAGE%GY ENDIF !## profile drawing for iff's en ipf's during shiftmode IF(MXNIFF.GT.0)KU=ABS(KU) NIPF=ABS(NIPF) IF(ALLOCATED(IPIPET))NPIPET=SIZE(IPIPET) CALL PROFILE_ZOOM(ID_ZOOMFULL) !## remove last part of line? CALL PROFILE_EXTENT_2DBITMAP() CALL IGRLINEWIDTH(LINEWIDTHPLOT) IF(LLINE)THEN CALL IGRCOLOURN(LINECOLORPLOT) CALL IGRJOIN(XY(1,NXY),XY(2,NXY),XCRD,YCRD) CALL PROFILE_PLOTVIEWBOX(XY(1,NXY),XY(2,NXY),XCRD,YCRD) ENDIF CALL IGRLINEWIDTH(1) CALL PROFILE_PUTBITMAP(MPW%IBITMAP) !0) XPOS=0.0 ENDIF CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGFIELDSTATE(ID_MOVIE,1) CALL WDIALOGFIELDSTATE(ID_SNAPPEN,0) CALL WDIALOGFIELDSTATE(ID_INFO,0) DO IIPF=1,NIPF IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.1)THEN CALL WDIALOGFIELDSTATE(ID_SNAPPEN,1) CALL WDIALOGFIELDSTATE(ID_INFO,1) ENDIF ENDDO CALL PROFILE_FIELDTOOLBAR(0,1) IDOWN=0 IP =0 CALL WCURSORSHAPE(CURARROW) CALL IGRPLOTMODE(MODECOPY) CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(2,'') CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGFIELDSTATE(ID_CLOSE,1) CALL WDIALOGFIELDSTATE(ID_DRAW,1) IF(MXNIDF.GT.0)CALL WDIALOGFIELDSTATE(ID_LEGEND,1) CALL WDIALOGFIELDSTATE(ID_PROP,1) CALL WDIALOGFIELDSTATE(ID_FLIP,1) IF(NXY.NE.0)CALL PROFILE_COORDINATES(0) ENDIF ELSE DO I=1,SIZE(IWINPROFILE) IF(MESSAGE%WIN.EQ.IWINPROFILE(I))THEN !## option whenever a node is selected IF(ISOLID.NE.0.AND.ICURSOR_SOLID.EQ.1)THEN CALL WMENUFLOATING(ID_MENU3,MESSAGE%X,MESSAGE%Y) ELSE CALL WMENUFLOATING(ID_WTIMENU,MESSAGE%X,MESSAGE%Y) ENDIF EXIT ENDIF ENDDO ENDIF END SELECT END SUBROUTINE PROFILE_MOUSEBUTDOWN !###==================================================================== SUBROUTINE PROFILE_MOUSEMOVE() !###==================================================================== IMPLICIT NONE INTEGER :: I,IWINID REAL :: CRITDIST,CRITPROF,DXY,X1,Y1,X2,Y2 CRITDIST=SQRT((MPW%XMAX-MPW%XMIN)**2.0+(MPW%YMAX-MPW%YMIN)**2.0)/100.0 CRITPROF=0.0 !## message from 2d-plot window IF(MESSAGE%WIN.EQ.ID_DSERIESTAB1)THEN CALL IGRAREA(AREA(1),AREA(2),AREA(3),AREA(4)) CALL IGRUNITS(MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX) CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(1,'X: '//TRIM(ITOS(INT(MESSAGE%GX)))//' m, Y: '//TRIM(ITOS(INT(MESSAGE%GY)))//' m') IF(IP.EQ.0.AND..NOT.LMOVEPROF)THEN DXY=(SQRT((MPW%XMAX-MPW%XMIN)**2.0+(MPW%YMAX-MPW%YMIN)**2.0))/100.0 !## check box IXY=0 DO I=1,NXY IF(MESSAGE%GX.GT.XY(1,I)-DXY.AND.MESSAGE%GX.LT.XY(1,I)+DXY.AND. & MESSAGE%GY.GT.XY(2,I)-DXY.AND.MESSAGE%GY.LT.XY(2,I)+DXY)EXIT END DO IF(I.GT.NXY)THEN DO I=2,NXY IF(IGRDISTANCELINE(XY(1,I-1),XY(2,I-1),XY(1,I),XY(2,I),MESSAGE%GX,MESSAGE%GY,0).LE.CRITDIST)EXIT END DO IF(I.LE.NXY)THEN IF(WINFOMOUSE(MOUSECURSOR).NE.ID_CURSORMOVE)CALL WCURSORSHAPE(ID_CURSORMOVE) ELSE IF(WINFOMOUSE(MOUSECURSOR).NE.CURARROW)CALL WCURSORSHAPE(CURARROW) ENDIF ELSE IXY=I IF(WINFOMOUSE(MOUSECURSOR).NE.ID_CURSORADJUSTPOINT)CALL WCURSORSHAPE(ID_CURSORADJUSTPOINT) ENDIF ENDIF !## move current drawn profile IF(LMOVEPROF)THEN CALL PROFILE_CLEAR() !## move entire line(s) IF(IXY.EQ.0)THEN XY(1,1:NXY)=XY(1,1:NXY)+(MESSAGE%GX-PROFX) XY(2,1:NXY)=XY(2,1:NXY)+(MESSAGE%GY-PROFY) !## move current point ELSE !## snap new point ... yes-or-no CALL PROFILE_SNAPCOORDINATES() XY(1,IXY)=XY(1,IXY)+(MESSAGE%GX-PROFX) XY(2,IXY)=XY(2,IXY)+(MESSAGE%GY-PROFY) ENDIF PROFX=MESSAGE%GX PROFY=MESSAGE%GY CALL PROFILE_COMPUTEPLOT() CALL PROFILE_IDFMINMAX() CALL PROFILE_PLOT() XPOS=0.0 CALL PROFILE_CLEAR() ENDIF !## first point set! IF(IDOWN.EQ.1)THEN CALL WCURSORSHAPE(ID_CURSORPROFILE) !## update profile-line - within bitmap CALL PROFILE_EXTENT_2DBITMAP() IF(LLINE)THEN CALL IGRLINEWIDTH(LINEWIDTHPLOT) CALL IGRCOLOURN(LINECOLORPLOT) CALL IGRJOIN(XY(1,NXY),XY(2,NXY),XCRD,YCRD) !## removing optional plot viewing 'window' for particle/point plotting CALL PROFILE_PLOTVIEWBOX(XY(1,NXY),XY(2,NXY),XCRD,YCRD) ENDIF !## plot profile line and optional viewing 'window' for particle/point plotting LLINE=.TRUE. !## snap coordinates ... yes-or-no CALL PROFILE_SNAPCOORDINATES() X1 =MESSAGE%GX Y1 =MESSAGE%GY CALL IGRJOIN(XY(1,NXY),XY(2,NXY),X1,Y1) CALL PROFILE_PLOTVIEWBOX(XY(1,NXY),XY(2,NXY),X1,Y1) CALL IGRLINEWIDTH(1) IF(ABS(XCRD-MESSAGE%GX).GT.CRITPROF.OR.ABS(YCRD-MESSAGE%GY).GT.CRITPROF)THEN XCRD=MESSAGE%GX YCRD=MESSAGE%GY !## temporary increase number of points, especially for iff/ipf plotting purposes NXY=NXY+1; CALL PROFILE_WTIADDPOINT_MEMORY(NXY) XY(1,NXY)=MESSAGE%GX XY(2,NXY)=MESSAGE%GY CALL PROFILE_COMPUTEPLOT() CALL PROFILE_IDFMINMAX() CALL PROFILE_PLOT() NXY=NXY-1 !## position 2d-plot CALL PROFILE_PUTBITMAP(MPW%IBITMAP) !0) ELSE CALL IGRAREA(AREA(1),AREA(2),AREA(3),AREA(4)) CALL IGRUNITS(MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX) ENDIF ENDIF ELSE !## find window DO I=1,SIZE(IWINPROFILE); IF(MESSAGE%WIN.EQ.IWINPROFILE(I))EXIT; ENDDO IF(I.LE.SIZE(IWINPROFILE))THEN !## update all windows DO IWINID=1,SIZE(IWINPROFILE) !## activate current window CALL PROFILE_EXTENT_GRAPH(IWINID) CALL WINDOWOUTSTATUSBAR(1,'Distance: '//TRIM(ITOS(INT(MESSAGE%GX)))//' m, Map Value: '//TRIM(RTOS(MESSAGE%GY,'F',2))) ENDDO !## solid adjustment? IF(NXY.GT.0)THEN IF(IDOWN_SOLID.EQ.0)THEN CALL SOLIDPROFILEMOUSE(MESSAGE%GX,MESSAGE%GY,ICURSOR_SOLID,ICRD_SOLID,IELEV_SOLID,I) IF(ICURSOR_SOLID.EQ.0)THEN CALL PROFILE_BACKGROUND_BITMAP_MOUSEMOVE(MESSAGE%XPIX,MESSAGE%YPIX,ICURSOR_BITMAP,ICRD_BITMAP) IF(ICURSOR_BITMAP.NE.0)THEN; ICURSOR_SOLID=0; ICRD_SOLID=0; IELEV_SOLID=0; ENDIF ELSE ICURSOR_BITMAP=0; ICRD_BITMAP=0 ENDIF ELSE IF(IELEV_SOLID.NE.0)THEN !## remove previous selected line ... draw profile to be editable only DO IWINID=1,SIZE(IWINPROFILE) CALL SOLIDPROFILEDRAW(IELEV_SOLID,IELEV_SOLID,ICRD_SOLID,ICURSOR_SOLID,IWINID) ENDDO CALL SOLIDPROFILEADJUST(MESSAGE%GX,MESSAGE%GY,ICURSOR_SOLID,ICRD_SOLID,IELEV_SOLID,I) !## draw new profile to be editable only DO IWINID=1,SIZE(IWINPROFILE) CALL SOLIDPROFILEDRAW(IELEV_SOLID,IELEV_SOLID,ICRD_SOLID,ICURSOR_SOLID,IWINID) !## putbitmap on entire screen or ratio CALL IGRSELECT(DRAWWIN,IWINPROFILE(IWINID)) CALL WBITMAPPUT(IBITMAP(IWINID),0,1) ENDDO ENDIF IF(ICURSOR_BITMAP.NE.0)THEN CALL PROFILE_BACKGROUND_BITMAP_ADJUST(MESSAGE%XPIX,MESSAGE%YPIX,ICURSOR_BITMAP) !,ICRD_BITMAP) CALL PROFILE_PLOT() ENDIF ENDIF ENDIF !## view on 2d-plot old position of cross-section CALL PROFILE_CLEAR(); XPOS=MESSAGE%GX; CALL PROFILE_CLEAR() CALL PROFILE_EXTENT_GRAPH(I) ENDIF ENDIF END SUBROUTINE PROFILE_MOUSEMOVE !###==================================================================== SUBROUTINE PROFILE_ADDLINELABEL() !###==================================================================== IMPLICIT NONE REAL :: X,Y INTEGER :: ISEG,I,J CALL WDIALOGLOAD(ID_POLYGONSHAPENAME,ID_POLYGONSHAPENAME) CALL WDIALOGSHOW(-1,-1,0,3) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Give a Line Label Name') CALL WDIALOGPUTSTRING(IDF_STRING1,TRIM(SPF(ISPF)%PROF(IELEV_SOLID)%LNAME)) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK,IDCANCEL) CALL WDIALOGGETSTRING(IDF_STRING1,SPF(ISPF)%PROF(IELEV_SOLID)%LNAME); EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD(); IF(MESSAGE%VALUE1.EQ.IDCANCEL)RETURN CALL PROFILE_PLOT() END SUBROUTINE PROFILE_ADDLINELABEL !###==================================================================== SUBROUTINE PROFILE_WTIADDPOINT() !###==================================================================== IMPLICIT NONE REAL :: X,Y INTEGER :: ISEG,I,J CHARACTER(LEN=52) :: LABELNAME CALL WDIALOGLOAD(ID_POLYGONSHAPENAME,ID_POLYGONSHAPENAME) CALL WDIALOGSHOW(-1,-1,0,3) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Give a KnickPoint Name') CALL WDIALOGPUTSTRING(IDF_STRING1,'') DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK,IDCANCEL) CALL WDIALOGGETSTRING(IDF_STRING1,LABELNAME); EXIT END SELECT END SELECT ENDDO CALL WDIALOGUNLOAD(); IF(MESSAGE%VALUE1.EQ.IDCANCEL)RETURN CALL PROFILE_GETLOCATION(X,Y,XPOS,ISEG) !## check double points, can happen, change label and return DO I=1,NXY IF(UTL_EQUALS_REAL(XY(1,I),X).AND.UTL_EQUALS_REAL(XY(2,I),Y))THEN XYLABEL(I)='DP '//TRIM(XYLABEL(I)); RETURN ENDIF ENDDO NXY=NXY+1; CALL PROFILE_WTIADDPOINT_MEMORY(NXY) !## shift locations DO I=NXY,ISEG+1,-1 XY(1,I) =XY(1,I-1) XY(2,I) =XY(2,I-1) XYLABEL(I)=XYLABEL(I-1) ENDDO XY(1,ISEG)=X; XY(2,ISEG)=Y; XYLABEL(ISEG)=TRIM(LABELNAME) !RTOS(XPOS,'F',2)) CALL PROFILE_PLOT() END SUBROUTINE PROFILE_WTIADDPOINT !###==================================================================== SUBROUTINE PROFILE_WTIADDPOINT_MEMORY(N) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: N INTEGER :: I I=SIZE(XY,2) IF(N.GT.I)THEN I=I+100; ALLOCATE(XYDUMMY(2,I),XYLABELDUMMY(I)) DO I=1,SIZE(XY,2); XYDUMMY(1,I)=XY(1,I); XYDUMMY(2,I)=XY(2,I); XYLABELDUMMY(I)=XYLABEL(I); ENDDO DEALLOCATE(XY,XYLABEL); XY=>XYDUMMY; XYLABEL=>XYLABELDUMMY ENDIF END SUBROUTINE PROFILE_WTIADDPOINT_MEMORY !###==================================================================== SUBROUTINE PROFILE_PUSHBUTTON(IEXIT) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: IEXIT TYPE(WIN_MESSAGE) :: MES INTEGER :: IT,I,IDIR REAL :: STEP IEXIT=0 SELECT CASE (MESSAGE%WIN) !## movie dialog CASE (ID_DSERIESMOVIE) SELECT CASE (MESSAGE%VALUE1) CASE (ID_FASTLEFT,ID_FASTRIGHT,ID_LEFT,ID_RIGHT,ID_TOTALLEFT,ID_TOTALRIGHT) CALL WDIALOGSELECT(ID_DSERIESMOVIE) CALL WDIALOGGETREAL(IDF_REAL1,STEP) CALL WDIALOGGETRADIOBUTTON(IDF_RADIO1,IDIR) IF(MESSAGE%VALUE1.EQ.ID_FASTLEFT.OR.MESSAGE%VALUE1.EQ.ID_FASTRIGHT)THEN CALL PROFILE_FIELDSPLAY(ID_STOP,0) CALL WDIALOGFIELDSTATE(ID_STOP,1) DO CALL WDIALOGSELECT(ID_DSERIESMOVIE) CALL WMESSAGEPEEK(IT,MES) IF(IT.EQ.PUSHBUTTON.AND.MES%VALUE1.EQ.ID_STOP)EXIT CALL PROFILE_PROFWALK(MESSAGE%VALUE1,IDIR,STEP) END DO CALL PROFILE_FIELDSPLAY(ID_STOP,1) CALL WDIALOGFIELDSTATE(ID_STOP,0) ELSE CALL PROFILE_PROFWALK(MESSAGE%VALUE1,IDIR,STEP) ENDIF CALL PROFILE_COORDINATES(0) XPOS=0.0 CASE(IDCANCEL) CALL WDIALOGSELECT(ID_DSERIESMOVIE) CALL WDIALOGHIDE() CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGPUTCHECKBOX(ID_MOVIE,0) END SELECT !## main dialog CASE (ID_DSERIESTAB1) SELECT CASE (MESSAGE%VALUE1) ! CASE(IDCANCEL,ID_CLOSE) ! IF(IP.EQ.0)IEXIT=1 CASE(ID_PROP) !## remove current line CALL PROFILE_PROPMAIN() !## draw profile CASE(ID_DRAW) CALL PROFILE_STARTPROFILE(0) !## adjust legend CASE (ID_LEGEND) CALL LEGMAIN(0) CALL PROFILE_REPLOT2D() CASE (ID_FLIP) CALL PROFILE_CLEAR() CALL PROFILE_TRANSFORMXY() CALL PROFILE_COMPUTEPLOT() CALL PROFILE_IDFMINMAX() CALL PROFILE_PLOT() XPOS=0.0 CALL PROFILE_CLEAR() CALL PROFILE_COORDINATES(0) !## zoom CASE (ID_ZOOMINMAP,ID_ZOOMOUTMAP,ID_ZOOMFULLMAP,ID_ZOOMPREVIOUS,ID_ZOOMNEXT) CALL IDFZOOM(MESSAGE%VALUE1,(MPW%XMAX+MPW%XMIN)/2.0,(MPW%YMAX+MPW%YMIN)/2.0,ID_DSERIESTAB1) CALL PROFILE_REPLOT2D() !## quickview CASE(ID_INFO) IQUICK=1 CALL UTL_HIDESHOWDIALOG(ID_DSERIES,0) CALL WDIALOGSELECT(ID_DIPFINFOSERIE); CALL WDIALOGUNLOAD() !## start quick-view mode CALL IPFGETVALUE_QUICKVIEW_INIT(1) !## help CASE(IDHELP) CALL IMODGETHELP('5.4.2','TMO.ST.CrossSec') END SELECT !## main dialog CASE (ID_DSERIES) SELECT CASE (MESSAGE%VALUE1) CASE(IDCANCEL,ID_CLOSE) IF(IP.EQ.0)IEXIT=1 !## help CASE(IDHELP) CALL IMODGETHELP('5.4.2','TMO.ST.CrossSec') END SELECT !## legend dialog CASE (ID_DSERIESLEGEND) SELECT CASE (MESSAGE%VALUE1) CASE(IDCANCEL,ID_CLOSE) IF(WMENUGETSTATE(ID_FLOATLEGEND,2).EQ.1)CALL PROFILE_LEGEND() END SELECT END SELECT END SUBROUTINE PROFILE_PUSHBUTTON !###==================================================================== SUBROUTINE PROFILE_STARTPROFILE(IMODE) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IMODE INTEGER :: I ISOL=IMODE !## turn this off temporarily ISOLID=0 CALL IGRCOLOURN(WRGB(255,255,255)) IF(NXY.GT.0)THEN DO I=1,SIZE(IWINPROFILE) CALL IGRSELECT(DRAWBITMAP,IBITMAP(I)) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL IGRAREACLEAR() CALL IGRSELECT(DRAWWIN,IWINPROFILE(I)) CALL WBITMAPPUT(IBITMAP(I),0,1) ENDDO ENDIF IF(NXY.GT.0)CALL PROFILE_CLEAR() IP =1 NXY =0 IDOWN =0 LLINE =.FALSE. SERIE%N=0 NPIPET=0 CALL WCURSORSHAPE(ID_CURSORPROFILE) CALL IGRFILLPATTERN(OUTLINE) CALL IGRLINETYPE(SOLIDLINE) CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGFIELDSTATE(ID_CLOSE,0) CALL WDIALOGFIELDSTATE(ID_DRAW,0) CALL WDIALOGFIELDSTATE(ID_PROP,0) CALL WDIALOGFIELDSTATE(ID_LEGEND,0) CALL WDIALOGFIELDSTATE(ID_FLIP,0) CALL WDIALOGPUTCHECKBOX(ID_MOVIE,0) CALL WDIALOGFIELDSTATE(ID_MOVIE,0) CALL WDIALOGFIELDSTATE(ID_SNAPPEN,0) CALL WDIALOGFIELDSTATE(ID_INFO,0) END SUBROUTINE PROFILE_STARTPROFILE !###==================================================================== SUBROUTINE PROFILE_DIALOGFIELDS(ID,K,J) !###==================================================================== USE WINTERACTER USE RESOURCE IMPLICIT NONE INTEGER,INTENT(IN) :: ID,J,K INTEGER :: I INTEGER,DIMENSION(5) :: ID1 DATA (ID1(I),I=1,5) /ID_ZOOMINMAP,ID_ZOOMOUTMAP, & ID_ZOOMRECTANGLEMAP,ID_ZOOMFULLMAP,ID_MOVEMAP/ CALL WDIALOGSELECT(ID_DSERIESTAB1) !## (de)activate buttons DO I=1,SIZE(ID1) IF(ID1(I).NE.ID)CALL WDIALOGFIELDSTATE(ID1(I),J) IF(ID1(I).EQ.ID)CALL WDIALOGPUTCHECKBOX(ID1(I),K) END DO END SUBROUTINE PROFILE_DIALOGFIELDS !###==================================================================== SUBROUTINE PROFILE_FIELDCHANGED() !###==================================================================== IMPLICIT NONE INTEGER :: IX,IY,I SELECT CASE (MESSAGE%VALUE2) CASE (ID_ZOOMRECTANGLEMAP) CALL PROFILE_DIALOGFIELDS(MESSAGE%VALUE2,1,2) CALL IDFZOOM(MESSAGE%VALUE2,(MPW%XMAX+MPW%XMIN)/2.0,(MPW%YMAX+MPW%YMIN)/2.0,ID_DSERIESTAB1) CALL PROFILE_DIALOGFIELDS(MESSAGE%VALUE2,0,1) CALL PROFILE_REPLOT2D() !## move CASE(ID_MOVEMAP) CALL PROFILE_DIALOGFIELDS(MESSAGE%VALUE2,1,2) CALL IDFMOVE(ID_DSERIESTAB1) CALL PROFILE_DIALOGFIELDS(MESSAGE%VALUE2,0,1) CALL PROFILE_REPLOT2D() CASE(ID_MOVIE) CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGGETCHECKBOX(ID_MOVIE,I) IF(I.EQ.1)THEN IX=WINFODIALOG(DIALOGXPOS)+WINFODIALOG(DIALOGWIDTH) IY=WINFODIALOG(DIALOGYPOS) CALL WDIALOGSELECT(ID_DSERIESMOVIE) CALL WDIALOGSHOW(IX,IY,0,2) ELSE CALL WDIALOGSELECT(ID_DSERIESMOVIE) CALL WDIALOGHIDE() ENDIF CASE(ID_SNAPPEN) CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGGETCHECKBOX(ID_SNAPPEN,ISNAP) CASE (IDF_RADIO1,IDF_RADIO2) END SELECT END SUBROUTINE PROFILE_FIELDCHANGED !###==================================================================== SUBROUTINE PROFILE_MENUSELECT() !###==================================================================== IMPLICIT NONE INTEGER :: ID,I SELECT CASE (MESSAGE%VALUE1) !## add label to line below line CASE (ID_ADDLINELABEL) CALL PROFILE_ADDLINELABEL() CASE (ID_WTIADD) CALL PROFILE_WTIADDPOINT() CASE (ID_REDRAW) CALL PROFILE_PLOT() CASE (ID_ZOOMWINDOW,ID_ZOOMIN,ID_ZOOMOUT,ID_MOVE,ID_ZOOMFULL) ID=MESSAGE%VALUE1 CALL PROFILE_ZOOM(ID) GXMIN=GRAPHUNITS(1,1) GXMAX=GRAPHUNITS(3,1) GYMIN=GRAPHUNITS(2,1) GYMAX=GRAPHUNITS(4,1) !## save profile CASE (ID_SAVEAS) CALL PROFILE_SAVE() !## print profile CASE (ID_PRINT) DO I=1,SIZE(IWINPROFILE) CALL IGRSELECT(2,IBITMAP(I)) CALL IGRPRINTIMAGESELECT(10) !## PRINT MANAGER CALL WPRINTIMAGEOPTIONS(4) IF(WINFODIALOG(4).NE.1)RETURN CALL IGRPRINTIMAGE() ENDDO !## determine layer CASE (ID_SELECT) CALL PROFILE_PIPET(MESSAGE%VALUE1) !## adjust legend CASE (ID_CDLNL,ID_CDLL,ID_TDLNL,ID_TDLL,ID_TDUV,ID_CDUV) CALL LEGCREATEINIT(MESSAGE%VALUE1) CALL PROFILE_REPLOT2D() CASE (ID_ADJUSTLEGEND) CALL LEGMAIN(0) CALL PROFILE_REPLOT2D() CASE (ID_COPY) DO I=1,SIZE(IWINPROFILE) IF(MESSAGE%WIN.EQ.IWINPROFILE(I))CALL WCLIPBOARDPUTBITMAP(IBITMAP(I)) ENDDO CASE (ID_DELNODE) CALL SOLIDPROFILEDELNODE(ICRD_SOLID,IELEV_SOLID) CALL PROFILE_PLOT() CASE (ID_LINECOLOR) CALL SOLIDPROFILELINECOLOR(IELEV_SOLID) CALL PROFILE_PLOT() CASE (ID_LTHICKNESS1,ID_LTHICKNESS2,ID_LTHICKNESS3) CALL SOLIDPROFILELINETHICKNESS(MESSAGE%VALUE1,IELEV_SOLID) CALL PROFILE_PLOT() CASE (ID_BITMAP) CALL PROFILE_BACKGROUND_BITMAP() CASE (ID_FLOATLEGEND) CALL PROFILE_LEGEND() END SELECT END SUBROUTINE PROFILE_MENUSELECT !###==================================================================== SUBROUTINE PROFILE_REPLOT2D() !###==================================================================== IMPLICIT NONE INTEGER :: I !## reset selection MP%ISEL=LISEL CALL MANAGERUPDATE() CALL IDFPLOTFAST(0) !## turn off CALL PROFILE_TURNOFF() CALL PROFILE_CLEAR() !## reopen files CALL PROFILE_OPENFILES() !## zoomprevious and zoomnext settings CALL WDIALOGSELECT(ID_SERIES) I=0; IF(ZM%IZOOM.GT.1)I=1 CALL WDIALOGFIELDSTATE(ID_ZOOMPREVIOUS,I) I=0; IF(ZM%IZOOM.LT.ZM%NZOOM)I=1 CALL WDIALOGFIELDSTATE(ID_ZOOMNEXT,I) END SUBROUTINE PROFILE_REPLOT2D !###==================================================================== SUBROUTINE PROFILE_EXPOSE() !###==================================================================== IMPLICIT NONE INTEGER :: IWINID IF(MESSAGE%WIN.EQ.ID_DSERIESTAB1)THEN CALL PROFILE_CLEAR() XPOS=0.0 CALL PROFILE_CLEAR() RETURN ENDIF !## refresh all DO IWINID=1,SIZE(IWINPROFILE) IF(MESSAGE%WIN.NE.IWINPROFILE(IWINID))CYCLE CALL IGRSELECT(DRAWWIN,IWINPROFILE(IWINID)) CALL IGRAREA(0.0,0.0,1.0,1.0) CALL WBITMAPPUT(IBITMAP(IWINID),0,1) RETURN ENDDO END SUBROUTINE PROFILE_EXPOSE !###==================================================================== SUBROUTINE PROFILE_RESIZE() !###==================================================================== IMPLICIT NONE INTEGER :: IH,IW,IWINID IF(MESSAGE%WIN.EQ.0)THEN CALL WINDOWSELECT(MPW%IWIN) CALL WINDOWSIZEPOS(ISTATE=WINHIDDEN) ENDIF IF(MESSAGE%WIN.EQ.ID_DSERIESTAB1)THEN CALL PROFILE_CLEAR() XPOS=0.0 CALL PROFILE_CLEAR() RETURN ENDIF !## refresh all DO IWINID=1,SIZE(IWINPROFILE) IF(MESSAGE%WIN.NE.IWINPROFILE(IWINID))CYCLE !## plot window resized, resize bitmap! CALL WINDOWSELECT(IWINPROFILE(IWINID)) CALL IGRSELECT(DRAWWIN,IWINPROFILE(IWINID)) IW=WINFODRAWABLE(DRAWABLEWIDTH) IH=WINFODRAWABLE(DRAWABLEHEIGHT) IF(IBITMAP(IWINID).NE.0)CALL WBITMAPDESTROY(IBITMAP(IWINID)) CALL WBITMAPCREATE(IBITMAP(IWINID),IW,IH) CALL PROFILE_PLOT() RETURN ENDDO END SUBROUTINE PROFILE_RESIZE !###====================================================================== SUBROUTINE PROFILE_CLEAR() !###====================================================================== IMPLICIT NONE INTEGER :: I !## set drawable, extent and linetype/drawingtype (xor-mode) CALL PROFILE_EXTENT_2DBITMAP() DO I=2,NXY CALL IGRLINEWIDTH(LINEWIDTHPLOT) CALL IGRCOLOURN(LINECOLORPLOT) CALL IGRJOIN(XY(1,I-1),XY(2,I-1),XY(1,I),XY(2,I)) CALL IGRLINEWIDTH(1) CALL PROFILE_PLOTVIEWBOX(XY(1,I-1),XY(2,I-1),XY(1,I),XY(2,I)) END DO CALL IGRLINEWIDTH(1) CALL PROFILE_PLOTLOCATION(LINEWIDTHPLOT) CALL PROFILE_PUTBITMAP(MPW%IBITMAP) CALL IGRPLOTMODE(MODECOPY) END SUBROUTINE PROFILE_CLEAR !###====================================================================== SUBROUTINE PROFILE_PLOTVIEWBOX(X1,Y1,X2,Y2) !###====================================================================== IMPLICIT NONE REAL,INTENT(IN) :: X1,X2,Y1,Y2 REAL,DIMENSION(4,2) :: XYPOL IF(ABS(MXNIFF).EQ.0.AND.ABS(NIPF).EQ.0)RETURN IF(XSIGHT.LE.0.0)RETURN CALL UTL_PROFILE_COMPVIEWBOX(X1,X2,Y1,Y2,XYPOL,XSIGHT) CALL IGRLINEWIDTH(1) CALL IGRFILLPATTERN(SOLID) CALL IGRCOLOURN(ICLRVIEWAR) CALL IGRPOLYGONSIMPLE(XYPOL(:,1),XYPOL(:,2),4) CALL IGRFILLPATTERN(OUTLINE) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRLINEWIDTH(1) END SUBROUTINE PROFILE_PLOTVIEWBOX !###====================================================================== SUBROUTINE PROFILE_FIELDTOOLBAR(ID,J) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID,J INTEGER :: I,IW I=J IF(NXY.LE.0)I=0 !## adjust all buttons on graphical windows DO IW=1,SIZE(IWINPROFILE) CALL WINDOWSELECT(IWINPROFILE(IW)) CALL WMENUSETSTATE(ID_ZOOMIN,1,I) CALL WMENUSETSTATE(ID_ZOOMOUT,1,I) CALL WMENUSETSTATE(ID_ZOOMWINDOW,1,I) CALL WMENUSETSTATE(ID_ZOOMFULL,1,I) CALL WMENUSETSTATE(ID_SAVEAS,1,I) CALL WMENUSETSTATE(ID_MOVE,1,I) CALL WMENUSETSTATE(ID_COPY,1,I) CALL WMENUSETSTATE(ID_PRINT,1,I) CALL WMENUSETSTATE(ID_SELECT,1,I) CALL WMENUSETSTATE(ID_BITMAP,1,I) IF(ID.EQ.0.AND.ABS(I-1).EQ.0)THEN ELSE CALL WMENUSETSTATE(ID,1,1) CALL WMENUSETSTATE(ID,2,ABS(I-1)) ENDIF ENDDO END SUBROUTINE PROFILE_FIELDTOOLBAR !###====================================================================== SUBROUTINE PROFILE_BACKGROUND_BITMAP() !###====================================================================== IMPLICIT NONE !## window are synchronized, does not matter what menu-item to take CALL WINDOWSELECT(IWINPROFILE(1)) IF(PBITMAP%IACT.EQ.0)THEN CALL WMENUSETSTATE(ID_BITMAP,2,1) PBITMAP%IACT=1; CALL PROFILE_BACKGROUND_OPENBITMAP() ELSE CALL WBITMAPDESTROY(PBITMAP%IBITMAP) CALL WMENUSETSTATE(ID_BITMAP,2,0); PBITMAP%IACT=0 ENDIF CALL PROFILE_PLOT() END SUBROUTINE PROFILE_BACKGROUND_BITMAP !###====================================================================== SUBROUTINE PROFILE_BACKGROUND_OPENBITMAP() !###====================================================================== IMPLICIT NONE INTEGER,ALLOCATABLE,DIMENSION(:) :: INFO INTEGER :: IW,IH,I REAL :: RATIO,X1,Y1,X2,Y2 PBITMAP%FNAME='' IF(.NOT.UTL_WSELECTFILE('All Known Files (*.bmp;*.png;*.jpg)|*.bmp;*.png;*.jpg|BitMap (*.bmp)|*.bmp| & Portable Network Graphic image (*.png)|*.png|JPEG Image (*.jpg)|*.jpg|',& LOADDIALOG+MUSTEXIST+PROMPTON+DIRCHANGE+APPENDEXT,PBITMAP%FNAME,& 'Load Background BitMap (*.bmp;*.png;*.jpg)'))RETURN IF(ALLOCATED(INFO))DEALLOCATE(INFO); ALLOCATE(INFO(6)) CALL IGRFILEINFO(PBITMAP%FNAME,INFO,6) PBITMAP%ITYPE=INFO(1) PBITMAP%NCOL =INFO(2) !## Image width in pixels. PBITMAP%NROW =INFO(3) !## Image height in pixels. PBITMAP%NCLR =INFO(4) !## Number of colours. PBITMAP%COMPR=INFO(5) !## Is file compressed ? 0 = no , 1 = yes. PBITMAP%CDEPT=INFO(6) !## Colour depth in bits-per-pixel (1-32) IF(ALLOCATED(INFO))DEALLOCATE(INFO) IW=WINFODRAWABLE(DRAWABLEWIDTH) IH=WINFODRAWABLE(DRAWABLEHEIGHT) !## initialize parameters x1,x2 y1=top y2=bottom PBITMAP%IX1=IW/4.0;PBITMAP%IX2=IW*(3.0/4.0);PBITMAP%IY1=IH/4.0;PBITMAP%IY2=IH*(3.0/4.0) X1=PBITMAP%IX1 X2=PBITMAP%IX2 Y1=PBITMAP%IY1 Y2=PBITMAP%IY2 CALL UTL_IDFCRDCOR(X1,X2,Y1,Y2,REAL(PBITMAP%NCOL),REAL(PBITMAP%NROW)) PBITMAP%IX1=X1 PBITMAP%IX2=X2 PBITMAP%IY1=Y1 PBITMAP%IY2=Y2 CALL PROFILE_BACKGROUND_BITMAP_READ() END SUBROUTINE PROFILE_BACKGROUND_OPENBITMAP !###====================================================================== SUBROUTINE PROFILE_BACKGROUND_BITMAP_MOUSEMOVE(IPX,IPY,CRDITYPE,ICRD) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPX,IPY INTEGER,INTENT(OUT) :: CRDITYPE,ICRD REAL :: DX,XC,YC REAL,DIMENSION(4) :: XCRD,YCRD IF(PBITMAP%IACT.EQ.0)RETURN XC=REAL(IPX); YC=REAL(IPY) XCRD(1)=REAL(PBITMAP%IX1); YCRD(1)=REAL(PBITMAP%IY1) XCRD(2)=REAL(PBITMAP%IX2); YCRD(2)=REAL(PBITMAP%IY2) DX=10.0 !## pixels !## linestuk ICRD=0 IF(IGRDISTANCELINE(XCRD(2),YCRD(2),XCRD(1),YCRD(2),XC,YC,0).LE.DX)ICRD=1 !## bottom IF(IGRDISTANCELINE(XCRD(2),YCRD(1),XCRD(2),YCRD(2),XC,YC,0).LE.DX)ICRD=2 !## right IF(IGRDISTANCELINE(XCRD(1),YCRD(1),XCRD(2),YCRD(1),XC,YC,0).LE.DX)ICRD=3 !## top IF(IGRDISTANCELINE(XCRD(1),YCRD(2),XCRD(1),YCRD(1),XC,YC,0).LE.DX)ICRD=4 !## left IF(UTL_DIST(XCRD(2),YCRD(1),XC,YC).LE.DX)ICRD=6 !## urc IF(UTL_DIST(XCRD(2),YCRD(2),XC,YC).LE.DX)ICRD=7 !## lrc IF(UTL_DIST(XCRD(1),YCRD(2),XC,YC).LE.DX)ICRD=8 !## llc IF(UTL_DIST(XCRD(1),YCRD(1),XC,YC).LE.DX)ICRD=9 !## ulc SELECT CASE(ICRD) CASE (1,3) CALL WCURSORSHAPE(ID_CURSORMOVEUPDOWN) CASE (2,4) CALL WCURSORSHAPE(ID_CURSORMOVELEFTRIGHT) CASE (7,9) CALL WCURSORSHAPE(ID_CURSORMOVENWSE) CASE (6,8) CALL WCURSORSHAPE(ID_CURSORMOVENESW) END SELECT CRDITYPE=ICRD; IF(CRDITYPE.NE.0)RETURN IF(XC.GT.XCRD(1).AND.XC.LT.XCRD(2).AND. & YC.GT.YCRD(1).AND.YC.LT.YCRD(2))THEN CALL WCURSORSHAPE(ID_CURSORMOVE) CRDITYPE=5; RETURN ENDIF ICRD=0; CRDITYPE=0; CALL WCURSORSHAPE(CURARROW) END SUBROUTINE PROFILE_BACKGROUND_BITMAP_MOUSEMOVE !###====================================================================== SUBROUTINE PROFILE_BACKGROUND_BITMAP_ADJUST(IPX,IPY,CRDITYPE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IPX,IPY INTEGER,INTENT(IN) :: CRDITYPE INTEGER :: IDX,IDY IDX=IPX-LMBXPIX IDY=IPY-LMBYPIX SELECT CASE (CRDITYPE) CASE (1) !## bottom PBITMAP%IY2=PBITMAP%IY2+IDY CASE (2) !## right PBITMAP%IX2=PBITMAP%IX2+IDX CASE (3) !## top PBITMAP%IY1=PBITMAP%IY1+IDY CASE (4) !## left PBITMAP%IX1=PBITMAP%IX1+IDX CASE (5) !## move PBITMAP%IX1=PBITMAP%IX1+IDX PBITMAP%IX2=PBITMAP%IX2+IDX PBITMAP%IY1=PBITMAP%IY1+IDY PBITMAP%IY2=PBITMAP%IY2+IDY CASE (6) !## urc PBITMAP%IX2=PBITMAP%IX2+IDX PBITMAP%IY1=PBITMAP%IY1+IDY CASE (7) !## lrc PBITMAP%IX2=PBITMAP%IX2+IDX PBITMAP%IY2=PBITMAP%IY2+IDY CASE (8) !## llc PBITMAP%IX1=PBITMAP%IX1+IDX PBITMAP%IY2=PBITMAP%IY2+IDY CASE (9) !## ulc PBITMAP%IX1=PBITMAP%IX1+IDX PBITMAP%IY1=PBITMAP%IY1+IDY END SELECT LMBXPIX=LMBXPIX+IDX; LMBYPIX=LMBYPIX+IDY END SUBROUTINE PROFILE_BACKGROUND_BITMAP_ADJUST !###====================================================================== SUBROUTINE PROFILE_PIPET(ID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID INTEGER :: IEXIT,JD,IDC,I,N,IWINID,ICLRIROW,NMOVE REAL :: X1,Y1 REAL,DIMENSION(:),ALLOCATABLE :: ZIDF INTEGER,DIMENSION(:),ALLOCATABLE :: ILIST,NND,IPOS !## window are synchronized, does not matter what menu-item to take CALL WINDOWSELECT(IWINPROFILE(1)) CALL WDIALOGLOAD(ID_DIDFINFO,ID_DIDFINFO) CALL WDIALOGPUTSTRING(IDF_LABEL2,'') ALLOCATE(ILIST(3),IPOS(MXNIDF)) ILIST(1)=1; ILIST(2)=2; ILIST(3)=3 CALL WGRIDCOLUMNS(IDF_GRID1,3,ILIST) IF(ID.EQ.ID_SELECT)THEN !## plot all result in id_select mode !## get number of activated idf files N=0 IPOS=0 DO I=1,MXNIDF !## compute only those that are activated CALL UTL_FILLARRAY(IPRF,7,PROFIDF(I)%PRFTYPE) IF(IPRF(1).EQ.1)THEN N=N+1 IPOS(N)=I ENDIF ENDDO CALL WGRIDROWS(IDF_GRID1,N) I=MAX(1,(N-2))*(268-80)/16 CALL WDIALOGSIZE(IHEIGHT=90+I) DO I=1,N CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,I,PROFIDF(IPOS(I))%ALIAS) CALL WGRIDPUTCELLSTRING(IDF_GRID1,3,I,TRIM(IDFTRANSFORM(PROFIDF(IPOS(I))%UNITS+1))) CALL WGRIDCOLOURCELL(IDF_GRID1,1,I,-1,PROFIDF(IPOS(I))%SCOLOR) ENDDO ENDIF DEALLOCATE(ILIST) CALL WDIALOGSHOW(-0,65,0,2) JD=ID CALL PROFILE_FIELDTOOLBAR(JD,0) SELECT CASE (JD) !## determine layer CASE (ID_SELECT) IDC=ID_CURSORIDFVALUE END SELECT CALL WCURSORSHAPE(IDC) CALL IGRPLOTMODE(MODEXOR) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRLINEWIDTH(1) CALL IGRLINETYPE(DASHED) IF(ALLOCATED(ZIDF))DEALLOCATE(ZIDF); ALLOCATE(ZIDF(N)) IF(ALLOCATED(NND))DEALLOCATE(NND); ALLOCATE(NND(NSCREEN)) !## igraph=zero is not always there ... IF(ALLOCATED(IPIPET))DEALLOCATE(IPIPET); ALLOCATE(IPIPET(NSCREEN)) !## igraph=zero is not always there ... NPIPET=NSCREEN NMOVE=1 ICLRIROW=0 X1=0.0; Y1=0.0 DO CALL WMESSAGE(ITYPE,MESSAGE) DO IWINID=1,SIZE(IWINPROFILE); IF(MESSAGE%WIN.EQ.IWINPROFILE(IWINID))EXIT; ENDDO !## mouse inside proper window IF(IWINID.LE.SIZE(IWINPROFILE))THEN IF(WINFOMOUSE(MOUSECURSOR).NE.IDC)CALL WCURSORSHAPE(IDC) SELECT CASE (ITYPE) !## mouse move CASE(MOUSEMOVE) IF(NMOVE.EQ.1)THEN !## update all windows DO I=1,SIZE(IWINPROFILE) !## activatie current window CALL PROFILE_EXTENT_GRAPH(I) CALL WINDOWOUTSTATUSBAR(1,'Distance: '//TRIM(ITOS(INT(MESSAGE%GX)))//' m, Map Value: '//TRIM(RTOS(MESSAGE%GY,'F',2))) !## draw cross of current position CALL PROFILE_PIPET_CROSS(I,X1,Y1) CALL PROFILE_PIPET_CROSS(I,MESSAGE%GX,MESSAGE%GY) ENDDO !## find appropriate idf" CALL PROFILE_PIPET_SEARCH(MESSAGE%GX,MESSAGE%GY,ZIDF,NND,IPOS,N,JD,ICLRIROW) CALL PROFILE_EXTENT_GRAPH(IWINID) X1=MESSAGE%GX Y1=MESSAGE%GY ENDIF !## mouse released CASE(MOUSEBUTUP) !## mouse pressed CASE(MOUSEBUTDOWN) SELECT CASE (MESSAGE%VALUE1) CASE (RIGHTBUTTON) IEXIT=MESSAGE%VALUE1 EXIT CASE (LEFTBUTTON) NMOVE=ABS(NMOVE-1) END SELECT CASE(EXPOSE) CALL PROFILE_EXPOSE() X1=0.0; Y1=0.0 CASE(RESIZE) CALL PROFILE_RESIZE() X1=0.0; Y1=0.0 END SELECT ELSE IF(WINFOMOUSE(MOUSECURSOR).NE.CURHOURGLASS)CALL WCURSORSHAPE(CURHOURGLASS) SELECT CASE (ITYPE) !## pressed close button CASE (PUSHBUTTON) SELECT CASE (MESSAGE%VALUE1) CASE (IDCANCEL) IEXIT=3 EXIT CASE (IDHELP) CALL IMODGETHELP('5.4','TMO.SolTool') END SELECT END SELECT ENDIF ENDDO CALL PROFILE_FIELDTOOLBAR(JD,1) CALL WCURSORSHAPE(CURARROW) CALL IGRPLOTMODE(MODECOPY) CALL IGRLINETYPE(SOLIDLINE) CALL WDIALOGSELECT(ID_DIDFINFO) CALL WDIALOGUNLOAD() IF(ALLOCATED(ZIDF))DEALLOCATE(ZIDF) IF(ALLOCATED(IPOS))DEALLOCATE(IPOS) IF(ALLOCATED(NND))DEALLOCATE(NND) !## terminated iext=3 (right-mouse-button) IF(IEXIT.EQ.3.OR.(JD.EQ.ID_SELECT.AND.IEXIT.EQ.1))THEN IF(ALLOCATED(IPIPET))DEALLOCATE(IPIPET) NPIPET=0 ENDIF CALL PROFILE_RESIZE() END SUBROUTINE PROFILE_PIPET !###==================================================================== SUBROUTINE PROFILE_PIPET_CROSS(IWINID,X,Y) !###==================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IWINID REAL,INTENT(IN) :: X,Y IF(X.EQ.0.0)RETURN CALL IGRPLOTMODE(MODEXOR) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRLINEWIDTH(1) CALL IGRLINETYPE(DASHED) !## vertical CALL IGRJOIN(X,GRAPHUNITS(2,IWINID),X,GRAPHUNITS(4,IWINID)) !## horizontal CALL IGRJOIN(GRAPHUNITS(1,IWINID),Y,GRAPHUNITS(3,IWINID),Y) END SUBROUTINE PROFILE_PIPET_CROSS !###====================================================================== SUBROUTINE PROFILE_PIPET_SEARCH(GX,GY,ZIDF,NND,IPOS,N,JD,ICLRIROW) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: N,JD INTEGER,INTENT(INOUT) :: ICLRIROW REAL,INTENT(IN) :: GX,GY !## graph coordinates INTEGER,DIMENSION(N),INTENT(IN) :: IPOS INTEGER,DIMENSION(NSCREEN),INTENT(OUT) :: NND REAL,DIMENSION(N),INTENT(OUT) :: ZIDF INTEGER :: I,J,ICOL,IROW,IZ,ISCREEN,ICLR,IZZ REAL :: XC,YC,DZ,MINZ,ST !## transform profile coordinates into xy coordinates CALL PROFILE_GETLOCATION(XC,YC,GX) CALL WDIALOGSELECT(ID_DIDFINFO) CALL WDIALOGPUTSTRING(IDF_LABEL11,'Current Loc. X='//TRIM(ITOS(INT(XC)))// & ' m; Y='//TRIM(ITOS(INT(YC)))//' m; Z='//TRIM(RTOS(GY,'F',2))) !## get number of NND=0; J=0 DO I=1,N CALL IDFIROWICOL(PROFIDF(IPOS(I))%IDF,IROW,ICOL,XC,YC) !## get idf values IF(ICOL.GE.1.AND.ICOL.LE.PROFIDF(IPOS(I))%IDF%NCOL.AND. & IROW.GE.1.AND.IROW.LE.PROFIDF(IPOS(I))%IDF%NROW)THEN ZIDF(I)=IDFGETVAL(PROFIDF(IPOS(I))%IDF,IROW,ICOL,PROFIDF(IPOS(I))%UNITS) ISCREEN=PROFIDF(IPOS(I))%ISCREEN NND(ISCREEN)=NND(ISCREEN)+1 ELSE ZIDF(I)=PROFIDF(IPOS(I))%IDF%NODATA ENDIF IF(ZIDF(I).NE.PROFIDF(IPOS(I))%IDF%NODATA)J=J+1 ENDDO !## reset window CALL WGRIDROWS(IDF_GRID1,J) I=MAX(1,(J-2))*(268-80)/16; CALL WDIALOGSIZE(IHEIGHT=90+I) J=0; DO I=1,N IF(ZIDF(I).NE.PROFIDF(IPOS(I))%IDF%NODATA)THEN J=J+1 CALL WGRIDPUTCELLSTRING(IDF_GRID1,1,J,PROFIDF(IPOS(I))%ALIAS) CALL WGRIDPUTCELLSTRING(IDF_GRID1,3,J,TRIM(IDFTRANSFORM(PROFIDF(IPOS(I))%UNITS+1))) CALL WGRIDCOLOURCELL(IDF_GRID1,1,J,-1,PROFIDF(IPOS(I))%SCOLOR) CALL WGRIDPUTCELLREAL(IDF_GRID1,2,J,ZIDF(I),'(G15.7)') ENDIF; ENDDO DO ISCREEN=NSCREEN,1,-1 IF(NND(ISCREEN).GT.0)THEN MINZ=(GRAPHUNITS(4,ISCREEN)-GRAPHUNITS(2,ISCREEN))*2.0 IZ = 0 ST = 10.0E10 !## make sure top/bottoms are declining with mxnidf DO J=1,N IF(PROFIDF(J)%ISCREEN.EQ.ISCREEN.AND. & ZIDF(J).NE.PROFIDF(J)%IDF%NODATA)THEN !## top/bottom is not declining with n IF(ZIDF(J).GT.ST)EXIT !## update current vertical position ST=ZIDF(J) DZ=GY-ZIDF(J) IF(ABS(DZ).LE.ABS(MINZ))THEN MINZ=DZ IZ =J ENDIF ENDIF END DO IF(JD.EQ.ID_SELECT)THEN ELSE CALL PROFILE_PIPET_SEARCH_CLEAR(JD,ICLRIROW,ISCREEN) CALL WDIALOGPUTSTRING(IDF_LABEL2,'') !Inconsistency in top/bottoms at current location') ENDIF ELSE CALL PROFILE_PIPET_SEARCH_CLEAR(JD,ICLRIROW,ISCREEN) CALL WDIALOGPUTSTRING(IDF_LABEL2,'') !Only NODATA found at current location') ENDIF ENDDO CALL WDIALOGSETFIELD(IDF_LABEL11) END SUBROUTINE PROFILE_PIPET_SEARCH !###====================================================================== SUBROUTINE PROFILE_PIPET_SEARCH_CLEAR(JD,ICLRIROW,JGRAPH) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: JD,JGRAPH INTEGER,INTENT(INOUT) :: ICLRIROW IF(JD.EQ.ID_SELECT)THEN IF(ICLRIROW.NE.0)CALL WGRIDCOLOURCELL(IDF_GRID1,1,ICLRIROW,-1,-1) ICLRIROW=0 ENDIF END SUBROUTINE PROFILE_PIPET_SEARCH_CLEAR !###====================================================================== SUBROUTINE PROFILE_PROFWALK(ID,IDIR,STEP) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID,IDIR REAL,INTENT(INOUT) :: STEP !INTEGER :: IDIR REAL :: PMN,PMX CALL PROFILE_CLEAR() !## include current zoomlevel IF(IDIR.EQ.1)THEN PMN=MPW%XMIN PMX=MPW%XMAX ELSEIF(IDIR.EQ.2)THEN PMN=MPW%YMIN PMX=MPW%YMAX ENDIF IF(ID.EQ.ID_TOTALLEFT)THEN IF(IDIR.EQ.1)STEP=MINVAL(XY(1,1:NXY))-PMN IF(IDIR.EQ.2)STEP=MINVAL(XY(2,1:NXY))-PMN ELSEIF(ID.EQ.ID_TOTALRIGHT)THEN IF(IDIR.EQ.1)STEP=PMX-MAXVAL(XY(1,1:NXY)) IF(IDIR.EQ.2)STEP=PMX-MAXVAL(XY(2,1:NXY)) ENDIF SELECT CASE (ID) CASE (ID_LEFT,ID_FASTLEFT,ID_TOTALLEFT) IF(IDIR.EQ.1.AND.MINVAL(XY(1,1:NXY))-STEP.GE.PMN)XY(1,:)=XY(1,:)-STEP IF(IDIR.EQ.2.AND.MINVAL(XY(2,1:NXY))-STEP.GE.PMN)XY(2,:)=XY(2,:)-STEP CASE (ID_RIGHT,ID_FASTRIGHT,ID_TOTALRIGHT) IF(IDIR.EQ.1.AND.MAXVAL(XY(1,1:NXY))+STEP.LE.PMX)XY(1,:)=XY(1,:)+STEP IF(IDIR.EQ.2.AND.MAXVAL(XY(2,1:NXY))+STEP.LE.PMX)XY(2,:)=XY(2,:)+STEP END SELECT CALL PROFILE_COMPUTEPLOT() CALL PROFILE_IDFMINMAX() CALL PROFILE_PLOT() XPOS=0.0 CALL PROFILE_CLEAR() CALL WDIALOGSELECT(ID_DSERIESMOVIE) END SUBROUTINE PROFILE_PROFWALK !###====================================================================== SUBROUTINE PROFILE_PLOT(LPS) !###====================================================================== IMPLICIT NONE LOGICAL,OPTIONAL :: LPS REAL :: XINT,YINT INTEGER :: ILEGEND,IWINID !## ngraphs/screens depends on selection ... CALL PROFILE_PLOT_NSCREEN() CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,AXES%IFIXX) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,AXES%IFIXY) CALL WDIALOGGETCHECKBOX(IDF_CHECK4,ILEGEND) XINT=1.0 IF(AXES%IFIXX.EQ.1)THEN CALL WDIALOGGETREAL(IDF_REAL7,XMIN) CALL WDIALOGGETREAL(IDF_REAL8,XMAX) CALL WDIALOGGETREAL(IDF_REAL6,XINT) ENDIF YINT=1.0 IF(AXES%IFIXY.EQ.1)THEN CALL WDIALOGGETREAL(IDF_REAL3,YMIN) CALL WDIALOGGETREAL(IDF_REAL4,YMAX) CALL WDIALOGGETREAL(IDF_REAL5,YINT) ENDIF CALL IGRCOLOURN(WRGB(255,255,255)) !## plot axis and correct xmin,ymin,xmax,ymax for axes IF(XMAX.LE.XMIN)XMAX=XMIN+1.0 IF(YMAX.LE.YMIN)THEN YMAX=YMIN+5000.0 YMIN=YMIN-5000.0 ENDIF AXES%XMIN =XMIN AXES%XMAX =XMAX AXES%YMIN =YMIN AXES%YMAX =YMAX AXES%XINT =XINT AXES%YINT =YINT AXES%ICLRRASTER=ICLRRASTER AXES%XFACTOR=1.0 !0.001 AXES%YFACTOR=1.0 !## 1.0/factor is ratio of screen to be used for margins AXES%DXAXESL=40.0 !## left AXES%DYAXESB=20.0 !/REAL(NGRAPH) !## bottom AXES%DYAXEST=75.0 !## top AXES%DXAXESR=150.0 !## right AXES%TFONT=FFHELVETICA !## text-font AXES%IAXES=(/1,0/) !## left/bottom axes only AXES%XTITLE='Profile Distance (meters)' AXES%YTITLE='' AXES%LDATE=.FALSE. CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) IF(AXES%IFIXX.EQ.0)THEN CALL WDIALOGPUTREAL(IDF_REAL7,XMIN) CALL WDIALOGPUTREAL(IDF_REAL8,XMAX) CALL WDIALOGPUTREAL(IDF_REAL6,AXES%XINT) ENDIF IF(AXES%IFIXY.EQ.0)THEN CALL WDIALOGPUTREAL(IDF_REAL3,YMIN) CALL WDIALOGPUTREAL(IDF_REAL4,YMAX) CALL WDIALOGPUTREAL(IDF_REAL5,AXES%YINT) ENDIF DO IWINID=1,SIZE(IWINPROFILE) IF(PRESENT(LPS))THEN !## select proper window for postscript IF(LPS) CALL IGRSELECT(DRAWWIN,IWINPROFILE(IWINID)) IF(.NOT.LPS)CALL IGRSELECT(DRAWBITMAP,IBITMAP(IWINID)) ELSE !## select proper bitmap CALL IGRSELECT(DRAWBITMAP,IBITMAP(IWINID)) ENDIF !## change plotmode CALL IGRPLOTMODE(MODECOPY) CALL IGRAREA(GRAPHAREA(1,IWINID),GRAPHAREA(2,IWINID),GRAPHAREA(3,IWINID),GRAPHAREA(4,IWINID)) AXES%ICLRBACKGROUND=WRGB(123,152,168) !## plot/define axes CALL PROFILE_PLOTAXES(AXES,IWINID) !## put bitmap of background bitmap IF(PBITMAP%IACT.EQ.1)THEN CALL WBITMAPPUT(PBITMAP%IBITMAP,1,1,PBITMAP%IX1,PBITMAP%IY1,PBITMAP%IX2,PBITMAP%IY2) ENDIF !## draw profile obtained by IDF's IF(MXNIDF.GT.0)CALL PROFILE_BITMAPIDF(IWINID) !## draw imod flowline-file by IFF's IF(MXNIFF.GT.0)CALL PROFILE_BITMAPIFF() !## draw imod point-file by IPF's CALL PROFILE_BITMAPIPF() !## plot knickpoints CALL PROFILE_PLOT_KNICKPOINTS() !## plot legend IF(ILEGEND.EQ.1)CALL PROFILE_PLOT_LEGEND(IWINID) !## plot coordinates of profile CALL PROFILE_PLOTCOORDINATES() !## plot 2d plot of selected layer CALL PROFILE_PLOT_2DIDF() !## plot cross-sections (if isolid.eq.1) !## solid-modeling not activated IF(ISOLID.NE.0)THEN IF(ALLOCATED(SPF).AND.ISPF.GT.0)THEN CALL SOLIDPROFILEDRAW(1,SIZE(SPF(ISPF)%PROF),0,0,IWINID) !## 0 means all ENDIF !## plot intersections by others CALL SOLIDPROFILEDRAW_INTERSECTIONS(IWINID) ENDIF ENDDO !##SIZE(IWINPROFILE)=NSCREEN !## plot survey, RELATIVE to entire bitmap CALL PROFILE_PLOTSURVEY() IF(ISOLID.NE.0)THEN !## plot extend of masks CALL SOLIDPROFILEDRAW_MASK() !## plot extend of polygon(s) CALL SOLIDPROFILEDRAW_POLYGON() ENDIF IF(PRESENT(LPS))THEN IF(LPS)RETURN ENDIF !## draw all bitmaps DO IWINID=1,SIZE(IWINPROFILE) !## putbitmap on entire screen or ratio CALL IGRSELECT(DRAWWIN,IWINPROFILE(IWINID)) CALL WBITMAPPUT(IBITMAP(IWINID),0,1) ENDDO END SUBROUTINE PROFILE_PLOT !###====================================================================== SUBROUTINE PROFILE_PLOT_2DIDF() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,IPLOT,II REAL :: XMIN_ORG,YMIN_ORG,XMAX_ORG,YMAX_ORG,XA1,YA1,XA2,YA2,RD,DX,DY !## split window? !## plot selected idf's IF(NPIPET.EQ.0)RETURN !## do not refresh if profile is moving IF(LMOVEPROF)RETURN CALL UTL_MESSAGEHANDLE(0) CALL WINDOWSELECT(0) DO II=1,SIZE(IBITMAP) CALL IGRSELECT(DRAWBITMAP,IBITMAP(II)) CALL IGRPLOTMODE(MODECOPY) RD=REAL(WINFODRAWABLE(DRAWABLEWIDTH))/REAL(WINFODRAWABLE(DRAWABLEHEIGHT)) DO I=1,SIZE(IPIPET) IPLOT=IPIPET(I) XA1=GRAPHAREA(3,1) YA1=REAL(I-1)*1.0/REAL(SIZE(IPIPET)) XA2=1.0 YA2=REAL(I)*1.0/REAL(SIZE(IPIPET)) CALL IGRAREA(XA1,YA1,XA2,YA2) CALL IGRAREACLEAR() !## copy of original mpw%-coordinates XMIN_ORG=MPW%XMIN YMIN_ORG=MPW%YMIN XMAX_ORG=MPW%XMAX YMAX_ORG=MPW%YMAX MPW%XMIN=MINVAL(XY(1,1:NXY)) MPW%XMAX=MAXVAL(XY(1,1:NXY)) MPW%YMIN=MINVAL(XY(2,1:NXY)) MPW%YMAX=MAXVAL(XY(2,1:NXY)) DX=(MPW%XMAX-MPW%XMIN)/25.0 DY=(MPW%YMAX-MPW%YMIN)/25.0 MPW%XMIN=MPW%XMIN-(MAX(DX,DY)) MPW%XMAX=MPW%XMAX+(MAX(DX,DY)) MPW%YMIN=MPW%YMIN-(MAX(DX,DY)) MPW%YMAX=MPW%YMAX+(MAX(DX,DY)) CALL UTL_IDFCRDCOR(MPW%XMIN,MPW%XMAX,MPW%YMIN,MPW%YMAX,RD*(XA2-XA1),YA2-YA1) CALL IGRUNITS(MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX) IF(IDFDRAW(PROFIDF(IPLOT)%IDF,PROFIDF(IPLOT)%LEG,PROFIDF(IPLOT)%UNITS,(/0,0,0/), & !PROFIDF(IPLOT)%IDFKIND,& MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX,1,.TRUE.))THEN CALL IGRAREA(XA1,YA1,XA2,YA2) CALL IGRUNITS(MPW%XMIN,MPW%YMIN,MPW%XMAX,MPW%YMAX) CALL IDFPLOT_FEATURES() ENDIF !## draw line of the profile... ! CALL IGRCOLOURN(WRGB(0,0,0)) DO J=2,NXY CALL IGRLINEWIDTH(LINEWIDTHPLOT) CALL IGRCOLOURN(LINECOLORPLOT) CALL IGRJOIN(XY(1,J-1),XY(2,J-1),XY(1,J),XY(2,J)) CALL PROFILE_PLOTVIEWBOX(XY(1,J-1),XY(2,J-1),XY(1,J),XY(2,J)) END DO CALL IGRLINEWIDTH(1) MPW%XMIN=XMIN_ORG MPW%YMIN=YMIN_ORG MPW%XMAX=XMAX_ORG MPW%YMAX=YMAX_ORG ENDDO END DO CALL UTL_MESSAGEHANDLE(1) END SUBROUTINE PROFILE_PLOT_2DIDF !###====================================================================== SUBROUTINE PROFILE_PLOT_NSCREEN() !###====================================================================== IMPLICIT NONE REAL,ALLOCATABLE,DIMENSION(:) :: XTMP INTEGER :: I,J IF(MXNIDF.EQ.0)THEN NSCREEN=1 RETURN ENDIF ALLOCATE(XTMP(MXNIDF)) XTMP=-1.0 DO I=1,MXNIDF CALL UTL_FILLARRAY(IPRF,7,PROFIDF(I)%PRFTYPE) !## activated IF(IPRF(1).EQ.1)THEN XTMP(I)=REAL(PROFIDF(I)%ISCREEN) ENDIF ENDDO CALL UTL_GETUNIQUE(XTMP,MXNIDF,NSCREEN,NODATA=-1.0) !## recompute igraphs DO I=1,MXNIDF DO J=1,NSCREEN IF(PROFIDF(I)%ISCREEN.EQ.INT(XTMP(J)))THEN PROFIDF(I)%ISCREEN=J EXIT ENDIF END DO ENDDO DEALLOCATE(XTMP) END SUBROUTINE PROFILE_PLOT_NSCREEN !###====================================================================== SUBROUTINE PROFILE_PLOT_LEGEND(IWINID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IWINID INTEGER :: I,J,IWD,IWS REAL :: X1,X2,Y1,Y2,XT,YT,CHH,DY,Y,OFFX,BOXX,DX,SX_RATIO,Z1,Z2 !## drawable settings !## screen setting !## ratio's IWD=WINFODRAWABLE(DRAWABLEWIDTH); IWS=WINFOSCREEN(SCREENWIDTH); SX_RATIO=REAL(IWS)/REAL(IWD) !## get current graph-dimensions X1 =INFOGRAPHICS(GRAPHICSUNITMINX) X2 =INFOGRAPHICS(GRAPHICSUNITMAXX) Y1 =INFOGRAPHICS(GRAPHICSUNITMINY) Y2 =INFOGRAPHICS(GRAPHICSUNITMAXY) CALL WGRTEXTFONT(AXES%TFONT,WIDTH=AXES%CHW,HEIGHT=AXES%CHH,ISTYLE=0) !## get current textsizes CHH=AXES%CHH DY =(Y2-Y1)*CHH !## define x-size DX=X2-X1 OFFX=(DX/250.0)*SX_RATIO BOXX=OFFX*4.0 CALL WGRTEXTORIENTATION(ALIGNLEFT,ANGLE=0.0) CALL IGRFILLPATTERN(SOLID) Y =YMAX+0.5*DY DO I=1,MXNIDF CALL UTL_FILLARRAY(IPRF,7,PROFIDF(I)%PRFTYPE) !## activated and plot legend switch on IF(IPRF(1).EQ.1.AND.IPRF(7).EQ.1.AND.PROFIDF(I)%ISCREEN.EQ.IWINID)THEN Z1=MINVAL(SERIE(I)%Y(1:SERIE(I)%N)); Z2=MAXVAL(SERIE(I)%Y(1:SERIE(I)%N)) IF(SERIE(I)%N.GT.0.AND. & (Z1.NE.PROFIDF(I)%IDF%NODATA.OR.Z2.NE.PROFIDF(I)%IDF%NODATA))THEN Y=Y-DY X1=XMIN+OFFX; Y1=Y-DY+0.1*DY X2=XMIN+OFFX+BOXX; Y2=Y-0.1*DY XT=XMIN+(2.0*OFFX)+BOXX; YT=Y-0.5*DY IF(IPRF(2).EQ.1)THEN CALL UTL_DRAWLEGENDBOX(X1,Y1,X2,Y2,PROFIDF(I)%SCOLOR,1,0,1) !## OUTLINE CALL IGRCOLOURN(WRGB(0,0,0)); CALL WGRTEXTSTRING(XT,YT,TRIM(PROFIDF(I)%ALIAS)) ELSEIF(IPRF(3).EQ.1)THEN CALL UTL_DRAWLEGENDBOX(X1,Y1,X2,Y2,PROFIDF(I)%SCOLOR,1,0,2) !## DOTS CALL IGRCOLOURN(WRGB(0,0,0)); CALL WGRTEXTSTRING(XT,YT,TRIM(PROFIDF(I)%ALIAS)) ELSEIF(IPRF(4).EQ.1)THEN CALL UTL_DRAWLEGENDBOX(X1,Y1,X2,Y2,PROFIDF(I)%SCOLOR,1,0,0) !## SOLID CALL IGRCOLOURN(WRGB(0,0,0)); CALL WGRTEXTSTRING(XT,YT,TRIM(PROFIDF(I)%ALIAS)) ELSEIF(IPRF(5).EQ.1)THEN CALL UTL_DRAWLEGENDBOX(X1,Y1,X2,Y2,PROFIDF(I)%SCOLOR,1,0,3,LEG=PROFIDF(I)%LEG,XT=XT) !## FILLEDIN Y=(Y1-(DY*0.1))+DY ELSEIF(PROFIDF(I)%IDF%ITB.EQ.1)THEN CALL UTL_DRAWLEGENDBOX(X1,Y1,X2,Y2,PROFIDF(I)%SCOLOR,1,0,3,LEG=PROFIDF(I)%LEG,XT=XT) !## FILLEDIN Y=(Y1-(DY*0.1))+DY ENDIF ENDIF ENDIF ENDDO CALL WDIALOGSELECT(ID_DSERIESPROPTAB5) DO I=1,NIPF CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,5,I,J) IF(J.EQ.0)CYCLE DO J=1,NLITHO Y=Y-DY X1=XMIN+OFFX; Y1=Y-DY+0.1*DY X2=XMIN+OFFX+BOXX; Y2=Y-0.1*DY XT=XMIN+(2.0*OFFX)+BOXX; YT=Y-0.5*DY CALL UTL_DRAWLEGENDBOX(X1,Y1,X2,Y2,BH(J)%LITHOCLR,1,0,0) !## SOLID CALL IGRCOLOURN(WRGB(0,0,0)); CALL WGRTEXTSTRING(XT,YT,TRIM(BH(J)%LITHOTXT)) ENDDO ENDDO END SUBROUTINE PROFILE_PLOT_LEGEND !###====================================================================== SUBROUTINE PROFILE_PLOT_KNICKPOINTS() !###====================================================================== IMPLICIT NONE INTEGER :: I,J REAL :: DX IF(NXY.EQ.0)RETURN CALL WDIALOGSELECT(ID_DSERIESPROPTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,J) !## plot 'knick'-points CALL IGRLINETYPE(SOLIDLINE); CALL IGRLINEWIDTH(1) CALL IGRCOLOURN(ICLRKNIKCP); CALL IGRLINETYPE(DASHED) DX=0.0 DO I=1,NXY IF(I.EQ.1)THEN DX=0.0 ELSE DX=DX+SQRT((XY(1,I)-XY(1,I-1))**2.0+(XY(2,I)-XY(2,I-1))**2.0) ENDIF IF(J.EQ.1.AND.TRIM(XYLABEL(I)).EQ.'')CYCLE CALL IGRJOIN(DX,YMIN,DX,YMAX) ENDDO CALL IGRLINETYPE(SOLIDLINE) END SUBROUTINE PROFILE_PLOT_KNICKPOINTS !###====================================================================== SUBROUTINE PROFILE_BITMAPIDF(IWINID) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IWINID INTEGER :: IIDF,I,J,ICLR LOGICAL :: LEX REAL :: RADX,D,X,Y,Z1,Z2 IF(MXNIDF.LE.0)RETURN CALL IGRLINETYPE(SOLIDLINE) CALL IGRFILLPATTERN(SOLID) CALL IGRLINEWIDTH(LINETHICKNESS) RADX=(XMAX-XMIN)/500.0 DO IIDF=1,MXNIDF CALL UTL_FILLARRAY(IPRF,7,PROFIDF(IIDF)%PRFTYPE) IF(IPRF(1).EQ.0.OR.IWINID.NE.PROFIDF(IIDF)%ISCREEN)CYCLE !## normal cross-section IF(PROFIDF(IIDF)%IDF%ITB.EQ.0)THEN !## overrule (temporary) profile-settings for colouring IPRF(5)=MAX(0,IPRF(5),IPRF(6)) !## correct whenever coloring is done for the first or last one IF(IIDF.EQ.1.OR.IIDF.EQ.MXNIDF)THEN IPRF(5)=0; IPRF(6)=0 ENDIF !## colouring IF(IPRF(5).EQ.1)THEN !## lines IF(IBLOCKFILLS.EQ.0)THEN J=0 DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF)%Y(I).EQ.PROFIDF(IIDF)%IDF%NODATA)J=0 IF(SERIE(IIDF)%Y(I).NE.PROFIDF(IIDF)%IDF%NODATA)THEN J=J+1 IF(J.GE.2)THEN Z1=0.5*(SERIE(IIDF-1)%Y(I-1)+SERIE(IIDF-1)%Y(I)) Z2=0.5*(SERIE(IIDF+1)%Y(I-1)+SERIE(IIDF+1)%Y(I)) X= 0.5*(SERIE(IIDF) %Y(I-1)+SERIE(IIDF)%Y(I)) Y=PROFILE_BITMAPIDF_CLR_Y(Z1,X,Z2,IPRF(6)) !## get colour of serie()%y() ICLR=UTL_IDFGETCLASS(PROFIDF(IIDF)%LEG,Y); CALL IGRCOLOURN(ICLR) CALL IGRPOLYGONCOMPLEX((/SERIE(IIDF-1)%X(I-1),SERIE(IIDF-1)%X(I),SERIE(IIDF+1)%X(I),SERIE(IIDF+1)%X(I-1)/), & (/SERIE(IIDF-1)%Y(I-1),SERIE(IIDF-1)%Y(I),SERIE(IIDF+1)%Y(I),SERIE(IIDF+1)%Y(I-1)/),4) ENDIF ENDIF ENDDO !## blockfills ELSE DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF-1)%Y(I).NE.PROFIDF(IIDF-1)%IDF%NODATA.AND. & SERIE(IIDF+1)%Y(I).NE.PROFIDF(IIDF+1)%IDF%NODATA)THEN Y=PROFILE_BITMAPIDF_CLR_Y(SERIE(IIDF-1)%Y(I),SERIE(IIDF)%Y(I),SERIE(IIDF+1)%Y(I),IPRF(6)) !## get colour of serie()%y() ICLR=UTL_IDFGETCLASS(PROFIDF(IIDF)%LEG,Y); CALL IGRCOLOURN(ICLR) !## start rectangle IF(I.EQ.1)THEN CALL IGRRECTANGLE( SERIE(IIDF-1)%X(I) ,SERIE(IIDF-1)%Y(I), & (SERIE(IIDF+1)%X(I)+SERIE(IIDF+1)%X(I+1))/2.0,SERIE(IIDF+1)%Y(I)) ELSEIF(I.EQ.SERIE(IIDF)%N)THEN CALL IGRRECTANGLE((SERIE(IIDF-1)%X(I)+SERIE(IIDF-1)%X(I-1))/2.0,SERIE(IIDF-1)%Y(I), & SERIE(IIDF+1)%X(I) ,SERIE(IIDF+1)%Y(I)) ELSE CALL IGRRECTANGLE((SERIE(IIDF-1)%X(I)+SERIE(IIDF-1)%X(I-1))/2.0,SERIE(IIDF-1)%Y(I), & (SERIE(IIDF+1)%X(I)+SERIE(IIDF+1)%X(I+1))/2.0,SERIE(IIDF+1)%Y(I)) ENDIF ENDIF ENDDO ENDIF ENDIF !## filled cross-section ELSEIF(PROFIDF(IIDF)%IDF%ITB.EQ.1)THEN !## obsolute DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF)%Y(I).NE.PROFIDF(IIDF)%IDF%NODATA)THEN ICLR=UTL_IDFGETCLASS(PROFIDF(IIDF)%LEG,SERIE(IIDF)%Y(I)) CALL IGRCOLOURN(ICLR) IF(I.EQ.1)THEN CALL IGRRECTANGLE( SERIE(IIDF)%X(I),PROFIDF(IIDF)%IDF%BOT, & (SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I+1))/2.0,PROFIDF(IIDF)%IDF%TOP) ELSEIF(I.EQ.SERIE(IIDF)%N)THEN CALL IGRRECTANGLE((SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I-1))/2.0,PROFIDF(IIDF)%IDF%BOT, & SERIE(IIDF)%X(I) ,PROFIDF(IIDF)%IDF%TOP) ELSE CALL IGRRECTANGLE((SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I-1))/2.0,PROFIDF(IIDF)%IDF%BOT, & (SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I+1))/2.0,PROFIDF(IIDF)%IDF%TOP) ENDIF ENDIF ENDDO ENDIF ENDDO DO IIDF=1,MXNIDF CALL UTL_FILLARRAY(IPRF,7,PROFIDF(IIDF)%PRFTYPE) IF(IPRF(1).EQ.0.OR.IWINID.NE.PROFIDF(IIDF)%ISCREEN)CYCLE !## normal cross-section IF(PROFIDF(IIDF)%IDF%ITB.NE.0)CYCLE CALL IGRCOLOURN(PROFIDF(IIDF)%SCOLOR) !## lines IF(IPRF(2).EQ.1)THEN !## lines from centre IF(IBLOCKLINES.EQ.0)THEN LEX=.TRUE. DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF)%Y(I).EQ.PROFIDF(IIDF)%IDF%NODATA)LEX=.TRUE. IF(SERIE(IIDF)%Y(I).NE.PROFIDF(IIDF)%IDF%NODATA)THEN IF(LEX)THEN CALL IGRMOVETO(SERIE(IIDF)%X(I),SERIE(IIDF)%Y(I)); LEX=.FALSE. ELSE CALL IGRLINETO(SERIE(IIDF)%X(I),SERIE(IIDF)%Y(I)) ENDIF ENDIF ENDDO !## blocklines ELSE LEX=.TRUE.; J=0 DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF)%Y(I).EQ.PROFIDF(IIDF)%IDF%NODATA)LEX=.TRUE. IF(SERIE(IIDF)%Y(I).NE.PROFIDF(IIDF)%IDF%NODATA)THEN J=J+1 IF(LEX)THEN CALL IGRMOVETO(SERIE(IIDF)%X(I),SERIE(IIDF)%Y(I)); LEX=.FALSE. ELSE CALL IGRLINETO((SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I-1))/2.0,SERIE(IIDF)%Y(I-1)) CALL IGRLINETO((SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I-1))/2.0,SERIE(IIDF)%Y(I)) ENDIF ELSE IF(J.GT.1)CALL IGRLINETO(SERIE(IIDF)%X(I-1),SERIE(IIDF)%Y(I-1)); J=0 ENDIF ENDDO ENDIF ENDIF !## dots IF(IPRF(3).EQ.1)THEN DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF)%Y(I).NE.PROFIDF(IIDF)%IDF%NODATA)CALL IGRCIRCLE(SERIE(IIDF)%X(I),SERIE(IIDF)%Y(I),RADX) ENDDO ENDIF !## fills IF(IPRF(4).EQ.1)THEN IF(IBLOCKFILLS.EQ.0)THEN J=0 DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF)%Y(I).EQ.PROFIDF(IIDF)%IDF%NODATA)J=0 IF(SERIE(IIDF)%Y(I).NE.PROFIDF(IIDF)%IDF%NODATA)THEN J=J+1 IF(J.GE.2)THEN CALL IGRPOLYGONCOMPLEX((/SERIE(IIDF)%X(I-1),SERIE(IIDF)%X(I),SERIE(IIDF)%X(I),SERIE(IIDF)%X(I-1)/), & (/SERIE(IIDF)%Y(I-1),SERIE(IIDF)%Y(I),YMIN ,YMIN/),4) ENDIF ENDIF ENDDO ELSE DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF)%Y(I).NE.PROFIDF(IIDF)%IDF%NODATA)THEN IF(I.EQ.1)THEN CALL IGRRECTANGLE( SERIE(IIDF)%X(I) ,YMIN, & (SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I+1))/2.0,SERIE(IIDF)%Y(I)) ELSEIF(I.EQ.SERIE(IIDF)%N)THEN CALL IGRRECTANGLE((SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I-1))/2.0,YMIN, & SERIE(IIDF)%X(I) ,SERIE(IIDF)%Y(I)) ELSE CALL IGRRECTANGLE((SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I-1))/2.0,YMIN, & (SERIE(IIDF)%X(I)+SERIE(IIDF)%X(I+1))/2.0,SERIE(IIDF)%Y(I)) ENDIF ENDIF ENDDO ENDIF ENDIF ENDDO CALL IGRLINEWIDTH(1) END SUBROUTINE PROFILE_BITMAPIDF !###====================================================================== REAL FUNCTION PROFILE_BITMAPIDF_CLR_Y(Z1,X,Z2,IP) !###====================================================================== IMPLICIT NONE REAL,INTENT(IN) :: Z1,Z2,X INTEGER,INTENT(IN) :: IP REAL :: D PROFILE_BITMAPIDF_CLR_Y=X IF(IP.EQ.1)THEN D=Z1-Z2 IF(D.LE.0.0)THEN; PROFILE_BITMAPIDF_CLR_Y=0.0; ELSE; PROFILE_BITMAPIDF_CLR_Y=X/D; ENDIF ENDIF END FUNCTION PROFILE_BITMAPIDF_CLR_Y !###====================================================================== SUBROUTINE PROFILE_BITMAPIFF() !###====================================================================== IMPLICIT NONE INTEGER :: I,J REAL :: ZMIN,ZMAX,DX,DXY REAL :: XMN,YMN,XMX,YMX REAL,DIMENSION(4,2) :: XYPOL IF(MXNIFF.LE.0)RETURN CALL IGRLINETYPE(SOLIDLINE) CALL IGRFILLPATTERN(SOLID) CALL IGRCOLOURN(WRGB(0,0,0)) ZMIN=YMIN ZMAX=YMAX !## lines DO I=1,MXNIFF IF(KU(I).GT.0)THEN IF(MP(KPLOT(I))%PRFTYPE.GT.0)THEN DX=0.0 DO J=1,NXY-1 CALL UTL_PROFILE_GETVIEWBOX(XY(1,J),XY(2,J),XY(1,J+1),XY(2,J+1),XSIGHT,XYPOL,XMN,YMN,XMX,YMX) !## compute offset IF(J.GT.1)THEN DXY=(XY(1,J-1)-XY(1,J))**2.0+(XY(2,J-1)-XY(2,J))**2.0 IF(DXY.GT.0.0)DX=DX+SQRT(DXY) ENDIF !## determine for each line-segment what to draw! REWIND(KU(I)) CALL IFFPLOT(KU(I),XMN,XMX,YMN,YMX,ZMIN,ZMAX,KPLOT(I),XY(:,J:J+1),DX) END DO ENDIF ENDIF ENDDO END SUBROUTINE PROFILE_BITMAPIFF !###====================================================================== SUBROUTINE PROFILE_BITMAPIPF() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,NB,IB,ITX,IIPF REAL :: DX,DXY,X1,X2,XMN,YMN,XMX,YMX,DXB,MXB,X0,DXX REAL,DIMENSION(:,:),ALLOCATABLE :: IDIPF REAL,PARAMETER :: MDX=2.0 REAL,DIMENSION(4,2) :: XYPOL IF(NIPF.LE.0)RETURN CALL IGRLINETYPE(SOLIDLINE); CALL IGRFILLPATTERN(SOLID); CALL IGRCOLOURN(WRGB(0,0,0)) DO IIPF=1,NIPF !## if plot associated files activated ... turn them on ALL! IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.1.AND.MP(MPLOT(IIPF))%UNITS.EQ.1)IPF(IIPF)%IP=INT(4,1)!1,1) ENDDO DO IIPF=1,NIPF; IPF(IIPF)%IPOS=INT(0,1); ENDDO DX=0.0 DO I=1,NXY-1 CALL UTL_PROFILE_GETVIEWBOX(XY(1,I),XY(2,I),XY(1,I+1),XY(2,I+1),XSIGHT,XYPOL,XMN,YMN,XMX,YMX) !## compute offset computed from the beginning of the line IF(I.GT.1)THEN DXY=(XY(1,I-1)-XY(1,I))**2.0+(XY(2,I-1)-XY(2,I))**2.0 IF(DXY.GT.0.0)DX=DX+SQRT(DXY) ENDIF !## determine for each line-segment what to draw! DO IIPF=1,NIPF IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.1)CALL IPFPLOT(IIPF,XMN,YMN,XMX,YMX,MPLOT(IIPF),XY(:,I:I+1),DX,.TRUE.) ENDDO END DO !## actualy plot associated files after determining the appropriate associated files DO IIPF=1,NIPF IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.1)THEN DX=(GRAPHUNITS(3,1)-GRAPHUNITS(1,1))/150.0 !## determine x-values to be sorted IF(NXY.GT.1)THEN ALLOCATE(IDIPF(IPF(IIPF)%NROW,3)); DO I=1,IPF(IIPF)%NROW; IDIPF(I,1)=REAL(I); IDIPF(I,2)=0.0; IDIPF(I,3)=0.0; ENDDO !## get x-values for cross-section DO I=1,IPF(IIPF)%NROW; IF(IPF(IIPF)%IPOS(I).EQ.INT(1,1))IDIPF(I,2)=IPF(IIPF)%XYPOS(1,I); ENDDO !## from small distances towards big distances CALL UTL_QKSORT2(IDIPF(:,2),IDIPF(:,1),IPF(IIPF)%NROW,IPF(IIPF)%NROW) !## find first borehole on cross-section DO I=1,IPF(IIPF)%NROW; IF(IDIPF(I,2).GT.0.0)EXIT; ENDDO; J=I !+1 !## make sure that location with zero distance will be distributed ITX=J; NB=0; DO I=J+1,IPF(IIPF)%NROW IF(IDIPF(I,2).EQ.IDIPF(I-1,2))THEN NB=NB+1 ELSE IF(NB.GT.0)THEN X1=IDIPF(ITX-1,2); X2=IDIPF(I,2) DXX=MIN(X2-IDIPF(ITX,2),IDIPF(ITX,2)-X1) DXX=MIN(2.0*DX,DXX) X1=IDIPF(ITX,2)-0.5*DXX DXX=DXX/REAL(NB+1) X1=X1+0.5*DXX DO IB=0,NB IDIPF(ITX+IB,2)=X1+REAL(IB)*DXX ENDDO ENDIF ITX=I; NB=0 ENDIF ENDDO !## initiate cell-width IDIPF(:,3)=DX !## start to include cell width, too close to the other, reduce size DO I=J,IPF(IIPF)%NROW DXX=DX IF(I.GT.J) DXX=MIN(DXX,2.0*(IDIPF(I,2)-(IDIPF(I-1,2)+0.5*IDIPF(I-1,3)))) IF(I.LT.IPF(IIPF)%NROW)DXX=MIN(DXX,IDIPF(I+1,2)-IDIPF(I,2)) IDIPF(I,3)=MIN(DX,DXX) ENDDO !## update x-position and width DO I=J,IPF(IIPF)%NROW !-1 IPF(IIPF)%XYPOS(1,INT(IDIPF(I,1)))=IDIPF(I,2) IPF(IIPF)%XYPOS(4,INT(IDIPF(I,1)))=IDIPF(I,3) ENDDO DEALLOCATE(IDIPF) ENDIF !## correct for similar x-coordinates, they overlap and should be shifted CALL IPFPLOT(IIPF,0.0,0.0,0.0,0.0,MPLOT(IIPF),(/1.0,1.0,1.0,1.0/),0.0,.FALSE.) ENDIF IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.1.AND.MP(MPLOT(IIPF))%UNITS.EQ.1)IPF(IIPF)%IP=INT(0,1) ENDDO END SUBROUTINE PROFILE_BITMAPIPF !###====================================================================== SUBROUTINE PROFILE_ZOOM(IDZ) !###====================================================================== IMPLICIT NONE REAL,PARAMETER :: FZIN =0.75 REAL,PARAMETER :: FZOUT=1.5 INTEGER,INTENT(IN) :: IDZ INTEGER :: JDOWN,IDCURSOR,I,IWINID,IDX,IDY,IIDX,IIDY REAL :: FZ,XC1,YC1,XC2,YC2,XC3,YC3,DX,DY,DXG,DYG REAL :: BMPX1,BMPX2,BMPY1,BMPY2 LOGICAL :: LEX CALL PROFILE_FIELDTOOLBAR(IDZ,0) IF(PBITMAP%IACT.EQ.1)THEN CALL PROFILE_EXTENT_GRAPH(1) CALL IGRUNITSFROMPIXELS(PBITMAP%IX1,PBITMAP%IY1,BMPX1,BMPY1,IORIGIN=1) CALL IGRUNITSFROMPIXELS(PBITMAP%IX2,PBITMAP%IY2,BMPX2,BMPY2,IORIGIN=1) ENDIF IF(IDZ.EQ.ID_ZOOMFULL)THEN CALL PROFILE_IDFMINMAX() ELSEIF(IDZ.EQ.ID_ZOOMIN)THEN FZ=FZIN ELSEIF(IDZ.EQ.ID_ZOOMOUT)THEN FZ=FZOUT ELSEIF(IDZ.EQ.ID_ZOOMWINDOW)THEN IDCURSOR=ID_CURSORZOOMRECTANGLE ELSEIF(IDZ.EQ.ID_MOVE)THEN IDCURSOR=ID_CURSORHAND DO IWINID=1,SIZE(IWINPROFILE) CALL WINDOWSELECT(IWINPROFILE(IWINID)) CALL WINDOWOUTSTATUSBAR(2,'Click your right-mouse button to leave this move-mode') ENDDO ENDIF XC2 =(XMAX+XMIN)/2.0 YC2 =(YMAX+YMIN)/2.0 DX = XMAX-XMIN DY = YMAX-YMIN JDOWN=0 IF(IDZ.EQ.ID_ZOOMIN.OR.IDZ.EQ.ID_ZOOMOUT)THEN XMAX=XC2+0.5*DX*FZ; XMIN=XC2-0.5*DX*FZ YMIN=YC2-0.5*DY*FZ; YMAX=YC2+0.5*DY*FZ ELSEIF(IDZ.EQ.ID_ZOOMWINDOW.OR.IDZ.EQ.ID_MOVE)THEN !## unfix axes CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGPUTCHECKBOX(IDF_CHECK1,0) CALL WDIALOGPUTCHECKBOX(IDF_CHECK2,0) IF(IDZ.EQ.ID_ZOOMWINDOW)THEN CALL IGRPLOTMODE(MODEXOR) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRFILLPATTERN(OUTLINE) CALL IGRLINETYPE(DASHED) ELSE NPIPET=0 ENDIF CALL WCURSORSHAPE(IDCURSOR) LEX=.FALSE. XC1= 0.0 YC1= 0.0 !## determine number of graphs visible CALL PROFILE_PLOT_NSCREEN() DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE(ITYPE) CASE(MOUSEMOVE) DO IWINID=1,SIZE(IWINPROFILE); IF(MESSAGE%WIN.EQ.IWINPROFILE(IWINID))EXIT; ENDDO IF(IWINID.LE.SIZE(IWINPROFILE))THEN !## make sure proper mouse-cursor is active IF(WINFOMOUSE(MOUSECURSOR).NE.IDCURSOR)CALL WCURSORSHAPE(IDCURSOR) CALL PROFILE_EXTENT_GRAPH(IWINID) CALL WINDOWOUTSTATUSBAR(1,'X:'//TRIM(RTOS(MESSAGE%GX,'F',2))//' m, Y:'//TRIM(RTOS(MESSAGE%GY,'F',2))) XC2=MESSAGE%GX YC2=MESSAGE%GY IF(IDZ.EQ.ID_MOVE)THEN IF(JDOWN.EQ.1)THEN DX =XC1-XC2 DY =YC1-YC2 XMAX=XMAX+DX XMIN=XMIN+DX YMAX=YMAX+DY YMIN=YMIN+DY CALL PROFILE_PLOT() IF(PBITMAP%IACT.EQ.1)THEN CALL IGRUNITSTOPIXELS(BMPX1,BMPY1,PBITMAP%IX1,PBITMAP%IY1,IORIGIN=1) CALL IGRUNITSTOPIXELS(BMPX2,BMPY2,PBITMAP%IX2,PBITMAP%IY2,IORIGIN=1) CALL PROFILE_PLOT() ENDIF ENDIF ELSEIF(IDZ.EQ.ID_ZOOMWINDOW)THEN IF(JDOWN.EQ.1)THEN IF(LEX)THEN DO I=1,SIZE(IWINPROFILE) CALL PROFILE_EXTENT_GRAPH(I) CALL IGRRECTANGLE(XC1,YC1,XC3,YC3) ENDDO ENDIF LEX=.FALSE. IF(XC1.NE.XC2.AND.YC1.NE.YC2)LEX=.TRUE. IF(LEX)THEN DO I=1,SIZE(IWINPROFILE) CALL PROFILE_EXTENT_GRAPH(I) CALL IGRRECTANGLE(XC1,YC1,XC2,YC2) ENDDO ENDIF CALL PROFILE_EXTENT_GRAPH(IWINID) ENDIF ENDIF XC3=XC2 YC3=YC2 ELSE CALL WCURSORSHAPE(CURHOURGLASS) ENDIF CASE (MOUSEBUTUP) IF(IDZ.EQ.ID_MOVE)THEN SELECT CASE (MESSAGE%VALUE1) CASE (1) CALL WCURSORSHAPE(ID_CURSORHAND) JDOWN=0 IF(MXNIFF.GT.0)KU=ABS(KU) NIPF=ABS(NIPF) CALL PROFILE_PLOT() END SELECT ENDIF CASE (MOUSEBUTDOWN) IF(IDZ.EQ.ID_MOVE)THEN SELECT CASE (MESSAGE%VALUE1) CASE (1) IF(JDOWN.EQ.0)THEN XC1=XC2 YC1=YC2 JDOWN=1 IDCURSOR=ID_CURSORHANDGREP CALL WCURSORSHAPE(IDCURSOR) IF(MXNIFF.GT.0)KU=-1*ABS(KU) NIPF=-1*ABS(NIPF) ENDIF CASE (3) EXIT END SELECT ELSEIF(IDZ.EQ.ID_ZOOMWINDOW)THEN SELECT CASE (MESSAGE%VALUE1) CASE (1) IF(JDOWN.EQ.0)THEN XC1=XC2 YC1=YC2 JDOWN=1 ELSE XMAX=MAX(XC1,MESSAGE%GX) XMIN=MIN(XC1,MESSAGE%GX) YMAX=MAX(YC1,MESSAGE%GY) YMIN=MIN(YC1,MESSAGE%GY) EXIT ENDIF CASE (3) IF(JDOWN.EQ.1.AND.LEX)THEN DO IWINID=1,SIZE(IWINPROFILE) CALL PROFILE_EXTENT_GRAPH(IWINID) CALL IGRRECTANGLE(XC1,YC1,XC3,YC3) ENDDO ENDIF JDOWN=-1 !broken zoom/move EXIT END SELECT ENDIF END SELECT ENDDO CALL WCURSORSHAPE(CURARROW) IF(IDZ.EQ.ID_ZOOMWINDOW)THEN CALL IGRPLOTMODE(MODECOPY) CALL IGRLINETYPE(SOLIDLINE) ELSEIF(IDZ.EQ.ID_MOVE)THEN IF(MXNIFF.GT.0)KU=ABS(KU) NIPF=ABS(NIPF) IF(ALLOCATED(IPIPET))NPIPET=SIZE(IPIPET) ENDIF ENDIF !## zoom level adjusted ... jdown=-1 aborted IF(JDOWN.NE.-1)CALL PROFILE_PLOT() !## replot to make sure adjusted coordinate affect bitmap IF(PBITMAP%IACT.EQ.1)THEN CALL PROFILE_EXTENT_GRAPH(1) CALL IGRUNITSTOPIXELS(BMPX1,BMPY1,PBITMAP%IX1,PBITMAP%IY1,IORIGIN=1) CALL IGRUNITSTOPIXELS(BMPX2,BMPY2,PBITMAP%IX2,PBITMAP%IY2,IORIGIN=1) CALL PROFILE_PLOT() ENDIF CALL PROFILE_FIELDTOOLBAR(IDZ,1) DO IWINID=1,SIZE(IWINPROFILE) CALL WINDOWSELECT(IWINPROFILE(IWINID)); CALL WINDOWOUTSTATUSBAR(2,'') ENDDO END SUBROUTINE PROFILE_ZOOM !###====================================================================== SUBROUTINE PROFILE_PROPMAIN() !###====================================================================== IMPLICIT NONE INTEGER :: IEXIT,IFIXX,IFIXY,IIPF,I,J REAL :: BMPX1,BMPX2,BMPY1,BMPY2 CALL PROFILE_CLEAR() CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IFIXX) CALL WDIALOGFIELDSTATE(IDF_LABEL4,IFIXX) CALL WDIALOGFIELDSTATE(IDF_LABEL6,IFIXX) CALL WDIALOGFIELDSTATE(IDF_REAL6,IFIXX) CALL WDIALOGFIELDSTATE(IDF_REAL7,IFIXX) CALL WDIALOGFIELDSTATE(IDF_REAL8,IFIXX) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IFIXY) CALL WDIALOGFIELDSTATE(IDF_LABEL5,IFIXY) CALL WDIALOGFIELDSTATE(IDF_LABEL7,IFIXY) CALL WDIALOGFIELDSTATE(IDF_REAL3,IFIXY) CALL WDIALOGFIELDSTATE(IDF_REAL4,IFIXY) CALL WDIALOGFIELDSTATE(IDF_REAL5,IFIXY) CALL PROFILE_COORDINATES(0) CALL UTL_HIDESHOWDIALOG(ID_DSERIES,0) CALL WDIALOGSELECT(ID_DSERIESPROP) CALL WDIALOGSHOW(-1,-1,0,3) DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (FIELDCHANGED) CALL PROFILE_PROP_FIELDCHANGED() CASE(PUSHBUTTON) CALL PROFILE_PROP_PUSHBUTTON(IEXIT) IF(IEXIT.EQ.1)EXIT CASE(EXPOSE) CALL PROFILE_EXPOSE() END SELECT ENDDO !## copy info to mp() variable CALL PROFILE_COPYINFO() CALL WDIALOGSELECT(ID_DSERIESPROP) CALL WDIALOGHIDE() CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGFIELDSTATE(ID_SNAPPEN,0) CALL WDIALOGFIELDSTATE(ID_INFO,0) DO IIPF=1,NIPF CALL WDIALOGFIELDSTATE(ID_SNAPPEN,1) IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.1)THEN CALL WDIALOGFIELDSTATE(ID_INFO,1) ENDIF ENDDO CALL UTL_HIDESHOWDIALOG(ID_DSERIES,2) IF(PBITMAP%IACT.EQ.1)THEN CALL PROFILE_EXTENT_GRAPH(1) CALL IGRUNITSFROMPIXELS(PBITMAP%IX1,PBITMAP%IY1,BMPX1,BMPY1,IORIGIN=1) CALL IGRUNITSFROMPIXELS(PBITMAP%IX2,PBITMAP%IY2,BMPX2,BMPY2,IORIGIN=1) ENDIF CALL PROFILE_COMPUTEPLOT() !## recompute min/max only in case of axes fixation CALL PROFILE_IDFMINMAX() CALL PROFILE_CLEAR() !## het number of screens CALL PROFILE_PLOT_NSCREEN() !## recreate windows --- if necessary (number of windows different than before) IF(NSCREEN.NE.SIZE(IWINPROFILE))CALL PROFILE_CREATEWINDOWS() !## redraw cross-section CALL PROFILE_PLOT() !## replot to make sure adjusted coordinate affect bitmap IF(PBITMAP%IACT.EQ.1)THEN CALL PROFILE_EXTENT_GRAPH(1) CALL IGRUNITSTOPIXELS(BMPX1,BMPY1,PBITMAP%IX1,PBITMAP%IY1,IORIGIN=1) CALL IGRUNITSTOPIXELS(BMPX2,BMPY2,PBITMAP%IX2,PBITMAP%IY2,IORIGIN=1) CALL PROFILE_PLOT() ENDIF !## adjust menu-fields CALL PROFILE_FIELDTOOLBAR(0,1) END SUBROUTINE PROFILE_PROPMAIN !###====================================================================== SUBROUTINE PROFILE_PROPINIT() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,K INTEGER,ALLOCATABLE,DIMENSION(:) :: ILIST INTEGER :: IIPF !## idf's CALL WDIALOGSELECT(ID_DSERIESPROPTAB1) CALL WDIALOGCLEARFIELD(IDF_GRID1) !# insert one extra IF(MXNIDF.GT.0)CALL WGRIDROWS(IDF_GRID1,MXNIDF+1) CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1,1,1) !## active CALL WGRIDPUTCELLINTEGER(IDF_GRID1,2,1,1) CALL WGRIDPUTCELLSTRING(IDF_GRID1,3,1,'Adjust All') CALL WGRIDPUTCELLSTRING(IDF_GRID1,11,1,'All') CALL WDIALOGPUTINTEGER(IDF_INTEGER2,LINETHICKNESS) !## linethickness of idf files !## adjust igraph/iscreen to be sure they are sequentially: 1,2,3, etc. CALL PROFILE_PLOT_NSCREEN() IF(ISOLID.EQ.1)CALL WGRIDSTATECELL(IDF_GRID1,2,1,0) DO I=1,MXNIDF !## iscreen number CALL WGRIDPUTCELLINTEGER(IDF_GRID1,2,I+1,PROFIDF(I)%ISCREEN) !## if solid tool used ... grey out screen option IF(ISOLID.EQ.1)CALL WGRIDSTATECELL(IDF_GRID1,2,I+1,0) CALL WGRIDPUTCELLSTRING( IDF_GRID1,3,I+1,PROFIDF(I)%ALIAS) CALL WGRIDPUTCELLINTEGER(IDF_GRID1,4,I+1,PROFIDF(I)%SCOLOR) CALL WGRIDCOLOURCELL( IDF_GRID1,4,I+1,PROFIDF(I)%SCOLOR,PROFIDF(I)%SCOLOR) CALL UTL_FILLARRAY(IPRF,7,PROFIDF(I)%PRFTYPE) IF(IPRF(1).EQ.0)THEN; CALL UTL_FILLARRAY(IPRF,6,PROFIDF(I)%PRFTYPE); IPRF(7)=1; ENDIF !## caused by moving the files inside IF(I.EQ.1) IPRF(5)=0 IF(I.EQ.MXNIDF)IPRF(5)=0 !## rewrite array since it will be used later on too! CALL UTL_READARRAY(IPRF,7,PROFIDF(I)%PRFTYPE) CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1 ,I+1,IPRF(1)) !## active CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,5 ,I+1,IPRF(2)) !## lines CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,6 ,I+1,IPRF(3)) !## points CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,7 ,I+1,IPRF(4)) !## filles CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,8 ,I+1,IPRF(5)) !## colouring CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,9 ,I+1,IPRF(6)) !## 1/thicknesses CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,10,I+1,IPRF(7)) !## legend J=INDEXNOCASE(PROFIDF(I)%IDF%FNAME,'\',.TRUE.)+1 CALL WGRIDPUTCELLSTRING(IDF_GRID1,11,I+1,PROFIDF(I)%IDF%FNAME(J:)) END DO !## fill stated on dialog DO I=1,MXNIDF; CALL PROFILE_PROP_STATES(I); END DO CALL WDIALOGSELECT(ID_DSERIESPROPTAB1) MXSAMPLING=200; CALL WDIALOGPUTINTEGER(IDF_INTEGER1,MXSAMPLING) !## iff's CALL WDIALOGSELECT(ID_DSERIESPROPTAB4) CALL WDIALOGCLEARFIELD(IDF_GRID1) IF(MXNIFF.GT.0)CALL WGRIDROWS(IDF_GRID1,MXNIFF) DO I=1,MXNIFF !## inactive IF(MP(KPLOT(I))%PRFTYPE.EQ.0)THEN CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1,I,0) ELSE CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1,I,1) ENDIF !## colouring IF(MP(KPLOT(I))%SCOLOR.EQ.0)THEN CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,2,I,0) ELSE CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,2,I,1) ENDIF J=INDEXNOCASE(MP(KPLOT(I))%IDFNAME,'\',.TRUE.)+1 CALL WGRIDPUTCELLSTRING(IDF_GRID1,4,I,MP(KPLOT(I))%IDFNAME(J:)) END DO IF(MXNIFF.GT.0)THEN IF(ALLOCATED(ILIST))DEALLOCATE(ILIST) ALLOCATE(ILIST(MXNIFF)) ILIST=1 DO I=1,MXNIFF IF(MP(KPLOT(I))%SCOLOR.GT.0.AND.MP(KPLOT(I))%SCOLOR.LE.5)ILIST(I)=MP(KPLOT(I))%SCOLOR END DO ! 12345678 CALL WGRIDPUTMENU(IDF_GRID1,3,(/'IPART ','ILAY ','X-COORD.','Y-COORD.','Z-COORD.','TIME ','VELOCITY'/),7,ILIST,MXNIFF) DEALLOCATE(ILIST) ENDIF !## ipf's CALL WDIALOGSELECT(ID_DSERIESPROPTAB5) CALL WDIALOGCLEARFIELD(IDF_GRID1) IF(NIPF.GT.0)THEN CALL WGRIDROWS(IDF_GRID1,NIPF) DO IIPF=1,NIPF !## inactive IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.0)THEN CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1,IIPF,0) ELSE CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1,IIPF,1) ENDIF !## overrule ... make default active! CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,3,IIPF,MP(MPLOT(IIPF))%UNITS) J=INDEXNOCASE(MP(MPLOT(IIPF))%IDFNAME,'\',.TRUE.)+1 !## ipf-name CALL WGRIDPUTCELLSTRING(IDF_GRID1,4,IIPF,MP(MPLOT(IIPF))%IDFNAME(J:)) I=IPF(IIPF)%ZCOL CALL WGRIDPUTCELLSTRING(IDF_GRID1,2,IIPF,TRIM(IPF(IIPF)%ATTRIB(I))) CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,5,IIPF,1) IPF(IIPF)%PCOL=MIN(IPF(IIPF)%NCOL,MAX(1,IPF(IIPF)%ACOL)) END DO CALL WDIALOGPUTMENU(IDF_MENU1,MP(MPLOT)%IDFNAME(J:),NIPF,1) CALL WDIALOGPUTMENU(IDF_MENU2,IPF(1)%ATTRIB,IPF(1)%NCOL,1) ENDIF !## sight depth CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) J=0 K=0 DO I=1,MXNIFF J=MAX(J,MP(KPLOT(I))%IDFI) K=MAX(K,MP(KPLOT(I))%FADEOUT) END DO DO IIPF=1,NIPF J=MAX(J,MP(MPLOT(IIPF))%IDFI) K=MAX(K,MP(MPLOT(IIPF))%FADEOUT) END DO XSIGHT=REAL(J) IFADE =K CALL WDIALOGPUTREAL(IDF_REAL2,XSIGHT) CALL WDIALOGPUTCHECKBOX(IDF_CHECK3,IFADE) END SUBROUTINE PROFILE_PROPINIT !###====================================================================== SUBROUTINE PROFILE_PROP_FIELDCHANGED() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,K,ITAB,IROW,ICOL,IRGB,IFIX,ICONFIG,ICLR LOGICAL :: LEX CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE (MESSAGE%VALUE2) CASE (IDF_MENU2) CALL WDIALOGGETMENU(IDF_MENU1,J) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,I) CALL WDIALOGFIELDSTATE(IDF_MENU2,I) IF(I.EQ.1)THEN CALL WDIALOGGETMENU(IDF_MENU2,IPF(J)%PCOL) ELSE IPF(J)%PCOL=0 ENDIF CASE (IDF_MENU4) CALL WDIALOGGETMENU(IDF_MENU4,ICONFIG) CALL WDIALOGPUTSTRING(IDF_STRING1,PROFILE_CONFIGTXT(ICONFIG)) SELECT CASE (ICONFIG) !## interfaces CASE(1) J=0; DO I=1,MXNIDF J=J+1; IF(J.GT.MAXCOLOUR)J=1; ICLR=ICOLOR(J) CALL WGRIDPUTCELLINTEGER( IDF_GRID1,4,I+1,ICLR) !## colour CALL WGRIDCOLOURCELL( IDF_GRID1,4,I+1,ICLR,ICLR) CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1,I+1,1) !## iact CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,5,I+1,1) !## lines CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,6,I+1,0) !## points CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,7,I+1,0) !## filled in CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,8,I+1,0) !## clr CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,9,I+1,0) !## 1/t CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,10,I+1,1) !## legend ENDDO !## quasi 3d model (aquitard[2]/aquifer[3]/all[4]) CASE(2,3,4) J=0 DO I=1,MXNIDF LEX=.FALSE. IF(ICONFIG.EQ.2)THEN IF(MOD(I,2).EQ.0)LEX=.TRUE. ICLR=WRGB(255,255,175) ELSEIF(ICONFIG.EQ.3)THEN IF(MOD(I,2).NE.0)LEX=.TRUE. ICLR=WRGB(200,200,200) ELSEIF(ICONFIG.EQ.4)THEN LEX=.TRUE. ENDIF IF(LEX)THEN; J=J+1; IF(J.GT.MAXCOLOUR)J=1; ICLR=ICOLOR(J); ENDIF IF(I.EQ.MXNIDF)ICLR=WRGB(195,195,195) CALL WGRIDPUTCELLINTEGER( IDF_GRID1,4 ,I+1,ICLR) !## colour CALL WGRIDCOLOURCELL( IDF_GRID1,4 ,I+1,ICLR,ICLR) CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1 ,I+1,1) !## iact CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,5 ,I+1,0) !## lines CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,6 ,I+1,0) !## points CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,7 ,I+1,1) !## filled in CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,8 ,I+1,0) !## clr CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,9 ,I+1,0) !## 1/t IF(LEX)THEN CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,10,I+1,1) !## legend ELSE CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,10,I+1,0) !## legend ENDIF ENDDO !## quasi 3d model coloured (aquitard[5]/aquifer[6]/all[7]) CASE(5,6,7) DO I=1,MXNIDF K=0 ICLR=WRGB(130,130,130) LEX=.FALSE. IF(ICONFIG.EQ.5)THEN IF(I.EQ.1.OR.I.EQ.MXNIDF)K=1 IF(MOD(I,3).EQ.0)LEX=.TRUE. ICLR=WRGB(255,255,255) ELSEIF(ICONFIG.EQ.6)THEN IF(MOD(I+1,3).EQ.0)LEX=.TRUE. ICLR=WRGB(255,255,255) ELSEIF(ICONFIG.EQ.7)THEN IF(MOD(I,2).EQ.0)LEX=.TRUE. ICLR=WRGB(255,255,255) ENDIF CALL WGRIDPUTCELLINTEGER( IDF_GRID1,4,I+1,ICLR) !## colour CALL WGRIDCOLOURCELL( IDF_GRID1,4,I+1,ICLR,ICLR) CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1,I+1,1) !## iact CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,6,I+1,0) !## points CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,7,I+1,0) !## filled in CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,9,I+1,0) !## 1/t J=0; IF(LEX)J=1 CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,5,I+1,K) !## lines CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,8,I+1,J) !## clr CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,10,I+1,J) !## legend ENDDO END SELECT CASE (IDF_CHECK1) IF(MESSAGE%WIN.EQ.ID_DSERIESPROPTAB3)THEN CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IFIX) CALL WDIALOGFIELDSTATE(IDF_LABEL4,IFIX) CALL WDIALOGFIELDSTATE(IDF_LABEL6,IFIX) CALL WDIALOGFIELDSTATE(IDF_REAL6,IFIX) CALL WDIALOGFIELDSTATE(IDF_REAL7,IFIX) CALL WDIALOGFIELDSTATE(IDF_REAL8,IFIX) ELSEIF(MESSAGE%WIN.EQ.ID_DSERIESPROPTAB5)THEN CALL WDIALOGGETMENU(IDF_MENU1,J) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,I) CALL WDIALOGFIELDSTATE(IDF_MENU2,I) IF(I.EQ.1)THEN CALL WDIALOGGETMENU(IDF_MENU2,IPF(J)%PCOL) ELSE IPF(J)%PCOL=0 ENDIF ENDIF CASE (IDF_CHECK2) IF(MESSAGE%WIN.EQ.ID_DSERIESPROPTAB3)THEN CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IFIX) CALL WDIALOGFIELDSTATE(IDF_LABEL5,IFIX) CALL WDIALOGFIELDSTATE(IDF_LABEL7,IFIX) CALL WDIALOGFIELDSTATE(IDF_REAL3,IFIX) CALL WDIALOGFIELDSTATE(IDF_REAL4,IFIX) CALL WDIALOGFIELDSTATE(IDF_REAL5,IFIX) ENDIF CASE (IDF_CHECK3) CASE (IDF_GRID1) CALL WDIALOGSELECT(ID_DSERIESPROP) CALL WDIALOGGETTAB(ID_DSERIESPROPTAB,ITAB) IF(ITAB.EQ.ID_DSERIESPROPTAB1)THEN CALL WDIALOGSELECT(ID_DSERIESPROPTAB1) CALL WGRIDPOS(MESSAGE%Y,ICOL,IROW) IF(ICOL.EQ.4.AND.MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)THEN CALL WGRIDGETCELLINTEGER(IDF_GRID1,ICOL,IROW,IRGB) CALL WSELECTCOLOUR(IRGB) IF(WINFODIALOG(4).EQ.1)THEN CALL WGRIDPUTCELLINTEGER(IDF_GRID1,ICOL,IROW,IRGB) CALL WGRIDCOLOURCELL(IDF_GRID1,ICOL,IROW,IRGB,IRGB) !## force another cell after colourselection CALL WGRIDSETCELL(IDF_GRID1,ICOL-1,IROW) ENDIF ELSEIF(ICOL.EQ.8.AND.MESSAGE%VALUE1.EQ.MESSAGE%VALUE2)THEN CALL PROFILE_PROP_STATES(IROW) ENDIF IF(IROW.EQ.1)THEN SELECT CASE(ICOL) CASE (2) !## igraph number/screen number CALL WGRIDGETCELLINTEGER(IDF_GRID1,ICOL,1,J) DO I=1,MXNIDF; CALL WGRIDPUTCELLINTEGER(IDF_GRID1,ICOL,I+1,J); ENDDO CASE (3) !## alias CASE (4) !## colour CALL WGRIDGETCELLINTEGER(IDF_GRID1,4,1,J) DO I=1,MXNIDF; CALL WGRIDPUTCELLINTEGER(IDF_GRID1,4,I+1,J); ENDDO DO I=1,MXNIDF; CALL WGRIDCOLOURCELL(IDF_GRID1,4,I+1,J,J) ; ENDDO CASE (1,5,6,7,8,9,10) !## active,lines,points,filled,colouring,1/thickness/legend CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,ICOL,1,J) DO I=1,MXNIDF; CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,ICOL,I+1,J); ENDDO END SELECT ENDIF ELSEIF(ITAB.EQ.ID_DSERIESPROPTAB5)THEN ELSEIF(ITAB.EQ.ID_DSERIESPROPTAB6)THEN CALL WDIALOGSELECT(ID_DSERIESPROPTAB6) CALL WGRIDPOS(MESSAGE%Y,ICOL,IROW) IF(ICOL.EQ.2)THEN IRGB=BH(IROW)%LITHOCLR CALL WSELECTCOLOUR(IRGB) IF(WINFODIALOG(4).EQ.1)THEN CALL WGRIDPUTCELLINTEGER(IDF_GRID1,2,IROW,IRGB) CALL IPFGETVALUE_GETCOLOURS(ID_DSERIESPROPTAB6) CALL IPFGETVALUE_PLOTCOLOURS(ID_DSERIESPROPTAB6) !## force another cell after colourselection CALL WGRIDSETCELL(IDF_GRID1,1,IROW) ENDIF ENDIF ENDIF END SELECT END SUBROUTINE PROFILE_PROP_FIELDCHANGED !###====================================================================== FUNCTION PROFILE_CONFIGTXT(ICONFIG) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ICONFIG CHARACTER(LEN=256) :: PROFILE_CONFIGTXT PROFILE_CONFIGTXT='Configuration:' !## configuration SELECT CASE (ICONFIG) !## Interfaces CASE (1) PROFILE_CONFIGTXT=TRIM(PROFILE_CONFIGTXT)//NEWLINE//'Line representation for all entries.' !## Quasi 3D Model (single aquitard colours, aquifer yellow) CASE (2) PROFILE_CONFIGTXT=TRIM(PROFILE_CONFIGTXT)//NEWLINE//'Surface Level represented as a line;'//NEWLINE// & 'Filled in appearances for interfaces 2-3,4-5,...;'//NEWLINE// & 'Filled in appearance for the Hydrological base.' !## Quasi 3D Model (single aquifer colours, aquitard brown) CASE (3) PROFILE_CONFIGTXT=TRIM(PROFILE_CONFIGTXT)//NEWLINE//'Filled in appearances for interfaces 1-2,3-4,5-6,... .' !## 3D Model (all single coloured) CASE (4) PROFILE_CONFIGTXT=TRIM(PROFILE_CONFIGTXT)//NEWLINE//'Filled in appearances for interfaces 1-2,2-3,3-4,... .' !## Coloured Quasi 3D Model (aquitard by file) CASE (5) PROFILE_CONFIGTXT=TRIM(PROFILE_CONFIGTXT)//NEWLINE//'Surface Level represented as a line;'//NEWLINE// & 'Filled in appearances for interfaces 2-4,5-7,8-10,...; coloured for given parameters in 3,6,9,...;'//NEWLINE// & 'Filled in representation for the hydrological base.' !## Coloured Quasi 3D Model (aquifer by file) CASE (6) PROFILE_CONFIGTXT=TRIM(PROFILE_CONFIGTXT)//NEWLINE//'Surface Level represented as a line;'//NEWLINE// & 'Filled in appearances for interfaces 1-3,4-6,7-9,...; coloured for given parameters in 2,5,8,...;'//NEWLINE// & 'Filled in representation for the hydrological base.' !## Coloured 3D Model (all coloured by file) CASE (7) PROFILE_CONFIGTXT=TRIM(PROFILE_CONFIGTXT)//NEWLINE//'Filled in appearances for all adjacent interfaces 1-3,5-7,9-11,...; coloured for given parameters in 2,4,6,8,10,... .' END SELECT END FUNCTION PROFILE_CONFIGTXT !###====================================================================== SUBROUTINE PROFILE_PROP_STATES(IROW) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IROW INTEGER :: IP1,IP2,I,J,ICOL RETURN IF(IROW.LE.1.OR.IROW.GE.MXNIDF)RETURN IP1=0 IP2=0 IF(IROW.GT.2) CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,8,IROW-2,IP1) IF(IROW.LT.MXNIDF-1)CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,8,IROW+2,IP2) CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,8,IROW-1,I) CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,8,IROW+1,J) IF(PROFIDF(IROW-1)%ISCREEN.NE.PROFIDF(IROW)%ISCREEN)I=1 IF(PROFIDF(IROW+1)%ISCREEN.NE.PROFIDF(IROW)%ISCREEN)J=1 !## neighbour activated already or from different graph IF(I.EQ.1.OR.J.EQ.1)THEN CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,8,IROW,0) ELSE CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,8,IROW,I) I=I+1 DO J=IROW-1,IROW+1 IF((J.EQ.IROW-1.AND.IP1.EQ.0).OR.(J.EQ.IROW+1.AND.IP2.EQ.0).OR.J.EQ.IROW)THEN DO ICOL=1,8 IF(ICOL.EQ.2.AND.ISOLID.EQ.1)THEN ELSE IF(J.EQ.IROW)THEN IF(ICOL.NE.4)CALL WGRIDSTATECELL(IDF_GRID1,ICOL,J,I) ELSE IF(ICOL.LE.3.OR.ICOL.EQ.8)CALL WGRIDSTATECELL(IDF_GRID1,ICOL,J,I) ENDIF ENDIF ENDDO CALL WGRIDPUTCELLCHECKBOX(IDF_GRID1,1,J,1) ENDIF ENDDO IF(I.EQ.2)THEN CALL WGRIDSTATECELL(IDF_GRID1,8,IROW,1) IF(ISOLID.EQ.0)CALL WGRIDSTATECELL(IDF_GRID1,2,IROW,1) ENDIF CALL WGRIDSTATECELL(IDF_GRID1,8,1,2) CALL WGRIDSTATECELL(IDF_GRID1,8,MXNIDF,2) ENDIF END SUBROUTINE PROFILE_PROP_STATES !###====================================================================== SUBROUTINE PROFILE_PROP_PUSHBUTTON(IEXIT) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(OUT) :: IEXIT INTEGER :: IU,IOS,I,J,IACT,IFIXX,IFIXY,IPN,IFL,ILN,ICL,IIPF,I1T,ILG,ICLR REAL :: XINT,YINT CHARACTER(LEN=256) :: FNAME,LINE CHARACTER(LEN=52) :: CLABEL INTEGER,ALLOCATABLE,DIMENSION(:) :: ILIST REAL :: XC,YC IEXIT=0 CALL WDIALOGSELECT(MESSAGE%WIN) SELECT CASE (MESSAGE%WIN) !## colours CASE (ID_DSERIESPROPTAB6) SELECT CASE (MESSAGE%VALUE1) CASE (ID_OPEN,ID_SAVEAS) CALL IPFGETVALUE_OPENSAVECOLOURS('',MESSAGE%VALUE1,ID_DSERIESPROPTAB6) END SELECT CASE (ID_DSERIESPROPTAB1) SELECT CASE (MESSAGE%VALUE1) END SELECT CASE (ID_DSERIESPROPTAB2) SELECT CASE (MESSAGE%VALUE1) CASE(ID_OPEN,ID_SAVE) IU=UTL_GETUNIT() IF(MESSAGE%VALUE1.EQ.ID_SAVE)THEN FNAME=TRIM(PREFVAL(1))//'\shapes\*.gen' IF(UTL_WSELECTFILE('iMOD Map File *.gen|*.gen|',SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,& FNAME,'Select Coordinate File'))THEN CALL PROFILE_COORDINATES(1) CALL OSD_OPEN(IU,FILE=FNAME,STATUS='UNKNOWN',FORM='FORMATTED') WRITE(IU,'(A)') '1' DO I=1,NXY LINE=TRIM(RTOS(XY(1,I),'F',2))//','//TRIM(RTOS(XY(2,I),'F',2)) IF(TRIM(XYLABEL(I)).NE.'')LINE=TRIM(LINE)//','//TRIM(XYLABEL(I)) WRITE(IU,'(A)') TRIM(LINE) END DO WRITE(IU,'(A)') 'END'; WRITE(IU,'(A)') 'END'; CLOSE(IU) ENDIF ELSEIF(MESSAGE%VALUE1.EQ.ID_OPEN)THEN FNAME=TRIM(PREFVAL(1))//'\shapes\*.gen' IF(UTL_WSELECTFILE('iMOD Map File *.gen|*.gen|',LOADDIALOG+PROMPTON+DIRCHANGE+APPENDEXT+MUSTEXIST,& FNAME,'Select Coordinate File'))THEN XPOS=0.0 CALL OSD_OPEN(IU,FILE=FNAME,STATUS='OLD',FORM='FORMATTED',ACTION='READ,DENYWRITE') READ(IU,*) NXY=0 DO READ(IU,'(A256)',IOSTAT=IOS) LINE; IF(IOS.NE.0)EXIT READ(LINE,*,IOSTAT=IOS) XC,YC,CLABEL IF(IOS.NE.0)THEN CLABEL=''; READ(LINE,*,IOSTAT=IOS) XC,YC; IF(IOS.NE.0)EXIT ENDIF NXY=NXY+1; CALL PROFILE_WTIADDPOINT_MEMORY(NXY); XY(1,NXY)=XC; XY(2,NXY)=YC; XYLABEL(NXY)=CLABEL END DO CLOSE(IU) ENDIF CALL PROFILE_COORDINATES(0) CALL PROFILE_LEGENDUPDATE() ENDIF END SELECT !## ipf dialog CASE (ID_DSERIESPROPTAB5) SELECT CASE (MESSAGE%VALUE1) CASE(ID_ADJUST) CALL WDIALOGGETMENU(IDF_MENU1,IIPF) CALL IMOD3D_LABELS(IIPF,MPLOT(IIPF)) END SELECT CASE (ID_DSERIESPROP) SELECT CASE (MESSAGE%VALUE1) CASE(IDCANCEL) IEXIT=1 CASE(IDOK) XPOS=0.0 CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGGETREAL(IDF_REAL2,XSIGHT) CALL WDIALOGGETCHECKBOX(IDF_CHECK3,IFADE) !## fadeout !## get updates for IDF CALL WDIALOGSELECT(ID_DSERIESPROPTAB1) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IBLOCKLINES) !## blocklines CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IBLOCKFILLS) !## blockfilles CALL WDIALOGGETINTEGER(IDF_INTEGER2,LINETHICKNESS) !## linethickness of idf files DO I=1,MXNIDF CALL WGRIDGETCELLINTEGER(IDF_GRID1,2,I+1,PROFIDF(I)%ISCREEN) CALL WGRIDGETCELLINTEGER(IDF_GRID1,4,I+1,PROFIDF(I)%SCOLOR) CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,1 ,I+1,IACT) CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,5 ,I+1,ILN) !## lines CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,6 ,I+1,IPN) !## points CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,7 ,I+1,IFL) !## filled in CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,8 ,I+1,ICL) !## clr CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,9 ,I+1,I1T) !## 1/t CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,10,I+1,ILG) !## legend !## cannot be used for last idf IF(I.EQ.MXNIDF)THEN; ICL=0; I1T=0; ENDIF CALL UTL_READARRAY((/IACT,ILN,IPN,IFL,ICL,I1T,ILG/),7,PROFIDF(I)%PRFTYPE) CALL WGRIDGETCELLSTRING(IDF_GRID1,3,I+1,PROFIDF(I)%ALIAS) ENDDO !## clean igraphs CALL PROFILE_PLOT_NSCREEN() CALL WDIALOGSELECT(ID_DSERIESPROPTAB1) CALL WDIALOGGETINTEGER(IDF_INTEGER1,MXSAMPLING) !## get updates for IFF CALL WDIALOGSELECT(ID_DSERIESPROPTAB4) IF(MXNIFF.GT.0)THEN IF(ALLOCATED(ILIST))DEALLOCATE(ILIST) ALLOCATE(ILIST(MXNIFF)) I=MXNIFF CALL WGRIDGETMENU(IDF_GRID1,3,ILIST,I) DO I=1,MXNIFF CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,1,I,MP(KPLOT(I))%PRFTYPE) CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,2,I,MP(KPLOT(I))%SCOLOR) IF(MP(KPLOT(I))%SCOLOR.EQ.1)MP(KPLOT(I))%SCOLOR=ILIST(I) MP(KPLOT(I))%IDFI=INT(XSIGHT) MP(KPLOT(I))%FADEOUT=IFADE !## fadeout ENDDO IF(ALLOCATED(ILIST))DEALLOCATE(ILIST) ENDIF !## get updates for IPF CALL WDIALOGSELECT(ID_DSERIESPROPTAB5) DO IIPF=1,NIPF CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,1,IIPF,MP(MPLOT(IIPF))%PRFTYPE) !## yes/no CALL WGRIDGETCELLCHECKBOX(IDF_GRID1,3,IIPF,MP(MPLOT(IIPF))%UNITS) !## yes/no MP(MPLOT(IIPF))%IDFI =INT(XSIGHT) !## sight depth MP(MPLOT(IIPF))%FADEOUT=IFADE !## fadeout ENDDO !## get updates coordinates CALL PROFILE_COORDINATES(1) CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IFIXX) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IFIXY) IEXIT=1 IF(IFIXX.EQ.1)THEN CALL WDIALOGGETREAL(IDF_REAL7,XMIN) CALL WDIALOGGETREAL(IDF_REAL8,XMAX) CALL WDIALOGGETREAL(IDF_REAL6,XINT) IF(XMAX.LE.XMIN.OR.XINT.LE.0.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'X-axes not filled in correcly','Error') IEXIT=0 ENDIF ENDIF IF(IFIXY.EQ.1)THEN CALL WDIALOGGETREAL(IDF_REAL3,YMIN) CALL WDIALOGGETREAL(IDF_REAL4,YMAX) CALL WDIALOGGETREAL(IDF_REAL5,YINT) IF(YMAX.LE.YMIN.OR.YINT.LE.0.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Y-axes not filled in correcly','Error') IEXIT=0 ENDIF ENDIF CASE(IDHELP) CALL IMODGETHELP('5.1.1','TMO.CT.Prop') END SELECT END SELECT END SUBROUTINE PROFILE_PROP_PUSHBUTTON !###====================================================================== SUBROUTINE PROFILE_SNAPCOORDINATES() !###====================================================================== IMPLICIT NONE INTEGER :: IIPF,IROW,I,J REAL :: X,Y,D,TD IF(NIPF.EQ.0)RETURN IF(ISNAP.EQ.0)RETURN TD=10.0E10; I=0; J=0 DO IIPF=1,ABS(NIPF) !## snap to these points IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.1)THEN DO IROW=1,IPF(IIPF)%NROW X=IPF(IIPF)%XYZ(1,IROW) Y=IPF(IIPF)%XYZ(2,IROW) IF(X.GE.MPW%XMIN.AND.X.LE.MPW%XMAX.AND.Y.GE.MPW%YMIN.AND.Y.LE.MPW%YMAX)THEN D=(X-MESSAGE%GX)**2.0+(Y-MESSAGE%GY)**2.0 IF(D.NE.0.0)D=SQRT(D) IF(D.LT.TD)THEN TD=D I =IIPF J =IROW ENDIF ENDIF END DO ENDIF END DO IF(I.NE.0)THEN MESSAGE%GX=IPF(I)%XYZ(1,J) MESSAGE%GY=IPF(I)%XYZ(2,J) ENDIF END SUBROUTINE PROFILE_SNAPCOORDINATES !###====================================================================== SUBROUTINE PROFILE_COMPUTEPLOT() !###====================================================================== IMPLICIT NONE REAL :: X1,X2,Y1,Y2 INTEGER :: I,IIDF,N,MAXSTEP CALL IGRCOLOURN(WRGB(255,255,255)) !## recompute profile SERIE%N=0 MAXSTEP=0 DO IIDF=1,MXNIDF !## compute only those that are activated IF(PROFIDF(IIDF)%PRFTYPE.GT.0)THEN N=0; DO I=1,NXY-1 X1=XY(1,I); X2=XY(1,I+1); Y1=XY(2,I); Y2=XY(2,I+1) CALL PROFILE_PROFINTERSECTLINE(X1,X2,Y1,Y2,IIDF,N) ENDDO CALL PROFILE_PROFSPOTLINE(X1,X2,Y1,Y2,IIDF,N,MAXSTEP) ENDIF END DO !## plot sampling distance (if larger than 1) DO I=1,SIZE(IWINPROFILE) CALL WINDOWSELECT(IWINPROFILE(I)) IF(MAXSTEP.GT.1)THEN CALL WINDOWOUTSTATUSBAR(2,'Interval '//TRIM(ITOS(MAXSTEP))) ELSE CALL WINDOWOUTSTATUSBAR(2,'') ENDIF ENDDO END SUBROUTINE PROFILE_COMPUTEPLOT !###====================================================================== SUBROUTINE PROFILE_PROFINTERSECTLINE(X1,X2,Y1,Y2,IIDF,N) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IIDF INTEGER,INTENT(INOUT) :: N REAL,INTENT(IN) :: X1,X2,Y1,Y2 REAL :: DXY,X1ISG,X2ISG,Y1ISG,Y2ISG !## length of vertex along line-spotted DXY=SQRT((X2-X1)**2.0+(Y2-Y1)**2.0); IF(DXY.EQ.0.0)RETURN X1ISG=X1; X2ISG=X2; Y1ISG=Y1; Y2ISG=Y2 IF(PROFIDF(IIDF)%IDF%IEQ.EQ.0)THEN !## intersect line with rectangular- regular-grid CALL INTERSECT_EQUI(PROFIDF(IIDF)%IDF%XMIN,PROFIDF(IIDF)%IDF%XMAX,PROFIDF(IIDF)%IDF%YMIN, & PROFIDF(IIDF)%IDF%YMAX,PROFIDF(IIDF)%IDF%DX,X1ISG,X2ISG,Y1ISG,Y2ISG,N) ELSE !## intersect line with rectangular-irregular-grid CALL INTERSECT_NONEQUI(PROFIDF(IIDF)%IDF%SX,PROFIDF(IIDF)%IDF%SY,PROFIDF(IIDF)%IDF%NROW, & PROFIDF(IIDF)%IDF%NCOL,X1ISG,X2ISG,Y1ISG,Y2ISG,N) ENDIF END SUBROUTINE PROFILE_PROFINTERSECTLINE !###====================================================================== SUBROUTINE PROFILE_PROFSPOTLINE(X1,X2,Y1,Y2,IIDF,N,MAXSTEP) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IIDF INTEGER,INTENT(INOUT) :: N REAL,INTENT(IN) :: X1,X2,Y1,Y2 INTEGER,INTENT(INOUT) :: MAXSTEP REAL :: Z,DXY,TLEN INTEGER :: IROW,ICOL,MX,I,J,ILEN,II,ISTEP ILEN=0; TLEN=0.0 !## profile completely outside current view -- make sure you use the total length, though! IF(N.EQ.0)N=-2 II=SIZE(SERIE(IIDF)%X) !## add 4 extra for filled-polygons! IF(ABS(N)+4.GT.II)THEN ALLOCATE(SERIE(IIDF)%COPX(ABS(N)+4),SERIE(IIDF)%COPY(ABS(N)+4)) SERIE(IIDF)%COPX(1:II)=SERIE(IIDF)%X(1:II) SERIE(IIDF)%COPY(1:II)=SERIE(IIDF)%Y(1:II) DEALLOCATE(SERIE(IIDF)%X,SERIE(IIDF)%Y) SERIE(IIDF)%X=>SERIE(IIDF)%COPX SERIE(IIDF)%Y=>SERIE(IIDF)%COPY ENDIF IF(N.EQ.-2)THEN ILEN=ILEN+1 SERIE(IIDF)%X(ILEN)=TLEN SERIE(IIDF)%Y(ILEN)=PROFIDF(IIDF)%IDF%NODATA ILEN=ILEN+1 SERIE(IIDF)%X(ILEN)=TLEN+SQRT((X1-X2)**2.0+(Y1-Y2)**2.0) SERIE(IIDF)%Y(ILEN)=PROFIDF(IIDF)%IDF%NODATA ENDIF IF(N.GT.MXSAMPLING)THEN ISTEP=(N/MXSAMPLING)+1; MAXSTEP=MAX(MAXSTEP,ISTEP) J=0; DO I=1,N,ISTEP J=J+1; XA(J)=XA(I); YA(J)=YA(I); LN(J)=SUM(LN(I:MIN(N,I+ISTEP-1))) ENDDO N=J ENDIF DO I=0,N+1 J=MIN(MAX(1,I),N); ICOL=INT(XA(J)); IROW=INT(YA(J)) IF(I.GT.0.AND.I.LE.N)TLEN=TLEN+LN(I)/2.0 IF(I.GT.1)TLEN=TLEN+LN(I-1)/2.0 IF(ICOL.GE.1.AND.ICOL.LE.PROFIDF(IIDF)%IDF%NCOL.AND. & IROW.GE.1.AND.IROW.LE.PROFIDF(IIDF)%IDF%NROW)THEN !## get idf values Z=IDFGETVAL(PROFIDF(IIDF)%IDF,IROW,ICOL,PROFIDF(IIDF)%UNITS) ELSE Z=PROFIDF(IIDF)%IDF%NODATA ENDIF ILEN=ILEN+1 SERIE(IIDF)%X(ILEN)=TLEN SERIE(IIDF)%Y(ILEN)=Z END DO SERIE(IIDF)%N=ILEN END SUBROUTINE PROFILE_PROFSPOTLINE !###====================================================================== SUBROUTINE PROFILE_COORDINATES(CODE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: CODE INTEGER :: I CALL WDIALOGSELECT(ID_DSERIESPROPTAB2) IF(CODE.EQ.0)THEN IF(NXY.GT.0)THEN CALL WGRIDROWS(IDF_GRID1,NXY) DO I=1,NXY CALL WGRIDPUTCELLREAL (IDF_GRID1,1,I,XY(1,I)) CALL WGRIDPUTCELLREAL (IDF_GRID1,2,I,XY(2,I)) CALL WGRIDPUTCELLSTRING(IDF_GRID1,3,I,TRIM(XYLABEL(I))) CALL WGRIDLABELROW(IDF_GRID1,I,TRIM(ITOS(I))) END DO ELSE CALL WDIALOGCLEARFIELD(IDF_GRID1) ENDIF ELSEIF(CODE.EQ.1)THEN DO I=1,NXY CALL WGRIDGETCELLREAL (IDF_GRID1,1,I,XY(1,I)) CALL WGRIDGETCELLREAL (IDF_GRID1,2,I,XY(2,I)) CALL WGRIDGETCELLSTRING(IDF_GRID1,3,I,XYLABEL(I)) END DO ENDIF END SUBROUTINE PROFILE_COORDINATES !###====================================================================== SUBROUTINE PROFILE_IDFMINMAX() !###====================================================================== IMPLICIT NONE INTEGER :: I,IIDF,IFIXX,IFIXY REAL :: X1,Y1 CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,IFIXX) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,IFIXY) IF(IFIXX.EQ.1.AND.IFIXY.EQ.1)RETURN IF(IFIXX.EQ.0)THEN XMIN=0.0 XMAX=XMIN ENDIF IF(IFIXY.EQ.0)THEN YMIN= 10.0E10 YMAX=-10.0E10 ENDIF DO IIDF=1,MXNIDF CALL UTL_FILLARRAY(IPRF,7,PROFIDF(IIDF)%PRFTYPE) !## overrule (temporary) profile-settings for colouring IPRF(5)=MAX(0,IPRF(5),IPRF(6)) !## correct whenever coloring is done for the first or last one IF(IIDF.EQ.1.OR.IIDF.EQ.MXNIDF)THEN IPRF(5)=0; IPRF(6)=0 ENDIF !## activated and not filled as colouring option IF(IPRF(1).EQ.1.AND.IPRF(5).EQ.0)THEN !## normal plotting of cross-section IF(PROFIDF(IIDF)%IDF%ITB.EQ.0)THEN IF(IFIXY.EQ.0)THEN DO I=1,SERIE(IIDF)%N IF(SERIE(IIDF)%Y(I).NE.PROFIDF(IIDF)%IDF%NODATA)THEN YMIN=MIN(YMIN,SERIE(IIDF)%Y(I)) YMAX=MAX(YMAX,SERIE(IIDF)%Y(I)) ENDIF ENDDO ENDIF IF(IFIXX.EQ.0)THEN IF(SERIE(IIDF)%N.GT.0)THEN XMAX=MAX(XMAX,SERIE(IIDF)%X(SERIE(IIDF)%N)) ENDIF ENDIF ELSEIF(PROFIDF(IIDF)%IDF%ITB.EQ.1)THEN IF(IFIXY.EQ.0)THEN YMIN=MIN(YMIN,PROFIDF(IIDF)%IDF%BOT) YMAX=MAX(YMAX,PROFIDF(IIDF)%IDF%TOP) ENDIF ENDIF ENDIF ENDDO !## determine max-x in case no idf's were sampled IF(IFIXX.EQ.0.AND.XMAX.EQ.0.0)THEN DO I=1,NXY-1 X1 =XY(1,I+1)-XY(1,I) Y1 =XY(2,I+1)-XY(2,I) XMAX=XMAX+SQRT(X1**2.0+Y1**2.0) END DO ENDIF IF(IFIXY.EQ.0)THEN CALL PROFILE_IFFMINMAX() CALL PROFILE_IPFMINMAX() ENDIF CALL SOLIDPROFILEMINMAX(IFIXX,IFIXY) END SUBROUTINE PROFILE_IDFMINMAX !###====================================================================== SUBROUTINE PROFILE_IPFMINMAX() !###====================================================================== IMPLICIT NONE !## profile from IDF's is determined IF(YMIN.LT.YMAX)RETURN YMIN=-50.0 YMAX= 50.0 END SUBROUTINE PROFILE_IPFMINMAX !###====================================================================== SUBROUTINE PROFILE_IFFMINMAX() !###====================================================================== IMPLICIT NONE !## profile from IDF's is determined IF(YMIN.LT.YMAX)RETURN YMIN=-50.0 YMAX= 50.0 END SUBROUTINE PROFILE_IFFMINMAX !###====================================================================== SUBROUTINE PROFILE_LEGEND() !###====================================================================== IMPLICIT NONE INTEGER :: ILEG ILEG=WMENUGETSTATE(ID_FLOATLEGEND,2) !## checked previously, uncheck it now IF(ILEG.EQ.1)THEN CALL WDIALOGSELECT(ID_DSERIESLEGEND); CALL WDIALOGUNLOAD() CALL WMENUSETSTATE(ID_FLOATLEGEND,2,0) RETURN ENDIF !## check it CALL WMENUSETSTATE(ID_FLOATLEGEND,2,1) CALL WDIALOGLOAD(ID_DSERIESLEGEND) CALL WDIALOGTITLE('Cross-Section Legend') CALL WGRIDROWS(IDF_GRID1,MXNIDF) CALL PROFILE_LEGENDUPDATE() CALL WDIALOGSELECT(ID_DSERIESLEGEND) CALL WDIALOGSHOW(-1,-1,0,2) CALL WDIALOGSELECT(ID_DSERIESTAB1) END SUBROUTINE PROFILE_LEGEND !###====================================================================== SUBROUTINE PROFILE_LEGENDUPDATE() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGGETCHECKBOX(ID_LEGEND,I) IF(I.EQ.0)RETURN CALL WDIALOGSELECT(ID_DSERIESLEGEND) DO I=1,MXNIDF CALL WGRIDCOLOURCELL(IDF_GRID1,1,I,PROFIDF(I)%SCOLOR,PROFIDF(I)%SCOLOR) CALL WGRIDPUTCELLSTRING(IDF_GRID1,2,I,PROFIDF(I)%ALIAS) END DO CALL WDIALOGSELECT(ID_DSERIESTAB1) END SUBROUTINE PROFILE_LEGENDUPDATE !###====================================================================== SUBROUTINE PROFILE_TRANSFORMXY() !###====================================================================== IMPLICIT NONE REAL :: XMIDDLE,YMIDDLE,DX,DY INTEGER :: I XMIDDLE=SUM(XY(1,1:NXY))/REAL(NXY) YMIDDLE=SUM(XY(2,1:NXY))/REAL(NXY) DO I=1,NXY DX=XY(1,I)-XMIDDLE DY=XY(2,I)-YMIDDLE XY(1,I)=XMIDDLE-1.0*DY XY(2,I)=YMIDDLE+1.0*DX END DO END SUBROUTINE PROFILE_TRANSFORMXY !###====================================================================== SUBROUTINE PROFILE_COPYINFO() !###====================================================================== IMPLICIT NONE INTEGER :: IPLOT,I,N !## fill dialog with information IDF !## open idf files (*.idf,*.mdf) MXNIDF=0 DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.(MP(IPLOT)%IPLOT.EQ.1.OR.MP(IPLOT)%IPLOT.EQ.5))THEN !## get idf for mdf file IF(MP(IPLOT)%IPLOT.EQ.5)THEN IF(READMDF(MP(IPLOT)%IDFNAME,N))THEN DO I=1,N MXNIDF=MXNIDF+1 MDF(I)%LEG =PROFIDF(MXNIDF)%LEG MDF(I)%PRFTYPE =PROFIDF(MXNIDF)%PRFTYPE MDF(I)%SCOLOR =PROFIDF(MXNIDF)%SCOLOR MDF(I)%ALIAS =PROFIDF(MXNIDF)%ALIAS ENDDO IF(.NOT.WRITEMDF(MP(IPLOT)%IDFNAME,N))THEN ENDIF CALL MDFDEALLOCATE() ENDIF ELSE MXNIDF=MXNIDF+1 MP(IPLOT)%SCOLOR =PROFIDF(MXNIDF)%SCOLOR MP(IPLOT)%PRFTYPE=PROFIDF(MXNIDF)%PRFTYPE MP(IPLOT)%ALIAS =PROFIDF(MXNIDF)%ALIAS MP(IPLOT)%ISCREEN=PROFIDF(MXNIDF)%ISCREEN MP(IPLOT)%UNITS =PROFIDF(MXNIDF)%UNITS ENDIF ENDIF ENDDO END SUBROUTINE PROFILE_COPYINFO !###====================================================================== SUBROUTINE PROFILE_CLOSE() !###====================================================================== IMPLICIT NONE INTEGER :: ILEG CALL PROFILE_COPYINFO() !## copy settings for background-bitmap IF(ALLOCATED(SPF))THEN IF(ISPF.GT.0.AND.ISPF.LE.SIZE(SPF))THEN !## get correct x- and y-coordinates CALL PROFILE_EXTENT_GRAPH(1) CALL IGRUNITSFROMPIXELS(PBITMAP%IX1,PBITMAP%IY1,PBITMAP%GX1,PBITMAP%GY1,IORIGIN=1) CALL IGRUNITSFROMPIXELS(PBITMAP%IX2,PBITMAP%IY2,PBITMAP%GX2,PBITMAP%GY2,IORIGIN=1) SPF(ISPF)%PBITMAP=PBITMAP ENDIF ENDIF IF(PBITMAP%IACT.EQ.1)CALL WBITMAPDESTROY(PBITMAP%IBITMAP); PBITMAP%IACT=0 !## deallocate memory CALL PROFILE_DEALLOCATE() IF(ALLOCATED(IPIPET))DEALLOCATE(IPIPET) NPIPET=0 !## close all files CALL UTL_CLOSEUNITS() CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGGETCHECKBOX(ID_LEGEND,ILEG) IF(ILEG.EQ.1)THEN CALL WDIALOGPUTCHECKBOX(ID_LEGEND,0) CALL WDIALOGSELECT(ID_DSERIESLEGEND) CALL WDIALOGUNLOAD() ENDIF CALL WDIALOGSELECT(ID_DSERIES) CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DSERIESMOVIE) CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DIPFINFO) CALL WDIALOGUNLOAD() CALL WDIALOGSELECT(ID_DIPFINFOSERIE) CALL WDIALOGUNLOAD() CALL WINDOWSELECT(0) CALL WMENUSETSTATE(ID_PROFILE,2,0) CALL PROFILE_FIELDSMAINMENU(1) CALL MANAGERUPDATE() CALL UTL_HIDESHOWDIALOG(ID_DMANAGER,2) !## reset to entire window CALL WINDOWSELECT(MPW%IWIN) CALL WINDOWSIZEPOS(ISTATE=WINMAXIMISED) CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(2,'') CALL WINDOWOUTSTATUSBAR(3,'') CALL WINDOWOUTSTATUSBAR(4,'') CALL WMESSAGETIMER(60*1000,IREPEAT=1) !1 minute END SUBROUTINE PROFILE_CLOSE !###====================================================================== SUBROUTINE PROFILE_SAVE() !###====================================================================== IMPLICIT NONE INTEGER :: IU,IIDF,I,J,IOS,IDELIM,IP,IB,JP,JB REAL :: XC,YC !,OLDXPOS CHARACTER(LEN=256) :: FNAME CHARACTER(LEN=3) :: EXT FNAME=TRIM(PREFVAL(1))//'\shapes\*.csv' IF(.NOT.UTL_WSELECTFILE('iMOD Comma-Separated File (*.csv)|*.csv|Postscript File (*.ps)|*.ps|Encapsulated Postscript File (*.eps)|*.eps|'// & 'Windows Bitmap (*.bmp)|*.bmp|ZSoft PC Paintbrush (*.pcx)|*.pcx|Portable Network Graphic image (*.png)|*.png|JPEG Image (*.jpg)|*.jpg|', & SAVEDIALOG+PROMPTON+DIRCHANGE+APPENDEXT,FNAME,'Select File Format'))RETURN EXT=UTL_CAP(FNAME(INDEX(FNAME,'.',.TRUE.)+1:),'U') SELECT CASE (TRIM(EXT)) CASE ('BMP','PNG','PCX') DO I=1,SIZE(IWINPROFILE) CALL WBITMAPSAVE(IBITMAP(I),FNAME) ENDDO CASE ('CSV') IU=UTL_GETUNIT(); CALL OSD_OPEN(IU,FILE=FNAME,STATUS='REPLACE',FORM='FORMATTED',ACTION='WRITE',IOSTAT=IOS) IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Can not write to output file:'//CHAR(13)// & TRIM(FNAME),'Info'); RETURN ENDIF IDELIM=44 WRITE(IU,'(A)') 'iMOD Cross-Section'; WRITE(IU,*) DO IIDF=1,MXNIDF CALL UTL_FILLARRAY(IPRF,7,PROFIDF(IIDF)%PRFTYPE) IF(IPRF(1).EQ.1)THEN WRITE(IU,'(A)') '- '//TRIM(PROFIDF(IIDF)%IDF%FNAME) WRITE(IU,'(4(A15,A1))') ' X-COORD.',CHAR(IDELIM),' Y-COORD.',CHAR(IDELIM),' DISTANCE', & CHAR(IDELIM),' Z' WRITE(IU,'(4(A15,A1))') ' (meter)',CHAR(IDELIM),' (meter)',CHAR(IDELIM),' (meter)', & CHAR(IDELIM),' (???)' DO I=1,SERIE(IIDF)%N CALL PROFILE_GETLOCATION(XC,YC,SERIE(IIDF)%X(I)) WRITE(IU,'(3(F15.3,A1),G15.7)') XC,CHAR(IDELIM),YC,CHAR(IDELIM),SERIE(IIDF)%X(I),& CHAR(IDELIM),SERIE(IIDF)%Y(I) ENDDO ENDIF ENDDO CLOSE(IU) CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Succesfully written output to:'//CHAR(13)//TRIM(FNAME),'Info') CASE ('PS','EPS') IP=WINFOGRHARDCOPY(PAPERWIDTH) !## in points JP=WINFOGRHARDCOPY(PAPERHEIGHT) !## in points !## select postscript driver CALL IGRHARDCOPYSELECT(1,POSTSCRIPT) DO I=1,SIZE(IWINPROFILE) CALL IGRSELECT(DRAWWIN,IWINPROFILE(I)) IB=WINFOWINDOW(WINDOWWIDTH) JB=WINFOWINDOW(WINDOWHEIGHT) CALL IGRHARDCOPYOPTIONS(IMAGEWIDTH,IP) JB=IP*REAL(JB)/REAL(IB) !## adjust image height CALL IGRHARDCOPYOPTIONS(IMAGEHEIGHT,JB) CALL IGRHARDCOPYOPTIONS(HORIZPOS,0) CALL IGRHARDCOPYOPTIONS(VERTICPOS,0) CALL IGRHARDCOPYOPTIONS(ORIENTATION,INTLANDSCAPE) IF(SIZE(IWINPROFILE).GT.1)FNAME=FNAME(:INDEX(FNAME,'.',.TRUE.)-1)//'_'//TRIM(ITOS(I))//'.PS' IF(EXT.EQ.'EPS')THEN CALL IGRHARDCOPYOPTIONS(EPSFILE,1) FNAME=FNAME(:INDEX(FNAME,'.',.TRUE.)-1)//'.EPS' ENDIF !## replot as vector image CALL IGRHARDCOPY(FNAME) CALL PROFILE_PLOT(LPS=.TRUE.) !## stop hardcopy export CALL IGRHARDCOPY('S') ENDDO CALL IGRSELECT(DRAWWIN,IWINPROFILE(1)) CALL WINDOWSELECT(IWINPROFILE(1)) !## replot as bitmap CALL PROFILE_PLOT() CALL WMESSAGEBOX(OKONLY,INFORMATIONICON,COMMONOK,'Succesfully written Postscript to:'//CHAR(13)//TRIM(FNAME),'Info') END SELECT END SUBROUTINE PROFILE_SAVE !###====================================================================== SUBROUTINE PROFILE_PLOTCOORDINATES() !###====================================================================== IMPLICIT NONE REAL :: X1,X2,Y1,Y2,DX,DXS,DY,YY1,YY2 INTEGER :: I,J CHARACTER(LEN=50) :: STRING !## no coordinates available IF(NXY.EQ.0)RETURN !## plotting selected! CALL WDIALOGSELECT(ID_DSERIESPROPTAB2) CALL WDIALOGGETCHECKBOX(IDF_CHECK1,I) CALL WDIALOGGETCHECKBOX(IDF_CHECK2,J) IF(I.EQ.0)RETURN !## get current graph-dimensions X1 =INFOGRAPHICS(GRAPHICSUNITMINX) X2 =INFOGRAPHICS(GRAPHICSUNITMAXX) Y1 =INFOGRAPHICS(GRAPHICSUNITMINY) Y2 =INFOGRAPHICS(GRAPHICSUNITMAXY) CALL WGRTEXTFONT(AXES%TFONT,WIDTH=AXES%CHW,HEIGHT=AXES%CHH,ISTYLE=0) !## plot axes-text CALL IGRCOLOURN(WRGB(0,0,0)) DX=0.0 CALL WGRTEXTORIENTATION(ALIGNLEFT,ANGLE=90.0) CALL IGRCOLOURN(WRGB(255,255,255)) CALL IGRCOLOURN(WRGB(0,0,0)) CALL WGRTEXTFONT(AXES%TFONT,WIDTH=AXES%CHW,HEIGHT=AXES%CHH,ISTYLE=FSOPAQUE) YY1=Y1+((Y2-Y1)/50.0) DO I=1,NXY STRING='['//TRIM(ITOS(INT(XY(1,I))))//'m,'//TRIM(ITOS(INT(XY(2,I))))//'m,'//TRIM(XYLABEL(I))//']' DXS=WGRTEXTLENGTH('0'//TRIM(STRING)//'0',0)*AXES%CHW IF(I.GT.1)THEN DX=DX+SQRT((XY(1,I)-XY(1,I-1))**2.0+(XY(2,I)-XY(2,I-1))**2.0) ENDIF IF(J.EQ.1.AND.TRIM(XYLABEL(I)).EQ.'')CYCLE CALL WGRTEXTSTRING(DX,YY1,' '//TRIM(STRING)//' ') ENDDO CALL IGRFILLPATTERN(OUTLINE) END SUBROUTINE PROFILE_PLOTCOORDINATES !###====================================================================== SUBROUTINE PROFILE_SHOW() !###====================================================================== IMPLICIT NONE INTEGER :: I!,IW,IH,IWP,IHP CALL PROFILE_PROPINIT() CALL WDIALOGSELECT(ID_DSERIESPROP) IF(MXNIDF.LE.0)THEN I=0 CALL WDIALOGTABSTATE(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB1,I) ELSE I=1 CALL WDIALOGTABSTATE(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB1,I) CALL WDIALOGSETTAB(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB1) ENDIF CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGSELECT(ID_DSERIESPROP) IF(MXNIFF.LE.0)THEN CALL WDIALOGTABSTATE(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB4,0) ELSE CALL WDIALOGTABSTATE(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB4,1) IF(MXNIDF.LE.0)CALL WDIALOGSETTAB(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB4) ENDIF CALL WDIALOGSELECT(ID_DSERIESPROP) IF(NIPF.LE.0)THEN CALL WDIALOGTABSTATE(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB5,0) CALL WDIALOGTABSTATE(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB6,0) ELSE CALL WDIALOGTABSTATE(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB5,1) CALL WDIALOGTABSTATE(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB6,1) IF(MXNIDF.LE.0.AND.MXNIFF.LE.0)CALL WDIALOGSETTAB(ID_DSERIESPROPTAB,ID_DSERIESPROPTAB5) ENDIF I=1 IF(NIPF.LE.0.AND.MXNIFF.LE.0)I=0 CALL WDIALOGSELECT(ID_DSERIESPROPTAB3) CALL WDIALOGFIELDSTATE(IDF_GROUP4,I) CALL WDIALOGFIELDSTATE(IDF_LABEL2,I) CALL WDIALOGFIELDSTATE(IDF_REAL2,I) !## min. value for all ipf's/iff's CALL WDIALOGFIELDSTATE(IDF_CHECK3,I) !## turn off tab in case isolid=0 CALL WDIALOGSELECT(ID_DSERIES) IF(ISOLID.EQ.0)CALL WDIALOGTABSTATE(ID_DSERIESTAB,ID_DSERIESTAB2,0) !## semi-modalless CALL WDIALOGSHOW(0,0,0,2) END SUBROUTINE PROFILE_SHOW !###====================================================================== SUBROUTINE PROFILE_FIELDSPLAY(ID,I) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ID,I CALL WDIALOGSELECT(ID_DSERIESMOVIE) IF(ID_STOP.NE.ID) CALL WDIALOGFIELDSTATE(ID_STOP,I) IF(ID_LEFT.NE.ID) CALL WDIALOGFIELDSTATE(ID_LEFT,I) IF(ID_FASTLEFT.NE.ID) CALL WDIALOGFIELDSTATE(ID_FASTLEFT,I) IF(ID_TOTALLEFT.NE.ID) CALL WDIALOGFIELDSTATE(ID_TOTALLEFT,I) IF(ID_RIGHT.NE.ID) CALL WDIALOGFIELDSTATE(ID_RIGHT,I) IF(ID_FASTRIGHT.NE.ID) CALL WDIALOGFIELDSTATE(ID_FASTRIGHT,I) IF(ID_TOTALRIGHT.NE.ID)CALL WDIALOGFIELDSTATE(ID_TOTALRIGHT,I) IF(IDF_RADIO1.NE.ID) CALL WDIALOGFIELDSTATE(IDF_RADIO1,I) IF(IDF_RADIO2.NE.ID) CALL WDIALOGFIELDSTATE(IDF_RADIO2,I) IF(IDF_REAL1.NE.ID) CALL WDIALOGFIELDSTATE(IDF_REAL1,I) END SUBROUTINE PROFILE_FIELDSPLAY !###====================================================================== SUBROUTINE PROFILE_FIELDSMAINMENU(I) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: I CALL WINDOWSELECT(0) IF(WMENUGETSTATE(ID_FILE,1).NE.I)CALL WMENUSETSTATE(ID_FILE,1,I) IF(WMENUGETSTATE(ID_EDIT,1).NE.I)CALL WMENUSETSTATE(ID_EDIT,1,I) IF(WMENUGETSTATE(ID_VIEW,1).NE.I)CALL WMENUSETSTATE(ID_VIEW,1,I) IF(WMENUGETSTATE(ID_MAP,1).NE.I)CALL WMENUSETSTATE(ID_MAP,1,I) IF(WMENUGETSTATE(ID_TOOLBOX,1).NE.I)CALL WMENUSETSTATE(ID_TOOLBOX,1,I) IF(WMENUGETSTATE(ID_NEW,1).NE.I)CALL WMENUSETSTATE(ID_NEW,1,I) IF(WMENUGETSTATE(ID_OPEN,1).NE.I)CALL WMENUSETSTATE(ID_OPEN,1,I) IF(WMENUGETSTATE(ID_SAVE,1).NE.I)CALL WMENUSETSTATE(ID_SAVE,1,I) IF(WMENUGETSTATE(ID_SAVEAS,1).NE.I)CALL WMENUSETSTATE(ID_SAVEAS,1,I) IF(WMENUGETSTATE(ID_COPY,1).NE.I)CALL WMENUSETSTATE(ID_COPY,1,I) IF(WMENUGETSTATE(ID_MANAGER,1).NE.I)CALL WMENUSETSTATE(ID_MANAGER,1,I) IF(WMENUGETSTATE(ID_IRDATABASE,1).NE.I)CALL WMENUSETSTATE(ID_IRDATABASE,1,I) IF(WMENUGETSTATE(ID_ZOOMINMAP,1).NE.I)CALL WMENUSETSTATE(ID_ZOOMINMAP,1,I) IF(WMENUGETSTATE(ID_ZOOMOUTMAP,1).NE.I)CALL WMENUSETSTATE(ID_ZOOMOUTMAP,1,I) IF(WMENUGETSTATE(ID_ZOOMFULLMAP,1).NE.I)CALL WMENUSETSTATE(ID_ZOOMFULLMAP,1,I) IF(WMENUGETSTATE(ID_ZOOMRECTANGLEMAP,1).NE.I)CALL WMENUSETSTATE(ID_ZOOMRECTANGLEMAP,1,I) IF(WMENUGETSTATE(ID_MOVEMAP,1).NE.I)CALL WMENUSETSTATE(ID_MOVEMAP,1,I) IF(I.EQ.0)THEN IF(WMENUGETSTATE(ID_PROFILE,1).NE.I)CALL WMENUSETSTATE(ID_PROFILE,1,I) IF(WMENUGETSTATE(ID_3DTOOL,1).NE.I)CALL WMENUSETSTATE(ID_3DTOOL,1,I) IF(WMENUGETSTATE(ID_TOPOGRAPHY,1).NE.I)CALL WMENUSETSTATE(ID_TOPOGRAPHY,1,I) IF(WMENUGETSTATE(ID_IMODINFO,1).NE.I)CALL WMENUSETSTATE(ID_IMODINFO,1,I) IF(WMENUGETSTATE(ID_TIMESERIES,1).NE.I)CALL WMENUSETSTATE(ID_TIMESERIES,1,I) IF(WMENUGETSTATE(ID_OPENIDF,1).NE.I)CALL WMENUSETSTATE(ID_OPENIDF,1,I) ENDIF IF(WMENUGETSTATE(ID_DISTANCE,1).NE.I)CALL WMENUSETSTATE(ID_DISTANCE,1,I) IF(WMENUGETSTATE(ID_MOVIE,1).NE.I)CALL WMENUSETSTATE(ID_MOVIE,1,I) IF(I.EQ.1)CALL MANAGERUPDATE() END SUBROUTINE PROFILE_FIELDSMAINMENU !###====================================================================== SUBROUTINE PROFILE_TURNOFF() !###====================================================================== IMPLICIT NONE INTEGER :: IPLOT !## zodat eerste getekende alleen als legenda bewerkt kan worden LISEL =MP%ISEL MP%ISEL=.FALSE. DO IPLOT=1,MXMPLOT !## activate first of list IF(LISEL(IPLOT))THEN MP(IPLOT)%ISEL=.TRUE. EXIT ENDIF ENDDO CALL MANAGERUPDATE() END SUBROUTINE !###==================================================================== SUBROUTINE PROFILE_ALLOCATE() !###==================================================================== IMPLICIT NONE INTEGER :: IPLOT,I,IIPF REAL :: DX MXNIDF=0 DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.(MP(IPLOT)%IPLOT.EQ.1.OR.MP(IPLOT)%IPLOT.EQ.5))THEN IF(MP(IPLOT)%IPLOT.EQ.5)THEN MXNIDF=MXNIDF+READMDF_GETN(MP(IPLOT)%IDFNAME) ELSE MXNIDF=MXNIDF+1 ENDIF ENDIF ENDDO MXNIFF=0 DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.MP(IPLOT)%IPLOT.EQ.3)MXNIFF=MXNIFF+1 ENDDO !## get nipf CALL IPFINIT() CALL PROFILE_DEALLOCATE() ALLOCATE(KPLOT(MAX(1,MXNIFF)),KU(MAX(1,MXNIFF)), & MPLOT(MAX(1,NIPF)),LISEL(MXMPLOT)) !## all idf in new-list storing idf-configuration ALLOCATE(PROFIDF(MXNIDF),PROFNIDF(0:MXNIDF)) !## assign kplot IFF I =0 DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.MP(IPLOT)%IPLOT.EQ.3)THEN I =I+1 KPLOT(I)=IPLOT ENDIF ENDDO !## assign mplot IPF I =0 DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.MP(IPLOT)%IPLOT.EQ.2)THEN I =I+1 MPLOT(I)=IPLOT ENDIF ENDDO ALLOCATE(XY(2,MXCRD),XYLABEL(MXCRD),SERIE(MXNIDF)); XYLABEL='' DO I=1,MXNIDF NULLIFY(SERIE(I)%X); NULLIFY(SERIE(I)%Y); PROFIDF(I)%LEG%NCLR=0 END DO DO I=1,MXNIDF ALLOCATE(SERIE(I)%X(MXSERIE),SERIE(I)%Y(MXSERIE)) END DO !## turn off selections temporary in idf-manager CALL PROFILE_TURNOFF() !## turn off options on mainrootmenu CALL PROFILE_FIELDSMAINMENU(0) !## open idf/iff/ipf files CALL PROFILE_OPENFILES() !## show profile-dialog CALL PROFILE_SHOW() !## show bitmap of idf plotted CALL PROFILE_PUTBITMAP(MPW%IBITMAP) !0) CALL WDIALOGSELECT(ID_DSERIESMOVIE) CALL WDIALOGFIELDSTATE(ID_STOP,0) DX=100.0 DO I=1,MXNIDF DX=MIN(DX,PROFIDF(I)%IDF%DX) ENDDO CALL WDIALOGPUTREAL(IDF_REAL1,DX) CALL WDIALOGSELECT(ID_DSERIESTAB1) CALL WDIALOGFIELDSTATE(ID_MOVIE,0) CALL WDIALOGFIELDSTATE(ID_SNAPPEN,0) CALL WDIALOGFIELDSTATE(ID_INFO,0) DO IIPF=1,NIPF IF(MP(MPLOT(IIPF))%PRFTYPE.EQ.1)THEN CALL WDIALOGFIELDSTATE(ID_SNAPPEN,1) CALL WDIALOGFIELDSTATE(ID_INFO,1) ENDIF ENDDO IF(MXNIDF.GT.0)CALL WDIALOGFIELDSTATE(ID_LEGEND,1) IF(MXNIDF.LE.0)CALL WDIALOGFIELDSTATE(ID_LEGEND,0) END SUBROUTINE PROFILE_ALLOCATE !###====================================================================== SUBROUTINE PROFILE_OPENFILES() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,N,IIPF,IPLOT,NGRAPH !## fill dialog with information IDF !## open idf files (*.idf,*.mdf) MXNIDF =0 NGRAPH =0 PROFNIDF=0 DO IPLOT=1,MXMPLOT IF(MP(IPLOT)%ISEL.AND.(MP(IPLOT)%IPLOT.EQ.1.OR.MP(IPLOT)%IPLOT.EQ.5))THEN !## get idf for mdf file IF(MP(IPLOT)%IPLOT.EQ.5)THEN NGRAPH=NGRAPH+1 IF(READMDF(MP(IPLOT)%IDFNAME,N))THEN DO I=1,N MXNIDF=MXNIDF+1 IF(.NOT.IDFREAD(PROFIDF(MXNIDF)%IDF,MDF(I)%FNAME,0))EXIT PROFIDF(MXNIDF)%ALIAS =MDF(I)%ALIAS PROFIDF(MXNIDF)%SCOLOR =MDF(I)%SCOLOR PROFIDF(MXNIDF)%PRFTYPE=MDF(I)%PRFTYPE PROFIDF(MXNIDF)%UNITS =0 J=INDEXNOCASE(PROFIDF(I)%IDF%FNAME,'\',.TRUE.)+1 IF(PROFIDF(MXNIDF)%ALIAS.EQ.'')PROFIDF(MXNIDF)%ALIAS=TRIM(PROFIDF(I)%IDF%FNAME(J:))//' ['//TRIM(MP(IPLOT)%ALIAS)//']' IF(PROFIDF(MXNIDF)%SCOLOR.LE.0)PROFIDF(MXNIDF)%SCOLOR=ICOLOR(I) IF(PROFIDF(MXNIDF)%PRFTYPE.LE.0)CALL UTL_READARRAY((/1,1,0,0,0,0,1/),7,PROFIDF(MXNIDF)%PRFTYPE) PROFIDF(MXNIDF)%ISCREEN=NGRAPH CALL LEGALLOCATE(PROFIDF(MXNIDF)%LEG) PROFIDF(MXNIDF)%LEG =MDF(I)%LEG ENDDO !## number of idfs in current mdf PROFNIDF(NGRAPH)=I-1 CALL MDFDEALLOCATE() ENDIF ELSE MXNIDF=MXNIDF+1 IF(.NOT.IDFREAD(PROFIDF(MXNIDF)%IDF,MP(IPLOT)%IDFNAME,0))EXIT PROFIDF(MXNIDF)%SCOLOR =MP(IPLOT)%SCOLOR PROFIDF(MXNIDF)%PRFTYPE=MP(IPLOT)%PRFTYPE PROFIDF(MXNIDF)%ISCREEN=MP(IPLOT)%ISCREEN !0 PROFIDF(MXNIDF)%ALIAS =MP(IPLOT)%ALIAS PROFIDF(MXNIDF)%UNITS =MP(IPLOT)%UNITS PROFNIDF(0) =PROFNIDF(0)+1 CALL LEGALLOCATE(PROFIDF(MXNIDF)%LEG) !## copy legend PROFIDF(MXNIDF)%LEG%NCLR =MP(IPLOT)%LEG%NCLR PROFIDF(MXNIDF)%LEG%CGRAD =MP(IPLOT)%LEG%CGRAD PROFIDF(MXNIDF)%LEG%CLASS =MP(IPLOT)%LEG%CLASS PROFIDF(MXNIDF)%LEG%LEGTXT=MP(IPLOT)%LEG%LEGTXT PROFIDF(MXNIDF)%LEG%RGB =MP(IPLOT)%LEG%RGB ENDIF ENDIF ENDDO !## fill dialog with information IFF KU=0 DO I=1,MXNIFF KU(I)=UTL_GETUNITIFF(MP(KPLOT(I))%IDFNAME,'OLD') ENDDO !## initialize ipf's CALL IPFINIT() DO IIPF=1,NIPF IF(.NOT.IPFREAD(MPLOT(IIPF),IIPF))THEN !## error occured ENDIF END DO END SUBROUTINE PROFILE_OPENFILES !###==================================================================== SUBROUTINE PROFILE_DEALLOCATE() !###==================================================================== IMPLICIT NONE INTEGER :: I IF(ALLOCATED(KPLOT)) DEALLOCATE(KPLOT) IF(ALLOCATED(MPLOT)) DEALLOCATE(MPLOT) IF(ALLOCATED(KU)) DEALLOCATE(KU) IF(ASSOCIATED(XY)) DEALLOCATE(XY) IF(ASSOCIATED(XYLABEL))DEALLOCATE(XYLABEL) IF(ALLOCATED(SERIE))THEN DO I=1,MXNIDF IF(ASSOCIATED(SERIE(I)%X))DEALLOCATE(SERIE(I)%X) IF(ASSOCIATED(SERIE(I)%Y))DEALLOCATE(SERIE(I)%Y) NULLIFY(SERIE(I)%X) NULLIFY(SERIE(I)%Y) END DO DEALLOCATE(SERIE) ENDIF IF(ALLOCATED(LISEL))DEALLOCATE(LISEL) CALL INTERSECT_DEALLOCATE() IF(ALLOCATED(PROFIDF))THEN DO I=1,SIZE(PROFIDF) CALL IDFDEALLOCATEX(PROFIDF(I)%IDF) CALL LEGDEALLOCATE(PROFIDF(I)%LEG) ENDDO DEALLOCATE(PROFIDF) ENDIF IF(ALLOCATED(PROFNIDF))DEALLOCATE(PROFNIDF) CALL PROFILE_CLOSEWINDOWS() END SUBROUTINE PROFILE_DEALLOCATE END MODULE MOD_PROFILE