摘 要:介绍了在CAXA电子图板中,使用二次开发平台EBAS提供的API函数实现图素图层转换的编程方法并给出了实例。
引言
CAXA电子图板是功能齐全的通用计算机辅助设计(CAD)软件。它以交互图形方式,对几何模型进行实时的构造、编辑和修改。CAXA电子图板拥有“开放的体系结构”,允许用户或第三方厂家根据自己的需求,通过在电子图板开发平台基础之上进行二次开发,扩充电子图板的功能,实现用户化、专业化,使电子图板成为既能通用于各个领域,有适用于特殊专业的软件。本人通过实践,利用API函数实现了CAXA电子图板图素图层的快速转换,从而更方便的对各图素的图层进行转换,下图作以详细介绍。
1.安装二次开发平台
CAXA电子图板提供的二次开发是在Visual C++ 6.0环境中进行的,因此在安装二次开发平台之前应先安装Visual C++ 6.0。假定用户将电子图板安装在C:\CAXA\CAXAEB路径下,VC++安装在C:\ Microsoft Visual Studio\VC98路径下,则应做以下两步工作:
1). 将C:\CAXA\CAXAEB\Ebads\Wizard目录下的文件 ebadw.awx 拷贝到C:\ Microsoft Visual Studio\Common\MSDev98\Template目录下
2). 启动VC++,在Tools菜单中单击Options菜单,在弹出对话框中选取Directories标签,在Include files中加入在二次开发编译过程中所需要包含的头文件所在的路径C:\EB\EBADS\INCLUDE,在Library files中加入在连接过程中需要连接的库所在的路径 C:\EB\EBADS\LIB。
2.新建二次开发程序
二次开发平台安装完成后,下面我们就开始创建二次开发程序了。首先进入VC 6.0开发环境,创建一个新的工程,在“file”下拉菜单中选取“new”菜单,弹出如图a所示的的对话框:在对话框中选择“Project”标签,在相应的列表框中选择“CAXA EB Application Wizard开发向导”选项,并输入工程的名称(如:EBTC)和路径,输入完成后,单击“OK”按钮可弹出如图b所示的的对话框,接着再点击Finish完成工程的创建。
图a
图b
创建二次开发应用程序项目 3.创建菜单资源
在新建的工程里创建菜单资料,在“插入”菜单中选择“资源”在资源对话框中选择“Menu”再点击新建按钮,接着添加菜单项目如图3.a所示
图3.a 4.添加加载菜单的代码
利用ebAppendMenu(CMenu)函数在主菜单末尾添加子菜单,在EBTC.CPP文件中找到STARTUP()函数在其中加入以下代码:
void WINAPI STARTUP()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
AfxGetApp()->m_pMainWnd=new CFrameWnd;
AfxGetApp()->m_pMainWnd->m_hWnd=ebGetMainFrame()->m_hWnd;
for(int i=0; i ebRegistFunc(&ft[i]);
for(i=0; i ebRegistCmd(&pCmd[i]);
// TODO: 定制用户界面,例如加载用户自定义的菜单等
// 添加用户定义的菜单
CMenu menu;
menu.LoadMenu(IDR_MENU_APPEND);
ebAppendMenu(&menu);
//IDR_MENU_APPEND是所创建的菜单资源ID
// TODO: 添加其他初始化信息
}
在FINISH()函数中添加电子图板程序终止时的处理,如删除掉在STARTUP()函数中加载的用户自定义菜单
void WINAPI FINISH()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
for(int i=0; i ebDelFunc(&ft[i]);
for(i=0; i ebDelCmd(&pCmd[i]);
// TODO: 添加应用程序终止时的处理,如删除掉在STARTUP()
// 函数中加载的用户自定义菜单
// 删除添加的菜单
CMenu menu;
menu.LoadMenu(IDR_MENU_APPEND);
ebDeleteMenu(&menu);
ASSERT(AfxGetMainWnd()!=NULL);
AfxGetMainWnd()->m_hWnd=NULL;
delete AfxGetMainWnd();
}
5.添加菜单项的消息响应函数及对应的键盘命令
在EBTC.CPP文件中加入以下代码:
FUNTABLE ft[] = {
// TODO: 添加消息响应函数与对应ID值的对应组并删除下面的NULL
{ ID_EBTC0, usrAppTC0},
{ ID_EBTC1, usrAppTC1},
{ ID_EBTC2, usrAppTC2},
{ ID_EBTC3, usrAppTC3},
{ ID_EBTC4, usrAppTC4},
{ ID_EBTC5, usrAppTC5},
{ ID_EBTC6 usrAppTC6},
// ID_EBTC0~6是菜单项的ID
};
CMDDTABLE pCmd[] = {
// TODO: 添加执行消息响应函数的命令名与对应ID值的对应组并删除下面的NULL
{"T0",ID_EBTC0},
{"T1",ID_EBTC1},
{"T2",ID_EBTC2},
{"T3",ID_EBTC3},
{"T4",ID_EBTC4},
{"T5",ID_EBTC5},
{"T6",ID_EBTC6},
//T0~T6是对应的键盘命令
};
6.菜单的响应函数的声明及添加功能实现代码
6.1在FuncDef.h中加入各函数的声明代码如下:
// TODO: 声明用户自定义的消息响应函数
extern int usrAppTC0(int& step,int& flag);
extern int usrAppTC1(int& step,int& flag);
extern int usrAppTC2(int& step,int& flag);
extern int usrAppTC3(int& step,int& flag);
extern int usrAppTC4(int& step,int& flag);
extern int usrAppTC5(int& step,int& flag);
extern int usrAppTC6(int& step,int& flag);
6.2在EBTC.CPP中加入各函数的勾成代码如下:
int usrAppTC0(int &step,int &flag)
{
int ret;
static EB_SELECT select;
ret = ebGetSelectByPick(select , step , flag);
ebPrompt("拾取图素继续修改......"); // 如果交互没有结束则返回
if(ret!=RT_ISOVER) return ret;// 如果交互结束, 判断选择集是否为空
if(ebIfSelectEmpty(select)==TRUE) // 结束交互
{
ebSetCurrentLayer(0);
ebSetCurrentLType(251);
ebSetCurrentColor(251);
ebEndCommand();
ebClearMenu();
return ret;
}
// 恢复正常显示选择集
ebDrawSelect(select,NORMAL); // 修改结点的属性
int num=ebGetSelectLength(select); // 得到选择集中的结点个数
for(int index=0;index {
// 从选择集中提取结点,并修改结点属性
EB_NODE node=ebGetObjectFromSelect(select,index);
ebSetNodeAttrib(node,0,251,251);
}
ebFreeSelect(select); // 释放不再使用的选择集
ebSetCurrentLayer(0);
ebSetCurrentLType(251);
ebSetCurrentColor(251);
ebRedraw();
ebEndCommand();
ebClearMenu();
return RT_ISOVER;
}
其中函数中主要使用的API函数见下表其余usrAppTC1~ usrAppTC6的代码与usrAppTC0类似,只需将层的数值做相应的修改即可。
7.编译与加载
7.1在“工程”菜单中选择“设置”项在对话框中选择“调试”项如图7.a所示,再选择“连接”项如图7.b所示,设置好后单击确定;接着就可以点击图标生成程序文件了。
图7.a
图7.b 7.2加载二次开发的程序,利用CAXA电子图板应用程序管理器用来管理电子图板二次开发应用程序的,在“文件”菜单中选择“应用程序管理器”命令,可以弹出如图7.2a所示的对话框。添加应用程序的路径再选择需加载就用程序;最后加载结果如图图7.2b所示。结束语:二次开发应用程序被电子图板加载后,成为电子图板进程的一部分,它们之间采用消息传递机制直接进行进程内通讯,面不需要诸如LISP语言等作为中介,因此执行速度非常快,运行效率很高。而且应用程序中,既可以使用Windows标准的交互方式,如菜单、工具条、对话框、快捷键等等,也可以使用电子图板所特有的交互方式,如立即菜单、键盘命令等等,利用资源编辑器进行可视化编辑,利用此程序提供的简单的API函数进行加载、卸载和显示,就可以生成各种交互界面。这种可视化编辑方法为用户提供了极大部分精力投入到对流程的控制及功能的实现上。同时,此应用程序还具有功能强大、编辑方便等优点。
|