Как получить контур Region в AutoCAD2010

Автор Тема: Как получить контур Region в AutoCAD2010  (Прочитано 3699 раз)

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

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

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Хочу получить конур 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 чтобы снова получить окружность.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как получить контур Region в AutoCAD2010
« Ответ #1 : 05-06-2020, 11:17:41 »
Не стоит усложнять. Есть же Region.Explode(). Причем метод универсальный - он вообще-то от DBObject унаследован.
Но через bRep я тоже делал: https://sites.google.com/site/avcprg/flat
Curve3d можно проанализировать, составить список линий и дуг и построить новую полилинию. Вместе со всеми оптимизациями контуров это всего-то 3-5 тысяч строк кода :)

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

  • Administrator
  • *****
  • Сообщений: 13830
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как получить контур Region в AutoCAD2010
« Ответ #2 : 05-06-2020, 11:33:33 »
Причем метод универсальный - он вообще-то от DBObject унаследован.
От Entity конечно.
Привалов Дмитрий,
Посмотри этот код: https://adn-cis.org/kak-vosstanovit-poteryannyie-graniczyi-shtrixovki.html
Там не Curve3d, а Curve2d, но принцип тот же.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как получить контур Region в AutoCAD2010
« Ответ #3 : 05-06-2020, 11:47:11 »
Ой, пардон, конечно от Entity.
Возиться с bRep приходится, когда надо точно знать какое ребро какой кривой соответствует. Во всех остальных случаях - Explode быстрей, проще и гораздо-гораздо стабильней работает.
А для анализа Edge.Curve надо отдельно рассматривать 4 наследника Curve3d: LinearEntity3d, CircularArc3d, EllipticalArc3d и NurbCurve3d. Все, других наследников Curve3d я ни разу не встречал в bRep

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

  • ADN Club
  • *****
  • Сообщений: 534
  • Карма: 117
Re: Как получить контур Region в AutoCAD2010
« Ответ #4 : 05-06-2020, 12:17:12 »
Не стоит усложнять. Есть же Region.Explode().
Кстати отличный вариант! Что-то не додумался попробовать.
Скорее всего остановлюсь на нем.

Посмотри этот код: https://adn-cis.org/kak-vosstanovit-poteryannyie-graniczyi-shtrixovki.html
Там не Curve3d, а Curve2d, но принцип тот же.
Спасибо, если первый способ не подойдет, попробую.
А что в теории быстрее, Explode или этот метод?
Ну или, если перефразировать. Что происходит при методе Explode, те же самые вызовы API или другие механизмы задействованы?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Re: Как получить контур Region в AutoCAD2010
« Ответ #5 : 05-06-2020, 12:27:22 »
ИМХО Explode уж точно не создает bRep и его .Net оболочку. И это огромный плюс, не зависимо от производительности. По моему опыту более забагованного и зафаталенного API в Автокад нет. ..хотя есть же еще система печати... До версии ~2015 достаточно было несколько раз вызвать Face.Surface и через пару минут Автокад внезапно завершал работу. Сейчас не так все запущено, и я научился обходить многие грабли, но если можно избежать bRep -> нужно избегать.