Определение координат в статусбаре AutoCAD при помощи .NET
Мы столкнулись с этой задачей во время внутреннего обсуждения, и я думаю, что этим стоит здесь поделиться. Достаточно просто использовать класс PointMonotor в AutoCAD, чтобы определить текущее местоположение курсора, но, как мы убедиться, что точка в текущей пользовательской системе координат (ПСК), и что мы учитываем объектные привязки (OSNAP)?Для простоты кода я добавил обработчик события как лямбда, не беспокоясь о его удаления. Кроме того, чтобы избежать аварии, когда вы переключаетесь на страницу новой вкладки или нового документа и обратно, код проглатывает исключение eNotApplicable, которое производит Editor.WriteMessage () - что вероятно не понадобится, так как вы, скорее всего, в такой ситуации предпочли бы вывести координаты куда-то в другое место, а не в командную строку.
Вот код C# реализации команды (CC), которая печатает в командной строке координаты, соответствующие тем, которые появляются в статусбаре:
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Runtime;
- namespace DisplayCoords
- {
- public class Commands
- {
- [CommandMethod("CC")]
- public void CursorCoords()
- {
- var doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- var ed = doc.Editor;
- ed.PointMonitor += (s, e) =>
- {
- var ed2 = (Editor)s;
- if (ed2 == null) return;
- // Если это вызов только для того, чтобы установить последнюю точку – игнорируем его
- if (e.Context.History == PointHistoryBits.LastPoint)
- return;
- // Получаем инверсную матрицу ПСК для показа координат в ПСК
- var ucs = ed2.CurrentUserCoordinateSystem.Inverse();
- // Проверяем не «привязана» ли точка
- var snapped = (e.Context.History & PointHistoryBits.ObjectSnapped) > 0;
- // Преобразуем «привязанную» или «вычисленную» точку в текущую ПСК
- var pt =
- (snapped ?
- e.Context.ObjectSnappedPoint :
- e.Context.ComputedPoint).TransformBy(ucs);
- // Печатаем точку по каждой из координат с 4-мя знаками после запятой
- try
- {
- ed2.WriteMessage("{0}: {1:F4}\n", snapped ? "Snapped" : "Found", pt);
- }
- catch (Autodesk.AutoCAD.Runtime.Exception ex)
- {
- if (ex.ErrorStatus != ErrorStatus.NotApplicable)
- throw;
- }
- };
- }
- }
- }
А вот и видео этого действия:
Чтобы действительно протестировать этот код, я предлагаю, выполнив команду CC, а затем изменить текущую ПСК, чтобы она соответствовала произвольному 3D-виду, создать некоторую геометрию и включить привязки. Вы должны увидеть, что и в командной строке и в статусбаре всегда одни и те же значения. (Пожалуйста, дайте мне знать, если это окажется не так).
Обсуждение: http://adn-cis.org/forum/index.php?topic=3300
Опубликовано 25.12.2015Отредактировано 25.12.2015 в 13:42:19