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()宏
ObjectArx-自定义对象-派生自ObjectARX类相关推荐
- ObjectARX自定义对象的OPM
在AutoCAD绘图工作中,经常用到特性面板,它可以方便地查询.修改CAD对象的详细信息,如颜色.线型等,它是一个非常实用且便捷的工具.如果能为自定义对象添加一个特性面板(OPM),这无疑是众多初学者 ...
- JavaScript自定义对象
JavaScript自定义对象 2.1.类和对象的概念 所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的存在,可以发现身边很多对象,汽 ...
- ObjectARX自定义实体
说明: 此次绘制的CAD自定义实体是一个矩形,具有拉伸功能.因为初次接触自定义实体,在一次次制作的过程中遇到了很多困难,幸好有老大和同事的帮助,当然还有广大网友们的文章协助,才完成了这个自定义实体的绘 ...
- c++,派生类对象可以对基类赋值,基类对派生类不可以赋值
派生类对象可以对基类对象赋值,赋值时属于派生类独有的部分就舍弃不用. #include <iostream> using namespace std;class DemoA { publi ...
- 声明一个国家基类Country,包含国名、首都、人口等属性,派生出省类Province,增加省会城市、人口数量属性。定义派生类对象,并对相应信息进行输出
声明一个国家基类Country,包含国名.首都.人口等属性,派生出省类Province,增加省会城市.人口数量属性.定义派生类对象,并对相应信息进行输出. # include<iostream& ...
- matlab 自定义对象,自定义类的对象显示
用于自定义对象显示的特定方法 You can customize object display based on the state of the object and you can change ...
- java查询结果自定义显示_JPA自定义对象接收查询结果集操作
最近使用JPA的时候,碰到需要自定义查询结果集的场景,网上搜了一下,都是需要自定义方法写一大串代码实现的,太繁琐了,有那时间还不如用mybaits. 用JPA就是要尽量通过声明接口解决持久层问题,要不 ...
- YOLOv5实现自定义对象训练与OpenVINO部署全解析
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 大家好,前面写了一个OpenVINO部 ...
- php memcache 封装类,PHP 自定义session储存 MEMCACHE 方式类
自定义session储存 MEMCACHE 方式类 在php.ini配置文件中更改设置 (Registered_save_handlers 有三种方式 files user memcache) ses ...
最新文章
- Ecplise 恢复刚刚删除的文件
- 计算机应用基础中专教材pdf,中等职业教育通用教材-计算机应用基础.pdf
- travis-ci_使用Travis-CI的SpringBoot应用程序的CI / CD
- 阿里P8大牛亲自教你!史上最全的Android面试题集锦,这原因我服了
- 三菱电机宣布放弃液晶面板业务 2022年6月停止生产相关模组
- 在android系统中开发DLNA
- 一些避免竞争条件的实例
- 返回顶部的几种方法总结
- MySQL基础练习题(带答案)
- html如何设置自动点击事件,使用javascript给html元素添加click事件
- 解决css修改但是没有反应
- 1062: [NOI2008]糖果雨 - BZOJ
- 前段听一个仁兄说jbpm4 改变了很多
- MySQL-5.5.32 配置文件优化详解
- 猛兽来袭——Integral Protocol
- 设计模式 - 状态模式
- 信号与系统——基本概念
- 注意了!朋友圈发一张照片,是如何泄露你的地址信息的?
- 计算机专业报考小学语文老师,各位大神,我是今年的专科应届毕业生,计算机应用专业,想当小学语文老师,考教师资格证对专业有限制吗?...
- 广东“阳光检务网”昨正式启用
热门文章
- Windows Server 2008 WEB服务器安全初级设置篇
- 运动学模型(一)-----传感器选型与技术路线
- 展望2023,软件测试的走势分析详情
- 一篇文章讲清楚什么是频率、频域、时域
- 离散正交的二次多项式matlab实现,月光软件站 - 编程文档 - 其他语言 - 用离散正交多项式求三次拟合多项式[MATLAB版本]...
- java程序默认的引用包
- awk编程的基本用法
- 相对开音节java_单词拼读规则表2 - ccxixicc @ Think in life - BlogJava
- 一文让你的亲友知道什么叫“服务器炸了”
- 机械开关消抖方法汇总介绍