Polyline.GetArea и IAcadLWPolyline.Area

Автор Тема: Polyline.GetArea и IAcadLWPolyline.Area  (Прочитано 8265 раз)

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

Онлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Polyline.GetArea и IAcadLWPolyline.Area
« : 30-07-2016, 01:12:31 »
Просьба для самопересекающихся полилиний (Polyline и/или Polyline2d) сравнить значения площади, которые получаются при помощи свойства Curve.Area и с помощью COM/ActiveX свойства IAcadLWPolyline.Area.
Евгений Елпанов обнаружил, что мой GeomProps в AutoCAD 2015 неправильно считает площади самопересекающихся полилиний. Точнее, вычисленное значение не совпадает с тем, которое проставляет в Панели свойств AutoCAD. Я использовал для вычисления метод AcDbCurve::getArea (аналог Curve.Area), а AutoCAD похоже использует метод IAcadLWPolyline.Area, который даёт совершенно другое значение.
Результаты на видео:



P.S.: Так как COM/ActiveX нельзя использовать в AcCoreConsole, то непонятно как в нём можно правильно вычислить площади таких полилиний.
P.S.S: Указанное поведение имеет место и в AutoCAD 2016 и 2017.
P.S.S.S: В GeomProps я изменил способ вычисления.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Re: Polyline.GetArea и IAcadLWPolyline.Area
« Ответ #1 : 30-07-2016, 20:13:09 »
Попробовал в 2015.
Com Area - дает другой результат.
Построил штриховку - она дает такую же площадь как и Com Area.

Com обычно не пользуюсь.

Получается, для более точного результата, лучше использовать Com?
Или самопересечение это особый случай, и штатных средств его определения нет?

Онлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline.GetArea и IAcadLWPolyline.Area
« Ответ #2 : 30-07-2016, 20:28:32 »
Получается, для более точного результата, лучше использовать Com?
Тут речь даже идёт даже не о более точном, а вообще об адекватном значении. В моём случае площади отличались в 5 раз. Самопересечение полилиний определить не сложно: http://adndevblog.typepad.com/autocad/2012/05/how-to-detect-if-a-polyline-is-self-intersecting.html
Но что интересно в AutoCAD 2014 и более ранних COM тоже не даёт для них правильного результата, если считать правильным результатом значение из команды _AREA.
Я отправил запрос в ADN DevHelp. Посмотрим что они ответят.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Polyline.GetArea и IAcadLWPolyline.Area
« Ответ #3 : 01-08-2016, 13:46:47 »
Я поэкспериментировал немного. Попробовал через MPolygon получить площадь. Результат - тот же самый. Но зато стало понятно, откуда такое значение берется.
COM метод возвращает правильный результат - площадь образованной всеми "петлями" фигуры. DotNET метод вычисляет сумму площадей "петель" с учетом их знака.
Извините, вам запрещён просмотр содержимого спойлеров.

Онлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline.GetArea и IAcadLWPolyline.Area
« Ответ #4 : 01-08-2016, 18:37:50 »
Теперь осталось написать алгоритм, который работал бы во всех версиях AutoCAD, а не только в трех последних - COM/ActiveX дает правильные результаты начиная с AutoCAD 2015.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Polyline.GetArea и IAcadLWPolyline.Area
« Ответ #5 : 01-08-2016, 19:05:42 »
COM/ActiveX дает правильные результаты начиная с AutoCAD 2015
Я в 2014 (Civil 3D) проверял - там тоже правильные результаты. В более ранних по другому работает?

Онлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline.GetArea и IAcadLWPolyline.Area
« Ответ #6 : 01-08-2016, 20:15:35 »
Я в 2014 (Civil 3D) проверял - там тоже правильные результаты.
Я перепроверил. В чистом 2014 действительно работает правильно. А в 2013 нет. Хотя они из одной линейки.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline.GetArea и IAcadLWPolyline.Area
« Ответ #7 : 05-08-2016, 16:24:23 »
При переписке с ADN DevHelp обнаружился некое недокументированное поведение. Если использовать метод AcDbCurve::list (Curve.List в .NET), то для полилинии (возможно и для других кривых - не проверял) вычисляется площадь и (!!!) эта площадь попадает в системную переменную AREA. Площадь та же, что и при вызове команды _AREA.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Онлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Polyline.GetArea и IAcadLWPolyline.Area
« Ответ #8 : 09-08-2016, 16:28:12 »
Мне удалось убедить Autodesk'овцев, что отмеченное мной поведение - это баг, который следует исправить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение