AcRx

 

ACRX_CONS_DEFINE_MEMBERS

ACRX_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS, VERNO)

CLASS_NAME

输入被声明的类的名称

PARENT_CLASS

输入ObjectARX树驻留基类的名称

VERNO

输入此类的版本号(目前ObjectARX不能使用)

这个宏用于定义将一个类的需要的ObjectARX的一般(overhead)函数,这个类将作为具有一个有意义的默认建构器(“CONS”“constructor”的缩写)的一个具体类。这个宏与ACRX_DEFINE_MEMBERS()宏类似,除了它还提供静态的rxInit()函数的执行。这个宏还使CLASS_NAME::desc()->create()返回对象(这个对象由用它的默认建构器创建)的一个实例,且CLASS_NAME::desc()->dxfName()返回NULL

CLASS_NAME参数必须为那些其声明中包含宏的类的名称。PARENT_CLASS参数必须为在ObjectARX运行时树中的CLASS_NAME基类的名称。

这些参数都不能在引号中。如果使用引号,则它将被作为实际字符串的一部分。同时,这些参数为大小写敏感。

这个宏使用ACRX_DEFINE_MEMBERS宏定义desc()isA()gpDesc。另外它还定义了:

static AcRxObject * make()

CLASS_NAME::rxInit()

注意:在使用时,这个宏不需要使用分号结束(';'),但即使使用了也可以:

ACRX_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS)

ACRX_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS);

包含文件

rxboiler.h

ACRX_DECLARE_MEMBERS

ACRX_DECLARE_MEMBERS(CLASS_NAME)

CLASS_NAME

输入被声明的类的名称

这个宏在要做为ObjectARX运行时树的部分的类的声明中使用。CLASS_NAME参数必须为那些其声明中包含宏的类的名称。这个宏声明了从AcRxObject派生的(可以是几级派生)类的CLASS_NAME的成员函数isA()desc()cast()。对于要加入AcRxObject运行时类型标识机制中的类,这些函数需要被声明。

virtual AcRxClass* isA() const

static AcRxClass* gpDesc

static AcRxClass* desc()

 

static CLASS_NAME* cast(const AcRxObject* inPtr)

static void rxInit()

CLASS_NAME参数都不能在引号中。如果使用引号,则它将被作为实际CLASS_NAME字符串的一部分。同时,CLASS_NAME参数为大小写敏感。

注意:如果在运行时不需要将一个类从它的Rx定义的基类中进一步区分,则不要声明类的成员——函数isA()desc()cast()(即,不需要这个宏)。

静态的rxInit()函数和静态的gpDesc指针,也由这个宏定义,用于支持执行isA()desc()cast()。宏ACRX_DEFINE_MEMBERS()ACRX_xxx_DEFINE_MEMBERS()可用于定义 使用这个宏声明的不同函数和静态变量。

注意:在使用时,宏必须以一个分号结束(“;”)并且宏必须在类声明中的“public”段内使用。

范例

    class Foo : public AcRxObject

    {

    public:

        ACRX_DECLARE_MEMBERS(Foo);

        ...etc...

    };

包含文件

rxboiler.h

ACRX_DEFINE_MEMBERS

ACRX_DEFINE_MEMBERS(CLASS_NAME)

CLASS_NAME

输入被声明的类的名称

这个宏主要在其他宏中使用,用于定义大多数需要的ObjectARX的一般(overhead)函数。这个宏定义了所有需要的函数,除了rxInit()函数。这个宏可以取代ACRX_NO_CONS_DEFINE_MEMBERSACRX_CONS_DEFINE_MEMBERS宏用于创建一个类定义,这个类定义足以作为一个“API”库让使用这个类的其他类创建它们自己的应用程序,但因为rxInit()函数未定义,所以这样的应用程序不能将类增加至运行时树中。因此,这应由主应用程序完成。

CLASS_NAME参数必须为那些其声明中包含宏的类的名称。

CLASS_NAME参数都不能在引号中。如果使用引号,则它将被作为实际CLASS_NAME字符串的一部分。同时,CLASS_NAME参数为大小写敏感。

这个宏定义了:

AcRxClass* CLASS_NAME::desc()

AcRxClass* CLASS_NAME::isA() const

AcRxClass* CLASS_NAME::gpDesc = NULL

注意:在使用时,这个宏必须以一个分号结束(“;”)。

ACRX_DEFINE_MEMBERS(MyClass);

包含文件

rxboiler.h

ACRX_DXF_DEFINE_MEMBERS

ACRX_DXF_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS, DWG_VERSION, MAINTENANCE_VERSION, PROXY_FLAGS, DXF_NAME, APP)

CLASS_NAME

输入被声明的类的名称

PARENT_CLASS

输入ObjectARX树驻留基类的名称

DWG_VERSION

输入导入类的主版本数(DWG版本)

MAINTENANCE_VERSION

输入导入类的次版本数(维护释放版本)

PROXY_FLAGS

输入此类的代理标记位

DXF_NAME

输入DXF名称(必须为全大写)

APP

输入应用程序名称

这个宏(或与之扩展后等价的代码)必须由所有那些其对象将储存在一个AcDbDatabase中的类使用。

CLASS_NAME参数必须为那些其声明中包含宏的类的名称。PARENT_CLASS参数必须为在ObjectARX运行时树中的CLASS_NAME基类的名称。

使用这些宏注意类时,需要提供DWG和维护释放版本数。DWG_VERSIONMAINTENANCE_VERSION参数是一定要输入的,没有默认值。这些数据成员为非持久的,换言之,它们不写入DWG/DXF文件中。这些版本数在AcDbObject成员函数getObjectBirthVersion(), getObjectSaveVersion(), hasSaveVersionOverride()setHasSaveVersionOverride()中使用,以重载filer版本并指定它们需要储存的版本数。关于对象版本支持的更多信息,参见ObjectARX开发人员向导。

PROXY_FLAGS参数是一个整数,它的位是用于控制编辑操作对于包含类CLASS_NAME的对象的AcDbProxyObjectsAcDbProxyEntities进行的操作。DXF_NAME参数作为DXF文件和AutoLISP实体列表信息中群组码0对应的名称字符串。

APP参数储存在包含类的对象的DXF文件的CLASSES段中。它在消息框在运行时树中没有出现类且类的对象又出现情况时使用。APP参数可以处理注释。APP参数中可包括多个字符串,使用“|”符号分隔。惟一的限制是第一个字符串必须是惟一的应用程序标识字符串(使用开发人员的前缀作为它的一部分)。如果建立要求加载的系统注册表记录,则标识字符串必须作为AutoCAD注册表段中“Application”键下的应用程序记录的注册表键。(这将在使用acrxRegisterApp()函数写注册表信息时作为logicalName参数)。

APP中包含的任何注释字符串都将在LIST命令和代理住处对话框中显示。例如,可将APP参数设为“AsdkPolyCAD|Product Desc: PolyCAD ObjectARX App for Polygon Entity|Company:Autodesk, Inc.|WEB Address: www.autodesk.com

对于不是从AcDbEntity派生的类(即,非图形),PROXY_FLAGS参数应为AcDbProxyObject::kNoOperation (整数值0)AcDbProxyObject::kEraseAllowed (整数值1)

对于从AcDbEntity派生的类(直接或间接),PROXY_FLAGS参数必须为AcDbProxyEntity::kNoOperation (整数值0)或以下位值的位与的结果值:

AcDbProxyEntity::kEraseAllowed = 0x1

AcDbProxyEntity::kTransformAllowed = 0x2

AcDbProxyEntity::kColorChangeAllowed = 0x4

AcDbProxyEntity::kLayerChangeAllowed = 0x8

AcDbProxyEntity::kLinetypeChangeAllowed = 0x10

AcDbProxyEntity::kLinetypeScaleChangeAllowed = 0x20

AcDbProxyEntity::kVisibilityChangeAllowed = 0x40

AcDbProxyEntity::kCloningAllowed = 0x80

AcDbProxyEntity::kAllButCloningAllowed = 0x7F

AcDbProxyEntity::kAllAllowedBits = 0xFF

如果PROXY_FLAGSkNoOperation,则proxyEntities包含这个类的实体将不能删除,不能转换,也不能改变它们的颜色、层、线型、线型比例或可见性,而且它们不能被复制。但是,它们可被分解。

这个宏使用ACRX_DEFINE_MEMBERS宏定义desc()isA()gpDesc()。另外,它还定义:

static AcRxObject * make<CLASS_NAME>()

CLASS_NAME::rxInit()

这些参数都不能在引号中。如果使用引号,则它将被作为实际字符串的一部分。同时,这些参数为大小写敏感。

注意:DXFNAME参数必须全部为大写或不能使用DXFIN导入包含这个类的对象的文件中。

注意:这个宏在使用时不需要以一个分号(“;”)结束,但是即使使用了也没有问题:

ACRX_DXF_DEFINE_MEMBERS(CLASS_NAME,PARENT_CLASS,DWG_VERSION,\

    MAINTENANCE_VERSION,PROXY_FLAGS,DXF_NAME,APP)

ACRX_DXF_DEFINE_MEMBERS(CLASS_NAME,PARENT_CLASS,DWG_VERSION,\

    MAINTENANCE_VERSION,PROXY_FLAGS,DXF_NAME,APP);

包含文件

rxboiler.h

ACRX_NO_CONS_DEFINE_MEMBERS

ACRX_NO_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS)

CLASS_NAME

输入要声明的类的名称

PARENT_CLASS

输入ObjectARX树驻留基类的名称

这个宏用于为将作为一个抽象基类(“NO_CONS”“no constructor”的缩写)的类定义需要的ObjectARX一般(overhead)函数。

CLASS_NAME参数必须为那些其声明中包含宏的类的名称。PARENT_CLASS参数必须为在ObjectARX运行时树中的CLASS_NAME基类的名称。

这两个参数都不能在引号中。如果使用引号,则它将被作为实际字符串的一部分。同时,这些参数为大小写敏感。

这个宏使用ACRX_DEFINE_MEMBERS宏定义desc()isA()gpDesc。另外它还定义了:

void CLASS_NAME::rxInit()

注意:这个宏在使用时不需要以一个分号(“;”)结束,但是即使使用了也没有问题:

ACRX_NO_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS)

ACRX_NO_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS);

包含文件

rxboiler.h

ACRX_X_CALL

ACRX_X_CALL(a, b)

a

对象指针

b

协议扩展类

当访问协议扩展方法时,必须使用x()queryX()方法。返回的值是一个AcRxObject的指针,且必须被转换为适当的协议扩展类。这在每个使用位置被写出,但在许多情况下,调用语句也可以被压缩至一个宏中。最常用的将调用语句压缩至宏中的例子在rxobject.h头文件中:

#define ACRX_X_CALL(a,b) b::cast(a->x(b::desc()))

这个宏演示了使用x()方法访问一个协议扩展对象。

范例

double val = ACRX_X_CALL(pEnt, ProtExtClass)->func1(pEnt);

包含文件

rxobject.h

acrxClassDictionary

acrxClassDictionary宏提供了AcRxClass对象的ObjectARX系统词典的指针。这个词典包含了组成ObjectARX运行时树的所有的AcRxClass对象。这个词典使用被AcRxClass对象表示为记录的关键字的C++类名。

这个宏的实际定义如下:

#define ACRX_CLASS_DICTIONARY "ClassDictionary"

#define acrxClassDictionary \

AcRxDictionary::cast(acrxSysRegistry()->at(ACRX_CLASS_DICTIONARY))

范例

AcRxClass::cast(acrxClassDictionary->at("AcDbLIne"));

注意:不要使用acrxClassDictionary->remove()删除具有数据库驻留对象的类,因为对象将不被转换至代理中。要正确地将类从词典中删除并允许发生zombification,可以使用全局的deleteAcRxClass()函数。

acrxClassDictionary->remove()可用于没有数据库驻留的类,但使用deleteAcRxClass()函数删除全部类更安全。

包含文件

rxdict.h

acrxDynamicLinker

acrxDynamicLinker宏提供了ObjectARX系统动态链接器对象的指针。对于增加和删除链接反应器以及为ObjectARX应用程序提供访问其他ObjectARX应用程序中的输出的符号,动态链接对象负责加载/卸载和锁定/解锁ObjectARX应用程序。

这个宏的实际定义如下:

#define ACRX_DYNAMIC_LINKER "DynamicLinker"

#define acrxDynamicLinker\

AcRxDynamicLinker::cast(acrxSysRegistry()->at(ACRX_DYNAMIC_LINKER))

范例

acrxDynamicLinker-> addReactor(pReactor);

包含文件

rxdlinkr.h

acrxKernel

acrxKernel宏提供了ObjectARX系统核心对象的指针。通常这个宏不被ObjectARX应用程序使用。

这个宏的实际定义如下:

#define ACRX_KERNEL_SERVICES "KernelServices"

#define ACRX_SERVICE_DICTIONARY "ServiceDictionary"

#define acrxKernel \

AcRxKernel::cast(AcRxDictionary::cast(\

acrxSysRegistry()->at(ACRX_SERVICE_DICTIONARY))->at(ACRX_KERNEL_SERVICES))

范例

acrxKernel-> newAcRxDictionary();

包含文件

rxkernel.h

acrxServiceDictionary

acrxServiceDictionary宏提供了服务对象的ObjectARX系统词典的指针。这个词典包含在ObjectARX系统中注册的所有服务的服务对象。注册的服务名作为记录的关键字。

这个宏的实际定义如下:

#define ACRX_SERVICE_DICTIONARY "ServiceDictionary"

#define acrxServiceDictionary \

AcRxDictionary::cast(acrxSysRegistry()->at(ACRX_SERVICE_DICTIONARY))

这个宏应被用于删除一个应用程序已注册的任何服务。范例如下:

delete acrxServiceDictionary->remove("My_App_Service");

包含文件

rxdict.h

MAKE_ACDBOPENOBJECT_FUNCTION

MAKE_ACDBOPENOBJECT_FUNCTION(CLASS_NAME)

CLASS_NAME

输入要定义acdbOpenObject()函数的类的名称

注意:acdbOpenObject()函数是定义在dbmain.h中的一个模板函数,其中第一个参数类型为 (CLASS_NAME *&)。这个宏存在是为了与需要使用这个宏定义一个类型特定的形式的acdbOpenObject()的以前的代码反向兼容。

这个宏将创建一个CLASS_NAME指定类的acdbOpenObject()函数的指定版本。这个宏只能在从AcDbObject派生的(直接或间接)的类中使用。

acdbOpenObject()函数的一个重载版本允许代码打开一个对象而无需在打开前知道它的类型。

CLASS_NAME参数都不能在引号中。如果使用引号,则它将被作为实际CLASS_NAME字符串的一部分。同时,CLASS_NAME参数为大小写敏感。

包含文件

dbboiler.h