File: cgimageinfo.pro

package info (click to toggle)
coyote 2019.01.29-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 6,316 kB
  • sloc: python: 184; makefile: 14; sh: 13
file content (254 lines) | stat: -rw-r--r-- 11,364 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
; docformat = 'rst'
;
; NAME:
;   cgImageInfo
;
; PURPOSE:
;     The purpose of this program is allow interactive inquiry of image
;     position and values for images displayed with cgImage.
;     After a call to cgImage, cgImageInfo can be called and the user
;     can use the cursor to click in the image display window. If the user clicks
;     inside the image, the image location and value will be printed out in the
;     user's IDL console window.
;     
;******************************************************************************************;
;                                                                                          ;
;  Copyright (c) 2011, by Fanning Software Consulting, Inc. All rights reserved.           ;
;                                                                                          ;
;  Redistribution and use in source and binary forms, with or without                      ;
;  modification, are permitted provided that the following conditions are met:             ;
;                                                                                          ;
;      * Redistributions of source code must retain the above copyright                    ;
;        notice, this list of conditions and the following disclaimer.                     ;
;      * Redistributions in binary form must reproduce the above copyright                 ;
;        notice, this list of conditions and the following disclaimer in the               ;
;        documentation and/or other materials provided with the distribution.              ;
;      * Neither the name of Fanning Software Consulting, Inc. nor the names of its        ;
;        contributors may be used to endorse or promote products derived from this         ;
;        software without specific prior written permission.                               ;
;                                                                                          ;
;  THIS SOFTWARE IS PROVIDED BY FANNING SOFTWARE CONSULTING, INC. ''AS IS'' AND ANY        ;
;  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES    ;
;  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT     ;
;  SHALL FANNING SOFTWARE CONSULTING, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,             ;
;  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED    ;
;  TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;         ;
;  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND             ;
;  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT              ;
;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS           ;
;  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                            ;
;******************************************************************************************;
;
;+
;  The purpose of this program is allow interactive inquiry of image
;  position and values for images displayed with cgImage.
;  After a call to cgImage, cgImageInfo can be called and the user
;  can use the cursor to click in the image display window. If the user clicks
;  inside the image, the image location and value will be printed out in the
;  user's IDL console window. The cgImageInfo program blocks the IDL command 
;  line until the RIGHT mouse button is clicked in the image display window.
;  
;  This cgImageInfo program is designed to work for the last image displayed with cgImage 
;  on a Windows or X device. Precautions are taken to help you avoid shooting
;  yourself in the foot, but I can't anticipate every action a user might take at the 
;  IDL command line. Pay particular attention to exiting the program with the RIGHT mouse
;  button before you close or kill the current graphics window. Failure to do so will 
;  put you into a very strange and precarious state from which no rescue is possible.
;  You might want to consider using the Catalyst Program `IMGWIN <http://www.idlcoyote.com/catalyst/imgwin.html>`
;   as an alternative to cgImageInfo.
;
; :Categories:
;    Graphics
;    
; :Params:
;    image: in, required, 
;         A 2D or 3D image array. Values will be returned from this image.
;         In versions of IDL < 8.0, it is possible to use a HASH object of
;         keys/images where this program will describe the value for each of
;         the images in the HASH object.
;    position: in, optional, type=float
;         A four-element floating array giving the position of the image in
;         the display window. If not provided, the image position will be
;         retrieved from the last image position used with cgImage.
;         
; :Examples:
;     To display an image with axes and then inquire about it::
;
;         filename = FILEPATH(SUBDIR=['examples','data'], 'worldelv.dat')
;         image = BYTARR(360,360)
;         OPENR, lun, filename, /GET_LUN
;         READU, lun, image
;         FREE_LUN, lun
;
;         thisPosition = [0.1, 0.1, 0.9, 0.9]
;         cgImage, image, /KEEP_ASPECT,  POSITION=thisPosition, /AXES
;         cgImageInfo, image
;       
; :Author:
;       FANNING SOFTWARE CONSULTING::
;           David W. Fanning 
;           1645 Sheely Drive
;           Fort Collins, CO 80526 USA
;           Phone: 970-221-0438
;           E-mail: david@idlcoyote.com
;           Coyote's Guide to IDL Programming: http://www.idlcoyote.com
;
; :History:
;     Change History::
;      Written by: David W Fanning, 16 March 2008.
;      Added ability to specify position directly in call. 20 March 2008. DWF
;      Changed cursor operation to conform with expected differences
;         between Windows and UNIX. 20 March 2008, DWF.
;      Slightly modified screen directions. 16 November 2010. DWF.
;      Modified so that multiple images/grids can be described 18 May 2011. MHS
;
; :Copyright:
;     Copyright (c) 2008-2011, Fanning Software Consulting, Inc.
;-
PRO cgImageInfo, image, position

    COMPILE_OPT idl2

    ; Error Handling.
    CATCH, theError
    IF theError NE 0 THEN BEGIN
        CATCH, /CANCEL
        void = cgErrorMsg()
        
        ; Set the cursor back to original shape.
        IF !D.Name EQ 'WIN' THEN BEGIN
            Device, /CURSOR_ORIGINAL
        ENDIF ELSE BEGIN
            Device, CURSOR_STANDARD=30
        ENDELSE
        RETURN
     ENDIF

    ; Set up a common block to access cgImage informaton.
    COMMON FSC_$CGIMAGE, _cgimage_xsize, _cgimage_ysize, $
                         _cgimage_winxsize, _cgimage_winysize, $
                         _cgimage_position, _cgimage_winID, $
                         _cgimage_current



    ;;  First check to see if we're using a HASH as input for the variable image.
    hsh = ''
    IF total( obj_valid( image ) EQ 1 ) &&  obj_isa( image, 'HASH' ) THEN BEGIN 
       ;; If so, we need to pull out the first image from the hash so that all of the
       ;; information can be set up properly before the user selects data from the
       ;; displayed image
       hsh = image

       IF n_elements( hsh ) EQ 0 THEN Message, 'Must supply a hash of names/images to examine.'
       ;; 
       keys = hsh -> keys( ) 
       image = hsh[ keys[ 0 ] ]

       ;; check that each image in the hash has same dimensions.
       void =  Image_Dimensions( image, xsize = first_xsize, ysize = first_ysize )
       FOR k = 1, n_elements( keys ) - 1 DO BEGIN
          img =  hsh[ keys[ k ] ]
          void =  Image_Dimensions( img,  xsize = xsize,  ysize = ysize )
          IF xsize NE first_xsize OR ysize NE first_ysize THEN $
             Message, 'Each Image must have same X & Y dimensions'
       ENDFOR 
       
    ENDIF 

    ; Check to see if we can proceed. First see if we have an image.
    IF N_Elements(image) EQ 0 THEN Message, 'Must supply image for reporting values.'

    ; Only 2D and 24-bit images allowed.
    ndims = Size(image, /N_DIMENSIONS)
    IF ndims LT 2 OR ndims GT 3 THEN Message, 'Image must be 2D or 3D (True-Color).'
    s = Size(image, /Dimensions)

    ; Does this device support windows?
    IF (!D.FLAGS AND 256) EQ 0 THEN Message, 'cgImageInfo only works on devices that support windows.'

    ; Has a call to cgImage preceeded this call?
    IF _cgimage_current EQ 0 THEN Message, 'Must call cgImage prior to calling cgImageInfo.'

    ; Is the image window still open?
    Device, WINDOW_STATE=theWindows
    IF theWindows[_cgimage_winID] EQ 0 THEN Message, 'The image window has been closed.'

    ; Is the image that you got here the same size as the cgImage image?
    void = Image_Dimensions(image, XSIZE=imgxsize, YSIZE=imgysize)
    IF imgxsize NE _cgimage_xsize OR imgysize NE _cgimage_ysize THEN $
        Message, 'Image dimensions to not match those of last displayed image.'

    ; Make the image window the current graphics window.
    thisWindow = !D.Window
    WSet, _cgimage_winID

    ; Are the window sizes still right?
    IF !D.X_Size NE _cgimage_winxsize OR !D.Y_Size NE _cgimage_winysize THEN BEGIN
        WSet, thisWindow
        Message, 'The image window size has changed size from when image was last displayed.'
    ENDIF

    ; If a position was supplied, use that rather than the stored position.
    IF N_Elements(position) NE 0 THEN thePos = position ELSE thePos = _cgimage_position

    ; Print instructions to the user.
    Print, ''
    Print, 'Click cursor in image window (window ' + StrTrim(_cgimage_winID,2) + ') to get image values.'
    Print, 'Use LEFT mouse buton to inquire.'
    Print, 'Use RIGHT mouse button to exit program.'
    Print, ''
    Print, 'Expecting cursor clicks in image window...'

    ; Start the image loop.
    !MOUSE.BUTTON = 0
    WHILE !MOUSE.BUTTON NE 4 DO BEGIN

       ; Change to arrow cursor in window.
       IF !D.Name EQ 'WIN' THEN BEGIN
           Device, CURSOR_STANDARD=32649
       ENDIF ELSE BEGIN
           Device, /CURSOR_ORIGINAL
       ENDELSE

       ; Get the location in the window.
       Cursor, x, y, /NORMAL, /DOWN

       ; Are you inside or outside the image?
       inside = 0
       IF (x GE thePos[0]) AND (x LE thePos[2]) AND $
          (y GE thePos[1]) AND (y LE thePos[3]) THEN inside = 1

       ; If inside, then convert location to image pixel dimension and return value
       ; of the image at the location. Be sure you do this differently for 2D and 3D images.
       IF inside THEN BEGIN

          ; Create vectors for locating image dimensions with VALUE_LOCATE
          xvec = cgScaleVector(Findgen(_cgimage_xsize+1), thePos[0], thePos[2])
          yvec = cgScaleVector(Findgen(_cgimage_ysize+1), thePos[1], thePos[3])
          xpixel = Value_Locate(xvec, x)
          ypixel = Value_Locate(yvec, y)

          ;; If a hash wasn't input, use the old output convention.
          cgImageInfoDescribeValues, image,  xpixel,  ypixel, hsh
          
       ENDIF ELSE Print, 'Outside image'

    ENDWHILE

    ; Set the cursor back to original shape.
    IF !D.Name EQ 'WIN' THEN BEGIN
        Device, /CURSOR_ORIGINAL
    ENDIF ELSE BEGIN
        Device, CURSOR_STANDARD=30
    ENDELSE

    ; Set the window back to entry window.
    WSet, thisWindow

    ; Print confirmation.
    Print, ''
    Print, 'Good-bye. cgImageInfo has returned control to IDL.'
    Print, ''

END