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

30/05/2013

Рисование горизонтального текста в собственном примитиве

Вопрос:

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

Ответ:

Вы можете использовать метод AcGiViewport::getCameraUpVector() чтобы получить вектор, направленный вверх для текущего вида. Имея этот вектор вы легко можете получить направление для отрисовки горизонтального текста в этом виде.

При печати нужно принять во внимание поворот при печати. При печати чертеж поворачивается в зависимости от ориентации чертежа (Книжная или Альбомная)

Конечно, это может быть осуществлено только в методе viewportDraw(), переопределенном в вашем классе примитива, так как только здесь и рисуется, зависимая от конкретного видового порта, графика. В следующем примере показано, как это реализовать:

Код - C++: [Выделить]
  1. void AsdkcusEnt::viewportDraw(AcGiViewportDraw * mode)
  2. {
  3.        // рисует текст
  4.        AcGeVector3d vecUp;
  5.        mode->viewport().getCameraUpVector(vecUp);
  6.  
  7.        AcGeVector3d vecFlow = vecUp.crossProduct(
  8.         mode->viewport().viewDir());
  9.  
  10.        // проверяем контекст
  11.        if (mode->context()->isPlotGeneration())
  12.        {
  13.               // Получаем конфигурацию печати для текущего листа
  14.               AcApLayoutManager *pLayMan = (AcApLayoutManager *)
  15.                 acdbHostApplicationServices()->layoutManager();
  16.  
  17.               AcDbLayout *pLay = pLayMan->findLayoutNamed(
  18.                 pLayMan->findActiveLayout(Adesk::kTrue),Adesk::kTrue);
  19.  
  20.               // Проверяем печать повёрнутая или нет
  21.               double pi = 3.14159265;
  22.  
  23.               switch(pLay->plotRotation())
  24.               {
  25.               case AcDbPlotSettings::PlotRotation::k90degrees:
  26.                      vecFlow.rotateBy(-pi/2,mode->viewport().viewDir());
  27.                      break;
  28.  
  29.               case AcDbPlotSettings::PlotRotation::k180degrees:
  30.                      vecFlow.rotateBy(pi,mode->viewport().viewDir());
  31.                      break;
  32.  
  33.               case AcDbPlotSettings::PlotRotation::k270degrees:
  34.                      vecFlow.rotateBy(pi/2,mode->viewport().viewDir());
  35.                      break;
  36.               }
  37.  
  38.               pLay->close();
  39.  
  40.               mode->geometry().text(
  41.                 AcGePoint3d(10,10,0),
  42.                 mode->viewport().viewDir(),
  43.                 vecFlow, 10, 1, 0,
  44.                 L"ТЕСТ");
  45.        }
  46.        else
  47.        {
  48.               mode->geometry().text(
  49.                 AcGePoint3d(10,10,0),
  50.                 mode->viewport().viewDir(),
  51.                 vecFlow, 10, 1, 0,
  52.                 L"ТЕСТ");
  53.        }
  54.  
  55.        AcDbEntity::viewportDraw(mode);
  56. }

Источник: http://adndevblog.typepad.com/autocad/2012/08/draw-horizontal-text-in-custom-entity.html

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

Опубликовано 30.05.2013
Отредактировано 08.06.2013 в 02:12:07