摘要:对在AutoCAD2000中实现焊接符号快速标注的原理和方法进行了研究,提出了以人机交互方式实现焊接符号标注的系统运行模式,设计了具有良好人机学特性的系统界面,极大地提高了焊接符号标注的效率。以VisualC 6.0和ObjectARX3.0为开发工具,运用自定义实体类技术,通过对一系列ObjectARX类函数的重载,开发了基于AutoCAD2000的焊接符号快速标注系统。详细讨论了从AcDbEntity类派生自定义焊接符号类所涉及的相关应用技术。
关键词:焊接符号;ObjectARX;AcDbEntity类;AcEdJig类;AcDbObject类
AutoCAD是目前微机系统中广泛使用的CAD绘图软件,利用它可以大大提高绘图的效率和自动化程度。但AutoCAD本身是一个通用的CAD支撑软件,随着CAD应用的不断深入,应用范围的不断拓宽,越来越多的用户需要借助二次开发来使该系统更好地适应本地使用需求。很多行业有自己的专用符号体系,各自的标注规则,这时AutoCAD自带的标注系统很难满足用户的需求。好在AutoCAD提供了很强的二次开发手段,借助这些开发手段,可以把这种使用率很高的绘图过程用简单的命令加以实现。
ObjectARX(AutoCADRuntimeeXtension)工具是Autodesk公司推出的一种新的AutoCAD二次开发工具,采用并支持面向对象技术,是新一代AutoCAD二次开发的首选工具[1]。利用它的类库,可解决许多AutoLisp、ADS、VBA难以解决或不能解决的问题[2],提高开发效率。ARX应用程序利用AutoCAD核心数据库结构、图形系统、几何造型核心及代码,建立和AutoCAD本身固有命令有同样操作方式的新命令。利用ObjectARX开发工具进行CAD应用系统开发已有一些成功的案例,如用ObjectARX开发滑动轴承结构CAD设计系统。[3]
本文对在AutoCAD中实现机械设计中常用的焊接符号的标注进行了深入研究。本系统以Auto CAD2000为平台,以VisualC 6.0和ObjectARX3.0为二次开发工具[4],成功地实现了常用焊接符号的标注。本系统以选择坡口的形式来决定焊接符号,符合设计人员的设计习惯,把用户从繁杂的焊接符号选择和组合中解放出来。本标注系统生成的焊接符号是从AcDbEntity类派生的自定义类的对象,因此它具有AutoCAD实体的各种属性和操作方式。焊接符号生成后用户可以很方便地修改它的层、字体,对它进行平移、缩放、拉伸等操作,极大地满足了后期对设计图进行编辑和修改的需要。
1 系统开发、运行环境
本系统是在VisualC 6.0和ObjectARX3.0编程环境下开发的,可在AutoCAD2000下动态加载运行,操作系统为Windows98或Windows2000。
2 系统结构及实现
本系统主要由三大部分组成,包括实现焊接符号的选择及焊接参数输入的对话框类、实现焊接标注的自定义实体类、实现以拖动方式创建焊接标注的自定义类。
2.1 实现焊接符号的选择及焊接参数输入的对话框类
这是系统的用户界面。通过此用户界面,用户可进行焊接符号的选择和焊接参数的输入,如图1所示。用户通过选择焊接类型、焊缝类型、焊接的坡口形式,并输入所选坡口参数进行焊接符号的标注,操作过程直观、简便[5,6]。
图1 用户界面 2.2 实现焊接标注的自定义实体类
实现焊接标注的自定义实体类是由AcDbEntity类派生而来的,因此在程序中必须重载AcDbEntity类及其父类AcDbObject的虚函数。实现焊接标注的自定义实体类是本系统开发的关键部分。
2.2.1 重载函数worldDraw()
AutoCAD调用函数worldDraw()在屏幕上显示实体,因此从基类AcDbEntity中派生自定义类时必须重载函数worldDraw()。其函数原型为:
virtualAdesk::BooleanworldDraw(AcGiWorldDraw mode)。
函数worldDraw()用于绘制图形中与指定的模型空间或图纸空间视口内容无关的部分。World Draw()接受一个指向类AcGiWorldDraw对象的参数。对于AcGi类库中的几何对象和特征对象,类AcGi WorldDraw是一个容器类。它包括两个对象:AcGi WorldGeometry对象和AcGiSubEntityTraits对象。在函数worldDraw()中,可以通过调用函数AcGiWorld Draw::geometry()来访问AcGiWorldGeometry对象,通过调用函数AcGiWorldDraw::subEntityTraits()来访问AcGiSubEntityTraits对象。
2.2.2 重载函数getGripPoints()和moveGripPointsAt()
为了实现自定义实体的夹点功能,本系统重载了这两个函数。当用户使用定点设备选择实体时,AutoCAD调用函数getGripPoints()返回实体类定义的夹点,并显示该实体的夹点。此时AutoCAD就可以通过调用函数moveGripPointsAt()实现夹点编辑的移动操作。这两个函数的原型为:
virtualAcad::ErrorStatusgetGripPoints(AcGe Point3dArraygripPoints,AcDbIntArray&osnapModes,AcDbIntArray&geomIds)const;
virtualAcad::ErrorStatusmoveGripPointsAt(constAcDbIntArrayindices,constAcGeVector3doffset)。
2.2.3 重载函数getStretchPoints()和moveStretch PointsAt()
实体的拉伸点集合通常是该实体的夹点集合的一个子集,当用户执行命令STRETCH时,AutoCAD调用函数getStretchPoints()返回被选择实体中定义的所有拉伸点。对于大多数实体来说,夹点编辑模式和拉伸点编辑模式是一致的。在本系统中函数getStretchPoints()和moveStretchPointsAt()只是调用了重载过后的getGripPoints()和moveGripPointsAt()函数。getStretchPoints()和moveStretchPointsAt()函数的原型为:
virtualAcad::ErrorStatusgetStretchPoints(AcGe Point3dArray)const;
virtualAcad::ErrorStatusmoveStretchPointsAt(constAcDbIntArrayindices,constAcGeVector3d&offset)。
2.2.4 重载函数transformBy()和getTransformedCopy()
类AcDbEntity提供了两个转换函数:一个是函数transformBy(),它对实体进行指定的矩阵变换操作;另一个是函数getTransformedCopy(),它首先复制自身,然后再对复制实体进行指定的矩阵变换,并返回变换后的复制实体。当用户使用编辑中的移动、旋转、比例缩放和镜像模式时,AutoCAD就调用这两个函数之一来实现相应的操作。这两个函数的原型为:
virtualAcad::ErrorStatustransformBy(constAcGe Matrix3dxform);
virtualAcad::ErrorStatusgetTransformedCopy(constAcGeMatrix3dxform,AcDbEntity &ent)const。
2.2.5 重载函数explode()
本系统中为了使AutoCAD的EXPLODE和BHATCH命令能正常运行,在应用程序的自定义类中重载了函数explode(),重载后的explode()函数将自定义实体分解为简单的本地实体。如果分解后的实体不是本地实体,BHATCH命令会再次调用函数explode()进行分解,直至它们被分解为本地实体为止。BHATCH命令能直接操作的本地实体有:AcDb2dPolyline、AcDb3dPolyline、AcDbPolyline、AcDb Text、AcDbMText、AcDbShape、AcDbTrace、AcDbSolid、AcDbFace、AcDbViewport、AcDbFcf、AcDbDimension、AcDbRegion、AcDbBlockReference、AcDbHatch等。此函数的原型为:virtualAcad::ErrorStatusexplode(AcDbVoidPtrArrayentitySet)const。
2.2.6 重载文件操作函数
当从类AcDbEntity派生自定义类时,需要重载AcDbEntity类的父类AcDbObject的4个用于从DWG和DXF文件中读写数据的函数。函数原型为:
virtualAcad::ErrorStatusdwgInFields(AcDbDwg Filer filer);
virtualAcad::ErrorStatusdwgOutFields(AcDbDwg Filer filer)const;
virtualAcad::ErrorStatusdxfInfields(AcDbDxfFiler filer);
virtualAcad::ErrorStatusdxfOutFields(AcDbDxf Filer filer)const。
以上每个函数的主要参数都是一个文件操作类(AcDbDwgFiler或AcDbDxfFiler)的指针,使用这个参数,可以完成对DWG或DXF文件数据的读写操作。自定义类中重载了这4个函数后,就可以持久的保存对象,实现复制和撤销操作。
派生AcDbEntity自定义类时需要注意2个问题:
1)定义了自定义类的应用程序在运行初始化时必须调用函数rxInit(),它由任意一个ACRXxxxDEFINEMEMBERS()宏自动定义,并完成下面的任务:注册自定义类;创建类的描述符对象;将类描述符对象添加到类词典中。然后调用函数acrxBuild ClassHierarchy()把该类添加到ACRX运行类层次中,最后在应用程序的卸载函数中通过调用函数deleteAcRxClass()将该类从ACRX运行类层次中删除。
2)当自定义类中定义一个新的成员函数或重载基类的虚函数时,首先应该调用函数assertReadEn abled()或assertWriteEnabled()或assertNotifyEnabled来校验对象是否处于正确的打开状态。
2.3 实现以拖动方式创建焊接标注的自定义类
为了在创建焊接标注的过程中实现拖动的效果,本系统从基类AcEdJig派生了一个自定义类用来实现此功能。类AcEdJig用于完成拖动效果,通常用于查询、创建、编辑和添加一个新的实体到数据库中。从基类AcEdJig派生新类必须重载成员函数:AcEdJig::sampler()、AcEdJig::update()和AcEd Jig::entity()。这3个函数分别用于获得一个几何值,如角度、距离、输入点等;分析并保存获得的几何值或者更新实体;返回重构后的实体指针[7]。
本系统在自定义类中定义了一个重要的成员函数doIt(),它用来实现拖动循环过程。函数doIt()首先调用函数setDispPrompt()来显示提示字符串,然后调用drag()函数来控制拖动循环。在拖动循环过程中,函数drag()依次调用sampler()、update()和en tity()函数,直至循环结束。
拖动循环过程如图2所示。图中的代表用户从AcEdJig基类派生的自定义类。
图2 程序流程图 由本系统生成的焊接标注实例如图3所示。
图3 标注实例 3 结束语
对基于AutoCAD平台的应用程序开发进行了有益的尝试,采用ObjectARX与VisualC 结合编程的方法可方便地在AutoCAD2000中实现焊接符号的自动标注。利用ObjectARX提供的类和函数可深入到AutoCAD系统内核;利用VisualC 进行Win dows风格的编程,可以大大提高开发效率,能更迅速、更准确地实现二次开发目的。利用本文提出的开发原理和实现方法开发的焊接符号标注系统在运行效率、对象管理、用户界面和智能化程度等方面都有了突破性的进步,为基于AutoCAD平台的应用程序开发提供了一种可行方案。