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

ADN Club => AutoCAD .NET API => Тема начата: avc от 29-04-2025, 19:23:49

Название: BRep не работает с Surface
Отправлено: avc от 29-04-2025, 19:23:49
Не получается работать с поверхностями. Почти все методы требуют списки SubentityId ребер. А их негде получить. Метода GetAllSubentities (о котором толдычут все AI) не существует. А через BRep не получается ничего получить. У всех BRep полученных от любой Surface все списки пустые (точнее сбойные) - нет ни вертексов, ни повехностей, ни ребер. BRep пытался получать и то поверхности и от ее полного пути - без разницы.
Есть ли способ научить BRep работать с поверхностями или как-то получить список ребер обходным путем?
Название: Re: BRep не работает с Surface
Отправлено: Привалов Дмитрий от 30-04-2025, 12:25:32
Не получается работать с поверхностями.
Я с 3D не работаю, но типов поверхностей несколько, и возможно нужно ее преобразовать в другой тип.
Surface
PlaneSurface
LoftedSurface
SweptSurface
NurbSurface
RevolvedSurface
ExternalSurface
ExternalBoundedSurface

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

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

возможно чем-то поможет...
Название: Re: BRep не работает с Surface
Отправлено: avc от 30-04-2025, 13:21:52
Да вот похоже, что вообще никто с ними не работал :) Примеров гуглится ноль. Я собственно с солидами работаю и чисто до кучи решил, что раз моя команда работает с солидами, то и с поверхностями обязана работать. А не тут-то было...

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

Наличие метода GetAllSubentities у какого-то супер-экзотического AssocPersSubentityIdPE я нагуглил в примере на C++ под ARX. Там этом AssocPersSubentityIdPE получается из поверхности методом QueryX. В .Net тоже есть такой шаманский метод, но он возвращает не объект, а int. Так что никак не получить AssocPersSubentityIdPE. Да и, судя по названию, этот метод выдаст подобъекты ассоциативной поверхности; ассоциации, а не все ребра. А мне нужно работать с любыми поверхностями, включая не ассоциативные.
Название: Re: BRep не работает с Surface
Отправлено: Привалов Дмитрий от 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. }
Название: Re: BRep не работает с Surface
Отправлено: avc от 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.