SelectionFiltr для DxfCode.ColorRgb

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

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

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

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




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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь 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.
Александр, это гениально! Все получилось и работает как надо. спасибо, в очередной раз благодаря Вам сэкономлены часы инженерного труда.