Установка цвета всем граням твёрдого тела

Автор Тема: Установка цвета всем граням твёрдого тела  (Прочитано 6891 раз)

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


Оффлайн Glam Troll

  • ADN Club
  • Сообщений: 17
  • Карма: 0
Подскажите, пожалуйста, есть ли способ назначить различные цвета всем граням тела ДО его добавления в документ?
Например, для AcDb3dSolid создаётся копия, затем она она раскрашивается и только после этого добавляется в документ.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Подскажите, пожалуйста, есть ли способ назначить различные цвета всем граням тела ДО его добавления в документ?
Например, для AcDb3dSolid создаётся копия, затем она она раскрашивается и только после этого добавляется в документ.
Думаю что такой возможности нет. А зачем это нужно?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Glam Troll

  • ADN Club
  • Сообщений: 17
  • Карма: 0
А зачем это нужно?
Чисто алгоритмически было бы эффективнее. Речь об обработке тысяч тел, в которых бывает до десятков тысяч граней в каждом. Сейчас приходится сперва получать тела, сохранять, получать массив subentid, потом раскрашивать. Т.е. три цикла. Хотя, даже без сохранения не получилось бы в одном цикле всё делать, потому что итератор по граням становится не валидным (brep changed) после раскраски первой же грани...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Речь об обработке тысяч тел, в которых бывает до десятков тысяч граней в каждом. Сейчас приходится сперва получать тела, сохранять, получать массив subentid, потом раскрашивать.
И каждая грань каждого из тел имеет свой цвет???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Glam Troll

  • ADN Club
  • Сообщений: 17
  • Карма: 0
И каждая грань каждого из тел имеет свой цвет???
Это "костыль" для восстановления топологии тела после вызова функции getMeshObject. BREP, к сожалению, с некоторыми моделями не справляется, а getMeshObject справляется, хотя это одно и то же по сути... Я в цвете граней сохраняю порядковый номер грани солида, чтобы потом по граням полигоны раскидать.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Да уж...
Я проверил на всякий случай:
Код - C++ [Выбрать]
  1. static void TestBrepColor(void)
  2. {
  3.   AcDb3dSolid *pBox = new AcDb3dSolid();
  4.   pBox->createBox(10,20,30);
  5.   AcCmColor specialColor;
  6.   AcBr::ErrorStatus bs;
  7.   AcArray<AcDbSubentId> arrSubentId;
  8.   {
  9.     AcBrBrep brEnt;  bs = brEnt.set(*pBox);
  10.     if (bs != AcBr::eOk)
  11.       return;
  12.     AcBrBrepFaceTraverser bft;
  13.     bs = bft.setBrep(brEnt);
  14.     if (bs != AcBr::eOk)
  15.       return;
  16.  
  17.     // Выполняем проход по всем граням
  18.  
  19.     for ( ; !bft.done(); bft.next())
  20.     {
  21.       AcBrFace face;
  22.       bs = bft.getFace(face);  
  23.       if (bs != Acad::eOk)
  24.       {
  25.         acutPrintf(L"\nОшибка getFace");
  26.         break;
  27.       }
  28.  
  29.       AcDbFullSubentPath    Path(kNullSubent);
  30.       AcDbSubentId          subentId;
  31.       AcBr::ErrorStatus bss = face.getSubentPath(Path);
  32.       subentId = Path.subentId();
  33.       arrSubentId.append(subentId);
  34.     }
  35.   }
  36.  
  37.   for (int i = 0; i < arrSubentId.length(); i++)
  38.   {
  39.     specialColor.setColorIndex(i);
  40.     pBox->setSubentColor(arrSubentId[i],specialColor);
  41.   }
  42.  
  43.   Acad::ErrorStatus es = Acad::eOk;
  44.   AcDbBlockTableRecordPointer pCurSpace(acdbCurDwg()->currentSpaceId(), AcDb::kForWrite);
  45.   if (pCurSpace.openStatus() == Acad::eOk) {
  46.     if (pCurSpace->appendAcDbEntity(pBox) == Acad::eOk) {
  47.       pBox->close();
  48.     } else {
  49.       delete pBox;
  50.     }
  51.   } else {
  52.     delete pBox;
  53.   }
  54. }
  55.  
Цвет граней не меняется. Вывод - сначала нужно добавить в базу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Glam Troll

  • ADN Club
  • Сообщений: 17
  • Карма: 0
Цвет граней не меняется. Вывод - сначала нужно добавить в базу.
Это я тоже уже проверил, потому и решил спросить. Тут даже не просто сохранить в базу нужно, но и в brep передать путь к телу.
Просто чисто логически, путь до грани указывается относительно тела, где бы это тело не находилось. Вот я и думал, может просто чего-то не знаю... видимо, просто нельзя.
Но я всё равно выключаю undo, так что может и не страшно, что за три прохода делается всё. Хотелось избежать лишнего редактирования, но пусть будет, как будет.