Fanning Consulting Services (25K)

IDL Example Programs

This page was created by the IDL library routine MK_HTML_HELP. For more information on this routine, refer to the IDL Online Help Navigator or type:

     

   ? MK_HTML_HELP

at the IDL command line prompt. Last modified: Sun Nov 03 11:51:43 2002.


List of Routines


Routine Descriptions

ADJUSTPOSITION

[Next Routine] [List of Routines]

 NAME:

       AdjustPosition



 PURPOSE:



       This is a program for interactively adjusting the plot position

       coordinates. The result of the function is a four-element floating

       point array of normalized coordinates, suitable for passing to the

       POSITION keyword of most IDL graphics commands.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics



 CALLING SEQUENCE:



       position = AdjustPosition(startingPosition)



 OPTIONAL INPUTS:



       startingPosition - A four-element array of normalized coordinates

            of the form [x0, y0, x1, y1].



 OUTPUTS:



       position - The adjusted plot position. A four-element array of normalized coordinates.



 INPUT KEYWORDS:



       GROUP_LEADER - The group leader of this program. This keyword

            is required to ensure modal operation when calling from

            another widget program.



       TITLE - The title of the window. "Adjust Plot Position in Window..." by default.



       XOFFSET - The X offset of the program on the display. Calculated from the

            upper left-hand corner of the display.



       YOFFSET - The Y offset of the program on the display. Calculated from the

            upper left-hand corner of the display.



 OUTPUT KEYWORDS:



       CANCEL - Returns a 1 if the user selects the Cancel button. Returns 0 otherwise.

            Note that if the use cancels, the "position" parameter is set to the value of

            the "startingPosition" parameter.



 DEPENDENCIES:



       Reqires FSC_FIELD and FSC_PLOTWINDOW from the Coyote Library:



                     http://www.dfanning.com/programs/fsc_field.pro

                     http://www.dfanning.com/programs/fsc_plotwindow.pro



 MODIFICATION HISTORY:



       Written by David Fanning, March 2001.

(See adjustposition.pro)


ASPECT

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

  ASPECT



 PURPOSE:



  This function calculates and returns the normalized position

  coordinates necessary to put a plot with a specified aspect ratio

  into the currently active graphics window. It works on the display

  output window as well as in a PostScript output window.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



  Graphics



 CALLING SEQUENCE:



  position = ASPECT(aspectRatio)



 INPUTS:



  aspectRatio: A floating point value that is the desired aspect

     ratio (ratio of heigth to width) of the plot in the current

     graphics output window. If this parameter is missing, an aspect

     ratio of 1.0 (a square plot) is assumed.



 KEYWORD PARAMETERS:



  MARGIN:  The margin around the edges of the plot. The value must be

     a floating point value between 0.0 and 0.5. It is expressed in

     normalized coordinate units. The default margin is 0.15.



  WINDOWASPECT: The aspect ratio of the target window. If not provided,

     the value is obtained from the current graphics window.



 OUTPUTS:



  position: A four-element floating array of normalized coordinates.

     The order of the elements is [x0, y0, x1, y1], similar to the

     !P.POSITION system variable or the POSITION keyword on any IDL

     graphic command.



 EXAMPLE:



  To create a plot with an aspect ratio of 1:2 and a margin of

  0.10 around the edge of the output window, do this:



     plotPosition = ASPECT(0.5, Margin=0.10)

     PLOT, Findgen(11), POSITION=plotPosition



  Notice this can be done in a single IDL command, like this:



     PLOT, Findgen(11), POSITION=ASPECT(0.5, Margin=0.10)



 MODIFICATION HISTORY:



  Written by: David Fanning, November 1996.

       Added better error checking, 18 Feb 1997, DWF.

       Added WindowAspect keyword. 10 Feb 2000. DWF

       Added double precision tolerance for aspectRatio. 9 NOV 2001 BT

(See aspect.pro)


CENTERTLB

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       CENTERTLB



 PURPOSE:



       This is a utility routine to position a widget program

       on the display at an arbitrary location. By default the

       widget is centered on the display.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Utilities



 CALLING SEQUENCE:



       CenterTLB, tlb, [x, y, /NOCENTER]



 REQUIRED INPUTS:



       tlb: The top-level base identifier of the widget program.



 OPTIONAL INPUTS:



       x:  Set this equal to a normalized position for the center

       of the widget as measured from the left-hand side of the screen.

       The default value is 0.5 (the center)  Setting this equal to 1.0

       places the widget at the far right-hand side of the screen.



       y:  Set this equal to a normalized position for the center

       of the widget as measured from the bottom of the screen.

       The default value is 0.5 (the center) Setting this equal to 1.0

       places the widget at the top of the screen.



 KEYWORDS:



      NOCENTER:  By default, the center of the widget is positioned at the

      location specified by the x and y parameters.  If NOCENTER is set

      to a non-zero value, then the upper left corner of the widget

      is postioned at the specifed location.



 PROCEDURE:



       The program should be called after all the widgets have

       been created, but just before the widget hierarchy is realized.

       It uses the top-level base geometry along with the display size

       to calculate offsets for the top-level base that will center the

       top-level base on the display.



 COMMENT:

       Regardless of the values set for x, y and NOCENTER, the widget

       is not permitted to run off the display.



 MODIFICATION HISTORY:



       Written by:  Dick Jackson, 12 Dec 98.

       Modified to use device-independent Get_Screen_Size

            function. 31 Jan 2000. DWF.

       Added x, y, NOCENTER and run-off protection. 26 Jan 2001. BT.



###########################################################################



 LICENSE



 This software is OSI Certified Open Source Software.

 OSI Certified is a certification mark of the Open Source Initiative.



 Copyright © 1998-2000 Fanning Software Consulting



 This software is provided "as-is", without any express or

 implied warranty. In no event will the authors be held liable

 for any damages arising from the use of this software.



 Permission is granted to anyone to use this software for any

 purpose, including commercial applications, and to alter it and

 redistribute it freely, subject to the following restrictions:



 1. The origin of this software must not be misrepresented; you must

    not claim you wrote the original software. If you use this software

    in a product, an acknowledgment in the product documentation

    would be appreciated, but is not required.



 2. Altered source versions must be plainly marked as such, and must

    not be misrepresented as being the original software.



 3. This notice may not be removed or altered from any source distribution.



 For more information on Open Source Software, visit the Open Source

 web site: http://www.opensource.org.



###########################################################################

(See centertlb.pro)


CHGCOLOR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       CHGCOLOR



 PURPOSE:

       The purpose of this routine is to allow the user to change

       the color at a particular color index. The user is able to

       mix their own color by manipulating red, green, and blue

       sliders. This routine is ideal for changing axes or background

       colors of a plot, for example. The routine works on 8-bit,

       16-bit, and 24-bit displays.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Widgets, Colors.



 CALLING SEQUENCE:

       CHGCOLOR, index



 REQUIRED INPUTS:

       INDEX: The color index to be changed. It must be a value

       between 0 and 255.



 KEYWORD PARAMETERS:



       LABEL: Text that goes next to the color window. The default is

       "Resulting Color".



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       NOTIFYID: A a 2 column by n row array that contains the IDs of widgets

       that should be notified when CHGCOLOR changes a color. The first

       column of the array contains widgets that should be notified. The

       second column contains IDs of widgets that are at the top of the

       hierarch in which the corresponding widgets in the first column

       are located. (The purpose of the top widget IDs is to make it

       possible for the widget in the first column to get the "info"

       structure of the widget program.) An CHGCOLOR_LOAD event will be

       sent to the widget identified in the first column. The event

       structure is defined like this:



       event = {CHGCOLOR_LOAD, ID:0L, TOP:0L, HANDLER:0L, $

          r:(!D.N_COLORS < 256), g:(!D.N_COLORS < 256), b:(!D.N_COLORS < 256)}



       The ID field will be filled out with NOTIFYID(0, n) and the TOP

       field will be filled out with NOTIFYID(1, n).



       TITLE: This is the window title. It is "Modify Drawing Color" by

       default. The program is registered with the name "chgcolor " plus

       the TITLE string. The register name is checked before the widgets

       are defined. This gives you the opportunity to have multiple copies

       of CHGCOLOR operating simultaneously. (For example, one will change

       the background color and one will change the plotting color.)



       XOFFSET: This is the X offset of the program on the display. The

       program will be placed approximately in the middle of the display

       by default.



       YOFFSET: This is the Y offset of the program on the display. The

       program will be placed approximately in the middle of the display

       by default.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       Color at the specified index is changed. Events are sent to widgets

       if the NOTIFYID keyword is used.



 RESTRICTIONS:

       None.



 EXAMPLE:

       To change the background color of a plot, type:



       CHGCOLOR, !P.Background



       To see a more complete example, look at the program SLICE

       in the Coyote Software Library:



          ftp://ftp.frii.com/pub/dfanning/outgoing/idl_examples



 MODIFICATION HISTORY:

       Written by David Fanning, 23 April 97.

       12 May 97, Fixed a bug in the way colors were loaded when

          a tracking event occurred. DWF

       13 May 97, Added a JUST_REGISTER keyword and set it up for

          running in IDL 5.0 as a non-blocking widget.

       27 Sept 98. Fixed problems caused by IDL 5.1 color changes.

       27 Sept 98. Removed JUST_REGISTER keyword. Made widget non-blocking.

       03 Nov 98. Modified layout and added slider ganging. DWF.

(See chgcolor.pro)


CINDEX

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       CIndex



 PURPOSE:

       This is a program for viewing the current colors in the

       colortable with their index numbers overlayed on each color.

       On 24-bit systems you must click the cursor in the graphics window

       to see the colors in the current color table.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY: Graphics



 CALLING SEQUENCE:  CIndex



 INPUTS:   None.



 Optional Inputs:   None



 OUTPUTS:  None



 OPTIONAL OUTPUTS:  None



 KEYWORD Parameters:   None



 COMMON BLOCKS:  None



 SIDE EFFECTS:   None



 RESTRICTIONS:   Reqires XCOLORS and TVIMAGE from the Coyote Library:



                     http://www.dfanning.com/programs/xcolors.pro

                     http://www.dfanning.com/programs/xtvimage.pro



 PROCEDURE:



  Draws a 31x25 set of small rectangles in 256 different colors.

  Writes the color index number on top of each rectangle.



 MODIFICATION HISTORY:  Written by David Fanning, May 1995



  Widgetized and made it work in 24-bit color. Colors are

     updated by clicking in window. 22 Oct 98. DWF

  Replace POLYFILL with TV command to avoid underflow error in

     Z-buffer. 8 March 99. DWF

  Fixed a problem with 24-bit devices with color decomposition ON. 15 Feb 2000. DWF.

(See cindex.pro)


CLIPBOARD

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       CLIPBOARD



 PURPOSE:



       The purpose of this program is to copy the contents of a

       graphics window to the clipboard for subsequent pasting into

       applications such as Photoshop or Powerpoint.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



      Graphics.



 CALLING SEQUENCE:



      CLIPBOARD, window_index



 OPTIONAL INPUTS:



       window_index:    The window index number of the graphics window to

                        copy. If absent, the current graphics window is used

                        by default.



 KEYWORDS:



       All COLOR_QUAN keywords are allowed. In particular, if you are

       taking snapshots of line plots with few colors in them, you may

       get better results by calling the program with the CUBE=6 keyword

       set. Otherwise, white colors can sometimes be a bit gray.



 OUTPUTS:

       None.



 COMMON BLOCKS:

       None.



 DEPENDENCIES:



       Uses the IDLgrClipboard object introduced in IDL 5.2(?).



 PROCEDURE:



       Copies the window contents to a clipboard object.



 EXAMPLE:



        IDL> Window

        IDL> Plot, Findgen(11)

        IDL> CLIPBOARD



 RESTRICTIONS:



       May not work for all applications. Applications tested successfully

       include: Framemaker, Powerpoint, Photoshop, Excel, Microsoft Word.

       Converts 24-bit images to 2D images with color tables.



 MODIFICATION HISTORY:



       Written by: David W. Fanning, 24 October 2001.

       Added _EXTRA keyword to pass COLOR_QUAN keywords along. 28 Oct 2002. DWF.

(See clipboard.pro)


COLOR24

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       COLOR24



 PURPOSE:



       The purpose of this function is to convert a RGB color triple

       into the equivalent 24-bit long integer. The 24-bit integer

       can be decomposed into the appropriate color by interpreting

       the lowest 8 bits as red, the middle 8 bits as green, and the

       highest 8 bits as blue.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



       Graphics, Color Specification.



 CALLING SEQUENCE:



       color = COLOR24(rgb_triple)



 INPUTS:



       RGB_TRIPLE: A three-element column or row array representing

       a color triple. Or an N-by-three element array of color triples.

       The values of the elements must be between 0 and 255.



 KEYWORD PARAMETERS:

       None.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 RESTRICTIONS:

       None.



 EXAMPLE:



       To convert the color triple for the color YELLOW,

       (255, 255, 0), to the hexadecimal value '00FFFF'x

       or the decimal number 65535, type:



       color = COLOR24([255, 255, 0])



       This routine was written to be used with device-independent

       color programs like GETCOLOR.



 MODIFICATION HISTORY:



       Written by:  David Fanning, 3 February 96.

       Completely revised the algorithm to accept color arrays. 19 October 2000. DWF.

(See color24.pro)


COLORBAR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   COLORBAR



 PURPOSE:

       The purpose of this routine is to add a color bar to the current

       graphics window.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:

       Graphics, Widgets.



 CALLING SEQUENCE:

       COLORBAR



 INPUTS:

       None.



 KEYWORD PARAMETERS:



       BOTTOM:   The lowest color index of the colors to be loaded in

                 the bar.



       CHARSIZE: The character size of the color bar annotations. Default is 1.0.



       COLOR:    The color index of the bar outline and characters. Default

                 is !P.Color..



       DIVISIONS: The number of divisions to divide the bar into. There will

                 be (divisions + 1) annotations. The default is 6.



       FONT:     Sets the font of the annotation. Hershey: -1, Hardware:0, True-Type: 1.



       FORMAT:   The format of the bar annotations. Default is '(I5)'.



       INVERTCOLORS: Setting this keyword inverts the colors in the color bar.



       MAXRANGE: The maximum data value for the bar annotation. Default is

                 NCOLORS.



       MINRANGE: The minimum data value for the bar annotation. Default is 0.



       MINOR:    The number of minor tick divisions. Default is 2.



       NCOLORS:  This is the number of colors in the color bar.



       POSITION: A four-element array of normalized coordinates in the same

                 form as the POSITION keyword on a plot. Default is

                 [0.88, 0.10, 0.95, 0.90] for a vertical bar and

                 [0.10, 0.88, 0.90, 0.95] for a horizontal bar.

;

       RANGE:    A two-element vector of the form [min, max]. Provides an

                 alternative way of setting the MINRANGE and MAXRANGE keywords.



       RIGHT:    This puts the labels on the right-hand side of a vertical

                 color bar. It applies only to vertical color bars.



       TITLE:    This is title for the color bar. The default is to have

                 no title.



       TOP:      This puts the labels on top of the bar rather than under it.

                 The keyword only applies if a horizontal color bar is rendered.



       VERTICAL: Setting this keyword give a vertical color bar. The default

                 is a horizontal color bar.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       Color bar is drawn in the current graphics window.



 RESTRICTIONS:

       The number of colors available on the display device (not the

       PostScript device) is used unless the NCOLORS keyword is used.



 EXAMPLE:

       To display a horizontal color bar above a contour plot, type:



       LOADCT, 5, NCOLORS=100

       CONTOUR, DIST(31,41), POSITION=[0.15, 0.15, 0.95, 0.75], $

          C_COLORS=INDGEN(25)*4, NLEVELS=25

       COLORBAR, NCOLORS=100, POSITION=[0.15, 0.85, 0.95, 0.90]



 MODIFICATION HISTORY:

       Written by: David Fanning, 10 JUNE 96.

       10/27/96: Added the ability to send output to PostScript. DWF

       11/4/96: Substantially rewritten to go to screen or PostScript

           file without having to know much about the PostScript device

           or even what the current graphics device is. DWF

       1/27/97: Added the RIGHT and TOP keywords. Also modified the

            way the TITLE keyword works. DWF

       7/15/97: Fixed a problem some machines have with plots that have

            no valid data range in them. DWF

       12/5/98: Fixed a problem in how the colorbar image is created that

            seemed to tickle a bug in some versions of IDL. DWF.

       1/12/99: Fixed a problem caused by RSI fixing a bug in IDL 5.2. Sigh... DWF.

       3/30/99: Modified a few of the defaults. DWF.

       3/30/99: Used NORMAL rather than DEVICE coords for positioning bar. DWF.

       3/30/99: Added the RANGE keyword. DWF.

       3/30/99: Added FONT keyword. DWF

       5/6/99: Many modifications to defaults. DWF.

       5/6/99: Removed PSCOLOR keyword. DWF.

       5/6/99: Improved error handling on position coordinates. DWF.

       5/6/99. Added MINOR keyword. DWF.

       5/6/99: Set Device, Decomposed=0 if necessary. DWF.

       2/9/99: Fixed a problem caused by setting BOTTOM keyword, but not NCOLORS. DWF.

       8/17/99. Fixed a problem with ambiguous MIN and MINOR keywords. DWF

       8/25/99. I think I *finally* got the BOTTOM/NCOLORS thing sorted out. :-( DWF.

       10/10/99. Modified the program so that current plot and map coordinates are

            saved and restored after the colorbar is drawn. DWF.

       3/18/00. Moved a block of code to prevent a problem with color decomposition. DWF.

       4/28/00. Made !P.Font default value for FONT keyword. DWF.

       9/26/00. Made the code more general for scalable pixel devices. DWF.

       1/16/01. Added INVERTCOLORS keyword. DWF.

(See colorbar.pro)


COLORBAR__DEFINE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       COLORBAR__DEFINE



 PURPOSE:

       The purpose of this routine is to implement a COLORBAR object

       class. The ColorBar is rendered in the direct graphics system.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Graphics.



 CALLING SEQUENCE:

       colorbar = Obj_New("COLORBAR")



 INPUTS:

       All inputs to the program are via keyword parameters.



 KEYWORD PARAMETERS:



   Background: Background color. This is the color with which the colorbar is

               erased. The default color is !P.Background.

   Bottom: Bottom color index of colors allocated to colorbar.

   Charsize: Character size of annotation. Default is 1.0.

   Color: Color of annotation and outline. Default is !P.Color.

   Font: Font to use for annotation. Default is -1, Hershey fonts.

   Format: Format of annotation. Default is "(F8.2)".

   Major: The number of major tick intervals. Default is 5.

   Minor: The number of minor tick intervals. Default is 2.

   MinusOne: Set this keyword to choose MinusOne keyword on the Congrid command

               that resizes the colorbar into the window.

   NColors: The number of colors allocated to colorbar. Default is (256 <

            !D.N_Colors).

   Neighbor: Set to indicate Nearest Neighbor sampling for Congrid. Default is

             0 (Bilinear).

   Position: The position of colorbar in normalized coordinates. Default for a

             horizontal colorbar is [0.15, 0.88, 0.85, 0.95]. Default for a

             vertical colorbar is [0.88, 0.15, 0.95, 0.85]. These defaults are

             designed for a 400 by 400 window.

   Range: The data range on colorbar. Default is [0, 255].

   TickLen: The length of tick marks. Default is -0.1

   TickV:   Locations for the tick marks in data units. This is the same as

            the [XY]TickV keyword. Default is to do what IDL would do

            normally.

   Vertical: Set this keyword if you want a vertical colorbar. Default is

             horizontal.

   XEraseBox: A five-element vector of X points (normalized) for erasing the

              colorbar plot. Normally this keyword will not have to be used.

              The program uses the plot REGION for erasing. But larger

              character sizes can result in annotation going outside the

              region enclosed by the plot. If that is the case, then use this

              keyword along with YEraseBox to specify a larger-than-normal

              erasure area. The points are sent to the POLYFILL command for

              erasing.



                 POLYFILL, xEraseBox, yEraseBox, /Normal, Color=background



   YEraseBox: A five-element vector of Y points (normalized) for erasing the

              colorbar plot.



 OBJECT METHODS:



   Clamp: This procedure method allows the color bar range to be "clamped"

          to a particular data range.



   Draw: This procedure method draws the colorbar in the display window. The

         ERASE keyword to this method will erase the current colorbar (by

         calling the ERASE method) before drawing the colorbar in the display

         window.



               colorbar->Draw



   Erase: This procedure method erases the colorbar object in the window. It

          accomplishes this by performing a POLYFILL in the background color.

          This method is primarily useful for interactive graphics display

          devices.

               colorbar->Erase



   GetProperty: This procedure method allows one to obtain the current state

                of the object via the keyword parameters listed above.



               colorbar->GetProperty, Range=currentRange, Title=currentTitle

               Print, currentRange, currentTitle



   SetProperty: This procedure method allows one to set the properties of the

                colorbar object via the keywords described above. In addition,

                a DRAW and ERASE keyword are provided so that the colorbar can

                be immediately drawn when the new property is set.



               colorbar->SetProperty, Range=[500, 15000], /Erase, /Draw



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       The display window is not erased first.



 RESTRICTIONS:

       None.



 EXAMPLE:

       To create a colorbar, use it, then destroy it, type:



       colorbar = Obj_New("COLORBAR", Title='Colorbar Values', Range=[0,1000],$

                  Format='(I4)')

       Window

       LoadCT, 5

       colorbar->Draw

       colorbar->SetProperty, Range=[0,500], /Erase, /Draw

       Obj_Destroy, colorbar



 MODIFICATION HISTORY:

       Written by: David Fanning, Fanning Software Consulting,

                   26 November 1998.

       Added Horizontal keyword to SetProperty method and fixed problem in

       going from Vertical to Horizontal color bars. 29 Nov 1998. DWF.

       Added LoadCT method and current color table index to object.

             6 December 1998.

       Fixed a bug dealing with nearest neighbor resampling. 30 Mar 1999. DWF.

       Fixed a bug with how NCOLORS and BOTTOM keywords interacted.

             29 Aug 1999. DWF.

       10 Oct 99. Modified the program so that current plot and map coordinates

                are saved and restored after the colorbar is drawn. DWF.

       26 May 2000 Added {XY}TICKV capability to the draw method. This

                required adding TickV to the object data structure, and to the

                INIT, GetProperty and SetProperty methods.

                Changed default tick length to -0.1. DWF (and Jack Saba)

       18 Nov 2001. Added Clamp method. DWF.

(See colorbar__define.pro)


CONTRASTZOOM

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       CONTRASTZOOM



 PURPOSE:



       The purpose of this program is to demonstrate how to

       zoom an image "in place" and how to window and level

       (set "contrast and brightness") an image using object

       graphics functionality. The exercise involves using

       multiple views in an object graphics scene, and being

       able to interact with different views in different ways.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Widgets, Object Graphics.



 CALLING SEQUENCE:



       ContrastZoom, image



 REQUIRED INPUTS:



       None. The image "mr_knee.dcm" from the examples/data directory

       is used if no data is supplied in call.



 OPTIONAL INPUTS



       image: A 2D image array of any data type.



 OPTIONAL KEYWORD PARAMETERS:



       COLORTABLE: The number of a color table to use as the image palette.

       Color table 0 (grayscale) is used as a default.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



 COMMON BLOCKS:



       None.



 SIDE EFFECTS:



       None.



 RESTRICTIONS:



       None. The Coyote Library program VCOLORBAR is included.



 EXAMPLE:



       To use this program with your 8-bit image data and a red-temperature

       color scale, type:



          IDL> ContrastZoom, image, Colortable=3



 NOTES:



       The left image is used to "zoom" into a portion of the image.

       The aspect ratio of the sub-image is always preserved. To see

       the entire image, click and release the mouse button in this

       window.



       The center image is used to adjust the contrast and brightness

       (sometimes called the "window" and "level" of the image. Click and

       drag the mouse vertically to set contrast. Click and drag the mouse

       horizontally to set brightness. To return to original values (25%

       contrast and 75% brightness), click and release in the center image.



       The color bars shows the image values of the image.



 MODIFICATION HISTORY:



       Written by David Fanning, 18 November 2001.

       Added second colorbar to show the relationship of the clamped

          colors to the overall image values. 19 November 2001. DWF.

(See contrastzoom.pro)


COYOTE_FIELD

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   COYOTE_FIELD



 PURPOSE:



   The purpose of this compound widget is to provide an alternative

   to the CW_FIELD widget offered in the IDL distribution. What has

   always annoyed me about CW_FIELD is that the text widgets do not

   look editable to the users on Windows platforms. This program

   corrects that deficiency and adds some features that I think

   would be helpful. For example, you can now assign an event handler

   to the compound widget.



 AUTHOR:

   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   General programming.



 CALLING SEQUENCE:



   fieldID = COYOTE_Field(parent, Title='X Size: ", Value=256, /IntegerValue)



 INPUT PARAMETERS:



   parent -- The parent widget ID of the compound widget. Required.



 INPUT KEYWORDS:



   Column -- Set this keyword to have the Label Widget above the Text Widget.

   CR_Only -- Set this keyword if you only want Carriage Return events. If

              this keyword is not set, all events are returned. No events

              are returned unless the EVENT_PRO or EVENT_FUNC keywords are used.

   DoubleValue -- Set this keyword if you want DOUBLE values returned.

   Decimal -- Set this keyword to the number of digits to the right of the decimal

              point in FLOATVALUE and DOUBLEVALUE numbers.

   Digits -- Set this keyword to the number of digits permitted in INTERGERVALUE and LONGVALUE numbers.

   Event_Func -- Set this keyword to the name of an Event Function. If this

                 keyword is undefined and the Event_Pro keyword is undefined,

                 all compound widget events are handled internally and not

                 passed on to the parent widget.

   Event_Pro -- Set this keyword to the name of an Event Procedure. If this

                keyword is undefined and the Event_Func keyword is undefined,

                all compound widget events are handled internally and not

                passed on to the parent widget.

   FieldFont -- The font name for the text in the Text Widget.

   FloatValue -- Set this keyword for FLOAT values.

   Frame -- Set this keyword to put a frame around the compound widget.

   IntegerValue -- Set this keyword for INTEGER values.

   LabelFont -- The font name for the text in the Label Widget.

   LabelSize -- The X screen size of the Label Widget.

   LongValue -- Set this keyword for LONG values.

   Row=row -- Set this keyword to have the Label beside the Text Widget. (The default.)

   Scr_XSize -- The X screen size of the compound widget.

   Scr_YSize -- The Y screen size of the compound widget.

   StringValue -- Set this keyword for STRING values. (The default.)

   Title -- The text to go on the Label Widget.

   UValue -- A user value for any purpose.

   Value -- The "value" of the compound widget.

   XSize -- The X size of the Text Widget.



 COMMON BLOCKS:



   None.



 RESTRICTIONS:



   None.



 EVENT STRUCTURE:



   All events are handled internally unless either the Event_Pro or Event_Func

   keywords are used to assign an event handler to the compound widget. By

   default all events generated by the text widget are passed to the assigned

   event handler. If you wish to receive only Carriage Return events, set the

   CR_Only keyword.



   event = { COYOTE_FIELD, $      ; The name of the event structure.

             ID: 0L, $            ; The ID of the compound widget's top-level base.

             TOP: 0L, $           ; The widget ID of the top-level base of the hierarchy.

             HANDLER: 0L, $       ; The event handler ID. Filled out by IDL.

             Value: Ptr_New(), $  ; A pointer to the widget value.

             Type:""              ; A string indicating the type of data in the VALUE field.

           }                      ; Values are "INT", "LONG", "FLOAT", "DOUBLE", or "STRING".



 EXAMPLE:



   An example program is provided at the end of the COYOTE_FIELD code. To run it,

   type these commands:



      IDL> .Compile COYOTE_Field

      IDL> Example



 MODIFICATION HISTORY:



   Written by: David Fanning, 17 NOV 1999.

   Added check to make float and double values finite. 18 NOV 1999. DWF.

   Fixed a bug when selecting and deleting all numerical text. 19 NOV 1999. DWF.

   Added DECIMAL and DIGITS keywords. 2 Jan 2000. DWF.

   Added the POSITIVE keyword. 12 Jan 2000. DWF.

   Fixed a few minor bugs with delete and digits. 12 Jan 2000. DWF.

   Made GET_VALUE function return pointer to data, instead of data. 12 Jan 2000. DWF.

   Fixed a small typo: "aveDecimal" to "haveDecimal". 10 March 2000. DWF.

   Fixed a small problem with the Example program. 7 Oct 2000. DWF.

(See coyote_field.pro)


CW_DRAWCOLOR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       CW_DRAWCOLOR



 PURPOSE:



       This compound widget is used to place a label or color name next

       to a color patch. Clicking on the color patch allows the user

       to select another color



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics



 CALLING SEQUENCE:



       colorpatchID = CW_DrawColor(parent)



 REQUIRED INPUTS:



       parent - The identifier of a parent base widget.



 OUTPUTS:



       colorpatchID - The widget identifier of the top-level base of this compound widget



 INPUT KEYWORDS:



   COLOR - The name of the color to be displayed. Color names come from PickColorName.

   COLUMN - Set this keyword to stack widgets in a column. Default is in a row.

   EVENT_FUNC - The name of an event handler function for this compound widget.

   EVENT_PRO -The name of an event handler procedure for this compound widget.

   INDEX - An index number where the color should be loaded. !D.Table_Size-2, by default.

   LABEL_LEFT - Set this keyword to have the label text aligned on the left of the label. Default is to center.

   LABEL_RIGHT - Set this keyword to have the label text aligned on the right of the label. Default is to center.

   LABELSIZE - This is the X size of the label widget (containing the label) in device coordinates. Default is natural size.

   LABELTEXT - This is the text on the label. Example, "Background Color", etc.

   TITLE - This is the title on the PickColorName program that allows the user to select another color.

   UVALUE - A user value for the widget.

   XSIZE - The xsize (in pixel units) of the color patch. By default, 20.

   YSIZE - The xsize (in pixel units) of the color patch. By default, 20.



 OUTPUT KEYWORDS:



   OBJECT - The object reference. Use this to call methods, etc.



 DEPENDENCIES:



       Reqires FSC_COLOR and PICKCOLORNAME from the Coyote Library:



                     http://www.dfanning.com/programs/fsc_color.pro

                     http://www.dfanning.com/programs/pickcolorname.pro



 MODIFICATION HISTORY:



       Written by David Fanning, March 2001.

(See cw_drawcolor.pro)


DRAWCOLORS

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   DRAWCOLORS



 FILENAME:



   drawcolors__define.pro



 PURPOSE:



   The purpose of this object program is provide a flexible way

   to handle and select drawing colors. The program combines

   features of two previous programs: GetColor and PickColor,

   as well as adding features of its own. Sixteen original

   colors are supplied, but users can create any color they

   wish using the tools provided.



   By default, these 16 colors are defined: Black, Magenta, Cyan, Yellow,

   Green, Red, Blue, Navy, Aqua, Pink, Orchid, Sky, Beige, Charcoal, Gray, White.



 AUTHOR:

   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   2642 Bradbury Court

   Fort Collins, CO 80521 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   General programming.



 CALLING SEQUENCE:



   colors = Obj_New('DRAWCOLORS')



 OPTIONAL INPUT PARAMETERS:



      IDL> colors = Obj_New('DRAWCOLORS', red, green, blue, names)



   RED -- A 16-element byte vector of red values for the drawing colors.



   GREEN -- A 16-element byte vector of green values for the drawing colors.



   BLUE -- A 16-element byte vector of blue values for the drawing colors.



   NAMES -- A 16-element string vector of names for the drawing colors.



   By default, these colors are defined: Black, Magenta, Cyan, Yellow,

   Green, Red, Blue, Navy, Aqua, Pink, Orchid, Sky, Beige, Charcoal, Gray, White.



 COMMON BLOCKS:



   None.



 RESTRICTIONS:



   If you are going to use the XCOLORS method, you will need

   the XColors program from the Coyote library:



     http://www.dfanning.com/programs/xcolors.pro



   The program is set up to handle 16 drawing colors. You may

   modify the program to have a different number, but you will

   have to modify the code in two places: (1) in the drawcolors__define

   module and (2) in the INIT method.



 FUNCTION METHODS:



   COLOR24 ***************************************************************************



      Purpose:



       Turns a color triple into the equivalent 24-bit color integer value that

       can be decomposed into the color.



      Definition:



          FUNCTION DrawColors::Color24, theColor



     Parameters:



        theColor -- A 3-element vector, representing a color triple.



     Example:



        yellow = colors->GetColor("yellow")

        yellow24 = colors->Color24(yellow)





   GETCOLOR ***************************************************************************



      Purpose:



       Returns the color triple, color index number, or the

       24-bit integer representation, of the asked for color. In

       normal operation, the colors are: Black, Magenta, Cyan, Yellow,

       Green, Red, Blue, Navy, Aqua, Pink, Orchid, Sky, Beige, Charcoal,

       Gray, and White.



      Definition:



          FUNCTION DrawColors::GetColor, theColor, startIndex, INDEXNUMBER=indexnumber, $

             TRUECOLOR=truecolor, AutoDetermine=autodetermine



     Parameters:



        theColor -- A string representing the "name" of the color. If the name

              can't be resolved or found, the first color is returned.



        startIndex -- If present, and INDEXNUMBER is set, the colors are loaded at

              this index number. Otherwise, the self.startIndex is used.



     Keywords:



        AUTODETERMINE -- If this keyword is set. the state of DECOMPOSITION is

             determined (IDL 5.2 and higher) and either the INDEXNUMBER or

             TRUECOLOR keyword is set appropriately. If the decomposition state

             cannot be determined, the INDEXNUMBER keyword is set.



        INDEXNUMBER -- If this keyword is set the colors are loaded and the

             index number of the color is returned.



        TRUECOLOR -- If this keyword is set, the color triple is converted into

             a 24-bit integer before being returned. This keyword is ignored

             if the INDEXNUMBER keyword is set.



     Examples:



        drawColor = colors->GetColor("yellow")

        drawColor = colors->GetColor("blue", /Indexnumber)

        drawColor = colors->GetColor("sky", /Truecolor)





   GETCOLORS **************************************************************************



      Purpose:



       Returns the color triples, the color index numbers of, or the

       24-bit integer representations of, all the colors.



      Definition:



          FUNCTION DrawColors::GetColors, startindex, INDEXNUMBER=indexnumber, $

             TRUECOLOR=truecolor, Structure=structure



      Parameters:



        startIndex -- If present, and INDEXNUMBER is set, the colors are loaded at

              this index number. If absent, startIndex = self.startIndex.



     Keywords:



        INDEXNUMBER -- If this keyword is set the colors are loaded and the

             index numbers of all the colors are returned.



        STRUCTURE -- If this keyword is set, the return value is a structure,

             where each field of the structure is a color name and the value

             of each field is either a color triple, an index number, or a

             24-bit color value, depending upon the state of other keywords.



        TRUECOLOR -- If this keyword is set, the color triples are converted to

             24-bit integers before being returned. This keyword is ignored

             if the INDEXNUMBER keyword is set.



     Examples:



        drawColors = colors->GetColors()  ; drawColors is a 16-by-3 byte array.

        drawColors = colors->GetColors(/IndexNumber) ; drawColors is a 16-element array of color indices.

        drawColors = colors->GetColors(/TrueColor) ; drawColors is a 16-element array of 24-bit integers.

        drawColors = colors->GetColors(/IndexNumber, /Structure) ; drawColors is a structure of index numbers.

        Plot, data, Color=drawColors.yellow, Background=drawColors.charcoal





   SELECT  **************************************************************************



      Purpose:



       Puts up a blocking or modal widget dialog, allowing the user to select

       from one of the 16 predefined colors available, or to mix their own color.

       The user-defined color triple is returned as a result of the function.



      Definition:



          FUNCTION DrawColors::Select, Color=currentColor, StartIndex=startIndex, $

             Title=title, Group_Leader=groupLeader, Cancel=cancelled, TrueColor=truecolor



     Keywords:



        CANCEL -- An output keyword that will return a value of 1 if the CANCEL

             button is selected or if program operation is interrupted in any way.



        COLOR -- The index number in the color table, where the current color

             will be mixed. In other words, this color index will change when

             the program is on the display. It will be restored to its previous

             or entry color when the program exits.



        GROUP_LEADER -- The group leader for the program. This keyword *must*

             be set if calling this method from within a widget program if you

             expect MODAL program operation.



        NAME -- If this keyword is set, the return value of the function is

             the "name" of the color.



        STARTINDEX -- This is the starting index in the color table where the

             16 predetermined colors will be loaded. The original colors will

             be restored when the program exits. By default, this is set to

             !D.Table-Size - (NCOLORS + 1).



        TITLE -- The title of the program. By default: "Pick a Color"



        TRUECOLOR -- If this keyword is set, the return value of the function

            is a 24-bit eqivalent integer rather than the color triple.



     Examples:



        newColor = colors->Select()  ; A blocking widget.

        newColor = color->Select(Group_Leader=event.top, Cancel=cancelled)

        IF NOT cancelled THEN TVLCT, newColor, info.dataColor







 PROCEDURE METHODS:



   GETPROPERTY ***********************************************************************



    Purpose:



       Allows the user to obtain the current properties of the object.



    Definition:



       PRO DrawColors::GetProperty, NAMES=names, RED=red, GREEN=green, BLUE=blue, $

           STARTINDEX=startindex, NCOLORS=ncolors



     Keywords:



        NAMES -- Returns the current names of the colors as a string array.



        RED -- Returns the current red values of the colors.



        GREEN -- Returns the current green values of the colors.



        BLUE -- Returns the current blue values of the colors.



        STARTINDEX -- Returns the current starting index in the color table.



        NCOLORS -- Returns the number of colors.



     Example:



        colors->GetProperty, Names=colorNames

        Print, colorNames





   LOADCOLORS ************************************************************************



      Purpose:



         Loads the predefined colors at a starting index.



      Definition:



         PRO DrawColors::LoadColors, startindex



     Parameters:



        STARTINDEX -- The starting color index in the color table. If not provided,

            is set to !D.Table_Size - (self.ncolors + 1).



     Example:



        colors->LoadColors, 16





   ORIGINALCOLORS *********************************************************************



      Purpose:



         Reloads the original 16 colors and their names



      Definition:



         PRO DrawColors::OriginalColors



     Parameters:



        None



     Example:



        colors->OriginalColors





   REFRESH ***************************************************************************



      Purpose:



         Refreshes the modal GUI with the current drawing colors.



      Definition:



         PRO DrawColors::Refresh



     Parameters:



        None



     Example:



        colors->Refresh





   SETPROPERTY ***********************************************************************



    Purpose:



       Allows the user to set the current properties of the object.



    Definition:



       PRO DrawColors::SetProperty, NAMES=names, RED=red, GREEN=green, BLUE=blue, $

           STARTINDEX=startindex, NCOLORS=ncolors



     Keywords:



        NAMES -- The current names of the colors as a string array.



        RED -- The current red values of the colors.



        GREEN -- The current green values of the colors.



        BLUE -- The current blue values of the colors.



        STARTINDEX -- The current starting index in the color table.



        NCOLORS -- The number of colors.



     Example:



        colorNames = 'Color ' + StrTrim(SIndGen(16),2)

        colors->SetProperty, Names=colorNames





   XCOLORS ***************************************************************************



      Purpose:



         Allows the user to select 16 new colors for the program by

         using the XCOLORS program. The XColors program must be

         somewhere in your !PATH.



      Definition:



         PRO DrawColors::XColors



     Parameters:



        None



     Example:



        colors->XColors



 TUTORIAL:



   Here is a short tutorial in how this object can be used. Note

   that this doesn't exhaust all the possibilities.



  1. Create the object.



     IDL> colors = Obj_New("DrawColors")



  2. Find out what colors it knows about.



     IDL> colors->GetProperty, Names=colorNames

     IDL> Print, colorNames



  3. Ask for a color by name and load it at a color

     index. Draw a plot in that color.



     IDL> yellow = colors->GetColor("yellow")

     IDL> TVLCT, yellow, 200

     IDL> Device, Decomposed=0

     IDL> Plot, Findgen(11), Color=200



  4. Do the same thing, but in DECOMPOSED color.



     IDL> Device, Decomposed=1

     IDL> green = colors->GetColor("green", /TrueColor)

     IDL> Plot, Findgen(11), Color=green



  5. Find the color index number of the sky blue color.



     IDL> Device, Decomposed=0

     IDL> skyIndex = colors->GetColor("sky", /IndexNumber)

     IDL> Plot, Findgen(11), Color=skyIndex



  6. Load all 16 drawing colors at color index 32.



     IDL> colors->LoadColors, 32

     IDL> CIndex ; If them, if you have CINDEX from my library.



  7. Get a structure of colors, with each field set to

     the appropriate index number of its associated color.



     IDL> Device, Decomposed=0

     IDL> col = colors->GetColors(/IndexNumber, /Structure)

     IDL> Plot, Findgen(11), Color=col.yellow, Background=col.charcoal



  8. Allow the user to select a color from a GUI, then

     load it and use it.



     IDL> Device, Decomposed=0

     IDL> theColor = colors->Select(Cancel=cancelled)

     IDL> IF NOT cancelled THEN TVLCT, theColor, 10

     IDL> Plot, Findgen(11), Color=10



  9. Allow the user to choose 16 new drawing colors.

     (Requires my XCOLORS program.)



     IDL> colors->XColors

     IDL> theseColors = colors->Select()



 10. Let the object decide according to the device decomposition

     state whether to return an index number or 24-bit value

     for the color.



     IDL> Plot, Findgen(11), Color=colors->GetColor('beige', /Autodetermine)



 11. Call the GUI from within a widget program and load the

     new color.



     newcolor = info.colors->Select(Group_Leader=event.top, $

        Cancel=cancelled)

     IF NOT cancelled THEN TVLCT, newcolor, info.drawColor



 12. Destroy the object.



     IDL> Obj_Destroy, colors





 MODIFICATION HISTORY:



   Written by: David Fanning, 9 NOV 1999.

   Added AUTODETERMINE keyword to the GetColor method. 10 NOV 1999. DWF.

   Added NAME keyword to SELECT method. 18 MAR 2000. DWF.

   Fixed a small bug in choosing the current color. 20 April 2000. DWF.

(See drawcolors__define.pro)


ERROR_MESSAGE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

    ERROR_MESSAGE



 PURPOSE:



    The purpose of this function  is to have a device-independent

    error messaging function. The error message is reported

    to the user by using DIALOG_MESSAGE if widgets are

    supported and MESSAGE otherwise.



    In general, the ERROR_MESSAGE function is not called directly.

    Rather, it is used in a CATCH error handler. Errors are thrown

    to ERROR_MESSAGE with the MESSAGE command. A typical CATCH error

    handler is shown below.



       Catch, theError

       IF theError NE 0 THEN BEGIN

          Catch, /Cancel

          ok = Error_Message(/Traceback, /Error)

          RETURN

       ENDIF



    Error messages would get into the ERROR_MESSAGE function by

    throwing an error with the MESSAGE command, like this:



       IF test NE 1 THEN Message, 'The test failed.'



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



    Utility.



 CALLING SEQUENCE:



    ok = Error_Message(the_Error_Message)



 INPUTS:



    the_Error_Message: This is a string argument containing the error

       message you want reported. If undefined, this variable is set

       to the string in the !Error_State.Msg system variable.



 KEYWORDS:



    ERROR: Set this keyword to cause Dialog_Message to use the ERROR

       reporting dialog. Note that a bug in IDL causes the ERROR dialog

       to be used whether this keyword is set to 0 or 1!



    INFORMATIONAL: Set this keyword to cause Dialog_Message to use the

       INFORMATION dialog instead of the WARNING dialog. Note that a bug

       in IDL causes the ERROR dialog to be used if this keyword is set to 0!



    TITLE: Set this keyword to the title of the DIALOG_MESSAGE window. By

       default the keyword is set to 'System Error' unless !ERROR_STATE.NAME

       equals "IDL_M_USER_ERR", in which case it is set to "Trapped Error'.



    TRACEBACK: Setting this keyword results in an error traceback

       being printed to standard output with the PRINT command. Set to

       1 (ON) by default. Use TRACEBACK=0 to turn this functionality off.



 OUTPUTS:



    Currently the only output from the function is the string "OK".



 RESTRICTIONS:



    The WARNING Dialog_Message dialog is used by default.



 EXAMPLE:



    To handle an undefined variable error:



    IF N_Elements(variable) EQ 0 THEN $

       ok = Error_Message('Variable is undefined', /Traceback)



 MODIFICATION HISTORY:



    Written by: David W. Fanning, 27 April 1999.

    Added the calling routine's name in the message and NoName keyword. 31 Jan 2000. DWF.

    Added _Extra keyword. 10 February 2000. DWF.

    Forgot to add _Extra everywhere. Fixed for MAIN errors. 8 AUG 2000. DWF.

    Adding call routine's name to Traceback Report. 8 AUG 2000. DWF.

    Added ERROR, INFORMATIONAL, and TITLE keywords. 19 SEP 2002. DWF.

    Removed the requirement that you use the NONAME keyword with the MESSAGE

      command when generating user-trapped errors. 19 SEP 2002. DWF.

    Added distinctions between trapped errors (errors generated with the

      MESSAGE command) and IDL system errors. Note that if you call ERROR_MESSAGE

      directly, then the state of the !ERROR_STATE.NAME variable is set

      to the *last* error generated. It is better to access ERROR_MESSAGE

      indirectly in a Catch error handler from the MESSAGE command. 19 SEP 2002. DWF.

(See error_message.pro)


FIND_BOUNDARY

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       FIND_BOUNDARY



 PURPOSE:



       This program finds the boundary points about a region of interest (ROI)

       represented by pixel indices.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics, math.



 CALLING SEQUENCE:



       boundaryPts = Find_Boundary(indices, XSize=xsize, YSize=ysize)



 OPTIONAL INPUTS:



       indices - A 1D vector of pixel indices that describe the ROI. For example,

            the indices may be returned as a result of the WHERE function.



 OUTPUTS:



       boundaryPts - A 2-by-npoints array of the X and Y points that describe the

            boundary. The points are in the device coodinate system.



 INPUT KEYWORDS:



       SCALE - A one-element or two-element array of the pixel scale factors, [xscale, yscale],

            used to calculate the perimeter length of the boundary. The SCALE keyword is

            used only if the PERIMETER keyword is provided as an output variable. If

            one-element, the same scale factor is used in both the X and Y direction.

            Set to [1.0,1.0] by default.



       XSIZE - The X size of the window or array from which the ROI indices are taken.

            Set to !D.X_Size by default.



       YSIZE - The Y size of the window or array from which the ROI indices are taken.

            Set to !D.Y_Size by default.



 OUTPUT KEYWORDS:



       AREA - A named variable that contains the area enclosed by the boundary points. The

            area is scaled with the SCALE scaling factors. Note that this area can be larger

            than the area of the ROI if the ROI has interior "holes".



       PERIMETER - A named variable that will contain the perimeter length of the boundary

            upon returning from the function.



  EXAMPLE:



       LoadCT, 0, /Silent

       image = BytArr(400, 300)+125

       image[125:175, 180:245] = 255B

       indices = Where(image EQ 255)

       Window, XSize=400, YSize=300

       TV, image

       PLOTS, Find_Boundary(indices, XSize=400, YSize=300, Perimeter=length), $

           /Device, Color=FSC_Color('red')

       Print, length

           230.0



 MODIFICATION HISTORY:



       Written by David W. Fanning, April 2002. Based on an algorithm written by Guy

       Blanchard and provided by Richard Adams.

       Fixed a problem with distinction between solitary points and

          isolated points (a single point connected on a diagonal to

          the rest of the mask) in which the program can't get back to

          the starting pixel. 2 Nov 2002. DWF

       Added the ability to return the perimeter length with PERIMETER and

           SCALE keywords. 2 Nov 2002. DWF.

       Added AREA keyword to return area enclosed by boundary. 2 Nov 2002. DWF.

(See find_boundary.pro)


FIT_ELLIPSE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       Fit_Ellipse



 PURPOSE:



       This program fits an ellipse to an ROI given by a vector of ROI indices.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics, math.



 CALLING SEQUENCE:



       ellipsePts = Fit_Ellipse(indices)



 OPTIONAL INPUTS:



       indices - A 1D vector of pixel indices that describe the ROI. For example,

            the indices may be returned as a result of the WHERE function.



 OUTPUTS:



       ellipsePts - A 2-by-npoints array of the X and Y points that describe the

            fitted ellipse. The points are in the device coodinate system.



 INPUT KEYWORDS:



       NPOINTS - The number of points in the fitted ellipse. Set to 120 by default.



       XSIZE - The X size of the window or array from which the ROI indices are taken.

            Set to !D.X_Size by default.



       YSIZE - The Y size of the window or array from which the ROI indices are taken.

            Set to !D.Y_Size by default.



 OUTPUT KEYWORDS:



       CENTER -- Set to a named variable that contains the X and Y location of the center

            of the fitted ellipse in device coordinates.



       ORIENTATION - Set to a named variable that contains the orientation of the major

            axis of the fitted ellipse. The direction is calculated in degrees

            counter-clockwise from the X axis.



       AXES - A two element array that contains the length of the major and minor

            axes of the fitted ellipse, respectively.



       SEMIAXES - A two element array that contains the length of the semi-major and semi-minor

            axes of the fitted ellipse, respectively.



  EXAMPLE:



       LoadCT, 0, /Silent

       image = BytArr(400, 300)+125

       image[125:175, 180:245] = 255B

       indices = Where(image EQ 255)

       Window, XSize=400, YSize=300

       TV, image

       PLOTS, Fit_Ellipse(indices, XSize=400, YSize=300), /Device, Color=FSC_Color('red')



 MODIFICATION HISTORY:



       Written by David W. Fanning, April 2002. Based on algorithms provided by Craig Markwardt

            and Wayne Landsman in his TVEllipse program.

(See fit_ellipse.pro)


FSC_COLOR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       FSC_COLOR



 PURPOSE:



       The purpose of this function is to obtain drawing colors

       by name and in a device-decomposition independent way. The

       color names and values may be read in as a file, or 88

       color names and values are supplied from the program. These

       were obtained from the file rgb.txt, found on most X-Window

       distributions. Representative colors were chose from across

       the color spectrum. To see a list of colors available, type:

       Print, FSC_Color(/Names).



 AUTHOR:



       FANNING SOFTWARE CONSULTING:

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics, Color Specification.



 CALLING SEQUENCE:



       color = FSC_COLOR(theColor, theColorIndex)



 NORMAL CALLING SEQUENCE FOR DEVICE-INDEPENDENT COLOR:



       axisColor = FSC_COLOR("Green", !D.Table_Size-2)

       backColor = FSC_COLOR("Charcoal", !D.Table_Size-3)

       dataColor = FSC_COLOR("Yellow", !D.Table_Size-4)

       Plot, Findgen(11), Color=axisColor, Background=backColor, /NoData

       OPlot, Findgen(11), Color=dataColor



 OPTIONAL INPUT PARAMETERS:



       TheColor: A string with the "name" of the color. To see a list

           of the color names available set the NAMES keyword. Colors available

           are these:



                Almond   Antique White      Aquamarine           Beige          Bisque           Black

                  Blue     Blue Violet           Brown       Burlywood        Charcoal      Chartreuse

             Chocolate           Coral        Cornsilk            Cyan  Dark Goldenrod       Dark Gray

            Dark Green      Dark Khaki     Dark Orchid     Dark Salmon       Deep Pink     Dodger Blue

             Firebrick    Forest Green            Gold       Goldenrod            Gray           Green

          Green Yellow        Honeydew        Hot Pink      Indian Red           Ivory           Khaki

              Lavender      Lawn Green     Light Coral      Light Cyan      Light Gray    Light Salmon

          Light Yellow      Lime Green           Linen         Magenta          Maroon     Medium Gray

         Medium Orchid        Moccasin            Navy           Olive      Olive Drab          Orange

            Orange Red          Orchid  Pale Goldenrod      Pale Green          Papaya            Peru

                  Pink            Plum     Powder Blue          Purple             Red            Rose

            Rosy Brown      Royal Blue    Saddle Brown          Salmon     Sandy Brown       Sea Green

              Seashell          Sienna        Sky Blue      Slate Gray            Snow    Spring Green

            Steel Blue             Tan         Thistle          Tomato       Turquoise          Violet

            Violet Red           Wheat           White          Yellow



           The color WHITE is used if this parameter is absent. To see a list

           of the color names available in the program, type this:



              Print, FSC_COLOR(/Names)



       TheColorIndex: The color table index where the specified color is loaded.

           The color table index parameter should always be used if you wish to

           obtain a color value in a color-decomposition-independent way in your

           code. See the NORMAL CALLING SEQUENCE for details.



 RETURN VALUE:



       The value that is returned by FSC_COLOR depends upon the keywords

       used to call it and on the version of IDL you are using. In general,

       the return value will be either a color index number where the specified

       color is loaded by the program, or a 24-bit color value that can be

       decomposed into the specified color on true-color systems.



       If you are running IDL 5.2 or higher, the program will determine which

       return value to use, based on the color decomposition state at the time

       the program is called. If you are running a version of IDL before IDL 5.2,

       then the program will return the color index number. This behavior can

       be overruled in all versions of IDL by setting the DECOMPOSED keyword.

       If this keyword is 0, the program always returns a color index number. If

       the keyword is 1, the program always returns a 24-bit color value.



       If the TRIPLE keyword is set, the program always returns the color triple,

       no matter what the current decomposition state or the value of the DECOMPOSED

       keyword. Normally, the color triple is returned as a 1 by 3 column vector.

       This is appropriate for loading into a color index with TVLCT:



          IDL> TVLCT, FSC_Color('Yellow', /Triple), !P.Color



       But sometimes (e.g, in object graphics applications) you want the color

       returned as a row vector. In this case, you should set the ROW keyword

       as well as the TRIPLE keyword:



          viewobj= Obj_New('IDLgrView', Color=FSC_Color('charcoal', /Triple, /Row))



       If the ALLCOLORS keyword is used, then instead of a single value, modified

       as described above, then all the color values are returned in an array. In

       other words, the return value will be either an NCOLORS-element vector of color

       table index numbers, an NCOLORS-element vector of 24-bit color values, or

       an NCOLORS-by-3 array of color triples.



       If the NAMES keyword is set, the program returns a vector of

       color names known to the program.



 INPUT KEYWORD PARAMETERS:



       ALLCOLORS: Set this keyword to return indices, or 24-bit values, or color

              triples, for all the known colors, instead of for a single color.



       DECOMPOSED: Set this keyword to 0 or 1 to force the return value to be

              a color table index or a 24-bit color value, respectively.



       FILENAME: The string name of an ASCII file that can be opened to read in

              color values and color names. There should be one color per row

              in the file. Please be sure there are no blank lines in the file.

              The format of each row should be:



                  redValue  greenValue  blueValue  colorName



              Color values should be between 0 and 255. Any kind of white-space

              separation (blank characters, commas, or tabs) are allowed. The color

              name should be a string, but it should NOT be in quotes. A typical

              entry into the file would look like this:



                  255   255   0   Yellow



       NAMES: If this keyword is set, the return value of the function is

              a ncolors-element string array containing the names of the colors.

              These names would be appropriate, for example, in building

              a list widget with the names of the colors. If the NAMES

              keyword is set, the COLOR and INDEX parameters are ignored.



                 listID = Widget_List(baseID, Value=GetColor(/Names), YSize=16)



       ROW:   If this keyword is set, the return value of the function when the TRIPLE

              keyword is set is returned as a row vector, rather than as the default

              column vector. This is required, for example, when you are trying to

              use the return value to set the color for object graphics objects. This

              keyword is completely ignored, except when used in combination with the

              TRIPLE keyword.



       SELECTCOLOR: Set this keyword if you would like to select the color name with

              the PICKCOLORNAME program. Selecting this keyword automaticallys sets

              the INDEX positional parameter. If this keyword is used, any keywords

              appropriate for PICKCOLORNAME can also be used. If this keyword is used,

              the first positional parameter can be either a color name or the color

              table index number. The program will figure out what you want.



       TRIPLE: Setting this keyword will force the return value of the function to

              *always* be a color triple, regardless of color decomposition state or

              visual depth of the machine. The value will be a three-element column

              vector unless the ROW keyword is also set.



       In addition, any keyword parameter appropriate for PICKCOLORNAME can be used.

       These include BOTTOM, COLUMNS, GROUP_LEADER, INDEX, and TITLE.



 OUTPUT KEYWORD PARAMETERS:



       CANCEL: This keyword is always set to 0, unless that SELECTCOLOR keyword is used.

              Then it will correspond to the value of the CANCEL output keyword in PICKCOLORNAME.



       COLORSTRUCTURE: This output keyword (if set to a named variable) will return a

              structure in which the fields will be the known color names (without spaces)

              and the values of the fields will be either color table index numbers or

              24-bit color values.



       NCOLORS: The number of colors recognized by the program. It will be 88 by default.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 ADDITIONAL PROGRAMS REQUIRED:



   PICKCOLORNAME: This file can be found in the Coyote Library:



             http://www.dfanning.com/programs/pickcolorname.pro



 EXAMPLE:



       To get drawing colors in a device-decomposed independent way:



           axisColor = FSC_COLOR("Green", !D.Table_Size-2)

           backColor = FSC_COLOR("Charcoal", !D.Table_Size-3)

           dataColor = FSC_COLOR("Yellow", !D.Table_Size-4)

           Plot, Findgen(11), Color=axisColor, Background=backColor, /NoData

           OPlot, Findgen(11), Color=dataColor



       To set the viewport color in object graphics:



           theView = Obj_New('IDLgrView', Color=FSC_Color('Charcoal', /Triple))



       To change the viewport color later:



           theView->SetProperty, Color=FSC_Color('Antique White', /Triple)



 MODIFICATION HISTORY:

       Written by: David Fanning, 19 October 2000. Based on previous

          GetColor program.

       Fixed a problem with loading colors with TVLCT on a PRINTER device. 13 Mar 2001. DWF.

       Added the ROW keyword. 30 March 2001. DWF.

       Added the PICKCOLORNAME code to the file, since I keep forgetting to

          give it to people. 15 August 2001. DWF.

(See fsc_color.pro)


FSC_DROPLIST

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   FSC_DROPLIST



 PURPOSE:



   The purpose of this compound widget is to provide an alternative

   to the DROPLIST widget offered in the IDL distribution. What has

   always annoyed me about a droplist is that you can't get the current

   "value" of a droplist easily. This compound widget makes this and

   other tasks much easier.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   General programming.



 CALLING SEQUENCE:



   droplistObj = FSC_Droplist(parent, Title='Animals: ", Value=['Dog'. 'Cat', 'Coyote'], Index=2)



   The return value of the FSC_Droplist (droplistObj in this example) is

   an object reference. Interaction with the droplist will occur through

   object methods.



 INPUT PARAMETERS:



   parent -- The parent widget ID of the compound widget. Required.



 INPUT KEYWORDS:



 Any keyword that is appropriate for the Widget_Droplist function can be used.

 In addition, these keywords are explicitly defined.



   EVENT_FUNC -- Set this keyword to the name of an Event Handler Function.

   EVENT_PRO -- Set this keyword to the name of an Event Handler Procedure.

   FORMAT -- A format specifier for the "format" of the values in the droplist.

   INDEX -- The index number of the current selection.

   SPACES -- A two-element array that indicates the number of blank spaces to be added

             to the the beginning and end of the formatted values. If a single number

             is provided, this number of blank spaces is added to both the beginning

             and the end of the value.

   TITLE -- The title of the droplist widget.

   UNAME -- The user name of the droplist widget. (Only available in IDL 5.2 and higher.)

   UVALUE -- The normal "user value" of the droplist.

   VALUE -- An array of the droplist "selections". May be any data type.



 COMMON BLOCKS:



   None.



 DEPENDENCIES:



   Requires ERROR_MESSAGE from the Coyote Library..



 EVENT STRUCTURE:



   An event is returned each time the droplist value is changed. The event structure

   is defined like this:



   event = { FSC_DROPLIST_EVENT, $ ; The name of the event structure.

             ID: 0L, $             ; The ID of the compound widget's top-level base.

             TOP: 0L, $            ; The widget ID of the top-level base of the hierarchy.

             HANDLER: 0L, $        ; The event handler ID. Filled out by IDL.

             INDEX: 0L, $          ; The index number of the current selection.

             SELECTION:Ptr_New() $ ; A pointer to the current selection "value".

             SELF:Obj_New() }      ; The object reference of the compound widget.



 PUBLIC OBJECT METHODS:



   GetID -- A function with no arguments that returns the widget identifier

      of the droplist widget.



      droplistID = droplistObj->GetID()



   GetIndex -- A function with no arguments that returns the index

      number of the current droplist selection.



      currentIndex = droplistObj->GetIndex()



   GetSelection -- A function with no arguments that returns the current

      droplist selection.



      currentSelection = droplistObj->GetSelection()



   GetUValue -- A function with no arguments that returns the "user value"

      of the compound widget i.e., the value set with the UVALUE keyword).



      myUValue = droplistObj->GetUValue()



   GetValues -- A function with no arguments that returns the "values" or

      "selections" for the droplist.



      possibleSelections = droplistObj->GetValues()



   Resize -- A procedure that sets the X screen size of the droplist. It is

      defined like this:



      PRO Resize, newSize, ParentSize=parentSize



      The "newSize" keyword is the new X screen size. If this argument is

      missing, the screen X size of the compound widget's parent is used.

      The parentSize keyword is an output keyword that returns the X screen

      size of the compound widget's parent.



      droplistObj->Resize, 400



      Note that not all devices (e.g., X Windows devices) support droplist resizing.



   SetIndex -- A procedure that sets the current droplist selection based on

      the given index. This is equivalent to Widget_Control, droplistID, Set_Droplist_Select=newIndex



      droplistObj->SetIndex, newIndex



   SetSelection -- Whereas a regular droplist widget can only be set by index

      number, this compound widget can also be set by a "selection". The new selection

      can be any data type and corresponds to one of the "values" of the droplist.



      droplistObj->SetSelection, newSelection





 EXAMPLE:



   An example program is provided at the end of the FSC_DROPLIST code. To run it,

   type these commands:



      IDL> .Compile FSC_DROPLIST

      IDL> Example



 MODIFICATION HISTORY:



   Written by: David Fanning, 17 Jan 2000. DWF.

   Added FORMAT and SPACES keywords 28 April 2000. DWF.

   Fixed a small problem with event processing when the EVENT_FUNC keyword

      was used. 29 Dec 2000. DWF.

   Attached the UNAME value to the TLB of the compound widget instead

      of to the droplist widget itself. 11 Jan 2001. DWF.

(See fsc_droplist.pro)


FSC_FIELD

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   FSC_FIELD



 PURPOSE:



   The purpose of this compound widget is to provide an alternative

   to the CW_FIELD widget offered in the IDL distribution. One weakness

   of the CW_FIELD compound widget is that the text widgets do not

   look editable to the users on Windows platforms. This program

   corrects that deficiency and adds some features that I think

   will be helpful. For example, you can now assign an event handler

   to the compound widget, ask for positive numbers only, and limit

   the number of digits in a number, or the number of digits to the

   right of a decimal point. The program is written as a widget object,

   which allows the user to call object methods directly, affording

   even more flexibility in use. This program replaces the earlier

   programs FSC_INPUTFIELD and COYOTE_FIELD.



   The program consists of a label widget next to a one-line text widget.

   The "value" of the compound widget is shown in the text widget. If the

   value is a number, it will not be possible (generally) to type

   alphanumeric values in the text widget. String values behave like

   strings in any one-line text widget.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   General programming.



 TYPICAL CALLING SEQUENCE:



   fieldID = FSC_FIELD(parent, Title="X Size:", Value=256, Object=fieldObject, Digits=3)



 INPUT PARAMETERS:



   parent -- The parent widget ID of the compound widget. Required.



 INPUT KEYWORDS:



   COLUMN        Set this keyword to have the Label widget above the Text widget.

                 The default is to have the Label widget in a row with the Text widget.



   CR_ONLY       Set this keyword if you only want Carriage Return events returned to

                 your event handler. If this keyword is not set, all events are returned.

                 Setting this keyword has no effect unless either the EVENT_PRO or

                 EVENT_FUNC keyword is used.



   DECIMAL       Set this keyword to the number of digits to the right of the decimal

                 point in floating point or double precision numbers. Ignored for STRING values.



   DIGITS        Set this keyword to the number of digits permitted in integer numbers.



   EVENT_FUNC    Set this keyword to the name of an event handler function. If this

                 keyword is undefined and the Event_Pro keyword is undefined,

                 all compound widget events are handled internally and not

                 passed on to the parent widget.



   EVENT_PRO     Set this keyword to the name of an event handler procedure. If this

                 keyword is undefined and the Event_Func keyword is undefined,

                 all compound widget events are handled internally and not

                 passed on to the parent widget.



   FIELDFONT     The font name for the text in the text widget.



   FRAME         Set this keyword to put a frame around the compound widget.



   LABEL_LEFT    Set this keyword to align the text on the label to the left.



   LABEL_RIGHT   Set this keyword to align the text on the label to the right.



   LABELFONT     The font name for the text in the label widget.



   LABELSIZE     The X screen size of the label widget.



   NAME          A string containing the name of the object. The default is ''.



   NOEDIT        Set this keyword to allow no user editing of the input text widget.



   NONSENSITIVE  Set this keyword to make the input text widget non-sensitive.



   POSITIVE      Set this keyword if you want only positive numbers allowed.



   SCR_XSIZE     The X screen size of the compound widget.



   SCR_YSIZE     The Y screen size of the compound widget.



   TITLE         The string text placed on the label widget.



   UNDEFINED     Set this keyword to the value to use for "undefined" values. If

                 not set, then !Value.F_NAN is used for numerical fields and a

                 NULL string is used for string fields. This applies to values

                 obtained with the GET_VALUE method or the GET_VALUE function.



   UVALUE        A user value for any purpose.



   VALUE         The "value" of the compound widget. Any type of integer, floating, or string

                 variable is allowed. The data "type" is determined automatically from the

                 value supplied with this keyword. Be sure you set the type appropriately for

                 your intended use of the value.



   XSIZE         The X size of the text widget in the usual character units.



 OUTPUT KEYWORDS:



   OBJECT        Set this keyword to a named variable to receive the compound widget's

                 object reference. This is required if you wish to call methods on the object.

                 Note that the object reference is also available in the event structure

                 generated by the widget object. Note that the object reference will be

                 necessary if you want to get or set values in the compound widget.



 COMMON BLOCKS:



   None.



 RESTRICTIONS:



   None.



 EVENT STRUCTURE:



   All events are handled internally unless either the Event_Pro or Event_Func

   keywords are used to assign an event handler to the compound widget. By

   default all events generated by the text widget are passed to the assigned

   event handler. If you wish to receive only Carriage Return events, set the

   CR_Only keyword.



   event = { FSC_FIELD_EVENT, $   ; The name of the event structure.

             ID: 0L, $            ; The ID of the compound widget's top-level base.

             TOP: 0L, $           ; The widget ID of the top-level base of the hierarchy.

             HANDLER: 0L, $       ; The event handler ID. Filled out by IDL.

             OBJECT: Obj_New(), $ ; The "self" object reference. Provided so you can call methods.

             VALUE: Ptr_New(), $  ; A pointer to the widget value.

             TYPE:""              ; A string indicating the type of data in the VALUE field.

           }



   Note that if the field is "empty", the VALUE will be a pointer

   to an undefined variable. You should check this value before you

   use it. You code will look something like this:



     IF N_Elements(*event.value) EQ 0 THEN $

         Print, 'Current Value UNDEFINED.' ELSE $

         Print, 'Current Value: ', *event.value



 GETTING and SETTING VALUES:



   Almost all the properties of the widget can be obtained or set via

   the object's GetProperty and SetProperty methods (described below).

   Traditional compound widgets have the ability to get and set the "value"

   of the compound widget identifier (e.g., fieldID in the calling

   sequence above). Unfortunately, it is impossible to retreive a variable

   in this way when the variable is undefined. In practical terms, this

   means that the undefined variable must be set to *something*. You can

   determine what that something is with the UNDEFINED keyword, or I will set

   it to !VALUES.F_NAN for numerical fields and to the null string for string

   fields. In any case, you will have to check for undefined variables before

   you try to do something with the value. For a numerical field, the code

   might look something like this:



      fieldID = FSC_FIELD(parent, Title="X Size:", Value=256, Object=fieldObject, Digits=3)

      currentValue = fieldObject->Get_Value()

      IF Finite(currentValue) EQ 0 THEN Print, 'Value is Undefined' ELSE Print, currentValue



   Additional examples are provided in the numerical example fields in Example Program below.



   Setting the value of the compound widget is the same as calling the Set_Value

   method on the object reference. In other words, these two statements are equivalent.



        fieldObject->Set_Value, 45.4

        Widget_Control, fieldID, Set_Value=45.4



   The data type of the value is determined from the value itself. Be sure you set it appropriately.



 OBJECT PROCEDURE METHODS:



   GetProperty -- This method allows various properties of the widget to be

       returned via output keywords. The keywords that are available are:



       CR_Only -- A flag, if set, means only report carriage return events.

       DataType -- The data type of the field variable.

       Decimal -- Set this keyword to the number of digits to the right of the decimal

              point in FLOATVALUE and DOUBLEVALUE numbers.

       Digits -- Set this keyword to the number of digits permitted in INTERGERVALUE and LONGVALUE numbers.

       Event_Func -- The name of the event handler function.

       Event_Pro -- The name of the event handler function.

       Name -- A scalar string name of the object.

       NoEdit -- A 1 means the widget is non-editable.

       NonSensitive -- A 1 means the widget is non-sensitive.

       NonSensitive -- Set this keyword to make the widget non-sensitive.

       Positive -- Indicates if the Positive number flag is set (1) or not (0).

       UValue -- The user value assigned to the compound widget.

       Value -- The "value" of the compound widget.



   MoveTab -- This method moves the focus to the widget identified in the "next" field,

        which must be set with the SetTabNext method. No parameters. Called automatically

        when a TAB character is typed in the text widget.



   Resize -- This method allows you to resize the compound widget's text field.

        The value parameter is an X screen size for the entire widget. The text

        widget is sized by using the value obtained from this value minus the

        X screen size of the label widget.



          objectRef->Resize, screen_xsize_value



   Set_Value -- This method allows you to set the "value" of the field. It takes

       one positional parameter, which is the value.



          objectRef->Set_Value, 5





   SetEdit -- This procedure turns editing on (value of 1) or off (value of 0).



   SetProperty -- This method allows various properties of the widget to be

       set via input keywords. The keywords that are available are:



       CR_Only -- Set this keyword if you only want Carriage Return events.

       Decimal -- Set this keyword to the number of digits to the right of the decimal

              point in FLOATVALUE and DOUBLEVALUE numbers.

       Digits -- Set this keyword to the number of digits permitted in INTERGERVALUE and LONGVALUE numbers.

       Event_Func -- Set this keyword to the name of an Event Function.

       Event_Pro -- Set this keyword to the name of an Event Procedure.

       LabelSize --  The X screen size of the Label Widget.

       Name -- A scalar string name of the object. (default = '')

       NoEdit -- Set this keyword to make the widget non-editable.

       NonSensitive -- Set this keyword to make the widget non-sensitive.

       Positive -- Set this keyword to indicate only positive numbers are allowed.

       Scr_XSize -- The X screen size of the text widget.

       Scr_YSize -- The Y screen size of the text widget.

       Title -- The text to go on the Label Widget.

       UValue -- A user value for any purpose.

       Value -- The "value" of the compound widget.

       XSize -- The X size of the Text Widget.



   SetSensitive -- This procedure turns text widget sensitivity on (value of 1) or off (value of 0).



 OBJECT FUNCTION METHODS:



      Get_Value -- Returns the "value" of the field. No parameters. Will be undefined

          if a "number" field is blank. Should be checked before using:



          IF N_Elements(objectRef->Get_Value()) NE 0 THEN Print, Value is: ', objectRef->Get_Value()



      GetID -- Returns the widget identifier of the compound widget's top-level base.

         (The first child of the parent widget.) No parameters.



      GetLabelSize -- Returns the X screen size of the label widget. No parameters.



      GetTextID -- Returns the widget identifier of the compound widget's text widget.

         No parameters.



      GetTextSize -- Returns the X screen size of the text widget. No parameters.





 PRIVATE OBJECT METHODS:



   Although there is really no such thing as a "private" method in IDL's

   object implementation, some methods are used internally and not meant to

   be acessed publicly. Here are a few of those methods. I list them because

   it may be these private methods are ones you wish to override in subclassed

   objects.



      MoveTab -- This method moves the cursor to end of the text in the widget identified

        by the nexttab field. (This will be set with the SetTabNext method.)



      Text_Events -- The main event handler method for the compound widget. All

        text widget events are processed here.



      ReturnValue -- This function method accepts a string input value and converts

        it to the type of data requested by the user.



      Validate -- This function method examines all text input and removes unwanted

        characters, depending upon the requested data type for the field. It makes it

        impossible, for example, to type alphanumeric characters in an INTEGER field.



 EXAMPLE:



   An example program is provided at the end of the FSC_FIELD code. To run it,

   type these commands:



      IDL> .Compile FSC_Field

      IDL> Example



 MODIFICATION HISTORY:



   Written by: David Fanning, 18 October 2000. Based heavily on an earlier

      FSC_INPUTFIELD program and new ideas about the best way to write

      widget objects.

   Added LABEL_LEFT, LABEL_RIGHT, and UNDEFINED keywords. 29 Dec 2000. DWF.

   Modified the way the value is returned in the GET_VALUE method and the

      GET_VALUE function. Modified Example program to demonstrate. 30 Dec 2000. DWF.

   Added NOEDIT and NONSENSITIVE keywords, with corresponding SETEDIT and SETSENNSITIVE

      methods. 19 Jan 2001. DWF.

   Actually followed through with the changes I _said_" I made 29 Dec 2000. (Don't ask....) 13 June 2001. DWF.

   Added GetTextSize and GetLabelSize methods for obtaining the X screen

      size of the text and label widgets, respectively. 21 July 2001. DWF.

   Fixed a problem in SetProperty method where I was setting self.xsize, which doesn't exist. 24 April 2002. DWF.

(See fsc_field.pro)


FSC_FILESELECT

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   FSC_FILESELECT



 PURPOSE:



   The purpose of this compound widget is to provide a means

   by which the user can type or select a file name. The

   program is written as an "object widget", meaning that

   the guts of the program is an object of class FSC_FILESELECT.

   This is meant to be an example of the obvious advantages of

   writing compound widget programs as objects.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   General programming.



 CALLING SEQUENCE:



   filenameID = FSC_FileSelect(parent)



 INPUT PARAMETERS:



   parent -- The parent widget ID of the compound widget. Required.



 INPUT KEYWORDS:



   Event_Pro -- The event handler procedure for this compound widget.By default: "".

   Event_Func -- The event handler function for this compound widget. By default: "".



      If neither EVENT_PRO or EVENT_FUNC is defined, program events are handled internally by the compound widget.



   DirectoryName -- The initial name of the directory. By defaut: current directory.

   Filename -- The initial file name in the filename text widget.

   Filter -- The file filter. By default: "*".

   Frame -- Set this keyword for a frame around the compound widget.

   LabelFont -- The font for the label widget. By default: "".

   LabelName -- The text on the label widgt. By default: "Filename: ".

   LabelSize -- The X screen size of the label widget. By default: 0.

   MustExist -- A flag that indicates selected files must exist. By default: 0.

   NoMaxSize -- A flag to prohibit automatic text widget sizing. By default: 0.



     If this keyword is not set, the compound widget will automatically resize itself to

     the largest widget in its parent base widget. It will do this by changing the size of

     the text widgets holding the file and directory names.



   Read -- Set this keyword to have file selection for reading a file. By default: 1.

   SelectDirectory -- The default directory for file selection. In other words, this is the

     default directory for DIALOG_PICKFILE, which is accessed via the BROWSE buttons.

   SelectFont -- The font for the "Browse" button. By default: "".

   SelectTitle -- The title bar text on the file selection dialog. By default: "Select a File...".

   TextFont -- The font for the filename text widget. By default: "".

   UValue -- User value for any purpose.

   Write -- Set this keyword to open a file for writing. By default: 0.

   XSize -- The X size of the text widget holding the filename. By default: StrLen(filename) * 1.5 > 40.



 OUTPUT KEYWORDS:



   ObjectRef -- Assign this keyword to an output variable that will hold the internal object reference.

                With the object reference you can call object methods to easily change many properties of

                the compound widget.



 COMMON BLOCKS:



   None.



 RESTRICTIONS:



   Probably doesn't work correctly on VMS systems :-( If you can help, please

   contact me. I don't have a VMS system to test on.



 EVENT STRUCTURE:



   All events are handled internally unless either the Event_Pro or Event_Func

   keywords are used to assign an event handler to the compound widget. All events

   generated by the text widgets are passed to the assigned event handler.



   event = { CW_FILESELECT, $     ; The name of the event structure.

             ID: 0L, $            ; The ID of the compound widget's top-level base.

             TOP: 0L, $           ; The widget ID of the top-level base of the hierarchy.

             HANDLER: 0L, $       ; The event handler ID. Filled out by IDL.

             Basename: "", $      ; The base filename without directory specifiers.

             Filename: "", $      ; The fully qualified filename.

             Directory: "", $     ; The name of the current file directory.

           }



 EXAMPLE:



   An example program is provided at the end of the FSC_FILESELECT code. To run it,

   type these commands:



      IDL> .Compile fsc_fileselect

      IDL> Example



   Or, if you want to obtain the object reference, type this:



      IDL> Example, theObject



   Now you can call the object's methods. For example:



      IDL theObject->SetProperty, XSize=150



 GETTING and SETTING VALUES:



   So as not to disrupt the accepted paradigm in using compound widgets, you

   can use the return value of the FSC_FILESELECT function with WIDGET_CONTROL to

   get and set the "value" of the widget.



       Widget_Control, filenameID, Set_Value='C:\RSI\IDL52\DATA\cyclone.dat'



   The program will automatically separate the file name portion of the value

   from the directory portion and put things in the correct text widgets.



   Similarly, you can get the "value" of the widget:



       Widget_Control, filenameID, Set_Value=theValue

       Print, theValue



           C:\RSI\IDL52\DATA\cyclone.dat



   The return value is the fully qualified file path to the file.



 USING OBJECT METHODS to CHANGE PROGRAM PROPERTIES:



   If you obtain the object reference, you have a great deal more control

   over the properties of the compound widget. You obtain the object reference

   by calling the function like this:



      filenameID = FSC_FILESELECT(parent, ObjectRef=theObject)



 OBJECT PROCEDURE METHODS:



   GetProperty -- This method allows various properties of the widget to be

       returned via output keywords. The keywords that are available are:



      DirectoryName -- The current directory.

      Event_Func -- The name of the event handler function for this compound widget.

      Event_Pro -- The name of the event handler procedure for this compound widget.

      Filename -- The current base filename.

      Filter -- The current file filter.

      LabelName -- The text on the label widget.

      LabelSize -- The X screen size of the label widget.

      MustExist -- A flag that indicates selected files must exist to be selected.

      Parent -- The parent widget of the compound widget.

      Read=read -- The file selection for reading flag.

      SelectTitle -- The title bar text on the file selection dialog.

      TLB -- The top-level base of the compound widget.

      UValue -- The user value of the compound widget.

      Write -- The file selection for writing flag.

      XSize -- The X size of the text widget holding the filename.



   LabelSize -- This method makes sure that the directory name and file name labels

      are the same size. Normally, this procedure is called internally. No parameters.



   MatchSize -- This method resizes the compound widget so that it is as long as the

      the longest widget in the parent base widget. This is done automatically upon

      realization unless the NOMAXSIZE keyword is set. The method aids in writing

      resizeable widget programs.



   SetProperty -- This method allows various properties of the widget to be

       set via input keywords. The keywords that are available are:



      DirectoryName -- The current directory.

      Event_Func -- The name of the event handler function for this compound widget.

      Event_Pro -- The name of the event handler procedure for this compound widget.

      Filename -- The current base filename.

      Filter -- The current file filter.

      LabelName -- The text on the label widget.

      LabelSize -- The X screen size of the label widget.

      MustExist -- A flag that indicates selected files must exist to be selected.

      Read -- The file selection for reading flag.

      SelectTitle -- The title bar text on the file selection dialog.

      UValue -- The user value of the compound widget.

      Write -- The file selection for writing flag.

      XSize -- The X size of the text widget holding the filename.



 OBJECT FUNCTION METHODS:



      GetFileName -- Returns the fully qualified filename. No parameters.



      GetTLB -- Returns the top-level base ID of the compound widget. No Parameters.



      Inspect_DirectoryName -- Inspects the directory name for correctness. Requires one positional parameter.



        directoryName -- The name of the directory from the directory text widget.

        textSelection -- The current text selection position.



        At the moment all this does is remove any blank characters from either

        end of the directory name and makes sure the last character of the directory

        name does not end in a subdirectory specifier (except for VMS).



     Inspect_Filename -- Inspects the file name for correctness. Requires one positional parameter.



        filename -- The name of the file from the filename text widget.

        textSelection -- The current text selection position.



        At the moment all this does is remove any blank characters from either

        end of the file name



 MODIFICATION HISTORY:



   Written by: David W. Fanning, 21 NOV 1999.

   Fixed bug in File Name selection button. 18 MAR 2000. DWF.

   Fixed an error in which directory the Browse buttons should start

       searching. 29 SEP 2000. DWF.

   Previously returned events only for typing in text widgets. Now

       Browse button events are also returned. 29 SEP 2000. DWF.

   Fixed a bug in setting the file filter. 29 SEP 2000. DWF.

   Removed the Directory Browse button 10 AUG 2002. DWF.

   Added ERROR_MESSAGE to error handling. 10 AUG 2002. DWF.

   Changed the ability to specify a file filter as a string array, instead

       of just as a scalar string. This required the use of a pointer, which

       meant that I had to remove the FILTER field from the CW_FILESELECT

       event structure to avoid likely memory leakage. This is a dangerous

       change because it means programs that relied on this (I expect there

       are very, very few) will break and it goes against my philosopy of

       keeping my programs backward compatible. Let me know if you have

       problems. In testing, I discoved no problems in my own code. 31 OCT 2002. DWF.

   Fixed a problem with DIALOG_PICKFILE that sometimes allowed users to change

       directories without selecting a file. 3 Nov 2002. DWF.

(See fsc_fileselect.pro)


FSC_INPUTFIELD

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   FSC_INPUTFIELD



 PURPOSE:



   The purpose of this compound widget is to provide an alternative

   to the CW_FIELD widget offered in the IDL distribution. What has

   always bothered me about CW_FIELD is that the text widgets do not

   look editable to the users on Windows platforms. This program

   corrects that deficiency and adds some features that I think

   would be helpful. For example, you can now assign an event handler

   to the compound widget. The program is written entirely as an object.

   A companion program, COYOTE_FIELD, has much the same functionality,

   but is written as a traditional compound widget. The point of writing

   the same program in two different ways is to give you the opportunity

   to compare and contrast the two methods. I personally think there

   is no substitute for the power of object programs. :-)



 AUTHOR:

   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   General programming.



 CALLING SEQUENCE:



   objectRef = FSC_INPUTFIELD(parent, Title='X Size: ", Value=256, /IntegerValue)



 INPUT PARAMETERS:



   parent -- The parent widget ID of the compound widget. Required.



 INPUT KEYWORDS:



   Column -- Set this keyword to have the Label Widget above the Text Widget.

   CR_Only -- Set this keyword if you only want Carriage Return events. If

              this keyword is not set, all events are returned. No events

              are returned unless the EVENT_PRO or EVENT_FUNC keywords are used.

   Decimal -- Set this keyword to the number of digits to the right of the decimal

              point in FLOATVALUE and DOUBLEVALUE numbers.

   Digits -- Set this keyword to the number of digits permitted in INTERGERVALUE and LONGVALUE numbers.

   DoubleValue -- Set this keyword if you want DOUBLE values returned.

   Event_Func -- Set this keyword to the name of an Event Function. If this

                 keyword is undefined and the Event_Pro keyword is undefined,

                 all compound widget events are handled internally and not

                 passed on to the parent widget.

   Event_Pro -- Set this keyword to the name of an Event Procedure. If this

                keyword is undefined and the Event_Func keyword is undefined,

                all compound widget events are handled internally and not

                passed on to the parent widget.

   FieldFont -- The font name for the text in the Text Widget.

   FloatValue -- Set this keyword for FLOAT values.

   Frame -- Set this keyword to put a frame around the compound widget.

   IntegerValue -- Set this keyword for INTEGER values.

   LabelFont -- The font name for the text in the Label Widget.

   LabelSize -- The X screen size of the Label Widget.

   LongValue -- Set this keyword for LONG values.

   Name -- A scalar string name of the object. (default = '')

   Positive -- Set this keyword if you want only positive numbers allowed.

   Row=row -- Set this keyword to have the Label beside the Text Widget. (The default.)

   Scr_XSize -- The X screen size of the compound widget.

   Scr_YSize -- The Y screen size of the compound widget.

   StringValue -- Set this keyword for STRING values. (The default.)

   Title -- The text to go on the Label Widget.

   UValue -- A user value for any purpose.

   Value -- The "value" of the compound widget.

   XSize -- The X size of the Text Widget.



 COMMON BLOCKS:



   None.



 RESTRICTIONS:



   None.



 EVENT STRUCTURE:



   All events are handled internally unless either the Event_Pro or Event_Func

   keywords are used to assign an event handler to the compound widget. By

   default all events generated by the text widget are passed to the assigned

   event handler. If you wish to receive only Carriage Return events, set the

   CR_Only keyword.



   event = { FSC_FIELD, $         ; The name of the event structure.

             ID: 0L, $            ; The ID of the compound widget's top-level base.

             TOP: 0L, $           ; The widget ID of the top-level base of the hierarchy.

             HANDLER: 0L, $       ; The event handler ID. Filled out by IDL.

             ObjRef: Obj_New(), $ ; The "self" object reference. Provided so you can call methods.

             Value: Ptr_New(), $  ; A pointer to the widget value.

             Type:""              ; A string indicating the type of data in the VALUE field.

           }                      ; Values are "INT", "LONG", "FLOAT", "DOUBLE", or "STRING".



 GETTING and SETTING VALUES:



   Almost all the properties of the widget can be obtained or set via

   the object's GetProperty and SetProperty methods (described below).

   But since traditional compound widgets have the ability to get and

   set the value of the compound widget, this capability is implemented

   as special methods.



   To get the value of the field, do this: value = objectRef->Get_Value()

   To set the value of the field, so this: objectRef->Set_Value, value, /IntegerValue



   The proper keyword should be used to set the data type of the value. If a keyword

   is not used, the data type is determined from the value itself.



 OBJECT PROCEDURE METHODS:



   GetProperty -- This method allows various properties of the widget to be

       returned via output keywords. The keywords that are available are:



       CR_Only -- A flag, if set, means only report carriage return events.

       DataType -- The data type of the field variable.

       Decimal -- Set this keyword to the number of digits to the right of the decimal

              point in FLOATVALUE and DOUBLEVALUE numbers.

       Digits -- Set this keyword to the number of digits permitted in INTERGERVALUE and LONGVALUE numbers.

       Event_Func -- The name of the event handler function.

       Event_Pro -- The name of the event handler function.

       Positive -- Indicates if the Positive number flag is set (1) or not (0).

       UValue -- The user value assigned to the compound widget.

       Value -- The "value" of the compound widget.

     Name -- A scalar string name of the object.



   MoveTab -- This method moves the focus to the widget identified in the "next" field,

        which must be set with the SetTabNext method. No parameters. Called automatically

        when a TAB character is typed in the text widget.



   Resize -- This method allows you to resize the compound widget's text field.

        The value parameter is an X screen size for the entire widget. The text

        widget is sized by using the value obtained from this value minus the

        X screen size of the label widget.



          objectRef->Resize, screen_xsize_value



   Set_Value -- This method allows you to set the "value" of the field. It takes

       one positional parameter, which is the value.



          objectRef->Set_Value, 5



       Keywords available are these to set the type of the data. If keywords

       are not used, the data type is determined from the value.



       DoubleValue -- Set this keyword if you want DOUBLE values returned.

       FloatValue -- Set this keyword for FLOAT values.

       IntegerValue --  Set this keyword for INTEGER values.

       LongValue -- Set this keyword for LONG values.

       StringValue -- Set this keyword for STRING values. (The default.)



   SetProperty -- This method allows various properties of the widget to be

       set via input keywords. The keywords that are available are:



       CR_Only -- Set this keyword if you only want Carriage Return events.

       Decimal -- Set this keyword to the number of digits to the right of the decimal

              point in FLOATVALUE and DOUBLEVALUE numbers.

       Digits -- Set this keyword to the number of digits permitted in INTERGERVALUE and LONGVALUE numbers.

       DoubleValue -- Set this keyword if you want DOUBLE values returned.

       Event_Func -- Set this keyword to the name of an Event Function.

       Event_Pro -- Set this keyword to the name of an Event Procedure.

       FloatValue -- Set this keyword for FLOAT values.

       IntegerValue --  Set this keyword for INTEGER values.

       LabelSize --  The X screen size of the Label Widget.

       LongValue -- Set this keyword for LONG values.

       Name -- A scalar string name of the object. (default = '')

       Positive -- Set this keyword to indicate only positive numbers are allowed.

       Scr_XSize -- The X screen size of the text widget.

       Scr_YSize -- The Y screen size of the text widget.

       StringValue -- Set this keyword for STRING values. (The default.)

       Title -- The text to go on the Label Widget.

       UValue -- A user value for any purpose.

       Value -- The "value" of the compound widget.

       XSize -- The X size of the Text Widget.



 OBJECT FUNCTIONS METHODS:



      Get_Value -- Returns the "value" of the field. No parameters. Will be undefined

          if a "number" field is blank. Should be checked before using:



          IF N_Elements(objectRef->Get_Value()) NE 0 THEN Print, Value is: ', objectRef->Get_Value()



      GetID -- Returns the widget identifier of the compound widget's top-level base.

         (The first child of the parent widget.) No parameters.



      GetLabelSize -- Returns the X screen size of the label widget. No parameters.



      GetTextID -- Returns the widget identifier of the compound widget's text widget.

         No parameters.



      GetTextSize -- Returns the X screen size of the text widget. No parameters.



 PRIVATE OBJECT METHODS:



   Although there is really no such thing as a "private" method in IDL's

   object implementation, some methods are used internally and not meant to

   be acessed publicly. Here are a few of those methods. I list them because

   it may be these private methods are ones you wish to override in subclassed

   objects.



      MoveTab -- This method moves the cursor to end of the text in the widget identified

        by the nexttab field. (This will be set with the SetTabNext method.)



      Text_Events -- The main event handler method for the compound widget. All

        text widget events are processed here.



      ReturnValue -- This function method accepts a string input value and converts

        it to the type of data requested by the user.



      Validate -- This function method examines all text input and removes unwanted

        characters, depending upon the requested data type for the field. It makes it

        impossible, for example, to type alphanumeric characters in an INTEGER field.



 EXAMPLE:



   An example program is provided at the end of the FSC_INPUTFIELD code. To run it,

   type these commands:



      IDL> .Compile FSC_InputField

      IDL> Example



 MODIFICATION HISTORY:



   Written by: David Fanning, 23 NOV 1999.

   Added DECIMAL and DIGITS keywords, 2 Jan 2000, DWF.

   Changed the calling sequence to that of a function rather than an object

      creation call. This is more familiar to users of compound widgets. 4 Jan 00. DWF.

   Added GetID and Resize methods. 7 Jan 00. DWF.

   Added the Positive keyword and functionality. 12 Jan 00. DWF

   Modified (slightly) the behavior on deleting characters. 12 Jan 00. DWF.

   If a number field is blank, the Get_Value method will now return an undefined variable.

      Be sure you check this value before you use it for something! 17 Jan 00. DWF.

   Fixed a small typo: "aveDecimal" to "haveDecimal". 10 March 2000. DWF.

   Added the ability to tab between FSC_INPUTFIELD widgets with the SetTabNext,

      MoveTab, and GetTextID methods. 31 July 2000. DWF.

   Added NAME field property, a scalar string name for the object 2 AUG 2000 BT

   Added ObjRef field to the FSC_FIELD event structure and added field selection

      for the TAB events added 31 July. 7 AUG 2000. DWF

   Added GetTextSize and GetLabelSize methods for obtaining the X screen

      size of the text and label widgets, respectively. 30 Jan 2001. DWF.

(See fsc_inputfield.pro)


FSC_PLOTWINDOW

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   FSC_PLOTWINDOW



 PURPOSE:



   The purpose of this compound widget is to create a resizeable

   "plot window" inside a larger "page window". I'm not sure it

   has any value except as a utility routine for the PostScript

   configuration object FSC_PSCONFIG__DEFINE, but it's a neat

   program anyway. :-)



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   Utility routine for FSC_PSCONFIG__DEFINE.



 CALLING SEQUENCE:



   plotwindowObject = CW_PlotWindow(parent)



 REQUIRED INPUT PARAMETERS:



   parent - The parent base widget of this compound widget.



 RETURN VALUE:



   plotwindowObject - The object reference of the compound widget.



 KEYWORDS:



   COLOR - If set, display the window in "color". This is the default on 24-bit devices.

   DEBUG - Set this keyword to turn traceback error handling on in the error handling code.

   EVENT_PRO - The event procedure for the widget. Required for events to be generated. Otherwise, all events are handled internally.

   LANDSCAPE - If set, display the page in landscape mode. Otherwise the page is display in portrait mode.

   PAGESIZE - The "pagesize" of the widget. Possible values are: "LETTER", "LEDGER", "LEGAL", "A4", and "DISPLAY".

   UNITS - A string indicating INCHES or CENTIMETER units. DEVICE units represented by a null string, "".

   UVALUE - A user value for the caller of this program.

   WINDOWCOLOR - A three-element array specifying the background window color (RGB).

   WINDOWSIZE - The size of the "window" on the page. A four-element array of normalized coordinates in the form [x0, y0, x1, y1].



 EVENT STRUCTURE:



   The event structure that is returned from this compound widget is defined like this,

   where the sizes and offsets locate the target "window" on the page in normalized units:



      event = {ID:0L, TOP:0L, HANDLER:0L, XSize:0.0, YSize:0.0, XOffset:0.0, YOffset:0.0}



 MODIFICATIONS:



   Written by David Fanning, 31 January 2000.

   Fixed a small bug that prevented it working on Macintosh computers. 26 Sept 2000. DWF.

   Added a "DISPLAY" page size, so the program can be used to position

      plots and other graphics in a display window. The "page area" will

      have the same aspect ratio is the current graphics window. 17 March 2001. DWF.

(See fsc_plotwindow.pro)


FSC_PSCONFIG__DEFINE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   FSC_PSCONFIG__DEFINE



 PURPOSE:



   The purpose of this program is to implement an object that

   can keep track of--and allow the user to change--the current

   configuration of the PostScript device.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   General programming.



 DOCUMENTATION:



   Complete documentation for the FSC_PSCONFIG object, including

   keyword and method descriptions, and example programs using the object

   can be found on the Coyote's Guide to IDL Programming web page:



     http://www.dfanning.com/programs/docs/fsc_psconfig.html



   Or, if you would prefer, you can download a self-contained PDF file:



     http://www.dfanning.com/programs/docs/fsc_psconfig.pdf



 KEYWORDS:



   Any keyword accepted by the FSC_PSCONFIG object can be used with

   this program. Here are a few of the most popular keywords.



   Bits_per_Pixel - The number of image bits saved for each image pixel: 2, 4, or 8. The default is 8.

   Color - Set this keyword to select Color PostScript output. Turned on by default.

   DefaultSetup - Set this keyword to the "name" of a default style. Current styles (you can easily

     create and add your own to the source code) are the following:



       "System (Portrait)" - The normal "default" system set-up. Also, "System".

       "System (Landscape)" - The normal "default" landscape system set-up.

       "Centered (Portrait)" - The window centered on the page. Also, "Center" or "Centered".

       "Centered (Landscape)" - The window centered on the landscape page. Also, "Landscape".

       "Square (Portrait)" - A square plot, centered on the page.

       "Square (Landscape)" - A square plot, centered on the landscape page.

       "Figure (Small)" - A small encapsulated figure size, centered on page. Also, "Encapsulated" or "Encapsulate".

       "Figure (Large)" - A larger encapsulated figure size, centered on page. Also, "Figure".

       "Color (Portrait)" - A "centered" plot, with color turned on. Also, "Color".

       "Color (Landscape)" - A "centered" landscape plot, with color turned on.



   Directory - Set this keyword to the name of the starting directory. The current directory is used by default.

   Encapsulate - Set this keyword to select Encapsulated PostScript output. Turned off by default.

   European - Set this keyword to indicate "european" mode (i.e., A4 page and centimeter units). Turned off by default.

   Filename - Set thie keyword to the name of the PostScript file. The default is "idl.ps".

   Inches - Set this keyword to indicate sizes and offsets are in inches as opposed to centimeters. Set by European keyword by default.

   Landscape - Set this keyword to select Landscape page output. Portrait page output is the default.

   PageType - Set this keyword to the "type" of page. Possible values are:

       "Letter" - 8.5 by 11 inches. (Default, unless the European keyword is set.)

       "Legal" - 8.5 by 14 inches.

       "Ledger" - 11 by 17 inches.

       "A4" - 21.0 by 29.7 centimeters. (Default, if the European keyword is set.)

   XOffset - Set this keyword to the X Offset. Uses "System (Portrait)" defaults. (Note: offset calculated from lower-left corner of page.)

   XSize - Set this keyword to the X size of the PostScript "window". Uses "System (Portrait)" defaults.

   YOffset - Set this keyword to the Y Offset. Uses "System (Portrait)" defaults. (Note: offset calculated from lower-left corner of page.)

   YSize - Set this keyword to the Y size of the PostScript "window". Uses "System (Portrait)" defaults.



   In addition, the following keywords can be used:



   CANCEL -- An output keyword that will be set to 1 if the user

   chooses the Cancel button on the form. It will be 0 otherwise.



   FONTINFO -- Set this keyword is you wish to have font information

   appear on the form. The default is to not include font information.



   FONTTYPE -- Set this keyword to a named variable that will indicate

   the user's preference for font type. Values will be -1 (Hershey fonts),

   0 (hardware fonts), and 1 (true-type fonts). This keyword will always

   return -1 unless the FONTINFO keyword has also been set.



   GROUP_LEADER -- Set this keyword to a widget identifier of the widget

   you wish to be a group leader for this program.



 EXAMPLE:



   A simple sequence of using the object would look something like this:



     psObject = Obj_New("FSC_PSCONFIG")

     psObject->GUI

     psKeywords = psObject->GetKeywords()

     thisDevice = !D.Name

     Set_Plot, 'PS'

     Device, _Extra=psKeywords

     TVImage, image

     Device, /Close_File

     Set_Plot, thisDevice

     Obj_Destroy, psObject



  Note that the object can also be called from the PS_CONFIG interface:



     psKeywords = PSConfig()



 OTHER PROGRAMS NEEDED:



   The following programs are required to run this one:



     fsc_droplist.pro

     fsc_fileselect.pro

     fsc_field.pro

     fsc_plotwindow



 MODIFICATIONS:



   Written by David W. Fanning, 31 January 2000.

   Added capability to call GUI methods when the current graphics device

      doesn't support windows. Device is restored when the GUI exits. 11 May 2000. DWF.

   Changed the default value for the Color keyword to 1. 16 May 2000. DWF.

   Fixed a bug where filename changed when switching Setups. 8 AUG 2000. DWF.

   Fixed a bug when saving setup in Landscape mode. 8 AUG 2000. DWF.

   Added the ability to Get and Set the object's name via the SetProperty

      and a very abbreviated GetProperty method. Also added a GetName method. 26 SEP 2000. DWF.

   Fixed a problem in which the proper configuration was not restored if in Landscape mode. 20 Nov 2000. DWF.

   Made a number of modifications at the request of Martin Schultz. 4 Dec 2000. DWF.

   Fixed a bug when setting file  and directory names with the SetProperty method. 18 Dec 2000. DWF.

   Fixed a small problem in initializing the page size properly. 3 Jan 2001. DWF.

   Corrected a problem that resulted from a change to FSC_DROPLIST. 6 Jan 2001. DWF.

   Added the ability to restore the font type instead of always reverting to !P.Font. 7 Jan 2001. DWF.

   Increased the length of the file/directory name fields. 7 Jan 2001. DWF.

   Fixed another problem with Landscape mode interacting with A4 paper size. 7 Jan 2001. DWF.

   Seems I only half fixed the previous problem. :-( 26 April 2001. DWF.

   Forgot to update program to reflect change in FSC_FIELD. Fixed 26 April 2001. DWF.

   Changed BOOKMAN keyword to BKMAN to avoid conflict with BOOKSTYLE keyword. 26 April 2001. DWF.

   Modified the System Defaults to say "None" if none is used. Improved documentation. 10 September 2001. DWF.

   Added the ability to specify a filename at the same time as a Default Setup. 10 September 2001. DWF.

   Fixed a small problem in not setting new page sizes appropriately. 22 May 2002. DWF.

(See fsc_psconfig__define.pro)


FSC_SURFACE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       FSC_SURFACE



 PURPOSE:



       The purpose of this program is to demonstrate how to

       create a rotating surface using object graphics.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Widgets, Object Graphics.



 CALLING SEQUENCE:



       FSC_SURFACE, data, x, y



 REQUIRED INPUTS:



       None. Fake data will be used if no data is supplied in call.



 OPTIONAL INPUTS



       data: A 2D array of surface data.



       x: A vector of X data values.



       y: A vector of Y data values.



 OPTIONAL KEYWORD PARAMETERS:



       BLOCK: Set this keyword to 1 to create a blocking widget program. This is

       useful if you want to call this program from within a stopped program, for

       example. Remember only the first blocking program actually blocks.



       COLORTABLE: Set this keyword to a number between 0 and 40 to select one

       of the pre-selected IDL color tables for elevation shading.



       ELEVATION_SHADING: Set this keyword to put elevation shading into effect.



       EXACT: Set this keyword to a one-, two-,or three-element array to set exact axis

       scaling for the X, Y, and Z axes, respectively. If Exact is a one-element array,

       all three axes are set to the same value. For example, to set the X axis to

       exact scaling and the Y and Z axes to normal scaling, type:



           IDL> FSC_Surface, Exact=[1,0,0]



       _EXTRA: This keyword collects otherwise undefined keywords that are

        passed to the IDLgrSURFACE initialization routine.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       LANDSCAPE: Set this keyword if you are printing in landscape mode. The

       default is Portrait mode. The Landscape keyword on the PRINTER object

       is set, but not all printers will honor this keyword setting. If yours

       does not, set Landscape mode in the Printer Setup dialog.



       POSITION: A two-, four- or six-element array of normalized (0 to 1) coordinates

       used to position the X, Y, and Z axis in the coordinate space. Uses the form

       [x0, x1, y0, y1, z0, z1]. In the absence of POSITION information, the Z position

       is always [0,1] and the X and Y positions are calculated in a manner that

       preserves the aspect ratio of the surface data.



       SHADED: Set this keyword to set up a shaded surface plot rather than a wire

       mesh surface, which is the default.



       TITLE:  A string used as the title of the plot.



       XTITLE: A string used as the X title of the plot.



       YTITLE: A string used as the Y title of the plot.



       ZTITLE: A string used as the Z title of the plot.





 COMMON BLOCKS:



       None.



 SIDE EFFECTS:



       None.



 DEPENDENCIES:



       This program requires the following additional files from the Coyote Library:



          error_message.pro

          fsc_droplist.pro

          getcolor.pro

          loaddata.pro

          pickcolor.pro

          xcolors.pro



 EXAMPLE:



       To use this program with your data, type:



        IDL> FSC_Surface, data



       Use your LEFT mouse button to rotate the surface plot in the window.

       Use your RIGHT mouse button to zoom into a closer view of the plot.

       Use your MIDDLE mouse button to zoom away from the plot.



 MODIFICATION HISTORY:



       Written by David Fanning, 8 June 97.

       Made axis scaling more robust. 17 Sept 97. DWF.

       Minor modifications to incorporate better understanding

          of how objects work. 4 Oct 97. DWF.

       Fixed error cleaning up all of my created objects. 12 Feb 98. DWF.

       Changed IDLgrContainer to IDL_Container to fix 5.1 problems. 20 May 98. DWF.

       Fixed mis-spelling of HELVETICA14. 29 June 98. DWF.

       Added the EXACT keyword to the X and Y axes to force axis ranging. 27 July 98. DWF

       Added the ability to select rendering "drag" quality for faster operation. 22 Aug 98. DWF.

       Added ability to get non-exact axis scaling. 12 May 99. DWF.

       Improved documentation and readability of code. 12 May 99. DWF.

       Added VECTOR and LANDSCAPE keywords and improved printing capability. 16 Feb 2000. DWF.

       Added different lights and a Light Controller option. 28 April 2000. DWF.

       Added elevation shading. 8 May 2000. DWF.

       Removed VECTOR keyword. Replaced with VECTOR/BITMAP/COLOR Print buttons. 8 May 2000. DWF.

       Added HIDDEN_LINE keyword. 8 May 2000. DWF.

       Added EXACT keyword extensions and changed name from XSURFACE to FSC_SURFACE. 11 May 2000. DWF.

       Made change to Light Control code to accomodate FSC_DROPLIST changes. 6 Jan 2001. DWF.

       Removed unused color table vector code from a LONG time ago. 17 Jan 2001. DWF.

       Added TIFF file output and removed GIF output for IDL 5.4. 11 Feb 2001. DWF.

       Added short wait before taking image snapshot for JPEG and TIFF files to avoid

          extraneous text in output files. 22 October 2001. DWF.

       Added the POSITION keyword. 16 April 2002. DWF.

       Added the ability to zoom into and out of plot with RIGHT and MIDDLE mouse buttons. 16 April 2002. DWF.

       Fixed a problem with leaving lights on when switching to elevation shading. 16 April 2002. DWF.

       Fixed a problem in not restoring viewport parameters after printing. 20 April 2002. DWF.

       Added BMP, EPS, and PGN file output. 20 April 2002.DWF.

       Added a BLOCK keyword. 11 May 2002. DWF.

       Added a check for NAN in elevation colors part of the code. 14 August 2002. DWF.

       Removed extra Save As TIFF File button. 24 August 2002. DWF.

(See fsc_surface.pro)


FSC_WINDOW

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       FSC_WINDOW



 PURPOSE:



       This routine implements a "smart" resizeable graphics window.

       It is used as a wrapper for built-in IDL graphics procedures

       such as SURFACE, CONTOUR, PLOT, SHADE_SURF, etc. In additon,

       it can be used to display any user-written graphics procedure

       so long as that procedure follows three simple rules: (1) It

       does not open it's own graphics windows, (2) It is defined with

       no more than three positional arguments (an unlimited number

       of keyword arguments are allowed), and (3) It uses no device-

       specific commands, such as "WSet", "Device, Decomposed=1", etc.



       Keyword arguments permit the window to have its own portion

       of a color table and to be able to change the colors loaded in

       that portion of the color table. Colors are updated

       automatically on both 8-bit and 24-bit color displays. In

       addition, the window colors will "protect" themselves. I mean

       by this that the window will re-load its own colors into the

       color table when the window gains keyboard focus. This

       prevents other applications from changing the colors used to

       display data in this window. (This is an issue mainly in

       IDL 5 applications where widget applications can run

       concurrently with commands from the IDL command line.)



       Keyword arguments also permit the window to create output

       files of its contents. These files can be color and

       gray-scale PostScript, and color BMP, GIF, JPEG, PICT, PNG,

       TIFF, or JPEG files. Output can also be sent directly to

       the default printer.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Widgets, Graphics.



 CALLING SEQUENCE:



       FSC_WINDOW, command, P1, P2, P3



 REQUIRED INPUTS:



       COMMAND: The graphics procedure command to be executed. This parameter

       must be a STRING and the the command must be a procedure. Examples

       are 'SURFACE', 'CONTOUR', 'PLOT', etc.



 OPTIONAL INPUTS:



       P1: The first positional parameter appropriate for the graphics

           command.



       P2: The second positional parameter appropriate for the graphics

           command.



       P3: The third positional parameter appropriate for the graphics

           command.



 INPUT KEYWORD PARAMETERS:



       WBACKGROUND: The background color index for the window. Setting this color

           along with the WERASEIT keyword causes the window to be erased with

           this color. Set to !P.Background by default.



       WERASEIT: Setting this keyword "erases" the contents of the current

       graphics window before re-executing the graphics command. For example,

       this keyword might need to be set if the graphics "command" is TVSCL.

       The default is to NOT erase the display before reissuing the graphics

       command.



       _EXTRA: This keyword forms an anonymous structure of any unrecognized

       keywords passed to the program. The keywords must be appropriate

       for the graphics command being executed.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       TVORDER: This keyword corresponds the the !Order system variable. It

       is not used in this program, but is carried along for the call to

       TVREAD when windows are saved as ouput files. It will affect the

       transfer of window contents into the output data file. It should be

       used if the output file contents appear upside down.



       WTITLE: This is the window title. It is the string "COMMAND Window (1)"

       by default, where COMMAND is the input parameter. And the number

       (1 in this case) is the window index number of the draw widget.



       WXPOS: This is the initial X offset of the window. Default is to

       position the window in the approximate middle of the display.



       WYPOS: This is the initial Y offset of the window. Default is to

       position the window in the approximate middle of the display.



       WPOSTSCRIPT: Set this keyword to 1 to include a PostScript File button under

       the Save As button. This keyword is set automatically on 24-bit display

       devices. To turn the button OFF on 24-bit devices, set the keyword value to 0.

       There is no guaranteed way to create perfect PostScript output when the program

       is run on 8-bit displays. This will depend entirely on how the "graphics command"

       is written. Hence the button is turned off automatically on 8-bit devices.



       WPRINT: Set this keyword to 1 to include a Print button under the File button.

       This keyword is set automatically on 24-bit display devices. To turn the

       button OFF on 24-bit devices, set the keyword value to 0. There is no

       guaranteed way to print output correctly when the program is run on

       8-bit displays. This will depend entirely on how the "graphics command"

       is written. Hence the button is turned off automatically on 8-bit devices.



       WXSIZE: This is the initial X size of the window. Default is 400

       pixels.



       WYSIZE: This is the initial Y size of the window. Default is 400

       pixels.



       WCOLORS: Using this keyword adds a "Colors..." button to the

       "File" menu. Set this keyword to the number of colors available

       in the window and the starting index of the first color. For example,

       to allow the window access to 100 colors, starting at color index 50

       (i.e., color indices 50 to 149), use WColors=[100, 50]. If you use the

       keyword syntax "/WColors", all the colors available will be used, not just

       one color. If the keyword is set to a scalar value greater than 1, the

       starting color index is set to 0. The default value for this keyword

       is [(!D.Table_Size, 0].



 COMMON BLOCKS:



       None.



 RESTRICTIONS:



       This program requires additional programs from the Fanning

       Software Consulting library:



       CENTERTLB.PRO

       ERROR_MESSAGE.PRO

       FSC_PSCONFIG__DEFINE.PRO

       FSC_DROPLIST.PRO

       FSC_FIELD.PRO

       FSC_FILESELECT.PRO

       FSC_INPUTFIELD.PRO

       FSC_PLOTWINDOW.PRO

       PSCONFIG.PRO

       PSWINDOW.PRO

       TVREAD.PRO

       XCOLORS.PRO



       If the "command" program requires keywords that are also keywords

       to FSC_WINDOW, then you must use the keyword twice on the command line.



 EXAMPLE:



       If the program is called with no parameters whatsoever, it will load

       example data.



       IDL> FSC_WINDOW



       To use the program with an IDL PLOT command, for example:



       IDL> FSC_WINDOW, 'PLOT', Findgen(11), Charsize=1.5, Title='Example Plot'



       To build your own graphics display command, you can do something like this.

       Here is a command program that takes an image, a column number, and a row number,

       and plots a column and row profile next to one another:



          PRO COL_ROW_PLOT, image, column, row, _Extra=extra

          ; Check parameters.

          IF N_Elements(image) EQ 0 THEN image = DIST(200)

          IF N_ELements(column) EQ 0 THEN column = 100

          IF N_Elements(row) EQ 0 THEN row = 100

          ; Set up plots.;

          !P.Multi = [0, 2, 1]

          Plot, image[column, *], Title='Row Profile', YRange=[Min(image), Max(image)], $

             XStyle=1, XTitle='At Column No: ' + StrTrim(column,2), _Extra=extra

          Plot, image[*, row], Title='Column Profile', YRange=[Min(image), Max(image)], $

             XStyle=1, XTitle='At Row No: ' + StrTrim(row,2), _Extra=extra

          !P.Multi = 0

          END



       This command program is used with FSC_WINDOW, like this:



       IDL> Demo_GetData, image, Filename='ctscan.dat'

       IDL> FSC_WINDOW, 'COL_ROW_PLOT', image, 30, 185, YTitle='Image Value'



 MODIFICATION HISTORY:



       Written by: David Fanning, Sept 2000. Based on previous XWINDOW program.

       Whoops! Left out the line to resize draw widgets on UNIX machines. Fixed. 12 Oct 2000, DWF.

       Removed support for GIF files for IDL 5.4. 18 Jan 2001. DWF.

       Beefed up documentation. 27 March 2001. DWF.

       Added TVORDER keyword. 25 March 2002. DWF.

(See fsc_window.pro)


GETCOLOR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       GETCOLOR



 PURPOSE:

       The original purpose of this function was to enable the

       user to specify one of the 16 colors supported by the

       McIDAS color map by name. Over time, however, the function

       has become a general purpose function for handling and

       supporting drawing colors in a device-independent way.

       In particular, I have been looking for ways to write color

       handling code that will work transparently on both 8-bit and

       24-bit machines. On 24-bit machines, the code should work the

       same where color decomposition is turned on or off. The program

       now supports 88 colors.



 AUTHOR:

       FANNING SOFTWARE CONSULTING:

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Graphics, Color Specification.



 CALLING SEQUENCE:

       result = GETCOLOR(color, index)



 OPTIONAL INPUT PARAMETERS:

       COLOR: A string with the "name" of the color. Valid names are:

           black

           magenta

           cyan

           yellow

           green

           red

           blue

           navy

           pink

           aqua

           orchid

           sky

           beige

           charcoal

           gray

           white



           The color YELLOW is returned if the color name can't be resolved.

           Case is unimportant.



           If the function is called with just this single input parameter,

           the return value is either a 1-by-3 array containing the RGB values of

           that particular color, or a 24-bit integer that can be "decomposed" into

           that particular color, depending upon the state of the TRUE keyword and

           upon whether color decomposition is turned on or off. The state of color

           decomposition can ONLY be determined if the program is being run in

           IDL 5.2 or higher.



       INDEX: The color table index where the specified color should be loaded.

           If this parameter is passed, then the return value of the function is the

           index number and not the color triple. (If color decomposition is turned

           on AND the user specifies an index parameter, the color is loaded in the

           color table at the proper index, but a 24-bit value is returned to the

           user in IDL 5.2 and higher. This assumes the INDEXED keyword is NOT set.)



       If no positional parameter is present, then the return value is either a 16-by-3

       byte array containing the RGB values of all 16 colors or it is a 16-element

       long integer array containing color values that can be decomposed into colors.

       The 16-by-3 array is appropriate for loading color tables with the TVLCT command:



           Device, Decomposed=0

           colors = GetColor()

           TVLCT, colors, 100





 INPUT KEYWORD PARAMETERS:



       NAMES: If this keyword is set, the return value of the function is

              a 88-element string array containing the names of the colors.

              These names would be appropriate, for example, in building

              a list widget with the names of the colors. If the NAMES

              keyword is set, the COLOR and INDEX parameters are ignored.



                 listID = Widget_List(baseID, Value=GetColor(/Names), YSize=16)



       INDEXED:  If this keyword is set, the return value is always an index

              into the color table. In the absence of a color table INDEX

              parameter, the color is loaded at !P.COLOR < (!D.Table_Size-1).



       LOAD:  If this keyword is set, all 88 colors are automatically loaded

              starting at the color index specified by the START keyword.

              Note that setting this keyword means that the return value of the

              function will be a structure, with each field of the structure

              corresponding to a color name. The value of each field will be

              an index number (set by the START keyword) corresponding to the

              associated color, or a 24-bit long integer value that creates the

              color on a true-color device. What you have as the field values is

              determined by the TRUE keyword or whether color decomposition is on

              or off in the absense of the TRUE keyword. It will either be a 1-by-3

              byte array or a long integer value.



       START: The starting color index number if the LOAD keyword is set. This keyword

              value is ignored unless the LOAD keyword is also set. The keyword is also

              ignored if the TRUE keyword is set or if color decomposition in on in

              IDL 5.2 and higher. The default value for the START keyword is

              !D.TABLE_SIZE - 89.



       TRUE:  If this keyword is set, the specified color triple is returned

              as a 24-bit integer equivalent. The lowest 8 bits correspond to

              the red value; the middle 8 bits to the green value; and the

              highest 8 bits correspond to the blue value. In IDL 5.2 and higher,

              if color decomposition is turned on, it is as though this keyword

              were set.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 RESTRICTIONS:

       The TRUE keyword causes the START keyword to be ignored.

       The NAMES keyword causes the COLOR, INDEX, START, and TRUE parameters to be ignored.

       The COLOR parameter is ignored if the LOAD keyword is used.

       On systems where it is possible to tell the state of color decomposition

       (i.e., IDL 5.2 and higher), a 24-bit value (or values) is automatically

       returned if color decomposition is ON.



 EXAMPLE:

       To load a yellow color in color index 100 and plot in yellow, type:



          yellow = GETCOLOR('yellow', 100)

          PLOT, data, COLOR=yellow



       or,



          PLOT, data, COLOR=GETCOLOR('yellow', 100)



       To do the same thing on a 24-bit color system with decomposed color on, type:



          PLOT, data, COLOR=GETCOLOR('yellow', /TRUE)



       or in IDL 5.2 and higher,



          DEVICE, Decomposed=1

          PLOT, data, COLOR=GETCOLOR('yellow')



       To load all 88 colors into the current color table, starting at

       color index 100, type:



          TVLCT, GETCOLOR(), 100



       To add the color names to a list widget:



           listID = Widget_List(baseID, Value=GetColor(/Names), YSize=16)



       To load all 88 colors and have the color indices returned in a structure:



           DEVICE, Decomposed=0

           colors = GetColor(/Load, Start=1)

           HELP, colors, /Structure

           PLOT, data, COLOR=colors.yellow



       To get the direct color values as 24-bit integers in color structure fields:



           DEVICE, Decomposed=1

           colors = GetColor(/Load)

           PLOT, data, COLOR=colors.yellow



       Note that the START keyword value is ignored if on a 24-bit device,

       so it is possible to write completely device-independent code by

       writing code like this:



           colors = GetColor(/Load)

           PLOT, data, Color=colors.yellow



 MODIFICATION HISTORY:

       Written by: David Fanning, 10 February 96.

       Fixed a bug in which N_ELEMENTS was spelled wrong. 7 Dec 96. DWF

       Added the McIDAS colors to the program. 24 Feb 99. DWF

       Added the INDEX parameter to the program 8 Mar 99. DWF

       Added the NAMES keyword at insistence of Martin Schultz. 10 Mar 99. DWF

       Reorderd the colors so black is first and white is last. 7 June 99. DWF

       Added automatic recognition of DECOMPOSED=1 state. 7 June 99. DWF

       Added LOAD AND START keywords. 7 June 99. DWF.

       Replaced GOLD with CHARCOAL color. 28 Oct 99. DWF.

       Added INDEXED keyword to force indexed color mode. 28 Oct 99. DWF.

       Fixed problem of "aqua" and "pink" being mixed up. 18 Mar 00. DWF.

       Changed ON_ERROR from 1 to 2, and improved error handling. 2 Aug 00. DWF.

       Increased the known colors from 16 to 88. 19 October 2000. DWF.

       Fixed typos in which "thisColor" was written as "theColor". 10 AUG 2001. DWF.

(See getcolor.pro)


GETIMAGE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       GETIMAGE



 PURPOSE:

       The purpose of this function is to allow the user to open either

       regular or XDR binary image files of two or three dimensions.



 CATEGORY:

       Widgets, File I/O.



 CALLING SEQUENCE:

       image = GETIMAGE(filename)



 OPTIONAL INPUTS:

       filename: The name of the file to open for reading.



 OPTIONAL KEYWORD PARAMETERS:



       CANCEL: An output variable that can be set to a named variable.

       The value of the return variable will be 1 if the user clicked

       the "Cancel" button or if there was a problem reading the file.



       CATCH: Set this keyword to 0 if you wish to turn error catching OFF.



       DIRECTORY: The name of the directory the file is located in. By

       default the program looks in the "coyote" directory under the

       main IDL directory, if one exists. Otherwise, it defaults to the

       current directory.



       FRAMES: The 3rd dimension of a 3D data set. Defaults to 0.



       HEADER: The size of any header information in the file in BYTES.

       Default is 0.



       PARENT: The group leader for this widget program. The PARENT is

       required if GETIMAGE is called from another widget program in order

       to make this program a MODAL widget program.



       XDR: Set this keyword if the binary file is of XDR type.



       XOFFSET: This is the X offset of the program on the display. The

       program will be placed approximately in the middle of the display

       by default.



       XSIZE: The size of the 1st dimension of the data.



       YOFFSET: This is the Y offset of the program on the display. The

       program will be placed approximately in the middle of the display

       by default.



       YSIZE: The size of the 2nd dimension of the data.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       A "CANCEL" operation is indicated by a 0 return value.

       Any error in reading the file results in a 0 return value.



 RESTRICTIONS:

       None.



 EXAMPLE:

       To load the image "galaxy.dat" in the $IDL/examples/data

       directory, type:



       image = GETIMAGE('galaxy.dat', DIRECTORY=!DIR + '/examples/data', $

          XSIZE=256, YSIZE=256, Cancel=cancelled, Parent=event.top)

       IF NOT cancelled THEN TV, image



 MODIFICATION HISTORY:

       Written by: David Fanning, 3 February 96.

       Fixed bug that prevented reading INTEGER data. 19 Dec 96.

       Modifed program for IDL 5 MODAL operation. 19 Oct 97.

       Added CANCEL keyword. 27 Oct 97. DWF.

       Fixed CANCLE keyword spelling. Sigh... 29 JUN 98. DWF.

       Added COYOTE_FIELD, improved appearance. 19 NOV 99. DWF.

       Updated with latest version of COYOTE_FIELD. 18 FEB 2000. DWF.

       Added CATCH keyword so the program will break when I want

       it to. :-) 18 MAR 2000. DWF.

       Added GROUP_LEADER keyword, which is synonymous with PARENT. 31 MAR 2000. DWF.

       Updated obsolete PICKFILE call to DIALOG_PICKFILE. 17 JAN 2001. DWF.

(See getimage.pro)


HCOLORBAR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       HCOLORBAR



 FILENAME:



       hcolorbar__define.pro

;

 PURPOSE:



       The purpose of this program is to create a horizontal

       colorbar object to be used in conjunction with other

       IDL 5 graphics objects.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



       Object Graphics.



 CALLING SEQUENCE:



       thisColorBar = Obj_New('HColorBar')



 REQUIRED INPUTS:



       None.



 INIT METHOD KEYWORD PARAMETERS:



       COLOR: A three-element array representing the RGB values of a color

          for the colorbar axes and annotation. The default value is

          white: [255,255,255].



       FONTSIZE: A floating value that is the point size of the font

           used for the axis and title annotations. Set to 8 point by default.



       NAME: The name associated with this object.



       NCOLORS: The number of colors associated with the colorbar. The

          default is 256.



       MAJOR: The number of major tick divisions on the colorbar axes.

          The default is 5.



       MINOR: The number of minor tick marks on the colorbar axes.

          The default is 4.



       PALETTE: A palette object for the colorbar. The default palette

           is a gray-scale palette object.



       POSITION: A four-element array specifying the position of the

           colorbar in normalized coordinate space. The default position

           is [0.10, 0.90, 0.90, 0.95].



       RANGE: The range associated with the colorbar axis. The default

           is [0, NCOLORS].



       TITLE: A string containing a title for the colorbar axis

           annotation. The default is a null string.



 OTHER METHODS:



       Clamp (Procedure): Given a two-element array in the data range of

          the colorbar, the colorbar image is clamped to this range. In

          other words, the range of colors is clamped to the specified

          range. Values above or below the range in the colorbar are set to

          the minimum and maximum range values, respectively.



       GetProperty (Procedure): Returns colorbar properties in keyword

          parameters as defined for the INIT method. Keywords allowed are:



               COLOR

               MAJOR

               MINOR

               NAME

               PALETTE

               POSITION

               RANGE

               TEXT

               TITLE

               TRANSFORM



       SetProperty (Procedure): Sets colorbar properties in keyword

          parameters as defined for the INIT method. Keywords allowed are:



               COLOR

               MAJOR

               MINOR

               NAME

               PALETTE

               POSITION

               RANGE

               TEXT

               TITLE

               TRANSFORM



 SIDE EFFECTS:



       A HColorBar structure is created. The colorbar INHERITS IDLgrMODEL.

       Thus, all IDLgrMODEL methods and keywords can also be used. It is

       the model that is selected in a selection event, since the SELECT_TARGET

       keyword is set for the model.



 RESTRICTIONS:



       None.



 EXAMPLE:



       To create a colorbar object and add it to a plot view object, type:



       thisColorBarObject = Obj_New('HColorBar')

       plotView->Add, thisColorBarObject

       plotWindow->Draw, plotView



 MODIFICATION HISTORY:



       Written by David Fanning, from VColorBar code, 20 Sept 98. DWF.

       Changed a reference to _Ref_Extra to _Extra. 27 Sept 98. DWF.

       Fixed bug when adding a text object via the TEXT keyword. 9 May 99. DWF.

       Fixed the same bug when getting the text using the TEXT keyword. :-( 16 Aug 2000. DWF.

       Fixed a bug with getting the text object via the TEXT keyword. 16 Aug 2000. DWF.

       Added the TRANSFORM keyword to GetProperty and SetProperty methods. 16 Aug 2000. DWF.

       Added RECOMPUTE_DIMENSIONS=2 to text objects. 16 Aug 2000. DWF.

       Added a polygon object around the image object. This allows rotation in 3D space. 16 Aug 2000. DWF.

       Removed TEXT keyword (which was never used) and improved documentation. 15 AUG 2001. DWF.

       Added ENABLE_FORMATTING keyword to title objects. 22 October 2001. DWF.

       Added a CLAMP method. 18 November 2001. DWF.

       Forgot to pass extra keywords along to the text widget. As a result, you couldn't

          format tick labels, etc. Fixed this. Any keywords appropriate for IDLgrTick objects

          are now available. 26 June 2002. DWF.

(See hcolorbar__define.pro)


IMAGE_BLEND

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       IMAGE_BLEND



 PURPOSE:

       The purpose of this program is to demonstrate how to

       use the alpha channel to blend one image into another.

       The specific purpose is to see a color image on top of

       a gray-scale image, with the gray-scale image showing

       through behind the color image.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       2642 Bradbury Court

       Fort Collins, CO 80521 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Widgets, Object Graphics.



 CALLING SEQUENCE:

       Image_Blend



 REQUIRED INPUTS:

       None. The images "worldelv.dat" and "ctscan.dat" from the

       examples/data directory are used.



 OPTIONAL INPUTS:



       backgroundImage::  A 2D image variable that will be used for the background image.

       foregroundImage: A 2D image variable that will be used for the foreground image.



 OPTIONAL KEYWORD PARAMETERS:



       COLORTABLE: The number of a color table to use for the foreground image.

       Color table 3 (red temperature) is used as a default.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 RESTRICTIONS:

       None. The program XCOLORS is required from the Coyote library.



 EXAMPLE:

       Image_Blend, Colortable=5



 MODIFICATION HISTORY:

       Written by David Fanning, 30 March 99.

       Fixed bug where I redefined the image parameter. Duh... 1 April 99. DWF.

(See image_blend.pro)


LINKEDLIST

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   LINKEDLIST



 FILENAME:

   linkedlist__define.pro



 PURPOSE:

   The purpose of this program is to implement a list that

   is linked in both the forward and backward directions. There

   is no restriction as to what can be stored in a linked list

   node. The linked list is implemented as an object.



 AUTHOR:

   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:

   General programming.



 CALLING SEQUENCE:

   mylist = Obj_New('LINKEDLIST', item)



 OPTIONAL INPUTS:

   item: The first item added to the list. Items can be any

     valid IDL variable type.



 COMMON BLOCKS:

   Are you kidding?!



 RESTRICTIONS:

   Be sure to destroy the LINKEDLIST object when you are finished

   with it: Obj_Destroy, mylist



   Node index numbers start at 0 and go to n-1, where n is the

   number of items in the list.



 PUBLIC METHODS:



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 PRO LINKEDLIST::ADD, item, index, AFTER=after, BEFORE=before



   The ADD method adds a data item to the list.



   Parameters:



   item: The data item to be added to the list. Required.



   index: The location in the list where the data item is

     to be added. If neither the AFTER or BEFORE keyword is

     set, the item is added AFTER the item at the index location.

     If index is missing, the index points to the last item in

     the list. Optional.



   Keywords:



   AFTER: If this keyword is set, the item is added after the

     item at the current index.



   BEFORE: If this keyword is set, the item is added before the

     item at the current index.



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 PRO LINKEDLIST::DELETE, index, ALL=all



   The DELETE method deletes an item from the list.



   Parameters:



   index: The location in the list where the data item is

     to be delete. If index is missing, the index points to

     the last item in the list. Optional.



   Keywords:



   ALL: If this keyword is set, all items in the list are deleted.



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 FUNCTION LINKEDLIST::GET_COUNT



   The GET_COUNT method returns the number of items in the list.



   Return Value: The number of items stored in the linked list.



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





 FUNCTION LINKEDLIST::GET_ITEM, index



   The GET_ITEM_PTR method returns a pointer to the specified data

   item from the list.



   Parameters:



   index: The location in the list from which the data item is

     to be retrieved. If not present, the last item in the list

     is retrieved. Optional.



   Keywords:



   DEREFERENCE: Set this keyword to return the thing the pointer

      points to (i.e., the item itself.)



   Return Value: A pointer to the specified data item stored

     in the list. IF DEREFERENCE is set, the data item itself

     is returned.



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 FUNCTION LINKEDLIST::GET_NODE, index



   The GET_NODE method returns a pointer to the specified node

   from the list.



   Parameters:



   index: The location in the list from which the data node is

     to be retrieved. If not present, the last node in the list

     is retrieved. The node is a structure with three fields:

     Previous is a pointer to the previous node in the list.

     Next is a pointer to the next node in the list. A null pointer

     in the previous field indicates the first node on the list. A

     null pointer in the next field indicates the last node on the

     list. The item field is a pointer to the item stored in the

     node. Optional.



   Return Value: A pointer to the specified node structure in

     the linked list.



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 PRO LINKEDLIST::HELP, PRINT=print



 The HELP method performs a HELP command on each item

 in the linked list.



   Keywords:



    PRINT: If this keyword is set, the PRINT command is used

      instead of the HELP command on the items in the list.



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



 PRO LINKEDLIST::MOVE_NODE, nodeIndex, location, BEFORE=before



   The MOVE_NODE method moves a list node from one location to another.



   Parameters:



   nodeIndex: The location in the list of the node you are moving.

     Required.



   location: The location (index) you are moving the node to. If

     location is missing, the location points to the node at the

     end of the list.



   Keywords:



    BEFORE: If this keyword is set, the node is added to the

      list before the location node. Otherwise, it is added after

      the location node.



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 PRO LINKEDLIST::REPLACE_ITEM, Index, NewItem



	Use this method to replace any item in the list with any other value.

	This allows the caller to change an item without stepping through the

	process of deleting an item then adding a new one.



  Parameters:

		Index:  The location of the node you are replacing



		NewItem:  Any value of any data type.



;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;





 EXAMPLE:



   mylist = Obj_New("LINKEDLIST", 5)

   mylist->Add, 10

   mylist->Add, 7.5, 1, /Before

   mylist->Add, 12.5

   mylist->Replace_Item, 1, 'Bob'

   mylist->Help

   mylist->Delete

   mylist->Help, /Print



 MODIFICATION HISTORY:

   Written by: David Fanning, 25 August 98.

   25 August 99. Fixed several errors in various methods dealing with

       moving nodes from one place to another. DWF.

   13 June 2001. DWF. Added DEREFERENCE to the GET_ITEM method to

       return the item itself, instead of the pointer to the item.

	 27 June 2001  BT Added REPLACE_ITEM method.

(See linkedlist__define.pro)


LOADDATA

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       LOADDATA



 PURPOSE:



       The purpose of this function is to read a selection of standard

       data sets that are found in the normal IDL distribution in the

       subdirectory $IDL_DIR/examples/data. At least 17 data sets are

       available in all categories of data. The user selects one of the

       possible data sets with the mouse.



 CATEGORY:



       File I/O.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CALLING SEQUENCE:



       If calling from the IDL command line:



          data = LoadData()



       If calling from within a widget program:



          data = LoadData(Cancel=cancelled, Group_Leader=event.top)



       If you know which data set you want, you can load it directly:



          data = LoadData(7)



 OPTIONAL INPUTS:



       selection : The number of the data selection. Values start at 1,

           and go up to the number of data sets available (currently 17).



 KEYWORD PARAMETERS:



       CANCEL : An output keyword that is 1 of the use clicked the CANCEL

           button and 0 otherwise.



              data = Loaddata(Cancel=cancelled)

              IF cancelled THEN RETURN



        GROUP_LEADER: The group leader of the widget. This keyword

           is required if you wish LOADDATA to be a modal widget program.

           (Which you *always* do when calling it from a widget program.)



        IMAGES: Set this keyword if you only want to select 2D image

           data sets. Note that the selection number does *not* change

           just because fewer data sets are available in the selection

           widget.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 RESTRICTIONS:

       None.



 EXAMPLE:



       To load the world elevation data set:



       image = LoadData(7)



 MODIFICATION HISTORY:



       Written by:  David W. Fanning, 5 March 1999.

       Added some additonal random data capability. 29 April 99. DWF

       Added IMAGES keyword. 31 March 2000. DWF.

       Fixed a problem with the CANCEL button. 25 Oct 2002. DWF.

       Added new JPEG, DICOM, TIFF, and PGN images. 30 Oct 2002. DWF.

(See loaddata.pro)


MPI_AXIS__DEFINE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       MPI_AXIS__DEFINE



 PURPOSE:



       This is a compound widget program for interactively adjusting and keeping track

       of keywords appropriate for configuing axis properties.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics



 CALLING SEQUENCE:



       xAxisObjext = Obj_New("MPI_AXIS", /XAxis)

       xAxisID = xAxisObject->GUI(baseWidgetID)



 INPUT PARAMETERS:



       None.



 INPUT KEYWORDS (Sent to the INIT method. The same keywords can be set with the SETPROPERTY method of the object.):



       AUTOKEYWORDS - An anonymous struture of keywords that are passed to the AutoRange function.



       AUTORANGE - The name of a function that can return axis range information as 2-element array.



       CHARSIZE - The character size used for the axis. By default, 1.0.



       EXACT - Set to indicate exact axis range scaling. (Can also be set with the STYLE keyword.)



       EXTEND - Set to indicate extended axis range. (Can also be set with the STYLE keyword.)



       GRIDSTYLE - The style used for drawing grid lines.



       HIDE - Set to indicate hidden axis style. (Can also be set with the STYLE keyword.)



       LOG - Set to indicate logarithmic axis.



       MARGIN - The axis margin. (Currently unimplemented.)



       MINOR - The number of minor tick marks between the major tick marks on the axis.



       NAME = A user-defined "name" for the object.



       NOBOX - Set to inhibit box-style axis. (Can also be set with the STYLE keyword.)



       NOZERO - Set to indicate NO_ZERO axis style. (Can also be set with the STYLE keyword.)



       RANGE - The axis range as a two-element array, [minrange, maxrange].



       STYLE - The axis style. A 32-bit value whose bits select certain properties. See the

          on-line documentation for the !X.STYLE system variable for more information. These

          style properties can be set in a more natural way with other keywords.



       THICK - The thickness of the axis. By default, 1.0.



       TICKFORMAT - The format to use with tick marks. May be name of procedure.



       TICKINTERVAL - The interval to space tick marks for first-level axis. (Currently not implemented.)



       TICKLAYOUT - The type of tick layout desired. (Currently not implemented.)



       TICKLEN - The length of the ticks on the axis. By default, 0.0. (Note that changing this

          value will cause the Plot TICKLEN value to be ignored for the axis.)



       TICKNAME - The string names associated with each tick mark. (Currently not implemented.)



       TICKS - The number of major tick intervals.



       TICKUNITS - The units to use for tick labeling. (Currently not implemented.)



       TICKV - A vector of tick values. (Currently not implemented.)



       TITLE - The axis title.



       XAXIS - Set to indicate an X axis object. This is the default.



       YAXIS - Set to indicate a Y axis object.



       ZAXIS - Set to indicate a Z axis.



 METHOD PROCEDURES:



      GUI - This procedure method displays a graphical user interface that allows the user

            to change the axis configuration parameters.



            PARAMETERS:



                parent - The parent of the compound widget.



            KEYWORDS:



                EVENT_PRO - The specified event handler procedure.

                EVENT_FUNC - The specified event handler function.

                ONLY_STYLE - If set, display only style parameters in the GUI.

                ONLY_TICK - If set, display only tick parameters in the GUI.

                SHORT_FORM - Normally, all the axis properties are displayed in the GUI. Setting

                     this keyword places the Tick and Style properties behind buttons on the interface.

                UVALUE - The user value of the compound widget.



      SETPROPERTY - This procedure can be used to set the properties of the axis

               configuration object without using the graphical user interface. The

               keywords are identical to those used in the INIT method, above.



 METHOD FUNCTIONS:



      GETKEYWORDS - This function method contains no arguments or keywords. It returns a

            structure, with fields equivalent to PLOT keywords for setting axis properties.

            The idea is that these keywords can be passed directly to the PLOT command using

            the keyword inheritance mechanism via the _EXTRA keyword to the plot command. ished with it.



 PROGRAM NOTES:



      Required Programs: The following programs are required to reside in your !PATH. They can be

         obtained from the Coyote Library:



                     http://www.dfanning.com/programs/cw_spacer.pro

                     http://www.dfanning.com/programs/error_message.pro

                     http://www.dfanning.com/programs/fsc_droplist.pro

                     http://www.dfanning.com/programs/fsc_field.pro



 EXAMPLE:



       A heavily documented program, named MPI_PLOT, is supplied with this program.

       This program not only explains how to use the MPI_PLOTCONFIG__DEFINE and the

       MPI_AXIS__DEFINE programs, it can be used as a wrapper program for the PLOT command

       that you can use with your own data. The program can be downloaded here:



                     http://www.dfanning.com/programs/mpi_plot.pro



 MODIFICATION HISTORY:



       Written by David Fanning, March 2001.

(See mpi_axis__define.pro)


MPI_PLOT

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       MPI_PLOT



 PURPOSE:



       This program is a simple wrapper for the IDL PLOT command. The

       main purpose of the program is to demonstrate one way the

       MPI_PLOTCONFIG program can be used to update plot parameters.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics



 CALLING SEQUENCE:



       MPI_Plot, x, y

       MPI_Plot, xx, yy, /Overplot



 INPUT PARAMETERS:



       x - The independent data. If y is not present, x is taken to be the dependent data.



       y - The dependent data. The vectors x and y must be the same length.



       xs - The independent data to overplot. If yy is not present, xx is taken to be the dependent data.



       yy - The dependent data to overplot. The vectors xx and yy must be the same length.



 INPUT KEYWORDS:



       BACKGROUND - The name of a background color. (See below for a list of color names.)

         By default on 24-bit systems: 'IVORY'. Uses 'GRAY' on 8-bit systems.



       COLOR - The name of the plot color. (See below for a list of color names.)

         By default on 24-bit systems: 'SADDLE BROWN'. Uses 'GREEN' on 8-bit systems.

         When OVERPLOTing, use the COLOR keyword to specify the color of the overplot.



       DATACOLOR - The name of the data color. By default the same as the COLOR keyword.

         (See below for a list of color names.) When OVERPLOTing, use the COLOR keyword

         to specify the color of the overplot.



       OVERPLOT - Set this keyword to overplot data into the MPI_PLOT window.

         If multiple windows are on the display, select the one to overplot into

         by selecting it with the cursor.



       PSYM - The plot symbol value. By default, 18. Possible values are:

         0 - Dot

         1 - Filled Circle

         2 - Filled Upward Triangle

         3 - Filled Downward Triangle

         4 - Filled Diamond

         5 - Filled Square

         6 - Open Circle

         7 - Open Upward Triangle

         8 - Open Downward Triangle

         9 - Open Diamond

        10 - Open Square

        11 - Plus Sign

        12 - X

        13 - Star

        14 - Filed Rightfacing Triangle

        15 - Filled Leftfacing Triangle

        16 - Open Rightfacing Triangle

        17 - Open Leftfacing Triangle

        18 - No Symbol (the default).



       TITLE - The title of the plot. By default, a null string.



       XLOG = Set this keyword to use logarithmic axis styling on the X axis.



       XTITLE - The title of the X axis of the plot. By default, a null string.



       YLOG = Set this keyword to use logarithmic axis styling on the Y axis.



       YTITLE - The title of the Y axis of the plot. By default, a null string.



       In addition, any keyword appropriate for the MPI_PLOTCONFIG object program can be used.

       Among those keywords, are these most popular ones:



       CHARSIZE - The character size of the plot. By default, 1.0.



       CHARTHICK - The character thickness of the plot. By default, 1.0.



       FONT - The type of plot font: -1=Hershey, 0=Hardware, 1=True-Type. By default, !P.FONT.



       LINESTYLE - The plot linestyle. By default, 0. Possible values are:

         0 - Solid Line

         1 - Dotted

         2 - Dashed

         3 - Dash Dot

         4 - Dash Dot Dot

         5 - Long Dash

         6 - No Line



       POSITION - The position of the plot in the plot window in normalized coordinates. By default, [0.20, 0.15, 0.95, 0.95].



       SYMSIZE - The plot symbol size. By default, 1.0.



       THICK - The plot line thickness. By default, 1.0.



       TICKLEN - The plot tick length. By default, 0.02.



 COLOR NAMES:



        The following color names can be used for BACKGROUND, COLOR and DATACOLOR keywords:



           White, Snow, Ivory, Light Yellow, Cornsilk, Beige, Seashell, Linen, Antique White,

           Papaya, Almond, Bisque, Moccasin, Wheat, Burlywood, Tan, Light Gray, Lavender,

           Medium Gray, Gray, Slate Gray, Dark Gray , Charcoal, Black, Light Cyan, Powder Blue,

           Sky Blue, Steel Blue, Dodger Blue, Royal Blue, Blue, Navy, Honeydew, Pale Green,

           Aquamarine, Spring Green, Cyan, Turquoise, Sea Green, Forest Green, Green Yellow,

           Chartreuse, Lawn Green, Green, Lime Green, Olive Drab, Olive, Dark Green, Pale Goldenrod,

           Khaki, Dark Khaki, Yellow, Gold, Goldenrod, Dark Goldenrod, Saddle Brown, Rose,

           Pink, Rosy Brown, Sandy Brown, Peru, Indian Red, Chocolate, Sienna, Dark Salmon,

           Salmon, Light Salmon, Orange, Coral, Light Coral, Firebrick, Brown, Hot Pink,

           Deep Pink, Magenta, Tomato, Orange Red, Red, Violet Red, Maroon, Thistle, Plum,

           Violet, Orchid, Medium Orchid, Dark Orchid, Blue Violet, and Purple.



 REQUIRED PROGRAMS:



        The following programs are required to reside in your !PATH. They can be

        obtained from the Coyote Library:



                     http://www.dfanning.com/programs/adjustposition.pro

                     http://www.dfanning.com/programs/cw_drawcolor.pro

                     http://www.dfanning.com/programs/cw_spacer.pro

                     http://www.dfanning.com/programs/error_message.pro

                     http://www.dfanning.com/programs/fsc_color.pro

                     http://www.dfanning.com/programs/fsc_droplist.pro

                     http://www.dfanning.com/programs/fsc_field.pro

                     http://www.dfanning.com/programs/fsc_fileselect.pro

                     http://www.dfanning.com/programs/fsc_inputfield.pro

                     http://www.dfanning.com/programs/fsc_psconfig__define.pro

                     http://www.dfanning.com/programs/mpi_plotconfig__define.pro

                     http://www.dfanning.com/programs/mpi_axis.pro

                     http://www.dfanning.com/programs/mpi_axis__define.pro

                     http://www.dfanning.com/programs/pickcolorname.pro

                     http://www.dfanning.com/programs/psconfig.pro

                     http://www.dfanning.com/programs/pswindow.pro

                     http://www.dfanning.com/programs/tvread.pro



         All these programs can be obtained at once by downloading the MPI_PLOT zip file:



                     http://www.dfanning.com/programs/mpi_plot.zip





 COMMON BLOCK:



       The addition of the OVERPLOT keyword required a COMMON block named MPI_PLOT_COMMMON

       to store the program information pointer. This pointer is loaded in the COMMON block

       when the keyboard focus changes. Thus, to overplot into an MPI_PLOT window, first

       select the window with the cursor.



 RESTRICTIONS



       Colors will be loaded in the color table.



 EXAMPLE:



       x = Findgen(11) & y = Findgen(11)

       MPI_PLOT, x, y

       MPT_PLOT, Reverse(x), y, /Overplot, Linestyle=2



 MODIFICATION HISTORY:



       Written by David W. Fanning, March 2001, and offered to the IDL user

       community by the Max-Plank Institute of Meteorology in  Hamburg, Germany.

       Added OVERPLOT keyword and made numerous general improvements. 21 November 2001. DWF

       Removed restriction for only one copy of MPI_PLOT on display at once. 25 November 2001. DWF.

       Added XLOG and YLOG keywords. 7 May 2002. DWF.

       PostScript configuration now opens up with a plot window the same aspect

          ratio as the MPI_PLOT window. 21 August 2002. DWF.

(See mpi_plot.pro)


MPI_PLOTCONFIG__DEFINE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       MPI_PLOTCONFIG__DEFINE



 PURPOSE:



       This is a program for interactively adjusting and keeping track

       of keywords appropriate for configuring the PLOT command.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics



 CALLING SEQUENCE:



       plotConfigObj = Obj_New("MPI_PLOTCONFIG")



 INPUT PARAMETERS:



       None.



 INPUT KEYWORDS (Sent to the INIT method. The same keywords can be set with the SETPROPERTY method of the object.):



       BACKGROUND - The name of the background color. By default on 24-bit systems: 'IVORY'. ON 8-bit systems 'GRAY'.



       CHARSIZE - The character size of the plot. By default, 1.0.



       CHARTHICK - The character thickness of the plot. By default, 1.0.



       COLOR - The name of the plot color. (This will be the axis color if DATACOLOR is also used.)

         By default on 24-bit systems: 'SADDLE BROWN'. Uses 'GREEN' on 8-bit systems.



       DATACOLOR - The name of the data color. (Requires use of USEDATACOLOR to be active.) By default

         on 24-bit systems: 'NAVY'. Uses 'YELLOW' on 8-bit systems.



       _EXTRA - Extra keywords to be passed to MPI_AXIS objects used internally.



       FONT - The type of plot font: -1=Hershey, 0=Hardware, 1=True-Type. By default, !P.FONT.;



       LINESTYLE - The plot linestyle. By default, 0. Possible values are:

         0 - Solid Line

         1 - Dotted

         2 - Dashed

         3 - Dash Dot

         4 - Dash Dot Dot

         5 - Long Dash

         6 - No Line



       NOAXISINFO - Set this keyword to inhibit axis information on the GUI. By default, 0.



       POSITION - The position of the plot in the plot window in normalized coordinates. By default, [0.20, 0.15, 0.95, 0.95].



       PSYM - The plot symbol value. By default, 18. Possible values are:

         0 - Dot

         1 - Filled Circle

         2 - Filled Upward Triangle

         3 - Filled Downward Triangle

         4 - Filled Diamond

         5 - Filled Square

         6 - Open Circle

         7 - Open Upward Triangle

         8 - Open Downward Triangle

         9 - Open Diamond

        10 - Open Square

        11 - Plus Sign

        12 - X

        13 - Star

        14 - Filed Rightfacing Triangle

        15 - Filled Leftfacing Triangle

        16 - Open Rightfacing Triangle

        17 - Open Leftfacing Triangle

        18 - No Symbol (the default).



      SYMSIZE - The plot symbol size. By default, 1.0.



      SUBTITLE - The plot subtitle. By default, "".



      TITLE - The plot title. By default, "".



      THICK - The plot line thickness. By default, 1.0.



      TICKLEN - The plot tick length. By default, 0.02.



      USEDATACOLOR - Set this keyword to return a DATACOLOR field in the keyword structure. By default, 0.



      XAXIS - An MPI_AXIS object for the X axis. One is created by default, if not provided.



      YAXIS - An MPI_AXIS object for the Y axis. One is created by default, if not provided.



 METHOD PROCEDURES:



      GUI - This procedure method displays a graphical user interface that allows the user

            to change plot configuration parameters. The following keywords can be used:



            ALL_EVENTS - Set this keyword to have an event sent any time something in the

               GUI changes. The default is to send an event only when the user hits the ACCEPT button.

               Note that the NOTIFYID keyword must be used to generate events.



            BLOCK - Set this keyword if you want to block the command line. The default is to NOT block the command line.



            DEFAULTFONT - The name of a font to use as the default font.



            GROUP_LEADER - The group leader for this GUI. If this keyword is used, the program will be

               distroyed when the group leader is destroyed.



            LABELDEFAULTSIZE - The default screen size for a label. All labels are offsets from this size. 55 by default.

               The purpose of this keyword is to allow the user to modify the look of the GUI if different

               fonts are used.



            LABELFONT - The name of a font to use for program labels.



            NOTIFYID - A two-element array containing the widget identifier and top-level base ID of a widget

               designated to receive an event from this program. The event structure will be defined and sent

               like this:



                    Widget_Control, notifyid[0], Send_Event={ MPI_PLOTCONFIG_EVENT, $

                                                              ID: notifyid[0], $

                                                              TOP:notifyid[1], $

                                                              HANDLER: 0L, $

                                                              OBJECT: self }



               Most event handlers will be written so that they will get the plot keywords

               from the plot configuration object and draw the plot. A sample event handler might

               look like this:



                    PRO MPI_Plot_Configuration_Events, event

                    Widget_Control, event.top, Get_UValue=info, /No_Copy

                    WSet, info.wid

                    plotkeywords = event.object->GetKeywords()

                    Plot, info.indep, info.dep, _Extra=plotkeywords

                    Widget_Control, event.top, Set_UValue=info, /No_Copy

                    END



            XLONGFORM - By default, the X axis information is displayed in "short" form, with only the

               most relevant information readily available. Other axis information is accessed via buttons.

               Set this keyword to display the X axis information in a "long" form, in which all the axis

               information is immediately visible.



            YLONGFORM - By default, the Y axis information is displayed in "short" form, with only the

               most relevant information readily available. Other axis information is accessed via buttons.

               Set this keyword to display the Y axis information in a "long" form, in which all the axis

               information is immediately visible.



      SETPROPERTY - This procedure can be used to set the properties of the plot

               configuration object without using the graphical user interface. The

               keywords are identical to those used in the INIT method, above.



 METHOD FUNCTIONS:



      GETKEYWORDS - This function method contains no arguments or keywords. It returns a

            structure, with fields equivalent to PLOT keywords. The idea is that these

            keywords can be passed directly to the PLOT command using the keyword inheritance

            mechanism via the _EXTRA keyword to the plot command. A possible sequence of commands

            might look like this:



               IDL> plotConfigObj = Obj_New("MPI_PLOTCONFIG")   ; Create the plot configuration object.

               IDL> plotConfigObj->GUI, /Block                  ; Allow the user to configure the plot parameters.

               IDL> plotKeywords = plotConfigObj->GetKeywords() ; Get the plot keywords.

               IDL> Plot, x, y, _Extra=plotKeywords             ; Draw the plot in the way the user specified.

               IDL> Obj_Destroy, plotConfigObj                  ; Destroy the object when finished with it.



 PROGRAM NOTES:



      Color Names: Color names are those used with FSC_Color and PickColorName. See the

         documentation for those programs for instuctions on loading your own colors.

         To see the default colors and names, type this:



                IDL> color = PickColorName('yellow')



      Working with DataColor: Many people like to have the data color in a line plot

         different from the axis color. This requires two commands in IDL: a PLOT command

         with the NODATA keyword set, to draw in the axis color, followed by the OPLOT command,

         with the data drawn in the data color. Unfortunately, IDL only has a single COLOR keyword

         to represent both colors. So, you must be a bit resourceful to use this feature.



         The proper sequence of commands to use this feature of the plot configuration object

         will looks like this. First, initialize the object with the USEDATACOLOR keyword:



             plotConfigObj = Obj_New("MPI_PLOTCONFIG", /UseDataColor) ; Use the DataColor option.



         When you are ready to draw the plot, the keyword structure will have a new field named

         DataColor. Since this keyword is not recognized by the PLOT command, it will be ignored

         in the first PLOT command to draw the axes:



             plotKeywords = plotConfigObj->GetKeywords() ; Get the plot keywords.

             Plot, x, y, _Extra=plotKeywords, /NoData    ; Just draw the axes.



         Next, change the color field to the datacolor field value, and overplot the

         data onto the axes you just drew:



             plotKeywords.color = PlotKeywords.datacolor

             OPlot, x, y, _Extra=plotKeywords



         You can see an example of how this is done in the heavily documented example program

         MPI_PLOT, which you can use as a wrapper for the PLOT command with your own data, if you like.



      Required Programs: The following programs are required to reside in your !PATH. They can be

         obtained from the Coyote Library:



                     http://www.dfanning.com/programs/adjustposition.pro

                     http://www.dfanning.com/programs/cw_drawcolor.pro

                     http://www.dfanning.com/programs/cw_spacer.pro

                     http://www.dfanning.com/programs/error_message.pro

                     http://www.dfanning.com/programs/fsc_color.pro

                     http://www.dfanning.com/programs/fsc_droplist.pro

                     http://www.dfanning.com/programs/fsc_field.pro

                     http://www.dfanning.com/programs/fsc_plotwindow.pro

                     http://www.dfanning.com/programs/mpi_axis__define.pro

                     http://www.dfanning.com/programs/pickcolorname.pro

                     http://www.dfanning.com/programs/pswindow.pro

                     http://www.dfanning.com/programs/tvread.pro



 EXAMPLE:



       A heavily documented program, named MPI_PLOT, is supplied with this program.

       This program not only explains how to use the MPI_PLOTCONFIG__DEFINE program,

       it can be used as a wrapper program for the PLOT command that you can use with

       your own data. The program can be downloaded here:



                     http://www.dfanning.com/programs/mpi_plot.pro



 MODIFICATION HISTORY:



       Written by David Fanning, March 2001.

(See mpi_plotconfig__define.pro)


NORMALIZE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       NORMALIZE



 PURPOSE:



       This is a utility routine to calculate the scaling vector

       required to position a graphics primitive of specified range

       at a specific position in an arbitray coordinate system. The

       scaling vector is given as a two-element array like this:



          scalingVector = [translationFactor, scalingFactor]



       The scaling vector should be used with the [XYZ]COORD_CONV

       keywords of a graphics object or model. For example, if you

       wanted to scale an X axis into the coordinate range of -0.5 to 0.5,

       you might type something like this:



          xAxis->GetProperty, Range=xRange

          xScale = Normalize(xRange, Position=[-0.5, 0.5])

          xAxis, XCoord_Conv=xScale



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       2642 Bradbury Court

       Fort Collins, CO 80521 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Object Graphics



 CALLING SEQUENCE:

       xscaling = NORMALIZE(xrange, POSITION=position)



 INPUTS:

       XRANGE: A two-element vector specifying the data range.



 KEYWORD PARAMETERS:

       POSITION: A two-element vector specifying the location

       in the coordinate system you are scaling into. The vector [0,1]

       is used by default if POSITION is not specified.



 COMMON BLOCKS:

       None.



 EXAMPLE:

       See above.



 MODIFICATION HISTORY:

       Written by:  David Fanning, OCT 1997.

(See normalize.pro)


OBJECT_SHADE_SURF

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       OBJECT_SHADE_SURF



 PURPOSE:



       This program shows you the correct way to write an

       elevation-shaded surface in object graphics. This would

       be the equivalent of these direct graphics commands:



           Surface, data, Shades=BytScl(data)

           Shade_Surf, data, Shades=BytScl(data)



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       2642 Bradbury Court

       Fort Collins, CO 80521 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Object Graphics



 CALLING SEQUENCE:

       OBJECT_SHADE_SURF, data, x, y



 INPUTS:

       data: The 2D surface data.

       x:    A vector of X values, corresponding to the X values of data.

       y:    A vector of Y values, corresponding to the Y values of data.



 KEYWORD PARAMETERS:

       STYLE: Set equal to 1 for a wire-frame surface. Set equal to 2 for

       a solid surface (the default).



 COMMON BLOCKS:

       None.



 EXAMPLE:

       OBJECT_SHADE_SURF



 MODIFICATION HISTORY:

       Written by:  David Fanning, November 1998.

(See object_shade_surf.pro)


PICKCOLOR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       PICKCOLOR



 PURPOSE:



       A modal dialog widget allowing the user to select

       the RGB color triple specifying a color. The return

       value of the function is the color triple specifying the

       color or the "name" of the color if the NAME keyword is set.



 AUTHOR:

       FANNING SOFTWARE CONSULTING:

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics, Color Specification. See related program FSC_COLOR.



 CALLING SEQUENCE:



       color = PickColor(colorindex)



 RETURN VALUE:



       The return value of the function is a 1-by-3 array containing

       the values of the color triple that specifies the selected color.

       The color can be loaded, for example, in any color index:



           color = PickColor(240)

           TVLCT, color, 240



       The return value is the original color triple if the user

       selects the CANCEL button.



       IF the NAMES keyword is set, the return value of the function is

       the "name" of the selected color. This would be appropriate for

       passing to the FSC_COLOR program, for example.



 OPTIONAL INPUT POSITIONAL PARAMETERS:



       COLORINDEX: The color index of the color to be changed. If not

              specified the color index !D.Table_Size - 2 is used.

              The Current Color and the Color Sliders are set to the

              values of the color at this color index.



 OPTIONAL INPUT KEYWORD PARAMETERS:



       GROUP_LEADER: The group leader for this widget program. This

              keyword is required for MODAL operation. If not supplied

              the program is a BLOCKING widget. Be adviced, however, that

              the program will NOT work if called from a blocking widget

              program, unless a GROUP_LEADER is supplied.



       NAMES: Set this keyword to return the "name" of the selected color

              rather than its color triple.



       STARTINDEX: 88 pre-determined colors are loaded The STARTINDEX

              is the index in the color table where these 88 colors will

              be loaded. By default, it is !D.Table_Size - 89.



       TITLE: The title on the program's top-level base. By default the

              title is "Pick a Color".



 OPTIONAL INPUT KEYWORD PARAMETERS:



       CANCEL: A keyword that is set to 1 if the CANCEL button is selected

              and to 0 otherwise.



 COMMON BLOCKS:



       None.



 SIDE EFFECTS:



       88 pre-determined colors are loaded in the color table.

       In addition, the color index at COLORINDEX is modified while

       the program is on the display. When the program exits, the

       entry color table is restored. Thus, on 8-bit displays there

       might be some color effects in graphics windows while PICKCOLOR

       is on the display. Changes in the color table are not noticable

       on 16-bit and 24-bit displays.



 EXAMPLE:



       To specify a color for a plot in color decomposition OFF mode:



          Device, Decomposed=0

          !P.Color = !P.Color < (!D.Table_Size - 1)

          color = PickColor(!P.Color, Cancel=cancelled)

          IF NOT cancelled THEN BEGIN

              TVLCT, color, !P.Color

              Plot, data

          ENDIF



       To specify a color for a plot in color decomposition ON mode:



          Device, Decomposed=1

          color = PickColor(Cancel=cancelled)

          !P.Color = Color24(color)

          IF NOT cancelled THEN Plot, data



        To obtain the name of the selected color to pass to GetColor:



          selectedColor = PickColor(/Name)

          axisColor = FSC_Color(selectedColor, !D.Table_Size-4)



 MODIFICATION HISTORY:

       Written by: David Fanning, 28 Oct 99.

       Added NAME keyword. 18 March 2000, DWF.

       Fixed a small bug when choosing a colorindex less than !D.Table_Size-17. 20 April 2000. DWF.

       Added actual color names to label when NAMES keyword selected. 12 May 2000. DWF.

       Modified to use 88 colors and FSC_COLOR instead of 16 colors and GETCOLOR. 4 Dec 2000. DWF.

(See pickcolor.pro)


PICKCOLORNAME

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       PICKCOLORNAME



 PURPOSE:



       The purpose of this program is to provide a blocking

       or modal widget interface for selecting a color "name".

       The program uses colors familiar to the FSC_COLOR program,

       and is often used to select a color name for passing to FSC_COLOR.



 AUTHOR:



       FANNING SOFTWARE CONSULTING:

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics, Color Specification.



 CALLING SEQUENCE:



       colorName = PickColorName(startColorName)



 OPTIONAL INPUT PARAMETERS:



       startColorName: A string with the "name" of the color. Colors available are these:



                Almond   Antique White      Aquamarine           Beige          Bisque           Black

                  Blue     Blue Violet           Brown       Burlywood        Charcoal      Chartreuse

             Chocolate           Coral        Cornsilk            Cyan  Dark Goldenrod       Dark Gray

            Dark Green      Dark Khaki     Dark Orchid     Dark Salmon       Deep Pink     Dodger Blue

             Firebrick    Forest Green            Gold       Goldenrod            Gray           Green

          Green Yellow        Honeydew        Hot Pink      Indian Red           Ivory           Khaki

              Lavender      Lawn Green     Light Coral      Light Cyan      Light Gray    Light Salmon

          Light Yellow      Lime Green           Linen         Magenta          Maroon     Medium Gray

         Medium Orchid        Moccasin            Navy           Olive      Olive Drab          Orange

            Orange Red          Orchid  Pale Goldenrod      Pale Green          Papaya            Peru

                  Pink            Plum     Powder Blue          Purple             Red            Rose

            Rosy Brown      Royal Blue    Saddle Brown          Salmon     Sandy Brown       Sea Green

              Seashell          Sienna        Sky Blue      Slate Gray            Snow    Spring Green

            Steel Blue             Tan         Thistle          Tomato       Turquoise          Violet

            Violet Red           Wheat           White          Yellow





       The color WHITE is used if this parameter is absent.



 INPUT KEYWORD PARAMETERS:



       BOTTOM: The colors used in the program must be loaded somewhere

           in the color table. This keyword indicates where the colors

           start loading. By default BOTTOM is set equal to !D.Table_Size-NCOLORS-1.



       COLUMNS: Set this keyword to the number of columns the colors should

           be arranged in.



       FILENAME: The string name of an ASCII file that can be opened to read in

           color values and color names. There should be one color per row

           in the file. Please be sure there are no blank lines in the file.

           The format of each row should be:



              redValue  greenValue  blueValue  colorName



           Color values should be between 0 and 255. Any kind of white-space

           separation (blank characters, commas, or tabs) are allowed. The color

           name should be a string, but it should NOT be in quotes. A typical

           entry into the file would look like this:



               255   255   0   Yellow



       GROUP_LEADER: This identifies a group leader if the program is called

           from within a widget program. Note that this keyword MUST be provided

           if you want to guarantee modal widget functionality. (If you don't know

           what this means, believe me, you WANT to use this keyword, always.)



       INDEX: This keyword identifies a color table index where the selected color

           is to be loaded when the program exits. The default behavior is to restore

           the input color table and NOT load a color.



       TITLE: This keyword accepts a string value for the window title. The default

           is "Select a Color".



 OUTPUT KEYWORD PARAMETERS:



       CANCEL: On exit, this keyword value is set to 0 if the user selected

           the ACCEPT button. IF the user selected the CANCEL button, or

           closed the window in any other way, this keyword value is set to 1.



 COMMON BLOCKS:



       None.



 SIDE EFFECTS:



       Colors are loaded in the current color table. The input color table

       is restored when the program exits. This will only be noticable on

       8-bit displays. The startColorName is returned if the user cancels

       or destroys the widget before a selection is made. Users should

       check the CANCEL flag before using the returned color.



 EXAMPLE:



       To call the program from the IDL comamnd line:



         IDL> color = PickColorName("red") & Print, color



       To call the program from within a widget program:



         color = PickColorName("red", Group_Leader=event.top) & Print, color



 MODIFICATION HISTORY:



       Written by: David Fanning, 31 August 2000.

       Modified program to read colors from a file and to use more

         colors on 24-bit platforms. 16 October 2000. DWF.

       Added the COLUMNS keyword. 16 October 2000. DWF.

       Fixed a small problem with mapping a modal widget. 2 Jan 2001. DWF

(See pickcolorname.pro)


PRINTWINDOW

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   PRINTWINDOW



    This program sends the contents of the specified

    window to the default printer. The current window

    is used if a window index number is not provided.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



  Graphics



 CALLING SEQUENCE:



  IDL> PrintWindow, wid



 OPTIONAL POSITIONAL PARAMETERS:



   WID       The window index number of the window to send to the

             printer. !D.Window used by default.



 KEYWORD PARAMETERS:



   LANDSCAPE  If this keyword is set, the output is in Landscape

              mode. Otherwise, Portrait mode is used.



   PAGESIZE: Set this keyword to a string indicating the type

             of PostScript page size you want. Current values are "LETTER",

             "LEGAL", and "A4". Default is "LETTER".



 MODIFICATION HISTORY:



 Written by David Fanning based on previous PRINT_IT program. 29 July 2000.

(See printwindow.pro)


PROCESS

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       PROCESS



 PURPOSE:

       The purpose of this routine is to demonstrate a simple

       image processing program that runs as a "color aware"

       application. The program works on 8-bit, 16-bit, and

       24-bit displays. The image is displayed in a resizeable

       graphics window and the window contents can be saved as

       GIF or JPEG images. The application can "protect" its

       colors from other applications that change colors. The

       color protection is implemented via draw widget EXPOSE

       events or the Refresh Colors button in the menubar.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       2642 Bradbury Court

       Fort Collins, CO 80521 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Widgets.



 CALLING SEQUENCE:

       PROCESS



 INPUTS:

       image: An optional 2D image. The image is always scaled.



 KEYWORD PARAMETERS:

       BOTTOM: The lowest color index of the colors to be changed.



       GROUP: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       NCOLORS: This is the number of colors to load when a color table

       is selected.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       This is a non-blocking widget.



 RESTRICTIONS:

       The GETIMAGE and XCOLORS programs from the Fanning Consulting

       web page are required: http://www.dfanning.com/.



 EXAMPLE:

       To run the program, type:



       PROCESS



 MODIFICATION HISTORY:

       Written by:     David Fanning, 13 April 97.

       Fixed a bug in the TVImage call. 25 June 97. DWF.

       Extensively modified to incorporate changing ideas

         about color protection and operation on 8-bit and

         24-bit displays. 19 Oct 97. DWF.

       Whoops. Forgot to make *this* draw widget the current

         graphics window. 15 Nov 97. DWF.

       IDL 5.1 changed the way color decomposition works. Had

         to find a fix for this. 25 May 98. DWF.

(See process.pro)


PROGRESSBAR__DEFINE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       PROGRESSBAR__DEFINE



 PURPOSE:



       Creates a simple progress bar for indicating the progess of a looping

       operation in IDL.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Utilities



 CALLING SEQUENCE:



       progressBar = Obj_New("PROGRESSBAR")



 ARGUMENTS:



       None.



 KEYWORDS:



       COLOR:         The name of the color for the progress bar. By default: "red".



       Possible color names are those defined by FSC_COLOR:



                Almond   Antique White      Aquamarine           Beige          Bisque           Black

                  Blue     Blue Violet           Brown       Burlywood        Charcoal      Chartreuse

             Chocolate           Coral        Cornsilk            Cyan  Dark Goldenrod       Dark Gray

            Dark Green      Dark Khaki     Dark Orchid     Dark Salmon       Deep Pink     Dodger Blue

             Firebrick    Forest Green            Gold       Goldenrod            Gray           Green

          Green Yellow        Honeydew        Hot Pink      Indian Red           Ivory           Khaki

              Lavender      Lawn Green     Light Coral      Light Cyan      Light Gray    Light Salmon

          Light Yellow      Lime Green           Linen         Magenta          Maroon     Medium Gray

         Medium Orchid        Moccasin            Navy           Olive      Olive Drab          Orange

            Orange Red          Orchid  Pale Goldenrod      Pale Green          Papaya            Peru

                  Pink            Plum     Powder Blue          Purple             Red            Rose

            Rosy Brown      Royal Blue    Saddle Brown          Salmon     Sandy Brown       Sea Green

              Seashell          Sienna        Sky Blue      Slate Gray            Snow    Spring Green

            Steel Blue             Tan         Thistle          Tomato       Turquoise          Violet

            Violet Red           Wheat           White          Yellow



       GROUP_LEADER:  The group leader for the progress bar.



       NOCANCEL:      Set this keyword to eliminate the CANCEL button from the progres bar.



       TEXT:          The textual message that goes above the progress bar. By default:

                      "Operation in progress..."



       TITLE:         The title of the progress bar window. By default: "Progress Bar".



       XSIZE:         The X size of the progress bar itself. By default, 150 pixels.



       YSIZE:         The Y size of the progress bar itself. By default, 10 pixels.





 PROCEDURE:



       The user is responsible for starting, updating, checking for CANCEL events, and

       destroying the progress indicator. The sequence of commands might look

       like this:



          progressBar = Obj_New("PROGRESSBAR")

          progressBar -> Start

          FOR j=0,9 DO BEGIN

             IF progressBar -> CheckCancel() THEN BEGIN

                ok = Dialog_Message('The user cancelled operation.')

                RETURN

             ENDIF

             Wait, 0.5  ; Would probably be doing something ELSE here!

             progressBar -> Update, (j+1)*10

          ENDFOR

          progressBar -> Destroy



       See the example program at the end of this file for a working example of code.



 METHODS:



       CHECKCANCEL: This function method returns a 1 if the user has clicked

           the CANCEL button. Otherwise, it returns a 0.



          cancelled = progressBar -> CheckCancel()

          IF cancelled THEN progressBar->Destroy



       DESTROY: Destroys the progress bar widgets as well as the object.



          progressBar -> Destroy



       GETPROPERTY: Gets certain properties of the object.



          progressBar -> GetProperty, Color=currentColor



       SETPROPERTY: Allows the user to set certain properties of the object.



          progressBar -> SetProperty, Color='green'



       START: Puts the progress bar on the display and enables it to receive events.



          progressBar -> Start



       UPDATE: Updates the progress bar. Requires on argument, a number between 0

          and 100 that indicates the percent of progress bar that should be filled

          with a color.



          progressBar -> Update, 50



 EXAMPLE:



       See the example program at the bottom of this file.



 RESTRICTIONS:



       Note that progress bar cannot be run as a MODAL widget program and

       still capture CANCEL button events. Thus, user *may* be able to generate events

       in the calling program while this progress bar is in operation.



 DEPENDENCIES:



       This program requires FSC_COLOR from the Coyote Library:



          http://www.dfanning.com/programs/fsc_color.pro



 MODIFICATION HISTORY:



       Written by:  David W. Fanning, 19 September 2002.



(See progressbar__define.pro)


PSCONFIG

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   PSCONFIG



 PURPOSE:



   This program is simply a function wrapper for the FSC_PSCONFIG

   object program (fsc_psconfig__define.pro). It was written so

   that it could serve as a drop-in replacement for the PS_FORM

   program it replaces. It calls the object program's graphical

   user interface as a modal widget and returns the DEVICE keywords

   collected from the form in a form that is appropriate for

   configuring the PostScript device.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CALLING SEQUENCE:



   psKeywords = PSConfig()



 CATEGORY:



   Configuring PostScript output.



 DOCUMENTATION:



   Complete documentation for the FSC_PSCONFIG object, including

   keyword and method descriptions, and example programs using the object

   can be found on the Coyote's Guide to IDL Programming web page:



     http://www.dfanning.com/programs/docs/fsc_psconfig.html



 INPUT:



    psConfigObject -- An optional FSC_PSCONFIG object reference can be

       passed as an argument to the function. The object is not destroyed

       if passed in as an argument.



       psObject = Obj_New("FSC_PSCONFIG")

       keywords = PSConfig(psObject)



    Having the object means that you have an on-going and current record

    of exactly how your PostScript device is configured. Be sure to destroy

    the object when you are finished with it.



 KEYWORDS:



   Any keyword accepted by the FSC_PSCONFIG object can be used with

   this program. Here are a few of the most popular keywords.



   Bits_per_Pixel - The number of image bits saved for each image pixel: 2, 4, or 8. The default is 8.

   Color - Set this keyword to select Color PostScript output. Turned on by default.

   DefaultSetup - Set this keyword to the "name" of a default style. Current styles (you can easily

     create and add your own to the source code) are the following:



       "System (Portrait)" - The normal "default" system set-up. Also, "System".

       "System (Landcape)" - The normal "default" landscape system set-up.

       "Centered (Portrait)" - The window centered on the page. Also, "Center" or "Centered".

       "Centered (Landscape)" - The window centered on the landscape page. Also, "Landscape".

       "Square (Portrait)" - A square plot, centered on the page.

       "Square (Landscape)" - A square plot, centered on the landscape page.

       "Figure (Small)" - A small encapsulated figure size, centered on page. Also, "Encapsulated" or "Encapsulate".

       "Figure (Large)" - A larger encapsulated figure size, centered on page. Also, "Figure".

       "Color (Portrait)" - A "centered" plot, with color turned on. Also, "Color".

       "Color (Landscape)" - A "centered" landscape plot, with color turned on.



   Directory - Set this keyword to the name of the starting directory. The current directory is used by default.

   Encapsulate - Set this keyword to select Encapsulated PostScript output. Turned off by default.

   European - Set this keyword to indicate "european" mode (i.e., A4 page and centimeter units). Turned off by default.

   Filename - Set thie keyword to the name of the PostScript file. The default is "idl.ps".

   Inches - Set this keyword to indicate sizes and offsets are in inches as opposed to centimeters. Set by European keyword by default.

   Landscape - Set this keyword to select Landscape page output. Portrait page output is the default.

   PageType - Set this keyword to the "type" of page. Possible values are:

       "Letter" - 8.5 by 11 inches. (Default, unless the European keyword is set.)

       "Legal" - 8.5 by 14 inches.

       "Ledger" - 11 by 17 inches.

       "A4" - 21.0 by 29.7 centimeters. (Default, if the European keyword is set.)

   XOffset - Set this keyword to the X Offset. Uses "System (Portrait)" defaults. (Note: offset calculated from lower-left corner of page.)

   XSize - Set this keyword to the X size of the PostScript "window". Uses "System (Portrait)" defaults.

   YOffset - Set this keyword to the Y Offset. Uses "System (Portrait)" defaults. (Note: offset calculated from lower-left corner of page.)

   YSize - Set this keyword to the Y size of the PostScript "window". Uses "System (Portrait)" defaults.



   In addition, the following keywords can be used:



   CANCEL -- An output keyword that will be set to 1 if the user

   chooses the Cancel button on the form. It will be 0 otherwise.



   FONTINFO -- Set this keyword is you wish to have font information

   appear on the form. The default is to not include font information.



   FONTTYPE -- Set this keyword to a named variable that will indicate

   the user's preference for font type. Values will be -1 (Hershey fonts),

   0 (hardware fonts), and 1 (true-type fonts). This keyword will always

   return -1 unless the FONTINFO keyword has also been set.



   GROUP_LEADER -- Set this keyword to a widget identifier of the widget

   you wish to be a group leader for this program.



 EXAMPLE:



   To have the user specify PostScript configuration parameters, use

   the program like this:



     keywords = PSConfig(Cancel=cancelled)

     IF cancelled THEN RETURN

     thisDevice = !D.Name

     Set_Plot, 'PS'

     Device, _Extra=keywords

     Plot, findgen(11) ; Or whatever graphics commands you use.

     Device, /Close_File

     Set_Plot, thisDevice



 OTHER PROGRAMS NEEDED:



   The following programs are required to run this one:



     fsc_droplist.pro

     fsc_fileselect.pro

     fsc_inputfield.pro

     fsc_plotwindow

     fsc_psconfig__define.pro



 MODIFICATIONS:



   Written by David Fanning, 31 January 2000.

(See psconfig.pro)


PSWINDOW

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

    PSWINDOW



 PURPOSE:



    This function is used to calculate the size of a PostScript

    window that has the same aspect ratio (ratio of height to

    width) as the current display graphics window. It creates

    the largest possible PostScript output window with the

    desired aspect ratio. This assures that graphics output

    looks similar, if not identical, to PostScript output.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



    Graphics.



 CALLING SEQUENCE:



    pageInfo = PSWINDOW()



 INPUTS:



    None.



 KEYWORD PARAMETERS:



    CM: Normally the structure value that is returned from this

    function reports its values in inches. Setting this keyword

    causes the return values to be in units of centimeters.



    FUDGE: A quick way to set symetrical XFUDGE and YFUDGE factors.

    If this keyword is set to a value, XFUDGE and YFUDGE keywords are

    set to the same value.



    LANDSCAPE: Normally this function assumes a PostScript window

    in Portrait mode. Setting this keyword assumes you want

    the graphic in Landscape mode.



    MARGIN:  The margin around the edges of the plot. The value must be

    a floating point value between 0.0 and 0.5. It is expressed in

    normalized coordinate units. The default margin is 0.15.



    PAGESIZE: Set this keyword to a string indicating the type

    of PostScript page size you want. Current values are "LETTER",

    "LEGAL", and "A4". Default is "LETTER".



    PRINTER: Set this keyword if the output will be used to

    configure the PRINTER device, rather than the PS device.

    (In the PRINTER device, offsets are always calculated from

    the lower-left corner of the page and do not rotate in

    Landscape mode, as they do with the PS device.) Note that

    the PRINTER device is only able to accept these keywords

    in IDL 5.1 and higher.



    XFUDGE: Printers calculate the offset point from the printable

    edge of the paper (sometimes), rather from the corner of the paper.

    For example, on my Lexmark printer, both X and Y offsets are

    calculated from a point 0.25 inches in from the edge. This keyword

    allows you to set a "fudge" factor that will be subtracted from

    the XOFFSET that is returned to the user. This allows you to create

    output that is centered on the page. The fudge factor should be in

    the same units as the returned size and offset values.



    YFUDGE: Printers calculate the offset point from the printable

    edge of the paper (sometimes), rather from the corner of the paper.

    For example, on my Lexmark printer, both X and Y offsets are

    calculated from a point 0.25 inches in from the edge. This keyword

    allows you to set a "fudge" factor that will be subtracted from

    the YOFFSET that is returned to the user. This allows you to create

    output that is centered on the page. The fudge factor should be in

    the same units as the returned size and offset values.



 OUTPUTS:



    pageInfo: The output value is a named structure defined like

    this:



      pageInfo = {PSWINDOW_STRUCT, XSIZE:0.0, YSIZE:0.0, $

         XOFSET:0.0, YOFFSET:0.0, INCHES:0, PORTRAIT:0, LANDSCAPE:0}



    The units of the four size fields are inches unless the CM

    keyword is set.



    The output can be used to immediately configure the PostScript

    or Printer device, like this:



       Set_Plot, 'PS' ; or 'PRINTER'

       Device, _Extra=pageInfo



 RESTRICTIONS:



    The aspect ratio of the current graphics window is calculated

    like this:



       aspectRatio = FLOAT(!D.Y_VSIZE) / !D.X_VSIZE



 EXAMPLE:



    To create a PostScript output window with the same aspect

    ratio as the curently active display window, type:



     pageInfo = PSWINDOW()

     SET_PLOT, 'PS'

     DEVICE, _Extra=pageInfo



     To configure the PRINTER device:



     pageInfo = PSWINDOW(/Printer, Fudge=0.25)

     SET_PLOT, 'PRINTER'

     DEVICE, _Extra=pageInfo



 MODIFICATION HISTORY:



    Written by: David Fanning, November 1996.

       Fixed a bug in which the YOFFSET was calculated incorrectly

          in Landscape mode. 12 Feb 97.

       Took out a line of code that wasn't being used. 14 Mar 97.

       Added correct units keyword to return structure. 29 JUN 98. DWF

       Fixed a bug in how landscape offsets were calculated. 19 JUL 99. DWF.

       Fixed a bug in the way margins were used to conform to my

          original conception of the program. 19 JUL 99. DWF.

       Added Landscape and Portrait fields to the return structure. 19 JUL 99. DWF.

       Added PageSize keyword, changed MARGIN keyword, and completely

          rewrote most of the intenal code. 9 FEB 2000. DWF.

       Fixed a bug in how I calculated the aspect ratio. 1 MAR 2000. DWF.

       Added PRINTER keyword to return proper offset values for the

          PRINTER device, where the offset location is not rotated. 1 MAR 2000. DWF.

       Added PRINTER fudge factors to take into account that printer offsets are

          calculated from the printable area of the paper, rather than the corner

          of the paper. 8 AUG 2000. DWF.

(See pswindow.pro)


REVERSE_AXES

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       REVERSE_AXES



 PURPOSE:



       The purpose of this program is to extend the SIMPLE_SURFACE

       program to demonstrate how to create reversible axes in

       object graphics.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Widgets, Object Graphics.



 CALLING SEQUENCE:



       REVERSE_AXES, data, x, y



 REQUIRED INPUTS:



       None. Fake data will be used if no data is supplied in call.



 OPTIONAL INPUTS



       data: A 2D array of surface data.



       x: A vector of X data values.



       y: A vector of Y data values.



 OPTIONAL KEYWORD PARAMETERS:



       EXACT:  Set this keyword to get exact axis scaling.



       _EXTRA: This keyword collects otherwise undefined keywords that are

        passed to the surface initialization routine.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       LANDSCAPE: Set this keyword if you are printing in landscape mode. The

       default is Portrait mode. The Landscape keyword on the PRINTER object

       is set, but not all printers will honor this keyword setting. If yours

       does not, set Landscape mode in the Printer Setup dialog.



       VECTOR: Set this keyword if you want vector printing (as opposed to

       the default bitmap printing).



       XTITLE: A string used as the X title of the plot.



       YTITLE: A string used as the Y title of the plot.



       ZTITLE: A string used as the Z title of the plot.



 COMMON BLOCKS:



       None.



 EXAMPLE:



       To use this program with your 2D data, type:



        IDL> Reverse_Axes, data



 MODIFICATION HISTORY:



  Written by: David Fanning, October 2001.

(See reverse_axes.pro)


SCALE_VECTOR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       SCALE_VECTOR



 PURPOSE:



       This is a utility routine to scale the points of a vector

       (or an array) into a given data range. The minimum value of

       the vector (or array) is set equal to the minimum data range. And

       the maximum value of the vector (or array) is set equal to the

       maximum data range.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Utilities



 CALLING SEQUENCE:



       scaledVector = SCALE_VECTOR(vector, minRange, maxRange)



 INPUT POSITIONAL PARAMETERS:



       vector:   The vector (or array) to be scaled.

       minRange: The minimum value of the scaled vector. Set to 0 by default.

       maxRange: The maximum value of the scaled vector. Set to 1 by default.



 INPUT KEYWORD PARAMETERS:



       MAXVALUE: Any value in the input vector greater than this value is

                 set to this value before scaling.



       MINVALUE: Any value in the input vector less than this value is

                 set to this value before scaling.



       NAN:      Set this keyword to enable not-a-number checking. NANs

                 in vector will be ignored.



 RETURN VALUE:



       scaledVector: The vector (or array) values scaled into the data range.

           This is always at least a FLOAT value.



 COMMON BLOCKS:

       None.



 EXAMPLE:



       x = [3, 5, 0, 10]

       xscaled = SCALE_VECTOR(x, -50, 50)

       Print, xscaled

          -20.0000     0.000000     -50.0000      50.0000





 MODIFICATION HISTORY:



       Written by:  David Fanning, 12 Dec 1998.

       Added MAXVALUE and MINVALUE keywords. 5 Dec 1999. DWF.

       Added NAN keyword at request of Ben Tupper. 18 Sept 2000. DWF.

(See scale_vector.pro)


SELECTIMAGE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   SELECTIMAGE



 PURPOSE:



   The purpose of this program is to allow the user to select

   an image file for reading. The image data is returned as the

   result of the function. The best feature of this program is

   the opportunity to browse the image before reading it.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



   General programming.



 CALLING SEQUENCE:



   image = SelectImage()



 INPUT PARAMETERS:



   None. All input is via keywords.



 INPUT KEYWORDS:



   BMP -- Set this keyword to select BMP files.



   DICOM -- Set this keyword to select DICOM files.



   DIRECTORY -- The initial input directory name. The current directory by default.



   FILENAME -- The initial filename. If the initial directory has image files of the

               correct type, the default is to display the first of these files. Otherwise, blank.



   FLIPIMAGE -- Set this keyword if you wish to flip the image from its current orientation. Setting

                this keyword reverses the Y dimension of the image.



   _EXTRA -- This keyword is used to collect and pass keywords on to the FSC_FILESELECT object. See

             the code for FSC_FILESELECT for details.

   GIF -- Set this keyword to select GIF files. This capability is not available in IDL 5.4 and higher.



   GROUP_LEADER -- Set this keyword to a widget identifier group leader. This keyword MUST be

                   set when calling this program from another widget program to guarantee modal operation.



   JPEG -- Set this keyword to select JPEG files.



   ONLY2D -- Set this keyword if you only want the user to be able to select 2D images. Note

             that the user will be able to browse all images, but the Accept button will only

             be sensitive for 2D images.



   PICT -- Set this keyword to select PICT files.



   PNG -- Set this keyword to select PNG files.



   PREVIEWSIZE -- Set this keyword to the maximum size (in pixels) of the preview window. Default is 150.



   TIFF -- Set this keyword to select TIFF files. (This is the default filter selection.)



 OUTPUT KEYWORDS:



   CANCEL -- This keyword is set to 1 if the user exits the program in any way except hitting the ACCEPT button.

             The ACCEPT button will set this keyword to 0.



   FILEINFO -- This keyword returns information about the selected file. Obtained from the QUERY_**** functions.



   OUTDIRECTORY -- The directory where the selected file is found.



   OUTFILENAME -- The short filename of the selected file.



 COMMON BLOCKS:



   None.



 RESTRICTIONS:



   Probably doesn't work correctly on VMS systems :-( If you can help, please

   contact me. I don't have a VMS system to test on.



 OTHER COYOTE LIBRARY FILES REQUIRED:



  http://www.dfanning.com/programs/error_message.pro

  http://www.dfanning.com/programs/fsc_fileselect.pro

  http://www.dfanning.com/programs/tvimage.pro



 EXAMPLE:



   To read JPEG files from the directory:



      IDL> image = SelectImage(/JPEG)



 MODIFICATION HISTORY:



   Written by: David W. Fanning, 18 Jan 2001.

   Added modification to read both 8-bit and 24-bit BMP files. 27 Jan 2001. DWF.

   Fixed a problem with calculating the new size of the draw widget. 5 April 2002. DWF.

   Fixed a problem with List Widgets not sizing correctly on UNIX machines. 10 Aug 2002. DWF.

   Fixed a problem with the initial file not being selected correctly when you changed

     the file type. 10 Aug 2002. DWF.

   Added a FLIPIMAGE keyword 10 Aug 2002. DWF.

   When user chooses to Flip Image, I now reverse the Y dimension of the image,

     rather than set the !Order system variable. 10 Aug 2002. DWF.

   Added OUTDIRECTORY and OUTFILENAME keywords. 18 Aug 2002. DWF.

   Fairly extensive changes in the way this program works and selects images.

     A new version of FSC_FileSelect is also required. Because of interactions

     with the operating system with image filters, the program has probably

     become more Windows-centric. The default is now to display all image

     files the program is capable of reading. 31 October 2002. DWF.

   Added ONLY2D keyword to allow the acceptance of 2D images only. 3 Nov 2002. DWF.

(See selectimage.pro)


SELECT_OBJECTS

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       SELECT_OBJECTS



 PURPOSE:

       The purpose of this program is to demonstrate how to select

       and move objects in an object graphics window. Once the objects

       appear in the window, use your mouse to select the objects and

       move them in the window. The window is resizeable.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       2642 Bradbury Court

       Fort Collins, CO 80521 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Object Graphics.



 CALLING SEQUENCE:

       SELECT_OBJECTS



 REQUIRED INPUTS:

       None.



 KEYWORD PARAMETERS:

       None.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 RESTRICTIONS:

       Requires VCOLORBAR from the Coyote Library:

           http://www.dfanning.com/programs/vcolorbar__define.pro.



 EXAMPLE:

       Select_Objects



 MODIFICATION HISTORY:

       Written by David Fanning, 21 September 98.

       Added the ability to shrink and expand the objects. 27 Sept 98. DWF.

(See select_objects.pro)


SHOWPROGRESS__DEFINE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       SHOWPROGRESS__DEFINE



 PURPOSE:



       An object for creating a progress bar.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Utilities



 CALLING SEQUENCE:



       progressBar = Obj_New("SHOWPROGRESS")



 INPUTS:



       parent: A widget identifier of the widget that will be the

           group leader for this program. It is *required* for modal

           operation. If missing, you are on your own. :-(



 KEYWORDS:



      CANCELBUTTON: Set this keyword if a Cancel button is desired.

      DELAY: The total time the widget should be on the display in AutoUpDate

           mode. The keyword applies only to AutoUpDate mode. Default is 5 seconds.

      STEPS: The number of steps to take in AutoUpDate mode. The keyword applies only

           to AutoUpDate mode.

      MESSAGE: The text of the label above the progress bar. Default is "Operation

           in Progress...".

      TITLE: ; The text of the top-level base title bar. Default is ""

      COLOR: The color to draw the progress bar.

      XSIZE: The XSize of the progress bar in Device coordinates. Default is 150.

      YSIZE: The YSize of the progress bar in Device coordinates. Default is 10.

      AUTOUPDATE: Set this keyword to be in AutoUpDate mode.





 PROCEDURE:

       There are two modes. In AutoUpDate mode, a delay and number of steps is

       required. The modal widget stays on the display until the total time

       exceeds the DELAY or the requested number of steps is taken. A TIMER

       widget is used to generate update events. Nothing can be going on

       concurrently in AutoUpDate mode. To enter AutoUpDate mode, type this:



          progressBar = Obj_New("SHOWPROGRESS", /AutoUpDate, Delay=2, Steps=10)

          progressBar->Start

          Obj_Destroy, progressBar



       The program will update and destroy itself automatically. (The object

       itself is not destroyed. You must do this explicitly, as in the example

       above.)



       In normal mode, the user is responsible for starting, updating, and

       destroying the progress indicator. The sequence of commands might look

       like this:



          progressBar = Obj_New("SHOWPROGRESS")

          progressBar->Start

          FOR j=0,9 DO BEGIN

             Wait, 0.5  ; Would probably be doing something ELSE here!

             progressBar->Update, (j+1)*10

          ENDFOR

          progressBar->Destroy

          Obj_Destroy, progressBar



       Normal mode gives you the opportunity to update the Progress Bar

       in a loop while something else is going on. See the example program

       at the end of this file.



       Note that the object itself is not destroyed when calling the DESTROY

       method. You must explicitly destroy the object, as in the example above.



 METHODS:



       CHECKCANCEL: This function method returns a 1 if the user has clicked

           the CANCEL button. Otherwise, it returns a 0.



          cancelled = progressBar->CheckCancel()

          IF cancelled THEN progressBar->Destroy



       DESTROY: Destroys the ShowProgress widgets. It does NOT destroy the object.



          progressBar->Destroy



       GETPROPERTY: Gets the properties that can be set in the INIT method, including

          the parent widget ID.



          progressBar->GetProperty, Steps=currentNSteps, Delay=currentDelay



       SETCOLOR: Changes the color of the progress bar.



           progressBar->SetColor, !P.Color



       SETLABEL: Changes the text on the widget label.



           progressBar->SetLabel, 'This text instead'



       SETPROPERTY: Allows the user to set the INIT parameter via keywords.



          progressBar->SetProperty, Color=244, XSize=200, Message='Please Wait...'



       START: Puts the ShowProgress bar on the display. In AutoUpDate mode, the

          widget starts to automatically update.



          progressBar->Start



       UPDATE: Updates the progress bar. Requires on argument, a number between 0

          and 100 that indicates the percent of progress bar that should be filled

          with a color.



          progressBar->Update, 50



 EXAMPLE:



       See the example program at the bottom of this file.



 RESTRICTIONS:



       In contradiction to the IDL documentation, making the parent widget

          insensitive in normal mode does NOT prevent the parent widgets from

          receiving events on my Windows NT 4.0, SP 4 system running IDL 5.2,

          IDL 5.2.1, or IDL 5.3 (beta).



       Note that if you specify a CANCEL button the Show Progress program CANNOT

       run as a MODAL widget program. Thus, user *may* be able to generate events

       in the calling program while this program is running.



 MODIFICATION HISTORY:

       Written by:  David Fanning, 26 July 1999.

       Added code so that the current graphics window doesn't change. 1 September 1999. DWF.

       Added yet more code for the same purpose. 3 September 1999. DWF.

       Added a CANCEL button and made other minor modifications. 12 Oct 1999. DWF.

(See showprogress__define.pro)


SIMPLE_SURFACE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       SIMPLE_SURFACE



 PURPOSE:



       The purpose of this program is to demonstrate how to

       create a simple surface plot with axes and rotational

       capability in object graphics.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Widgets, Object Graphics.



 CALLING SEQUENCE:



       SIMPLE_SURFACE, data, x, y



 REQUIRED INPUTS:



       None. Fake data will be used if no data is supplied in call.



 OPTIONAL INPUTS



       data: A 2D array of surface data.



       x: A vector of X data values.



       y: A vector of Y data values.



 OPTIONAL KEYWORD PARAMETERS:



       EXACT:  Set this keyword to get exact axis scaling.



       _EXTRA: This keyword collects otherwise undefined keywords that are

        passed to the surface initialization routine.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       LANDSCAPE: Set this keyword if you are printing in landscape mode. The

       default is Portrait mode. The Landscape keyword on the PRINTER object

       is set, but not all printers will honor this keyword setting. If yours

       does not, set Landscape mode in the Printer Setup dialog.



       VECTOR: Set this keyword if you want vector printing (as opposed to

       the default bitmap printing).



       XTITLE: A string used as the X title of the plot.



       YTITLE: A string used as the Y title of the plot.



       ZTITLE: A string used as the Z title of the plot.



 COMMON BLOCKS:

       None.



 EXAMPLE:

       To use this program with your 2D data, type:



        IDL> Simple_Surface, data

(See simple_surface.pro)


STR_SIZE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

  STR_SIZE



 PURPOSE:



  The purpose of this function is to return the proper

  character size to make a specified string a specifed

  width in a window. The width is specified in normalized

  coordinates. The function is extremely useful for sizing

  strings and labels in resizeable graphics windows.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   2642 Bradbury Court

   Fort Collins, CO 80521 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



  Graphics Programs, Widgets.



 CALLING SEQUENCE:



  thisCharSize = STR_SIZE(thisSting, targetWidth)



 INPUTS:



  thisString:  This is the string that you want to make a specifed

     target size or width.



 OPTIONAL INPUTS:



  targetWidth:  This is the target width of the string in normalized

     coordinates in the current graphics window. The character

     size of the string (returned as thisCharSize) will be

     calculated to get the string width as close as possible to

     the target width. The default is 0.25.



 KEYWORD PARAMETERS:



  INITSIZE:  This is the initial size of the string. Default is 1.0.



  STEP:   This is the amount the string size will change in each step

     of the interative process of calculating the string size.

     The default value is 0.05.



 OUTPUTS:



  thisCharSize:  This is the size the specified string should be set

     to if you want to produce output of the specified target

     width. The value is in standard character size units where

     1.0 is the standard character size.



 EXAMPLE:



  To make the string "Happy Holidays" take up 30% of the width of

  the current graphics window, type this:



               XYOUTS, 0.5, 0.5, ALIGN=0.5, "Happy Holidays", $

        CHARSIZE=STR_SIZE("Happy Holidays", 0.3)



 MODIFICATION HISTORY:



  Written by: David Fanning, 17 DEC 96.

  Added a scaling factor to take into account the aspect ratio

     of the window in determing the character size. 28 Oct 97. DWF

  Added check to be sure hardware fonts are not selected. 29 April 2000. DWF.

  Added a pixmap to get proper scaling in skinny windows. 16 May 2000. DWF.

  Forgot I can't do pixmaps in all devices. :-( Fixed. 7 Aug 2000. DWF.

(See str_size.pro)


TEXTBOX

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

  TEXTBOX



 PURPOSE:



  This function allows the user to type some text in a

  pop-up dialog widget and have it returned to the program.

  This is an example of a Pop-Up Dialog Widget.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



  Utility, Widgets



 CALLING SEQUENCE:



  thetext = TextBox()



 INPUTS:



  None.



 KEYWORD PARAMETERS:



  CANCEL: An output parameter. If the user kills the widget or clicks the Cancel

       button this keyword is set to 1. It is set to 0 otherwise. It

       allows you to determine if the user canceled the dialog without

       having to check the validity of the answer.



       theText = TextBox(Title='Provide Phone Number...', Label='Number:', Cancel=cancelled)

       IF cancelled THEN Return



  GROUP_LEADER: The widget ID of the group leader of this pop-up

       dialog. This should be provided if you are calling

       the program from within a widget program:



          thetext = TextBox(Group_Leader=event.top)



       If a group leader is not provided, an unmapped top-level base widget

       will be created as a group leader.



  LABEL: A string the appears to the left of the text box.



  TITLE:  The title of the top-level base. If not specified, the

       string 'Provide Input:' is used by default.



  XSIZE: The size of the text widget in pixel units. By default, 200.



 OUTPUTS:



  theText: The string of characters the user typed in the

       text widget. No error checking is done.



 RESTRICTIONS:



  The widget is destroyed if the user clicks on either button or

  if they hit a carriage return (CR) in the text widget. The

  text is recorded if the user hits the ACCEPT button or hits

  a CR in the text widget.



 MODIFICATION HISTORY:



  Written by: David Fanning, December 20, 2001.

(See textbox.pro)


TEXTURE_SURFACE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       TEXTURE_SURFACE



 PURPOSE:



       The purpose of this program is to demonstrate how to

       create a simple surface plot with an image applied as

       a texture in object graphics.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Widgets, Object Graphics.



 CALLING SEQUENCE:



       TEXTURE_SURFACE, data, x, y, Image=image



 REQUIRED INPUTS:



       None. Fake data will be used if no data is supplied in call.



 OPTIONAL INPUTS



       data: A 2D array of surface data.



       x: A vector of X data values.



       y: A vector of Y data values.



 OPTIONAL KEYWORD PARAMETERS:



       BORDERCOLOR : A three element array [R, G, B] describing the color

       used to draw the non-textured part of the surface if POSITION is

       specified.



       COLORTABLE: The number of an IDL color table to use for the image

       texture. Used only if the supplied image is 2D. Ignored otherwise.



       EXACT:  Set this keyword to get exact axis scaling.



       _EXTRA: This keyword collects otherwise undefined keywords that are

        passed to the surface initialization routine.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       IMAGE: An 8-bit or 24-bit image you wish to use for the image texture.



       LANDSCAPE: Set this keyword if you are printing in landscape mode. The

       default is Portrait mode. The Landscape keyword on the PRINTER object

       is set, but not all printers will honor this keyword setting. If yours

       does not, set Landscape mode in the Printer Setup dialog.



       POSITION: A four element array of the form [x1, y1, x2, y2] that will

       position the image with its lower-left corner at (x1,y1) and its upper-

       right corner at (x2,y2) in the device coordinate system of the surface.

       In other words, if my surface is a 41 by 41 array, and I want the image

       positioned with lower-left at (5,10) and upper-right at (25,18), then

       I call the program like this: Texture_Surface, Position=[5, 10, 25, 18].



       VECTOR: Set this keyword if you want vector printing (as opposed to

       the default bitmap printing).



       XTITLE: A string used as the X title of the plot.



       YTITLE: A string used as the Y title of the plot.



       ZSCALE: A number larger than or equal to 0.001 and less than or equal to 1.0 that affects Z scaling.



       ZTITLE: A string used as the Z title of the plot.



 COMMON BLOCKS:



       None.



 EXAMPLE:



       To use this program with your surface data and 2D image, type:



        IDL> data = Loaddata(2)

        IDL> image = Loaddata(7)

        IDL> Texture_Surface, data, Image=image, Colortable=33



 RESTRICTIONS:



        Requires the ASPECT program from the Coyote Library:



           http://www.dfanning.com/programs/aspect.pro



 MODIFICATION HISTORY



       Written by David W. Fanning, 1 Nov 2001, from previous Simple_Surface code.

       Modifications suggested by Karl Shultz added to allow surface color

          specification and improved resolution about image edges when

          positioning images. BORDERCOLOR keyword added. DWF. 4 Nov 2001.

       The surface now maintains the same X/Y aspect ratio as the surface data. DWF. 8 April 2002.

       Added ZSCALE keyword. DWF. 8 April 2002.

(See texture_surface.pro)


TRANSFORM_VOLUME

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       TRANSFORM_VOLUME



 PURPOSE:



       The purpose of this program is to transform (e.g., rotate,

       scale, and translate) a 3D array or volume.



 AUTHOR:



       Martin Downing,

       Clinical Research Physicist,

       Grampian Orthopaedic RSA Research Centre,

       Woodend Hospital, Aberdeen, AB15 6LS.

       Pnone: 01224 556055 / 07903901612

       Fa: 01224 556662

       E-mail: m.downing@abdn.ac.uk



 CATEGORY:



      Mathematics, graphics.



 CALLING SEQUENCE:



      result = TRANSFORM_VOLUME( volume )



 INPUTS:



       volume:    The 3D array or volume to be transformed.



 OPTIONAL KEYWORDS:



      BUFFER_SIZE: To reduce memory overhead the routine processes the job in chunks, the number

         of elements of which can be set using the BUFFER_SIZE keyword, set this keyword to

         0 to force the whole array to be processed at one time. The default value is 128.



      MISSING: The value to return for transformed values outside the bounds of

         the volume. (Passed to the INTERPOLATE function.) Default is 0.



      T3DMAT: The homogeneous transforamtion matrix. If this keyword is not present,

         the following keywords can be used to create a homogeneous transformation matrix:



         ROTATION - The rotation vector [rx,ry,rz]. The order of rotation is ZYX.

         TRANSLATE - The translation vector [tx,ty,tz].

         SCALE - The scale vector [sx,sy,sz].

         CENTRE_ROTATION - The centre of rotation [cx,cy,cz].



 OUTPUTS:



       result:    The transformed array or volume.



 COMMON BLOCKS:



       None.



 DEPENDENCIES:



       The program uses the library INTERPLOLATE routine, which currently (IDL 5.4)

       uses linear interpolation. Note that the operation is performed in chunks,

       each of which is independant of the result of the others, so the operation

       could easiliy be parallelised.



 MODIFICATION HISTORY:



       Written by: Martin Downing, 16 September 2001.

       Added MISSING keyword. Removed INPLACE keyword. 25 Nov 2001. MD

(See transform_volume.pro)


TVIMAGE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

     TVIMAGE



 PURPOSE:

     This purpose of TVIMAGE is to enable the TV command in IDL

     to be a completely device-independent and color-decomposition-

     state independent command. On 24-bit displays color decomposition

     is always turned off for 8-bit images and on for 24-bit images.

     The color decomposition state is restored for those versions of

     IDL that support it (> 5.2). Moreover, TVIMAGE adds features

     that TV lacks. For example, images can be positioned in windows

     using the POSITION keyword like other IDL graphics commands.

     TVIMAGE also supports the !P.MULTI system variable, unlike the

     TV command. TVIMAGE was written to work especially well in

     resizeable graphics windows. Note that if you wish to preserve

     the aspect ratio of images in resizeable windows, you should set

     the KEEP_ASPECT_RATIO keyword, described below. TVIMAGE works

     equally well on the display, in the PostScript device, and in

     the Printer and Z-Graphics Buffer devices. The TRUE keyword is

     set automatically to the correct value for 24-bit images, so you

     don't need to specify it when using TVIMAGE.



 AUTHOR:

       FANNING SOFTWARE CONSULTING:

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:

     Graphics display.



 CALLING SEQUENCE:



     TVIMAGE, image



 INPUTS:

     image:    A 2D or 3D image array. It should be byte data.



       x  :    The X position of the lower-left corner of the image.

               This parameter is only recognized if the TV keyword is set.



       y  :    The Y position of the lower-left corner of the image.

               This parameter is only recognized if the TV keyword is set.



 KEYWORD PARAMETERS:



     BACKGROUND:   This keyword specifies the background color. Note that

               the keyword ONLY has effect if the ERASE keyword is also

               set or !P.MULTI is set to multiple plots and TVIMAGE is

               used to place the *first* plot.



     ERASE:    If this keyword is set an ERASE command is issued

               before the image is displayed. Note that the ERASE

               command puts the image on a new page in PostScript

               output.



     _EXTRA:   This keyword picks up any TV keywords you wish to use.



     HALF_HALF: If set, will tell CONGRID to extrapolate a *half* row

               and column on either side, rather than the default of

               one full row/column at the ends of the array.  If you

               are interpolating images with few rows, then the

               output will be more consistent with this technique.

               This keyword is intended as a replacement for

               MINUS_ONE, and both keywords probably should not be

               used in the same call to CONGRID.



     KEEP_ASPECT_RATIO: Normally, the image will be resized to fit the

               specified position in the window. If you prefer, you can

               force the image to maintain its aspect ratio in the window

               (although not its natural size) by setting this keyword.

               The image width is fitted first. If, after setting the

               image width, the image height is too big for the window,

               then the image height is fitted into the window. The

               appropriate values of the POSITION keyword are honored

               during this fitting process. Once a fit is made, the

               POSITION coordiates are re-calculated to center the image

               in the window. You can recover these new position coordinates

               as the output from the POSITION keyword.



     MARGIN:   A single value, expressed as a normalized coordinate, that

               can easily be used to calculate a position in the window.

               The margin is used to calculate a POSITION that gives

               the image an equal margin around the edge of the window.

               The margin must be a number in the range 0.0 to 0.333. This

               keyword is ignored if the POSITION keyword is used.



     MINUS_ONE: The value of this keyword is passed along to the CONGRID

               command. It prevents CONGRID from adding an extra row and

               column to the resulting array, which can be a problem with

               small image arrays.



     NOINTERPOLATION: Setting this keyword disables the default bilinear

               interpolation done to the image when it is resized. Nearest

               neighbor interpolation is done instead. This is preferred

               when you do not wish to change the pixel values of the image.

               This keyword must be set, for example, when you are displaying

               GIF files that come with their own non-IDL color table vectors.



     NORMAL:   Setting this keyword means image position coordinates x and y

               are interpreted as being in normalized coordinates. This keyword

               is only valid if the TV keyword is set.



     OVERPLOT: Setting this keyword causes the POSITION keyword to be ignored

               and the image is positioned in the location established by the

               last graphics command. For example:



                    Plot, Findgen(11), Position=[0.1, 0.3, 0.8, 0.95]

                    TVImage, image, /Overplot



     POSITION: The location of the image in the output window. This is

               a four-element floating array of normalized coordinates of

               the type given by !P.POSITION or the POSITION keyword to

               other IDL graphics commands. The form is [x0, y0, x1, y1].

               The default is [0.0, 0.0, 1.0, 1.0]. Note that this can

               be an output parameter if the KEEP_ASPECT_RATIO keyword is

               used.



     TV:       Setting this keyword makes the TVIMAGE command work much

               like the TV command, although better. That is to say, it

               will still set the correct DECOMPOSED state depending upon

               the kind of image to be displayed (8-bit or 24-bit). It will

               also allow the image to be "positioned" in the window by

               specifying the coordinates of the lower-left corner of the

               image. The NORMAL keyword is activated when the TV keyword

               is set, which will indicate that the position coordinates

               are given in normalized coordinates rather than device

               coordinates.



               Setting this keyword will ensure that the keywords

               KEEP_ASPECT_RATIO, MARGIN, MINUS_ONE, MULTI, and POSITION

               are ignored.



 OUTPUTS:

     None.



 SIDE EFFECTS:

     Unless the KEEP_ASPECT_RATIO keyword is set, the displayed image

     may not have the same aspect ratio as the input data set.



 RESTRICTIONS:

     If the POSITION keyword and the KEEP_ASPECT_RATIO keyword are

     used together, there is an excellent chance the POSITION

     parameters will change. If the POSITION is passed in as a

     variable, the new positions will be returned in the same variable

     as an output parameter.



     If a 24-bit image is displayed on an 8-bit display, the

     24-bit image must be converted to an 8-bit image and the

     appropriate color table vectors. This is done with the COLOR_QUAN

     function. The TVIMAGE command will load the color table vectors

     and set the NOINTERPOLATION keyword if this is done. Note that the

     resulting color table vectors are normally incompatible with other

     IDL-supplied color tables. Hence, other graphics windows open at

     the time the image is display are likely to look strange.



 EXAMPLE:

     To display an image with a contour plot on top of it, type:



        filename = FILEPATH(SUBDIR=['examples','data'], 'worldelv.dat')

        image = BYTARR(360,360)

        OPENR, lun, filename, /GET_LUN

        READU, lun, image

        FREE_LUN, lun



        TVIMAGE, image, POSITION=thisPosition, /KEEP_ASPECT_RATIO

        CONTOUR, image, POSITION=thisPosition, /NOERASE, XSTYLE=1, $

            YSTYLE=1, XRANGE=[0,360], YRANGE=[0,360], NLEVELS=10



 MODIFICATION HISTORY:

      Written by:     David Fanning, 20 NOV 1996.

      Fixed a small bug with the resizing of the image. 17 Feb 1997. DWF.

      Removed BOTTOM and NCOLORS keywords. This reflects my growing belief

         that this program should act more like TV and less like a "color

         aware" application. I leave "color awareness" to the program

         using TVIMAGE. Added 24-bit image capability. 15 April 1997. DWF.

      Fixed a small bug that prevented this program from working in the

          Z-buffer. 17 April 1997. DWF.

      Fixed a subtle bug that caused me to think I was going crazy!

          Lession learned: Be sure you know the *current* graphics

          window! 17 April 1997. DWF.

      Added support for the PRINTER device. 25 June 1997. DWF.

      Extensive modifications. 27 Oct 1997. DWF

          1) Removed PRINTER support, which didn't work as expected.

          2) Modified Keep_Aspect_Ratio code to work with POSITION keyword.

          3) Added check for window-able devices (!D.Flags AND 256).

          4) Modified PostScript color handling.

      Craig Markwart points out that Congrid adds an extra row and column

          onto an array. When viewing small images (e.g., 20x20) this can be

          a problem. Added a Minus_One keyword whose value can be passed

          along to the Congrid keyword of the same name. 28 Oct 1997. DWF

      Changed default POSITION to fill entire window. 30 July 1998. DWF.

      Made sure color decomposition is OFF for 2D images. 6 Aug 1998. DWF.

      Added limited PRINTER portrait mode support. The correct aspect ratio

          of the image is always maintained when outputting to the

          PRINTER device and POSITION coordinates are ignored. 6 Aug 1998. DWF

      Removed 6 August 98 fixes (Device, Decomposed=0) after realizing that

          they interfere with operation in the Z-graphics buffer. 9 Oct 1998. DWF

      Added a MARGIN keyword. 18 Oct 1998. DWF.

      Re-established Device, Decomposed=0 keyword for devices that

         support it. 18 Oct 1998. DWF.

      Added support for the !P.Multi system variable. 3 March 99. DWF

      Added DEVICE, DECOMPOSED=1 command for all 24-bit images. 2 April 99. DWF.

      Added ability to preserve DECOMPOSED state for IDL 5.2 and higher. 4 April 99. DWF.

      Added TV keyword to allow TVIMAGE to work like the TV command. 11 May 99. DWF.

      Added the OVERPLOT keyword to allow plotting on POSITION coordinates

         estabished by the preceding graphics command. 11 Oct 99. DWF.

      Added automatic recognition of !P.Multi. Setting MULTI keyword is no

         longer required. 18 Nov 99. DWF.

      Added NOINTERPOLATION keyword so that nearest neighbor interpolation

         is performed rather than bilinear. 3 Dec 99. DWF

      Changed ON_ERROR condition from 1 to 2. 19 Dec 99. DWF.

      Added Craig Markwardt's CMCongrid program and removed RSI's. 24 Feb 2000. DWF.

      Added HALF_HALF keyword to support CMCONGRID. 24 Feb 2000. DWF.

      Fixed a small problem with image start position by adding ROUND function. 19 March 2000. DWF.

      Updated the PRINTER device code to take advantage of available keywords. 2 April 2000. DWF.

      Reorganized the code to handle 24-bit images on 8-bit displays better. 2 April 2000. DWF.

      Added BACKGROUND keyword. 20 April 2000. DWF.

      Fixed a small problem in where the ERASE was occuring. 6 May 2000. DWF.

      Rearranged the PLOT part of code to occur before decomposition state

         is changed to fix Background color bug in multiple plots. 23 Sept 2000. DWF.

      Removed MULTI keyword, which is no longer needed. 23 Sept 2000. DWF.

      Fixed a small problem with handling images that are slices from 3D image cubes. 5 Oct 2000. DWF.

      Added fix for brain-dead Macs from Ben Tupper that restores Macs ability to display images. 8 June 2001. DWF.

(See tvimage.pro)


TVREAD

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       TVREAD



 PURPOSE:



       To get accurate screen dumps with the IDL command TVRD on 24-bit

       PC and Macintosh computers, you have to be sure to set color

       decomposition on. This program adds that capability automatically.

       In addition, the program will optionally write BMP, GIF, JPEG,

       PICT, PNG, and TIFF color image files of the screen dump.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics



 CALLING SEQUENCE:



       image = TVREAD(xstart, ystart, ncols, nrows)



       The returned image will be a 2D image on 8-bit systems and

       a 24-bit pixel interleaved true-color image on 24-bit systems.

       A -1 will be returned if a file output keyword is used (e.g., JPEG, TIFF, etc.).



 OPTIONAL INPUTS:



       XSTART -- The starting column index.  By default, 0.



       YSTART -- The starting row index. By default, 0.



       NCOLS -- The number of columns to read. By default, !D.X_Size - XSTART



       NROWS -- The number of rows to read. By default, !D.Y_Size - YSTART.



 KEYWORD PARAMETERS:



       BMP -- Set this keyword to write the screen dump as a color BMP file.



       CANCEL -- An output keyword set to 1 if the user cancels out of a

          filename dialog. Set to 0 otherwise.



       COLORS -- If a 24-bit image has to be quantized, this will set the number

          of colors in the output image. Set to 256 by default. Applies to BMP,

          GIF, PICT, and PNG formats written from 24-bit displays.(See the

          COLOR_QUAN documentation for details.)



       CUBE -- If this keyword is set to a value between 2 and 6 the color

          quantization will use a cubic method of quantization. Applies to BMP,

          GIF, PICT, and PNG formats written from 24-bit displays.(See the

          COLOR_QUAN documentation for details.)



       DITHER -- If this keyword is set the quantized image will be dithered.

          Applies to BMP, GIF, PICT, and PNG formats written from 24-bit displays.

          (See the COLOR_QUAN documentation for details.)



       FILENAME -- The base name of the output file. (No file extensions;

           they will be added automatically.) This name may be changed by the user.



              image = TVREAD(Filename='myfile', /JPEG)



           No file will be written unless a file output keyword is used

           (e.g., JPEG, TIFF, etc.) in the call. By default the FILENAME is

           set to "idl". The file extension will be set automatically to match

           the type of file created.



       GIF -- Set this keyword to write the screen dump as a color GIF file.



       JPEG -- Set this keyword to write the screen dump as a color JPEG file.



       NODIALOG -- Set this keyword if you wish to avoid the DIALOG_PICKFILE

           dialog that asks you to name the output file. This keyword should be

           set, for example, if you are processing screens in batch mode.



       ORDER -- Set this keyword to determine the image order for reading the

           display. Corresponds to !Order and set to such as the default.



       PICT -- Set this keyword to write the screen dump as a color PICT file.



       PNG -- Set this keyword to write the screen dump as a color PNG file.



       TIFF -- Set this keyword to write the screen dump as a color TIFF file.



       TRUE -- Set this keyword to the type of interleaving you want. 1 = Pixel

           interleaved, 2 = row interleaved, 3 = band interleaved.



       QUALITY -- This keyword sets the amount of compression for JPEG images.

           It should be set to a value between 0 and 100. It is set to 75 by default.

           (See the WRITE_JPEG documentation for details.)



       WID -- The index number of the window to read from. The current graphics window

           (!D.Window) is selected by default. An error is issued if no windows are

           currently open on a device that supports windows.



       _EXTRA -- Any keywords that are appropriate for the WRITE_*** routines are

           also accepted via keyword inheritance.



 COMMON BLOCKS:



       None



 RESTRICTIONS:   Requires IDL 5.2 and higher.



 MODIFICATION HISTORY:



       Written by David W. Fanning, 9 AUG 2000.

       Added changes to make the program more device independent. 16 SEP 2000. DWF.

       Removed GIF file support for IDL 5.4 and above. 18 JAN 2001. DWF.

       Added NODIALOG keyword. 28 MAR 2001. DWF.

       Added an output CANCEL keyword. 29 AUG 2001. DWF.

       Added ERROR_MESSAGE code to file. 17 DEC 2001. DWF.

       Added ORDER keyword. 25 March 2002. DWF.

       Now create 24-bit PNG files if reading from a 24-bit display. 11 May 2002. DWF.

       Now create 24-bit BMP files if reading from a 24-bit display. 23 May 2002. DWF.

(See tvread.pro)


TVSCALE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

     TVSCALE



 PURPOSE:

     This purpose of TVSCALE is to enable the TVSCL command in IDL

     to be a completely device-independent and color-decomposition-

     state independent command. On 24-bit displays color decomposition

     is always turned off for 8-bit images and on for 24-bit images.

     The color decomposition state is restored for those versions of

     IDL that support it (> 5.2). Moreover, TVSCALE adds features

     that TVSCL lacks. For example, images can be positioned in windows

     using the POSITION keyword like other IDL graphics commands.

     TVSCALE also supports the !P.MULTI system variable, unlike the

     TVSCL command. TVSCALE was written to work especially well in

     resizeable graphics windows. Note that if you wish to preserve

     the aspect ratio of images in resizeable windows, you should set

     the KEEP_ASPECT_RATIO keyword, described below. TVSCALE works

     equally well on the display, in the PostScript device, and in

     the Printer and Z-Graphics Buffer devices. The TRUE keyword is

     set automatically to the correct value for 24-bit images, so you

     don't need to specify it when using TVSCALE. In addition, you can

     use the TOP and BOTTOM keywords to define a particular set of

     number to scale the data to. The algorithm used is this:



         TV. BytScl(image, TOP=top-bottom) + bottom



     Note that if you scale the image between 100 and 200, that

     there are 101 possible pixel values. So the proper way to

     load colors would be like this:



       LoadCT, NColors=101, Bottom=100

       TVSCALE, image, Top=200, Bottom=100



     Alternatively, you could use the NCOLORS keyword:



       LoadCT, NColors=100, Bottom=100

       TVSCALE, image, NColors=100, Bottom=100



 AUTHOR:

       FANNING SOFTWARE CONSULTING:

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

     Graphics display.



 CALLING SEQUENCE:



     TVSCALE, image



 INPUTS:

     image:    A 2D or 3D image array. It does not have to be byte data.



       x  :    The X position of the lower-left corner of the image.

               This parameter is only recognized if the TVSCL keyword is set.



       y  :    The Y position of the lower-left corner of the image.

               This parameter is only recognized if the TVSCL keyword is set.



 KEYWORD PARAMETERS:

     BACKGROUND:   This keyword specifies the background color. Note that

               the keyword ONLY has effect if the ERASE keyword is also

               set or !P.MULTI is set to multiple plots and TVSCALE is

               used to place the *first* plot.



     BOTTOM:   The image is scaled so that all displayed pixels have values

               greater than or equal to BOTTOM and less than or equal to TOP.

               The value of BOTTOM is 0 by default.



     ERASE:    If this keyword is set an ERASE command is issued

               before the image is displayed. Note that the ERASE

               command puts the image on a new page in PostScript

               output.



     _EXTRA:   This keyword picks up any TV keywords you wish to use.



     HALF_HALF: If set, will tell CONGRID to extrapolate a *half* row

               and column on either side, rather than the default of

               one full row/column at the ends of the array.  If you

               are interpolating images with few rows, then the

               output will be more consistent with this technique.

               This keyword is intended as a replacement for

               MINUS_ONE, and both keywords probably should not be

               used in the same call to CONGRID.



     KEEP_ASPECT_RATIO: Normally, the image will be resized to fit the

               specified position in the window. If you prefer, you can

               force the image to maintain its aspect ratio in the window

               (although not its natural size) by setting this keyword.

               The image width is fitted first. If, after setting the

               image width, the image height is too big for the window,

               then the image height is fitted into the window. The

               appropriate values of the POSITION keyword are honored

               during this fitting process. Once a fit is made, the

               POSITION coordiates are re-calculated to center the image

               in the window. You can recover these new position coordinates

               as the output from the POSITION keyword.



     MARGIN:   A single value, expressed as a normalized coordinate, that

               can easily be used to calculate a position in the window.

               The margin is used to calculate a POSITION that gives

               the image an equal margin around the edge of the window.

               The margin must be a number in the range 0.0 to 0.333. This

               keyword is ignored if the POSITION keyword is used.



     MAXVALUE: The data is linearly scaled between the MIN and MAX values,

               if they are provided. MAX is set to MAX(image) by default.



     MINVALUE: The data is linearly scaled between the MIN and MAX values,

               if they are provided. MIN is set to MIN(image) by default.



     MINUS_ONE: The value of this keyword is passed along to the CONGRID

               command. It prevents CONGRID from adding an extra row and

               column to the resulting array, which can be a problem with

               small image arrays.



     NCOLORS:  If this keyword is supplied, the TOP keyword is ignored and

               the TOP keyword is set equal to BOTTOM + NCOLORS - 1. This

               keyword is provided to make TVSCALE easier to use with the

               color-loading programs such as LOADCT:



                  LoadCT, 5, NColors=100, Bottom=100

                  TVScale, image, NColors=100, Bottom=100



     NOINTERPOLATION: Setting this keyword disables the default bilinear

               interpolation done to the image when it is resized. Nearest

               neighbor interpolation is done instead. This is preferred

               when you do not wish to change the pixel values of the image.



     NORMAL:   Setting this keyword means image position coordinates x and y

               are interpreted as being in normalized coordinates. This keyword

               is only valid if the TVSCL keyword is set.



     OVERPLOT: Setting this keyword causes the POSITION keyword to be ignored

               and the image is positioned in the location established by the

               last graphics command. For example:



                    Plot, Findgen(11), Position=[0.1, 0.3, 0.8, 0.95]

                    TVScale, image, /Overplot



     POSITION: The location of the image in the output window. This is

               a four-element floating array of normalized coordinates of

               the type given by !P.POSITION or the POSITION keyword to

               other IDL graphics commands. The form is [x0, y0, x1, y1].

               The default is [0.0, 0.0, 1.0, 1.0]. Note that this can

               be an output parameter if the KEEP_ASPECT_RATIO keyword is

               used.



     TOP:      The image is scaled so that all displayed pixels have values

               greater than or equal to BOTTOM and less than or equal to TOP.

               The value of TOP is !D.Table_Size by default.



     TVSCL:    Setting this keyword makes the TVIMAGE command work much

               like the TVSCL command, although better. That is to say, it

               will still set the correct DECOMPOSED state depending upon

               the kind of image to be displayed (8-bit or 24-bit). It will

               also allow the image to be "positioned" in the window by

               specifying the coordinates of the lower-left corner of the

               image. The NORMAL keyword is activated when the TV keyword

               is set, which will indicate that the position coordinates

               are given in normalized coordinates rather than device

               coordinates.



               Setting this keyword will ensure that the keywords

               KEEP_ASPECT_RATIO, MARGIN, MINUS_ONE, MULTI, and POSITION

               are ignored.



 OUTPUTS:

     None.



 SIDE EFFECTS:

     Unless the KEEP_ASPECT_RATIO keyword is set, the displayed image

     may not have the same aspect ratio as the input data set.



 RESTRICTIONS:

     If the POSITION keyword and the KEEP_ASPECT_RATIO keyword are

     used together, there is an excellent chance the POSITION

     parameters will change. If the POSITION is passed in as a

     variable, the new positions will be returned as an output parameter.



     If the image is 2D then color decomposition is turned OFF

     for the current graphics device (i.e., DEVICE, DECOMPOSED=0).



     If outputting to the PRINTER device, the aspect ratio of the image

     is always maintained and the POSITION coordinates are ignored.

     The image always printed in portrait mode.



 EXAMPLE:

     To display an image with a contour plot on top of it, type:



        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]

        TVSCALE, image, POSITION=thisPosition, /KEEP_ASPECT_RATIO

        CONTOUR, image, POSITION=thisPosition, /NOERASE, XSTYLE=1, $

            YSTYLE=1, XRANGE=[0,360], YRANGE=[0,360], NLEVELS=10



 MODIFICATION HISTORY:

      Written by:     David Fanning, 27 May 1999 from TVIMAGE code.

      Added MIN, MAX, and NCOLORS keywords 28 May 1999. DWF.

      Added the OVERPLOT keyword to allow plotting on POSITION coordinates

         estabished by the preceding graphics command. 11 Oct 99. DWF.

      Added NOINTERPOLATION keyword so that nearest neighbor interpolation

         is performed rather than bilinear. 3 Dec 99. DWF

      Brought the TVSCALE code up to date with TVIMAGE code. 3 April 2000. DWF.

      Brought the TVSCALE code up to date with TVIMAGE code. 6 May 2000. DWF.

      Change MIN and MAX keywords to MINVALUE and MAXVALUE to prevent

         ambiguous keyword errors. 27 July 2000. DWF.

      Brought up to date with changes in TVImage. 23 Sept 2000. DWF.

      Added fix for brain-dead Macs from Ben Tupper that restores Macs ability to display images. 8 June 2001. DWF.

(See tvscale.pro)


UNDEFINE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       UNDEFINE



 PURPOSE:

       The purpose of this program is to delete or undefine

       an IDL program variable from within an IDL program or

       at the IDL command line. It is a more powerful DELVAR.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       2642 Bradbury Court

       Fort Collins, CO 80521 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Utilities.



 CALLING SEQUENCE:

       UNDEFINE, variable



 REQUIRED INPUTS:

       variable: The variable to be deleted.



 SIDE EFFECTS:

       The variable no longer exists.



 EXAMPLE:

       To delete the variable "info", type:



        IDL> Undefine, info



 MODIFICATION HISTORY:

       Written by David Fanning, 8 June 97, from an original program

       given to me by Andrew Cool, DSTO, Adelaide, Australia.

       Simplified program so you can pass it an undefined variable. :-) 17 May 2000. DWF

       Simplified it even more by removing the unnecessary SIZE function. 28 June 2002. DWF.

(See undefine.pro)


VCOLORBAR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       VCOLORBAR



 FILENAME:



       vcolorbar__define.pro



 PURPOSE:



       The purpose of this program is to create a vertical

       colorbar object to be used in conjunction with other

       IDL 5 graphics objects.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



       IDL Object Graphics.



 CALLING SEQUENCE:



       thisColorBar = Obj_New('VColorBar')



 REQUIRED INPUTS:



       None.



 INIT METHOD KEYWORD PARAMETERS:



       COLOR: A three-element array representing the RGB values of a color

          for the colorbar axes and annotation. The default value is

          white: [255,255,255].



       NAME: The name associated with this object.



       NCOLORS: The number of colors associated with the colorbar. The

          default is 256.



       MAJOR: The number of major tick divisions on the colorbar axes.

          The default is 5.



       MINOR: The number of minor tick marks on the colorbar axes.

          The default is 4.



       PALETTE: A palette object for the colorbar. The default palette

           is a gray-scale palette object.



       POSITION: A four-element array specifying the position of the

           colorbar in the arbitary coordinate system of the viewplane

           rectangle. The default position is [0.90, 0.10, 0.95, 0.90].



       RANGE: The range associated with the colorbar axis. The default

           is [0, NCOLORS].



       TITLE: A string containing a title for the colorbar axis

           annotation. The default is a null string.



 OTHER METHODS:



       Clamp (Procedure): Given a two-element array in the data range of

          the colorbar, the colorbar image is clamped to this range. In

          other words, the range of colors is clamped to the specified

          range. Values above or below the range in the colorbar are set to

          the minimum and maximum range values, respectively.



       GetProperty (Procedure): Returns colorbar properties in keyword

          parameters as defined for the INIT method. Keywords allowed are:



               COLOR

               MAJOR

               MINOR

               NAME

               PALETTE

               POSITION

               RANGE

               TITLE

               TRANSFORM



       SetProperty (Procedure): Sets colorbar properties in keyword

          parameters as defined for the INIT method. Keywords allowed are:



               COLOR

               NAME

               MAJOR

               MINOR

               PALETTE

               POSITION

               RANGE

               TITLE

               TRANSFORM



 SIDE EFFECTS:



       A VCOLORBAR object is created. The colorbar INHERITS IDLgrMODEL.

       Thus, all IDLgrMODEL methods and keywords can also be used. It is

       the model that is selected in a selection event, since the SELECT_TARGET

       keyword is set for the model.



 RESTRICTIONS:



       None.



 EXAMPLE:



       To create a colorbar object and add it to a plot view object, type:



       thisColorBarObject = Obj_New('VColorBar')

       plotView->Add, thisColorBarObject

       plotWindow->Draw, plotView



 MODIFICATION HISTORY:



       Written by David W. Fanning, 19 June 97.

       Changed the optional "colorbarmodel" parameter to an

           optional GETMODEL parameter. 26 June 97. DWF.

       Fixed bug in the way the color palette was assigned. 13 Aug 97. DWF.

       Added missing container object to self structure. 13 Aug 97. DWF.

       Removed image model, which was a workaround for

           broken 5.0 objects. 5 Oct 97. DWF

       Fixed cleanup procedure to clean up ALL objects. 12 Feb 98. DWF.

       Changed IDLgrContainer to IDL_Container to fix 5.1 problems. 20 May 98. DWF.

       Modified colorbar to INHERIT an IDLgrModel object. This allows me to

           add the colorbar to other models directly. 20 Sept 98. DWF.

       Added NAME keyword to give the colorbar a name. 20 Sept 98. DWF.

       Changed a reference to _Ref_Extra to _Extra. 27 Sept 98. DWF.

       Fixed bug when adding a text object via the TEXT keyword. 9 May 99. DWF.

       Fixed a bug with getting the text object via the TEXT keyword. 16 Aug 2000. DWF.

       Added the TRANSFORM keyword to GetProperty and SetProperty methods. 16 Aug 2000. DWF.

       Added RECOMPUTE_DIMENSIONS=2 to text objects. 16 Aug 2000. DWF.

       Added a polygon object around the image object. This allows rotation in 3D space. 16 Aug 2000. DWF.

       Removed TEXT keyword (which was never used) and fixed TITLE keyword. 8 Dec 2000. DWF.

       Added ENABLE_FORMATTING keyword to title objects. 22 October 2001. DWF.

       Added a CLAMP method. 18 November 2001. DWF.

       Forgot to pass extra keywords along to the text widget. As a result, you couldn't

          format tick labels, etc. Fixed this. Any keywords appropriate for IDLgrTick objects

          are now available. 26 June 2002. DWF.

(See vcolorbar__define.pro)


WINDOWIMAGE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   WINDOWIMAGE



 PURPOSE:



       The purpose of this routine is to demonstrate how to interactively

       adjust the contrast and brightness (also called the window and level)

       of an image.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



       Graphics, Widgets.



 CALLING SEQUENCE:



       WINDOWIMAGE, image



 INPUTS:



       image:    A 2D image array. Typically, the image will be a 16-bit medical

                 image of some type. If this parameter is not present, a 16-bit

                 dicom image from the examples/data directory will be selected.



 KEYWORD PARAMETERS:



       COLORTABLE:    The index of an IDL-supplied color table to load. Gray-scale by default.





 COMMON BLOCKS:



       None.



 SIDE EFFECTS:



       None.



 RESTRICTIONS:



       The TVIMAGE and COLORBAR__DEFINE programs from the Coyote Library are

       required to run this program:



          http://www.dfanning.com/programs/tvimage.pro

          http://www.dfanning.com/programs/colorbar__define.pro



 EXAMPLE:



       To display a 16-bit medical image, type:



       IDL> WINDOWIMAGE



 MODIFICATION HISTORY:



       Written by: David Fanning, 7 November 2001.

       Modified the windowing algorithm to keep the window within

          the data range. Added colorbar and pixmap for smoother

          updating. 18 Nov 2001. DWF.

       Fixed a small problem with object cleanup. Added window and

          level readouts, window resizing. 23 Nov 2001. DWF.

(See windowimage.pro)


XCD

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

   xcd



 PURPOSE:

   Change current directory via mouse.



   Two lists are displayed side by side.  The one on the left shows

   directories.  Click on a directory to cd there.  The list

   on the right shows files to help you see where you are.

   (The list on the right does not respond to mouse clicks.)

 CATEGORY:

   Utility.

 CALLING SEQUENCE:

   xcd

 INPUTS:

   None.

 KEYWORD PARAMETERS:

   None

 OUTPUTS:

   None.

 SIDE EFFECTS:

   Your current directory can be changed.

 RESTRICTIONS:

   Windows & OpenVMS platforms only.  Originally written on Windows95.

   Should work on other Windows platforms, but I (Paul) havn't tried it.



   With a little effort, one probably could port Xcd to other platforms

   (i.e. Unix or Mac).



   Note that drive names (e.g. "a:", "c:", etc.) are hardcoded in

   xcd::init.  Change that line of code to show drive letters

   appropriate for your system.



 PROCEDURE:

   Xcd creates an object that has a reference to a DirListing, and

   widgets for displaying that DirListing.  If the user clicks on a

   sub-directory (or "..\") in the xcd object, or droplist-selects

   a different drive via the xcd object, the xcd object changes

   IDL's current directory to that location, and refreshes with a

   new current-directory DirListing.



 MODIFICATION HISTORY:

   Paul C. Sorenson, July 1997. paulcs@netcom.com.

        Written with IDL 5.0.  The object-oriented design of Xcd is

        based in part on an example authored by Mark Rivers.

   Jim Pendleton, July 1997. jimp@rsinc.com

        Modified for compatability with OpenVMS as a basis for

        platform independent code

   Paul C. Sorenson, July 13 1997.  Changes so that DirListing class

        methods do not return pointers to data members.  (Better

        object-oriented design that way.)



(See xcd.pro)


XCOLORS

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       XCOLORS



 PURPOSE:



       The purpose of this routine is to interactively change color tables

       in a manner similar to XLOADCT. No common blocks are used so

       multiple copies of XCOLORS can be on the display at the same

       time (if each has a different TITLE). XCOLORS has the ability

       to notify a widget event handler, an object method, or an IDL

       procedure if and when a new color table has been loaded. The

       event handler, object method, or IDL procedure is then responsibe

       for updating the program's display on 16- or 24-bit display systems.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Widgets, Object, Command line.



 CALLING SEQUENCE:



       XCOLORS



 INPUTS:



       None.



 KEYWORD PARAMETERS:



       BLOCK: If this keyword is set, the program will try to block the

          IDL command line. Note that this is only possible if no other

          widget program is currently blocking the IDL command line. It

          is much more reliable to make XCOLORS a modal widget (see the MODAL

          keyword), although this can generally only be done when XCOLORS

          is called from another widget program.



       BOTTOM: The lowest color index of the colors to be changed.



       COLORINFO: This output keyword will return either a pointer to

          a color information structure (if the program is called in

          a non-modal fashion) or a color information structure (if the program

          is called in modal or blocking fashion). The color information

          structure is an anonymous structure defined like this:



             struct = { R: BytArr(!D.Table_Size), $ ; The current R color vector.

                        G: BytArr(!D.Table_Size), $ ; The current G color vector.

                        B: BytArr(!D.Table_Size), $ ; The current B color vector.

                        NAME: "", $                 ; The name of the current color table.

                        INDEX: 0 }                  ; The index number of the current color table.



          If a pointer to the structure is obtained, you will be responsible

          for freeing it to prevent memory leakage:



             XColors, ColorInfo=colorInfoPtr

             Print, "Color Table Name: ", (*colorInfoPtr).Name

             Ptr_Free, colorInfoPtr



          Note that that Name field will be "Unknown" and the Index field will

          be -1 until a color table is actually selected by the user. You are

          responsible for checking this value before you use it.



          When called in modal or blocking fashion, you don't have to worry about freeing

          the pointer, since no pointer is involved:



             XColors, /Block, ColorInfo=colorInfoData

             Help, colorInfoData, /Structure

             Print, "Color Table Name: ", colorInfoData.Name



       DATA: This keyword can be set to any valid IDL variable. If

          the variable is defined, the specified object method or notify

          procedure will be passed this variable via a DATA keyword. This

          keyword is defined primarily so that Notify Procedures are compatible

          with the XLOADCT way of passing data. It is not strictly required,

          since the _EXTRA keyword inheritance mechanism will allow passing

          of *any* keyword parameter defined for the object or procedure that is

          to be notified.



       DRAG: Set this keyword if you want colors loaded as you drag

          the sliders. Default is to update colors only when you release

          the sliders.



       _EXTRA: This keyword inheritance mechanism will pick up and

          pass along to any method or procedure to be notified and keywords

          that are defined for that procedure. Note that you should be sure

          that keywords are spelled correctly. Any mis-spelled keyword will

          be ignored.



       FILE: A string variable pointing to a file that holds the

          color tables to load. The normal colors1.tbl file is used by default.



       GROUP_LEADER: The group leader for this program. When the group

          leader is destroyed, this program will be destroyed.



       MODAL: Set this keyword (along with the GROUP_LEADER keyword) to

          make the XCOLORS dialog a modal widget dialog. Note that NO

          other events can occur until the XCOLORS program is destroyed

          when in modal mode.



       NCOLORS: This is the number of colors to load when a color table

          is selected.



       NOTIFYID: A 2-column by n-row array that contains the IDs of widgets

          that should be notified when XCOLORS loads a color table. The first

          column of the array is the widgets that should be notified. The

          second column contains IDs of widgets that are at the top of the

          hierarchy in which the corresponding widgets in the first column

          are located. (The purpose of the top widget IDs is to make it

          possible for the widget in the first column to get the "info"

          structure of the widget program.) An XCOLORS_LOAD event will be

          sent to the widget identified in the first column. The event

          structure is defined like this:



          event = {XCOLORS_LOAD, ID:0L, TOP:0L, HANDLER:0L, $

             R:BytArr(!D.TABLE_SIZE < 256), G:BytArr(!D.TABLE_SIZE < 256), $

             B:BytArr(!D.TABLE_SIZE < 256), INDEX:0, NAME:""}



          The ID field will be filled out with NOTIFYID[0, n] and the TOP

          field will be filled out with NOTIFYID[1, n]. The R, G, and B

          fields will have the current color table vectors, obtained by

          exectuing the command TVLCT, r, g, b, /Get. The INDEX field will

          have the index number of the just-loaded color table. The name

          field will have the name of the currently loaded color table.



          Note that XCOLORS can't initially tell *which* color table is

          loaded, since it just uses whatever colors are available when it

          is called. Thus, it stores a -1 in the INDEX field to indicate

          this "default" value. Programs that rely on the INDEX field of

          the event structure should normally do nothing if the value is

          set to -1. This value is also set to -1 if the user hits the

          CANCEL button. (Note the NAME field will initially be "Unknown").



          Typically the XCOLORS button will be defined like this:



             xcolorsID = Widget_Button(parentID, Value='Load New Color Table...', $

                Event_Pro='Program_Change_Colors_Event')



          The event handler will be written something like this:



             PRO Program_Change_Colors_Event, event



                ; Handles color table loading events. Allows colors be to changed.



             Widget_Control, event.top, Get_UValue=info, /No_Copy

             thisEvent = Tag_Names(event, /Structure_Name)

             CASE thisEvent OF



                'WIDGET_BUTTON': BEGIN



                     ; Color table tool.



                   XColors, NColors=info.ncolors, Bottom=info.bottom, $

                      Group_Leader=event.top, NotifyID=[event.id, event.top]

                   ENDCASE



                'XCOLORS_LOAD': BEGIN



                     ; Update the display for 24-bit displays.



                   Device, Get_Visual_Depth=thisDepth

                   IF thisDepth GT 8 THEN BEGIN

                   WSet, info.wid



                    ...Whatever display commands are required go here. For example...



                    TV, info.image



                 ENDIF

                 ENDCASE



              ENDCASE



              Widget_Control, event.top, Set_UValue=info, /No_Copy

              END



       NOTIFYOBJ: A vector of structures (or a single structure), with

          each element of the vector defined as follows:



             struct = {XCOLORS_NOTIFYOBJ, object:Obj_New(), method:''}



          where the Object field is an object reference, and the Method field

          is the name of the object method that should be called when XCOLORS

          loads its color tables.



             ainfo = {XCOLORS_NOTIFYOBJ, a, 'Draw'}

             binfo = {XCOLORS_NOTIFYOBJ, b, 'Display'}

             XColors, NotifyObj=[ainfo, binfo]



          Note that the XColors program must be compiled before these structures

          are used. Alternatively, you can put this program, named

          "xcolors_notifyobj__define.pro" (*three* underscore characters in this

          name!) in your PATH:



             PRO XCOLORS_NOTIFYOBJ__DEFINE

              struct = {XCOLORS_NOTIFYOBJ, OBJECT:Obj_New(), METHOD:''}

             END



          Or, you can simply define this structure as it is shown here in your code.



          "Extra" keywords added to the XCOLORS call are passed along to

          the object method, which makes this an alternative way to get information

          to your methods. If you expect such keywords, your methods should be defined

          with an _Extra keyword.



       NOTIFYPRO: The name of a procedure to notify or call when the color

          tables are loaded. If the DATA keyword is also defined, it will

          be passed to this program via an DATA keyword. But note that *any*

          keyword appropriate for the procedure can be used in the call to

          XCOLORS. For example, here is a procedure that re-displays and image

          in the current graphics window:



             PRO REFRESH_IMAGE, Image=image, _Extra=extra, WID=wid

             IF N_Elements(wid) NE 0 THEN WSet, wid

             TVIMAGE, image, _Extra=extra

             END



          This program can be invoked with this series of commands:



             IDL> Window, /Free

             IDL> TVImage, image, Position=[0.2, 0.2, 0.8, 0.8]

             IDL> XColors, NotifyPro='Refresh_Image', Image=image, WID=!D.Window



          Note that "extra" keywords added to the XCOLORS call are passed along to

          your procedure, which makes this an alternative way to get information

          to your procedure. If you expect such keywords, your procedure should

          be defined with an _Extra keyword as illustrated above.



       TITLE: This is the window title. It is "Load Color Tables" by

          default. The program is registered with the name 'XCOLORS:' plus

          the TITLE string. The "register name" is checked before the widgets

          are defined. If a program with that name has already been registered

          you cannot register another with that name. This means that you can

          have several versions of XCOLORS open simultaneously as long as each

          has a unique title or name. For example, like this:



            IDL> XColors, NColors=100, Bottom=0, Title='First 100 Colors'

            IDL> XColors, NColors=100, Bottom=100, Title='Second 100 Colors'



       XOFFSET: This is the X offset of the program on the display. The

          program will be placed approximately in the middle of the display

          by default.



       YOFFSET: This is the Y offset of the program on the display. The

          program will be placed approximately in the middle of the display

          by default.



 COMMON BLOCKS:



       None.



 SIDE EFFECTS:



       Colors are changed. Events are sent to widgets if the NOTIFYID

       keyword is used. Object methods are called if the NOTIFYOBJ keyword

       is used. This program is a non-blocking widget.



 RESTRICTIONS:



       None.



 EXAMPLE:



       To load a color table into 100 colors, starting at color index

       50 and send an event to the widget identified at info.drawID

       in the widget heirarchy of the top-level base event.top, type:



       XCOLORS, NCOLORS=100, BOTTOM=50, NOTIFYID=[info.drawID, event.top]



 MODIFICATION HISTORY:

       Written by:     David W. Fanning, 15 April 97. Extensive modification

         of an older XCOLORS program with excellent suggestions for

         improvement by Liam Gumley. Now works on 8-bit and 24-bit

         systems. Subroutines renamed to avoid ambiguity. Cancel

         button restores original color table.

       23 April 1997, added color protection for the program. DWF

       24 April 1997, fixed a window initialization bug. DWF

       18 June 1997, fixed a bug with the color protection handler. DWF

       18 June 1997, Turned tracking on for draw widget to fix a bug

         in TLB Tracking Events for WindowsNT machines in IDL 5.0. DWF

       20 Oct 1997, Changed GROUP keyword to GROUP_LEADER. DWF

       19 Dec 1997, Fixed bug with TOP/BOTTOM reversals and CANCEL. DWF.

        9 Jun 1998, Fixed bug when using BOTTOM keyword on 24-bit devices. DWF

        9 Jun 1998, Added Device, Decomposed=0 for TrueColor visual classes. DWF

        9 Jun 1998, Removed all IDL 4 compatibility.

       21 Oct 1998, Fixed problem with gamma not being reset on CANCEL. DWF

        5 Nov 1998. Added the NotifyObj keyword, so that XCOLORS would work

         interactively with objects. DWF.

        9 Nov 1998. Made slider reporting only at the end of the drag. If you

         want continuous updating, set the DRAG keyword. DWF.

        9 Nov 1998. Fixed problem with TOP and BOTTOM sliders not being reset

         on CANCEL. DWF.

       10 Nov 1998. Fixed fixes. Sigh... DWF.

        5 Dec 1998. Added INDEX field to the XCOLORS_LOAD event structure. This

         field holds the current color table index number. DWF.

        5 Dec 1998. Modified the way the colorbar image was created. Results in

         greatly improved display for low number of colors. DWF.

        6 Dec 1998. Added the ability to notify an unlimited number of objects. DWF.

       12 Dec 1998. Removed obsolete Just_Reg keyword and improved documetation. DWF.

       30 Dec 1998. Fixed the way the color table index was working. DWF.

        4 Jan 1999. Added slightly modified CONGRID program to fix floating divide

          by zero problem. DWF

        2 May 1999. Added code to work around a Macintosh bug in IDL through version

          5.2 that tries to redraw the graphics window after a TVLCT command. DWF.

        5 May 1999. Restore the current window index number after drawing graphics.

          Not supported on Macs. DWF.

        9 Jul 1999. Fixed a couple of bugs I introduced with the 5 May changes. Sigh... DWF.

       13 Jul 1999. Scheesh! That May 5th change was a BAD idea! Fixed more bugs. DWF.

       31 Jul 1999. Substituted !D.Table_Size for !D.N_Colors. DWF.

        1 Sep 1999. Got rid of the May 5th fixes and replaced with something MUCH simpler. DWF.

       14 Feb 2000. Removed the window index field from the object notify structure. DWF.

       14 Feb 2000. Added NOTIFYPRO, DATA, and _EXTRA keywords. DWF.

       20 Mar 2000. Added MODAL, BLOCK, and COLORINFO keywords. DWF

       20 Mar 2000. Fixed a slight problem with color protection events triggering

          notification events. DWF.

       31 Mar 2000. Fixed a problem with pointer leakage on Cancel events, and improved

          program documentation. DWF.

       17 Aug 2000. Fixed a problem with CANCEL that occurred only if you first

          changed the gamma settings before loading a color table. DWF.

       10 Sep 2000. Removed the requirement that procedures and object methods must

          be written with an _Extra keyword. DWF.

        5 Oct 2000. Added the File keyword to LOADCT command, as I was suppose to. DWF.

        5 Oct 2000. Now properly freeing program pointers upon early exit from program. DWF.

        7 Mar 2001. Fixed a problem with the BLOCK keyword. DWF.

       12 Nov 2001. Renamed Congrid to XColors_Congrid. DWF.

       14 Aug 2002. Moved the calculation of NCOLORS to after the draw widget creation

          to fix a problem with !D.TABLE_SIZE having a correct value when no windows had

          been opened in the current IDL session. DWF.

       14 Aug 2002. Fixed a documentation problem in the NOTIFYID keyword documentation

          that still referred to !D.N_COLORS instead of the current !D.TABLE_SIZE. DWF.

(See xcolors.pro)


XCONTOUR

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       XCONTOUR



 PURPOSE:

       The purpose of this program is to demonstrate how to

       create a contour plot with axes and a title in the

       new IDL 5 object graphics.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Widgets, IDL 5 Object Graphics.



 CALLING SEQUENCE:

       XCONTOUR, data, x, y



 REQUIRED INPUTS:

       None. Fake data will be used if no data is supplied in call.



 OPTIONAL INPUTS



       data: A 2D array of surface data.



       x: A vector of X data values.



       y: A vector of Y data values.



 OPTIONAL KEYWORD PARAMETERS:



       CBARTITLE: A string used as the title of the colorbar.



       _EXTRA: This keyword collects otherwise undefined keywords that are

       passed to the old IDL contour command. Most of the keywords will

       have absolutely no effect.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       NLEVELS: The number of equally spaced contour intervals to draw.

       Default is 10. Note that contour levels are acutally calculated,

       since the NLEVELS keyword to the contour object does not always

       result in the correct number of contour levels.



       TITLE: A string used as the title of the plot.



       XTITLE: A string used as the X title of the plot.



       YTITLE: A string used as the Y title of the plot.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 RESTRICTIONS:

       None.



 EXAMPLE:

       To use this program with your 2D data, type:



        IDL> XContour, data



 MODIFICATION HISTORY:

       Written by David Fanning, 9 June 97.

       Added a colorbar to the plot. 19 June 97, DWF.

       Modified the way VCOLORBAR was called. 14 July 97. DWF.

       Fixed cleanup procedure to clean up ALL objects. 12 Feb 98. DWF.

       Changed IDLgrContainer to IDL_Container to fix 5.1 problems. 20 May 98. DWF.

       Modified to use the IDLgrColorbar object. 20 Sept 98. DWF.

       Added the ability to do a filled contour. 27 Sept 98. DWF.

       Fixed a bug in the way the data was scaled into the view. 9 May 99. DWF.

       Fixed a bug in the filled contours. 11 May 99. DWF.

       Added a line to make sure 256 colors are available in Z buffer. 19 Dec 99. DWF.

       Fixed a small bug where the X and Y vectors weren't sent to IDLgrContour. 19 Sept 2000. DWF.

       Added CBARTITLE keyword and fixed a small memory leak. Updated VCOLORBAR code. 8 Dec 2000. DWF.

       Fixed a minor problem with the Colorbar. Removed GIF support for IDL 5.4 and higher. 27 Mar 2001. DWF.

(See xcontour.pro)


XIMAGE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       XIMAGE



 PURPOSE:



       The purpose of this program is to demonstrate how to

       create a image plot with axes,a title, and the ability

       to select a location and image value using object graphics.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Widgets, Object Graphics.



 CALLING SEQUENCE:



       XImage, image



 REQUIRED INPUTS:



       None. The image "worldelv.dat" from the examples/data directory

       is used if no data is supplied in call.



 OPTIONAL INPUTS



       image: An 8-bit or 24-bit image.



 OPTIONAL KEYWORD PARAMETERS:



       COLORTABLE: The number of a color table to use as the image palette.

       Color table 0 (grayscale) is used as a default. (Keyword ignored if

       a 24-bit image is used.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       KEEP_ASPECT_RATIO: Set this keyword if you wish the aspect ratio

       of the image to be preserved as the graphics display window is resized.



       TITLE: A string used as the title of the plot.



       XRANGE: A two-element array specifying the X axis range.



       XSIZE: The initial X window size. Default is 400 pixels.



       XTITLE: A string used as the X title of the plot.



       YRANGE: A two-element array specifying the Y axis range.



       YSIZE: The initial Y window size. Default is 400 pixels.



       YTITLE: A string used as the Y title of the plot.



 COMMON BLOCKS:



       None.



 SIDE EFFECTS:



       None.



 RESTRICTIONS:



       Requires the XColors program from the Coyote library to change color tables.



          http://www.dfanning.com/programs/xcolors.pro



 EXAMPLE:



       To use this program with your 8-bit or 24-bit image data, type:



        IDL> XImage, image



 MODIFICATION HISTORY:



       Written by David Fanning, 13 June 97.

       Added Keep_Apect_Ratio keyword and Zoom buttons. DWF 15 JUNE 97.

       Improved font handling and color support. DWF 4 OCT 97.

       Fixed memory leakage from improper object cleanup. 12 FEB 98. DWF

       Changed IDLgrContainer to IDL_Container to fix 5.1 problems. 20 May 98. DWF.

       Modified program to show how image values can be selected. 8 May 2000. DWF.

       Made several modifications to resize event handler. Much improved. 2 June 2000. DWF.

       Completely updated program to reflect current (IDL 5.5) capabilities. 12 Nov 2001. DWF.

(See ximage.pro)


XMOVIE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

     XMOVIE



 PURPOSE:



     This program is a simplified version of XINTERANIMATE. It is written

     to illustrate the proper way to write an animation loop in a widget

     program using the WIDGET_TIMER functionality and pixmaps.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



     Widgets.



 CALLING SEQUENCE:



      XMOVIE, image3d



 INPUTS:



     image3d: A three-dimensional image array. The animation occurs over

              the third dimension.



 KEYWORD PARAMETERS:



     GROUP:   The group leader of the program. When the group leader dies,

              this program dies as well.



     TITLE:   The window title of the program. The default is "Animation

              Example...".



 COMMON BLOCKS:



     None.



 SIDE EFFECTS:



     None.



 EXAMPLE:



     To open the abnormal heart data and animate it, type:



        filename = FILEPATH(SUBDIR=['examples', 'data'], 'abnorm.dat')

        OPENR, lun, filename, /GET_LUN

        data = BYTARR(64, 64, 15)

        READU, lun, data

        FREE_LUN, lun

        data = REBIN(data, 256, 256, 15)



        XMOVIE, data



 MODIFICATION HISTORY:



      Written by: David W. Fanning, June 96.

      Added slider for controlling animation speed. 30 June 99. DWF

      Added pixmap operations. 15 May 2002. DWF

(See xmovie.pro)


XPLOT

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       XPLOT



 PURPOSE:

       The purpose of this program is to demonstrate how to

       create a line plot with axes and a title in the

       new IDL 5 object graphics.



 AUTHOR:

       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:

       Widgets, IDL 5 Object Graphics.



 CALLING SEQUENCE:

       XPlot, x, y



 REQUIRED INPUTS:

       x: A vector of input values used as the dependent data.



 OPTIONAL INPUTS

       y: A vector of input values used as the dependent data.

          If both x and y parameters are present, x is the independent data.



 OPTIONAL KEYWORD PARAMETERS:



       COLORPRINT: This keyword is allowed for historical reasons, but does

       nothing. Color printing is now available from the Print menu at all

       times.



       EXACT: Set this keyword to a one- or two-element array to set exact axis

       scaling for the axes. If Exact is a one-element array, both axes are

       set to the same value. If Exact is a two-element array, the first

       elements sets the X axis property and the second element sets the Y

       axis property. For example, to set the X axis to exact scaling and

       the Y axis to normal scaling, type:



           IDL> x = Findgen(10)

           IDL> XPlot, x, Sin(x), Exact=[1,0], XRange=[0,8.5]



       _EXTRA: This keyword collects otherwise undefined keywords that are

       passed to new Plot command. To some extent these are similar to the

       old IDL Plot command. For example: Linestyle=2, Thick=3,

       XRange=[-100,100], etc.



       GROUP_LEADER: The group leader for this program. When the group leader

       is destroyed, this program will be destroyed.



       LANDSCAPE: Set this keyword if you are printing in landscape mode. The

       default is Portrait mode. The Landscape keyword on the PRINTER object

       is set, but not all printers will honor this keyword setting. If yours

       does not, set Landscape mode in the Printer Setup dialog.



       POSITION: A four-element array of the form [x0, y0, x1, y1] for locating

       the axes of the plot in the display window. The coordinates are in

       "normalized" units, which means the extent of the window is from 0.0 to 1.0.

       The default value of POSITION is [0.15, 0.15, 0.925, 0.925].



       PSYM: The index of a plotting symbol to use on the plot. Integers 0-7

       are valid values.



       SYMSIZE: Sets the size of the symbols. By default, symbols are sized

       so that they are 0.015 percent of the axis range.



       VECTOR: Set this keyword if you want the printed output to be in

       vector (as opposed to bitmap) form. This is faster, but not as accurate.



       TITLE: A string used as the title of the plot.



       XTITLE: A string used as the X title of the plot.



       YTITLE: A string used as the Y title of the plot.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 RESTRICTIONS:

       None.



 EXAMPLE:

       To use this program, pass a 1D vector or vectors, like this:



        IDL> XPlot, RandomU(seed, 11) * 9, YRange=[0, 10]



 MODIFICATION HISTORY:

       Written by David W. Fanning, 13 June 97.

       Modified axis font handling. 17 Sept 97. DWF.

       Was not destroying all objects on exit. 12 Feb 98. DWF.

       Changed IDLgrContainer to IDL_Container to fix 5.1 problems. 20 May 98. DWF.

       Fixed a bug in the way symbols were (NOT!) sized. 11 May 99. DWF.

       Added non-exact axis scaling. 12 May 99. DWF.

       Fixed bug that changed data when calling with single parameter. 13 May DWF.

       Added VECTOR, LANDSCAPE and COLORPRINT keywords and improved printing

          capabilities. 16 Feb 2000. DWF.

       Modified the EXACT keyword to accept values for X and Y axes

          independently. 10 May 2000. DWF.

       Updated for IDL 5.4. 13 June 2001. DWF.

       Added EPS output via Clipboard object. 19 May 2002. DWF.

       Added additional color schemes. 22 May 2002. DWF.

       Added the ability to do color printing from the PRINT menu. 22 May 2002.

       Removed COLORPRINT keyword. Keyword is allowed, but does nothing. 22 May 2002.

       Added POSITION keyword so you can position plot in window. 1 August 2002. DWF.

(See xplot.pro)


XSTRETCH

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       XSTRETCH



 PURPOSE:



       The purpose of this program is to interactively apply a simple

       linear stretch to an image by moving two lines on a histogram

       plot of the image. The portion of the image data between the

       two lines is stretched over the available colors in the color table.



 AUTHOR:



       FANNING SOFTWARE CONSULTING

       David Fanning, Ph.D.

       1645 Sheely Drive

       Fort Collins, CO 80526 USA

       Phone: 970-221-0438

       E-mail: davidf@dfanning.com

       Coyote's Guide to IDL Programming: http://www.dfanning.com



 CATEGORY:



       Graphics, Widgets



 CALLING SEQUENCE:



       XSTRETCH, image



 INPUT PARAMETERS:



       image:    The image data to be stretched.It must be 2D. (This may now

                 be a pointer to the image data rather than the image itself.)



 KEYWORD PARAMETERS:



       COLORTABLE: The index of a colortable you would like to load.

                 The current colortable is used if this keyword is undefined.



       _EXTRA:   This keyword collects any keyword appropriate for the

                 Plot command.



       GROUP_LEADER: Keyword to assign a group leader (so this program can be

                 called from within another widget program).



       MAX_VALUE: Keyword to assign a maximun value for the Histogram Plot.

                 Images with lots of pixels of one color (e.g. black) skew

                 the histogram. This helps make a better looking plot.



       NCOLORS:  Keyword to assign the number of colors used to display

                 the image. The default is !D.Table_Size-4.



 OUTPUTS:

       None.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:

       None.



 DEPENDENCIES:



       The following programs are required from the Coyote Library:



           error_message.pro

           fsc_droplist.pro

           fsc_fileselect.pro

           fsc_inputfield.pro

           fsc_plotwindow.pro

           fsc_psconfig__define.pro

           getimage.pro

           pswindow.pro

           psconfig.pro

           selectimage.pro

           textbox.pro

           tvimage.pro

           tvread.pro



 EXAMPLE:



       If you have a 2D image in the variable "image", you can run this

       program like this:



       XSTRETCH, image



 MODIFICATION HISTORY:



       Written by: David W. Fanning, April 1996.

       October, 1996 Fixed a problem with not restoring the color

          table when the program exited. Substituted a call to XCOLORS

          instead of XLOADCT.

       October, 1998. Added NO_BLOCK keyword and modified to work with

          24-bit color devices.

       April, 1999. Made lines thicker. Offered default image. DWF.

       April, 1999. Replaced TV command with TVIMAGE. DWF.

       April, 1999. Made both windows resizeable. DWF.

       April, 2000. Made several modifications to histogram plot and to

          the way colors were handled. Added ability to pass pointer to

          the image as well as image itself. DWF.

       February 2001. Removed GIF file support for IDL 5.4 and fixed

          a problem with cleaning up the pixmap. DWF.

       October 29, 2002. Added ability to load an image file with GETIMAGE. DWF.

       Added ability to store stretched image as main-level variable. Oct 30, 2002. DWF.

       Fixed a problem with the image window aspect ratio being calculated

          incorrectly. 2 Nov 2002. DWF.

       Added ability to open formatted images as well as raw data files. 2 Nov 2002. DWF.

(See xstretch.pro)


ZIMAGE

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       ZIMAGE



 PURPOSE:



       The purpose of this program is to display an image which

       can be zoomed by drawing a rubberband box on top of it. The

      "zoomed" image appears in its own window.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



      Image Processing, Widgets.



 CALLING SEQUENCE:



      ZIMAGE, image



 INPUTS:



      image:     A 2D array of image data.



 KEYWORD PARAMETERS:



       BOTTOM:   The lowest color index of the colors to be used (see

                 NCOLORS). The default is 0.



       COLORINDEX: The color index for the rubberband box. This index will

                 be loaded with a green color. Whatever color is there will

                 be restored when the ZIMAGE program exits. The default is

                 NCOLORS + BOTTOM.



       NCOLORS:  This is the number of colors to use when displaying the

                 image. The default is !D.N_COLORS-2.



       GROUP_LEADER: This keyword is used to assign a group leader to this

                 program. This program will be destroyed when the group

                 leader is destroyed. Use this keyword if you are calling

                 ZIMAGE from another widget program.



       NOINTERPOLATION: Setting this keyword causes nearest neighbor resampling of

                 of the zoomed image instead of the default bilinear interpolation

                 of resampled pixels.





 OUTPUTS:

       None.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:



       The COLORINDEX color is turned to green while the rubberband box

       is being drawn. The color is restored after the box is drawn.



 RESTRICTIONS:



       Uses XCOLORS from the Coyote Library:

          http://www.dfanning.com/programs/xcolors.pro



 PROCEDURE:



       Clicking the left mouse button allows you to drag a rubberband box

       over the portion of the window you want to zoom into.



       Clicking the right mouse button calls up hidden controls that allow

       you to load different color tables and set the zoom factor.



       The rubberband box is drawn with pixmaps and the "device copy"

       technique.



       This is an excellent example of how you can take advantage of the

       widget program *as* the loop do to something (i.e., draw the box)

       that in a regular IDL program would have to be done in a loop. Motion

       events are only turned on for the draw widget when the box has to be

       drawn.



 EXAMPLE:



        To display an image you can zoom into, type:



        ZIMAGE, image



 MODIFICATION HISTORY:



        Written by: David Fanning, 15 August 96.

        Fixed a !D.N_Colors problem. 17 June 98.

        Made modifications so program works in 24-bit environment. 28 July 98. DWF.

        Fixed a problem with the pop-up controls under certain circumstances.

          13 Oct 98. DWF.

        Added 24-bit color response. 13 Oct 98. DWF.

        Added ability for each window to have its own color changing tool. 9 Oct 99. DWF.

        Small changes, error checking. 24 April 2000. DWF.

        Modified draw widget error handling to be consistent with current programming

         practices. 26 April 2001. DWF.

(See zimage.pro)


ZOOMBOX

[Previous Routine] [Next Routine] [List of Routines]

 NAME:

       ZOOMBOX



 PURPOSE:



       The purpose of this program is to display an image which

       can be zoomed by drawing a rubberband box on top of it. The

      "zoomed" image appears in its own window. The program is written

       in object graphics. Either 8-bit or 24-bit images may be used.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



      Image Processing, Widgets.



 CALLING SEQUENCE:



      ZOOMBOX, image



 INPUTS:



       image:    An 8-bit or 24-bit image.



       GROUP_LEADER: This keyword is used to assign a group leader to this

                 program. This program will be destroyed when the group

                 leader is destroyed. Use this keyword if you are calling

                 ZOOMBOX from another widget program.



       HARDWARE_RENDERING: Set this keyword if you want to render the scene using

                 the hardware renderer. This is NOT recommended, since this makes

                 rendering exceedingly slow on most machines.



       INSTANCE: Set this keyword to use instancing to draw the rubberband zoom box.

                 The default is not to use instancing.



       INTERPOLATE: Set this keyword to use bilinear interpolation on the sub-image

                 defined by the box when zooming. The default is to use nearest neighbor

                 interpolation.



 OUTPUTS:

       None.



 COMMON BLOCKS:

       None.



 SIDE EFFECTS:



 DEPENDENCIES:



       Uses XCOLORS and PICKCOLOR from the Coyote Library:



          http://www.dfanning.com/programs/xcolors.pro

          http://www.dfanning.com/programs/pickcolor.pro



 PROCEDURE:



       Clicking the left mouse button allows you to drag a rubberband box

       over the portion of the window you want to zoom into.



 EXAMPLE:



        IDL> ZOOMBOX



 RESTRICTIONS:



       Object graphics programs are really meant to be used on 24-bit displays.

       Colors are decidedly ugly in 256 color environments.



 MODIFICATION HISTORY:



       Written by: David W. Fanning, 24 April 2000.

       Modified draw widget event handling.  22 October 2001. DWF.

       Added INSTANCE keyword to demonstrate instancing in object. 14 February 2002. Mark Hadfield.



(See zoombox.pro)


ZPLOT

[Previous Routine] [List of Routines]

 NAME:

       ZPLOT



 PURPOSE:



       The purpose of this program is to display a line plot in a resizeable

       graphics window which can be zoomed by drawing an "arrow box" on top

       of it. To return to the un-zoomed plot, click and release anywhere in the window.



 AUTHOR:



   FANNING SOFTWARE CONSULTING

   David Fanning, Ph.D.

   1645 Sheely Drive

   Fort Collins, CO 80526 USA

   Phone: 970-221-0438

   E-mail: davidf@dfanning.com

   Coyote's Guide to IDL Programming: http://www.dfanning.com/



 CATEGORY:



      Widgets.



 CALLING SEQUENCE:



      ZPlot, x, y



 OPTIONAL INPUTS:



      x: If only one positional parameter, this is assumed to be the

         dependent data. If there are two positional parameters, this

         is assumed to be the independent data in accordance with the

         PLOT command.



      y: The dependent data, if the X parameter is present.



 KEYWORD PARAMETERS:



       Any valid PLOT keyword can be used with this program. In additon,

       the following keywords are defined specifically.



       GROUP_LEADER: This keyword is used to assign a group leader to this

                 program. This program will be destroyed when the group

                 leader is destroyed. Use this keyword if you are calling

                 ZIMAGE from another widget program.



       XLOG: Set this keyword if you wish the X axis to be logarthmic style.



       YLOG: Set this keyword if you wish the Y axis to be logarthmic style.



       ZOOM_XSIZE: The initial X size of the plot window. Default is 400 pixels.



       ZOOM_YSIZE: The initial Y size of the plot window. Default is 400 pixels.



 COMMON BLOCKS:



       None.



 SIDE EFFECTS:



       Drawing colors are loaded into the color table.



 RESTRICTIONS:



       Zooms only along the X axis.



 PROCEDURE:



       Click and drag the cursor to create an "arrow box". The plot

       is zoomed into the X coordinates of the box, when released.

       To restore unzoomed plot, click and release anywhere in the

       window.



 EXAMPLE:



        To display an plot you can zoom into, type:



        ZPLOT



 MODIFICATION HISTORY:



        Written by: David Fanning, 15 February 2000.

        Modified the original rubberband box to be an "arrow box". 1 April 2000. DWF.

        Added the ability to produce log style plots. 20 November 2001. DWF.

(See zplot.pro)