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

ADN Club => AutoCAD .NET API => Тема начата: Балиев от 24-04-2020, 18:10:22

Название: Что означает originOfPlanarEntity?
Отправлено: Балиев от 24-04-2020, 18:10:22
В описании свойства "PointOnPlane" говорится, что оно вовращает "originOfPlanarEntity". Что это такое? Может быть геометрический центр тяжести фигуры?
Если нет, то как "вытащить" центр тяжести плоского face?
Заранее благодарен.
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Koropet от 25-04-2020, 14:43:41
Если зайти в описание класса PlanarEntity  (очевидно, вы его имели в виду, я полагаю) то там описывается, что originOfPlanarEntity это не что иное, как начало координат в местной системе координат этой плоскости.
https://help.autodesk.com/view/OARX/2019/ENU/?guid=OREFNET-Autodesk_AutoCAD_Geometry_PlanarEntity
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 25-04-2020, 15:52:35
Если нет, то как "вытащить" центр тяжести плоского face?
Вытащить нельзя. Можно только рассчитать...
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 25-04-2020, 17:34:27
Вытащить нельзя. Можно только рассчитать...
Жаль. А нельзя ли получить копию геометрии плоского face в виде region?
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 25-04-2020, 17:43:15
Вытащить нельзя. Можно только рассчитать...
Жаль. А нельзя ли получить копию геометрии плоского face в виде region?
О каком Face идёт речь?
Есть Autodesk.AutoCAD.DatabaseServices.Face и есть Autodesk.AutoCAD.BoundaryRepresentation.Face
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 25-04-2020, 17:47:23
О каком Face идёт речь?
Есть Autodesk.AutoCAD.DatabaseServices.Face и есть Autodesk.AutoCAD.BoundaryRepresentation.Face
Autodesk.AutoCAD.BoundaryRepresentation.Face
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 25-04-2020, 17:55:48
О каком Face идёт речь?
Есть Autodesk.AutoCAD.DatabaseServices.Face и есть Autodesk.AutoCAD.BoundaryRepresentation.Face
Autodesk.AutoCAD.BoundaryRepresentation.Face
Прямого метода преобразования нет. Тебе нужно получить все Loop'ы этого Face, затем на основе их построить Polyline'ии и из их коллекции получить Region. Если это конечно получится.
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 25-04-2020, 18:10:39
Мда-а... Буду пробовать.
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 27-04-2020, 17:14:17
Тебе нужно получить все Loop'ы этого Face, затем на основе их построить Polyline'ии и из их коллекции получить Region.
А что имеется в виду под "затем на основе их построить Polyline'ии"?
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 27-04-2020, 17:16:18
А что имеется в виду под "затем на основе их построить Polyline'ии"?
Создать Polyline по коллекции точек, полученной из Face.
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 27-04-2020, 20:45:37
Вот фрагмент кода:

Код - C# [Выбрать]
  1. using (AcBr.Brep brep = new AcBr.Brep(path))
  2.  {
  3.      foreach (AcBr.Face face in brep.Faces)
  4.      {
  5.          Double normalToFace = ((Autodesk.AutoCAD.Geometry.PlanarEntity)
  6.                                ((Autodesk.AutoCAD.Geometry.ExternalBoundedSurface)face.Surface)
  7.                               .BaseSurface).Normal.Y;
  8.          double pointOnPlane = ((Autodesk.AutoCAD.Geometry.PlanarEntity)
  9.                                ((Autodesk.AutoCAD.Geometry.ExternalBoundedSurface)face.Surface)
  10.                                .BaseSurface).PointOnPlane.Y;
  11.          if (normalToFace != 0 && Math.Round(pointOnPlane, 2) == Math.Round(bendCoor, 2))
  12.          {
  13.              arraySubentityId = new SubentityId[] { face.SubentityPath.SubentId };
  14.              FaceLoopCollection bLoops = face.Loops;
  15.              foreach (LoopVertexCollection verteciesOfLoop in bLoops.GetEnumerator())
  16.              {
  17.  
  18.              }
  19.          }
  20.      }
  21.  }
Два вопроса по нему:
1. Нельзя ли как-то поизящнее получать значение переменных normalToFace и pointOnPlane (в смысле длинны строки кода)?
2. Я не понимаю, почему на строке 15  VS выдает ошибку: "foreach statement cannot operate on variables of type 'FaceLoopEnumerator' because 'FaceLoopEnumerator' does not contain a public instance definition for 'GetEnumerator'"? Я знаю, что не выполняются необходимые условия для Foreach, но не понимаю, в чем проблема.
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 27-04-2020, 21:10:25
Замени:
Код - C# [Выбрать]
  1. foreach (LoopVertexCollection verteciesOfLoop in bLoops.GetEnumerator())
на
Код - C# [Выбрать]
  1. foreach (BoundaryLoop boundaryLoop in bLoops)
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 29-04-2020, 13:03:30
Тебе нужно получить все Loop'ы этого Face, затем на основе их построить Polyline'ии и из их коллекции получить Region. Если это конечно получится.
Я правильно понимаю, что, если Face имеет, например, геометрию кольца, то предложенным способом решить проблему не получится?
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 29-04-2020, 13:06:10
Тебе нужно получить все Loop'ы этого Face, затем на основе их построить Polyline'ии и из их коллекции получить Region. Если это конечно получится.
Я правильно понимаю, что, если Face имеет, например, геометрию кольца, то предложенным способом решить проблему не получится?
Почему? Ты скорее всего получишь два Loop - один внутренний и один наружный.
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 29-04-2020, 13:24:07
Почему? Ты скорее всего получишь два Loop - один внутренний и один наружный.
Да, но как я пойму, что этот Loop - окружность?
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 29-04-2020, 13:29:55
Почему? Ты скорее всего получишь два Loop - один внутренний и один наружный.
Да, но как я пойму, что этот Loop - окружность?
А зачем тебе понимать что это окружность? Возьми создай соответствующий 3DSolid (я так понимаю, что это что-то типа тора) и посмотри что получится.
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 29-04-2020, 13:48:49
А зачем тебе понимать что это окружность? Возьми создай соответствующий 3DSolid (я так понимаю, что это что-то типа тора) и посмотри что получится.
Что-то я совсем тебя не понял... Давай, сначала:
Мне нужно из Face получить Region.
Ты предлагаешь из Face получить Loops, из Loop получить Vertecies, чтобы по ним построить Polyline и коллекцию Polyline  преобразовать в Region.
Мой вопрос: если Face это окружность, то из Loop я могу достать только одну точку - центр окружности и при этом никто мне не скажет, что это окружность. Как на основе этой информации мне воспроизвести окружность?
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 29-04-2020, 13:52:11
если Face это окружность, то из Loop я могу достать только одну точку - центр окружности
Ты это проверил или так думаешь?
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 29-04-2020, 14:47:17
Ты это проверил или так думаешь?
Проверил на круглом сечении. В окне "Locals" VS у единственной Loop есть только один Vertecies - точка на окружности (даже не центр).
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Александр Ривилис от 29-04-2020, 14:54:46
Ты это проверил или так думаешь?
Проверил на круглом сечении. В окне "Locals" VS у единственной Loop есть только один Vertecies - точка на окружности (даже не центр).
Тогда попробуй через свойство Edges - у каждого Edge есть свойство Curve (класс Autodesk.AutoCAD.Geometry.Curve3d), которое можно преобразовать в Curve ( Autodesk.AutoCAD.DatabaseServices.Curve )
Название: Re: Что означает originOfPlanarEntity?
Отправлено: Балиев от 29-04-2020, 20:29:25
Тогда попробуй через свойство Edges - у каждого Edge есть свойство Curve (класс Autodesk.AutoCAD.Geometry.Curve3d), которое можно преобразовать в Curve ( Autodesk.AutoCAD.DatabaseServices.Curve )
Так тоже не получилось (может быть что-то не то делал). Зато придумал, как можно решить задачу по-другому. Нужно не пытаться преобразовать Face в Region, а извлечь в том же месте сечение солида - и сразу получаешь нужный Region. Вот фрагмент кода:
Код - C# [Выбрать]
  1.   Plane acPlane = new Plane(Pt1, Pt2, Pt3); // Создаем плоскость для получения сечения
  2.   Db.Region acRegion = acSol3D.GetSection(acPlane);   // Получаем сечение в виде региона
  3.   Solid3d tmpSolid = new Solid3d();
  4.   tmpSolid.Extrude(acRegion, 1, 0); // экструдируем солид, чтобы не нужно было вертеть сечение
  5.   var heightCentre = tmpSolid.MassProperties.Centroid.Z; // получаем нужную координату
  6.   tmpSolid.Dispose();
  7.   acRegion.Dispose();
  8.  
Но в любом случае, спасибо за советы!