3.3 设计信息获取界面的开发
一般情况下,UG/Open API使用界面开发工具UIStyler来开发应用程序界面[9]。UIStyler是一种可视化开发工具,提供Label、Bitmap、String、Option Menu、Button等控件,可与Menuscript菜单脚本文件结合定制用户菜单和界面。它直接通过actions的方式被UG调用,从而将用户应用和UG应用完全融合。与流行的Windows应用程序开发工具相比,UIStyler提供的控件较少,功能有限,如树型控件、列表控件、视图类窗口等在UIStyler中无法实现。要创建复杂的应用程序界面,需在VC++环境下使用基础类库MFC来实现。
基础类库MFC是C++的编程接口,而UG/Open API所使用的是标准C,因此在UG/Open API应用中不能直接使用MFC类库。但是如果在基于MFC的VC++用户应用工程中加入UG/Open API所使用的库函数和头文件则能正确通过编译,生成动态链接库。例如,在用户工程中加入UG的两个库文件libufun.lib libugopenint.lib(这两个文件位于UG安装目录的UG OPEN子目录中),并加入以下语句即可调用基于MFC的非模态用户对话框(对话框的属性必须为Visible)。
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CgetinforDlg * dlg = new CgetinforDlg();
dlg->Create(IDD_DIALOG1);
用这种方法显示的对话框可按用户要求保留在UG界面层,并且采用加锁和解锁机制可与UG进程交互。
3.4 数据库开发技术
ADO(ActiveX Data Object)是基于OLE DB的数据库应用程序开发接口,可以访问Access、SQL Server、Oracle等数据库。使用ADO技术开发数据库应用程序有两种途径: ActiveX控件,ADO对象。使用ActiveX控件访问数据库,对程序控制相对较弱,效率比较低;直接使用ADO对象来访问,则可以灵活地控制应用程序。ADO保留了MFC/ODBC、DAO的特性,其类的定义是作为一种资源存储在ADO DLL中,使用ADO前必须引入ADO库文件,其引入方法是在MFC AppWizard工程模版生成的标准文件stdafx.h头文件里加入以下语句(其中msado15.dll的具体位置根据系统路径确定)。
#import "c:\program files\common files\system\ado\msado15.dll" \
no_namespace \
rename("EOF","adoEOF")
由于ADO是一组COM动态库,所以程序在调用ADO前必须初始化OLE/COM库环境,在应用最后应该关闭连接,释放对象。ADO库包含3个接口指针:_ConnectPtr,_RecordsetPtr和_CommandPtr。在需要使用多个记录集时,最好使用已经创建数据连接的全局_ConnectPtr接口指针,提高数据库连接创建的效率,然后使用_RecordsetPtr或_CommandPtr接口指针执行存储过程和SQL语句。使用该方法可以灵活实现对异构数据库的处理,程序中可以使用多种数据库,如ACCESS、Microsoft SQL、Oracle等任何支持ODBC的数据源。在oracle中,配置好ODBC数据源和驱动程序后,通过创建_ConnectPtr实例,可指向并打开该数据源。其连接语句为:
m_pConnection->Open("DSN=ORADB;UID=system;PWD=manager;","","",adModeUnknown)
其中ORADB为在oracle中以用户名system和密码manager创建的数据源名称。
在建立与Oracle的连接之后,创建记录集,利用SQL语句将产品信息存储到统一数据库。
3.5 产品装配结构的遍历
树型结构是产品数据在界面上的表现形式,这种产品数据结构来源于产品结构的遍历。在UG的装配模型中以树型结构组织装配组件和零件,该模型对应的是造型设计信息。一个部件文件中只有一个装配树根,是遍历的起点。装配中,组件和子组件之间的关系是利用实例Instance标记的,且是唯一的,所以访问每个实例Instance就能得到对应的一次关联。在进行产品结构遍历前先进行产品结构分析。
产品结构根据产品开发不同而具有不确定性,深度层次和同一层次的数量都是未知的。具有这样的层次特点:与产品平行的节点是其他产品,产品的子节点可是零件或者部件,零件的子节点是特征,而部件的子节点还可以是零件或者部件,同一个零件或者部件可以同时出现在同一产品的不同部件下,不同产品也可以有完全相同的零部件(如图3)。可见产品结构是非线性结构,不能以简单的数据链来表示,且具有递归特性。

搜索常见的方法有广度优先搜索和深度优先搜索。广度优先搜索从某一顶点(假设为M)出发,在访问顶点M后再访问M的各个未曾被访问过的领接顶点(假设为N1,N2,…,Nk),然后再依次访问N1,N2,…,Nk的所有的还未曾被访问过的领接顶点。再从这些访问过的顶点出发,访问它们的所有还未被访问过的领接顶点,……,如此循环,直到所有的顶点都被访问完为止。广度优先搜索是一种分层搜索,不是一个递归的过程,其算法也不是递归的。深度优先搜索是从某一顶点(假设为M)出发,在访问顶点M后,再依次从M的任一还没有被访问过的领接顶点(假设为N)出发进行深度优先搜索,直到所有的顶点都被访问完为止。这是个递归定义,其算法可以用递归算法来实现。
以下利用API函数和递归调用的方法遍历装配中的组件和零件。
先用UF_ASSEM_ask_root_part_occ获得装配树根,然后用UF_ASSEM_ask_part_occ_children获得根的子部件。并对每个子组件递归调用UF_ASSEM_ask_part_occ_children,直到组件只由一个零件组成。
void CycleAllParts(tag_t child_tag)
{
tag_t *child_part_occs;
int partNum=UF_ASSEM_ask_part_occ_children(child_tag,&child_part_occs);//获得子组件数
for(int i=0;i<partNum;i++)
{
char part_name[MAX_FSPEC_SIZE+1];
char refset_name[MAX_ENTITY_NAME_SIZE+1] ;
char instance_name[MAX_ENTITY_NAME_SIZE+1];
double origin[3];
double csys_matrix[9];
double transform[4][4];
UF_ASSEM_ask_component_data(child_part_occs[i],part_name,refset_name,instance_name,origin,csys_matrix,transform);//获得组件属性
Saveinfo();//保存组件属性
CycleAllParts(child_part_occs[i]);
}
UF_free(child_part_occs);
}
3.6 产品信息管理系统开发
产品结构来源于CAD环境,可以用二维明细表来表示,也可以用树型结构表示。树型数据结构可以清晰的表达数据元素之间的分支关系和层次关系,便于理解,逻辑性强。为合理组织和管理产品数据,本系统以产品结构树作为产品信息管理的起始界面,如图4。这种方式让产品结构的层次关系一目了然,用户通过对产品结构树的简单操作就可以按不同分支展开,直观的得到所需要的信息,而不需要考虑数据存放的物理位置。

以产品的部件图号作为树的根节点,各组成零部件代号作为下级节点,树主干表示层次分支关系,树节点表示零部件实体,树的枝叶表示零部件相关的属性数据(包括该零件的工艺数据和图形文件)。需要特征信息时,展开零件节点,下级特征信息就自动追加到该零件节点上。
信息管理系统主界面用VC++开发,采用基于视图和文档类型结构;用CsplitterWnd 类将窗口切分成两部分,定义多个视图类和视图指针,在响应函数里执行该视图生成函数,实现视图灵活变换;模态和非模态对话框交互;在要触发的菜单类中添加右键菜单响应函数,并在该类的消息处理循环message_map中添加宏:ON_COMMAND(菜单ID,响应函数),以实现系统功能菜单和各视图右键功能菜单相结合,方便用户操作。
4 结论
本文综合应用UG/Open API和oracle数据库技术,采用面向对象编程语言C++,以DLL方式将应用程序无缝嵌入UG 环境,实现用户与UG交互,并用深度搜索递归调用法遍历产品零部件模型,获得产品结构信息和零部件设计信息,通过网络将获得的信息存储到服务器数据库,给企业其他部门和CIMS其他技术单元提供了统一的信息来源,保证了异地协同设计与数据集成管理,有利于企业信息化的实现。(E-works)