Сделать плоский снимок с сети SubDMesh

Автор Тема: Сделать плоский снимок с сети SubDMesh  (Прочитано 4408 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Делаю плоские снимки с трехмерки с помощью кода, взятого с этого форума. Надо просто спроецировать объект на XY. С солидами и поверхностями все прекрасно работает. С сетями SubDMesh - код возвращает пусты массивы. Никаких сообщений об ошибках. FlatShot с этими сетями работает на ура (в отличие от PolyFaceMesh, но с ними я разобрался по другому). К сожалению не понимаю часть настроек секущей плоскости. Может для сетей надо как-то по другому настраивать?

Код - C# [Выбрать]
  1.  SectionType st = SectionType.Section2d;
  2.         Extents3d ext = source.GeometricExtents; // source - это объект с которого надо сделать снимок
  3.         Point3dCollection pts = new Point3dCollection();
  4.  
  5.         double planeElev = Math.Round(ext.MaxPoint.Z + 5, 0);
  6.         pts.Add(new Point3d(ext.MaxPoint.X, ext.MaxPoint.Y, planeElev));
  7.         pts.Add(new Point3d(ext.MinPoint.X, ext.MinPoint.Y, planeElev));
  8.  
  9.         BlockTableRecord model = EntityExt.GetModel(tr, db);
  10.         if (model == null) return false;
  11.  
  12.         Section sec = new Section(pts, Vector3d.YAxis, Vector3d.ZAxis.Negate());
  13.         sec.State = SectionState.Plane;
  14.         model.AppendEntity(sec);
  15.         tr.AddNewlyCreatedDBObject(sec, true);
  16.  
  17.         sec.SetHeight(SectionHeight.HeightAboveSectionLine, 3.0); // я просто скопировал эту строку - смысл не знаю
  18.         sec.SetHeight(SectionHeight.HeightBelowSectionLine, 1.0); // я просто скопировал эту строку - смысл не знаю
  19.         SectionSettings ss = (SectionSettings)tr.GetObject(sec.Settings, OpenMode.ForWrite);
  20.         ss.CurrentSectionType = st;
  21.         ObjectIdCollection oic = new ObjectIdCollection();
  22.         oic.Add(source.ObjectId);
  23.         ss.SetSourceObjects(st, oic);
  24.         ss.SetVisibility(st, SectionGeometry.BackgroundGeometry, true); //тоже непонятные настройки
  25.         ss.SetHiddenLine(st, SectionGeometry.BackgroundGeometry, false);  //тоже непонятные настройки
  26.         ss.SetGenerationOptions(st, SectionGeneration.SourceSelectedObjects | SectionGeneration.DestinationFile);
  27.  
  28.         Array flEnts, bgEnts, foregEntities, ftEnts, ctEnts;
  29.         sec.GenerateSectionGeometry(source, out flEnts, out bgEnts, out foregEntities, out ftEnts, out ctEnts);
  30.  

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сделать плоский снимок с сети SubDMesh
« Ответ #1 : 19-04-2017, 21:07:54 »
Если ты говоришь, что нормально работает с Solid3d, то почему не выполнить конвертацию SubDMesh в Solid3d?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Сделать плоский снимок с сети SubDMesh
« Ответ #2 : 19-04-2017, 21:40:53 »
почему не выполнить конвертацию SubDMesh в Solid3d?
Неее, эта конвертация - зло, это отличный способ вызвать фатал. Или, по меньшей мере надолго, завесить Автокад. Даже если сработает - это  самый дорогой способ.
А в коде явных ляпов нет? Должна же работать "секущая плоскость" ...теоретически

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сделать плоский снимок с сети SubDMesh
« Ответ #3 : 20-04-2017, 12:57:28 »
А в коде явных ляпов нет? Должна же работать "секущая плоскость" ...теоретически
Я нигде не вижу информации работает ли вообще Section с SubDMesh. Скорее сказано обратное.:

Цитировать
Sectionable entities include AcDb3dSolid, AcDbSurface, AcDbBody, and AcDbRegion.

Так что вероятнее всего тебя придётся конвертировать SubDMesh или в Solid3d или в Surface - для этого есть методы в классе SubDMesh.

Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Сделать плоский снимок с сети SubDMesh
« Ответ #4 : 20-04-2017, 13:17:49 »
придётся конвертировать
Да, похоже без этого никак. Возможно FlatShot тоже конвертацией занимается. Спасибо за помощь!


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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Сделать плоский снимок с сети SubDMesh
« Ответ #5 : 20-04-2017, 13:20:24 »
придётся конвертировать
Да, похоже без этого никак. Возможно FlatShot тоже конвертацией занимается. Спасибо за помощь!
Кстати в том примере, на который я когда-то давал ссылку, тоже стоит ограничение на типы примитивов, для которых выполняется сечение: Solid3d, Surface, Body, Region.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Сделать плоский снимок с сети SubDMesh
« Ответ #6 : 20-04-2017, 13:25:22 »
Код для конвертации получился такой:
Код - C# [Выбрать]
  1. if (source is SubDMesh) // не работает с Section
  2.       {
  3.         SubDMesh mesh = (source as SubDMesh);
  4.         if (mesh.NumberOfFaces > 1000)  
  5.           {...сообщаем пользователю, что с такими жуткими сетями мы работать не умеем.... ; return false;  }
  6.         bool ok = false;
  7.         try
  8.         {
  9.           if (mesh.Watertight) // можно попытаться конвертировать в солид
  10.           {
  11.             source = mesh.ConvertToSolid(false, false);
  12.             ok = source != null && !(source as Solid3d).IsNull;
  13.           }
  14.           else
  15.           {
  16.             source = mesh.ConvertToSurface(false, false);
  17.             ok = source != null;
  18.           }
  19.         }
  20.         catch { ok = false; } // не редкий случай
  21.  
  22.         if (!ok) // конвертировать не вышло - взорвем на face
  23.         {
  24.           DBObjectCollection col = new DBObjectCollection();
  25.           mesh.Explode(col);
  26.           foreach (DBObject obj in col)
  27.           {
  28.             // тут вызов кода для превращения face в линии и проецирования их на XY
  29.             ...
  30.           }
  31.           return true;
  32.         }
  33.       }
  34. // далее работаем с source через Section
  35.