Рисование горизонтального текста в собственном примитиве
Вопрос:
Как рисовать текст в собственном примитиве, который будет всегда горизонтальным вне зависимости от направления вида и поворота при печати?
Ответ:
Вы можете использовать метод AcGiViewport::getCameraUpVector() чтобы получить вектор, направленный вверх для текущего вида. Имея этот вектор вы легко можете получить направление для отрисовки горизонтального текста в этом виде.
При печати нужно принять во внимание поворот при печати. При печати чертеж поворачивается в зависимости от ориентации чертежа (Книжная или Альбомная)
Конечно, это может быть осуществлено только в методе viewportDraw(), переопределенном в вашем классе примитива, так как только здесь и рисуется, зависимая от конкретного видового порта, графика. В следующем примере показано, как это реализовать:
- void AsdkcusEnt::viewportDraw(AcGiViewportDraw * mode)
- {
- // рисует текст
- AcGeVector3d vecUp;
- mode->viewport().getCameraUpVector(vecUp);
- AcGeVector3d vecFlow = vecUp.crossProduct(
- mode->viewport().viewDir());
- // проверяем контекст
- if (mode->context()->isPlotGeneration())
- {
- // Получаем конфигурацию печати для текущего листа
- AcApLayoutManager *pLayMan = (AcApLayoutManager *)
- acdbHostApplicationServices()->layoutManager();
- AcDbLayout *pLay = pLayMan->findLayoutNamed(
- pLayMan->findActiveLayout(Adesk::kTrue),Adesk::kTrue);
- // Проверяем печать повёрнутая или нет
- double pi = 3.14159265;
- switch(pLay->plotRotation())
- {
- case AcDbPlotSettings::PlotRotation::k90degrees:
- vecFlow.rotateBy(-pi/2,mode->viewport().viewDir());
- break;
- case AcDbPlotSettings::PlotRotation::k180degrees:
- vecFlow.rotateBy(pi,mode->viewport().viewDir());
- break;
- case AcDbPlotSettings::PlotRotation::k270degrees:
- vecFlow.rotateBy(pi/2,mode->viewport().viewDir());
- break;
- }
- pLay->close();
- mode->geometry().text(
- AcGePoint3d(10,10,0),
- mode->viewport().viewDir(),
- vecFlow, 10, 1, 0,
- L"ТЕСТ");
- }
- else
- {
- mode->geometry().text(
- AcGePoint3d(10,10,0),
- mode->viewport().viewDir(),
- vecFlow, 10, 1, 0,
- L"ТЕСТ");
- }
- AcDbEntity::viewportDraw(mode);
- }
Источник: http://adndevblog.typepad.com/autocad/2012/08/draw-horizontal-text-in-custom-entity.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=80.0
Отредактировано 08.06.2013 в 02:12:07