4 开发环境应用
考虑到终端用户所能够接触到的开发环境和开发工具,本文作者完全采用UG NX的用户开发环境进行程序的设计和实施。程序的开发采用UG NX的基本开发包Open API (C语言版)和C语言。 在程序界面的设计上,本文作者在这里采用在UG NX的开发框架中利用Windows 平台基本编程(Windows Platform SDK)进行程序界面的设计,这样大大扩展了用户可以设计的界面形式(如果用户操作系统不是Windows环境,改用相应的Platform SDK进行开发,道理是一样的)。在本例中,作者在界面设计上着重展示了以下几点供后继的开发者作为参考:如何设计Windows 对话框,如何弹出Windows 设计的对话框,如何捕捉Windows 消息,如何使主程序窗口飞入UG NX 主窗口,如何在UG NX 下定位用户窗口,如何读取和存储XML文件,如何与UG NX 交接控制权等。
4.1 UG NX用户开发的基本知识
有关UG NX 用户利用C语言进行开发的基本方法在UG NX 的用户手册中已经有很详细地描述,在这里本文作者不再详述。仅需指明以下一点:
UG NX 用户程序的入口函数在本例中采用:void ufusr( char *parm, int *returnCode, int rlen ),因为这个程序将建立自己的Windows Callback机制, 函数extern int ufusr_ask_unload( void ) 的返回值一定要设为:UF_UNLOAD_UG_TERMINATE。
4.2 Window 对话框开发
利用Windows Platform SDK进行Windows对话框的开发,非常容易。我们只需要定义Resource文件(*.rc)和相应的头文件(一般为resource.h)并把这两个文件加入我们的工程进行编译就可以利用其中的资源了。Microsoft Visual Studio产品提供了一个资源编辑器,用它可以快速的定制对话框,图片,图标,菜单等资源。有关这部分的内容用户可以查看Windows Platform SDK的开发手册 和MSDN的相关章节。
将Windows对话框弹出来利用函数:
HWND CreateDialog( HINSTANCE hInstance, LPCTSTR lpTemplate,HWND WndParent, DLGPROC lpDialogFunc);
在生成Windows对话框的时候我们利用注册了一个Windows的Callback函数,就是最后一项DLGPROC lpDialogFunc。这个函数要按照特定的格式编写,有关Windows的消息处理都是在这个函数内完成的。
让窗口从一侧飞出来属于Windows的特效,实施这个特效利用函数:
BOOL AnimateWindow(HWND hWnd, DWORD dwTime, DWORD dwFlags);
将我们所设计的Windows对话框定位在UG NX的主窗口中,我们首先需要获得UG NX 的主窗口和当前的工作线程(Instance),这是通过以下两个函数实现的:
HWND GetForegroundWindow();
HWND GetWindow(HWND hWnd, UINT uCmd);
获得有关窗口的形位信息和对窗口从新定形定位是通过以下两个函数来实现的:
BOOL GetWindowRect(HWND hWnd, LPRECT lpRect);
BOOL MoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint);
4.3 XML文件的操作
对XML文件的操作用户可以利用MSXML所提供的SDK来进行开发。有关这部分的内容用户可以参考MSXML SDK的用户手册和MSDN的相关章节。
包含MSXML SDK所需要的头文件和库文件通过如下语句实现:
#import "msxml.dll" named_guids
创建XML数据集的实例通过下面函数实现:
WINOLEAPI CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv);
打开XML文件和存储XML文件通过如下两条语句实现:
VARIANT_BOOL MSXML::IXMLDOMDocument::load (const _variant_t & xmlSource);
HRESULT MSXML::IXMLDOMDocument::save (const _variant_t & destination);
4.4 Windows对话框和UG NX 的通讯
因为我们的Windows代码是直接嵌入UG NX的开发框架的,所以可以直接调用UG NX 的Open API 函数对UG 内部的数据和物体进行操作,这里仅需要指出的是控制权的交接。这发生在当我们在Windows对话框中调用UG NX的函数弹出UG NX的对话框时,我们需要先将Windows对话框锁住并隐藏,然后UG NX 的对话框才会显现,当UG NX对话框的任务完成了之后,成需要将Windows主对话框解锁并重新显现,这是通过以下一系列函数实现的:
// Hide current user dialog and lock UG session
ShowWindow(hMainDlg, SW_HIDE);
UF_UI_lock_ug_access (UF_UI_FROM_CUSTOM);
……
UF_UI_select_with_class_dialog("Select Objects", "User Selection", UF_UI_SEL_SCOPE_NO_CHANGE, InitSelectionProc, NULL, &iRetVal, &iCount, &Objects);
……
// Unlock UG session and show user dialog
UF_UI_unlock_ug_access(UF_UI_FROM_CUSTOM);
ShowWindow(hMainDlg, SW_SHOW);
5 结论
本文作者在UG NX平台上借助UG NX Open API开发了一个小工具,使得用户可以将在外部系统产生的XML格式的数据信息读入到UG NX系统内,并为系统内的物体加上相应的属性,同时用户还可以将UG NX系统内物体的属性以XML文件的格式输出到外部,供其它系统使用和管理。本文作者的出发点是希望能够提供给各个系统终端用户一种方法,使得他们能够自由的在各个系统间传递用户所需要的专有数据,从而结合现有的PDM系统组成完整的数据传递和管理体系。(E-works)