介绍了在标准件参数化设计中,以AutoCAD为平台,对ADS_ARX绘图程序的模块化处理、AutoCAD下的界面设计以及用Visual C++实现对标准件设计资料库和方法库的参数化查询,为AutoCAD下的二次开发提供了一种全新的方法。
引言
?CAD技术在机械工业中的一个重要应用就是参数化设计,即对一些具有相似结构但尺寸经常改动的标准零件, 采用参数化设计的方法建立图形库,调出一组参数就能生成一个标准件图形。 本系统中包含一个常用机械设计标准资料库,使设计人员不必翻阅设计手册就可以在计算机上查到所需的信息, 除此之外本系统还提供了机械常用各种设计计算方法(包括校核和优化), 并将零件的设计计算和辅助绘图集成于统一的环境中,从而真正实现了设计与绘图一体化,明显提高了产品的设计效率。
1 标准件参数化设计系统的建模
?参数化CAD所面对的产品绝大多数为定型产品,这些产品的系列化、通用化、标准化程度高。机械标准件具有上述特点, 所以本系统建模根据参数化的建模思想来进行。系统的基本思路为:首先由用户选择所要设计的零件类型,然后选择设计行为(如对于圆柱齿轮设计有结构、校核或优化设计), 并由用户输入原始设计参数,这时零部件CAD子系统根据控制子系统传输过来的原始设计参数和所选设计行为进行相应设计活动, 最后由参数化绘图子系统接收设计结果, 在本系统中绘出相应的零件工作图,机械标准件设计系统软件的逻辑框图见图1。
2 软件设计中的关键技术
2.1绘图公用模块的建立
?基于程序设计模块化思想,为标准件绘图程序作了一个公用模块Common.arx,该模块对标准件图形环境做了统一规定,并对一些相同功能的程序模块(如参数输入、图形旋转等)进行了统一编制。另外对某类标准件来说,不同标准号对应的标准件结构基本是相同的,只是局部结构的改变, 因此对这些具有相同图形的部分也进行了模块化处理。这样既节省内存又使程序代码易于管理。以下对Common.arx中的初始化实体模式与作图环境子模块进行说明。

图1 机械标准件设计标准软件的逻辑框图
公用模块在AutoCAD下建立了三个层stand1(线型continuous,颜色white),stand2(线型center,颜色red), stand3(线型hidden,颜色white)分别放置标准件图形的粗细实线、中心线和虚线。另外在标准件插入图形以前,调用公用模块中的init()初始化作图环境,完成后再调用rest()恢复以前的作图环境。以下是init()程序的代码:
init(){structresbufrBc,rBb,rBu; Jz.NHiLct1
ads_getvar(″BLIPMODE″,&rBb); =K{"{5Wb
ads_getvar(″CMDECHO″,&rBc); ?_$=l1vf
rBu.restype=PTSHORT;rBu?resval=0; Hl/
QnI!
ads_setvar(″CMDECHO″,&rBu); ?NR A:t(}
ads_setvar(″BLIPMODE″,&rBu); l@ H
ads_command(RTSTR,″linetype″,RTSTR,″s″, K[Kh&`T
RTSTR,″bylayer″,RTSTR,″″,RTNONE); X4AyX.p
ads_command(RTSTR,″color″,RTSTR,″bylayer″,RTNONE);}
本系统的参数化绘图子系统程序框架采用的是ARX的基本结构及消息机制,而机械零件的参数化绘图部分采用ADS库函数 (如实体数据库函数、选择集操作函数和选择集构造函数等)来完成。以下介绍ARX的基本结构及消息机制:
AcRx::AppRetCode !*m5F8Qm?A
AcrxEntryPoint(AcRx::AppMsgCodemsg,void*ptr) {7;8#.S72
{if(ptr!=NULL){switch(msg){ R)z4n
caseAcRx::kInitAppMsg://加载应用程序 zb}9%.U
acrxDynamicLinker?〉Un1ockApplication(ptr) 2FF4W54I
break; ~\.w^*$#Y
caseAcRx::kLoadDwgMsg;//登记ads_defun()定义的函数 8x8uo
funcload(); QP)pgAc
break; e8]\U/
caseAcRx::kInvkSubrMsg://执行ads_defun()定义的函数 ng:9 l3x
dofun();
L %K\C
break; S\5bmvqP"
caseAcRX::kUnloadDwgMsg://撤消应用程序所做的初始化工作 04'~ta(t
funcUnload(); (TwnkXrR,
ads_printf(″Unloading\n″); `m?c;,\
break; jbu8~\"
caseAcRx::kUnloadAppMsg://彻底清除所有的系统资源 x&9hI
default: ,:`4%
break; a / #PLP
returnAcRx::kRetOK;}(4)
2.2软件在AutoCAD下的界面设计
?本系统菜单采用AutoCADR14新的菜单制定技术制作而成, 对AutoCADR14的菜单文件ACAD.MNU进行了修改,在下拉菜单draw下加入一项标准件,其下一级子菜单是标准件种类,当你选择某类零件时会动态加入有关这类零件的设计计算菜单。举例如下:
HA`@7I
* * *POP7 U,gti,IX^
* * draw x2z;6)
ID_MnDraw[&Draw chen] Y"Ql!5=
…… zG9Y!SY\-
ID_StandardComponent[-〉标准件] 7J|VD#DE$Y
ID_gear[齿轮p(menucmd″p7=+wuhansheji?pop1″] J6%AH?Mt
其中,p7为菜单节draw的节号即POP7,chilunsheji?pop1表明所要加入的菜单节组名为chilunsheji,菜单节号为pop1。然后由设计菜单调用零部件子系统进行设计计算和参数化绘图。
3 软件的数据查询
?Visual C++的MFC数据库类提供了强大的数据访问功能,并且可以采取中文界面,所以本系统采用了MFC数据库类中的两种: Zh*u(rO
CDatabase类: pN9A{v(
CDatabase类用来封装应用程序对一个数据库连接的处理,具体做法如下: s#DaKPC
?Cdatabase * pDb; pDb=newCdatabase; 9h%?QC
pDb-〉OpenEx(″DSN=db1″)这样便建立了与名为db1的数据库的连接,本系统采用十分流行的Access作数据库平台存放设计系统中所需的大量数据。 dBe`p5Z
CRecordset类: mG`e3X6@-
?这个类用来封装对数据库的查询,如加入、修改、删除等操作,设计资料库的访问(只简单介绍如何实现参数化查询)。
?假设CmyRecordset为记录集类Crecordset的派生类, 在CmyRecordset类的声明中加入m?_ffl(查询参数),在CmyRecordset?cpp文件AFX?_Field?_Init后初始化m?_ffl及m?_nparams(查询参数的个数)以下为具体查询的实现: $dzy%lle
Bool bRc:CmyRecordset * p=new CmyRecordset; Yd= a}T
p-〉m?_strFilter=″直径=?″;p-〉m_ffl=mm(此处mm具有具体值); ~aOuG5XK
bRc=P?〉Open(Crecordset::snapshot,NULL,Crecordset::readOnly); bH2MdU
if(bRc) AUNQA
TRACE(″openedsuccessful!\n″); =gvBz | +
Else P=&o%K,:f
TRACE(″openedfailed\n″); Q7C;1aO
然后由CmyRecordset类的成员变量即可得所需的数据。
4 公式库的建立
?本系统中要用到很多计算公式,进行数据拟合和强度校核以及优化设计, 因此建立了一个动态连接库(DLL),将相关的计算公式作为成员函数集总在各自的零件类中,在Visual C++中创建扩展MFC DLL,这样在设计计算中就可以动态加载所需公式。举例如下: _~tEw.fM5
class AFX_EXT_CLASS chilun C,NxE5?h
{public: &q