Callback Example: Perform a Step Automatically
This example shows how perform classification smoothing (using the ClassificationSmoothing task) and automatically apply it to the classification result without requiring a separate step. Use the CALLBACK_POST_EXECUTE property to invoke the smoothing task after the ISODATA classification task.
Copy and paste this code into the IDL Editor. Save the file as example_postexecute.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 example_postexecute_postexecute, workflow, _REF_EXTRA=refExtra
COMPILE_OPT IDL2
; Get the smoothing task from the catalog of ENVITasks
task = ENVITask('ClassificationSmoothing')
; The input for this task is the output raster from
; the ISODATA classification task, which is the
; "current" task when the callback is invoked
task.INPUT_RASTER = workflow.CURRENT_STEP.task.OUTPUT_RASTER
; Define the smoothing kernel size
task.KERNEL_SIZE = 25
; Run the smoothing task
task.Execute
; Substitute the step output for this raster
workflow.CURRENT_STEP.task.OUTPUT_RASTER = task.OUTPUT_RASTER
; For debugging purposes, load both rasters
; in order to see the difference
view = envi.GetView()
!null = view.CreateLayer(task.INPUT_RASTER)
!null = view.CreateLayer(task.OUTPUT_RASTER)
END
; -----------------------------------------------
; This is the workflow routine
PRO example_postexecute
COMPILE_OPT IDL2
; Start the application
e = ENVI()
; Create and customize a workflow
workflow = ENVIWorkflow()
workflow.TITLE = 'Classification Workflow'
workflow.DESCRIPTION = 'In this example, smoothing happens invisibly between steps.'
; Add a step for ISODATA classification
step1 = ENVIWorkflowStep()
step1.TASK = ENVITask('ISODATAClassification')
step1.TIMELINE_TITLE = 'Classification'
; After the task runs, call the
; example_postexecute_postexecute routine
step1.CALLBACK_POSTEXECUTE = 'example_postexecute_postexecute'
; Add a step to convert the classification image
; to a vector shapefile
step2 = ENVIWorkflowStep()
step2.TASK = ENVITask('ClassificationToShapefile')
step2.TIMELINE_TITLE = 'Vectorize'
; Connect the output from Step 1 to the input for Step 2
workflow.Connect, step1, 'OUTPUT_RASTER', step2, 'INPUT_RASTER'
; Run and display the workflow
envi.UI.CreateWorkflowDialog, workflow
END
Result: