Цвет граней солида

Автор Тема: Цвет граней солида  (Прочитано 6895 раз)

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

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

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Цвет граней солида
« : 05-03-2017, 18:24:47 »
С удивлением сейчас обнаружил, что не могу получить цвет отдельных граней солида. Судя по статье 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.     }
Что-то я делаю не так...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Цвет граней солида
« Ответ #1 : 05-03-2017, 18:27:02 »
В той статье назначается цвет конкретным граням. Про получение цвета грани речь не идёт.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Цвет граней солида
« Ответ #2 : 05-03-2017, 18:28:14 »
Вот в этом и неожиданность - установить можно а получить - нельзя. Но где-то ж его автокад хранит....

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Цвет граней солида
« Ответ #3 : 05-03-2017, 18:31:53 »
Ты в этом уверен? Кроме метода Solid3d.SetSubentityColor есть еще метод Solid3d.GetSubentityColor.
Единственная проблема в том, что если цвет не назначен, то возникает исключение, которое приходится обрабатывать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение avc 05-03-2017, 19:12:26

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Цвет граней солида
« Ответ #4 : 05-03-2017, 19:03:02 »
Кстати, ссылку ты привел на пример на ObjectARX. А вот на .NET: http://adn-cis.org/kak-v-.net-vyibrat-grani-3dsolid-i-izmenit-im-czvet.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Цвет граней солида
« Ответ #5 : 05-03-2017, 19:13:20 »
Спасибо! Витиевато оказалось, сам не  догадался :)

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Цвет граней солида
« Ответ #6 : 05-03-2017, 22:59:25 »
Единственная проблема в том, что если цвет не назначен, то возникает исключение
Еще какая проблема!
Вызов вот такого кода
Код - C# [Выбрать]
  1.               try
  2.               {
  3.                 color = solid.GetSubentityColor(face.SubentityPath.SubentId);
  4.               }
  5.               catch { color = null; }
для граней 3х кубиков занимает пол минуты. Это катастрофа, т.к. мне надо найти единственную раскрашенную грань в любом чертеже. В реале солидов будут сотни и тысячи и у каждого десятки граней  :-\ Это catch так тормозит? Дороги в обход нет?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Цвет граней солида
« Ответ #7 : 06-03-2017, 00:21:50 »
для граней 3х кубиков занимает пол минуты.
Что-то долговато. try/catch может занимать несколько миллисекунд. У кубика 6 граней - итого 18 граней. Т.е. обработка трёх кубиков может занимать в худшем случае несколько секунд, если проблема в исключениях, а не в нерациональном коде.
Дороги в обход нет?
Как обычно это P/Invoke для чистого метода ObjectARX с именем AcDb3dSolid::getSubentColor
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Цвет граней солида
« Ответ #8 : 06-03-2017, 13:44:59 »
Все решилось само собой - оказывается тормоза создавал отладчик VS. Запустил тот же код без режима отладки (даже без включения оптимизации) и все стало летать - от 1 до 14 мс на проверку всех граней кубика  ;D