Тема: При копировании обьекта содержимое буфера отображается на чертеже.

Добрый день.
Переопределяю метод subDeepClone в своем макрообьекте.

virtual Acad::ErrorStatus subDeepClone(AcDbObject* pOwnerObject,AcDbObject*& pClonedObject,AcDbIdMapping& idMap,Adesk::Boolean isPrimary = true) const
{            
  Acad::ErrorStatus retCode = AcDbObject::subDeepClone(pOwnerObject,pClonedObject,idMap,isPrimary);
  return (retCode);
}

Проблема в том, что при нажатии кнопки "вставить" до того, как пользователь выбрал место вставки,обьект "из буфера" отображается на чертеже с нулевыми координатами.

Как я понял, происходит это из за того что функция subDeepClone вызывается два раза (для обьекта в буфере и для обьекта на чертеже)

Как можно избежать отображения "буферного" обьекта на чертеже?

Re: При копировании обьекта содержимое буфера отображается на чертеже.

Олег Бевз пишет:

Проблема в том, что при нажатии кнопки "вставить" до того, как пользователь выбрал место вставки,обьект "из буфера" отображается на чертеже с нулевыми координатами.

А с нормальными координатами тоже отображается?

Олег Бевз пишет:

Как можно избежать отображения "буферного" обьекта на чертеже?

Попробуй проанализировать какие параметры передаются в твой метод subDeepClone. Может быть по ним поймешь, какой из вызовов следует проигнорировать.
И еще попутный вопрос. А почему в методе ты вызываешь AcDbObject::subDeepClone, а не AcDbEntity::subDeepClone? От какого класса унаследован твой класс?

(изменено: Олег Бевз, 30 ноября 2010г. 08:02:17)

Re: При копировании обьекта содержимое буфера отображается на чертеже.

1. Заменил AcDbObject::subDeepClone на AcDbEntity::subDeepClone. (Хотя как я понял метод subDeepClone AcDbEntity наследует от AcDbObject)

2.Нашел за что можно зацепится:

virtual Acad::ErrorStatus subDeepClone(AcDbObject* pOwnerObject,AcDbObject*& pClonedObject,AcDbIdMapping& idMap,Adesk::Boolean isPrimary = true) const
{
  if (acDocManager->curDocument()->database() != this->database())
    return Acad::eOk;        
  Acad::ErrorStatus retCode = AcDbEntity::subDeepClone(pOwnerObject,pClonedObject,idMap,isPrimary);

        
  return (retCode);
}

Если функция будет проигнорирована при первом вызове, то и второго вызова не будет, то есть обьект не будет копирован.
Если функция будет проигнорирована при втором вызове, то выработается исключение.

Наверное есть какой то другой способ...

(изменено: Олег Бевз, 30 ноября 2010г. 20:49:42)

Re: При копировании обьекта содержимое буфера отображается на чертеже.

Пока что помогло следующее:

mutable bool m_bIsBuffered;
Acad::ErrorStatus subDeepClone( AcDbObject* pOwnerObject,AcDbObject*& pClonedObject,AcDbIdMapping& idMap,Adesk::Boolean isPrimary /*= true*/ ) const
{
    if (acDocManager->curDocument()->database() != this->database())
        m_bIsBuffered = true;
    else
        m_bIsBuffered = false;
         
    Acad::ErrorStatus retCode = AcDbObject::subDeepClone(pOwnerObject,pClonedObject,idMap,isPrimary);
    return (retCode);
}
virtual Adesk::Boolean subWorldDraw(AcGiWorldDraw* pWd)
{
    if (m_bIsBuffered) 
    return Adesk::kTrue;
    assertReadEnabled();
    Adesk::Boolean res = AcDbEntity::subWorldDraw(pWd);
    return res;
}