ADN Open CIS
Сообщество программистов Autodesk в СНГ

24/05/2013

Копия AcDbRegion или AcDb3dSolid равна NULL при перетаскивании

Вопрос:
Если я наследую новый класс от AcDbRegion или AcDb3dSolid то его метод isNull() возвращает true если этот экземпляр перетаскивается. Как я могу обойти эту проблему?

Ответ:
Во время перетаскивания, AutoCAD создает новую копию объекта каждый раз, когда мышь перемещается, для того чтобы сохранить точность. Это создает проблемы в случае примитивов, чьи операции копирования занимают длительное время. AcDb3dSolid и AcDbRegion – это два именно таких примитива и их операции копирования оптимизируются во время перетаскивания так, чтобы копировать только графический кэш, а не исходные ACIS-данные.

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

Например, если примитив наследует AcDbRegion, тогда он должен иметь следующую переменную:

AcDbRegion* m_pDraggedInstance;


И реализовать свой метод copyFrom() таким вот образом:

 

Код - C++: [Выделить]
  1. Acad::ErrorStatus MyEntity::copyFrom(const AcRxObject* pOther){
  2.     assertWriteEnabled();
  3.     Acad::ErrorStatus es = AcDbRegion::copyFrom(pOther);
  4.     if( es!=Acad::eOk ){
  5.         return es;
  6.     }
  7.     // Определим, что мы потеряли свое представление
  8.     AcDbRegion* pSheet = AcDbRegion::cast(pOther);
  9.     if (pSheet && isNull() && !pSheet->isNull())
  10.         m_pDraggedInstance = pSheet;
  11.     }
  12.     return Acad::eOk;
  13. }

Теперь можно использовать указатель m_pDraggedInstance для доступа к исходной области (примитиву AcDbRegion) в копии, создаваемой при перетаскивании.

 

Источник: http://adndevblog.typepad.com/autocad/2013/01/copy-of-acdbregion-or-acdb3dsolid-is-null-during-dragging.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=38.0

Опубликовано 24.05.2013
Отредактировано 06.06.2013 в 00:24:01