Объединение Surface

Автор Тема: Объединение Surface  (Прочитано 10536 раз)

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Объединение Surface
« : 28-02-2021, 16:23:52 »
День добрый.
Никто не сталкивался с задачей объединения Surface в одну большую поверхность? Есть много треугольников (Face), по ним создается Surface, а потом уже общая....но...
Не могу понять почему не работает surface.BooleanUnion(locSurface) не выводит результат в единую поверхность.
Код - C# [Выбрать]
  1. [CommandMethod("RR", CommandFlags.UsePickSet)]
  2.         // Поиск максимальных/минимальных треугольников по координате Z
  3.         public static void RR()
  4.         {
  5.             AccessDoc AcToDraw = new AccessDoc();
  6.             Database db = AcToDraw.DBase;
  7.             Editor ae = AcToDraw.Ed;
  8.             List<Triangle> triangleList = TriangleList();
  9.  
  10.             using (Transaction tr = db.TransactionManager.StartTransaction())
  11.             {
  12.                 //Перебираем поверхности
  13.                 BlockTableRecord blocktableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  14.                 Face face = (Face)tr.GetObject(triangleList.First().IdFace, OpenMode.ForWrite);
  15.                 triangleList.Remove(triangleList.First());
  16.                 Autodesk.AutoCAD.DatabaseServices.Surface surface = new Autodesk.AutoCAD.DatabaseServices.Surface();
  17.                 surface = Autodesk.AutoCAD.DatabaseServices.Surface.CreateFrom(face);
  18.                 //blocktableRecord.AppendEntity(surface);
  19.                 //tr.AddNewlyCreatedDBObject(surface, true);
  20.                 foreach (Triangle triangle in triangleList)
  21.                 {
  22.                     face = (Face)tr.GetObject(triangle.IdFace, OpenMode.ForWrite);
  23.                     Autodesk.AutoCAD.DatabaseServices.Surface locSurface = new Autodesk.AutoCAD.DatabaseServices.Surface();
  24.                     locSurface = Autodesk.AutoCAD.DatabaseServices.Surface.CreateFrom(face);
  25.                     //blocktableRecord.AppendEntity(locSurface);
  26.                     //tr.AddNewlyCreatedDBObject(locSurface, true);
  27.                     surface.BooleanUnion(locSurface);
  28.                 }
  29.                 blocktableRecord.AppendEntity(surface);
  30.                 tr.AddNewlyCreatedDBObject(surface, true);
  31.                
  32.  
  33.  
  34.                 tr.Commit();
  35.             }
  36.         }
  37.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Объединение Surface
« Ответ #1 : 28-02-2021, 16:39:13 »
Исключение какое-нибудь возникает?
Ну и как минимум вместо:
Код - C# [Выбрать]
  1. surface.BooleanUnion(locSurface);
должно быть:
Код - C# [Выбрать]
  1. surface = surface.BooleanUnion(locSurface);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Объединение Surface
« Ответ #2 : 28-02-2021, 16:46:46 »
При
Код - C# [Выбрать]
  1. surface = surface.BooleanUnion(locSurface);
  2.  
Фатал Error
Код - C# [Выбрать]
  1. -----Current Stack:
  2.    � acadUnhandledExceptionFilter(_EXCEPTION_POINTERS* )
  3.  
  4.    � acadUnhandledExceptionFilter(_EXCEPTION_POINTERS* )
  5.  
  6.    � Autodesk.AutoCAD.Runtime.UnhandledExceptionFilter.Filter(_EXCEPTION_POINTERS* ep)
  7.  
  8.    � Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
  9.  
  10.    � EngineeringProtection.TriangleThalwegLine.RR() � G:\Csharp\Programm\005-EngineeringProtection\EngineeringProtection\EngineeringProtection\03-TriangleThalwegLine.cs:������ 476
  11.  
  12.    � Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorker(MethodInfo mi, Object commandObject, Boolean bLispFunction)
  13.  
  14.    � Autodesk.AutoCAD.Runtime.CommandClass.InvokeWorkerWithExceptionFilter(MethodInfo mi, Object commandObject, Boolean bLispFunction)
  15.  
  16.    � Autodesk.AutoCAD.Runtime.CommandClass.CommandThunk.Invoke()
  17.  



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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Объединение Surface
« Ответ #3 : 28-02-2021, 16:49:43 »
Исключений нет при:
Код - C# [Выбрать]
  1.  surface.BooleanUnion(locSurface);
  2.  

Работает все норм без исключений, но без результата

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Объединение Surface
« Ответ #4 : 28-02-2021, 16:51:29 »
А если так:
Код - C# [Выбрать]
  1. Surface surface1 = surface.BooleanUnion(locSurface);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Объединение Surface
« Ответ #5 : 28-02-2021, 16:56:12 »
не работает


в ручную через union все хорошо получается.

Отмечено как Решение Judas 07-03-2021, 15:32:04

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Объединение Surface
« Ответ #6 : 28-02-2021, 16:59:49 »
Judas,
Ну я так понимаю, что треугольники должны быть отсортированы так, чтобы объединялись те, у которых есть общие грани. Ведь объединить два треугольника, которые не имеют общих граней нельзя - поверхность не получится.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Объединение Surface
« Ответ #7 : 28-02-2021, 17:06:51 »
Да. Верно. Это поверхность после триангуляции.
Специально тестил на данном примере. в ручную, через штатные инструменты автокада - все получается все выбираются и объединяются.
Как минимум у них есть 1 общая точка.



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Объединение Surface
« Ответ #8 : 28-02-2021, 17:18:35 »
Как минимум у них есть 1 общая точка.
Ты не понял. На вход surface.BooleanUnion нужно передавать Surface имеющую с surface общее ребро.
Но не исключаю, что API работает не так как следует. Так что или использовать командные методы или придумывать другой алгоритм, на который я давал ссылку раньше: https://www.keanw.com/2009/07/triangulating-an-autocad-sub-division-mesh-from-a-set-of-points-using-net.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Объединение Surface
« Ответ #9 : 28-02-2021, 17:31:13 »
По разбираюсь, но странновато почему - ручные работают, а в с# нет.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Объединение Surface
« Ответ #10 : 28-02-2021, 17:35:15 »
По разбираюсь, но странновато почему - ручные работают, а в с# нет.
Абсолютно ничего странного - команда значительно сложнее, чем просто метод BooleanUnion.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Объединение Surface
« Ответ #11 : 28-02-2021, 17:50:06 »
Могу подтвердить, что BooleanUnion c surface вполне нормально работает. По крайней мере на моих тестовых примерах, сразу после конвертации из сетей. И да, в реализации метода (именно в AutoCAD) есть ошибка - возвращает всегда null, а результат запихивается в this. Приходится клонировать поверхность перед вызовом BooleanUnion.

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Объединение Surface
« Ответ #12 : 07-03-2021, 15:58:12 »
avc
Цитировать
Могу подтвердить, что BooleanUnion c surface вполне нормально работает. По крайней мере на моих тестовых примерах, сразу после конвертации из сетей. И да, в реализации метода (именно в AutoCAD) есть ошибка - возвращает всегда null, а результат запихивается в this. Приходится клонировать поверхность перед вызовом BooleanUnion.
Можно консультацию?
А как вы объединяете сеть? т.е. 10000 face получается 10000 SubDMesh.
Потом их объединяете? Или сразу делаете SubDMesh на все выбранные Face?
Если делаете сразу 1 сеть на все поделитесь секретом успеха..

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Объединение Surface
« Ответ #13 : 07-03-2021, 16:11:20 »
Никакого секрета. У меня простая программа конвертации СЕТЕЙ (PolyFaceMesh и SubDMesh) в солиды. https://sites.google.com/site/avcplugins/meshtosolid 
Но не этих странных AcDbFace. Сети генерят дизайнеры в 3DSMax. А Face в реальной жизни не встречаются.

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

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: 0
Re: Объединение Surface
« Ответ #14 : 07-03-2021, 16:28:29 »
Печаль..