View
213
Download
0
Tags:
Embed Size (px)
Citation preview
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, 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, 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, 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, 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