ObjectArx-自定义对象-派生自ObjectARX类

1. 自定义对象-派生自ObjectARX类

使用ObjectARX宏管理继承于ObjectARX的自定义类。宏允许自定义类参与AcRxObject运行时类型标识机制。

1.1 派生的自定义类

为了便于开发,应该在单独的ObjectDBX中声明和实现自定义类。对象启用器应该包含应用程序的数据库部分,包括本节中描述的AcRxObject宏、其他ObjectARX类覆盖的函数以及特定于自定义类的函数。因为它是一个ObjectDBX模块,所以对象支持器可能不使用AutoCAD或任何其他特定于AutoCAD主机应用程序的API。
ObjectARX提供了一组宏,在rxboiler.h文件中声明,它帮助您创建从AcRxObject派生的新类。如果您不使用ObjectARX宏来定义新类,该类将继承其最直接注册对象的父类的运行时标识。
AcDbDimension
AcDbSymbolTable, AcDbSymbolTableRecord, and all classes derived from them
AcDbBlockBegin
AcDbBlockEnd
AcDbSequenceEnd
AcDb2dPolyline
AcDb2dVertex
AcDb3dPolyline
AcDb3dPolylineVertex
AcDbPolygonMesh
AcDbPolygonMeshVertex
AcDbPolyFaceMesh
AcDbPolyFaceMeshVertex
AcDbFaceRecord
AcDbViewport
AcDbMInsertBlock
AcDbVertex

1.2 运行时类型识别

在ObjectARX的层次,从AcRxObject继承的每个类都有相应的类描述符对象,它是AcRxClass的一个实例,它保存用于运行时类型标识的信息。类描述符对象 gpDesc,类的静态成员,例如 AcDbEllipse::gpDesc。类描述符对象是在初始化时创建的。当类在ObjectARX中注册并添加到系统级字典时,acrxClassDictionary。这里描述的宏有助于声明和实现与运行时标识和初始化功能相关的某些功能。desc(),cast(),isKindOf()和isA()

  • desc() , 静态成员函数,返回特定(已知)类的类描述符对象。
  • cast(), 静态成员函数,返回指定类型的对象。如果对象不是需要的类(或派生类),则为空。
  • isKindOf(), 返回对象是否属于指定的类(或派生类)。
  • isA(), 返回类未知的对象的类描述符对象。
    当你想要知道该Object属于什么类,使用AcRxObject::isA(), 返回一个类描述符对象(一个AcRxClass的实例)
AcRxClass* isA() const;

当您已经知道对象是什么类时,可以使用desc()函数来获得类描述符对象:

static AcRxClass* desc();

例子1

// 当前实体
AcDbEntity* curEntity = somehowGetAndOpenAnEntity();
// 判读当前实体是不是一个AcDbEllipse的实例或是继承于AcDbEllipse的子类
if (curEntity->isKindOf(AcDbEllipse::desc())) {
   // Got some kind of AcDbEllipse instance.
}

例子2

// 另一种方式来查找给出的实体是否是一个AcDbEllipse的实例或是AcDbEllipse的子类
AcDbEllipse* ellipseEntity = AcDbEllipse::cast(curEntity);

if (ellipseEntity != NULL) {
   // Got some kind of AcDbEllipse instance.
}

例子3

// 判断当前实体是不是AcDbEllipse的实例而非AcDbEllipse的子类的实例。
if (curEntity->isA() == AcDbEllipse::desc()) {
   // Got an AcDbEllipse, no more, no less.
1.3 类声明宏

使用ACRX_DECLARE_MEMBERS(CLASS_NAME)声明 desc(),cast()和isA()函数

class myClass : public AcRxObject
{
public:
ACRX_DECLARE_MEMBERS(myClass);
...
};
// 声明宏
ACRX_DECLARE_MEMBERS(AsdkPoly);
// 展开如下
virtual AcRxClass* isA() const;
static AcRxClass* gpDesc;
static AcRxClass* desc();
static AsdkPoly* cast(const AcRxObject* inPtr)
{
    return ((inPtr == 0)
        || !inPtr->isKindOf(AsdkPoly::desc()))
        ? 0 : (AsdkPoly*)inPtr;
};
static void rxInit();

静态rxInit()函数 和静态指针gpDesc与函数isA(),desc()和cast一起定义。

1.4类的实现宏

实现自定义类,有以下3中宏:
- ACRX_NO_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS)
用于抽象类和不应实例化的任何其他类
- ACRX_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS, VERNO)
用于可以实例化但不写入文件的临时类。
- ACRX_DXF_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS, DWG_VERSION,
MAINTENANCE_VERSION, PROXY_FLAGS, DXF_NAME, APP)
用于可以写入或读取DWG和DXF文件的类。这些宏中的每一个定义如下:
类描述符 AcRxClass
rxInit()
desc()
isA()
以上函数都会被重写
例子:

ACRX_DXF_DEFINE_MEMBERS(AsdkPoly, AcDbCurve, AcDb::kDHL_CURRENT,\
    AcDb::kMReleaseCurrent, 0, POLYGON, /*MSG0*/"AutoCAD");
AcRxClass* AsdkPoly::desc()
{
    if (AsdkPoly::gpDesc != 0)
        return AsdkPoly::gpDesc;
    return AsdkPoly::gpDesc =
        (AcRxClass*)((AcRxDictionary*)acrxSysRegistry()->
        at("ClassDictionary"))->at("AsdkPoly");
}
AcRxClass* AsdkPoly::isA() const
{
    return AsdkPoly::desc();
}
AcRxClass* AsdkPoly::gpDesc = 0;
static AcRxObject * makeAsdkPoly()
{
    return new AsdkPoly();
}
void AsdkPoly::rxInit()
{
    if (AsdkPoly::gpDesc != 0)
        return;
    AsdkPoly::gpDesc = newAcRxClass("AsdkPoly",
        "AsdkCurve", AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
         0, &makeAsdkPoly, "POLYGON", "\"AutoCAD\"");
};

如果你想重写自己的rxInit()函数,使用ACRX_DEFINE_MEMBERS()宏,这个宏定义了desc(),cast()和isA(),但是没有定义rxInit函数

1.5 类初始化函数

每个类的类初始化函数是rxinit(),定义自定义类的应用程序必须在运行时初始化期间调用此函数。
这个功能是自动定义的三个ACRX_xxx_DEFINE_MEMBERS()宏和执行以下任务:
- 注册自定义类
- 生成自定义类的描述对象
- 将类的描述对象放到类字典中
如果您想要定义自己的rxinit()函数,使用ACRX_DEFINE_MEMBERS()宏

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
objectarxwizards-2023.zip是一个压缩文件,它可能包含了针对ObjectARX软件开发工具集的一些示例代码和实用程序。ObjectARX是Autodesk公司提供的用于开发AutoCAD软件的应用程序编程接口(API),它允许开发人员创建自定义功能和扩展,以满足用户特定的需求和要求。这个压缩文件可能是为了方便开发人员参考和学习使用ObjectARX编程而创建的。 通过解压和查看这个文件,我们可以学习示例代码和实用程序的结构和用法。这可能有助于我们更好地理解ObjectARX的编程概念和技术,进而应用到我们自己的项目中。压缩文件中可能包含了一些源代码文件、库文件、帮助文档和示例项目,它们可以帮助我们进一步学习和开发自定义的AutoCAD功能。 ObjectARX是一个功能强大的开发工具,它提供了许多API函数和,可以访问和操作AutoCAD软件内部的对象和数据。通过使用ObjectARX,我们可以创建插件、自定义命令、修改绘图元素、修改用户界面以及与其他应用程序集成等等。因此,这个压缩文件对于那些对AutoCAD开发感兴趣的人来说是非常有价值的资源。 总之,objectarxwizards-2023.zip是一个ObjectARX开发工具集的压缩文件,它包含了一些示例代码和实用程序,可以帮助开发人员学习和开发自定义的AutoCAD功能。如果我们对AutoCAD软件的开发有兴趣,这个文件会提供很多有用的资源和参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值