Как включить привязки во время запроса Editor.GetEntity ?

Автор Тема: Как включить привязки во время запроса Editor.GetEntity ?  (Прочитано 2155 раз)

0 Пользователей и 8 Гостей просматривают эту тему.

Отмечено как Решение avc 22-01-2025, 11:48:03

Оффлайн alz

  • ADN OPEN
  • ***
  • Сообщений: 111
  • Карма: 14
Ну я собственно пошел как и все через поиск объектов в точке клика, только, только через немного другой метод что бы весь чертеж не проверять, ну и заодно фильтры что бы работали, вроде работает норм

Код - C# [Выбрать]
  1. public static bool TryGetPointFromUser(out Point3d result, bool inWCS, string message, Point3d? point)
  2. {
  3.     Editor ed = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor;
  4.     PromptPointOptions ppo = new PromptPointOptions("\n" + message);
  5.     if (point.HasValue)
  6.     {
  7.         ppo.BasePoint = point.Value;
  8.         ppo.UseBasePoint = true;
  9.     }
  10.     while (true)
  11.     {
  12.         PromptPointResult res = ed.GetPoint(ppo);
  13.         if (res.Status == PromptStatus.Cancel)
  14.         {
  15.             result = Point3d.Origin;
  16.             return false;
  17.         }
  18.         else if (res.Status == PromptStatus.OK)
  19.         {
  20.             result = res.Value;
  21.             if (inWCS) result = result.TransformBy(ed.CurrentUserCoordinateSystem);
  22.             return true;
  23.         }
  24.     }
  25. }
  26.  
  27. public static bool GetObjectInPoint(out List<ObjectId> result, List<Type> types, string message, List<ObjectId> excludes, Point3d? point = null, double? precision = null)
  28. {
  29.     result = new List<ObjectId>();
  30.  
  31.     Point3d clickPoint;
  32.  
  33.     while (true)
  34.     {
  35.  
  36.         if (point.HasValue) clickPoint = point.Value;
  37.         else if (!TryGetPointFromUser(out clickPoint, false, message, null)) return false;
  38.  
  39.         if (precision == null) precision = Tolerance.Global.EqualPoint;
  40.  
  41.         string typeString = "";
  42.         foreach (Type type in types)
  43.         {
  44.              if (type.Equals(typeof(ProxyEntity)))
  45.             {
  46.                  typeString += "ACAD_PROXY_ENTITY,";
  47.                  continue;
  48.             }
  49.             typeString += RXClass.GetClass(type).DxfName + ",";
  50.         }
  51.         if (typeString.Length > 1) typeString = typeString.Substring(0, typeString.Length - 1);
  52.         //выбираем типы для множественного выбора
  53.         TypedValue[] values = new TypedValue[]
  54.         {
  55.             new TypedValue((int)DxfCode.Start,typeString)
  56.         };
  57.  
  58.         //объявляем фильтр
  59.         SelectionFilter filter = new SelectionFilter(values);
  60.         //создаем точки для выбора объектов в области
  61.         Point3d pt1 = new Point3d(clickPoint.X - precision.Value, clickPoint.Y - precision.Value, 0);
  62.         Point3d pt2 = new Point3d(clickPoint.X + precision.Value, clickPoint.Y + precision.Value, 0);
  63.         //выбираем объекты в области вокруг выбранной точки
  64.         PromptSelectionResult psr = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager
  65.             .MdiActiveDocument.Editor.SelectCrossingWindow(pt1, pt2, filter);            
  66.  
  67.         if (psr.Value != null)
  68.         {
  69.             if (excludes != null) result.AddRange(psr.Value.GetObjectIds().Except(excludes));
  70.             else result.AddRange(psr.Value.GetObjectIds());
  71.             return true;
  72.         }
  73.     }        
  74. }

Оффлайн avcАвтор темы

  • ADN Club
  • *****
  • Сообщений: 839
  • Карма: 168
    • Мои плагины к Автокаду
что бы весь чертеж не проверять
Ха, а в самом деле, зачем я все объекты проверяю на пересечение, если можно вызвать SelectCrossingWindow с околонулевым прямоугольником. Встроенный поиск намного быстрее. Спасибо за идею. Думаю это будет оптимально.

Оффлайн alz

  • ADN OPEN
  • ***
  • Сообщений: 111
  • Карма: 14
Ха, а в самом деле, зачем я все объекты проверяю на пересечение, если можно вызвать SelectCrossingWindow с околонулевым прямоугольником. Встроенный поиск намного быстрее. Спасибо за идею. Думаю это будет оптимально.

Ну, проверять после этого все равно приходится, так как это метод эдитора то зависит от масштабирования в этот момент и при мелком масштабе даже при околонулевом прямоугольнике (как у меня по умолчанию Tolerance.Global.EqualPoint) может навыбирать немного лишнего, видимо что-то типа попадающего в этот пиксель берет.