APP下载

基于MeshViz的动态交互式图例技术研究

2013-09-26聂永丹赵建民侯俊龙东北石油大学计算机与信息技术学院黑龙江大庆163318

长江大学学报(自科版) 2013年22期
关键词:图例监听控件

张 岩,聂永丹,赵建民,侯俊龙 (东北石油大学计算机与信息技术学院,黑龙江 大庆 163318)

Open Inventor是目前世界上使用最广泛的面向对象的绘图软件接口,允许用户通过搭积木的方式来构建复杂的三维场景,使得用户只需花费很少的时间就可以构造出复杂的三维场景[1]。Open Inventor中根据不同行业的需求提供了若干扩展模块,其中MeshViz XLM扩展模块提供了强大的应用科学领域中模型网格绘制、提取和数据匹配功能,并且包含了高级的数据可视化设计组件、复杂曲面、三维统计图等多种可视化对象,DialogViz扩展模块提供了可以与场景交互的编程接口,使用DialogViz节点可以控制和操作场景中的对象,并且DialogViz节点的使用与其他Open Inventor的使用方式没有区别[2]。下面,笔者对基于MeshViz的动态交互式图例技术进行了研究。

1 使用MeshViz构造图例

1.1 MeshViz图例节点

MeshViz提供的图例节点类型是MoLegend,它能以一个矩形的方式给出当前色谱的彩色图例,在这个矩形图例上可以设置图例的名称、最大值与最小值等,同时利用MoLegend提供的编程接口可以实现展示形状、方向、颜色映射类型的动态设定等功能。

1.2 MeshViz颜色映射节点

颜色映射节点会根据一个数值的大小计算该数值对应的显示颜色,相应的颜色就会在一个数据集合对应的数据体表面上显示出来,颜色映射节点实现了一种简单的颜色参照表的定义方式,在MeshViz中提供了4种类型的颜色映射节点。

1)MoLevelColorMapping节点 该节点定义了具有N个数量级的数据集合和与之对应的N-1种颜色,它的映射方法是如果某个数据v值的在Vk≤v≤Vk+1范围内,则该数据对应的属性将被映射到颜色Ck上去。

2)MoLinearColorMapping节点 该节点为数据与颜色集合定义了一种线性映射的方式,假设某个数据v值的在Vk≤v≤Vk+1范围内,它对应的颜色Ck取决于(Vk,Ck)和(Vk+1,Ck+1)的线性映射关系。

3)MoPredefinedColorMapping节点 该节点是一种预定义的色谱,使用MoPredefinedColorMapping色谱数值对应的颜色与预定义的颜色范围相匹配,Open inventor根据不同业务的需要提供了9种预定义色谱类型,用户可以直接从中选用合适色谱即可[3]。

4)MoCustomColorMapping节点 该节点是一个实现了MiColorMapping接口的类,必须实现的函数是getColor(),getColor()的作用是根据一个给定的数值转成SbColorRGBA类型的数值,从而允许用户实现任何方式的转换函数。

1.3 等价数值节点

在数据映射过程中,色谱上每一种颜色和每一种属性值相对应,利用不同颜色可以展示出多种不同属性的效果,相应的与某一种颜色对应的数值叫做等价数值。通过定义等价数值可以设定需要展示数据的范围,MeshViz提供了PbIsovaluesList和PoIsovaluesList 2种定义等价数值的类型,因此可以使用下列2种方式定义等价数值:①定义一个继承自PoIsovaluesList类的子类,将该类的对象添加到场景中;②定义一个继承自PbIsovaluesList的对象,调用setIsovaluesList()函数和可视化对象相关联。在MeshViz可以方便地使用上述方法。

2 使用DialogViz交互

2.1 DialogViz初始化

DialogViz模块中包括了SoTopLevelDialog、SoMenuBar和SoMenuPopup类型的节点,以及从SoDialogGroup派生的SoColumnDialog、SoRowDialog和SoTabDialog类型的节点。在交互接口程序中可以同时使用以上多种节点。DialogViz的初始化支持2种方式:既可以从程序中直接用代码定义,也可以从已经定义好的文件中读取。创建一个DialogViz窗口的步骤如下:①创建一个SoTopLevelDialog节点;②设置SoTopLevelDialog节点的属性域;③创建窗口的子节点控件如按钮,滑块等;④将创建的子节点控件添加到SoTopLevelDialog节点中;⑤调用buildDialog()函数时,DialogViz窗口就会显示到屏幕上。

2.2 DialogViz节点交互

Open Inventor中场景的交互采用回调函数方式[4],与之不同的是DialogViz采用Java语言类似的监听机制,DialogViz中提供了一系列预定义的监听类,通过监听类就可以完成用户事件的交互响应。建立一个监听的步骤如下:①定义一个从预定义DialogViz接口类派生的监听类;②在定义的监听类中覆盖父类的虚函数,如dialogPushButton()、dialogCheckBox()、menuRadioButtons()等函数;③将监听类添加到场景中。

3 动态交互式图例的实现

3.1 构造图例

利用MeshViz模块创建一个图例需要进行如下步骤的操作:①初始化图例节点,通过指定图例大小、坐标以及标题和数值的位置来定义图例节点;②在场景中插入PoDataMapping类型数据映射对象并与图例节点关联;③在场景中插入PoIsovaluesList类型等价数值对象并与图例节点关联 (可选);④指定图例中所要显示数据的最大值、最小值以及过渡数值。如果定义了数据映射节点对象或者等价数值节点对象,可以通过这2类节点图例指定数值范围;⑤将图例节点添加到场景中。

采用模块化程序设计思想,为方便其他模块调用[4],笔者将动态交互图例封装在一个类mylegend中,图例的初始化利用该类的默认构造函数实现,构造函数执行完毕后图例保存在legendroot节点中。创建图例关键代码如下:

3.2 图例的交互

1)控件定义 采用滑块控件实现边界颜色对应的数据值调节控制,利用check控件实现颜色映射方式的动态交互,DialogViz设置定义在iv文件中,其中滑块控件的设置如下:

2)创建监听 创建监听的相关代码如下:

3)将控件与监听类关联 将控件与监听类关联的相关代码如下:

3.3 数据映射范围及方式的动态实现

MeshViz提供的第1种数据映射方式PredefColorMapping是将每个属性值映射到预定义的颜色范围的方式,其特点是实现简单,无需用户干预,缺点是在某些情况下属性的颜色值分布的不灵活,用户修改颜色分布的难度大。为了用户能够自定义不同的颜色模式以及设置数据体某些属性的颜色表示方式,可以采用MoLinearColorMapping映射方式,由此实现一种用户自定义的图例范围及映射方式的动态设定。笔者在mylegend类中提供一个供外部模块调用的public方法setmapvalue,该方法通过传入数据范围参数min、max来动态改变数据映射范围,通过参数order来判断用户的数据映射方式是顺序还是倒序,以此来改变映射方式。该函数的代码描述如下:

动态交互式图例程序运行界面分别如图1和图2所示。

图1 自定义数据范围顺序映射方式图例

图2 自定义数据范围反序映射方式图例

4 结 语

利用Open Inventor中MeshViz和DialogViz扩展模块实现动态交互式图例类,根据用户需求可以自定义数据映射范围与映射方式。该方法实现简便,便于用户直观理解模型的结构和分析模型特性。此外,由于采用了模块化的设计思想,因而具有较强的扩展性,可以方便地与用户的其他业务模块集成。

[1]滕贻健,柴山,荆旭,等 .基于Open Inventor的虚拟驾驶仿真系统 [J].计算机应用,2009,29(s1):323-325.

[2]阎锋欣,候增选,张定华,等.Open Inventor程序设计从入门到精通 [M].北京:清华大学出版社,2007.

[3]Wernecke J.The Inventor Mentor:Programming Object-Oriented 3DGraphics with Open Inventor,Release 2 [M].London:Addison-Wesley Publishing Company,1994.

[4]Ezust A,Ezust P.An Introduction to Design Patterns in C++ with Qt4 [M].New york:Prentice Hall,2006.

猜你喜欢

图例监听控件
英国风真无线监听耳机新贵 Cambridge Audio(剑桥)Melomania Touch
千元监听风格Hi-Fi箱新选择 Summer audio A-401
找拼图
关于.net控件数组的探讨
犬狗的画法(六)
如何让学生巧用图例解决数学问题
网络监听的防范措施
可爱的小鸟
应召反潜时无人机监听航路的规划
ASP.NET服务器端验证控件的使用