!! Copyright (C) Stichting Deltares, 2005-2019. !! !! 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_3D_SELECT USE IMODVAR, ONLY : DP_KIND,SP_KIND,IDIAGERROR USE MOD_3D_PAR USE MODPLOT, ONLY : MPW,MXMPLOT,MP USE MOD_UTL, ONLY : UTL_MESSAGEHANDLE,UTL_CAP,UTL_INVERSECOLOUR,ITOS,RTOS,UTL_GETUNIT USE MOD_IDF, ONLY : IDFREAD,IDFDEALLOCATE,IDFGETVAL,IDFREADPART,IDFIROWICOL,IDFGETLOC USE MOD_IPFASSFILE, ONLY : IPFOPENASSFILE,IPFREADASSFILELABEL,IPFREADASSFILE,IPFDRAWITOPIC2_ICLR USE MOD_IPFASSFILE_UTL USE MOD_IPF_PAR, ONLY : ASSF,IPF,NIPF,MAXLITHO,BH USE MOD_3D_DISPLAY, ONLY : IMOD3D_DISPLAY,IMOD3D_DISPLAY_IPF USE MOD_3D_UTL, ONLY : IMOD3D_SETCOLOR,IMOD3D_GETCOLOR USE MOD_COLOURS, ONLY : ICOLOR USE MOD_3D_PROCESS CHARACTER(LEN=50),DIMENSION(:),ALLOCATABLE :: TXTCOLUMN TYPE(IDFOBJ),ALLOCATABLE,DIMENSION(:),PRIVATE :: IDF_SAMPLE CONTAINS !###====================================================================== SUBROUTINE IMOD3D_SELECTOBJECT() !###====================================================================== IMPLICIT NONE INTEGER(KIND=GLINT) :: IPOSX,IPOSY INTEGER(KIND=GLINT),PARAMETER :: IDX=2,IDY=2 !## selection window INTEGER(KIND=GLSIZEI),PARAMETER :: NDX=IDX*2+1,NDY=IDY*2+1 !## selection window TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,I,IRGB,IDOWN REAL(KIND=GLFLOAT),DIMENSION(NDX*NDY*3) :: FRGB INTEGER :: IWHITE REAL(KIND=GLDOUBLE),DIMENSION(3) :: GLCOLOR IF(NIDFLIST.GT.0)THEN IF(ALLOCATED(IDF_SAMPLE))DEALLOCATE(IDF_SAMPLE) ALLOCATE(IDF_SAMPLE(NIDFLIST)) DO I=1,NIDFLIST; CALL IDFNULLIFY(IDF_SAMPLE(I)); ENDDO DO I=1,NIDFLIST; IF(.NOT.IDFREAD(IDF_SAMPLE(I),IDFPLOT(I)%FNAME,0))EXIT; ENDDO ELSE CALL WDIALOGSELECT(ID_D3DSETTINGS_TAB9_TAB1) CALL WDIALOGFIELDSTATE(IDF_GRID1,2) ENDIF IWHITE=WRGB(255,255,255); JSELECTED=0; ISELECTED=0 !## selection mode default activated! CALL WCURSORSHAPE(ID_CURSORIDFVALUE) CALL IMOD3D_SELECTOBJECT_BACK(IWHITE) CALL WDIALOGSELECT(ID_D3DSETTINGS) IDOWN=0 DO CALL WMESSAGE(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (MOUSEBUTDOWN) SELECT CASE (MESSAGE%VALUE1) !## left mouse button pressed - inspecting current selection CASE (1) IF(IDOWN.EQ.1)THEN IDOWN=0 ELSE IDOWN=1 ENDIF !## right mouse button pressed - stop hoovering CASE (3) EXIT END SELECT CASE (MOUSEMOVE) IF(IDOWN.EQ.0)THEN IPOSX=MESSAGE%X IPOSY=MESSAGE%Y IPOSY=WINFODIALOGFIELD(IDF_PICTURE2,FIELDHEIGHT)-IPOSY+1 IPOSX=IPOSX-IDX IPOSY=IPOSY-IDY CALL GLREADPIXELS(IPOSX,IPOSY,NDX,NDY,GL_RGB,GL_FLOAT,FRGB) ISELECTED=0 DO I=0,(IDX*IDY)-1 GLCOLOR(1)=FRGB(I*3+1); GLCOLOR(2)=FRGB(I*3+2); GLCOLOR(3)=FRGB(I*3+3) CALL IMOD3D_GETCOLOR(IRGB,GLCOLOR) IF(IRGB.NE.IWHITE)THEN ISELECTED=IRGB EXIT ENDIF ENDDO IF(ISELECTED.NE.JSELECTED)THEN !## draw selected CALL IMOD3D_SELECTOBJECT_FRONT() CALL IMOD3D_SELECTOBJECT_BACK(IWHITE) CALL IMOD3D_SELECTOBJECTPUTGRID() CALL WDIALOGSELECT(ID_D3DSETTINGS) JSELECTED=ISELECTED ENDIF ENDIF CASE (RESIZE) CALL IMOD3D_SELECTOBJECT_FRONT() CALL IMOD3D_PROCESSRESIZE(MESSAGE%VALUE1,MESSAGE%VALUE2) CALL IMOD3D_SELECTOBJECT_BACK(IWHITE) END SELECT ENDDO CALL WCURSORSHAPE(CURARROW) ! ISELECTED=0; CALL IMOD3D_SELECTOBJECT_FRONT() IF(ALLOCATED(IDF_SAMPLE))CALL IDFDEALLOCATE(IDF_SAMPLE,SIZE(IDF_SAMPLE)) END SUBROUTINE IMOD3D_SELECTOBJECT !###====================================================================== SUBROUTINE IMOD3D_SELECTOBJECTPUTGRID() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,IIPF,ISEL,IROW,ICOL,ICLR,MC,MAXROW REAL(KIND=DP_KIND) :: X,IWIDTH INTEGER,ALLOCATABLE,DIMENSION(:) :: IC IF(ISELECTED.LE.0.OR.ISELECTED.GT.SIZE(IPFDLIST,2))THEN !## clear point information CALL WDIALOGSELECT(ID_D3DSETTINGS_TAB9_TAB1) IF(NIDFLIST.GT.0)THEN CALL WGRIDPUTSTRING(IDF_GRID1,2,NANSTRING,NIDFLIST) ENDIF CALL WDIALOGCLEARFIELD(IDF_MENU1) !## clear borehole information CALL WDIALOGSELECT(ID_D3DSETTINGS_TAB9_TAB2) CALL WDIALOGCLEARFIELD(IDF_GRID1) CALL WGRIDROWS(IDF_GRID1,1) CALL WGRIDCOLOURCOLUMN(IDF_GRID1,2,-1,-1) RETURN ENDIF CALL WDIALOGSELECT(ID_D3DSETTINGS_TAB9_TAB1) IIPF=IPFDLIST(1,ISELECTED) !## selected ipf ISEL=IPFDLIST(2,ISELECTED) !## selected irow in ipf ALLOCATE(TXTCOLUMN(IPF(IIPF)%NCOL)) DO J=1,IPF(IIPF)%NCOL TXTCOLUMN(J)=TRIM(IPF(IIPF)%ATTRIB(J))//'='//TRIM(IPF(IIPF)%INFO(J,ISEL)) END DO !## plot label information CALL WDIALOGPUTMENU(IDF_MENU1,TXTCOLUMN,IPF(IIPF)%NCOL,1) !## sample selected idf DO J=1,NIDFLIST CALL IDFIROWICOL(IDF_SAMPLE(J),IROW,ICOL,IPF(IIPF)%XYZ(1,ISEL),IPF(IIPF)%XYZ(2,ISEL)) IF(IROW.GE.1.AND.IROW.LE.IDF_SAMPLE(J)%NROW.AND. & ICOL.GE.1.AND.ICOL.LE.IDF_SAMPLE(J)%NCOL)THEN X=IDFGETVAL(IDF_SAMPLE(J),IROW,ICOL) IF(X.EQ.IDF_SAMPLE(J)%NODATA)THEN CALL WGRIDPUTCELLSTRING(IDF_GRID1,2,J,'NoData') ELSE CALL WGRIDPUTCELLSTRING(IDF_GRID1,2,J,TRIM(RTOS(X,'G',7))) ENDIF ELSE CALL WGRIDPUTCELLSTRING(IDF_GRID1,2,J,'Outside') ENDIF END DO DEALLOCATE(TXTCOLUMN) !## nothing to do, no drills available IF(NASSLIST.EQ.0)RETURN CALL WDIALOGSELECT(ID_D3DSETTINGS_TAB9_TAB2) CALL WDIALOGPUTSTRING(IDF_LABEL1,'Drill: '//TRIM(IPF(IIPF)%INFO(IPF(IIPF)%ACOL,ISEL))) MAXROW=WINFOGRID(IDF_GRID1,GRIDROWSMAX) IF(ASSF(ISELECTED)%NRASS.GT.MAXROW)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'iMOD can display a maximal number of '//TRIM(ITOS(MAXROW))//'row'//CHAR(13)// & 'The current dataset contains '//TRIM(ITOS(ASSF(ISELECTED)%NRASS))//' rows'//CHAR(13)// & 'iMOD excludes the remaning rows from the table','Warning') ENDIF CALL WGRIDROWS(IDF_GRID1,ASSF(ISELECTED)%NRASS) !## associated files to be used MC=ASSF(ISELECTED)%NCASS IF(ALLOCATED(IC))THEN IF(SIZE(IC).LT.MC)DEALLOCATE(IC) ENDIF IF(.NOT.ALLOCATED(IC))ALLOCATE(IC(MC)) IC=1 !## use to see how to construct the grid ASSF(IASSF)%ITOPIC SELECT CASE (ASSF(ISELECTED)%ITOPIC) CASE (1) !## 2D boreholes CASE (2) !## labels IC(2:MC)=2; CALL WGRIDCOLUMNS(IDF_GRID1,ASSF(ISELECTED)%NCASS,IC) !## seismic images CASE (3) !## 3D boreholes CASE (4) !## labels IC(4:MC)=2; CALL WGRIDCOLUMNS(IDF_GRID1,ASSF(ISELECTED)%NCASS,IC) END SELECT DO I=1,ASSF(ISELECTED)%NCASS CALL WGRIDLABELCOLUMN(IDF_GRID1,I,TRIM(ASSF(ISELECTED)%ATTRIB(I))) ENDDO ICOL=ASSF(ISELECTED)%ASSCOL1 !## fill in grid with information DO I=1,MIN(MAXROW,ASSF(ISELECTED)%NRASS) IF(ASSF(ISELECTED)%ITOPIC.EQ.2)THEN CALL WGRIDPUTCELLDOUBLE( IDF_GRID1,1,I,ASSF(ISELECTED)%Z(I),'(F15.3)') DO J=2,ASSF(ISELECTED)%NCASS CALL WGRIDPUTCELLSTRING(IDF_GRID1,J,I,ASSF(ISELECTED)%L(J-1,I)) ENDDO ELSEIF(ASSF(ISELECTED)%ITOPIC.EQ.4)THEN CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,1,I,ASSF(ISELECTED)%DX(I),'(F15.3)') CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,2,I,ASSF(ISELECTED)%DY(I),'(F15.3)') CALL WGRIDPUTCELLDOUBLE(IDF_GRID1,3,I,ASSF(ISELECTED)%Z(I) ,'(F15.3)') DO J=4,ASSF(ISELECTED)%NCASS CALL WGRIDPUTCELLSTRING(IDF_GRID1,J,I,ASSF(ISELECTED)%L(J-3,I)) ENDDO ENDIF CALL IPFDRAWITOPIC2_ICLR(I,ISELECTED,ICLR,IWIDTH) CALL WGRIDCOLOURCELL(IDF_GRID1,ICOL,I,-1,ICLR) END DO END SUBROUTINE IMOD3D_SELECTOBJECTPUTGRID !###====================================================================== SUBROUTINE IMOD3D_SELECTOBJECT_BACK(IWHITE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IWHITE INTEGER :: I !## adjust settings for idf'plotting --- turn them into white background, no shade DO I=1,NIDFLIST IF(IDFPLOT(I)%ISEL.EQ.1)THEN IDFPLOT(I)%JFILL =IDFPLOT(I)%IFILL IDFPLOT(I)%JCOLOR =IDFPLOT(I)%ICOLOR IDFPLOT(I)%JLEG =IDFPLOT(I)%ILEG IDFPLOT(I)%JSHADED=IDFPLOT(I)%ISHADED IDFPLOT(I)%IFILL =1 IDFPLOT(I)%ILEG =1 IDFPLOT(I)%ICOLOR =IWHITE !## white IDFPLOT(I)%ISHADED=0 ENDIF ENDDO JACOLOR=ACOLOR ACOLOR =IWHITE CALL IMOD3D_DISPLAY(2) END SUBROUTINE IMOD3D_SELECTOBJECT_BACK !###====================================================================== SUBROUTINE IMOD3D_SELECTOBJECT_FRONT() !###====================================================================== IMPLICIT NONE INTEGER :: I !## recover settings for idf'plotting DO I=1,NIDFLIST IF(IDFPLOT(I)%ISEL.EQ.1)THEN IDFPLOT(I)%IFILL =IDFPLOT(I)%JFILL IDFPLOT(I)%ICOLOR =IDFPLOT(I)%JCOLOR IDFPLOT(I)%ILEG =IDFPLOT(I)%JLEG IDFPLOT(I)%ISHADED=IDFPLOT(I)%JSHADED ENDIF ENDDO ACOLOR=JACOLOR CALL IMOD3D_DISPLAY(1) END SUBROUTINE IMOD3D_SELECTOBJECT_FRONT END MODULE MOD_3D_SELECT