Использование AcGsView, AcGsManager, AcGsGraphicsKernel

Автор Тема: Использование AcGsView, AcGsManager, AcGsGraphicsKernel  (Прочитано 7006 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
Нужна возможность показать пользователю графический объект (или элемент графического объекта) на чертеже.

Пользователю предоставлена возможность из редактора данных графического объекта показать точку на нем.
До этого в своем CustomEntity в worldDraw рисовал крест с двух AcDbXline.
Но тут проблема в том, что такое "выделение" ломает работу Undo/Redo, хотя пользователь просто хотел увидеть объект на чертеже, а само Entity не изменилось.

Решил сделать такое «выделение» через AcGsView. Вот пример моего кода в команде:


Код - C++ [Выбрать]
  1.             // Получаем номер текущего вида
  2.                                 struct  resbuf  rb;
  3.                                 int  rt = acedGetVar(_T("CVPORT"), &rb);
  4.                                 if (rt != RTNORM){
  5.                                         acutPrintf(_T("\nОшибка ! "));
  6.                                         return;
  7.                                 }
  8.                                 int  vportNum = rb.resval.rint;
  9.                                 AcGsView *pAutoCADView = acgsGetCurrent3dAcGsView(vportNum);
  10.                                 if (pAutoCADView == NULL){                                     
  11.                                         AcGsKernelDescriptor desc;
  12.                                         desc.addRequirement( AcGsKernelDescriptor::k3DDrawing );
  13.                                         pAutoCADView = acgsObtainAcGsView(vportNum, desc);
  14.                                         if (pAutoCADView == NULL)
  15.                                                 return;
  16.                                 }
  17.  
  18.                                 AcGsManager *gsManager = acgsGetGsManager();
  19.                                 if (!gsManager)
  20.                                         return;
  21.  
  22.                                 if (!descriptor)
  23.                                         descriptor = new AcGsKernelDescriptor();
  24.                                 descriptor->addSupport(AcGsKernelDescriptor::k3DDrawing);
  25.                                 pGraphicsKernel = AcGsManager::acquireGraphicsKernel(*descriptor);
  26.  
  27.                                 if (!pGraphicsKernel)
  28.                                         return;
  29.  
  30.                                 pGsViewModel = gsManager->getDBModel(*pGraphicsKernel);
  31.  
  32.                                
  33.                                 AcDbXline* xGsViewline = new AcDbXline();
  34.                                 xGsViewline->setColorIndex(5);
  35.                                 xGsViewline->setBasePoint(AcGePoint3d(0.0, 0.0, 0.0));
  36.                                 xGsViewline->setSecondPoint(AcGePoint3d(1.0, 0.0, 0.0));
  37.                                 xGsViewline->setLineWeight(AcDb::kLnWt060);
  38.                                 pAutoCADView->add(xGsViewline, pGsViewModel);
  39.                                 AcDbXline* yGsViewline = new AcDbXline();
  40.                                 yGsViewline->setColorIndex(5);
  41.                                 yGsViewline->setBasePoint(AcGePoint3d(0.0, 0.0, 0.0));
  42.                                 yGsViewline->setSecondPoint(AcGePoint3d(0.0, 1.0, 0.0));
  43.                                 yGsViewline->setLineWeight(AcDb::kLnWt060);
  44.                                 pAutoCADView->add(xGsViewline, pGsViewModel);
  45.                                 pAutoCADView->invalidate();
  46.                                 pAutoCADView->update();
  47.                                                

Мои AcDbXLine отображаются, но тут такая проблема что после перемещения вида по чертежу они пропадают, а мне нужно отображать пока пользователь не отключит подсветку.

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

Отмечено как Решение Dziubyna 03-12-2015, 12:53:10

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Мои AcDbXLine отображаются, но тут такая проблема что после перемещения вида по чертежу они пропадают, а мне нужно отображать пока пользователь не отключит подсветку.
Или реактор, в котором перерисовывать или транзитная графика (http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн DziubynaАвтор темы

  • ADN Club
  • Сообщений: 41
  • Карма: 4
  • Skype: andriy.dziubyna
транзитная графика (http://adn-cis.org/ispolzovanie-tranzitnoj-grafiki.html)
Спасибо за подсказку. Буду использовать транзитную графику. До этого не слышал про нее.
А к AcGsGraphicsKernel я уже пробовал подключать AcGsReactor, и AcGsModelReactor к модели. Выходило очень сложно, поэтому остановился и здесь решила написать.
Еще раз спасибо за помощь!