Open IDL Graphics Windows
QUESTION: How can I tell if a graphics window is still open and available before I try to write graphics into it?
ANSWER: On Windows and UNIX machines you can use the WINDOW_STATE keyword to the DEVICE command. It will return an array containing one element for each possible window. Array element j contains a 1 if window j is open, otherwise it contains a 0.
IDL> Device, Window_State=theseWindows IDL> Print, 'Open Windows: ', Where(theseWindows EQ 1)
You can download the function WindowAvailable from the Coyote Library. Passed a graphics window index number, it will tell you if the window is currently open and available (returns a 1), or not (returns a 0). This function allows you to write code like this:
IF WindowAvailable(1) THEN BEGIN Plot, data ENDIF ELSE BEGIN Window, 1, Title='Plot Window' Plot, data ENDELSE
For a more general solution, you can use an unmanaged draw widget as the graphics window. Here is a small program that creates an unmanaged draw widget for you to write into. The function returns the graphics window index number (which you use with the WSet command to make the window the current graphics window). The parameter drawID is an output parameter that contains the identifier of the draw widget. This is what you will need to know to determine if the graphics window is still open.
FUNCTION Graphics_Window, drawID, XSize=xsize, YSize=ysize IF N_Elements(xsize) EQ 0 THEN xsize = 400 IF N_Elements(ysize) EQ 0 THEN ysize = 400 tlb = Widget_Base() drawID = Widget_Draw(tlb, XSize=xsize, YSize=ysize) Widget_Control, tlb, /Realize Widget_Control, drawID, Get_Value=windowIndex RETURN, windowIndex END
To create a 400 by 600 window and draw a plot into it, you would type this:
wid = Graphics_Window(thisWindow, XSize=400, YSize=600) WSet, wid Plot, data
Later, to test if this is still a good and valid window, you type this:
IF Widget_Info(thisWindow, /Valid_ID) THEN Plot, data
You could automate this process with a small utility routine:
FUNCTION GoodWindow, identifier IF N_Elements(identifier) EQ 0 THEN RETURN, 0 RETURN, Widget_Info(identifier, /Valid_ID) END
Then your code to check if the window is still open looks like this:
IF GoodWindow(thisWindow) THEN Plot, data
Last Updated 24 August 2006