Важные функции, обеспеченные AcRxObject классом для идентификации типа во время выполнения включают следующее:
· desc (), статическая функция элемента, которая возвращает объект описателя класса частности (известный) класс.
· cast (), статическая функция элемента, которая возвращает объект указанного типа, или NULL если объект не имеет требуемый класс (или полученный класс).
· isKindOf () возвращается, принадлежит ли объект указанному классу (или полученный класс).
· isA () возвращает объект описателя класса объекта, чей класс неизвестен.
Когда Вы хотите знать, каков классифицируют объект, использование AcRxObject:: isA (). Эта функция возвращает объект описателя класса (образец AcRxClass) для объекта базы данных. Его сигнатура
AcRxClass* isA() const;
Когда Вы уже знаете, каков классифицируют объект, Вы можете использовать desc () функция, чтобы получить объект описателя класса:
static AcRxClass* desc();
Следующий пример ищет образцы AcDbEllipse или любого класса, полученного из этого, используя isKindOf () и AcDbEllipse:: desc() статическая функция элемента:
AcDbEntity* curEntity = somehowGetAndOpenAnEntity();
if (curEntity->isKindOf(AcDbEllipse::desc())) {
// Got some kind of AcDbEllipse instance.
}
Этот пример показывает другому пути поиска образцов AcDbEllipse, или любого класса, полученного из этого, использование AcDbEllipse:: приведение () статическая функция элемента:
AcDbEllipse* ellipseEntity = AcDbEllipse::cast(curEntity);
if (ellipseEntity!= NULL) {
// Got some kind of AcDbEllipse instance.
}
Следующий пример ищет образцы AcDbEllipse, но не образцы классов, полученных из AcDbEllipse, используя isA () и AcDbEllipse:: desc ():
if (curEntity->isA() == AcDbEllipse::desc()) {
// Got an AcDbEllipse, no more, no less.
Макрокоманда Объявления Класса
Файл заголовка для заказного класса может использовать ACRX_DECLARE_MEMBERS (CLASS_NAME) макрокоманда ObjectARX, чтобы объявить desc(), cast(), и isA() функции.
Эта макрокоманда используется в общем разделе объявления класса, следующим образом:
class myClass : public AcRxObject
{
public:
ACRX_DECLARE_MEMBERS(myClass);
...
};
Для AsdkPoly, следующая строка расширяется до одиночной длинной строки программы.
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() функции.
Макрокоманды Выполнения Класса
Чтобы осуществлять ваш заказной класс, используйте одну из этих трех макрокоманд в источнике file:
· ACRX_NO_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS)
Использование для абстрактных классов и любых других классов, которые не должны быть instantiated.
· ACRX_CONS_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS, VERNO)
Использование для переходных классов, которые могут быть instantiated, но не написано к файлу.
· ACRX_DXF_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS, DWG_VERSION,\
MAINTENANCE_VERSION, PROXY_FLAGS, DXF_NAME, APP)
Использование для классов, которые могут быть записаны в, или читать от, DWG и DXF файлы.
Каждая из этих макрокоманд определяет следующее:
· объект описателя Класса
· функция инициализации Класса (см. “ Функция Инициализации Класса ” на странице 289)
· desc () функция для этого класса
· виртуальный isA () функция (унаследованный от AcRxObject) который этот заказной класс отменит
Для AsdkPoly, следующая строка расширяется до очень длинной одиночной линии кода:
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 () функция. Эта макрокоманда также не создает связанный объект AcRxClass, который является ответственностью rxInit () функция.
Функция Инициализации Класса
Функция инициализации класса для каждого класса - rxInit (). Приложение, которое определяет заказной класс, должно вызвать эту функцию во время выполнения инициализация.
Эта функция определена автоматически каждым из три ACRX_xxx_DEFINE_MEMBERS () макрокоманды и исполняет следующие задачи:
· Регистрирует заказной класс
· Создает объект описателя класса
· Размещает объект описателя класса в словарь класса
Если Вы хотите определить ваш собственный rxInit () функция, используйте ACRX_DEFINE_MEMBERS () макрокоманда.
Глава 12. Наследование от AcDbObject
Эта глава описывает, как получить заказной класс из AcDbObject. Это обеспечивает детальную информацию относительно регистраторов, четыре типа объектных ссылок (интенсивно и мягких владельцев, и интенсивно и мягких указателей), операций отмены и восстановления. Эта глава также обсуждает механизмы для объекта versioning. Описания в этой главе предполагают, что Вы знакомы с материалом, описанным в главе 5, “ Объекты Базы данных, ” и глава 11, при Наследовании Заказного ObjectARX Класса. ”
· Перегрузка виртуальных функций AcDbObject
· Реализация функций
· Сохранение объектов в DWG и DXF файлах
· Ссылки на объекты
· Ссылки монопольного использования
· Ссылки на указатели
· Проблемы длинных транзакций для заказных объектов
· Purge (Чистка)
· Undo and Redo (Отмена и Восстановление)
· subErase, subOpen, subClose, и subCancel
· Пример Заказного Объектного Класса
· Объектная Поддержка Версии
Перегрузка AcDbObject Виртуальные функции
Если вы подклассифицируете от AcDbObject, имеется множество виртуальных функций, которые Вы должны отменить, как показано в следующих разделах. Этот показ разделов, которые другие функции обычно отменяются и которые функции только редко отменяются.
AcDbObject: необходимые функции для перегрузки
Заказной класс должен перегрузить следующие функции:
virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer);
virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const;
virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* filer);
virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* filer) const;
<Destructor>
AcDbObject: Функции Часто Перегружаемые
Класс пользователя часто отменяет следующие функции:
virtual Acad::ErrorStatus
audit(AcDbAuditInfo*);
// Commonly useful, as this happens at a point where a new
// object state is being committed.
//
virtual Acad::ErrorStatus subClose();
// The next two functions apply to container objects.
//
virtual Acad::ErrorStatus
deepClone(AcDbObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const;
virtual Acad::ErrorStatus
wblockClone(AcRxObject* pOwnerObject,
AcDbObject*& pClonedObject,
AcDbIdMapping& idMap,
Adesk::Boolean isPrimary = Adesk::kTrue) const;
AcDbObject: Функции Иногда Перегружаемые
Класс пользователя иногда отменяет следующие функции:
virtual Acad::ErrorStatus
subErase(Adesk::Boolean erasing);
virtual Acad::ErrorStatus
subHandOverTo(AcDbObject* newObject);
virtual Acad::ErrorStatus
subOpen(AcDb::OpenMode);
virtual Acad::ErrorStatus
subCancel();
virtual Acad::ErrorStatus
subSwapIdWith(AcDbObjectId otherId,
Adesk::Boolean swapXdata = Adesk::kFalse);
AcDbObject: Функции Редко Перегружаемые
Класс пользователя редко отменяет следующие функции:
virtual Acad::ErrorStatus
setOwnerId(AcDbObjectId);
virtual resbuf*
xData(const char* regappName = NULL) const;
virtual Acad::ErrorStatus
setXData(const resbuf* xdata);
virtual void
addPersistentReactor(AcDbObjectId objId);
virtual Acad::ErrorStatus
removePersistentReactor(AcDbObjectId objId);
virtual void cancelled(const AcDbObject* dbObj);
virtual void copied(const AcDbObject* dbObj, const AcDbObject* newObj);
virtual void erased(const AcDbObject* dbObj, Adesk::Boolean pErasing = Adesk::kTrue);
virtual void goodbye(const AcDbObject* dbObj);
virtual void openedForModify(const AcDbObject* dbObj);
virtual void modified(const AcDbObject* dbObj);
virtual void modifyUndone(const AcDbObject* dbObj);
virtual void modifiedXData(const AcDbObject* dbObj);
virtual void unappended(const AcDbObject* dbObj);
virtual void objectClosed(const AcDbObjectId objId);
virtual void modifiedGraphics(const AcDbEntity* dbEnt);
AcRxObject: Функции Редко Перегружаемые
Класс пользователя редко отменяет эти функции:
virtual AcRxObject*
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |


