Custom UI Class Example: Choose Random Input Rasters
This example displays a UI dialog with a button for users to randomly select an input raster from files that are currently open in ENVI. The dialog is created using a simple IDL widget. This is an example of custom UI functionality that can be added to a workflow step.
Follow these steps to run the example:
- Copy and paste the code below into the IDL Editor. Save the file as
pickrandomraster_ui__define.pro
. - Compile
pickrandomraster_ui__define.pro
. - Start ENVI.
- From the ENVI menu bar, select File > Open.
- Navigate to the
ENVIxx\data\time_series
folder of your ENVI installation path and use Ctrl-click to select all of theAirTemp*.dat
files. Click Open. - Type the following in the IDL command line:
IDL> e = ENVI()
IDL> outputUI = Obj_New('PickRandomRaster_UI')
IDL> raster = e.UI.CreateFromDialog(outputUI)
- In the dialog that appears, click the Pick a Random Raster button. ENVI selects a random raster from the opened files and displays it in the dialog.
Code Example
PRO PickRandomRaster_UI_EventHandler, sEvent
COMPILE_OPT IDL2, HIDDEN
Widget_Control, sEvent.id, GET_UVALUE=self
self.HandleEvent, sEvent
END
;-----------------------------------------------------
FUNCTION PickRandomRaster_UI::Init, _REF_EXTRA=refExtra
COMPILE_OPT IDL2, HIDDEN
self.oRaster = ENVIRaster_UI()
return, self.ENVIParameterUI::Init(_EXTRA=refExtra)
END
;-----------------------------------------------------
PRO PickRandomRaster_UI::Cleanup
COMPILE_OPT IDL2, HIDDEN
IF (Obj_Valid(self.oRaster)) THEN BEGIN
Obj_Destroy, self.oRaster
ENDIF
self.ENVIParameterUI::Cleanup
END
;-----------------------------------------------------
; Populate the UI with parameters based on the
; supplied value
PRO PickRandomRaster_UI::SetValue, value
COMPILE_OPT IDL2, HIDDEN
self.oRaster.SetValue, value
END
;-----------------------------------------------------
; Return the parameter value defined by the user and
; stored by the UI
FUNCTION PickRandomRaster_UI::GetValue, ERROR=error
COMPILE_OPT IDL2, HIDDEN
return, self.oRaster.GetValue(ERROR=error)
END
;-----------------------------------------------------
PRO PickRandomRaster_UI::HandleEvent, sEvent
COMPILE_OPT IDL2, HIDDEN
CASE Widget_Info(sEvent.id, /UNAME) OF
'randomize': BEGIN
rasters = envi.data.Get(/RASTER)
value = !null
IF (N_Elements(rasters) ne 0) THEN BEGIN
pos = Sort(Randomu(seed, N_Elements(rasters)))
value = rasters[pos[0]]
ENDIF
self.SetValue, value
END
ELSE:
ENDCASE
END
;----------------------------------------------------
; Build and display the UI
PRO PickRandomRaster_UI::BuildUI, wBase, xSize
COMPILE_OPT IDL2, HIDDEN
wColumn = WIDGET_BASE(wBase, /COLUMN)
self.oRaster.BuildUI, wColumn, xSize
wRow = WIDGET_BASE(wColumn, /ROW)
!null = WIDGET_BUTTON(wRow, $
VALUE='Pick a Random Raster', $
UVALUE=self, $
UNAME='randomize', $
EVENT_PRO='PickRandomRaster_UI_EventHandler')
END
; ----------------------------------------------------
PRO PickRandomRaster_UI__Define
COMPILE_OPT IDL2, HIDDEN
!null = {PickRandomRaster_UI, $
inherits ENVIParameterUI, $
oRaster: Obj_New() $
}
END
See Also