下面必须更新PLOTINTERACTIVE_DOPLOT来绘制用户所选的符号。 Plotinteractive_doplot
pro plotinterative_doplot, pstate
; Ensure that the data are being plotted in the draw window. west, (*pstate). win_id
; plot the data.
plot, (*pstate).data ,linestyle= (pstate) .linestyle, $ psym=(*pstate). psym end
现在创建事件处理器PLOTINTERACTIVE_SYM,我们可以PLOTINTERACTIVE_ LS为模型。
plotinteractive_sym
pro plotinteractive_sym, event
; Retrieve the pointer to the state structure. widget_control, event. Top ,get_uvalue= pstate
; Store the new symbol in the state structure. (*pstate). Psym=event. index
;Call the “do” routine to replot. Plotinterative_doplot, pstate end
编译此事件处理器和创建例程并测试此组件应用程序。将所得结果与图4-4比较。
图4-4
11
按钮组件
IDL组件工具函数WINDGET_BUTTON可创建四种按钮。各类按钮描述如下:
1. 开关按钮——用于触发具体行为的长方形按钮。这些按钮可包含文本或有色位图。 P39图
2. 复选按钮——也被称为选择框,此类按钮有开关两种状态。按钮开关时即将生成事件。 3. 单选按钮——此类按钮一般成组出现。每次只能选中一个按钮。
4. 菜单按钮——此类按钮出现在窗口边框顶部的菜单栏或应用程序的其他任何位置。菜单
按钮就像其他一些按钮的父按钮。按下菜单按钮时就会出现子按钮。IDL中的菜单按钮并不会生成事件,而是菜单按钮的上层父基底生成事件。
创建按钮
可用WIDGET_BUTTON过程创建上述各种类型的按钮。按钮类型取决于父基底的类型(对于开关,复选和单选按钮)或设置MENU关键字(对菜单按钮)。
·开关按钮——默认的按钮类型。下例是一个包含开关按钮的基底,一个按钮带有文本,另一个带有位图:
base = widget_base(tlb, /row)
button = widget_button(base, value=?Push Button?)
printbmp = filepath('printl.bmp', subdir=[?resource?, 'bitmaps'] printbutton = widget_button (base, value=printbmp, /bitmap) )
p40
·复选按钮——有复选基底的按钮就是对号按钮。下例就是一个对号按钮:
togglebase = widget_base(base, /row, /nonexclusive) filterbutton = widget_button(togglebase, value-?Filter?)
p40 ·单选按钮——有单选基底的按钮就是原点按钮。排他性基底中的所有按钮都被认为是同一群体的一部分。下例是一组(三个)原点按钮:
areabase = widget_base(base, /exclusive, /row)
usabutton = widget_button(areabase, value='USA') canadabutton = widget_button(areabase, value='Canada') mexicobutton = widget_button(areabase, value='Mexico') widget_control, usabutton, /set_button
p40
添加一个复选按钮
下一步要为PLOTINTERACTIVE添加一个复选按钮,用它来控制是否连接绘图符号。PLOT过程在默认状况下不会将绘图符号连在一起,但是若将绘图符号指定为负值就会连接绘图符
12
号。此复选按钮允许用户开启或关闭连接功能。 plotinteractive
symbols = ['None' , 'plus', 'Asterisk', 'period', 'Diamond', $ 'Triangle', 'Square', 'X', 'Hexagon']
symboldrop = widget_droplist(controlbase, value=symbols, $
title='symbol', event_pro='plotinteractive_sym')
; Create a nonexclusive base to hold a toggle button for ; symbol connections.
connectbase = widget_base(controlbase, /nonexclusive) connectbutton = widget_button(connectable, $ value='Connect symbols', $
event_pro='plotinteractive_connect')
; Realize the top-level base. widget_control, tlb, /realize
要创建一个复选按钮就必须先创建一个复选基底并将其作为该按钮的父基底。按钮被打开或关闭时会调用指定的事件处理器PLOTINTERACTIVE_CONNECT,因此在事件处理器中必须要判断按钮的选择状态。按钮选择状态存储于widget_button事件结构体的select域中。 plotinteractive
; Create a structure of data for the application.
state = {data: data, win_id:win_id, linestyle:0, psym:0, $ connect:1}
下面修改PLOTINTERACTIVE_DOPLOT。 plotinteractive_doplot
pro plotinteractive_doplot, pstate
; Ensure that the data are being plotted in the draw window. west, (*pstate).win_id
; plot the data.
Plot, (*pstate).data, linestyle=(*pstate).linestyle,$ Psym=(*pstate).psym*(*pstate).connect End
PLOT过程的PSYM关键字取值范围从0到10,对应着不同的绘图符号。此值为负将生成符号相连的图形。这里我们将状态结构体的connect域和psym域相乘。按下“Connect Symbles”按钮时所有其他部分都用于为connect域赋值。
Plotinteractive_connect plotinteractive_connect, event
; Retrieve the pointer to the state structure. Widget_control, event. top, get_uvalue = pstate
; Flip the sign of the connect field.
13
(*pstate).connect = -(*pstate).connect
; Call the “Do” routine.
Plotinteractive_doplot, pstate End
选择“Connect Symbles”按钮时,connect域的会反号。编译并测试这些新添加的代码。
14
第五章:改变组件尺寸
简介:
IDL的直接图形窗口中的内容不会自动改变大小以适应窗口尺寸的变化。为了将图形绘入尺寸改变后的窗口,就必须重新执行所有创建该图形的指令。看看下面的例子: IDL> window,xsize=300,ysize=200 IDL> plot,alog10(findgen(100)+1)
图5-1:带有线型图的直接图形窗口
用户用鼠标改变窗口尺寸时,其内的图形尺寸并不会随之变化,图5-2说明了这个问题。
图5-2:用鼠标改变尺寸后的同一个直接图形窗口 为了在窗口中重绘原线型图就必须重新执行绘图指令: IDL>plot,alog10(findgen(100)+1)
15