SelectionFiltr для DxfCode.ColorRgb

Автор Тема: SelectionFiltr для DxfCode.ColorRgb  (Прочитано 9046 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
SelectionFiltr для DxfCode.ColorRgb
« : 01-05-2021, 17:33:58 »
Добрый день! Подскажите, пожалуйста: хочу сделать выборку объектов на чертеже при помощи SelectionFilter. Один из параметров, который мне нужен - это цвет по параметрам RGB. В перечислении emun есть DxfCode.ColorRgb. Но вот какой параметр туда передавать - не понимаю. Вот пример кода с фильтром. В моем случае вопрос про то, что должна содержать в себе переменная ac_Vibor.LayerRGB, чтобы код заработал:

Код - C# [Выбрать]
  1.      
  2.                     TypedValue[] acTypValAr = new TypedValue[2];
  3.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0);
  4.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1);
  5.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.ColorRgb, ac_Vibor.LayerRGB), 2); //вот тут фильтр должен работать по цвету
  6.                     SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #1 : 01-05-2021, 19:01:42 »
Должно быть EntityColor.TrueColor
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #2 : 01-05-2021, 19:35:26 »
а можно передать в этот фильтр сразу несколько вариантов цвета?

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #3 : 01-05-2021, 19:49:41 »
что-то я не понимаю - откуда взять TrueColor? EntityColor не дает такого варианта после точки  :-[ можно какой-то пример?


у меня получилось через  EntityColor.LookUpAci и в фильтре через Color (не ColorRgb) - однако, как я понимаю, это работает только на стандартные цвета, а вот например на цвет EntityColor.LookUpAci(37, 88, 218) - не срабатывает. В связи с этим у меня два вопроса:
1. Как добраться до TrueColor и задать по значению RGB цвет
2. Как в фильтр передать вариантов несколько цвета по RGB?  ???

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #4 : 01-05-2021, 20:02:16 »
а можно передать в этот фильтр сразу несколько вариантов цвета?
Можно. Если использовать фильтр "<or" "or>".
Код - C# [Выбрать]
  1.   new TypedValue((int) DxfCode.Operator, "<or"),
  2.   new TypedValue((int) DxfCode.ColorRGB,  color1),
  3.   new TypedValue((int) DxfCode.ColorRGB,  color2),
  4.   new TypedValue((int) DxfCode.ColorRGB,  color3),
  5.   new TypedValue((int) DxfCode.ColorRGB,  color4),
  6.   new TypedValue((int) DxfCode.Operator, "or>"),
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #5 : 01-05-2021, 20:18:46 »
VitaliyB,
Что ты знаешь о цвете, который собираешься искать? Тройку RGB? Тогда используй конструктор:
Код - C# [Выбрать]
  1. EntityColor eColor1 = new EntityColor(37, 88, 218);
  2. int color1 = eColor1.TrueColor;
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #6 : 01-05-2021, 21:42:06 »
Я очень извиняюсь. но до конца эту тему понять не могу - целый день бьюсь. Вроде бы делаю всё, как Вы говорите. Но мне выдает ошибку:
Код - C# [Выбрать]
  1.  ac_Vibor.LayerRGB = ac_Vibor.LayerRGB.Trim();
  2.                     string[] LayerRGBtemp = new string []{ };
  3.                     LayerRGBtemp = ac_Vibor.LayerRGB.Split(';');
  4.                     Array.Resize(ref acTypValAr, acTypValAr.Length + LayerRGBtemp.Length);
  5.                     //TypedValue[] acTypValAr = new TypedValue[3];// поменять на 1 если нужно все слои
  6.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0);
  7.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1);
  8.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, "<or"),2);
  9.                     int j = 0;
  10.                     string[] LayerRGB = new string[] { };
  11.                     LayerRGB = ac_Vibor.LayerRGB.Split(',');
  12.                     for (int i = 0; i < LayerRGBtemp.Length; i=i+3)
  13.                     {
  14.                        
  15.                         //EntityColor eColor1 = new EntityColor(37, 88, 218);
  16.                         EntityColor eColor1 = new EntityColor(Convert.ToByte(LayerRGB[i]), Convert.ToByte(LayerRGB[i+1]), Convert.ToByte(LayerRGB[i+2]));
  17.                         int color1 = eColor1.TrueColor;
  18.                         acTypValAr.SetValue(new TypedValue((int)DxfCode.ColorRgb, color1), 2);
  19.                         j++;
  20.                     }
  21.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, "or>"),j);
  22.                 }
  23.                 // Назначение критериев фильтра объекту SelectionFilter
  24.                
  25.                 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  26.                 // Запрос выбора объектов на чертеже
  27.  
  28.                 PromptSelectionResult acSSPrompt;
  29.                 //acSSPrompt = ed.SelectImplied();
  30.                 acSSPrompt = ed.GetSelection(acSelFtr);

LayerRGBtemp - это текст, который я ввожу в форму TextBox. например: "0,255,255;35,55,67" - т.е. каждый RGB через точку с запятой. У меня в принципе конструктор EntityColor не хочет принимать переменные.  :-\ может, я где-то в синтаксе ошибаюсь?

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #7 : 01-05-2021, 21:42:40 »
причем если ввожу числа в конструктор, а не переменные - работает

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #8 : 01-05-2021, 22:59:37 »
VitaliyB,
Тебя цифра 2 вместо j в 18-ой строке не смущает?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #9 : 01-05-2021, 23:53:54 »
Александр, согласен. Опечатка двоечника) но тем не менее не работает код. Хотя вроде делаю все как говорите. Допустим, передаю 2 элемента, перебираю массивы и получаю на выходе:



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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #10 : 02-05-2021, 00:11:42 »
нашел ошибки в перечислении массива. Теперь ошибок не выдает, но и ничего не выбирает. странно...

Код - C# [Выбрать]
  1. else
  2.                 {
  3.                     ac_Vibor.LayerRGB = ac_Vibor.LayerRGB.Trim();
  4.                     string[] LayerRGBtemp = new string []{ };
  5.                     LayerRGBtemp = ac_Vibor.LayerRGB.Split(';');
  6.                     Array.Resize(ref acTypValAr, acTypValAr.Length + 2);
  7.                     //TypedValue[] acTypValAr = new TypedValue[3];// поменять на 1 если нужно все слои
  8.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0);
  9.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1);// убрать если все слои
  10.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, "<or"),2);
  11.                     int j = 3;
  12.                     string[] LayerRGB = new string[] { };
  13.                     LayerRGB = ac_Vibor.LayerRGB.Split(',',';');
  14.                     for (int i = 0; i < LayerRGB.Length; i=i+3)
  15.                     {
  16.                         Array.Resize(ref acTypValAr, acTypValAr.Length + 1);
  17.                         //EntityColor eColor1 = new EntityColor(37, 88, 218);
  18.                         EntityColor eColor1 = new EntityColor(Convert.ToByte(LayerRGB[i]), Convert.ToByte(LayerRGB[i+1]), Convert.ToByte(LayerRGB[i+2]));
  19.                         int color1 = eColor1.TrueColor;
  20.                         acTypValAr.SetValue(new TypedValue((int)DxfCode.ColorRgb, color1), j);
  21.                         j++;
  22.                     }
  23.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, "or>"),j);
  24.                 }
  25.                 // Назначение критериев фильтра объекту SelectionFilter
  26.                
  27.                 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  28.                 // Запрос выбора объектов на чертеже
  29.  
  30.                 PromptSelectionResult acSSPrompt;
  31.                 //acSSPrompt = ed.SelectImplied();
  32.                 acSSPrompt = ed.GetSelection(acSelFtr);



ведь все же параметры передал? :o

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #11 : 02-05-2021, 00:23:11 »
Убедись, что для этих полилиний
Код - Auto/Visual Lisp [Выбрать]
  1. (entget (car (entsel)))
в группе 420 возвращается правильное значение цвета.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #12 : 02-05-2021, 00:26:30 »
это lisp? а как в этом убедиться?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #13 : 02-05-2021, 00:29:15 »
это lisp? а как в этом убедиться?
В командную строку AutoCAD введи код, который я показал выше и выбери одну из твоих полилиний. Результаты сюда.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #14 : 02-05-2021, 00:34:34 »
Команда: (entget (car (entsel)))
Выберите объект: ((-1 . <Имя объекта: 134448b2870>) (0 . "LWPOLYLINE") (330 . <Имя объекта: 134448b3f00>) (5 . "7F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 7564.45 2160.4) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 -1106.81 2160.4) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 -1106.81 -2807.4) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 7564.45 -2807.4) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))
Тут нет 420...
« Последнее редактирование: 02-05-2021, 00:36:33 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #15 : 02-05-2021, 00:35:03 »
Второй вариант для проверки - использовать MGDDBG




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

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #16 : 02-05-2021, 00:36:02 »
VitaliyB,
Значит цвет у неё "ПоСлою" ("ByLayer")
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #17 : 02-05-2021, 00:38:04 »

должен быть голубой: 0,255,255

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #18 : 02-05-2021, 00:45:52 »
должен быть голубой: 0,255,255
Голубой - это голубой (индексный цвет), а 0,255,255 - это TrueColor. По RGB ты такое не отфильтруешь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #19 : 02-05-2021, 00:46:00 »




Да, они почему не совпадают...

а есть, кстати, при обращении к RGB возможность обратиться у установкам по слою/по блоку?

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #20 : 02-05-2021, 00:47:09 »
охх... а как быть? мне надо фильтровать и индексные цвета и не индексные... т.е. которые заданы были в RGB?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #21 : 02-05-2021, 00:50:17 »
VitaliyB,



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

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #22 : 02-05-2021, 00:51:21 »
а их нельзя объединить в один фильтр?

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #23 : 02-05-2021, 00:54:04 »
хм... может тогда мне проще фильтровать по Вашему способу сравнения LookUpRgb и ACI? но тогда возникает вопрос создания отдельного метода, куда будет передавать ObjectId. А можно ли у ObjectId получить цвет, чтобы принять решение - добавлять в массив выбора объект или нет?

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #24 : 02-05-2021, 00:54:20 »
а их нельзя объединить в один фильтр?
Можно. Через тот же "<or" "or>"...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #25 : 02-05-2021, 00:57:26 »
А можно ли у ObjectId получить цвет, чтобы принять решение - добавлять в массив выбора объект или нет?
Если у тебя уже есть ObjectId, то зачем же его выбирать??? Ну и чтобы получить цвет по ObjectId (если это ObjectId какого-то наследника Entity - у других может и не быть свойства цвет), нужно открыть его и получить Entity.Color или Entity.EntityColor.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #26 : 02-05-2021, 01:12:17 »
у меня есть команда, где по множеству критериев выбираются примитивы. ObjectId их я могу узнать в процессе выполнения команды. т.е., например: полилиния+линия, на слое "0". Я хочу в этот перечень добавить еще цвета. Поскольку бывают разные варианты, то думал сделать это по RGB через ";" - например "0,255,255;36,57,255", когда стоит галочка напротив "цвет". по большому счету код уже написан и можно либо по фильтру SelectionFilter это сделать, либо дописать метод, который буде добполнительно проверять все ObjectId и добавлять их в список по условию принадлежности к цвету, т.к. в выборку передается список ObjectId в конечном итоге. но теперь я окончательно запутался) если ACI и RGB разные вещи и нельзя одновременно отфильтровать и голубой и пользовательский - то как быть? получается, голубой нужно вносить как ColorIndex, а пользовательский - как RGB? и что при это делать с "послою" и "по блоку"


бесплатные картинки

Для полной картины приложу код команды, хотя он теперь не совсем верен с точки зрения цветов, но тем не менее:
Код - C# [Выбрать]
  1. [CommandMethod("вв_(ПТО_№2:выбор по фильтру)")] //, CommandFlags.Redraw)]
  2.         public void Vibor_Setup()
  3.         {
  4.             Document doc = acadApp.DocumentManager.MdiActiveDocument;
  5.             Database db = doc.Database;
  6.             Editor ed = doc.Editor;
  7.             TypedValue[] acTypValAr = new TypedValue[2];
  8.  
  9.                 if (ac_Vibor.set_RGB == false)
  10.                 {
  11.  
  12.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0);
  13.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1);
  14.                 }
  15.                 else
  16.                 {
  17.                     ac_Vibor.LayerRGB = ac_Vibor.LayerRGB.Trim();
  18.                     string[] LayerRGBtemp = new string []{ };
  19.                     LayerRGBtemp = ac_Vibor.LayerRGB.Split(';');
  20.                     Array.Resize(ref acTypValAr, acTypValAr.Length + 1);
  21.                    
  22.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, FiltrPerem.nameObj), 0);
  23.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.LayerName, FiltrPerem.nameLayer), 1);
  24.  
  25.                     int color1 = eColor1.TrueColor;
  26.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.ColorRgb, color1), 2);
  27.                    
  28.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, "<or"),2);
  29.                     int j = 3;
  30.                     string[] LayerRGB = new string[] { };
  31.                     LayerRGB = ac_Vibor.LayerRGB.Split(',',';');
  32.                     for (int i = 0; i < LayerRGB.Length; i=i+3)
  33.                     {
  34.                         Array.Resize(ref acTypValAr, acTypValAr.Length + 1);
  35.                         //EntityColor eColor1 = new EntityColor(37, 88, 218);
  36.                         EntityColor eColor1 = new EntityColor(Convert.ToByte(LayerRGB[i]), Convert.ToByte(LayerRGB[i+1]), Convert.ToByte(LayerRGB[i+2]));
  37.                         int color1 = eColor1.TrueColor;
  38.                         acTypValAr.SetValue(new TypedValue((int)DxfCode.ColorRgb, color1), j);
  39.                         j++;
  40.                     }
  41.                     acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, "or>"),j);
  42.                    
  43.                 }
  44.  
  45.                 // Назначение критериев фильтра объекту SelectionFilter
  46.                
  47.                 SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  48.                 // Запрос выбора объектов на чертеже
  49.  
  50.                 PromptSelectionResult acSSPrompt;
  51.  
  52.  
  53.  
  54.  
  55.                 try
  56.                  {
  57.                     using (Transaction trans = db.TransactionManager.StartTransaction())
  58.                     {
  59.  
  60.  
  61.  
  62.  
  63.                      
  64.                         string boolHyp = "";
  65.                         List<ObjectId> objects = new List<ObjectId>();
  66.  
  67.                         //ed.WriteMessage("\nDXF name: " + asObjId.ObjectClass.DxfName);
  68.                         //ed.WriteMessage("\nObjectID: " + asObjId.ToString());
  69.                         //ed.WriteMessage("\nHandle: " + asObjId.Handle.ToString());
  70.                         //ed.WriteMessage("\n");
  71.  
  72.                         if (ac_Vibor.nameHyp != boolHyp && ac_Vibor.nameHyp != null)
  73.                         {
  74.                             foreach (ObjectId asObjId in acSSPrompt.Value.GetObjectIds())
  75.                             {
  76.  
  77.                                 string HyperName = null;
  78.                                 if (asObjId.ObjectClass.Name == "AcDbPolyline")
  79.                                 {
  80.                                     Polyline plln = trans.GetObject(asObjId, OpenMode.ForRead) as Polyline;
  81.                                     foreach (HyperLink hyper in plln.Hyperlinks)
  82.                                     {
  83.                                         HyperName = hyper.Description.ToString();
  84.                                         if (HyperName.Contains(ac_Vibor.nameHyp)) objects.Add(asObjId);
  85.                                     }
  86.                                 }
  87.                                 if (asObjId.ObjectClass.Name == "AcDline")
  88.                                 {
  89.                                     Line plln = trans.GetObject(asObjId, OpenMode.ForRead) as Line;
  90.                                     foreach (HyperLink hyper in plln.Hyperlinks)
  91.                                     {
  92.                                         HyperName = hyper.Description.ToString();
  93.                                         if (HyperName.Contains(ac_Vibor.nameHyp)) objects.Add(asObjId);
  94.                                     }
  95.                                 }
  96.                                 if (asObjId.ObjectClass.Name == "AcDbHatch")
  97.                                 {
  98.                                     Hatch plln = trans.GetObject(asObjId, OpenMode.ForRead) as Hatch;
  99.                                     foreach (HyperLink hyper in plln.Hyperlinks)
  100.                                     {
  101.                                         HyperName = hyper.Description.ToString();
  102.                                         if (HyperName.Contains(ac_Vibor.nameHyp)) objects.Add(asObjId);
  103.                                     }
  104.  
  105.                                 }
  106.                             }
  107.  
  108.                         }
  109.                         else
  110.                         {
  111.                             foreach (ObjectId asObjId in acSSPrompt.Value.GetObjectIds())
  112.                             {
  113.                                 if (ac_Vibor.set_RGB == true)
  114.                                 {
  115.                                                                            
  116.                                         objects.Add(asObjId);
  117.                                    
  118.                                 }
  119.                                 else
  120.                                 {
  121.                                     objects.Add(asObjId);
  122.                                 }
  123.                                    
  124.                             }
  125.                         }
  126.  
  127.                         ed.SetImpliedSelection(objects.ToArray());
  128.  
  129.  
  130.                         trans.Commit();//Это обязательно даже если ничего не меняешь в рисунке
  131.                         ac_Vibor.objects.Clear();
  132.                         ac_Vibor.objects = objects;
  133.                         if (ac_Vibor.set_VV == true)
  134.                         {
  135.                             AcIt.Utils.SelectObjects(objects.ToArray());
  136.                             doc.SendStringToExecute("КОПИЯВСЛОЙ\n", true, false, true);
  137.  
  138.                         }
  139.                     }
  140.  
  141.                 }
  142.                 catch (System.NullReferenceException)
  143.                 {
  144.                     ed.WriteMessage("\nНичего не найдено!!!");
  145.                 }
  146.  
  147.                 catch (Autodesk.AutoCAD.Runtime.Exception ex)
  148.                 {
  149.                     acadApp.ShowAlertDialog(ex.Message);
  150.                 }
  151.             }
  152.          
  153.         }
  154.  

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

  • ADN OPEN
  • **
  • Сообщений: 63
  • Карма: 2
Re: SelectionFiltr для DxfCode.ColorRgb
« Ответ #27 : 02-05-2021, 11:41:03 »
А можно ли у ObjectId получить цвет, чтобы принять решение - добавлять в массив выбора объект или нет?
Если у тебя уже есть ObjectId, то зачем же его выбирать??? Ну и чтобы получить цвет по ObjectId (если это ObjectId какого-то наследника Entity - у других может и не быть свойства цвет), нужно открыть его и получить Entity.Color или Entity.EntityColor.
Александр, это гениально! Все получилось и работает как надо. спасибо, в очередной раз благодаря Вам сэкономлены часы инженерного труда.