!! 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_TAGS USE WINTERACTER USE RESOURCE USE MOD_DBL USE MODPLOT USE IMODVAR, ONLY : DP_KIND,SP_KIND USE MOD_OSD, ONLY : OSD_GETENV,OSD_OPEN USE MOD_PREF_PAR, ONLY : PREFVAL USE MOD_UTL, ONLY : ITOS,UTL_GETUNIT,UTL_DIRINFO,UTL_CREATEDIR,RTOS,LISTNAME,ILIST,UTL_IMODFILLMENU, & UTL_PLOT1BITMAP,UTL_PLOT2BITMAP,UTL_SETTEXTSIZE USE MOD_POLYGON_UTL, ONLY : POLYGON_UTL_GETSHAPE !USE MOD_IPF, ONLY : UTL_PLOTPOINT,UTL_PLOTLABEL USE MOD_TAGS_PAR CONTAINS !###====================================================================== SUBROUTINE TAGUPDATE() !###====================================================================== IMPLICIT NONE INTEGER :: ISTATE CALL TAGGETNAME() CALL WDIALOGSELECT(ID_DMANAGERTAB3) CALL WDIALOGGETCHECKBOX(ID_TAGOWNER,ISTATE) IF(ISTATE.EQ.0)THEN CALL UTL_IMODFILLMENU(ID_DMTABMENU,DIRNAME,'*.tag','F',NTAGS,1,1) ELSEIF(ISTATE.EQ.1) THEN CALL UTL_IMODFILLMENU(ID_DMTABMENU,DIRNAME,TRIM(OSD_GETENV('USERNAME'))//'*.TAG','F',NTAGS,1,1) ENDIF IF(NTAGS.GT.0)THEN IF(ALLOCATED(RESTAG))DEALLOCATE(RESTAG) IF(ALLOCATED(TAGLIST))DEALLOCATE(TAGLIST) ALLOCATE(RESTAG(NTAGS),TAGLIST(NTAGS)) RESTAG(1:NTAGS) =LISTNAME(1:NTAGS) TAGLIST(1:NTAGS)=ILIST(1:NTAGS) ! IF(ALLOCATED(ILIST))DEALLOCATE(ILIST) ! IF(ALLOCATED(LISTNAME))DEALLOCATE(LISTNAME) ENDIF CALL TAGUPDATEFIELD() END SUBROUTINE TAGUPDATE !###====================================================================== SUBROUTINE TAGDRAW() !###====================================================================== IMPLICIT NONE INTEGER :: I,J,ISHAPE,IU,IOS,ITAB REAL(KIND=DP_KIND) :: TWIDTH,THEIGHT !## only if tab selected CALL WDIALOGSELECT(ID_DMANAGER) CALL WDIALOGGETTAB(ID_DMTAB,ITAB) IF(ITAB.NE.ID_DMANAGERTAB3)RETURN CALL IGRCOLOURN(WRGB(0,0,0)) ! CALL IGRFILLPATTERN(HATCHED,DENSE1,DIAGDOWN) CALL TAGGETNAME() CALL UTL_SETTEXTSIZE(TWIDTH,THEIGHT,FCT=0.0D02) DO I=1,NTAGS IF(TAGLIST(I).EQ.1)THEN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=TRIM(DIRNAME)//'\'//TRIM(RESTAG(I)),FORM='FORMATTED',ACTION='READ,DENYWRITE',IOSTAT=IOS) IF(IOS.NE.0)RETURN CALL TAGREAD(IU,ISHAPE) SELECT CASE (ISHAPE) CASE (ID_POINT) ! CALL DBL_IGRMARKER(XTAG(1),YTAG(1),2) CASE (ID_RECTANGLE) CALL IGRFILLPATTERN(HATCHED,DENSE1,DIAGDOWN) CALL DBL_IGRRECTANGLE(XTAG(1),YTAG(1),XTAG(2),YTAG(2)) CASE (ID_CIRCLE) CALL IGRFILLPATTERN(HATCHED,DENSE1,DIAGDOWN) RADIUS = SQRT((XTAG(1)-XTAG(2))**2.+(YTAG(1)-YTAG(2))**2.) CALL DBL_IGRCIRCLE(XTAG(1),YTAG(1),RADIUS) CASE (ID_LINE) ! CALL IGRLINEWIDTH(3) DO J=2,TAGPOINTS CALL DBL_IGRJOIN(XTAG(J),YTAG(J),XTAG(J-1),YTAG(J-1)) END DO ! CALL IGRLINEWIDTH(1) CASE (ID_POLYGON) CALL IGRFILLPATTERN(HATCHED,DENSE1,DIAGDOWN) CALL DBL_IGRPOLYGONCOMPLEX(XTAG,YTAG,TAGPOINTS) END SELECT ! CALL UTL_PLOTPOINT(XTAGMID,YTAGMID,2,1.0D0) ! CALL UTL_PLOTLABEL(XTAGMID,YTAGMID,(/TRIM(RESTAG(I))/),(/1/),1,TWIDTH,THEIGHT,(/'File:'/),.FALSE.,0) DEALLOCATE(XTAG,YTAG) ENDIF ENDDO CALL IGRFILLPATTERN(OUTLINE) END SUBROUTINE TAGDRAW !###====================================================================== SUBROUTINE TAGZOOM(XMIN,YMIN,XMAX,YMAX) !###====================================================================== IMPLICIT NONE REAL(KIND=DP_KIND),INTENT(OUT) :: XMIN,YMIN,XMAX,YMAX INTEGER :: I,K,IU,IOS,ISHAPE CALL TAGGETNAME() K=0 DO I=1,NTAGS IF(TAGLIST(I).EQ.1)THEN IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=TRIM(DIRNAME)//'\'//TRIM(RESTAG(I)),FORM='FORMATTED',ACTION='READ,DENYWRITE',IOSTAT=IOS) IF(IOS.NE.0)RETURN CALL TAGREAD(IU,ISHAPE) K=K+1 IF(K.EQ.1)THEN XMIN=MINVAL(XTAG(1:TAGPOINTS)) YMIN=MINVAL(YTAG(1:TAGPOINTS)) XMAX=MAXVAL(XTAG(1:TAGPOINTS)) YMAX=MAXVAL(YTAG(1:TAGPOINTS)) ELSE XMIN=MIN(XMIN,MINVAL(XTAG(1:TAGPOINTS))) YMIN=MIN(YMIN,MINVAL(YTAG(1:TAGPOINTS))) XMAX=MAX(XMAX,MAXVAL(XTAG(1:TAGPOINTS))) YMAX=MAX(YMAX,MAXVAL(YTAG(1:TAGPOINTS))) ENDIF DEALLOCATE(XTAG,YTAG) ENDIF ENDDO END SUBROUTINE TAGZOOM !###====================================================================== SUBROUTINE TAGREAD(IU,ISHAPE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: IU INTEGER,INTENT(OUT) :: ISHAPE INTEGER :: I DO I=1,4; READ(IU,*); ENDDO READ(IU,*) ISHAPE READ(IU,*) XTAGMID,YTAGMID READ(IU,*) TAGPOINTS ALLOCATE(XTAG(TAGPOINTS),YTAG(TAGPOINTS)) DO I=1,TAGPOINTS; READ(IU,*) XTAG(I),YTAG(I); END DO CLOSE(IU) END SUBROUTINE TAGREAD !###====================================================================== SUBROUTINE TAGUPDATEFIELD() !###====================================================================== IMPLICIT NONE INTEGER :: ISTATE CALL WDIALOGSELECT(ID_DMANAGERTAB3) IF(NTAGS.EQ.0)THEN CALL WDIALOGFIELDSTATE(ID_OPEN,0) CALL WDIALOGFIELDSTATE(ID_DRAW,0) CALL WDIALOGFIELDSTATE(ID_DELETE,0) CALL WDIALOGFIELDSTATE(ID_TAGOWNER,0) CALL WDIALOGCLEARFIELD(ID_DMTABMENU) CALL WINDOWSELECT(0) CALL WMENUSETSTATE(ID_ZOOMTAG,1,0) ELSE CALL WDIALOGGETMENU(ID_DMTABMENU,TAGLIST) CALL WDIALOGFIELDSTATE(ID_TAGOWNER,1) IF(SUM(TAGLIST).GT.0) THEN CALL WDIALOGFIELDSTATE(ID_DRAW,1) IF(SUM(TAGLIST).GT.1)THEN CALL WDIALOGFIELDSTATE(ID_OPEN,0) ELSE CALL WDIALOGFIELDSTATE(ID_OPEN,1) ENDIF CALL WDIALOGGETCHECKBOX(ID_TAGOWNER,ISTATE) CALL WDIALOGFIELDSTATE(ID_DELETE,ISTATE) CALL WINDOWSELECT(0) CALL WMENUSETSTATE(ID_ZOOMTAG,1,1) ELSE CALL WDIALOGFIELDSTATE(ID_OPEN,0) CALL WDIALOGFIELDSTATE(ID_DRAW,0) CALL WDIALOGFIELDSTATE(ID_DELETE,0) CALL WINDOWSELECT(0) CALL WMENUSETSTATE(ID_ZOOMTAG,1,0) ENDIF ENDIF END SUBROUTINE TAGUPDATEFIELD !###====================================================================== SUBROUTINE TAGOPEN() !###====================================================================== IMPLICIT NONE INTEGER :: IWIN,I,IOWNER CALL WDIALOGSELECT(ID_DMANAGERTAB3) CALL WDIALOGGETCHECKBOX(ID_TAGOWNER,IOWNER) ! CALL WDIALOGGETMENU(ID_DMTABMENU,TAGLIST)!FILENUMBER,TAGFILE) CALL TAGGETNAME() DO I=1,NTAGS IF(TAGLIST(I).EQ.1)THEN CALL WINDOWOPENCHILD(IWIN,FLAGS=SYSMENUON+OWNEDBYPARENT,WIDTH=1000,HEIGHT=750) IF(IOWNER.EQ.0) THEN CALL WEDITFILE(TRIM(DIRNAME)//'\'//TRIM(RESTAG(I)),MODAL,0,0,COURIERNEW,ISIZE=10) !ITYPE=MODAL,IDMENU=0, & ! IFLAGS=NOTOOLBAR+VIEWONLY+WORDWRAP+NOFILENEWOPEN+NOFILESAVEAS+NOFILEPRINT) ELSE CALL WEDITFILE(TRIM(DIRNAME)//'\'//TRIM(RESTAG(I)),MODAL,0,0,COURIERNEW,ISIZE=10) !ITYPE=MODAL,IDMENU=0, & ! IFLAGS=NOTOOLBAR+WORDWRAP+NOFILENEWOPEN+NOFILESAVEAS+NOFILEPRINT) ENDIF ENDIF END DO END SUBROUTINE TAGOPEN !###====================================================================== SUBROUTINE TAGDELETE() !###====================================================================== IMPLICIT NONE INTEGER :: I CALL TAGGETNAME() DO I=1,NTAGS IF(TAGLIST(I).EQ.1)THEN CALL WMESSAGEBOX(YESNO,QUESTIONICON,COMMONOK,'Do you really want to delete '//TRIM(RESTAG(I))//' ?','Question') IF(WINFODIALOG(4).EQ.1)CALL IOSDELETEFILE(TRIM(DIRNAME)//'\'//TRIM(RESTAG(I))) ENDIF ENDDO CALL TAGUPDATE() CALL TAGUPDATEFIELD() END SUBROUTINE TAGDELETE !###====================================================================== SUBROUTINE TAGNEW() !###====================================================================== IMPLICIT NONE CHARACTER(LEN=256) :: TAGFILE,LINE INTEGER :: IHOUR,MINUTE,ISECND,IYEAR,MONTH,IDAY,I,IU,ISHAPE,IOS CALL POLYGON_UTL_GETSHAPE(ISHAPE,(/3,1,1,1,1,3/)) IF(ISHAPE.EQ.0)RETURN CALL TAGGETNAME() CALL UTL_CREATEDIR(DIRNAME) ALLOCATE(XTAG(TAGMXCRD),YTAG(TAGMXCRD)) CALL TOOLSDRAWSHAPE(ISHAPE) IF(TAGPOINTS.EQ.0)RETURN CALL IOSTIME(IHOUR,MINUTE,ISECND) CALL IOSDATE(IYEAR,MONTH, IDAY) WRITE(TAGFILE,'(A1,I4.4,2I2.2,A1,3I2.2,A4)') '_',IYEAR,MONTH,IDAY,'_',IHOUR,MINUTE,ISECND,'.TAG' TAGFILE=TRIM(OSD_GETENV('USERNAME'))//TAGFILE IU=UTL_GETUNIT() CALL OSD_OPEN(IU,FILE=TRIM(DIRNAME)//'\'//TRIM(TAGFILE),FORM='FORMATTED',ACTION='WRITE,DENYREAD',IOSTAT=IOS) IF(IOS.NE.0)THEN CALL WMESSAGEBOX(OKONLY,EXCLAMATIONICON,COMMONOK,'Cannot open file '//TRIM(TRIM(DIRNAME)//'\'//TRIM(TAGFILE))//CHAR(13)// & 'Nothing saved!, Change TAGS keyword in *.prf to point to an existing map.','Error') RETURN ENDIF WRITE(IU,'(65A1)') ('*',I=1,65) WRITE(IU,'(A1,15X,A33,15X,A1)') '*','Do not change the settings below!','*' WRITE(IU,'(65A1)') ('*',I=1,65) WRITE(IU,*) LINE=TRIM(ITOS(ISHAPE)) WRITE(IU,'(A)') TRIM(LINE) SELECT CASE (ISHAPE) CASE (1024) !## circle XTAGMID=XTAG(1) YTAGMID=YTAG(1) CASE (1026,1025) !## rectangle/polygon XTAGMID=SUM(XTAG(1:TAGPOINTS))/REAL(TAGPOINTS) YTAGMID=SUM(YTAG(1:TAGPOINTS))/REAL(TAGPOINTS) CASE (1028) !## lines XTAGMID=XTAG(TAGPOINTS) YTAGMID=YTAG(TAGPOINTS) END SELECT LINE=TRIM(RTOS(XTAGMID,'F',2))//','//TRIM(RTOS(YTAGMID,'F',2)) WRITE(IU,'(A)') TRIM(LINE) LINE=TRIM(ITOS(TAGPOINTS)); WRITE(IU,'(A)') TRIM(LINE) DO I=1,TAGPOINTS LINE=TRIM(RTOS(XTAG(I),'F',2))//','//TRIM(RTOS(YTAG(I),'F',2)) WRITE(IU,'(A)') TRIM(LINE) END DO WRITE(IU,*); WRITE(IU,'(65A1)') ('*',I=1,65); WRITE(IU,*) WRITE(IU,'(A)') 'Remarks:'; WRITE(IU,*); WRITE(IU,*) ''; CLOSE(IU) DEALLOCATE(XTAG,YTAG) CALL WDIALOGSELECT(ID_DMANAGERTAB3) ! CALL WDIALOGPUTCHECKBOX(ID_TAGOWNER,1) CALL TAGUPDATE() ! CALL TAGUPDATEFIELD() !## select last-one CALL WDIALOGSELECT(ID_DMANAGERTAB3) TAGLIST=0; TAGLIST(NTAGS)=1 CALL WDIALOGPUTMENU(ID_DMTABMENU,RESTAG,NTAGS,TAGLIST) CALL TAGOPEN() END SUBROUTINE TAGNEW !###====================================================================== SUBROUTINE TAGGETNAME() !###====================================================================== IMPLICIT NONE INTEGER :: IPLOT,I,J DO IPLOT=1,MXMPLOT; IF(MP(IPLOT)%ISEL)EXIT; ENDDO I=INDEX(MP(IPLOT)%IDFNAME,'.',.TRUE.)-1 J=INDEX(MP(IPLOT)%IDFNAME,'\',.TRUE.)+1 DIRNAME=TRIM(PREFVAL(7))//'\'//MP(IPLOT)%IDFNAME(J:I) END SUBROUTINE TAGGETNAME !###====================================================================== SUBROUTINE TOOLSDRAWSHAPE(ISHAPE) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ISHAPE TYPE(WIN_MESSAGE) :: MESSAGE INTEGER :: ITYPE,IDOWN REAL(KIND=DP_KIND) :: XC1,YC1,XC2,YC2,XC3,YC3,XTAGTEMP,YTAGTEMP LOGICAL :: LEX CALL WINDOWSELECT(MPW%IWIN) !##CHANGE PLOTMODE CALL IGRPLOTMODE(MODEXOR) CALL IGRCOLOURN(WRGB(255,255,255)) !CALL IGRFILLPATTERN(HATCHED,DENSE1,DIAGDOWN) !##NORMAL BITMAP PLOTMODE CALL WBITMAPPLOTMODE(MODECOPY) SELECT CASE (ISHAPE) CASE (ID_POINT) CALL WCURSORSHAPE(ID_CURSORPOINT) CASE (ID_CIRCLE) CALL WCURSORSHAPE(ID_CURSORCIRCLE) CASE (ID_RECTANGLE) CALL WCURSORSHAPE(ID_CURSORRECTANGLE) CASE (ID_POLYGON) CALL WCURSORSHAPE(ID_CURSORPOLYGON) CASE (ID_LINE) ! CALL IGRLINEWIDTH(3) CALL WCURSORSHAPE(ID_CURSORLINE) END SELECT IDOWN=0 LEX =.FALSE. !##SELECTED POINT XC1 =0.0D0 YC1 =0.0D0 !##PREVIOUS POINT FOR PLOTMODE=EXCLUSIVE PLOTMODE XC2 =0.0D0 YC2 =0.0D0 XTAGTEMP=0.0D0 YTAGTEMP=0.0D0 TAGPOINTS=0 DO WHILE(.TRUE.) CALL WMESSAGE(ITYPE, MESSAGE) SELECT CASE(ITYPE) CASE(MOUSEMOVE) XC3=XC2 YC3=YC2 XC2 = MESSAGE%GX YC2 = MESSAGE%GY CALL WINDOWSELECT(0) CALL WINDOWOUTSTATUSBAR(1,'X:'//TRIM(RTOS(REAL(MESSAGE%GX,8),'F',2))//'M, Y:'//TRIM(RTOS(REAL(MESSAGE%GY,8),'F',2))//'M') ! FIRST POINT SET! IF(IDOWN.EQ.1)CALL TOOLSUPDATESHAPE(ISHAPE,XC1,YC1,XC2,YC2,XC3,YC3,LEX) !#MOUSE BUTTON RELEASED CASE (MOUSEBUTUP) SELECT CASE (ISHAPE) CASE (ID_POINT) CALL UTL_PLOT1BITMAP() CALL DBL_IGRMARKER(XC2,YC2,19) CALL UTL_PLOT2BITMAP() TAGPOINTS = 1 EXIT END SELECT !#MOUSE BUTTON PRESSED CASE (MOUSEBUTDOWN) IF (ISHAPE.EQ.ID_POINT.OR.ISHAPE.EQ.ID_CIRCLE.OR.ISHAPE.EQ.ID_RECTANGLE) MESSAGE%VALUE1 = 1 SELECT CASE (MESSAGE%VALUE1) !###LEFT BUTTON CASE (1) SELECT CASE (ISHAPE) CASE (ID_POINT,ID_CIRCLE,ID_RECTANGLE) IF(IDOWN.EQ.0)THEN XC1=XC2 YC1=YC2 IDOWN=1 ELSE !#######REMOVE PREVIOUS RECTANGLE/POLYGON-SEGMENT CALL TOOLSUPDATESHAPE(ISHAPE,XC1,YC1,XC2,YC2,XC3,YC3,LEX) CALL IGRPLOTMODE(MODECOPY) CALL IGRLINETYPE(SOLIDLINE) !#######TERMINATE WHEN RECTANGLE/CIRCLE IS CONSIDERED IF(ISHAPE.EQ.ID_RECTANGLE.OR.ISHAPE.EQ.ID_CIRCLE) THEN TAGPOINTS = 2 EXIT ENDIF ENDIF !#####POLYGON/LINE-SHAPE EXTENDED CASE (ID_POLYGON,ID_LINE) TAGPOINTS=MIN(TAGMXCRD,TAGPOINTS+1) XTAG(TAGPOINTS) = XC2 YTAG(TAGPOINTS) = YC2 IDOWN=1 IF (TAGPOINTS.EQ.2) LEX=.FALSE. END SELECT !###RIGHT BUTTON CASE (3) !####REMOVE PREVIOUS RECTANGLE/POLYGON-SEGMENT IF (TAGPOINTS.EQ.0) THEN EXIT ELSEIF (TAGPOINTS.EQ.1) THEN LEX=.FALSE. EXIT ENDIF IF(ISHAPE.EQ.ID_POLYGON.OR.ISHAPE.EQ.ID_LINE)THEN CALL UTL_PLOT1BITMAP() IF(ISHAPE.EQ.ID_LINE)THEN CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XC2,YC2) ENDIF IF(ISHAPE.EQ.ID_POLYGON) THEN CALL UTL_PLOT1BITMAP() CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XC2,YC2) IF(TAGPOINTS.GT.1) THEN CALL DBL_IGRJOIN(XTAG(1),YTAG(1),XC2,YC2) CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XTAG(1),YTAG(1)) ENDIF CALL IGRFILLPATTERN(OUTLINE) CALL DBL_IGRPOLYGONCOMPLEX(XTAG,YTAG,TAGPOINTS) CALL IGRFILLPATTERN(HATCHED,DENSE1,DIAGDOWN) CALL DBL_IGRPOLYGONCOMPLEX(XTAG,YTAG,TAGPOINTS) ENDIF CALL UTL_PLOT2BITMAP() CALL IGRPLOTMODE(MODECOPY) CALL IGRLINETYPE(SOLIDLINE) !####TERMINATE WHEN RECTANGLE/CIRCLE IS CONSIDERED ENDIF EXIT END SELECT !##BITMAP SCROLLED, RENEW TOP-LEFT PIXEL COORDINATES CASE (BITMAPSCROLLED) MPW%IX=MESSAGE%VALUE1 MPW%IY=MESSAGE%VALUE2 END SELECT ENDDO SELECT CASE (ISHAPE) CASE (ID_POINT) XTAG(1)=XC1 YTAG(1)=YC1 CASE (ID_RECTANGLE) XTAG(1)=MIN(XC1,XC3) YTAG(1)=MIN(YC1,YC3) XTAG(2)=MAX(XC1,XC3) YTAG(2)=MAX(YC1,YC3) CASE (ID_CIRCLE) XTAG(1)=XC1 YTAG(1)=YC1 XTAG(2)=XC3 YTAG(2)=YC3 END SELECT IF(ISHAPE.EQ.ID_LINE) CALL IGRLINEWIDTH(1) !##CHANGE PLOTMODE CALL IGRPLOTMODE(MODECOPY) CALL WCURSORSHAPE(CURARROW) END SUBROUTINE TOOLSDRAWSHAPE !###====================================================================== SUBROUTINE TOOLSUPDATESHAPE(ISHAPE,XC1,YC1,XC2,YC2,XC3,YC3,LEX) !###====================================================================== IMPLICIT NONE INTEGER,INTENT(IN) :: ISHAPE REAL(KIND=DP_KIND),INTENT(IN) :: XC1,YC1,XC2,YC2,XC3,YC3 LOGICAL,INTENT(IN OUT) :: LEX REAL(KIND=DP_KIND) :: RADIUS ! SELECT BITMAP FOR PROPER IPLOT CALL UTL_PLOT1BITMAP() SELECT CASE (ISHAPE) ! CASE (ID_POINT) CASE (ID_RECTANGLE) IF(LEX)CALL DBL_IGRRECTANGLE(XC1,YC1,XC3,YC3) !!! IF (LEX) CALL DBL_IGRRECTANGLE(XTAG(1),YTAG(1),XTAG(2),YTAG(2)) LEX=.FALSE. IF(XC1.NE.XC2.AND.YC1.NE.YC2)LEX=.TRUE. !!! IF (XTAG(1).NE.XTAGTEMP.AND.YTAG(1).NE.YTAGTEMP) LEX=.TRUE. ! NEW RECTANGLE IF(LEX)CALL DBL_IGRRECTANGLE(XC1,YC1,XC2,YC2) !!! IF(LEX) CALL DBL_IGRRECTANGLE(XTAG(1),YTAG(1),XTAGTEMP,YTAGTEMP) CASE (ID_CIRCLE) IF(LEX)THEN RADIUS=SQRT((XC1-XC3)**2.+(YC1-YC3)**2.) CALL DBL_IGRCIRCLE(XC1,YC1,RADIUS) !!! RADIUS=SQRT((XTAG(1)-XTAG(2))**2.+(YTAG(1)-YTAG(2))**2.) !!! CALL DBL_IGRCIRCLE(XTAG(1),YTAG(1),RADIUS) ENDIF LEX=.FALSE. RADIUS=SQRT((XC1-XC2)**2.+(YC1-YC2)**2.) !!! RADIUS=SQRT((XTAG(1)-XTAGTEMP)**2.+(YTAG(1)-YTAGTEMP)**2.) IF(RADIUS.NE.0.0D0)LEX=.TRUE. ! NEW CIRCLE IF(LEX)CALL DBL_IGRCIRCLE(XC1,YC1,RADIUS) !!! IF(LEX) CALL DBL_IGRCIRCLE(XTAG(1),YTAG(1),RADIUS) CASE (ID_POLYGON) ! REMOVE PREVIOUS POLYGON-SEGMENT IF(LEX)THEN CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XC3,YC3) IF (TAGPOINTS.GT.1) CALL DBL_IGRJOIN(XTAG(1),YTAG(1),XC3,YC3) !!! CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XTAG(TAGPOINTS+),YTAG(2)) !!! IF (TAGPOINTS.GT.1) CALL DBL_IGRJOIN(XTAG(1),YTAG(1),XTAG(2),YTAG(2)) ENDIF LEX=.TRUE. ! NEW POLYGON-SEGMENT CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XC2,YC2) IF (TAGPOINTS.GT.1) CALL DBL_IGRJOIN(XTAG(1),YTAG(1),XC2,YC2) !!! CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XTAGTEMP,YTAGTEMP) !!! IF (TAGPOINTS.GT.1) CALL DBL_IGRJOIN(XTAG(1),YTAG(1),XTAGTEMP,YTAGTEMP) CASE (ID_LINE) ! REMOVE PREVIOUS LINE-SEGMENT CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XC3,YC3) ! NEW LINE-SEGMENT CALL DBL_IGRJOIN(XTAG(TAGPOINTS),YTAG(TAGPOINTS),XC2,YC2) END SELECT ! UPDATE SCREEN CALL UTL_PLOT2BITMAP() END SUBROUTINE TOOLSUPDATESHAPE END MODULE MOD_TAGS