浅析基于ObjectARX的阀体三维参数化绘图

发布时间:2011-06-27  点击数:2994

    三维图形能够真实反映物体的实际情况,不仅可以方便地自动生成可靠的标准或辅助二维视图,创建二维剖面图,而且可进行工程分析、提取工艺数据,易于与铸造工艺CAD系统和三维快速原型技术相结合,提高设计生产效率。本研究在Window 2000环境下,以ObjectARX 2000为二次开发工具,以VC++ 6.0为编程语言,在AutoCAD 2000中实现了阀体的三维参数化绘图。

一、ObjectARX编程环境

    ObjectARX 2000是基于AutoCAD 2000的一种新的编程环境,它提供了以C++为基础的面向对象的开发环境及应用程序接口,能真正快速地访问AutoCAD 图形数据库。ObjectARX程序实际为动态连接库,与AutoCAD共享同一地址空间,能直接利用AutoCAD核心数据库和函数。与其它二次开发工具相比,ObjectARX具有模块性强、独立性强、开发能力强、速度快、面向对象的编程技术等优点,是AutoCAD新一代强有力的开发工具。此外,ObjectARX编程环境可利用MFC类库来编制丰富的Windows风格界面,采用了面向对象的编程技术,开发人员可在其提供的基类上派生出自定义的类,给开发工作带来极大的方便。

二、参数化绘图

    参数化绘图是一种利用零件或产品组成形状上的相似性,以基本参数作为变量编写相应的程序来定义图形的方法。可形成系列,其各尺寸关系可用一组参数来确定,参数的求解较简单,参数与设计对象的控制尺寸有明显的对应关系,设计结果的修改受参数驱动,这些参数称为零件的基本参数。参数化绘图是一种参数驱动机制,通过参数驱动机制,可以对图形的几何数据进行参数化修改,而且在修改的同时,还要满足图形的约束条件。设计者可以建立这些基本参数的外部数据库,利用ObjectARX程序调用相应的参数数据库中的数据,系统会自动完成相应实体形状的改变。参数化设计能真正将初次设计从生产过程中分离出来,通过标准化减少零件的数量,以最快的速度适应市场变化,满足用户的需求。

    参数化绘图的基本特征是通过访问外部参数数据库进行操作,因此它具有较好的交互性,用户可以利用绘图系统全部的交互功能修改图形及其属性,进而控制参数化的过程。参数化绘图具有简单、方便、易开发和使用的特点,能够在现有的绘图系统基础上进行二次开发。

    1、程序驱动法。程序驱动法主要适用于结构比较稳定,仅尺寸数值发生变化或仅有局部结构变化的场合,比如标准件和常用件的开发。程序驱动法是将零件的基本参数和所有结构关系式融人应用程序,然后在程序的控制下,顺序执行这些设计表达式来绘制图形。其主要特点是:如果要修改图形,只要给应用程序输入不同的参数值,便可生成不同的图形。它是参数化绘图最常用也是最基本的方法。本课题也是主要采用这种方法来完成大部分图形的绘制工作,并且为了使用方便,所有的尺寸参数都是通过读取外部参数数据库获得,而不是人工录入。这样既增加了程序的灵活性,又减少人工录入的麻烦和可能出现的不必要的参数录入错误,便于图形库的扩充和修改,提高工作效率。

    2、鼠标驱动法。鼠标驱动法即通过鼠标移动光标来调整所需的参数。其原理是通过读取鼠标的位置座标来实现鼠标拖动实体数据库与屏幕图形的一致变化。其鼠标拖动的关键是如何取得实体的数据,并将修改后的数据写回实体数据库中,即实现图形数据的存储与交换。

    3、尺寸驱动法。尺寸驱动(Dimension-Driven)法主要是利用鼠标在图形上点取需要修改的尺寸参数实体,由命令行输入新值,之后重新生成图形。

三、三维阀体绘制的应用实例

    阀体是调节阀的主要零件,阀门的设计主要就是阀体部分的设计。根据阀体的产品特点,采用CAD二次开发工具ObjeetARX 2000,以VC++ 6.0为编程语言,利用MFC类库的Windows风格界面,开发出功能强大、界面友好的阀体的三维绘图系统。首先,在AutoCAD 2000环境下加载本系统所需的定制用户菜单,方便用户操作。然后在加载应用程序下的启动组里加载本系统所开发的ARX程序,这样每当AutoCAD 2000启动时就自动加载本系统,无需人工手动加载。定制的用户菜单如图1所示。

    开发的阀体主要针对福州阀门厂生产量比较大的几类阀门的阀体,其类型主要有角式截止阀蝶阀闸阀等,现以角式截止阀的阀体为例做简要说明。绘制角式截止阀的阀体的参数化设置对话框如图2所示,角式截止阀的阀体的绘制结果如图3所示。

    在系统开发过程中,利用ObjectARX环境下的ADO数据库接口技术,访问外部阀体参数数据库,真正实现参数化。设计好的阀体参数和ObjeetARX强大的三维绘制功能结合,使得系统能真正快速、高效地绘制三维阀体实体造型图。给出绘制阀体的三维旋转实体的一般例程[4]

    //函数名:create3dRevolveSolid
    //参数:pt[]-初始点坐标,N-坐标点数
    //返回值:AcDb3dSolid-返回3d实体指针
    AcDb3dSolid create3dRevolveSolid(ads_point pt[],int N )
    {
    AcGeVeetor3d normal(O.0,0.0,1.0);
    AcGePoint3d axisPoint(0.0,0.0,0.0);
    AcGeVect0r3d axisDir(0.0,1.0,0.O);
    double Revolution = 2.0 * PI;
    AcGePoint3d origin(O.0,0.0,0.0);
    AcGeVect0r3d x(1,0,0),y(O,1,0),z(O,0,1);
    AcGeMatrix3d mat;
    AcGePoint2dArray pt2d;
    pt2d.setLogiealLenth(N);
    for(int i= 0;i< N;i++)
    {
    pt2d[i].set(pt[I][x],pt[I][Y]);
    }
    AcDbPolyline * poly = new AcDbPolyline;
    //设置多义线各顶点坐标
    //
    for(i=0;i< N;i++)
    {
    poly->addVertexAt(i,pt2d[i]);
    }
    poly->setClosed(Adesk::kTrue);
    poly一>setNormal(norma1);
    AcDbVoidPtrArray lines,regions;
    //获取指向封闭边界的无值型指针数组
    ||
    lines.append((void *)poly);
    //根据封闭边界中生成的面域对象
    //
    AcDbRegion::createFromCurves(lines,regions);
    //获得指向面域的指针
    //
    AcDbRegion * pRegion= AcDbRegion::cast((AcRxObject*)regions[0]);
    AcDb3dSolid * p3dObj= new AcDb3dSolid;
    if(Acad::eOk= p3dObj->revolve(pRegion,axisPoint,axisDir,Revolution))
    {
    mat.setGoordSystem(origin,x,Y,z);
    p3dObj->transformBy(mat);
    }
    delete pRegion;
    return p3dObj;

    这是生成一些比较简单的三维旋转实体的一般例程,还有三维实体也可以通过拉伸生成,在ObjectARX中的AcDb3dSolid类的成员函数extrude()提供了拉伸功能,其函数原型为:

    virtual Acad::ErrorStatus extrude(
    const AcDbRegion * region,
    double height,
    double taper);

    其中:指针型参数region是所要拉伸的面域,双精度型参数height是指region面域所要拉伸的高度;双精度型参数taper是指拉伸体的锥度,缺省值为0。函数调用成功则返回Acad::eOK。

    对于复杂的三维实体必须利用三维实体的并(Union)、交(Intersection)、差(Subtract)集合运算。ObjectARX 中的AcDb3dSolid类的成员函数booleanOper()提供了这三种运算的功能,其函数原型为:

    virtual Acad::ErrorStatus booleanOper(
    AcDb:: BoolOperType operation,
    AcDb3dSolid * solid):

    其中:布尔运算型参数operation的可能取值为:AcDb::kBoolUnite(并)、AcDb::kBoolIntersect(交)、AcDb::kBoolSubtract(差)。实体指针型参数solid表示另一个参加布尔运算的实体的指针.函数调用成功则返回Acad::eOK。