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



         

Обработка жестких ссылок к AcDbEntities в течение WblockClone (): СЛУЧАЙ 1


Если обращение и упомянутые примитивы всегда существуют в том же самом AcDbBlockTableRecord, это достаточно для обращающегося перегруженного примитива wblock () чтобы отправить isPrimary, оценивают полученное, чтобы вызвать wblock упомянутого примитива (). Это воспользуется преимуществом заданного по умолчанию поведения из всех трех форм WBLOCK, как отмечено в предыдущей секции. Мы не должны быть обеспокоены, с которым тип WBLOCK встречается.

Имеются два способа перегрузить заданное по умолчанию поведение клона wblock для этого случая. Сначала, Вы могли записывать поверх полный wblockClone () для обращающегося примитива. В типовом коде для заданного по умолчанию выполнения wblockClone () (в предыдущей секции), вы будете видеть цикл на getNextHardObject (). В пределах этого цикла Вы были бы должны прервать упомянутый объект ID и изменять значение isPrimary от Adesk:: kFalse, чтобы быть тем же самый, поскольку значение isPrimary прошло в.

Однако, намного более простой способ делать это состоит в том, чтобы продолжить использовать по умолчанию wblockClone () для вашего заказного примитива, но клонировать упомянутый примитив сначала, с правильными назначениями, когда настройка по умолчанию isPrimary не была бы правильна. Как только вы клонировали упомянутый примитив, когда Вы вызываете ваш собственный wblockClone (), это будет видеть, что упомянутый примитив уже клонирован и не будет пытаться клонировать это, используя настройки по умолчанию. Следующая выборка демонстрирует это. Компонент данных, mRefEnt, является ссылкой AcDbHardPointerId.

Acad::ErrorStatus

AsdkEntity::wblockClone(AcRxObject* pOwner,

AcDbObject*& pClone,

AcDbIdMapping& idMap,

Adesk::Boolean isPrimary) const

{

// If isPrimary is kTrue, then override the default cloning

// within our own cloning, which would set it to kFalse,

// by cloning our referenced entity first.

//

if (isPrimary) {

Acad::ErrorStatus es;

AcDbEntity* pEnt;

es = acdbOpenAcDbEntity(pEnt, mRefEnt, AcDb::kForRead);




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