Копия AcDbRegion или AcDb3dSolid равна NULL при перетаскивании
Вопрос:
Если я наследую новый класс от AcDbRegion или AcDb3dSolid то его метод isNull() возвращает true если этот экземпляр перетаскивается. Как я могу обойти эту проблему?
Ответ:
Во время перетаскивания, AutoCAD создает новую копию объекта каждый раз, когда мышь перемещается, для того чтобы сохранить точность. Это создает проблемы в случае примитивов, чьи операции копирования занимают длительное время. AcDb3dSolid и AcDbRegion – это два именно таких примитива и их операции копирования оптимизируются во время перетаскивания так, чтобы копировать только графический кэш, а не исходные ACIS-данные.
Если вам нужны исходные ACIS-данные, примитив должен обнаружить факт того не перетаскивается ли он, скопировать себя и сохранить указатель на копию в исходном примитиве для доступа к ACIS-данным.
Например, если примитив наследует AcDbRegion, тогда он должен иметь следующую переменную:
И реализовать свой метод copyFrom() таким вот образом:
- Acad::ErrorStatus MyEntity::copyFrom(const AcRxObject* pOther){
- assertWriteEnabled();
- Acad::ErrorStatus es = AcDbRegion::copyFrom(pOther);
- if( es!=Acad::eOk ){
- return es;
- }
- // Определим, что мы потеряли свое представление
- AcDbRegion* pSheet = AcDbRegion::cast(pOther);
- if (pSheet && isNull() && !pSheet->isNull())
- m_pDraggedInstance = pSheet;
- }
- return Acad::eOk;
- }
Теперь можно использовать указатель m_pDraggedInstance для доступа к исходной области (примитиву AcDbRegion) в копии, создаваемой при перетаскивании.
Обсуждение: http://adn-cis.org/forum/index.php?topic=38.0
Отредактировано 06.06.2013 в 00:24:01