if (version==1)
{
//convert data from old format
acdbWcs2Ecs(asDblArray(cen3d),asDblArray(cen3d),
asDblArray(planeNormal),Adesk::kFalse);
mCenter. set(cen3d. x,cen3d. y);
mElevation = cen3d. z;
acdbWcs2Ecs(asDblArray(sp3d),asDblArray(sp3d),
asDblArray(planeNormal),Adesk::kFalse);
mStartPoint. set(sp3d. x,sp3d. y);
assert(mElevation == sp3d. z);
} else {
mCenter = cen2d;
mStartPoint = sp2d;
mElevation = elevation;
}
return es;
}
Законченный код для AsdkPoly определенного приложением класса может быть найден в каталоге примеров.
Типовой Код для dxfInFields () с порядком зависимостей
Эта выборка кода показывает, как Вы могли записывать dxfInFields () функция, которая является иждивенцем заказа (порядка).
Acad::ErrorStatus
AsdkPoly::dxfInFields(AcDbDxfFiler* filer)
{
assertWriteEnabled();
if ((AcDbCurve::dxfInFields(filer) != Acad::eOk) || !filer->atSubclassData("AsdkPoly") )
{
return filer->filerStatus();
}
try
{
struct resbuf rb;
// Object Version
Adesk::Int16 version;
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfInt16)
throw AcDb::kDxfInt16;
version = rb. resval. rint;
if (version > VERSION)
return Acad::eMakeMeProxy;
if (version == 1)
{
AcGePoint3d cent, sp;
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfXCoord)
throw AcDb::kDxfXCoord
cent = asPnt3d(rb. resval. rpoint);
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfXCoord + 1)
throw AcDb::kDxfXCoord + 1;
sp = asPnt3d(rb. resval. rpoint);
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfInt32)
throw AcDb::kDxfInt32;
mNumSides = rb. resval. rlong;
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfNormalX)
throw AcDb::kDxfNormalX
mPlaneNormal = asVec3d(rb. resval. rpoint);
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfText)
throw AcDb::kDxfText;
setName(rb. resval. rstring);
filer->readItem(&rb);
if (rb. restype!= kDxfHardPointerId)
throw AcDb::kDxfHardPointerId;
acdbGetObjectId(mTextStyle, rb. resval. rlname);
// Convert data from old format.
acdbWcs2Ecs(asDblArray(cent),asDblArray(cent),
asDblArray(mPlaneNormal),Adesk::kFalse);
mCenter. set(cent. x,cent. y);
mElevation = cent. z;
acdbWcs2Ecs(asDblArray(sp),asDblArray(sp),
asDblArray(mPlaneNormal),Adesk::kFalse);
mStartPoint. set(sp. x,sp. y);
assert(mElevation == sp. z);
}
else if (version == 2)
{
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfXCoord)
throw AcDb::kDxfXCoord;
mCenter = asPnt2d(rb. resval. rpoint);
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfXCoord + 1)
throw AcDb::kDxfXCoord + 1;
mStartPoint = asPnt2d(rb. resval. rpoint);
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfInt32)
throw AcDb::kDxfInt32
mNumSides = rb. resval. rlong;
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfNormalX)
throw AcDb::kDxfNormalX;
mPlaneNormal = asVec3d(rb. resval. rpoint);
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfText)
throw AcDb::kDxfText
setName(rb. resval. rstring);
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfHardPointerId)
throw AcDb::kDxfHardPointerId;
acdbGetObjectId(mTextStyle, rb. resval. rlname);
filer->readItem(&rb);
if (rb. restype!= AcDb::kDxfReal)
throw AcDb::kDxfReal;
mElevation = rb. resval. rreal;
}
else assert(false);
}
catch (AcDb::DxfCode code)
{
filer->pushBackItem();
filer->setError(Acad::eInvalidDxfCode,
"\nError: expected group code %d", code);
return filer->filerStatus();
}
}
Объектные Ссылки
Объектная ссылка может быть или интенсивно или программное обеспечение, и это может быть или ссылка монопольного использования или ссылка указателя. Жесткое или мягкое различие указывает, является ли упомянутый объект необходимым для существования объекта, который обращается{*относится*} к этому. Жесткая ссылка указывает, что объект зависит от упомянутого объекта для его выживания. Мягкая ссылка указывает, что объект имеет некоторые отношения к упомянутому объекту, но это - не существенное{*необходимое*}.
Ссылка монопольного использования диктует, как объекты зарегистрированы. Если один объект имеет другой, то всякий раз, когда первый объект зарегистрирован из, требуется находящийся в собственности объект с этим. Поскольку объект может иметь только одного владельца, ссылки{*справочники*} монопольного использования используются для неизбыточного письма из базы данных. Напротив, ссылки{*справочники*} указателя используются, чтобы выразить любую произвольную ссылку{*справочники*} между объектами AcDb.
Ссылки{*справочники*} Указателя используются для законченного (избыточного) письма из базы данных.
Например, в следующем числе{*рисунке*}, сдвоенные линии указывают ссылки{*справочники*} монопольного использования.
Если Вы следуете за сдвоенными линиями, Вы касаетесь каждого объекта в этой маленькой базе данных только однажды. Если Вы также следуете за одиночными линиями, которые представляют ссылки{*справочники*} указателя, Вы касаетесь некоторых объектов больше чем однажды, потому что множественные объекты могут указывать на тот же самый объект. Чтобы получить полное “определение” объекта AcDbLine, Вы были бы должны следовать за всеми жесткими ссылками{*справочниками*}, и монопольное использование и указатель (то есть оба сингл и двойные сплошные линии).

Ссылки Монопольного использования (Ownership References)
Если Вы создаете вашу собственную иерархию монопольных использований, Вы должны установить подключение{*связь*} между владельцем и находящимся в собственности объектом. Объект не может иметь множественных владельцев.
Создавать подключение{*связь*} монопольного использования
1 Определяют, что владелец имеет объект.
2 Определяют, что объект принадлежит владельцу.
AcDbObject протокол всегда определяет связь{*ссылку*} от владельца к находящемуся в собственности объекту и обратной связи{*ссылке*} от объекта до его владельца.
Следующий код иллюстрирует установку двухсторонней связи{*ссылки*} монопольных использований между владельцем и ее содержанием:
// Uses the OwnerDemo class defined in the next example
// (see "ObjectARX Example," below).
//
// Sets pOwner to be the owner of pOwned.
//
void
makeOwner(OwnerDemo* pOwner, AcDbObject* pOwned)
{
// First let pOwner know it is the owner. This
// establishes ownership for filing persistence.
//
pOwner->setIdData(pOwned->ojectId());
// Now set up the backpointer so that the owned
// object knows who its owner is.
//
pOwned->setOwnerId(pOwner->objectId());
}
Обычно используемые члены контейнерного класса устанавливают двухстороннюю связь{*ссылку*} автоматически. Например, следующий функциональный запрос устанавливает блочный отчет{*запись*} таблицы как владелец объекта, и также прибавляет объект к блочному списку отчета{*записи*} таблицы находящихся в собственности объектов.
BlockTableRecord - > appendAcDbEntity (...);
Точно так же AcDbDictionary:: setAt () функция и AcDbSymbolTable:: добавляется () функция устанавливает двухсторонние связи{*ссылки*} между владельцем и ее объектами в одном шаге.
Если Вы непосредственно управляете объектами, использующими entmod () или entmake () в AutoLISP, Вы сначала прибавляете находящийся в собственности объект к базе данных, используя entmake (), то присоединяете ее ads_name или название{*имя*} объекта с соответствующим кодом группы DXF в представлении объекта владельца.
Использования Монопольного использования
Когда объект написан к DXF или DWG файлу, все объекты, принадлежащие этому объекту также выписаны. Глубокая операция аналога также рекурсивно копирует каждый объект, принадлежащий имитируемому объекту. См. главу 18, при Глубоко Имитации. ” Жесткие отношения монопольного использования защищают находящийся в собственности объект от чистки.
Типы Монопольного использования
Владельцы могут быть или интенсивно или мягкие владельцы их объектов.
Жесткое Монопольное использование
Следующее - три примера жесткого монопольного использования:
§ объект базы данных - жесткий владелец его словаря расширения{*продления*}.
§ блочная таблица - жесткий владелец образцовых пространственных и бумажных пространственных блочных отчетов{*записей*} таблицы (но не другие блочные отчеты{*записи*} таблицы).
§ словари Расширений{*продления*} - жесткие владельцы их элементов.
Мягкое Монопольное использование
Мягкое монопольное использование ИДЕНТИФИКАТОР (типа AcDbSoftOwnershipId) не защищает находящийся в собственности объект от чистки. Следующее - примеры мягкого монопольного использования:
§ В большинстве случаев, таблицы идентификаторов - мягкие владельцы их элементов (исключения включают блок, *PAPER_SPACE, *PAPER_SPACE0, и уровень 0; для этих элементов, таблица идентификаторов обслуживает{*поддерживает*} жесткую ссылку{*справочники*}).
§ Словари - мягкие владельцы их входов (но Вы можете помечать словарь, чтобы быть жестким владельцем его входов).
Формирование Иерархии Монопольных использований
Следующий пример иллюстрирует, как формировать иерархию монопольных использований, используя функции ObjectARX. Пример показывает заголовку и исходным файлам для нового класса, OwnerDemo, который иллюстрирует, как создать дерево монопольных использований. Этот класс имеет два компонента данных, простое целое число, чтобы представить нормальные данные, и жесткое монопольное использование компонент данных ИДЕНТИФИКАТОРА, чтобы провести{*держать*} объект ID находящегося в собственности объекта. Функции
Обеспечиваются для получения и установки значений обоих компонентов данных.
Пример также отменяет четыре требуемых виртуальных функции:
dwgInFields(), dwgOutFields(), dxfInFields(), и dxfOutFields().
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


