48
Rolando V. Raqueño Monday, March 21, 20 22 1 1 Computing for Imaging Science (SIMG-726)

Rolando V. RaqueñoThursday, July 16, 2015 1 Computing for Imaging Science (SIMG-726)

  • View
    213

  • Download
    0

Embed Size (px)

Citation preview

Rolando V. Raqueño Wednesday, April 19, 202311

Computing for Imaging Science (SIMG-726)

Rolando V. Raqueño Wednesday, April 19, 202322

Gift Quiz - Who is RTM?

• What did his father do?

Rolando V. Raqueño Wednesday, April 19, 202333

Syllabus after Holiday Break

• Class #6 - Today– Widget Programming Review

• Assignment #2 (Check Website for details)– Combine Assignment #1 into Assignment #2– Create a widget program that will read in a PGM file

that will display the image statistics of a user defined rectangular region.

– Pay particular attention to non-interactive interface– Program the one-dimensional and two-dimensional

special functions Rect and Gaus

Rolando V. Raqueño Wednesday, April 19, 202344

Syllabus

• Class #7– Widget Programming– Event Handlers

Rolando V. Raqueño Wednesday, April 19, 202355

Syllabus

• Class #8– Assignment #1 Due– Shell Programming– UNIX Quotes– Making UNIX commands of IDL Programs– Mystery Image Techniques

• QUIZ – Topics

dd, od, strings, which, wc

Rolando V. Raqueño Wednesday, April 19, 202366

Syllabus

• Class #9 – Debugging in IDL– More Widget Examples

Rolando V. Raqueño Wednesday, April 19, 202377

Syllabus

• Class #10– Special Function Implementation– Midterm Exam Review

• Quiz

Rolando V. Raqueño Wednesday, April 19, 202388

Syllabus

• Class #11– Midterm Exam (Take home – 1 week to do)– Image Processing Implementations

Rolando V. Raqueño Wednesday, April 19, 202399

Syllabus

• Class #12– Image Processing Implementations– AWK, SED, and Makefiles

• Quiz

Rolando V. Raqueño Wednesday, April 19, 20231010

Syllabus

• Class #13– Final Project Updates– IDL Pointers

Rolando V. Raqueño Wednesday, April 19, 20231111

Syllabus

• Class #14– Assignment #2 Due– Modal Widgets

Rolando V. Raqueño Wednesday, April 19, 20231212

Syllabus

• Class #15– 3D Graphics Concepts

Rolando V. Raqueño Wednesday, April 19, 20231313

Syllabus

• Class #16– More 3D Graphics

Rolando V. Raqueño Wednesday, April 19, 20231414

Syllabus

• Class #17– Open Class Time for Project Consulting

Rolando V. Raqueño Wednesday, April 19, 20231515

Syllabus

• Class #18– Project Presentation Session #1

Rolando V. Raqueño Wednesday, April 19, 20231616

Syllabus

• Class #19– Project Presentation Session #2– Final Project Submissions Due

Rolando V. Raqueño Wednesday, April 19, 20231717

Widget Events

Rolando V. Raqueño Wednesday, April 19, 20231818

Widget Event

• A widget event is basically a reaction to some form of user input– Mouse clicks, drags, and movement– Keyboard input– Button push

• An widget event generates a structure which identifies the widget that caused the event and other relevant information.

Rolando V. Raqueño Wednesday, April 19, 20231919

IDL Event Structure

• All IDL Events will generate a named structure that is guaranteed to have the following– A structure name– The ID of the widget that generated the event– The ID of the base to which the above widget

belongs– The ID of the widget with which an event handler is

associated.

Rolando V. Raqueño Wednesday, April 19, 20232020

Event Handler

• Special Processing functions (Event Handlers) – capture and appropriately interpret those

events.

• single button program– beep when pressed.

• First, need to create and destroy a widget by creating a Quit Button

Rolando V. Raqueño Wednesday, April 19, 20232121

Create the Quit Button Widget

pro quit_button

base=Widget_Base(column=1,title=“Quit Button”)

button = Widget_Button( base, value=“Quit” )

Widget_Control, base, /realize

end

Rolando V. Raqueño Wednesday, April 19, 20232222

Quit Button Widget Event Handler

Method #1pro quit_button_event, event Widget_Control, event.top, /destroyend

pro quit_button base=Widget_Base(column=1,title=“Quit Button”) button = Widget_Button( base, value=“Quit”) Widget_Control, base, /realize Xmanager, ’quit_button', base, event_handler=’quit_button_event'

end

Rolando V. Raqueño Wednesday, April 19, 20232323

Quit Button Widget Event Handler Method #2

pro quitter, event Widget_Control, event.top, /destroyendpro quit_button_event, eventendpro quit_button base=Widget_Base(column=1,title=‘Quit Button’) button=Widget_Button(base, value=‘Quit’, event_pro=‘quitter’ )

Widget_Control, base, /realize Xmanager, ’quit_button', base,event_handler=’quit_button_event'

end

Rolando V. Raqueño Wednesday, April 19, 20232424

Button Widget Example

• For the sake of presentation space, we will not be including the quit button in the following code.

• You should, however, include it so that you can gracefully get rid of the widgets.

Rolando V. Raqueño Wednesday, April 19, 20232525

Create the Button Widget

pro beeper

base=Widget_Base(column=1, title="Beep" )

button=Widget_Button(base,value="Press Here")

Widget_Control, base, /realize

end

Rolando V. Raqueño Wednesday, April 19, 20232626

Button Widget Event Handler

pro beeper_event, event print,"Beep",string(7B)end

pro beeper base=Widget_Base( column=1, title="Beep" ) button=Widget_Button(base,value="Press Here") Widget_Control, base, /realize Xmanager, 'beeper', base, event_handler='beeper_event'

end

Rolando V. Raqueño Wednesday, April 19, 20232727

If Your Widget Program Crashes

• First type IDL> RETALL

• Followed byIDL> XMANAGER

• You may then edit and recompile as necessary

Rolando V. Raqueño Wednesday, April 19, 20232828

Analyzing the Beep Event Handler

• You can strategically put help and print commands in beep_event and beep to study the values of the variables and the resulting structures.

• When pressed, the word Beep should print out in the IDL command window.

Rolando V. Raqueño Wednesday, April 19, 20232929

Beep Counter

• Let us modify the event handler to count the number of times we depressed the button during a session

• An initial solution might be the following

Rolando V. Raqueño Wednesday, April 19, 20233030

Wrong Beep Counterpro beeper_event, event count = count + 1 print,”Beeped “, count, “ Times”end

pro beeper base=Widget_Base(column=1, title="Beep") button=Widget_Button(base,value="Press Here") Widget_Control, base, /realize Xmanager, 'beeper', base, event_handler='beeper_event'

end

Rolando V. Raqueño Wednesday, April 19, 20233131

It Does Not Work Because...

• The scope of most of the variables (e.g. count) are local to each of the routines.

• We need a mechanism to maintain, pass, and keep variables persistent across events and routines.

• This can be done using the uvalue of a given widget as in the following.

Rolando V. Raqueño Wednesday, April 19, 20233232

Working Beep Counterpro beeper_event, event

Widget_Control,event.id,get_uvalue=count count = count + 1 print,"Beeped ", count, " Times"

Widget_Control,event.id,set_uvalue=countend

pro beeper base = Widget_Base( column=1, title="Beep" ) button = Widget_Button( base, value="Press Here" ) Widget_Control, base, /realize

Widget_Control,button,set_uvalue=0 Xmanager, 'beeper', base, event_handler='beeper_event'end

Rolando V. Raqueño Wednesday, April 19, 20233333

An Improved Beep Counter

pro beeper_event, event Widget_Control, event.id, get_uvalue=count count = count + 1

Widget_Control, event.id, set_uvalue=count Widget_Control, event.id, set_value=string(count)

end

pro beeper base = Widget_Base( column=1, title="Beep" ) button = Widget_Button( base, value="Press Here" ) Widget_Control, base, /realize Widget_Control, button, set_uvalue=0 Xmanager, 'beeper', base, event_handler='beeper_event'end

Rolando V. Raqueño Wednesday, April 19, 20233434

Beep Counter Controlling a Text Widget

pro beeper_event, event Widget_Control, event.id, get_uvalue=count count = count + 1 Widget_Control, event.id, set_uvalue=count

Widget_Control, event.top, get_uvalue=widget_id Widget_Control, widget_id, set_value=string(count)end

pro beeper base = Widget_Base( column=1, title="Beep" ) button = Widget_Button( base, value="Press Here" ) text = Widget_Text( base ) Widget_Control, base, /realize

Widget_Control, base, set_uvalue=text Widget_Control, button, set_uvalue=0 Xmanager, 'beeper', base, event_handler='beeper_event'end

Rolando V. Raqueño Wednesday, April 19, 20233535

Beeper Counter using Text Widget

• In this situation, we use the uvalue of the base widget as a container to hold the ID of the text widget.

• We can now access this information from any widget that is contained in this base through the event.top field

Rolando V. Raqueño Wednesday, April 19, 20233636

Slider Multiply Example

• Create two floating sliders and multiply the values and deposit this in a text widget.

• Make the floating point widgets editable

Rolando V. Raqueño Wednesday, April 19, 20233737

Slider Multiply Widget Definition

pro fslider_multiply base=Widget_Base(column=1) fslider1 = CW_Fslider(base,/edit) fslider2 = CW_Fslider( base,/edit ) text= Widget_Text( base ) Widget_Control, base, /realize widget_ids = { slider1:fslider1, slider2:fslider2, text:text }

Widget_Control, base, set_uvalue=widget_idsend

Rolando V. Raqueño Wednesday, April 19, 20233838

Slider Multiply Event Handler Definition

pro fslider_multiply base=Widget_Base(column=1) fslider1 = CW_Fslider(base,/edit) fslider2 = CW_Fslider( base,/edit ) text= Widget_Text( base ) Widget_Control, base, /realize widget_ids = { slider1:fslider1, slider2:fslider2, text:text }

Widget_Control, base, set_uvalue=widget_ids

Xmanager, 'fslider_multiply', base, event_handler='fslider_multiply_event'

end

Rolando V. Raqueño Wednesday, April 19, 20233939

Slider Multiply Event Handler Definition

pro fslider_multiply_event, event Widget_Control, event.top, get_uvalue=widgets slider1 = widgets.slider1 slider2 = widgets.slider2 text = widgets.text Widget_Control, slider1, get_value=slider1_value Widget_Control, slider2, get_value=slider2_value answer= slider1_value * slider2_value Widget_Control, text, set_value=string(answer)end

Rolando V. Raqueño Wednesday, April 19, 20234040

Another Widget Example

Rolando V. Raqueño Wednesday, April 19, 20234141

Display PGM Widget Program

• Illustrates the use of the pickfile function

• Shows how to create a draw widget for image display

• Shows how to access the draw widget and display the image

Rolando V. Raqueño Wednesday, April 19, 20234242

Components of Display PGM Widget

• read_pgm procedure• pickfile function• size function• wset procedure• tv procedure• widget_control procedure• widget_draw function• xmanager procedure

Rolando V. Raqueño Wednesday, April 19, 20234343

Display PGM Widget Definition

pro simple_image_display

base = Widget_Base( column=1 )

button1=Widget_Button(base,value='Display PGM Image')

window1 = Widget_Draw(base, xsize=256, ysize=256 )

Widget_Control, window1, /realize

Widget_Control, window1, get_value=window_id

Widget_Control, base, set_uvalue=window_id

Xmanager, 'simple_image_display', base, Event_handler='simple_image_display_event'

end

Rolando V. Raqueño Wednesday, April 19, 20234444

Display PGM Widget

Rolando V. Raqueño Wednesday, April 19, 20234545

Widget Event Handlerpro simple_image_display_event, event widget_control, event.id, get_value=widget_value case widget_value of 'Display PGM Image' : begin image1_file = pickfile() read_ppm, image1_file, image1_data image_size = size( image1_data ) x_size = image_size( 1 ) & y_size=image_size(2) widget_control, event.top, get_uvalue=window_id

wset, window_id & tv,image1_data end ELSE: endcaseend

Rolando V. Raqueño Wednesday, April 19, 20234646

Pickfile Dialog Box

Rolando V. Raqueño Wednesday, April 19, 20234747

Resulting Widget Image Display

Rolando V. Raqueño Wednesday, April 19, 20234848

Summary

• Quit Button

• Beep Counter

• Slider Multiply

• PGM Display