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

ADN Club => AutoCAD .NET API => Тема начата: Алексей Терно от 12-03-2023, 21:58:51

Название: сбрасывается привязка в DrawJig
Отправлено: Алексей Терно от 12-03-2023, 21:58:51
Всем привет!
Необходимо определить координаты точки с учетом привязки. Делаю я это с помощью DrawJig+PointMonitor. Всё работает вроде хорошо, но я заметил одну особенность - во время выполнения команды определяются координаты с учётом привязки, но если ничего не делать в течение примерно одной секунды, то координаты сбрасываются на реальные координаты курсора, хотя привязка всё ещё активна и её маркер отображается:


Это такая особенность команды или я где-то упустил какие-то настройки?

Вот код:
Код - C# [Выбрать]
  1. internal class _testJigClass : DrawJig
  2. {
  3.     internal Point3d Point;
  4.  
  5.     private string message;
  6.     private Point3d SnapedPoint;
  7.     private Editor ed;
  8.  
  9.     internal _testJigClass(string _mess)
  10.     {
  11.         message = _mess;
  12.  
  13.         ed = Application.DocumentManager.MdiActiveDocument.Editor;
  14.         ed.PointMonitor += new PointMonitorEventHandler(ed_PointMonitor);
  15.     }
  16.  
  17.     protected override SamplerStatus Sampler(JigPrompts prompts)
  18.     {
  19.         JigPromptPointOptions opt_point = new JigPromptPointOptions(message)
  20.         {
  21.             UserInputControls = UserInputControls.Accept3dCoordinates
  22.         };
  23.  
  24.         PromptPointResult res_point = prompts.AcquirePoint(opt_point);
  25.  
  26.         if (res_point.Status == PromptStatus.OK)
  27.             Point = SnapedPoint;
  28.  
  29.         return SamplerStatus.OK;
  30.     }
  31.  
  32.     protected override bool WorldDraw(WorldDraw draw)
  33.     {
  34.         if (draw.Geometry != null)
  35.             ed.WriteMessage("\n" + Point.X.ToString("0.000"));
  36.  
  37.         return true;
  38.     }
  39.  
  40.     private void ed_PointMonitor(object sender, PointMonitorEventArgs e)
  41.     {
  42.         SnapedPoint = e.Context.ComputedPoint;
  43.     }
  44. }
  45.  
Название: Re: сбрасывается привязка в DrawJig
Отправлено: Александр Ривилис от 13-03-2023, 21:27:11
Алексей Терно,
Посмотри свойство e.Context.ObjectSnappedPoint вместо e.Context.ComputedPoint в случае если e.Context.pointComputed == true и e.Context.History & PointHistoryBits.ObjectSnapped не равно нулю.
Название: Re: сбрасывается привязка в DrawJig
Отправлено: Алексей Терно от 13-03-2023, 21:49:48
Если я правильно понял, то код должен получиться такой:
Код - C# [Выбрать]
  1. void ed_PointMonitor(object sender, PointMonitorEventArgs e)
  2. {
  3.     if (e.Context.PointComputed && e.Context.History == PointHistoryBits.ObjectSnapped)
  4.         SnapedPoint = e.Context.ObjectSnappedPoint;
  5.     else
  6.         SnapedPoint = e.Context.ComputedPoint;
  7. }
  8.  

В таком виде результат абсолютно такой же, хотя e.Context.ObjectSnappedPoint само по себе стабильно держит привязку и не сбрасывается. Я понял в каком направлении изучать, на днях попробую найти решение. Как будет решение, отпишусь )

Спасибо!
Название: Re: сбрасывается привязка в DrawJig
Отправлено: Александр Ривилис от 13-03-2023, 23:01:46
Скорее как-то так:
Код - C# [Выбрать]
  1. void ed_PointMonitor(object sender, PointMonitorEventArgs e)
  2. {
  3.     if (e.Context.PointComputed && (e.Context.History & PointHistoryBits.ObjectSnapped) > 0)
  4.         SnapedPoint = e.Context.ObjectSnappedPoint;
  5.     else
  6.         SnapedPoint = e.Context.ComputedPoint;
  7. }
  8.  
Название: Re: сбрасывается привязка в DrawJig
Отправлено: Алексей Терно от 13-03-2023, 23:09:55
К сожалению, изменений нет (
В ближайшие дни поэкспериментирую ))
Название: Re: сбрасывается привязка в DrawJig
Отправлено: alz от 20-06-2023, 09:34:20
Тоже столкнулся с этой проблемой
Проблема, если не двигать курсор то pointmonitor теряет привязку
Решение получилось такое:
Создаем переменную Point3d для хранения предыдущего положения, полученного не через PointMonitor а через jigRes.Value
Если при следующей итерации текущий  jigRes.Value совпадает с сохраненным значением прошлой итерации, то есть курсор не двигался, то отсылаем статуc SamplerStatus.NoChange и вообще не берем координаты, полученные от PointMonitor и пофиг что внутри PointMonitor  отвалилась привязка и пришли другие координаты.