Callback Example: Restructure a Workflow
You can use callbacks to change the structure of a workflow if certain conditions are met. In the following example, if the input raster for ISODATA classification has fewer than five bands, the workflow will skip the smoothing step. If the input raster has more than five bands, the workflow will execute the smoothing step.
Copy and paste this code into the IDL Editor. Save the file as rewire_workflow.pro
. Then compile and run the program.
; This is the routine to invoke using the POSTEXECUTE callback.
; It accepts the workflow as an argument.
PRO rewire_workflow_postexecute, workflow, _REF_EXTRA=refExtra
COMPILE_OPT IDL2
; Access steps by their NAME property
step1 = workflow.GetStep('step_1')
step2 = workflow.GetStep('step_2')
step3 = workflow.GetStep('step_3')
; Check the input number of bands and connect steps accordingly
IF (workflow.CURRENT_STEP.task.NUMBER_OF_CLASSES LE 5) THEN BEGIN
workflow.Disconnect, step1, step2
workflow.Disconnect, step2, step3
workflow.Connect, step1, 'OUTPUT_RASTER', step3, 'INPUT_RASTER'
ENDIF ELSE BEGIN
workflow.Disconnect, step1, step3
workflow.Connect, step1, 'OUTPUT_RASTER', step2, 'INPUT_RASTER'
workflow.Connect, step2, 'OUTPUT_RASTER', step3, 'INPUT_RASTER'
ENDELSE
END
; ----------------------------------------------------
; This is the workflow routine
PRO rewire_workflow
COMPILE_OPT IDL2
; Start the application
e = ENVI()
; Create and customize a workflow
workflow = ENVIWorkflow()
workflow.TITLE = 'Classification Workflow'
workflow.DESCRIPTION = 'Goal: to segment an image into meaningful categories'
; Add a step for ISODATA classification
step1 = ENVIWorkflowStep()
step1.TASK = ENVITask('ISODATAClassification')
step1.TIMELINE_TITLE = 'Classification'
step1.NAME = 'step_1'
; After the task runs, call the
; rewire_workflow_postexecute routine
step1.CALLBACK_POSTEXECUTE = 'rewire_workflow_postexecute'
; Add a step for classification smoothing
step2 = ENVIWorkflowStep()
step2.TASK = ENVITask('ClassificationSmoothing')
step2.TIMELINE_TITLE = 'Smoothing'
step2.NAME = 'step_2'
step3 = ENVIWorkflowStep()
step3.TASK = ENVITask('ClassificationToShapefile')
step3.TIMELINE_TITLE = 'Export'
step3.NAME = 'step_3'
workflow.Connect, step1, 'OUTPUT_RASTER', step2, 'INPUT_RASTER'
workflow.Connect, step2, 'OUTPUT_RASTER', step3, 'INPUT_RASTER'
envi.UI.CreateWorkflowDialog, workflow
END