Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: avc от 05-03-2017, 18:24:47

Название: Цвет граней солида
Отправлено: avc от 05-03-2017, 18:24:47
С удивлением сейчас обнаружил, что не могу получить цвет отдельных граней солида. Судя по статье http://adn-cis.org/ustanovka-czveta-vsem-granyam-tvyordogo-tela.html (http://adn-cis.org/ustanovka-czveta-vsem-granyam-tvyordogo-tela.html) - цвет и материал должен быть у SubEntity. Но он пустой! Color.IsNone==true  у все граней, какой бы я цвет не назначал. С материалом - та же ерунда. Код упрощенно такой:
Код - C# [Выбрать]
  1.     private static List<string> GetFacesProps(Solid3d solid)
  2.     {
  3.       List<string> ret = new List<string>();
  4.       ObjectId[] ids = new ObjectId[] { solid.ObjectId };
  5.       SubentityId subentId = new SubentityId(SubentityType.Null, IntPtr.Zero);
  6.       using (Brep brep = new Brep(new FullSubentityPath(ids, subentId)))
  7.       {
  8.         if (brep == null) return ret;
  9.         foreach (BrFace face in brep.Faces)
  10.           using (Entity faceEnt = solid.GetSubentity(face.SubentityPath))
  11.           {
  12.             if (!faceEnt.Color.IsNone && faceEnt.Color != solid.Color)
  13.             {
  14.               if (!ret.Contains(faceEnt.Color.ToString())) ret.Add(faceEnt.Color.ToString());
  15.             }
  16.             if (!string.IsNullOrEmpty(faceEnt.Material) && faceEnt.Material != solid.Material)
  17.             {
  18.               if (!ret.Contains(faceEnt.Material)) ret.Add(faceEnt.Material);
  19.             }
  20.           }
  21.       }
  22.       return ret;
  23.     }
Что-то я делаю не так...
Название: Re: Цвет граней солида
Отправлено: Александр Ривилис от 05-03-2017, 18:27:02
В той статье назначается цвет конкретным граням. Про получение цвета грани речь не идёт.
Название: Re: Цвет граней солида
Отправлено: avc от 05-03-2017, 18:28:14
Вот в этом и неожиданность - установить можно а получить - нельзя. Но где-то ж его автокад хранит....
Название: Re: Цвет граней солида
Отправлено: Александр Ривилис от 05-03-2017, 18:31:53
Ты в этом уверен? Кроме метода Solid3d.SetSubentityColor есть еще метод Solid3d.GetSubentityColor.
Единственная проблема в том, что если цвет не назначен, то возникает исключение, которое приходится обрабатывать.
Название: Re: Цвет граней солида
Отправлено: Александр Ривилис от 05-03-2017, 19:03:02
Кстати, ссылку ты привел на пример на ObjectARX. А вот на .NET: http://adn-cis.org/kak-v-.net-vyibrat-grani-3dsolid-i-izmenit-im-czvet.html
Название: Re: Цвет граней солида
Отправлено: avc от 05-03-2017, 19:13:20
Спасибо! Витиевато оказалось, сам не  догадался :)
Название: Re: Цвет граней солида
Отправлено: avc от 05-03-2017, 22:59:25
Единственная проблема в том, что если цвет не назначен, то возникает исключение
Еще какая проблема!
Вызов вот такого кода
Код - C# [Выбрать]
  1.               try
  2.               {
  3.                 color = solid.GetSubentityColor(face.SubentityPath.SubentId);
  4.               }
  5.               catch { color = null; }
для граней 3х кубиков занимает пол минуты. Это катастрофа, т.к. мне надо найти единственную раскрашенную грань в любом чертеже. В реале солидов будут сотни и тысячи и у каждого десятки граней  :-\ Это catch так тормозит? Дороги в обход нет?
Название: Re: Цвет граней солида
Отправлено: Александр Ривилис от 06-03-2017, 00:21:50
для граней 3х кубиков занимает пол минуты.
Что-то долговато. try/catch может занимать несколько миллисекунд. У кубика 6 граней - итого 18 граней. Т.е. обработка трёх кубиков может занимать в худшем случае несколько секунд, если проблема в исключениях, а не в нерациональном коде.
Дороги в обход нет?
Как обычно это P/Invoke для чистого метода ObjectARX с именем AcDb3dSolid::getSubentColor
Название: Re: Цвет граней солида
Отправлено: avc от 06-03-2017, 13:44:59
Все решилось само собой - оказывается тормоза создавал отладчик VS. Запустил тот же код без режима отладки (даже без включения оптимизации) и все стало летать - от 1 до 14 мс на проверку всех граней кубика  ;D