Как получить фэйс (face) для экструзии?

Автор Тема: Как получить фэйс (face) для экструзии?  (Прочитано 12446 раз)

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

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

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Есть solid3d. Нужно получить один из его фэйсов по 3-м точкам и экструдировать его. Подскажите, как получить фэйс?

Заранее благодарен.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Нужно получить один из его фэйсов по 3-м точкам
Это как? Вообще-то Face может быть и не плоским...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Это как? Вообще-то Face может быть и не плоским...
Известно, что он плоский, поскольку получен Slice'ом на предыдущим этапе.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Начни отсюда: https://adn-cis.org/forum/index.php?topic=7169.msg21062#msg21062
Там есть алгоритм получения всех SubentId для Solid3d. Тебе нужно будет выбрать только ту, у которой Face соответствует твоим трём точкам.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Странно... Почему то не срабатывает директива "using Autodesk.AutoCAD.BoundaryRepresentation;".
Пишет: "Error   CS0234   The type or namespace name 'BoundaryRepresentation' does not exist in the namespace 'Autodesk.AutoCAD' (are you missing an assembly reference?)   ".
Что бы это значило? Автокадовские библиотеки вроде загружены...

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Автокадовские библиотеки вроде загружены...
Вроде или загружены? Подозреваю что эта не подключена: acdbmgdbrep.dll
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Подозреваю что эта не подключена: acdbmgdbrep.dll
Правильно подозреваешь. Просто я имел в виду 3 библиотеки из джентльменского набора.
Спасибо!

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
А как узнать принадлежит точка фэйсу или нет?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А как узнать принадлежит точка фэйсу или нет?
Для этого есть метод BrepEntity.GetPointContainment(Point3d point, out PointContainment containment). Значение PointContainment может быть трёх видов:
Код - C# [Выбрать]
  1. public enum PointContainment
  2. {
  3.         Inside, // Внутри
  4.         Outside, // Снаружи
  5.         OnBoundary // На границе
  6. }
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Никак не пойму почему такую конструкцию VS проглатывает:
Код - C# [Выбрать]
  1.                         if (sign == 1)
  2.                         {
  3.                             acSol3D.Layer = sLayerName; // перемещаем на уровень "IdealBendTools"
  4.                             acSol3D.Slice(acPlane1, false);  // >>>>>>>>>>>>>>>>>> ВТОРОЙ РАЗРЕЗ
  5.                             ObjectId[] idSolidSlice = new ObjectId[] { acSol3D.ObjectId };
  6.                             SubentityId subentId = new SubentityId(SubentityType.Null, IntPtr.Zero);
  7.                             FullSubentityPath path = new FullSubentityPath(idSolidSlice, subentId);
  8.                             List<SubentityId> subidSolidSlice = new List<SubentityId>();
  9.                             using (AcBr.Brep brep = new AcBr.Brep(path))
  10.                             {
  11.                                 foreach (AcBr.Face face in brep.Faces)
  12.                                 {
  13.                                     subidSolidSlice.Add(face.SubentityPath.SubentId);
  14.                                 }
  15.                             }
  16.  
  17.                         }
  18.                         else
  19.                         {
  20.                             acSol3DSlice.Layer = sLayerName; // перемещаем на уровень "IdealBendTools"
  21.                             Solid3d acSol3DSlice1 = acSol3DSlice.Slice(acPlane1, true); // >>>>>>>>>>>>>>>>>> ВТОРОЙ РАЗРЕЗ
  22.                             acBlkTblRec.AppendEntity(acSol3DSlice1);
  23.                             acTrans.AddNewlyCreatedDBObject(acSol3DSlice1, true);
  24.                             acSol3DSlice.Erase(true);
  25.                             ObjectId[] idSolidSlice = new ObjectId[] { acSol3DSlice1.ObjectId };
  26.                             SubentityId subentId = new SubentityId(SubentityType.Null, IntPtr.Zero);
  27.                             FullSubentityPath path = new FullSubentityPath(idSolidSlice, subentId);
  28.                             List<SubentityId> subidSolidSlice = new List<SubentityId>();
  29.                             using (AcBr.Brep brep = new AcBr.Brep(path))
  30.                             {
  31.                                 foreach (AcBr.Face face in brep.Faces)
  32.                                 {
  33.                                     subidSolidSlice.Add(face.SubentityPath.SubentId);
  34.                                 }
  35.                             }
  36.  
  37.                         }
  38.  
а про такую:
Код - C# [Выбрать]
  1.                         if (sign == 1)
  2.                         {
  3.                             acSol3D.Layer = sLayerName; // перемещаем на уровень "IdealBendTools"
  4.                             acSol3D.Slice(acPlane1, false);  // >>>>>>>>>>>>>>>>>> ВТОРОЙ РАЗРЕЗ
  5.                             ObjectId[] idSolidSlice = new ObjectId[] { acSol3D.ObjectId };
  6.                          }
  7.                         else
  8.                         {
  9.                             acSol3DSlice.Layer = sLayerName; // перемещаем на уровень "IdealBendTools"
  10.                             Solid3d acSol3DSlice1 = acSol3DSlice.Slice(acPlane1, true); // >>>>>>>>>>>>>>>>>> ВТОРОЙ РАЗРЕЗ
  11.                             acBlkTblRec.AppendEntity(acSol3DSlice1);
  12.                             acTrans.AddNewlyCreatedDBObject(acSol3DSlice1, true);
  13.                             acSol3DSlice.Erase(true);
  14.                             ObjectId[] idSolidSlice = new ObjectId[] { acSol3DSlice1.ObjectId };
  15.                         }
  16.  
  17.                         SubentityId subentId = new SubentityId(SubentityType.Null, IntPtr.Zero);
  18.                         FullSubentityPath path = new FullSubentityPath(idSolidSlice, subentId);
  19.                         List<SubentityId> subids = new List<SubentityId>();
  20.                         using (AcBr.Brep brep = new AcBr.Brep(path))
  21.                         {
  22.                             foreach (AcBr.Face face in brep.Faces)
  23.                             {
  24.                                 subidSolidSlice.Add(face.SubentityPath.SubentId);
  25.                             }
  26.                         }
говорит, что:
Error   CS0103   The name 'idSolidSlice' does not exist in the current context   
Error   CS0103   The name 'subidSolidSlice' does not exist in the current context   

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
говорит, что:
Error   CS0103   The name 'idSolidSlice' does not exist in the current context   
Error   CS0103   The name 'subidSolidSlice' does not exist in the current context   
Потому что следует немного изучить C#. ;) Посмотри область видимости idSolidSlice и subidSolidSlice. Вынеси их  определения так, чтобы там где ты к ним обращаешься они были видны...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Потому что следует немного изучить C#. ;) Посмотри область видимости idSolidSlice и subidSolidSlice. Вынеси их  определения так, чтобы там где ты к ним обращаешься они были видны...
Спасибо, помогло!
PS. Когда нет опыта ни в С#, ни в AutoCAD .NET'e, то такие проколы, к сожалению, неизбежны.

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Начни отсюда: https://adn-cis.org/forum/index.php?topic=7169.msg21062#msg21062
Там есть алгоритм получения всех SubentId для Solid3d. Тебе нужно будет выбрать только ту, у которой Face соответствует твоим трём точкам.
Face выбрал, но не получается экструдировать: не понимаю, как указать первый параметр в методе Solid3d.ExtrudeFacesAlongPath. Пробовал разные варианты, но ответ всегда один: Argument 1: cannot convert from 'Autodesk.AutoCAD.DatabaseServices.SubentityId' to 'Autodesk.AutoCAD.DatabaseServices.SubentityId[]'.
Вот пример моего кода:
Код - C# [Выбрать]
  1.                         Point3d arcStartPoint = new Point3d(lengthX / 2, bendCoor, lengthZ / 2);
  2.                         Arc acArcPath;
  3.                         using (acArcPath = new Arc(arcStartPoint, rBend+hBend/2, 0, alfaBend))
  4.                         {
  5.                             // Add the new object to the block table record and the transaction
  6.                             acBlkTblRec.AppendEntity(acArcPath);
  7.                             acTrans.AddNewlyCreatedDBObject(acArcPath, true);
  8.                         }
  9.  
  10.  
  11.                         PtToCheck = new Point3d(lengthZ / 2, bendCoor, lengthZ / 2);
  12.                         SubentityId subentId = new SubentityId(SubentityType.Null, IntPtr.Zero);
  13.                         FullSubentityPath path = new FullSubentityPath(idSolidSlice, subentId);
  14.                         using (AcBr.Brep brep = new AcBr.Brep(path))
  15.                         {
  16.                             foreach (AcBr.Face face in brep.Faces)
  17.                             {
  18.                                 PointContainment ptContainment = new PointContainment();
  19.                                 using (BrepEntity brepEnt = face.GetPointContainment(PtToCheck, out ptContainment))
  20.                                 {
  21.                                     {
  22.                                         if (ptContainment == PointContainment.Inside)
  23.                                         {
  24.                                            Solid3d bendPart = Solid3d.ExtrudeFacesAlongPath(face.SubentityPath.SubentId, acArcPath);
  25.                                         }
  26.                                     }
  27.                                 }
  28.                             }
  29.                         }
  30.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Пробовал разные варианты, но ответ всегда один: Argument 1: cannot convert from 'Autodesk.AutoCAD.DatabaseServices.SubentityId' to 'Autodesk.AutoCAD.DatabaseServices.SubentityId[]'.
Передавать нужно массив SubentityId, а не один SubentityId. И в массиве только один элемент: face.SubentityPath.SubentId
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ***
  • Сообщений: 188
  • Карма: 2
Не могу понять, почему не выполняется экструзия (при этом никаких ошибок не генерится). Вот кусок кода:

Код - C# [Выбрать]
  1. ...
  2.  Point3d arcCentrePoint = new Point3d(lengthX/2 - (rBend+hBend/2), bendCoor, lengthZ / 2);
  3.  Arc acArcPath;
  4.  using (acArcPath = new Arc(arcCentrePoint, rBend+hBend/2, 0, alfaBend* Math.PI/180))
  5.  {
  6.      Matrix3d curUCSMatrix = acDoc.Editor.CurrentUserCoordinateSystem;
  7.      CoordinateSystem3d curUCS = curUCSMatrix.CoordinateSystem3d;
  8.  
  9.      Vector3d vRot = new Point3d(lengthX / 2, bendCoor, lengthZ / 2).
  10.                      GetVectorTo(new Point3d(lengthX / 2, bendCoor + 10, lengthZ / 2));
  11.      acArcPath.TransformBy(Matrix3d.Rotation(Math.PI / 2, vRot, new Point3d(lengthX / 2, bendCoor, lengthZ / 2)));
  12.  
  13.      acBlkTblRec.AppendEntity(acArcPath);
  14.      acTrans.AddNewlyCreatedDBObject(acArcPath, true);
  15.  }
  16.  
  17.  
  18.  PtToCheck = new Point3d(lengthZ / 2, bendCoor, lengthZ / 2);
  19.  SubentityId subentId = new SubentityId(SubentityType.Null, IntPtr.Zero);
  20.  FullSubentityPath path = new FullSubentityPath(idSolidSlice, subentId);
  21.  using (AcBr.Brep brep = new AcBr.Brep(path))
  22.  {
  23.       foreach (AcBr.Face face in brep.Faces)
  24.      {
  25.          PointContainment ptContainment = new PointContainment();
  26.          using (BrepEntity brepEnt = face.GetPointContainment(PtToCheck, out ptContainment))
  27.          {
  28.              {
  29.                  if (ptContainment == PointContainment.Inside)
  30.                  {
  31.                      SubentityId[] arraySubentityId = new SubentityId[] { face.SubentityPath.SubentId };
  32.                      using (Solid3d extrFromFace = new Solid3d())
  33.                      {
  34.                          extrFromFace.ExtrudeFacesAlongPath(arraySubentityId, acArcPath);
  35.                          acBlkTblRec.AppendEntity(extrFromFace);
  36.                          acTrans.AddNewlyCreatedDBObject(extrFromFace, true);
  37.                      }
  38.                  }
  39.              }
  40.          }
  41.      }
  42. }
  43. ...
  44.