交互式绘图
简介:
IDL中的组件程序采用用户图形界面(GUI),它允许用户在程序中控制信息流,使用名为控件的简单图形控制元件,如下拉菜单,按钮和滚动条等来实现与组件程序的交互。XLOADCT就是IDL中的一个组件程序。 组件程序的优点在于可对用户隐藏用来建立及运行程序的代码,因此用户几乎不需要有什么准备知识就可以自如的使用该程序。当然组件程序使用时的难易取决于程序员的设计和编写能力。
在IDL中编写组件程序是很容易的,用于创建组件程序代码可在任何IDL支持的平台下运行。组件程序一般用来为IDL的内置图形例程提供用户界面。本章中我们将建立一个允许用户控制某些IDL直接绘图功能的组件程序。 IDL组件工具
IDL组件工具是一组函数和过程,它们用于创建并控制组件程序。表4-1列出了10种基本的IDL组件工具,可在组件程序中联合使用以形成复杂的用户界面(无需或只需稍作改动就可在任何运行IDL的机器上使用)。
组件类型 | 函数定义logistic模型 | 描述 |
老年人建筑设计规范 ActiveX control | WIDGET_ACTIVEX | 在IDL组件程序中嵌入ActiveX控制(只可在WindowsNT/2000平台下运行) |
Base | WIDGET_BASE | 基底组件用作放置其它组件(包括其它基底组件)的平台。 |
Button | WIDGET_BUTTON | 按钮组件有四种:开关按钮、复选按钮、单选按钮和菜单按钮。 |
Draw | WIDGET_DRAW | 绘制组件用于显示IDL图象, |
Droplist | WIDGET_DROPLIST | 下拉列表组件与按钮组件类似,但是选中时,会出现一系列选项。用户可从中自行选择。 |
甘远志Label | WIDGET_LABEL | 标签组件包含了一些不可编辑的文本。 |
List阴离子 | WIDGET_LIST | 列表组件提供一系列的列表,用户可使用鼠标从中选择一个或多个。 |
Slider | WIDGET_SLIDER | 滚动条组件在两端点间有一个可以移动的标示物。滚动条的值由标示物的位置决定。 |
Table | WIDGET_TABLE | 表格组件储存并显示表格形式的数据。表中的单个元素可被编辑使用。 |
Text | WIDGET_TEXT | 文本组件用于显示文本行或接收用户的输入文本信息。 |
| | |
表4-1:IDL组件工具箱中的十种基本组件
组件程序实质上是等级性的,表示程序中单个组件间关系的图表看起来就像一棵树。组件的顺序,称为组件层次构架,决定了GUI的显示状况。程序员对GUI中单个组件的布局有绝对的控制权。
在IDL中,每个组件通过使用其相应的组件创建函数(见表4-1)生成。例如要创建一个按钮组件,应用如下格式调用WIDGET_BUTTON函数:
button_id=widget_button(parent_id)
变量button_id是该组件从创建函数返回后取得的唯一标识。组件名用于创建组件后对组件的控制操作。在组件层次构架中,变量parent_id是位于按钮组件直接上方的组件标识(组件名)。
表4-2中列出了WIDGET_CONTROL,WIDGET_INFO和XMANAGER等例程。通过使用这些例程可实现对组件的控制和交互。
帮助例程 | 描述 |
WIDGET_CONTROL | 用于改变组件的行为或外表面。 |
WIDGET_INFO | 此函数用于获得一个组件或组件系统的信息 |
WIDGET_DISPLAYCONTEXTMENU | 显示包含菜单或按钮的上下菜单 |
XMANAGER | 此过程用于控制组件程序的信息流 |
| |
表4-2:与组件程序交互的三个例程
例如,要改变刚才创建按钮的标签,可使用WIDGET_CONTROL过程,将组件名传入:
widget_control,button_id,set_value=’A Push Button’
WIDGET_CONTROL的另一个重要应用是将组件按层次绘制在屏幕上。只有调用带REALIZE关键字的WIDGET_CONTROL过程后才能看到组件的层次构架。
为了能在程序中取得我们的例子中按钮组件的组件名,可使用带PARENT关键字的WIDGET_INFO过程:
parent_id=widget_info(button_id,/parent)
关于XMANAGER的使用将在“IDL组件编程模型”一节中做详细讲解。
建立界面
建立了IDL组件编程的基础之后,我们就可以编写简单的组件程序了。下面这个名为PLOTI
NTERACTIVE的程序是一个界面程序,用它可用用户提供的数据显示线型图,并实现IDL直接绘图PLOT过程的一些功能,。
在IDL中打开新编辑窗输入下述代码,保存为文件plotinteractive.pro。
plotinteractive
pro plotinteractive, data
; Test whether the input parameter was passed.
if (n_params() eq 0) then data=sin(findgen(36)*10*!dtor)
; create the top-level base.
tlb=widget_base(title='Interactive plot', /column)
; create a draw widget.
Draw = widget_draw(tlb, xsize=500, ysize=200)
; create a row base to hold a series of controls.
Controlbase = widget_base(tlb,/row)
; create a droplist to hold line style choices.
linestyles=['Solid','Dotted','Dashed','Dash Dot',$
'Dash Dot Dot','Long Dash']
linestylesyledrop = widget_droplist(controlbase, value=linestyles,$
title='Linestyle', event_pro='plotinteractive_ls' )
; Draw the widget hierarchy to the screen.
widget_control, tlb, /realize
end
tlb
这就完成了编写PLOTINTERACTIVE的第一步工作。图4-1显示了此程序的组件层次构架。图4-1:PLOTINTERACTIVE 中的初始组件层次构架
顶层基底
每个组件程序都有一个顶层基底(TLB)。TLB是充当组件层次构架根部的基底组件,它是层次构架中的最外层框架,包括系统控制栏和菜单栏。由于TLB位于组件层次构架的根部,所以它是没有父组件的,层次构架中的其他所有组件都有父组件。通过使用TLB的关键字可以访问GUI的很多属性。
基底组件
基底组件是组成组件层次构架的“砖块”,它是建立其他组件的基础。创建某组件后,它在屏幕上的位置取决于其上层基底的属性。基底组件决定着子组件的布局、填充、间距和排列格式。在PLOTINTERACTIVE中,COLUMN关键字将TLB组件定义为按列基底,ROW关键字将controlbase定义为按行基底。按列基底的子组件将按创建顺序由顶至底排列,按行基底的子组件则是依创建顺序从左到右排列。
绘制组件
绘制组件是用于显示IDL图形的长方形区域。绘制组件与直接图形法中的WINDOW过程生成的图形窗口或对象绘图法中的窗口对象类似。绘制组件用于接收并响应鼠标操作。只要多加一点代码,就可实现对绘制组件中图形大小的改动。
绘制组件中的图形
创建绘制组件的目的是显示或与IDL图形实现交互。为了在某绘制组件上施行直接图形操作就需要给出绘制组件的窗口索引号。创建绘制组件后,用几乎无所不能的WIDGET_CONTROL过程即可获取其窗口索引号。在PLOTINTERACTIVE中适当位置添加下列黑体部分:
plotinteractive
;Realize the top-level base
widget_control, tlb, /realize
; Get the window index of the draw widget and set it to be the
; current window .
widget_control, draw, get_value=win_id
wset, win_id
; Draw a plot.
plot, data,linestyle=0
end
窗口索引号得自绘制组件的组件标识且保存在变量win_id中。用WSET过程可将此窗口设置为当前窗口。现在组件程序中的所有图形都会被直接送至绘制组件。
注意:实现绘制组件后即可获取其值(VALUE)。
编译和执行
用IDLED菜单或在命令输入窗口输入下述指令编译并执行PLOTINTERACTIVE:
IDL>pile plotinteractive
IDL> plotinteractive
所得结果是一个小组件程序,绘图组件中有一幅图形。虽可激活下拉列表组件,但还不能实现任何操作。此组件程序的界面将如图4-2所示。
图4-2
现在我们已经完成了创建该组件程序的第一步。下面我们将扩充代码来激活组件并接收用户的输入。
事件处理
组件程序中对用户操作的接收或响应被称为事件处理。每个IDL组件程序都必须执行一个事件处理模块,其中含有事件发生时将调用的例程以及为其他例程分配事件的例程。组件程
序由三部分组成,事件处理例程和事件分配例程是其中的两部分。
水务局电大IDL组件编程模型
一个IDL程序包括三个部分:
1. 组件创建模块。此例程(或一组例程)用于建立并实现组件层次构架,同时调用XMANAGER注册该组件程序。这个模块也被称为组件的定义模块,若是单个程序就称为组件的定义例程。