BRep не работает с Surface

Автор Тема: BRep не работает с Surface  (Прочитано 1214 раз)

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

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

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

  • ADN Club
  • *****
  • Сообщений: 843
  • Карма: 170
    • Мои плагины к Автокаду
BRep не работает с Surface
« : 29-04-2025, 19:23:49 »
Не получается работать с поверхностями. Почти все методы требуют списки SubentityId ребер. А их негде получить. Метода GetAllSubentities (о котором толдычут все AI) не существует. А через BRep не получается ничего получить. У всех BRep полученных от любой Surface все списки пустые (точнее сбойные) - нет ни вертексов, ни повехностей, ни ребер. BRep пытался получать и то поверхности и от ее полного пути - без разницы.
Есть ли способ научить BRep работать с поверхностями или как-то получить список ребер обходным путем?

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 557
  • Карма: 120
Re: BRep не работает с Surface
« Ответ #1 : 30-04-2025, 12:25:32 »
Не получается работать с поверхностями.
Я с 3D не работаю, но типов поверхностей несколько, и возможно нужно ее преобразовать в другой тип.
Surface
PlaneSurface
LoftedSurface
SweptSurface
NurbSurface
RevolvedSurface
ExternalSurface
ExternalBoundedSurface

у Surface есть метод
public NurbSurface[] ConvertToNurbSurface();

Из поиска в справке метод GetAllSubentities есть у класса
Autodesk.AutoCAD.DatabaseServices.AssocPersSubentityIdPE

возможно чем-то поможет...

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

  • ADN Club
  • *****
  • Сообщений: 843
  • Карма: 170
    • Мои плагины к Автокаду
Re: BRep не работает с Surface
« Ответ #2 : 30-04-2025, 13:21:52 »
Да вот похоже, что вообще никто с ними не работал :) Примеров гуглится ноль. Я собственно с солидами работаю и чисто до кучи решил, что раз моя команда работает с солидами, то и с поверхностями обязана работать. А не тут-то было...

Как я понимаю объектов типа Surface не существует - это абстрактный класс-предок. В чертеже я тестировал плоские и nurbs-поверхности. Они-то и не работают с bRep.

Наличие метода GetAllSubentities у какого-то супер-экзотического AssocPersSubentityIdPE я нагуглил в примере на C++ под ARX. Там этом AssocPersSubentityIdPE получается из поверхности методом QueryX. В .Net тоже есть такой шаманский метод, но он возвращает не объект, а int. Так что никак не получить AssocPersSubentityIdPE. Да и, судя по названию, этот метод выдаст подобъекты ассоциативной поверхности; ассоциации, а не все ребра. А мне нужно работать с любыми поверхностями, включая не ассоциативные.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 557
  • Карма: 120
Re: BRep не работает с Surface
« Ответ #3 : 30-04-2025, 15:04:30 »
но он возвращает не объект, а int
https://stackoverflow.com/questions/53438729/autocad-associative-framework-getedgevertexsubentities-fatal-error

Код - C# [Выбрать]
  1. IntPtr pSubentityIdPE = entity.QueryX(protocolClass);
  2. if (pSubentityIdPE == IntPtr.Zero)
  3. {
  4.     return;
  5. }
  6. subentityIdPE = AssocPersSubentityIdPE.Create(pSubentityIdPE, false) as AssocPersSubentityIdPE;
  7. if (subentityIdPE == null)
  8. {
  9.   return;
  10. }

Отмечено как Решение avc 30-04-2025, 17:20:08

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

  • ADN Club
  • *****
  • Сообщений: 843
  • Карма: 170
    • Мои плагины к Автокаду
Re: BRep не работает с Surface
« Ответ #4 : 30-04-2025, 17:20:02 »
Неожиданно, но это работает для всех подопытных поверхностей! Благодарю за помощь.
Код - C# [Выбрать]
  1.     public static SubentityId[]
  2.     GetAllEdges(this Entity entity)
  3.     {
  4.       if (entity is Db.Surface)
  5.       {
  6.         IntPtr pSubentityIdPE = entity.QueryX(Rt.RXObject.GetClass(typeof(AssocPersSubentityIdPE)));
  7.         if (pSubentityIdPE == IntPtr.Zero) return Array.Empty<SubentityId>();
  8.         using AssocPersSubentityIdPE subentityIdPE = Rt.RXObject.Create(pSubentityIdPE, false) as AssocPersSubentityIdPE;
  9.         if (subentityIdPE is null) return Array.Empty<SubentityId>();
  10.         return subentityIdPE.GetAllSubentities(entity, SubentityType.Edge);
  11.       }
  12.       else....
  13.     }
  14.  
  15. .....
  16.             SubentityId[] all = surface.GetAllEdges();
  17.             ObjectId gapSurfId = Db.Surface.CreateExtendSurface(surface.Id, all, gap, Db.Surface.EdgeExtensionType.StretchEdge, false);
  18.