Последние сообщения

Последние сообщения

Страницы: [1] 2 3 ... 10
1
Ха, а в самом деле, зачем я все объекты проверяю на пересечение, если можно вызвать SelectCrossingWindow с околонулевым прямоугольником. Встроенный поиск намного быстрее. Спасибо за идею. Думаю это будет оптимально.

Ну, проверять после этого все равно приходится, так как это метод эдитора то зависит от масштабирования в этот момент и при мелком масштабе даже при околонулевом прямоугольнике (как у меня по умолчанию Tolerance.Global.EqualPoint) может навыбирать немного лишнего, видимо что-то типа попадающего в этот пиксель берет.
2
что бы весь чертеж не проверять
Ха, а в самом деле, зачем я все объекты проверяю на пересечение, если можно вызвать SelectCrossingWindow с околонулевым прямоугольником. Встроенный поиск намного быстрее. Спасибо за идею. Думаю это будет оптимально.
3
Ну я собственно пошел как и все через поиск объектов в точке клика, только, только через немного другой метод что бы весь чертеж не проверять, ну и заодно фильтры что бы работали, вроде работает норм

Код - 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. }
4
avc,
Простейший вариант перед GetEntity послать в командную строку ключевые слова привязок (через SendStringToExecute). Они сработают как раз при выборе объекта.
Альтернативный вариант - получить точку с учетом привязок. В ObjectARX это делается при помощи acedOsnap.
Как в .NET не помню и возможности посмотреть сейчас нет. В крайнем случае воспользуешься P/INVOKE.
Или всё-таки это Editor.Snap
5
Зато Скайнет нам пока не грозит
грозит но в более плохом виде, чем описано в фантастике:
1. Люди создали огромный дата центр, который контролирует все и заменяет многое.
2. Люди потеряли работу и мировая экономика схлапывается.
3. Человечество "деградирует".
4. Некому обслуживать дата центр, нет того, кто понимает где и как его обучать.
5. Стоит огромная ржавая развалина поросшая растительностью, вокруг пастухи пасут коз, охотники охотятся с луком на зайцев.
...все быстро меняется. Все что не успевает подстроиться под изменения пропадет.

Как мне видится проблемы:
1. ИИ интересен в первую очередь тем, кто производит оборудование и ИИ модели+агрессивный маркетинг.
2. ИИ позволит сделать огромный прогресс в определенных областях но дальше все успокоятся. Как с полетами в космос, побаловались, пофантазировали. Дальше интересненько, но дорого.
3. ИИ может не все, с точки зрения генерации кода. Представьте себе запросы: "Сделай мне виндовс", "Напиши автокад", "Мне нужен фотошоп". Страшно представить результат работы ИИ по абстрактному запросу. В итоге ТЗ - многотомное сочинение? Чем это лучше сегодняшнего подхода с языками программирования? А самое главное как менять код, каждый раз генерировать по новому из многотомного запроса и получать различные варианты?  Тут явно требуется смешанный подход.
4. Изменения. Как мы видим меняются архитектуры процессоров, языки программирования, API. и т.д. и процессу нет конца. ИИ могут обучать только опытные люди, в самообучающееся ИИ я лично не верю.
6
Вы не сможете легко отписаться от события
Что и требовалось доказать - очевидный бред AI. Мне прям резануло глаз, а народ-то хавает. Я представляю сколько теперь такого говнокода используется...
p.s. Зато Скайнет нам пока не грозит :)
7
если адрес новой безымянной функции передать оператору -= , он что, в самом деле найдет какую-то другую безымянную функцию и удалит ее из списка делегатов события? Похоже на бред AI
Вы не сможете легко отписаться от события, если использовали анонимную функцию для подписки на него. Чтобы отписаться от события в этом случае, вернитесь к коду, где вы подписались на событие, сохраните анонимную функцию в переменной делегата, а затем добавьте делегат к событию. Мы не рекомендуем использовать анонимные функции для подписки на события, если вам нужно будет отписаться от события в какой-то более поздней точке кода.
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events
8
        // Отписка от события
        ed.PointMonitor -= (sender, args) => { };
Попутно вопрос знатокам по этому коду: если адрес новой безымянной функции передать оператору -= , он что, в самом деле найдет какую-то другую безымянную функцию и удалит ее из списка делегатов события? Похоже на бред AI
9
Проверил. GetSelection еще хуже. Привязки он тоже отключает. Но при этом позволяет выделять рамкой и лассо даже в режимах SingleOnly и SinglePickInSpace. То есть нельзя заставить его работать в режиме выбора одним кликом. Это еще можно было бы пользователям объяснить, что не надо рамку запускать, но привязки...
10
Попробовал спросить ChatGPT, говорит что GetEntity не позволит управлять привязками и предложил через другой метод:
Код - C# [Выбрать]
  1. [CommandMethod("GetSelectionWithPickedPoint")]
  2. public void GetSelectionWithPickedPoint()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Editor ed = doc.Editor;
  6.  
  7.     Point3d pickedPoint = Point3d.Origin;
  8.  
  9.     // Подписка на событие PointMonitor
  10.     ed.PointMonitor += (sender, args) =>
  11.     {
  12.         if (args.Context != null)
  13.         {
  14.             pickedPoint = args.Context.ComputedPoint; // Получение текущей точки
  15.         }
  16.     };
  17.  
  18.     try
  19.     {
  20.         // Настраиваем параметры выбора
  21.         PromptSelectionOptions selOpts = new PromptSelectionOptions
  22.         {
  23.             MessageForAdding = "\nВыберите объект: "
  24.         };
  25.  
  26.         // Получаем результат выбора
  27.         PromptSelectionResult selResult = ed.GetSelection(selOpts);
  28.         if (selResult.Status == PromptStatus.OK)
  29.         {
  30.             foreach (SelectedObject selObj in selResult.Value)
  31.             {
  32.                 if (selObj != null)
  33.                 {
  34.                     ed.WriteMessage($"\nВыбран объект с ID: {selObj.ObjectId}");
  35.                     ed.WriteMessage($"\nКоординаты точки выбора: {pickedPoint}");
  36.                 }
  37.             }
  38.         }
  39.     }
  40.     catch (System.Exception ex)
  41.     {
  42.         ed.WriteMessage($"\nОшибка: {ex.Message}");
  43.     }
  44.     finally
  45.     {
  46.         // Отписка от события
  47.         ed.PointMonitor -= (sender, args) => { };
  48.     }
  49. }
  50.  

Сам, к сожалению, пока не успел проверить. На первый взгляд вроде норм...

Другой вариант - по ссылке: https://forums.autodesk.com/t5/net/editor-getentity-and-pickpointselectedsubobject/m-p/7298212#M54663
Страницы: [1] 2 3 ... 10