ObjectARX, AutoCAD. Среда программирования библиотеки C++




Перегрузка wblockClone () Функция - часть 2


Сначала, в beginDeepClone () стадия, новая база данных создана и основывать с заданными по умолчанию элементами. Следующий рисунок показывает запись таблицы блоков пространства модели и таблицу уровня, потому что они уместны этому разделу. Клонирование, которое происходит в этой стадии всегда, случается в течение wblock операции.

В beginWblock () стадия, набор выборов клонировался, как показано в следующем рисунке. В этом примере, сфера клонировался.

Поскольку сфера содержит жесткий указатель на Уровень 1, Уровень 1 клонирован.

Затем, указатели должны быть оттранслированы, чтобы отнесится к клонированным объектам, как показано в следующем рисунке. BeginDeepCloneXlation() уведомление указывает начало этой стадии.

Карта ID предыдущего рисунка

KEY

VALUE

isCloned

isPrimary

isOwnerXlated

BTR1

BTR2

TRUE

FALSE

TRUE

SPH1

SPH2

TRUE

TRUE

TRUE

LT1

LT2

TRUE

FALSE

*

LTR1

LTR2

TRUE

FALSE

FALSE†

* Владелец таблицы уровня - база данных непосредственно, так что этот вход бессмысленен.

† В течение трансляции, эта установка указывает, что уровень транслирует его владельца от LayerTable 1 к LayerTable 2.

Процесс клона wblock используется для таблицы перекрестных ссылок, связывают также как wblock. Потребности оба очень похожи, но там - несколько различий, которые требуют специального внимания при перегрузке wblockClone ().

Wblock клонирует все отобранные примитивы. Однако, таблица перекрестных ссылок связывает, никогда не клонирует примитивы, которые находятся в пространстве листа. Это оставляет две вещи рассмотреть при создании объектов или примитивов, и использования AcDbHardPointerIds. Сначала, в начале wblockClone любого AcDbEntity (), выясните, если клонируемый контекст - AcDb:: kDcXrefBind и, если так, клонируется ли примитив в пространстве листа. Если это, то никакое клонирование не должно быть сделано, и wblockClone () должен возвратить Acad:: eOk.

Если ваш класс пользователя имеет любой AcDbHardPointerIds, который может указывать на примитивы (типа, мы делаем с AcDbGroup), то примитивы могли бы быть в пространстве листа и не будут поэтому клонироваться. В таком случае, AcDbHardPointerIds будет установлен в NULL.




Содержание  Назад  Вперед