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

ADN Club => ObjectARX => Тема начата: Gennadiy от 06-05-2015, 14:58:55

Название: Не отображается как Proxy
Отправлено: Gennadiy от 06-05-2015, 14:58:55
Добрый день.

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

Код - C++ [Выбрать]
  1. Adesk::Boolean AdskContainerEntity::subWorldDraw (AcGiWorldDraw *mode)
  2. {
  3.         assertReadEnabled () ;
  4.         if (m_pPolyline)
  5.         {
  6.                 int end = m_pPolyline->numVerts() - 1;
  7.                 for (int i = 0; i < end; i++)
  8.                 {
  9.                         // Здесь устанавливаю нужный мне цвет для сегмента
  10.                         //...
  11.                         mode->rawGeometry()->pline(*m_pPolyline, i, 1);
  12.                 }
  13.         }
  14.         return (AcDbEntity::subWorldDraw (mode)) ;
  15. }
  16.  

Все работает как нужно, но проблема в том, что когда примитив отображается как Proxy (не загружено приложение), то он невидим.

Если же рисовать полилинию целиком

Код - C++ [Выбрать]
  1. Adesk::Boolean AdskContainerEntity::subWorldDraw (AcGiWorldDraw *mode)
  2. {
  3.         assertReadEnabled () ;
  4.         if (m_pPolyline)
  5.         {
  6.                 mode->geometry().pline(*m_pPolyline);
  7.         }
  8.         return (AcDbEntity::subWorldDraw (mode)) ;
  9. }
  10.  

Здесь как Proxy отображается правильно.

В чем может быть проблема?

P.S. Сразу скажу, что пробовал рисовать свою полилинию последовательными кусками при  помощи
AcGiGeometry::polyline и AcGiGeometry::circularArc в зависимости от типа участка, здесь все нормально, но
я от него отказался, так как возникают другие проблемы (криво срабатывает привязка к нормали)
Название: Re: Не отображается как Proxy
Отправлено: Александр Ривилис от 06-05-2015, 15:52:57
Попробуй переопределить метод AcDbEntity::saveAs
Название: Re: Не отображается как Proxy
Отправлено: Gennadiy от 06-05-2015, 16:07:13
Попробуй переопределить метод AcDbEntity::saveAs

Сейчас у меня так

Код - C++ [Выбрать]
  1. void AdskContainerEntity::saveAs(AcGiWorldDraw* mode, AcDb::SaveType st)
  2. {
  3.         if (m_pPolyline) m_pPolyline->saveAs(mode, st);
  4.         if (mode->regenType() == kAcGiSaveWorldDrawForProxy)    this->subWorldDraw(mode);
  5. }

Что здесь можно изменить?
Название: Re: Не отображается как Proxy
Отправлено: Александр Ривилис от 06-05-2015, 16:18:17
Это заменить:
Код - C++ [Выбрать]
  1. if (m_pPolyline) m_pPolyline->saveAs(mode, st);
на другой вариант сохранения:
Код - C++ [Выбрать]
  1. if (AcDb::kR13Save==st) {
  2. // Раскладываем полилинию на сегменты и вызываем в зависимости от типа:
  3. // mode->geometry().circularArc(...)
  4. // или
  5. // mode->geometry().polyline(...)
  6. }
Название: Re: Не отображается как Proxy
Отправлено: Gennadiy от 06-05-2015, 16:38:47
Точно, как я сразу не сообразил!
Мне в Proxy вовсе и не нужно чтобы отображалось разными цветами, поэтому сделал так

Код - C++ [Выбрать]
  1. Adesk::Boolean AdskContainerEntity::subWorldDraw (AcGiWorldDraw *mode)
  2. {
  3.         assertReadEnabled();
  4.         if (m_pPolyline)
  5.         {
  6.                 if (mode->regenType() != kAcGiSaveWorldDrawForProxy)
  7.                 {
  8.                         int end = m_pPolyline->numVerts() - 1;
  9.                         for (int i = 0; i < end; i++)
  10.                         {
  11.                                 // Здесь устанавливаю нужный мне цвет для сегмента
  12.                                 //...
  13.                                 mode->geometry().pline(*m_pPolyline, i, 1);
  14.                         }
  15.                 }
  16.                 else    mode->geometry().pline(*m_pPolyline);
  17.         }
  18.         return (AcDbEntity::subWorldDraw (mode)) ;
  19. }

Спасибо за подсказку.