时间:2022-09-13 02:47:25
摘要:该文主要讨论了COM技术的基本原理及其在交互图形设计系统中的应用,提出了一种以COM技术为基础的基于交互技术的图形单元组件的模型,并在开发中具体实现了该模型。
关键词:COM;组件;接口;交互式图形设计
Application of the Component Technique in Interactive Graph Design System
PENG Yong-kang, ZHAN Yi-lai, TIAN yuan
(Jingdezhen Ceramic Institute, Jingdezhen 333001, China)
Abstract: The main topic discussed in this article is the COM’sbasic theory and the COM’s application in the alternative graphics & pattern System. A model about the graphic cell component which based on COM was analyzed and applied in the software development.
Key words: COM; component; interface; interactive graph design
在基于交互技术的图形图案设计系统开发过程中,系统开发人员除需考虑系统的构成以及系统总体功能等因素外,如何让系统具有良好的交互环境,提供简单有效的交互操作方式,设计结果的“所见即所得”等问题的处理将影响到整个系统的设计开发过程。
在现代软件开发与应用过程中,软件系统的功能已经日益紧密的与软件系统的操作方式结合,相辅相成,一个具有强大功能的软件系统,还应具有一个简单有效的操作界面。
组件对象模型(COM)技术的出现,为软件的开发工作带来一场革命。COM技术提供了一种代码重用的可行方法:将一组相关的代码用COM技术进行封装,形成组件,即可通过接口进行调用,同时,COM技术开发的组件还是环境无关的,组件一经生成,即可在不同的开发环境应用。将COM技术应用于图形图象处理应用开发,除了可降低系统开发的复杂程度,同时还具有系统易于升级等优点。
在进行交互式图形图案设计系统的设计与开发过程中,我们将COM技术引入系统的功能设计与交互界面设计环节,在已经分析出图形图案的基本单元的基础上,将图形图案的基本单元的数据、数据操作方法、基本图形单元的显示等功能通过COM技术集成于COM组件内,用VB开发实现了具有交互能力的COM图元,通过不同的COM图元的聚合,即可实现图形图案的交互设计。
1 组件技术
组件对象模型(COM),是一种以组件为单元的对象模型,这种模型使各软件组件可以用一种统一的方式进行交互,具有相同的接口。COM既提供了组件之间进行交互的规范,也提供了实现交互的环境。它具有与平台无关、面向对象等特点。
由图1COM组件、COM对象、COM接口之间的关系可知,COM接口是COM对象与系统之间的交互通道,系统通过组件提供的相关接口来操作组件。
2 原理及模型
具备交互能力的COM组件(以后简称UI组件集)共有两类:线条组件和平面区域组件,两类组件均在其内部集中实现了图形单元组件的数据存取、显示、编辑等功能。在以具备交互能力的COM组件为基础设计开发的图形图案设计系统内,我们只需根据所选功能创建相应组件的实例化对象,拾取并编辑有关图元的外观等属性,即可完成有关图案的设计;在系统的设计开发过程中,由于组件自身提供了图元初始化、图元显示以及图元的拾取编辑等能力,将系统中的图元拾取判断,图元几何变换,图元状态变迁等复杂的工作简化为向组件传递组件进行相关操作所需的各种数据、事件、操作类型等工作,简化了系统主控程序的设计复杂性,降低了系统的设计难度。
在图形图案设计系统中所有的UI组件中均实现了IOutTable接口,并将所有的系统与UI组件、UI组件与LayerSvr组件的调用以及数据通信操作均集成于该接口内,这样在图形图案系统内,只需在创建具体的图元对象时需区别具体使用的组件,以利于图元组件的实例化外,在系统的编辑、显示等操作过程中,完全无需考虑图元组件的类型,统一经由IopTable接口实现对图元的编辑与显示功能。
基于COM组件的特点,设计开发了一个用于内存中按图层格式组织系统实时设计数据的COM组件―LayerSvr组件,并在该组件中实现了ILayer、IBufFile、ICObject三个接口,分别实现图案实时数据的分层管理、内存实时数据与外部文件的存取、组件内数据与内存实时记录之间的数据与操作(删除、反删除)等功能。
图2所示的LineCtl、ArcCtl、CircleCtl、RectangleCtl、PolyLineCtl、PolygonCtl、SplineCtl、Time3SplineCtl等UI组件均实现了相同的调用接口IoutTable;上述组件具有相同的的调用与处理逻辑。
在整个系统的组件构成示意图中,selNode组件处于整个UI组件的底层位置,提供一个用于直线、矩形、圆、圆弧、多线、多边形、三次样条曲线、贝赛尔曲线等UI组件中存储相关点坐标信息的COM组件,同时该组件提供了点的基本交互功能,如点的拾取、移动及点的显示等。
Coordinations组件提供不同规格的坐标系,以便在系统中应用不同的坐标来设计图案,并提供诸如平移、旋转、缩放、错切等图元几何变换功能。
3 接口描述
3.1 IoutTable接口
在各不同功能的UI组件中,为系统调用、编辑及存储数据的需要,在所有组件中均设计实现了下图所示的调用接口(IOutTable),确保了系统UI组件调用统一性,在程序实现时只需根据IoutTable接口提供的方法编程调用相应的UI组件,即可实现系统的各项功能。
接口属性与方法说明:
Canvas:画布,组件显示的媒介;
Public Sub Init() :对组件的点(selNode)及其它数据进行初始化;
Public Function Save(FileBuf As Object) As Long:将组件数据存放在FileBuf组件中;
Public Property Get Canvas() As Object:获取画布指针;
Public Property Set Canvas(mVar As Object) :设置画布指针;
Public Function IsHot(ByVal nx As Single, ByVal ny As Single) As Long:检测鼠标当前位置是否处于选定位置,当处于组件坐标点上时,返回点的位置,表明可改变组件相关点的坐标;若处于组件的其它位置但又处于组件可选择的区域时,返回常量WHOLE,表明若此时按下鼠标左键并移动鼠标,则可拖动组件;
Public Function DrawTo(ByVal nx As Single, ByVal ny As Single) As Boolean:添加或修改组件的相关坐标数据;
Public Function RectSelect(ByVal OrgX As Single, ByVal OrgY As Single, _
ByVal Extx As Single, ByVal Exty As Single) As Boolean:判别在由函数所带参数确定的矩形中是否包括当前组件;
Public Sub BindingNode():显示组件中点的跟踪矩形,表明组件进行编辑状态;
Private Sub HideNode():隐藏组件点的跟踪矩形;
Public Sub Refresh():重新绘绘制当前组件;
Public Sub Move(ByVal nx As Single, ByVal ny As Single):当前组件在当前位置的基础上,x方向移动nx,y方向移动ny;
Public Sub Zoom(ByVal nx As Single, ByVal ny As Single):缩放组件,nx、ny为x方向、y方向的缩放倍数;
Public Function GetData() As Single():获取组件数据;
Public Function Add(rdParm() As Single) As Boolean :以rdParam中的数据设置组件;
3.2 IBufFile接口
IbufFile接口主要实现对整个图案操作的各项功能,具备图案的导入、创建、移除、图案显示范围设定、视区坐标与世界坐标设定等能力。
接口方法描述:
Public Function LoadPattern(lpFileNameStr as string)as Boolean;从外部存储介质加载图案文件
Public Function SaveToFile(lpFileNameStr as Variant,Optional ByVal sFlag as Variant)as Boolean;图案存盘
Public Function Remove(optional lpFileNameStr as Variant, Optional ByVal sFlag as Variant)as Boolean;移除图案
Public Function NewFile(optional lpFileNameStr as Variant) as Boolean;新建图案
Public Function SetViewArea(ByVal OrgX as long,ByVal OrgY as long,
ByVal ExtX as long, ByVal ExtY as long)设置图案设备坐标系统
Public Function LayerSum() as long;获得当前图案的图层总数
Public Function Records() as long;获得当前图案的图元记录数
Public Function FileSum() as long;系统正在编辑的图案数
Public Function SetCoord(ByVal OrgX as Single,ByVal OrgY as Single,
ByVal ExtX as Single, ByVal ExtY as Single);设置视图坐标
Public Function SetWCoord(ByVal OrgX as Single,ByVal OrgY as Single,
ByVal ExtX as Single, ByVal ExtY as Single);设置世界坐标
Public Function RefreshAll() ;彻底重绘当前图案
Public Function Refresh() ;重新绘制当前图案
Public Function SetDeviceCaps(ByVal mVar as Long)
3.3 Ilayer接口
Ilayer接口在LayerFile组件中予以实现,系统可以根据用户具体需要动态创建与销毁图层,并可通过该接口提供的相关方法,实现图层属性编辑、图层整体几何变换(平移、缩放等)操作,增加了系统进行图案设计的灵活性。
3.4 ICObject
ICObject接口提供了一个UI组件操作LayerFile组件中缓存的图元数据的通道,通过该接口在系统内实现了UI组件与LayerFile组件内的图元数据间交互操作的能力。
4 组件实现
组件实现是以具体的编程程语言将组件的各项功能以及组件提供的接口加以实现,并应用于编程实践过程。
在此以直线图元的拾取判别(IsHot)算法为例,分析组件及其接口操作方法的实现方式,并给出相应示范代码。
直线图元拾取判别(IsHot)算法可以描述如图4所示。
将上述八个组件集中到一个VB ActiveXDLL工程中,完成编码并进行编译即可生成一个包含相关COM组件的动态库。现以LineCtl组件的有关接口方法的实现为例,说明组件的具体实现:
Private mNode(0 To 1) As New selNode
Private CurFocus As Long
Private mOldMouse As Long
Private mMoveOrg As MoveOrg
Private mITrans As Coordinations
'------------------------------------------------------------------
Public Function IsHot(ByVal nx As Single, ByVal ny As Single) As Long
Dim i As Long
Dim y As Single, s(1) As Single, ss(1) As Single
Dim K1, k2, k3, k4, k5
IsHot = Nul
For i = 0 To 1
With mNode(i)
If .GetFocus(nx, ny) Then
IsHot = i: CurFocus = i‘选取直线图元端点
Exit Function
End If
End With
Next i
K1 = mNode(1).y - mNode(0).y
k2 = mNode(1).x - mNode(0).x
k3 = mNode(0).y
k4 = mNode(0).x
If k2 = 0 Then Exit Function
y = (K1 / k2) * (nx - k4) + k3
k5 = Abs(y - ny) ‘求鼠标点(nx,ny)到直线图元的距离dist
s(0) = SELED / 15: s(1) = 0
ss(0) = 0: ss(1) = 0
Call ITrans.ViewToWorld(s(), ss(), 2) ‘对dist进行设备坐标到世界坐标转换
If k5 < s(0) Then
With mMoveOrg
.x = nx
.y = ny
.OK = True
End With
IsHot = WHOLE 'return Whole Object 整体选中
CurFocus = WHOLE
Canvas.MousePointer = vbSizePointer
Else
Canvas.MousePointer = mOldMouse
IsHot = Nul
End If
End Function
5 组件运行结果
上述组件应用于软件中进行应用的有关结果见图5。
6 小结
将COM技术应用于计算机图形图象处理中,既可将系统设计开发的复杂性降到最低,提高了各组成部件的独立性,使系统功能的二次增强以及系统的升级的灵活性都有大幅度的提高。使用COM技术于图形图象处理,可增强系统的交互性能与系统设计开发与升级的灵活性,对开发一个易于操作,易于维护,功能强劲的应用软件,将有极大的帮助。
参考文献:
[1] 潘爱民.COM原理与应用[M].北京:清华大学出版社,2000.
[2] Petzold C.北京博彦科技发展有限公司译.Windows程序设计[M].北京:北京大学出版社,1999.
[3] Armstrong T,Patton R.ATL开发指南[M].董梁,译.2版.北京:电子工业出版社,2000.
[4] Mckinney B.希望图书创作室译.Hardcore Visual Basic 5.0核心技术[M].北京:北京希望电脑公司,1998.
[5] 孙家广,杨长贵.计算机图形学[M].北京:清华大学出版社,1998.