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

ADN Club => AutoCAD .NET API => Тема начата: Александр Пекшев aka Modis от 10-11-2018, 19:34:32

Название: Вспомогательная графика в методе MoveGripPointsAt
Отправлено: Александр Пекшев aka Modis от 10-11-2018, 19:34:32
Всем привет. Пытаюсь реализовать ручку объекта, которая будет добавлять к объекту новую точку (Ручка "плюс")
Возникает вопрос - как можно реализовать отрисовку вспомогательной графики при работе метода MoveGripPointsAt? Т.е. есть ли какие-то стандартные способы? Нестандартный у меня уже имеется
Название: Re: Вспомогательная графика в методе MoveGripPointsAt
Отправлено: Александр Ривилис от 10-11-2018, 21:24:03
GripData.ViewportDraw или GripData.WorldDraw подойдут?
Название: Re: Вспомогательная графика в методе MoveGripPointsAt
Отправлено: Александр Пекшев aka Modis от 10-11-2018, 21:33:03
GripData.ViewportDraw или GripData.WorldDraw подойдут?
Если бы все было так просто....
К сожалению, когда мы меняем положение ручки, то сама ручка остается на месте. Т.е. при работе метода ViewportDraw не известно новое положение ручки. А при работе метода MoveGripPointsAt мы как-раз таки знаем значение смещения ручки (параметр offset), но не имеем доступа к WorldDraw

Пока писал, придумал вариант - в моем классе, унаследованном от GripData, создать свойство Offset и при работе метода MoveGripPointsAt передавать значение "в ручку". В общем - попробую, расскажу тогда получилось ли
Название: Re: Вспомогательная графика в методе MoveGripPointsAt
Отправлено: Александр Пекшев aka Modis от 10-11-2018, 22:16:18
Пока писал, придумал вариант - в моем классе, унаследованном от GripData, создать свойство Offset и при работе метода MoveGripPointsAt передавать значение "в ручку". В общем - попробую, расскажу тогда получилось ли
Нет, идея не сработала. Пока работает метод MoveGripPointsAt не вызывается метод GripData.WorldDraw(). Только если в этот момент буду зумировать колесиком мышки - тогда сработает. Как "насильно" заставить вызваться метод GripData.WorldDraw() я не знаю
Название: Re: Вспомогательная графика в методе MoveGripPointsAt
Отправлено: Александр Ривилис от 10-11-2018, 23:20:00
А если попробовать рисовать в PointMonitor?
Название: Re: Вспомогательная графика в методе MoveGripPointsAt
Отправлено: Александр Пекшев aka Modis от 10-11-2018, 23:25:47
А если попробовать рисовать в PointMonitor?
Хорошая идея. Попробую позже - сейчас вылезла другая проблема и наверное придется тему создавать, ибо я не понимаю в чем причина проблемы. Вот только ещё немного отладкой позанимаюсь

Про PointMonitor отпишусь тогда, когда попробую
Название: Re: Вспомогательная графика в методе MoveGripPointsAt
Отправлено: Александр Пекшев aka Modis от 11-11-2018, 01:39:52
А если попробовать рисовать в PointMonitor?
Александр Ривилис, спасибо за идею. Все получилось легко и просто:
Код - C# [Выбрать]
  1. public override void OnGripStatusChanged(ObjectId entityId, Status newStatus)
  2. {
  3.     if (newStatus == Status.GripStart)
  4.     {
  5.         AcadHelpers.Editor.TurnForcedPickOn();
  6.         AcadHelpers.Editor.PointMonitor += AddNewVertex_EdOnPointMonitor;
  7.     }
  8.  
  9.     if (newStatus == Status.GripEnd)
  10.     {
  11.         AcadHelpers.Editor.TurnForcedPickOff();
  12.         AcadHelpers.Editor.PointMonitor -= AddNewVertex_EdOnPointMonitor;
  13.     }
  14.  
  15.     if (newStatus == Status.GripAbort)
  16.     {
  17.         AcadHelpers.Editor.TurnForcedPickOff();
  18.         AcadHelpers.Editor.PointMonitor -= AddNewVertex_EdOnPointMonitor;
  19.     }
  20.  
  21.     base.OnGripStatusChanged(entityId, newStatus);
  22. }
  23.  
  24. private void AddNewVertex_EdOnPointMonitor(object sender, PointMonitorEventArgs pointMonitorEventArgs)
  25. {
  26.     try
  27.     {
  28.         Line leftLine = new Line(GripLeftPoint, pointMonitorEventArgs.Context.ComputedPoint)
  29.         {
  30.             ColorIndex = 150
  31.         };
  32.         pointMonitorEventArgs.Context.DrawContext.Geometry.Draw(leftLine);
  33.  
  34.         if (GripRightPoint.HasValue)
  35.         {
  36.             Line rightLine = new Line(pointMonitorEventArgs.Context.ComputedPoint, GripRightPoint.Value)
  37.             {
  38.                 ColorIndex = 150
  39.             };
  40.             pointMonitorEventArgs.Context.DrawContext.Geometry.Draw(rightLine);
  41.         }
  42.     }
  43.     catch
  44.     {
  45.         // ignored
  46.     }
  47. }