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

13/06/2013

Временная графика в AutoCAD

Часто бывает необходимо визуально увидеть результаты наших геометрических вычислений. В составе ObjectARX и AutoCAD .NET API есть несколько методов, которые очень удобно использовать при таком сценарии. Одним из методом является использование API транзитной графики, но в этой статье мы познакомимся с другим путём – использованием низкоуровневых графических методов, такие как функция acedGrVecs и ее эквивалент в .NET API DrawVectors. Вот пример кода, который рисует вектор и его зеркальное отражение относительно оси X. Зумирование и регенерация чертежа удаляют временную графику. Как указано в документации ObjectARX, так как эти методы основаны на графической системе, возможны некоторые изменения в их поведении между версиями AutoCAD. Пожалуйста, убедитесь, что вы проверили ваши приложения со всеми версиями AutoCAD, с которыми ваше приложение должно работать.

 

Вот версия ObjectARX:

 

Код - C++: [Выделить]
  1. ads_point fromPt;
  2. int rc = acedGetPoint(NULL, _T("\nУкажите первую точку: "), fromPt);
  3. if(rc != RTNORM)
  4.     return;
  5. ads_point toPt;
  6. rc = acedGetPoint(NULL, _T("\nУкажите вторую точку: "), toPt);
  7. if(rc != RTNORM)
  8.     return;
  9. int colorIndex = 2;
  10.  // Вычисляем зеркальный вектор
  11. ads_point fromPtMirror;
  12. ads_point_set(fromPt, fromPtMirror);
  13. fromPtMirror[1] *= -1.0;
  14.  ads_point toPtMirror;
  15. ads_point_set(toPt, toPtMirror);
  16. toPtMirror[1] *= -1.0;
  17. struct resbuf  *vlist;
  18. // Создаём ResBuf
  19. vlist = acutBuildList(   
  20.                     RTSHORT, colorIndex,   // Цвет
  21.                     RTPOINT, fromPt,       // Настоящий вектор
  22.                     RTPOINT, toPt,
  23.                     RTPOINT, fromPtMirror, // Зеркальный вектор
  24.                     RTPOINT, toPtMirror,
  25.                     RTNONE);
  26. // Используем метод для создания временной графики.
  27. // NULL – без матрицы трансформации
  28. rc = acedGrVecs(vlist, NULL);
  29. // Очищаем ResBuf
  30. acutRelRb(vlist);

А это эквивалентный код с использованием AutoCAD .NET API :

Код - C#: [Выделить]
  1.  
  2. Document activeDoc =
  3. Application.DocumentManager.MdiActiveDocument;
  4. Editor ed = activeDoc.Editor;
  5.  
  6. PromptPointResult ppr1 = ed.GetPoint("\nУкажите первую точку: ");
  7. if (ppr1.Status != PromptStatus.OK)
  8. return;
  9.  
  10. PromptPointResult ppr2 = ed.GetPoint("\nУкажите вторую точку: ");
  11. if (ppr2.Status != PromptStatus.OK)
  12. return;
  13.  
  14. Point3d sp = ppr1.Value;
  15. Point3d ep = ppr2.Value;
  16.  
  17. int colorIndex = 1;
  18.  
  19. using (ResultBuffer resBuf = new ResultBuffer()) {
  20.   resBuf.Add(new TypedValue((int)LispDataType.Int16, colorIndex));
  21.  
  22.   // Исходный вектор
  23.   resBuf.Add(new TypedValue((int)LispDataType.Point2d,
  24.     new Point2d(sp.X, sp.Y))
  25.     );
  26.  
  27.   resBuf.Add(new TypedValue((int)LispDataType.Point2d,
  28.     new Point2d(ep.X, ep.Y))
  29.     );
  30.  
  31.   // и зеркальный относительно оси X вектор
  32.   resBuf.Add(new TypedValue((int)LispDataType.Point2d,
  33.     new Point2d(sp.X, -sp.Y))
  34.     );
  35.  
  36.   resBuf.Add(new TypedValue((int)LispDataType.Point2d,
  37.     new Point2d(ep.X, -ep.Y))
  38.     );
  39.  
  40.   ed.DrawVectors(resBuf, Matrix3d.Identity);
  41. }
  42.  

Источник: http://adndevblog.typepad.com/autocad/2012/04/temporary-graphics-in-autocad.html

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

Опубликовано 13.06.2013
Отредактировано 15.06.2013 в 15:42:18