Некорректная передача геометрии солида из Brep.API

Автор Тема: Некорректная передача геометрии солида из Brep.API  (Прочитано 11824 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
Добрый день, вопрос по использованию brep api для получения внешних граней 3д-тела, полученного из объекта трубопроводной сети Civil3D. Вопрос не в ветке civil3d, так как операции только с телами, которые зачастую имеют выпуклые поверхности, и с ними не проходит обработка средствами brep api (вернее проходит, но получается какая-то  :-\).

В качестве примера к посту будет приложен файл с двумя простыми телами, при обработке которых они не получаются. Конечная цель, вообще, получить коллекцию граней тела для экспорта в ifc (и там как я вижу по файлу выходит "лажа"). На примере ниже при анализе "трубы" - вытянутого тела возвращаются вообще 2 точки ....

Код - C# [Выбрать]
  1. using (DocumentLock acDocLock = ac_doc.LockDocument())
  2.             {
  3.                 using (Transaction acTrans = ac_db.TransactionManager.StartTransaction())
  4.                 {
  5.                     Solid3d input_solid = acTrans.GetObject(input_solid_id, OpenMode.ForRead) as Solid3d;
  6.                     //Temporal containers for external surface definition (faces indexes and Point3d list)
  7.                     List<List<int>> faces_indexed = new List<List<int>>();
  8.                     List<Point3d> points_temp = new List<Point3d>();
  9.  
  10.                     using (Brep brp = new Brep(input_solid))
  11.                     {
  12.                         foreach (Autodesk.AutoCAD.BoundaryRepresentation.Face fce in brp.Faces)
  13.                         {
  14.                             List<int> coord_indexes = new List<int>(); // КУДА ЭТО????
  15.                             foreach (BoundaryLoop lp in fce.Loops)
  16.                             {
  17.                                 foreach (Edge edg in lp.Edges)
  18.                                 {
  19.                                     vertex_opeations(edg.Vertex1);
  20.                                     vertex_opeations(edg.Vertex2);
  21.                                     void vertex_opeations(Autodesk.AutoCAD.BoundaryRepresentation.Vertex v)
  22.                                     {
  23.                                         if (!points_temp.Contains(v.Point))
  24.                                         {
  25.                                             points_temp.Add(v.Point);
  26.                                             coord_indexes.Add(points_temp.Count() - 1);
  27.                                         }
  28.                                         else
  29.                                         {
  30.                                             int point_last = points_temp.FindIndex(a => a == v.Point);
  31.                                             coord_indexes.Add(point_last);
  32.                                         }
  33.                                     }
  34.                                 }
  35.                             }
  36.                             faces_indexed.Add(coord_indexes);
  37.                         }
  38.                     }
  39.                     this.surf_row = new ifc.BaseStructures(points_temp, faces_indexed).finish_surface;
  40.                     acTrans.Commit();
  41.                 }
  42.             }
Я был бы безмерно счастлив существуй возможность корректной передачи тела в dxf/stl но не вышло. stl через раз косячный (какие-то ошибки выбиваемые по коду со стороны ObjectARX), а dxf не читается (даже будучи экспортированный в AC1021 (2004)) в netdxf/freecad. В Autocad конечно же читается  :-[. В родной step/ifc нет экспорта программного
В многогранную сеть вообще нельзя экспортировать - размер файла будет гигантский, да и не факт что поможет .. с этим тоже не выходило.

P.S. полный код можно глянуть тут https://github.com/GeorgGrebenyuk/civil3d_2_ifc, не жалко (как раз отладить...).

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
Хотя ... такой вариант  https://forums.autodesk.com/t5/civil-3d-forum/get-brep-information-about-pipe-from-brep-api/m-p/8771572#M398349(через преобразование в сеть) вполне себе рабочий .. но хотелось бы понять что я делаю не так с прямым перебором частей тела?
(или если тело состоит не из триангуляции, а из "поверхностей surface" и "областей region" мне как раз следует прибегать к Mesh2dControl?)

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Цитировать
На примере ниже при анализе "трубы" - вытянутого тела возвращаются вообще 2 точки
так и должно быть

https://standards.buildingsmart.org/IFC/DEV/IFC4_3/RC1/HTML/schema/ifctopologyresource/lexical/ifcadvancedface.htm

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
https://standards.buildingsmart.org/IFC/DEV/IFC4_3/RC1/HTML/schema/ifctopologyresource/lexical/ifcadvancedface.htm
Это стандартный случай, а как быть с гофрированными, квадратными с закруглениями трубами? Про колодцы и арматуру запорную вообще молчу с кучей граней и выступами техническими ... под такое ни один класс не сгодится кроме общего IfcShapeRepresentation

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Ты просто немножко не понимаешь как устроенно Boundary representation. В brep face может быть на поверхности любой формы, edge это кривая на этой поверхности
И например представление сферы - целая проблема и есть несколько вариантов её решения, и в том же Revit'е свера состоит из двух полусфер и это не самый лучший вариант

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
как устроенно Boundary representation.
даааа, вот поэтому и спрашиваю, и разбирать этот вариант тогда дальше нет смысла раз он не вернет нужный результат, хоть к чисто триангулированным телам вопросов и нет при использовании Brep :o;

то именно так и следует поступать
Вот тут надо видимо самому будет поколупать этот вариант преобразования, в код пока не вникал особо ... спасибо! Видимо буду тогда рассматривать этот путь как универсальный (в общем случае).

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Цитировать
нет смысла раз он не вернет нужный результат
Какой?

brep описание в сто раз меньше по объёму

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
Какой?
Внешнюю поверхность объекта в том виде, в каком она есть. Мне было же желательно получить её, этот обход согласен не нравится. И получить в точности - так как это информационная модель, то есть надо как-то перейти от граней Brep к таким граням, которые можно описать в конечном итоге как структуру "набор граней" - IfcConnectedFaceSet/IfcFacetedBrep.

Оптимально было бы вообще экспортировать представление тела куда-то во внешнюю среду ... я бы покопался с ним другим набором геометрических библиотек - но я даже это не могу сделать.  :'(

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
По моему сети лучше пробовать экспортировать как CSG геометрию беря её из объектов Civil'а

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
беря её
А какая эта функция у объектов?
Следуя логике "Constructive models represent a solid as a combination of primitive solids", это всё-таки и есть экспортируемые тела pipe_structure.Solid3dBody с которыми я работаю ... или есть ещё какая-то форма экспорта геометрии?

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
например экспортировать трубы в IfcExtrudedAreaSolid

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
трубы
А с колодцами как быть? Части солида я никак не получу из Brep ...

И для труб это справедливо только в простейшем случае, будь форма какая-нибудь с закруглениями уже не вариант .. не говоря про гофрированные, а цель передать точное представление геометрии


Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63
Цитировать
И для труб это справедливо только в простейшем случае, будь форма какая-нибудь с закруглениями уже не вариант
а в Civil'е такое возможно?

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

  • ADN OPEN
  • **
  • Сообщений: 50
  • Карма: 1
  • //Я не программист
а в Civil'е такое возможно?
Хммм, чего-то навскидку не могу найти - но вполне возможное такое - каналы под трубы с полочкой - это тоже объект сети будет


Ну ладно, трубы как-то близко к правде можно .. но колодцы?