Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: avc от 19-04-2017, 19:15:24

Название: Сделать плоский снимок с сети SubDMesh
Отправлено: avc от 19-04-2017, 19:15:24
Делаю плоские снимки с трехмерки с помощью кода, взятого с этого форума. Надо просто спроецировать объект на 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.  
Название: Re: Сделать плоский снимок с сети SubDMesh
Отправлено: Александр Ривилис от 19-04-2017, 21:07:54
Если ты говоришь, что нормально работает с Solid3d, то почему не выполнить конвертацию SubDMesh в Solid3d?
Название: Re: Сделать плоский снимок с сети SubDMesh
Отправлено: avc от 19-04-2017, 21:40:53
почему не выполнить конвертацию SubDMesh в Solid3d?
Неее, эта конвертация - зло, это отличный способ вызвать фатал. Или, по меньшей мере надолго, завесить Автокад. Даже если сработает - это  самый дорогой способ.
А в коде явных ляпов нет? Должна же работать "секущая плоскость" ...теоретически
Название: Re: Сделать плоский снимок с сети SubDMesh
Отправлено: Александр Ривилис от 20-04-2017, 12:57:28
А в коде явных ляпов нет? Должна же работать "секущая плоскость" ...теоретически
Я нигде не вижу информации работает ли вообще Section с SubDMesh. Скорее сказано обратное. (http://help.autodesk.com/view/OARX/2018/ENU/?guid=OREF-AcDbSection__generateSectionGeometry_AcDbEntity___AcArray_AcDbEntity____AcArray_AcDbEntity____AcArray_AcDbEntity____AcArray_AcDbEntity____AcArray_AcDbEntity____const):

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

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

Название: Re: Сделать плоский снимок с сети SubDMesh
Отправлено: avc от 20-04-2017, 13:17:49
придётся конвертировать
Да, похоже без этого никак. Возможно FlatShot тоже конвертацией занимается. Спасибо за помощь!

Название: Re: Сделать плоский снимок с сети SubDMesh
Отправлено: Александр Ривилис от 20-04-2017, 13:20:24
придётся конвертировать
Да, похоже без этого никак. Возможно FlatShot тоже конвертацией занимается. Спасибо за помощь!
Кстати в том примере, на который я когда-то давал ссылку, тоже стоит ограничение на типы примитивов, для которых выполняется сечение: Solid3d, Surface, Body, Region.
Название: Re: Сделать плоский снимок с сети SubDMesh
Отправлено: avc от 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.