Выбор объектов с фильтром

Автор Тема: Выбор объектов с фильтром  (Прочитано 14752 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Добрый день! Не могу понять следующую вещь: при выборе секущей рамкой (GetSelection) в момент, когда курсор включается для выделения секущей рамкой одновременно с этим АВТОМАТИЧЕСКИ выбирается один из ранее выделенных объектов этой же командой:
Вот сам код:
 
Код - C# [Выбрать]
  1. Document doc = acadApp.DocumentManager.MdiActiveDocument;
  2.             Database db = doc.Database;
  3.             Editor ed = doc.Editor;
  4.             TypedValue[] acTypValAr = new TypedValue[2];
  5. acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0);
  6. acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1);
  7.                    
  8.                
  9.  
  10.                 // Назначение критериев фильтра объекту SelectionFilter
  11.                
  12.                 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  13.                 // Запрос выбора объектов на чертеже
  14.  
  15.                 PromptSelectionResult acSSPrompt;
  16.              
  17.                 acSSPrompt = ed.GetSelection(acSelFtr);
  18.  


pic code

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор объектов с фильтром
« Ответ #1 : 07-02-2022, 17:41:11 »
одновременно с этим АВТОМАТИЧЕСКИ выбирается один из ранее выделенных объектов этой же командой:
Если я правильно понял о чем ты, то так и должно быть. Нюансы могут быть связаны с контекстом выполнения и флагами команды (если команда выполняется из команды).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Выбор объектов с фильтром
« Ответ #2 : 07-02-2022, 17:43:01 »
почему? я же должен выбрать секущей рамкой объекты и только после этого они должны попасть в набор объектов?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор объектов с фильтром
« Ответ #3 : 07-02-2022, 17:45:16 »
почему? я же должен выбрать секущей рамкой объекты и только после этого они должны попасть в набор объектов?
Потому что сразу в набор попадают примитивы предварительного выбора, если они удовлетворяют фильтру. Ну а потом уже работает интерактивный выбор пользователем.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Выбор объектов с фильтром
« Ответ #4 : 07-02-2022, 17:47:29 »
а как сделать только интерактивный выбор пользователя в таком случае? чтобы сами примитивы не попадали в выбор?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор объектов с фильтром
« Ответ #5 : 07-02-2022, 17:48:05 »
Важно понимать контекст выполнения и флаги команды.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Выбор объектов с фильтром
« Ответ #6 : 07-02-2022, 17:53:27 »
Флаги - CommandFlags? не ставил...

Причем предварительно выбора не происходит, если в строке FiltrPerem.nameLayer - один слой. Если несколько через запятую происходит предварительный выбор без пользователя.

Код - C# [Выбрать]
  1. acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1)


Код - C# [Выбрать]
  1. Document doc = acadApp.DocumentManager.MdiActiveDocument;
  2.             Database db = doc.Database;
  3.             Editor ed = doc.Editor;
  4.             TypedValue[] acTypValAr = new TypedValue[2];
  5. acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0);// имена объектов (примитивов) через запятую
  6. acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1); //имена слоев через запятую
  7.                    
  8.                
  9.  
  10.                 // Назначение критериев фильтра объекту SelectionFilter
  11.                
  12.                 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  13.                 // Запрос выбора объектов на чертеже
  14.  
  15.                 PromptSelectionResult acSSPrompt;
  16.              
  17.                 acSSPrompt = ed.GetSelection(acSelFtr);

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Выбор объектов с фильтром
« Ответ #7 : 07-02-2022, 18:05:26 »
У меня есть панель, где отображаются слои в listbox. Я выбираю там слои. Далее включаю команду для выбора объектов по фильтру, куда передаются имена выбранных слоев в панели. и вот в этом конкретном случае на экране нарисованы прямоугольника на слоях "1_11.02.2022_3_4_5" и на слоях "1_07.02.2022_3_4_5". Интересно, что без участия пользователя выбирается только один конкретный прямоугольник слоя "1_11.02.2022_3_4_5" (на чертеже их 2). Если критерием фильтра ставить имя слоя "1_07.02.2022_3_4_5" - не выбирается без пользователя ничего (т.е. как и задумывалось). Но когда в критерии фильтра попадает имя слоя "1_11.02.2022_3_4_5" - автокад сам выбирает один конкретный прямоугольник... Не понимаю, почему и как это победить.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор объектов с фильтром
« Ответ #8 : 07-02-2022, 18:12:04 »
Флаги - CommandFlags? не ставил...
Не понял. И вообще не понял где именно выполняется этот обрывок кода.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор объектов с фильтром
« Ответ #9 : 07-02-2022, 18:14:55 »
Далее включаю команду для выбора объектов по фильтру
Что значит "включаешь"? Включать команду нельзя. Её можно только выполнить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор объектов с фильтром
« Ответ #10 : 07-02-2022, 18:41:18 »
Но когда в критерии фильтра попадает имя слоя "1_11.02.2022_3_4_5" - автокад сам выбирает один конкретный прямоугольник... Не понимаю, почему и как это победить.
Учти, что некоторые знаки в именах слоёв, именах блоков и т.д. используются как шаблонные знаки. В твоем случае это точки. Чтобы они воспринимались как обычные знаки их нужно устранить. Для этой цели перед ними ставится знак "`". Т.е. в твоём случае это должна быть строка "1_11`.02`.2022_3_4_5". Ну а если в общем случае неизвестно есть ли шаблонные символы в строке, то можно их все устранить, добавив перед каждым символом  "`".

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Выбор объектов с фильтром
« Ответ #11 : 07-02-2022, 21:31:31 »
Даже если записать в фильтре явно имя слоя, он все равно почему-то сам выбирает определенный прямоугольник.

Код - C# [Выбрать]
  1.  
  2.  
  3.                acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0);
  4.  
  5.                
  6.                 acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, "1_11`.02`.2022_3_4_5"), 1);// ВОТ ТУТ ПРОБУЮ ЗАДАТЬ ИМЯ СЛОЯ ЯВНО
  7.                    
  8.                
  9.  
  10.                 // Назначение критериев фильтра объекту SelectionFilter
  11.                
  12.                 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  13.                 // Запрос выбора объектов на чертеже
  14.  
  15.                 PromptSelectionResult acSSPrompt;
  16.            
  17.                 acSSPrompt = ed.GetSelection(acSelFtr) // НА  ЭТОМ ЭТАПЕ ПЕРЕД ТЕМ, КАК ДАТЬ ПОЛЬЗОВАТЕЛЮ ВОСПОЛЬЗОВАТЬСЯ СЕКУЩЕЙ РАМКОЙ, АВТОКАД ПРЕДВАРИТЕЛЬНО ВЫБИРАЕТ ОДИН ИЗ ДВУХ ПРЯМОУГОЛЬНИКОВ, ПРИНАДЛЕЖАЩИХ СЛОЮ ;

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор объектов с фильтром
« Ответ #12 : 07-02-2022, 21:42:29 »
VitaliyB,
Мы снова говорим на разных языках. Из того что ты написал непонятен контекст выполнения кода, выполняется ли он в контексте документа или приложения, есть ли набор предварительного выбора и т.д. По тому что ты написал выше я ничего сказать не могу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: Выбор объектов с фильтром
« Ответ #13 : 07-02-2022, 21:56:14 »
Постараюсь объяснить... Вот код данной команды:

Код - C# [Выбрать]
  1. [CommandMethod("вв_(ПТО_№2:выбор по фильтру)")]
  2.         public void Vibor_Setup()
  3.         {
  4.                
  5.             Document doc = acadApp.DocumentManager.MdiActiveDocument;
  6.             Database db = doc.Database;
  7.             Editor ed = doc.Editor;
  8.                         //выбираем объекты по заданным критериям
  9.                        
  10.             TypedValue[] acTypValAr = new TypedValue[2];
  11.             acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0); //фильтр по типам примитивов
  12.             acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1); //фильтр по именам слоев
  13.                    
  14.                 // Назначение критериев фильтра объекту SelectionFilter
  15.                
  16.                 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  17.                 // Запрос выбора объектов на чертеже
  18.  
  19.                 PromptSelectionResult acSSPrompt;
  20.                
  21.                 acSSPrompt = ed.GetSelection(acSelFtr);
  22.  
  23.  
  24.                 try
  25.                  {
  26.                     using (Transaction trans = db.TransactionManager.StartTransaction())
  27.                     {
  28.  
  29.                        
  30.                        
  31.                         List<ObjectId> objects = new List<ObjectId>();
  32.  
  33.                                                         //перебираем выбранные объекты и заносим в public List'ы для дальнейшего использования
  34.                                                        
  35.                     foreach (ObjectId asObjId in acSSPrompt.Value.GetObjectIds())
  36.                         {
  37.                                                         objects.Add(asObjId)
  38.                                                 }
  39.  
  40.                    
  41.                         ed.SetImpliedSelection(objects.ToArray());
  42.                         ac_Vibor.objects.Clear();
  43.                         ac_Vibor.objects.AddRange(objects.ToArray());//список объектов, который в дальнейшем будет использоваться при вызове других команд
  44.  
  45.  
  46.  
  47.                         trans.Commit();
  48.                        
  49.                     }
  50.  
  51.                 }
  52.                 catch (System.NullReferenceException)
  53.                 {
  54.                     ed.WriteMessage("\nНичего не найдено!!!");
  55.                 }
  56.  
  57.                 catch (Autodesk.AutoCAD.Runtime.Exception ex)
  58.                 {
  59.                     acadApp.ShowAlertDialog(ex.Message);
  60.                 }
  61.            
  62.            
  63.         }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Выбор объектов с фильтром
« Ответ #14 : 07-02-2022, 22:00:51 »
VitaliyB,
1. Не издевайся над AutoCAD'ом - давай нормальные имена командам. Очень желательно только английские буквы, цифры и символы подчеркивания.
2. Вот это всё портит в твоём коде: ed.SetImpliedSelection(...).  Зачем оно???
3. Как запускается эта команда? Ты же запускаешь её из палитры?
4. Не вижу зачем в твоём коде используется транзакция.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение