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

25/12/2015

Определение координат в статусбаре AutoCAD при помощи .NET

Мы столкнулись с этой задачей во время внутреннего обсуждения, и я думаю, что этим стоит здесь поделиться. Достаточно просто использовать класс PointMonotor в AutoCAD, чтобы определить текущее местоположение курсора, но, как мы убедиться, что точка в текущей пользовательской системе координат (ПСК), и что мы учитываем объектные привязки (OSNAP)?

Для простоты кода я добавил обработчик события как лямбда, не беспокоясь о его удаления. Кроме того, чтобы избежать аварии, когда вы переключаетесь на страницу новой вкладки или нового документа и обратно, код проглатывает исключение eNotApplicable, которое производит Editor.WriteMessage () - что вероятно не понадобится, так как вы, скорее всего, в такой ситуации предпочли бы вывести координаты куда-то в другое место, а не в командную строку.

Вот код C# реализации команды (CC), которая печатает в командной строке координаты, соответствующие тем, которые появляются в статусбаре:

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.Runtime;
  4.  
  5. namespace DisplayCoords
  6. {
  7.   public class Commands
  8.   {
  9.     [CommandMethod("CC")]
  10.     public void CursorCoords()
  11.     {
  12.       var doc = Application.DocumentManager.MdiActiveDocument;
  13.       if (doc == null) return;
  14.       var ed = doc.Editor;
  15.  
  16.       ed.PointMonitor += (s, e) =>
  17.         {
  18.           var ed2 = (Editor)s;
  19.           if (ed2 == null) return;
  20.  
  21.           // Если это вызов только для того, чтобы установить последнюю точку – игнорируем его
  22.  
  23.           if (e.Context.History == PointHistoryBits.LastPoint)
  24.             return;
  25.  
  26.           // Получаем инверсную матрицу ПСК для показа координат в ПСК
  27.  
  28.           var ucs = ed2.CurrentUserCoordinateSystem.Inverse();
  29.  
  30.           // Проверяем не «привязана» ли точка
  31.  
  32.           var snapped = (e.Context.History & PointHistoryBits.ObjectSnapped) > 0;
  33.  
  34.           // Преобразуем «привязанную» или «вычисленную» точку в текущую ПСК
  35.  
  36.           var pt =
  37.             (snapped ?
  38.               e.Context.ObjectSnappedPoint :
  39.               e.Context.ComputedPoint).TransformBy(ucs);
  40.  
  41.           // Печатаем точку по каждой из координат с 4-мя знаками после запятой
  42.  
  43.           try
  44.           {
  45.             ed2.WriteMessage("{0}: {1:F4}\n", snapped ? "Snapped" : "Found", pt);
  46.           }
  47.           catch (Autodesk.AutoCAD.Runtime.Exception ex)
  48.           {
  49.             if (ex.ErrorStatus != ErrorStatus.NotApplicable)
  50.               throw;
  51.           }
  52.         };
  53.     }
  54.   }
  55. }

 

А вот и видео этого действия:

Чтобы действительно протестировать этот код, я предлагаю, выполнив команду CC, а затем изменить текущую ПСК, чтобы она соответствовала произвольному 3D-виду, создать некоторую геометрию и включить привязки. Вы должны увидеть, что и в командной строке и в статусбаре всегда одни и те же значения. (Пожалуйста, дайте мне знать, если это окажется не так).

 

Источник: http://through-the-interface.typepad.com/through_the_interface/2015/12/determining-autocads-status-bar-coordinates-using-net.html

 

Автор перевода: Александр Ривилис

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

Опубликовано 25.12.2015
Отредактировано 25.12.2015 в 13:42:19