基于ObjectARX实现特征建模的方法
2010-07-07魏永乐晁彩霞
魏永乐, 晁彩霞
(辽宁工程技术大学机械工程学院,辽宁 阜新 123000)
随着计算机技术的迅速发展,CAD/CAM技术已经在机械、建筑、电子等行业得到了广泛的应用。CAD/CAM技术的应用,可以加快产品开发进程、提高生产效率、缩短开发周期、降低生产成本、提高企业竞争力。而实现CAD/CAM集成的关键是建立一个包含产品全生命周期各阶段信息的产品信息模型,而基于特征的产品信息模型除了包含产品的几何信息外,还包含材料、精度等制造信息,可以更好地表达产品的设计技术和生产管理信息。所以,建立基于特征的产品信息模型被认为是实现 CAD/CAM 集成的根本途径。由于独立开发一个基于特征的建模系统需要花费大量的时间和人力,因此,在现有 CAD系统基础上研究特征建模是实现中小企业CAD/CAM集成的一条捷径。
AutoCAD作为通用的CAD软件以其功能强大、使用灵活、二次开发方便等优点在机械、电子、建筑等领域得到了极为广泛的应用。考虑到AutoCAD系统在中小企业应用的广泛性及其良好通用性和开放性,并且具有实体造型功能,本文将讨论在AutoCAD系统平台上,利用功能强大的ObjectARX开发工具和面向对象技术,实现特征建模的方法。
1 特征建模概述
特征是零件或产品在设计和制造中抽象出来的属性、功能、关系和数据的集合[1]。
1.1 特征的分类
不同的应用领域,特征的抽象和分类方法有所不同。根据机械零件图样信息和加工工艺信息,可将特征分为以下几种类型[2]:
(1)管理特征 与零件管理相关的信息集合,包括标题栏信息、材料等信息。
(2)技术特征 与零件的性能和技术要求等相关的信息集合。
(3)材料热处理特征 与零件材料和热处理相关的信息集合。
(4)精度特征 与零件精度相关的信息集合,如尺寸公差、形位公差和表面粗糙度等。
(5)形状特征 与零件几何形状、尺寸相关的信息集合。
1.2 特征建模方法
特征建模方法主要有三种[3]。
(1)交互式特征定义 用户首先建立几何模型,然后交互拾取图形,定义特征所需要的几何要素及其参数。这种建模方法可靠易行,但是自动化程度低,容易产生人为的错误。
(2)特征识别 将零件的几何模型与预先定义的特征进行匹配,从而确定特征的具体类型及其它信息。目前特征识别仅对简单零件有效,且仍缺乏CAPP系统所需要的公差、材料等属性。
(3)基于特征设计 从设计开始,特征就体现在零件模型中,并提供丰富的零件信息,便于与后续过程实现信息共享和集成。这种方法首先建立用户定义的特征库,将各种特征的定义都放在特征库中,使用时从库中调出,并给出它的尺寸、位置参数和各种非几何信息,设计效率高。
1.3 零件特征信息模型
以特征来表示零件的方式即为零件的特征信息模型。为建立相对通用的零件信息模型,满足不同应用的信息需求,可以将零件信息划分为三层次结构来表达,分别是零件层、特征层和几何层[2],如图1所示。特征层是零件模型的核心,它反映的是零件的所有特征单元信息及特征间关系信息,形状特征模型是特征层最重要的子模型,可以用特征树来描述;精度特征模型、材料特征模型从属于形状特征模型,而管理特征模型和技术特征模型及形状特征模型直接从属于零件特征模型。几何层则反映了CAD系统的底层几何/拓扑信息,是整个模型的基础。
图1 基于特征的零件信息模型
2 特征信息模型的建立
在零件特征信息模型的各类特征中,管理特征和技术特征较为简单不必详述,而形状特征是建模系统中最重要、最关键的特征。它是零件特征信息模型中表达信息的基本单元,不仅包括了设计阶段的几何信息,还包括了后续的CAPP、CAM 所需要的工艺信息和制造信息。在整个CAD/CAPP/CAM 集成系统中,形状特征是信息的载体,贯穿产品开发的始终,是零件特征信息模型的核心。
本文建立形状特征库时,采用了C++语言面向对象的开发机制,定义了一个基特征类,用于定义和存储所有形状特征的公共属性和方法,所有形状特征类均由基特征类派生而来,如图2所示。进行基于特征的设计时,用户只需要从形状特征库中提取所需的特征进行实例化即可。基特征类的数据结构如下[4-5]:
图2 特征的关系与结构
class CFeature:public AcDbObject
{ public: //各种形状特征公共的方法
ACRX_DECLARE_MEMBERS(CFeature);
CFeature();
Acad::ErrorStatus SetFeatID(char*); //设置ID……
//对象信息写入图形数据库及从中读出
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*);
protected: //各种形状特征公共的属性
char* m_FeatClass; //特征类名
char* m_FeatID; //特征ID
char* m_ParentID; //父特征ID
char* m_ChildID; //子特征ID
AcGePoint3d m_LocaPoint; //特征定位点
//定形和定位尺寸公差
CShapDimeTole* m_ShapDimeTole;
CPosiDimeTole* m_PosiDimeTole;
CRoughness* m_Roughness; //表面粗糙度
CMateHeat* m_MateHeat; //局部热处理
……
};
由基特征的数据结构可知,基特征是由ObjectARX开发工具中的AcDbObject类派生而来的,特征对象所包含的信息可以作为AcDbObject类的对象通过调用 dwgInFields(AcDbDwgFiler*)函数存入AutoCAD的图形数据库,并通过调用 dwgOutFields(AcDbDwgFiler*)函数从图形数据库中取出。基特征定义了各种形状特征的公共属性(如特征类名、特征 ID等)及其非几何信息(尺寸公差、表面粗糙度、热处理等),而特征的几何信息则在具体特征的数据结构中进行定义,例如圆孔特征、柱形沉头孔特征的数据结构定义如下:
class CHole:public CFeature //圆孔特征
{ public:
CHole(); //类的构造函数
……//设置和获得对象属性的方法
protected: //圆孔几何信息
double m_HoleDiameter; //孔直径
double m_HoleDepth; //孔深度
double m_TipAngle; //孔底角
AcBrFace* m_Placement; //孔放置面
};
class CCounBore:public CHole{//柱形沉头孔特征
{ public:
CCounBore(); //类的构造函数
……//设置和获得对象属性的方法
BOOL Validity(); //参数有效性检验
BOOL Create(); //创建实体
BOOL UpDateExteDB(); //更新外部数据库
protected: //柱形沉头孔几何信息
double m_BoreDiameter; //沉头直径
double m_BoreDepth; //沉头深度
};
由圆孔特征和柱形沉头孔特征的数据结构可知,圆孔特征是由基特征派生而来的,柱形沉头孔特征是由圆孔特征派生而来的,故柱形沉头孔特征可以继承圆孔特征和基特征的属性和方法,提高了代码的利用率,加快了程序的开发进程。形状特征库中的其它形状特征亦是如此。
3 特征的生成过程
特征的生成过程如图3所示,其主要步骤主要包括[6]:
图3 特征生成过程
(1)选取特征放置面
圆孔特征、凸台特征等一般都是附着于某个表面的,因此创建此类特征时必须要选取特征的附着表面,而对于圆柱特征、拉伸特征等可以创建零件模型的基体,故可以不选取放置表面。
(2)特征参数输入
特征参数的输入包括特征的几何属性(尺寸、位置等)和非几何属性(尺寸公差、表面粗糙度等)。为了方便用户输入特征参数,利用ObjectARX 中的MFC类库提供的对话框设计功能,设计出的用户操作界面均为流行的Windows风格对话框,与AutoCAD系统界面保持了良好的一致性[3]。几何属性在创建特征时由用户直接输入,非几何属性可以在创建特征时输入,也可以在建立零件实体模型后,通过特征树输入,如图9和图10所示。
(3)几何参数有效性检验
在创建特征实体之前,检验特征的几何参数是否有效是必须要进行的工作,因为无效的几何参数将会无法创建实体。特征几何参数的有效性检验定义成了特征类的一个函数Validity(),在创建特征实体之前首先要调用该函数进行几何参数的有效性检验,若几何参数有效则创建实体,否则要求用户重新输入几何参数。
以柱形沉头孔(图9所示)为例,几何参数有效的条件为:
· 孔直径D>0;
· 孔直径D<沉头直径D1;
· 孔深度H>沉头深度H1;
· 沉头深度H1>0;
· 孔底角α ≤180°。
(4)特征定位
特征定位点的确定主要采用了三种方法:
· 直接输入定位点 该方法比较简单,用户直接输入定位点的X、Y、Z坐标即可。
· 圆心定位 指用户在特征的放置面上选取圆或圆弧,然后计算出圆或圆弧的圆心,将圆心坐标作为特征的定位点坐标。当特征的放置面是圆形平面或放置面的边界包含有圆弧时,在很多情况下圆或圆弧的圆心就是特征的定位点,如图4所示表示在圆柱体的上端面上钻一个直孔,上端面的圆心即为直孔的定位点,采用圆心定位可以简单、方便的获得特征的定位点。
图4 圆心定位
圆心定位方法确定定位点的步骤如下:
第一步 利用构造选择集函数,在特征的放置面上选取圆或者圆弧;
第二步 利用AcBr类库和AcGe类库提供的遍历实体的方法,获得所选取的圆或圆弧的圆心坐标;
第三步 将圆心坐标值赋予特征的定位点。
· 两参考边定位 指用户在特征的放置面上选取两条直线或基准线,分别输入定位点距这两条直线的距离,然后计算出定位点坐标值,如图5所示。
两参考边定位方法确定定位点的步骤如下:
第一步 利用构造选择集函数,在特征放置面内选取两条参考边,然后分别输入特征定位点与两条参考边的距离;
第二步 利用AcBr类库和AcGe类库提供的遍历实体的方法,获得第一条参考边的方向V1和边上的点Pe1,然后由V1和Pe1创建直线对象L1;
第三步 创建另一直线对象L2,使L2过方位点(选择放置面时,在放置面上选取的一点),L2的矢量方向为L1的正交矢量;
第四步 对L1和L2求交,得到交点P0,由P0和方位点确定方向矢量Vect;
第五步 由P0,d1和矢量Vect,求出距第一条参考边距离为 d1的点 P1,即P1=P0+d1*Vect,再由V1和P1创建平行与第一条参考边的直线Line1;
第六步 同理,根据方位点和第二条参考边及d2确定平行与第二条参考边的直线Line2;
第七步 求出Line1和Line2的交点,并将交点坐标值赋予特征的定位点。
图5 两参考边定位
(5)特征实体生成
特征实体的生成首先是采用AutoCAD系统的三维造型方法创建实体,之后利用坐标变换方法将实体变换到定位点,并进行相关布尔运算。
1)创建特征实体
AutoCAD系统创建实体的方法有:创建基本实体、创建拉伸实体、创建旋转实体以及创建扫描实体。在ObjectARX二次开发工具中也提供相应的函数用来生成相应实体。下面分别介绍应用ObjectARX中的函数来创建特征实体的过程。
· 创建基本实体 包括长方体、圆柱体、圆锥/圆台体、球体、楔体和圆环体六种基本体素,用于创建零件模型中的基本实体。基本实体的创建比较简单,直接调用创建基本实体的函数,输入相应的参数即可,其生成过程如下:首先调用要创建的基本实体的对话框,输入相应的几何参数,然后调用 ObjectARX中提供的 createBox()(长方体)、createFrustum()(圆柱体、圆锥/圆台体)、createSphere()(球体)、createWedge()(楔体)和 createTorus()(圆环体)等函数,即可生成质心在WCS坐标原点的基本体素,如图6(a)所示。
· 创建拉伸实体 是将二维面域按指定高度和拨模角度进行拉伸而生成的,用于创建零件模型的拉伸特征,如槽、凹陷和凸台等特征。其生成过程是:首先,根据参数绘制或直接拾取二维封闭环,组成环的曲线必须是由 AcDbCurve类派生而来的曲线类型,如AcDbLine、AcDbArc、AcDbPolyline等;然后,调用生成面域函数createFromCurves()得到面域;最后,调用拉伸函数extrude()生成拉伸实体,如图6(b)所示。
· 创建旋转实体 是将二维面域绕指定轴旋转而生成的,用于创建零件模型的旋转特征,如孔、圆形凹陷和圆形凸台等特征实体。其生成过程是:首先,根据参数绘制或直接拾取二维封闭环,组成环的曲线也必须是由AcDbCurve类派生而来的曲线类型;然后,调用生成面域函数createFromCurves()得到面域;最后,调用旋转函数revolve()生成旋转实体,如图6(c)所示。
· 创建扫描实体 是将二维封闭环沿指定路径扫描而生成的,用于创建零件模型的扫描转特征。其生成过程是:第一步,根据参数绘制或直接拾取二维封闭环,组成环的曲线也必须是由AcDbCurve类派生而来的曲线类型;第二步,调用生成面域函数createFromCurves()得到面域;第三步,选择扫描导线,导线也必须是由AcDbCurve类派生而来的曲线类型;第四步,调用扫描函数extrudeAlongPath()生成扫描实体,如图6(d)所示。
图6 创建特征实体的方法
2)特征实体的坐标变换
零件是各个特征实体之间通过布尔运算生成的。在生成基本特征实体(长方体、圆柱体等)以及拉伸、旋转和扫描特征实体时,可以控制其不与其它实体进行布尔运算(若需要与其它实体进行布尔运算,则可以在创建特征实体后使用AutoCAD系统的 UNION、SUBTRACT、INTERSECT命令);在生成孔、槽和凹陷等特征实体时,需要控制其与零件基体进行布尔减运算;在生成凸台等特征实体时,需要控制其与零件基体进行布尔加运算;这样就可以在零件基体上创建出所需要的特征,最终生成零件模型。但是,在利用ObjectARX提供的函数创建的特征实体之后,多数情况下还需要根据输入的特征定位点进行适当的坐标变换,将其转换到合适的位置才能与主实体进行布尔运算。例如,长方体、圆柱体等基本实体利用函数创建后都是质心在WCS坐标系原点的实体,圆孔特征、槽特征等实体利用函数创建后也都是定位点在WCS坐标原点的实体,所以,创建特征实体之后首先要进行适当的坐标转换,然后再与主实体进行布尔运算,从而生成所需要的特征,如图7所示。
进行坐标变换的步骤如下:
第一步 根据特征实体的定位点和参考边确定的新坐标系的原点和X、Y、Z轴的方向;
第二步 根据新坐标系的原点和坐标轴的方向,调用函数 setCoordSystem()设置三维几何变换矩阵;
第三步 调用实体的坐标变换函数transformBy(),将特征实体变换到合适的位置。
图7 特征实体的坐标变换
(6)特征存储
特征对象生成之后几何信息与非几何信息已存入相应变量之中,还需将其存入 AutoCAD图形数据库(dwg文件),以便永久存储。
根据AutoCAD图形数据库的存储机制,特征对象存入图形数据库的关键代码如下(代码中变量m_Feature为特征对象的指针):
acdbHostApplicationServices()->workingDatabase()->getNamedObjectsDictionary(pNamedobj,AcDb::kForWrite); //以写方式打开命名对象词典//查找形状特征库词典(关键字为PSFDB)if(pNamedobj->getAt("PSFDB",(AcDbObject*&)pDict,AcDb::kForWrite)==Acad::eKeyNotFound)
{ //若不存在,创建形状特征词典
pDict =new AcDbDictionary;
AcDbObjectId DictId;
pNamedobj->setAt("PSFDB", pDict, DictId);}pNamedobj->close();
if(pDict) //若存在以写方式打开
{ CFeature* p=new CFeature;
if(pDict->getAt(m_FeatID,(AcDbObject*&)p,AcDb::kForWrite)==Acad::eOk)//查找该特征 ID是否已经存在
{//若已存在,提示用户重新输入特征ID
MessageBox("该特征标识已存在,请重新输入特征ID!");
p->close();
pDict->close();
m_Feature->close();
return; }
p->close();
//若不存在,创建特征实体,然后将特征对象存入数据库
if(!m_Feature->Create()) //创建特征实体
{ pDict->close(); //关闭特征词典
m_Feature->close(); //关闭特征对象
return; }
AcDbObjectId Id;
if(pDict->setAt(m_FeatID,
m_Feature,Id)!=Acad::eOk)
MessageBox("写入图形数据库失败!");
pDict->close();//关闭特征词典
}
m_Feature->close();//关闭特征对象
特征对象存储之后,如果需要提取某特征对象的信息,可以以“读”方式打开“形状特征库词典”,利用该特征对象的“特征ID”即可提取出相关信息。
4 应用实例
以齿轮泵泵体零件为例,建立零件特征信息模型。首先分析泵体零件包含的特征类型,如图8所示,然后根据这些特征类型建立零件特征信息模型。
图8 泵体
(1)利用扫描特征创建泵体的基体部分。首先利用AutoCAD二维绘图功能绘制泵体截面轮廓线及导线,然后采用扫描特征,创建基体。
(2)利用拉伸特征创建泵体的侧面凸台。首先在基体侧面建立基准面,并在其上绘制侧面凸台轮廓线,然后采用拉伸特征,创建凸台。
(3)利用柱形沉头孔特征和凹陷特征创建泵体的内腔,如图9所示。
图9 创建沉头孔特征
(4)利用圆孔特征创建进油孔、出油孔和定位孔等。
(5)利用特征树输入泵体各种特征的非几何属性,得到齿轮泵泵体的特征信息模型,如图10所示。
图10 输入特征非几何属性
5 结 论
本文首先简要地介绍了特征的概念、分类以及特征建模方法,然后根据特征建模的基本理论,详细阐述了借助功能强大的ObjectARX开发工具和面向对象的设计方法,在AutoCAD系统平台上实现基于特征建模的方法与步骤。利用该方法可以快速、简单、高效的创建特征,而且可以方便地输入特征的几何信息与非几何信息,可以为后续制造过程提供了丰富的信息,便于CAD与后续的CAPP和CAM集成,实践证明利用现有CAD系统的实体造型功能,实现基于特征的建模是中小企业实施 CAD/CAM 集成的一种简单而有效的方法。
[1]白贺斌, 等. 基于特征的CAD参数化建模技术及其应用[J]. 机械设计, 2005, (2): 14-15.
[2]王贤坤. 机械CAD/CAM技术应用与开发[M]. 北京:机械工业出版社, 2002. 36-45.
[3]宋玉银, 等. 基于特征设计的 CAD系统[J]. 计算机辅助设计与图形学学报, 1998, (10): 145-151.
[4]李世国. AutoCAD高级开发技术ARX编程及应用[M].北京: 机械工业出版社, 1999. 113-155.
[5]虞 春, 等. 特征的面向对象技术表示方法[J]. 机械科学与技术, 1999, (3): 513-516.
[6]苏 猛, 等. 基于AutoCAD开发零件特征建模系统研究[J]. 辽宁工程技术大学学报, 2006, (1):123-126.