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

ADN Club => AutoCAD .NET API => Тема начата: Привалов Дмитрий от 05-06-2020, 11:10:05

Название: Как получить контур Region в AutoCAD2010
Отправлено: Привалов Дмитрий от 05-06-2020, 11:10:05
Хочу получить конур Region в виде примитивов AutoCAD и добавить в БД.
Экспериментирую с контуром окружностью для Region.

Собственно вроде понятно, что для того, чтобы получить контур используем brep.
Код - C# [Выбрать]
  1. using AcBr = Autodesk.AutoCAD.BoundaryRepresentation;
  2.  
  3. AcBr.Brep brep = new AcBr.Brep( r );
  4. foreach (AcBr.Face face in brep.Faces)
  5. {
  6.         foreach (AcBr.BoundaryLoop loop in face.Loops)
  7.         {
  8.                 foreach (AcBr.Edge e in loop.Edges)
  9.                 {
  10.                         Curve3d curve = e.Curve;
  11.                 }
  12.         }
  13. }

Если я ничего не напутал, то получил контур, в виде Curve3d.
Как бы извлечь из него окружность.
Хочу перевести в Curve, чтобы добавить в БД чертеже.

И насколько я понял можно сделать преобразование
var gcur2 = Curve.CreateFromGeCurve( proj )

...да вот беда, в AutoCAD2010 нет метода Curve.CreateFromGeCurve

Можно спроецировать Curve3d на плоскость и получить Entity3d но пока не вижу методов в AutoCAD2010 чтобы снова получить окружность.
Название: Re: Как получить контур Region в AutoCAD2010
Отправлено: avc от 05-06-2020, 11:17:41
Не стоит усложнять. Есть же Region.Explode(). Причем метод универсальный - он вообще-то от DBObject унаследован.
Но через bRep я тоже делал: https://sites.google.com/site/avcprg/flat (https://sites.google.com/site/avcprg/flat)
Curve3d можно проанализировать, составить список линий и дуг и построить новую полилинию. Вместе со всеми оптимизациями контуров это всего-то 3-5 тысяч строк кода :)
Название: Re: Как получить контур Region в AutoCAD2010
Отправлено: Александр Ривилис от 05-06-2020, 11:33:33
Причем метод универсальный - он вообще-то от DBObject унаследован.
От Entity конечно.
Привалов Дмитрий,
Посмотри этот код: https://adn-cis.org/kak-vosstanovit-poteryannyie-graniczyi-shtrixovki.html
Там не Curve3d, а Curve2d, но принцип тот же.
Название: Re: Как получить контур Region в AutoCAD2010
Отправлено: avc от 05-06-2020, 11:47:11
Ой, пардон, конечно от Entity.
Возиться с bRep приходится, когда надо точно знать какое ребро какой кривой соответствует. Во всех остальных случаях - Explode быстрей, проще и гораздо-гораздо стабильней работает.
А для анализа Edge.Curve надо отдельно рассматривать 4 наследника Curve3d: LinearEntity3d, CircularArc3d, EllipticalArc3d и NurbCurve3d. Все, других наследников Curve3d я ни разу не встречал в bRep
Название: Re: Как получить контур Region в AutoCAD2010
Отправлено: Привалов Дмитрий от 05-06-2020, 12:17:12
Не стоит усложнять. Есть же Region.Explode().
Кстати отличный вариант! Что-то не додумался попробовать.
Скорее всего остановлюсь на нем.

Посмотри этот код: https://adn-cis.org/kak-vosstanovit-poteryannyie-graniczyi-shtrixovki.html
Там не Curve3d, а Curve2d, но принцип тот же.
Спасибо, если первый способ не подойдет, попробую.
А что в теории быстрее, Explode или этот метод?
Ну или, если перефразировать. Что происходит при методе Explode, те же самые вызовы API или другие механизмы задействованы?
Название: Re: Как получить контур Region в AutoCAD2010
Отправлено: avc от 05-06-2020, 12:27:22
ИМХО Explode уж точно не создает bRep и его .Net оболочку. И это огромный плюс, не зависимо от производительности. По моему опыту более забагованного и зафаталенного API в Автокад нет. ..хотя есть же еще система печати... До версии ~2015 достаточно было несколько раз вызвать Face.Surface и через пару минут Автокад внезапно завершал работу. Сейчас не так все запущено, и я научился обходить многие грабли, но если можно избежать bRep -> нужно избегать.