// custom classes from the ACRX runtime class hierarchy.
//
void
unloadApp()
{
acedRegCmds->removeGroup("ASDK_DICTIONARY_COMMANDS");
// Remove the AsdkMyClass class from the ACRX runtime
// class hierarchy. If this is done while the database is
// still active, it should cause all objects of class
// AsdkMyClass to be turned into proxies.
//
deleteAcRxClass(AsdkMyClass::desc());
}
Поддержка Версии объекта
Несколько механизмов прежде использовались для руководящих версий заказных объектных классов, используемых в Приложениях ObjectArx:
§ Переименование класса для каждой новой версии.
§ Поддержание номера версии как первый компонент данных класса.
§ Поддержание номера версии как расширенные данные (xdata) или в словаре расширения.
Эти механизмы были заменены классом versioning система.
Эти более ранние механизмы описаны ниже (после описания класса versioning), помогать обслуживать{*поддерживать*} код, который использует их.
Класс Versioning
Начинаясь с AutoCAD 2000, каждый класс пользователя должен обеспечить рисунок и эксплуатационный номер версии. Значение рисунка соответствует выпуску AutoCAD, который был текущий, когда класс был создан. Эксплуатационное значение может быть установлено в то, что является соответствующим вашему классу. Для классов ObjectARX, эксплуатационное значение будет установлено на нуль, каждый раз версия рисунка изменяется из-за нового выпуска AutoCAD. Значения версии определены в acdb. h файле заголовка. Макрокоманда ACRX_DXF_DEFINE_MEMBERS изменилась в AutoCAD 2000, чтобы брать два новых параметра, DWG_VERSION и MAINTENANCE_VERSION:
#define ACRX_DXF_DEFINE_MEMBERS(CLASS_NAME, PARENT_CLASS,\
DWG_VERSION, MAINTENANCE_VERSION, PROXY_FLAGS, DXF_NAME, APP)
Эти два параметра нужно обеспечить, и не имеется никаких значений по умолчанию. Новые параметры определяют версию, когда класс был представлен. Они станут компонентами данных AcRxClass, но они не постоянны, то есть они не сохранены в разделе класса DWG и DXF файлов.
Класс Versioning Пример
Новые параметры ACRX_DXF_DEFINE_MEMBERS определяют, из которой версии использовать, когда объект должен к файлу непосредственно. Когда рисунок сохранен, Вы можете определять которую DWG версию сохранить{*экономить*} к, вызывая dwgVersion () метод регистратора. Не необходимо что объектный файл непосредственно из как та же самая версия как регистратор. Предыдущие выпуски AutoCAD сделали точно, что, который вел к проблемам, которые являются лучшими описанными следующим примером.
В Выпуске 14, новый компонент данных (mTreatElementsAsHard) был добавлен к AcDbDictionary. В AutoCAD 2000, класс по имени AcDbDictionaryWithDefault был получен из AcDbDictionary. Когда
Используя acdbSaveAsR13 (), mTreatElementsAsHard элемент не выписан, так как Выпуск 13 не знает относительно элемента. Если рисунок, сохраненный acdbSavedAsR13 () затем открыт на Выпуск 14, образец AcDbDictionaryWithDefault становится полномочным, так как Выпускают 14, не включает этот класс. Когда AcDbObject становится полномочным, все данные ниже уровня AcDbObject сохраняются неповрежденными в соответствии с AutoCAD как “ полномочные данные ” и не изменены{*заменены*}. Когда рисунок сохранен Выпуском 14, данные разгружаются назад к DWG файлу, поскольку это читалось в. Результат - Выпуск 14 DWG файл, который имеет образец AcDbDictionaryWithDefault, но пропускает mTreatElementsAsHard данные. При считывании этого рисунка к AutoCAD 2000, AutoCAD (определенно, AcDbDictionary:: dwgInFields ()) ищет тот компонент данных, так как это признает регистратора, являющегося Выпуском 14 типа, который должен иметь mTreatElementsAsHard данные. Однако, данные - не, подарок{*настоящее*}, последовательность потерян, и рисунок коррумпирован.
Это не определенно к AcDbDictionaryWithDefault. Новые классы в AutoCAD 2000, уже представленном ObjectARX или это будет представлено третьими лицами, может страдать от этой проблемы, особенно, если один из их супер-классов изменил{*заменил*} данные.
Использование Класса Versioning
В примере выше, объект AcDbDictionaryWithDefault должен быть зарегистрирован из с версией AutoCAD 2000 его данных, так как это становится полномочным во всех предыдущих версиях, и никто не будет читать ее данные (если бы не данные, зарегистрированные из на уровне AcDbObject).
Чтобы устанавливать это, механизм было представлено, где объект может отменять версию регистратора и диктовать то, с какой версией требуется быть зарегистрированным из или в.
Следующие правила применяются:
1, если версия регистратора старшая чем версия AutoCAD что объект сначала появился в (версия “рождения”), использование версия рождения объекта.
2, если версия регистратора тот же самый или более новая чем версия рождения объекта, использование версия регистратора.
Соответствующее правило{*правление*} должно использоваться листовым классом, также как всеми его базовыми классами, к данным файла в и из. В примере, данном выше, правило 2{*правление*} применяется{*обращается*} (регистратор - от AutoCAD 2000, в то время как объект - от Выпуска 14), так что мы регистрируем из использования версии AutoCAD 2000. Если имелся новый класс, представленный в Выпуске 14, чей данные также изменяются в AutoCAD 2000, и операция должна сохранить{*экономить*} как Выпуск 13, правило 1{*правление*} применяется{*обращается*}, и мы регистрируем из использования Выпуска 14 версии (рождения).
Два новых виртуальных метода AcDbObject были представлены классу орудия versioning, один для DWG и один для DXF файлов:
virtual Acad::ErrorStatus
getObjectSaveVersion(
const AcDbDwgFiler* pFiler,
AcDb::AcDbDwgVersion& ver,
AcDb::MaintenanceReleaseVersion& maintVer);
virtual Acad::ErrorStatus
getObjectSaveVersion(
const AcDbDxfFiler* pFiler,
AcDb::AcDbDwgVersion& ver,
AcDb::MaintenanceReleaseVersion& maintVer);
В методах регистратора, вместо звонящего filer - >dwgVersion (), звонят self()- >getObjectSaveVersion (filer, ...) чтобы позволить объекту указывать которую версию использовать, чтобы разгрузить данные. Точно так же вызовите{*назовите*} тот метод в dwgInFields () и dxfInFields () чтобы выяснить, в которой версии данные возвращаются.
С тех пор не все объекты имеют потребность отменить версию filer те, которые должны делать, так определите их намерение, устанавливая немного на объекте. Это обычно сделалось бы в конструкторе класса. Бит используется как быстрая проверка, чтобы определить, необходимо ли отменить версию регистратора. Методы, связанные с этим были добавлены к AcDbObject:
bool
hasSaveVersionOverride();
void
setHasSaveVersionOverride(
bool bSetIt);
Имеется также новый AcDbObject метод получить версию рождения объекта:
Acad::ErrorStatus
getObjectBirthVersion(
AcDb::AcDbDwgVersion& ver,
AcDb::MaintenanceReleaseVersion& maintVer);
Этот метод возвращает два номера версии, сохраненные AcRxClass этого объекта, которые определены при регистрации класса, используя макрокоманду ACRX_DXF_DEFINE_MEMBERS.
Класс Реализации Versioning
1, если Вы получаете, класс от любых классов ObjectARX, если бы не AcDbObject и AcDbEntity, вызывает{*называет*} setHasSaveVersionOverride (истину) в конструкторе так, чтобы AcDbObject:: getObjectSaveVersion () заданное по умолчанию выполнение знало не, только возвращают версию регистратора, но и вместо этого свериться с вашей версией класса и возвращаются соответствующий “ объект, сохраняют{*экономят*} версию ” согласно правилам, описанным выше. GetObjectSaveVersion () не делает это, если этот бит не установлен.
2 Вы можете отменять AcDbObject:: getObjectSaveVersion () чтобы определить, в которой версии объектные данные должны быть сохранены. Не имеется никакой потребности к supermes-sage, потому что Вы полностью занимаете.
3 Не используют регистратора - > dwgVersion () в вашем dwgInFields (), dwgOutFields (), dxfInFields (), или dxfOutFields () методы. Использование сам () - > getObjectSaveVersion () вместо этого. Его заданное по умолчанию выполнение должно возвратить регистратора - > dwgVersion () если объект не хочет отменить сохраняющуюся{*экономящуюся*} версию.
Если Вы используете регистратора - > dwgVersion (), вы отключаете надлежащий выбор регистратора для классов, полученных из вашего.
4 Убеждаются, что регистрировал ваши классы, использующие ACRX_DXF_DEFINE_MEMBERS в AutoCAD 2000 с “ версия рождения ” использование двух новых параметров. Помните ту версию рождения, означает версию AutoCAD, что класс был представлен в, и это будет не всегда AutoCAD 2000, но могло быть Выпуск 13 или Выпускать 14.
Переименование Класса
Переименование классов для каждой новой версии - самый простой метод, поскольку это не возводит в степень осуществляющие новые элементы данных или функции, чтобы обнаруживать и ответить на различные номера версии класса.
Данные Класса или Xdata Номера версии
Номер версии может быть сохранен как 8-разрядный целочисленный компонент данных (типа Adesk:: UInt8) класса, и может быть зарегистрирован в и из как первый компонент данных для каждого объекта. Поскольку эти данные постоянны, и - первое чтение элемента{*пункта*}, это может быть проверено, чтобы определить версию объекта прежде, чем любые другие данные читаются.
Когда номер используется, чтобы дифференцировать версии объекта, родительское Приложение ObjectArx должно быть способно обработать эти два случая{*дел*} несовместимых версий объектов:
§ когда приложение сталкивается с устарелой версией объекта в файле, должно быть способно модифицировать объект к текущей версии. Модифицирование старого объекта возводит в степень добавление любых новых компонентов данных и функций элемента, также как изменения{*замены*} номера версии.
§ когда старшая версия приложения сталкивается с более новой версией объекта (то есть когда номер пересмотра объекта больший чем номер пересмотра приложения), dxfInFields заказного класса () и dwgInFields () функции должны немедленно возвратиться, ошибка закодирует eMakeMeProxy к AutoCAD. AutoCAD тогда создаст полномочный объект для сеанса рисунка, и записывать первоначальный объект к файлу, когда рисунок сохранен.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


