📄 rdplot.pro
字号:
pro RESET_RDPLOT
;
; If the user crashes out of the RDPLOT program, they can call this procedure
; to reset the graphics device functions to default values.
;
device, /CURSOR_CROSSHAIR, SET_GRAPHICS_FUNCTION=3, BYPASS_TRANSLATION=0
end
pro RDPLOT, x, y, WaitFlag, DATA=Data, DEVICE=Device, NORMAL=Normal, $
NOWAIT=NoWait, WAIT=Wait, DOWN=Down, CHANGE=Change, Err=Err, $
PRINT=Print, XTITLE=XTitle,YTITLE=YTitle, XVALUES=XValues,YVALUES=YValues, $
FULLCURSOR=FullCursor, NOCLIP=NoClip, LINESTYLE=Linestyle, THICK=Thick, $
COLOR=Color, BACKGROUND=BackGround, CROSS=Cross, ACCUMULATE=Accumulate
;*******************************************************************************
;+
; NAME:
; RDPLOT
;
; PURPOSE:
; Like CURSOR but with a full-screen cursor and continuous readout option
;
; EXPLANATION:
; This program is designed to essentially mimic the IDL CURSOR command,
; but with the additional options of continuously printing out the data
; values of the cursor's position, and using a full-screen cursor rather
; than a small cross cursor. The full screen cursor uses OPLOT and
; X-windows graphics masking to emulate the cursor.
; One difference is that IF the PRINT keyword is set but the DOWN,
; WAIT, CHANGE, or NOWAIT keywords are not set, then the leftmost mouse
; button will print a "newline" line-feed, but not exit.
;
; CALLING SEQUENCE:
; RDPLOT [, X, Y] [, WaitFlag] [, /DATA | /DEVICE | /NORMAL]
; [, /NOWAIT | /WAIT | /DOWN | /CHANGE]
; [, /FULLCURSOR] [, /NOCLIP] [, /CROSS] [, /ACCUMULATE]
; [, ERR=, PRINT=, XTITLE=, YTITLE=, XVALUES=, YVALUES=
; , LINESTYLE=, THICK=, COLOR=, BACKGROUND=]
;
; REQUIRED INPUTS:
; None.
;
; OPTIONAL INPUTS:
; WAITFLAG = Uses the same table as the intrinsic CURSOR command, But note
; that unlike the CURSOR command, there is no UP keyword.
; WaitFlag=0 sets the NOWAIT keyword
; WaitFlag=1 sets the WAIT keyword {default}
; WaitFlag=2 sets the CHANGE keyword
; WaitFlag=3 sets the DOWN keyword
;
; OPTIONAL OUTPUTS:
; X - a named variable to receive the final cursor X position, scalar
; or vector (if /ACCUMULATE is set)
; Y - a named variable to receive the final cursor Y position, scalar
; or vector (if /ACCUMULATE is set)
; OPTIONAL KEYWORD INPUT PARAMETERS:
; /DATA - data coordinates are displayed and returned.
; /DEVICE - device coordinates are displayed and returned.
; /NORMAL - normal coordinates are displayed and returned.
; Default is to use DATA coordinates if available (see notes).
; /NOWAIT = if non-zero the routine will immediately return the cursor's
; present position.
; /WAIT - if non-zero will wait for a mouse key click before returning. If
; cursor key is already down, then procedure immediately exits.
; /DOWN - equivalent to WAIT *except* that if the mouse key is already down
; when the procedure is called, the procedure will wait until the mouse
; key is clicked down again.
; /CHANGE - returns when the mouse is moved OR a key is clicked up or down.
; PRINT = if non-zero will continuously print out (at the terminal) the data
; values of the cursor's position. If PRINT>1, program will printout a
; brief header describing the mouse button functions. However, note that
; the button functions are overridden if any of the DOWN, WAIT, or
; CHANGE values are non-zero.
; XTITLE = label used to describe the values of the abscissa if PRINT>0.
; YTITLE = label used to describe the values of the ordinate if PRINT>0.
; XVALUES = a vector corresponding to the values to be printed when the
; PRINT keyword is set. This allows the user the option of printing
; out other values rather than the default X coordinate position of
; the cursor. E.g., if XVALUES is a string vector of dates such as
; ['May 1', 'May 2', ...], then those dates will be printed rather than
; the X value of the cursor's position: if X=1 then 'May 2' would be
; printed, etc. This requires that the values of the X coordinate read
; by the cursor must be positive (can't access negative elements).
; If XVALUES=-1, then NO values for X will be printed.
; YVALUES = analogous to the XVALUES keyword.
; /FULLCURSOR - if non-zero default cursor is blanked out and full-screen
; (or full plot window, depending on the value of NOCLIP) lines are
; drawn; their intersecton is centered on the cursor position.
; /NOCLIP - if non-zero will make a full-screen cursor, otherwise it will
; default to the value in !P.NOCLIP.
; LINESTYLE = style of line that makes the full-screen cursor.
; THICK = thickness of the line that makes the full-screen cursor.
; COLOR = color of the full-screen cursor.
; BACKGROUND = color of the background of the plot device. If this has
; been set to !P.BackGround, then this keyword is unnecessary.
; CROSS = if non-zero will show the regular cross AND full screen cursors.
; /ACCUMULATE - all of the positions for which the left button was
; clicked are stored in the X and Y variables. Has no effect if X and Y
; are not present.
;
; OPTIONAL KEYWORD OUTPUT PARAMETER:
; ERR = returns the most recent value of the !mouse.button value.
;
; NOTES:
; Note that this procedure does not allow the "UP" keyword/flag...which
; doesn't seem to work too well in the origianl CURSOR version anyway.
;
; If a data coordinate system has not been established, then RDPLOT will
; create one identical to the device coordinate system. Note that this
; kluge is required even if the user specified /NORMAL coordinates, since
; RDPLOT makes use of the OPLOT procedure. This new data coordinate system
; is effectively "erased" (!X.CRange and !Y.CRange are both set to zero)
; upon exit of the routine so as to not change the plot status from the
; user's point of view.
;
; Only tested on X-windows systems. If this program is interrupted, the
; graphics function might be left in a non-standard state; in that case,
; run the program RESET_RDPLOT to return the standard graphics functions,
; or type the command: DEVICE, /CURSOR_CROSS, SET_GRAPHICS=3, BYPASS=0
;
; Robishaw added /ACCUMULATE keyword to pass back all the positions at
; which the mouse was left-clicked. In addition, the value of the exit
; click is returned unless the cursor did not change position between the
; last left-click and the exit click.
;
; BUGS:
; NOTE: (1/27/05) The bugs below have been fixed by Robishaw and tested
; on Solaris, Linux and OS-X.
;
; It is assumed that the current background of the plot is correctly
; defined by the value in !P.Background. Otherwise, the color of the
; long cursor probably will not be correct. Sometimes the color doesn't
; work anyway, and I'm not sure why.
; NOTE: Robishaw fixed this 1/27/05.
;
; There may be some cases (e.g., when THICK>1 and NOCLIP=0) when the
; full-screen cursor is not correctly erased, leaving "ghost images" on the
; plot. It just seems that the screen updates get slow or the positions
; ambiguous with a thick line and the cursor off the plot.
; NOTE: Robishaw fixed this 1/27/05.
;
; PROCEDURE:
; Basically is a bells-n-whistles version of the CURSOR procedure. All
; the details are covered in the above discussion of the keywords.
;
; EXAMPLES:
; A silly, but informative one:
; Months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', $
; 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
; plot, indgen(12), xrange=[-5, 15]
; rdplot, /FULL, /PRINT, XTITLE='Month: ', YTITLE='Y-value per month = ', $
; xvalues=Months
;
; If your plot has a non-black background color, be sure to set either
; !p.background or the BACKGROUND keyword. Here are examples of how to
; use a blue full-screen cursor on a plot with a red background and
; yellow axes and data. First, deal with color decomposition off:
; device, decomposed=0
; tvlct, [255,255,0], [0,255,0], [0,0,255], 1
; plot, randomn(seed,1024), XSTYLE=19, PSYM=3, COLOR=2, BACK=1
; rdplot, /PRINT, /FULL, THICK=5, /NOCLIP, BACK=1, COLOR=3
;
; For decomposition on (TrueColor or DirectColor only):
; device, decomposed=1
; plot, randomn(seed,1024), XSTYLE=19, PSYM=3, COLOR=65535l, BACK=255l
; rdplot, /PRINT, /FULL, THICK=5, /NOCLIP, BACK=255l, COLOR=16711680l
;
; MODIFICATION HISTORY:
; Written (originally named CURFULL) by J.Wm.Parker 1993 Nov 22
; Created data coordinates if not already present, W. Landsman Nov. 93
; Added continuous printout of data values, COLOR and FULLCURSOR keywords
; (so that default is that it acts just like the cursor command).
; Changed name from CURFULL to RDPLOT. J.Wm.Parker 1994 Apr 20
; Modified (with some translation table assistance from the IDL support
; group) to correctly plot the crosshair with the desired IDL
; color using the device's translation table to determine the XOR
; function and using the BYPASS function. Added the RESET_RDPLOT
; procedure to cleanup crashes that might occur while running
; RDPLOT. Other minor changes/bug fixes. J.Wm.Parker 1994 May 21
; Modified DOWN, WAIT, CHANGE functions to behave more similar to the
; generic CURSOR procedure. J.Wm.Parker 1995 April 24
; Added XVALUES, YVALUES keywords and cleanup. J.Wm.Parker 1995 April 24
; Convert to IDL V5.0, W. Landsman July 1998
; Change !D.NCOLORS to !D.TABLE_SIZE for 24 bit displays W. Landsman May 2000
; Skip translation table for TrueColor visuals W. Landsman March 2001
; Fixed /FULLCURSOR ghosts. Fixed to properly deal with background colors
; in 24-bit visual classes (TrueColor and DirectColor). Added
; BACKGROUND keyword. Tim Robishaw 2005 Jan 27
; Added /ACCUMULATE keyword. T. Robishaw 2006 Nov 8
; Corrected following problems. When /CHANGE and /PRINT were set,
; returned X & Y were different than those printed. When /PRINT and
; /NOWAIT were set, or /PRINT and /WAIT were set and the routine was
; entered with a mouse button clicked, nothing was printed. When
; /PRINT and /DOWN were set, if routine was started with button down,
; advertised behavior was that routine would exit on next down click;
; in practice if cursor was not moved, successive down clicks had no
; effect. Now, if X is passed as an output variable, requires that Y
; is also passed, like CURSOR. Bottom line is that RDPLOT now really
; does behave like CURSOR and when /PRINT is set, the values printed
; correspond to those returned in X & Y. T. Robishaw 2006 Nov 12
; Fixed misbehavior when color decomposition was set to off for
; TrueColor and DirectColor. Now thoroughly tested on PseudoColor
; displays as well as both decomposition states for TrueColor and
; DirectColor. Also made the default cursor color white when
; decomposition is on (this has been its default value for
; decomposition off). T. Robishaw 2006 Nov 16
;-
;*******************************************************************************
On_error,2
;;;
; If the device does not support windows, then this program can not be used.
;
if ((!D.Flags and 256) ne 256) then message, $
'ERROR - Current graphics device ' + !D.NAME + ' does not support windows'
;;;
; Like cursor, require that if present, both X and Y be specified...
;
if (N_Params() eq 1) then message, $
'Incorrect number of arguments. Both X & Y must be present.'
;;;
; Keywords, keywords.
;
if (N_Params() eq 3) then begin
case WaitFlag of
0 : NoWait = 1
1 : Wait = 1
2 : Change = 1
3 : Down = 1
else : Wait = 1
endcase
endif
NoWait = keyword_set(NoWait)
Wait = keyword_set(Wait)
Down = keyword_set(Down); or Wait
Change = keyword_set(Change)
FullCursor = keyword_set(FullCursor)
;;;
; If plotting coordinates are not already established, and the NORMAL keyword
; is not set, then use device coordinates.
; Note that even if this procedure was called with the DATA keyword set, that
; the DEVICE keyword will always take precedence over the DATA keyword in the
; cursor command. However, if the NORMAL and DEVICE keywords are both set,
; then very strange values are returned.
;
UndefinedPlot = ((!X.CRange[0] eq 0) and (!X.CRange[1] eq 0))
if UndefinedPlot then plot, [0,!D.X_Size], [0,!D.Y_Size], /NODATA, $
XSTYLE=5, YSTYLE=5, XMARGIN=[0,0], YMARGIN=[0,0], /NOERASE
;;;
; Initialize the !mouse.button variable. The value of !mouse.button
; corresponds to the BYTE value of the buttons on the mouse from left to right,
; lowest bit first. So, the left button gives !mouse.button = 1, next button
; gives !mouse.button = 2, then 4.
; Read in the cursor with no wait. If the user does not want to wait, or if
; the DOWN or WAIT keywords are set AND the mouse key is depressed, then we're
; done (I hate GOTO's, but it is appropriate here).
; NOTE: Robishaw gets rid of GOTO statement... if user asks for value to be
; printed, it should be printed!
;
!mouse.button = 0
cursor, X, Y, /NOWAIT, DATA=Data, DEVICE=Device, NORMAL=Normal
;if (keyword_set(NoWait) or (Wait and (!mouse.button gt 0))) then $
; goto, LABEL_DONE
;;;
; PRINTOUT SETUP SECTION ==================================================
;;;
;;;
; Is the PRINT keyword set? Then we have a lot of things to set up. First,
; set up carriage return and line feed variables for the formatted printout,
; and define the titles for the printed values.
;
if keyword_set(Print) then begin
if not(keyword_set(XTitle)) then XTitle = "X = "
if not(keyword_set(YTitle)) then YTitle = "Y = "
Blanks = " "
;;;
; Now, if the XValues and/or YValues keywords are set, then deal with them.
; Also, we may want to suppress the printing of the X or Y values (e.g.,
; XValues=-1 or YValues=-1 sets the ShowX and ShowY variables).
;
ShowX = 1
UseXV = keyword_set(XValues)
if UseXV then begin
XVSt = string(XValues)
XVtop = n_elements(XValues) - 1
XVfmt = "(A" + strtrim(max(strlen(XVst))+3,2) + ")"
if ((XVtop eq 0) and (strtrim(XVSt[0],2) eq '-1')) then ShowX = 0
endif else XVfmt = "(A13)"
if not(ShowX) then XTitle = ''
ShowY = 1
UseYV = keyword_set(YValues)
if UseYV then begin
YVSt = string(YValues)
YVtop = n_elements(YValues) - 1
YVfmt = "(A" + strtrim(max(strlen(YVst)),2) + ")"
if ((YVtop eq 0) and (strtrim(YVSt[0],2) eq '-1')) then ShowY = 0
endif else YVfmt = "(A13)"
if not(ShowY) then YTitle = ''
;;;
; If Print>1, then printout the informative header, which will vary depending
; on the values of the DOWN and CHANGE keywords.
;
if (Print gt 1) and not(NoWait) then begin
print
if Change then begin
print, " Hit any mouse button or move the mouse to exit."
endif else begin
if Down or Wait then begin
print, " Hit any mouse button to exit."
endif else begin
print, ' Mouse Button: LEFT MIDDLE RIGHT'
print, ' Result Action: New Line Exit Exit'
endelse
endelse
print
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -