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



         

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


Wblock не следует за жесткими ссылками указателя поперек баз данных. Однако, таблица перекрестных ссылок связывает, делает это все время. Например, примитив в рисунке таблицы перекрестных ссылок может быть на VISRETAIN уровне в ведущем рисунке. Так, если Вы осуществляете, ваш wblockClone () с циклом, чтобы проверить подобъекты, и базу данных подобъекта - не тот же самый как таковой клонируемого объекта, Вы должны пропустить подобъект, если клонируемый контекст - не AcDb:: kDcXrefBind. Например:

if(pSubObject->database() != database() && idMap.deepCloneContext() != AcDb::kDcXrefBind)

{

pSubObject->close();

continue;

}

Следующие показы кода, перегружающие wblockClone () чтобы осуществить это для заказного примитива (AsdkPoly). Эта функция вызвана с кодом, показанным в “ Редактор Функции Уведомления Реактора ” на странице 504.

Acad::ErrorStatus

AsdkPoly::wblockClone(AcRxObject* pOwner,

AcDbObject*& pClonedObject,

AcDbIdMapping& idMap,

Adesk::Boolean isPrimary) const

{

// You should always pass back pClonedObject == NULL

// if, for any reason, you do not actually clone it

// during this call. The caller should pass it in

// as NULL, but to be safe, it is set here as well.

//

pClonedObject = NULL;

// If this is a fast wblock operation, no cloning

// should take place, so we simply call the base class’s

// wblockClone() and return whatever it returns.

//

// For fast wblock, the source and destination databases

// are the same, so we can use that as the test to see

// if a fast wblock is in progress.

//

AcDbDatabase *pDest, *pOrig;

idMap.destDb(pDest);

idMap.origDb(pOrig);

if (pDest == pOrig)

return AcDbCurve::wblockClone(pOwner, pClonedObject, idMap, isPrimary);

// If this is an xref bind operation and this AsdkPoly

// entity is in paper space, then we don’t want to

// clone because xref bind doesn’t support cloning

// entities in paper space. Simply return Acad::eOk.

//

static AcDbObjectId pspace = AcDbObjectId::kNull;




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