SelectionFiltr для DxfCode.ColorRgb

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

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 от Александр Ривилис »