Временная графика в AutoCAD
Часто бывает необходимо визуально увидеть результаты наших геометрических вычислений. В составе ObjectARX и AutoCAD .NET API есть несколько методов, которые очень удобно использовать при таком сценарии. Одним из методом является использование API транзитной графики, но в этой статье мы познакомимся с другим путём – использованием низкоуровневых графических методов, такие как функция acedGrVecs и ее эквивалент в .NET API DrawVectors. Вот пример кода, который рисует вектор и его зеркальное отражение относительно оси X. Зумирование и регенерация чертежа удаляют временную графику. Как указано в документации ObjectARX, так как эти методы основаны на графической системе, возможны некоторые изменения в их поведении между версиями AutoCAD. Пожалуйста, убедитесь, что вы проверили ваши приложения со всеми версиями AutoCAD, с которыми ваше приложение должно работать.
Вот версия ObjectARX:
- ads_point fromPt;
- int rc = acedGetPoint(NULL, _T("\nУкажите первую точку: "), fromPt);
- if(rc != RTNORM)
- return;
- ads_point toPt;
- rc = acedGetPoint(NULL, _T("\nУкажите вторую точку: "), toPt);
- if(rc != RTNORM)
- return;
- int colorIndex = 2;
- // Вычисляем зеркальный вектор
- ads_point fromPtMirror;
- ads_point_set(fromPt, fromPtMirror);
- fromPtMirror[1] *= -1.0;
- ads_point toPtMirror;
- ads_point_set(toPt, toPtMirror);
- toPtMirror[1] *= -1.0;
- struct resbuf *vlist;
- // Создаём ResBuf
- vlist = acutBuildList(
- RTSHORT, colorIndex, // Цвет
- RTPOINT, fromPt, // Настоящий вектор
- RTPOINT, toPt,
- RTPOINT, fromPtMirror, // Зеркальный вектор
- RTPOINT, toPtMirror,
- RTNONE);
- // Используем метод для создания временной графики.
- // NULL – без матрицы трансформации
- rc = acedGrVecs(vlist, NULL);
- // Очищаем ResBuf
- acutRelRb(vlist);
А это эквивалентный код с использованием AutoCAD .NET API :
- Document activeDoc =
- Application.DocumentManager.MdiActiveDocument;
- Editor ed = activeDoc.Editor;
- PromptPointResult ppr1 = ed.GetPoint("\nУкажите первую точку: ");
- if (ppr1.Status != PromptStatus.OK)
- return;
- PromptPointResult ppr2 = ed.GetPoint("\nУкажите вторую точку: ");
- if (ppr2.Status != PromptStatus.OK)
- return;
- Point3d sp = ppr1.Value;
- Point3d ep = ppr2.Value;
- int colorIndex = 1;
- using (ResultBuffer resBuf = new ResultBuffer()) {
- resBuf.Add(new TypedValue((int)LispDataType.Int16, colorIndex));
- // Исходный вектор
- resBuf.Add(new TypedValue((int)LispDataType.Point2d,
- new Point2d(sp.X, sp.Y))
- );
- resBuf.Add(new TypedValue((int)LispDataType.Point2d,
- new Point2d(ep.X, ep.Y))
- );
- // и зеркальный относительно оси X вектор
- resBuf.Add(new TypedValue((int)LispDataType.Point2d,
- new Point2d(sp.X, -sp.Y))
- );
- resBuf.Add(new TypedValue((int)LispDataType.Point2d,
- new Point2d(ep.X, -ep.Y))
- );
- ed.DrawVectors(resBuf, Matrix3d.Identity);
- }
Источник: http://adndevblog.typepad.com/autocad/2012/04/temporary-graphics-in-autocad.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=99.0
Отредактировано 15.06.2013 в 15:42:18