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

ADN Club => AutoCAD .NET API => Тема начата: Александр Ривилис от 30-07-2016, 01:12:31

Название: 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 я изменил способ вычисления.
Название: Re: Polyline.GetArea и IAcadLWPolyline.Area
Отправлено: Вильдар от 30-07-2016, 20:13:09
Попробовал в 2015.
Com Area - дает другой результат.
Построил штриховку - она дает такую же площадь как и Com Area.
(https://s31.postimg.org/hgsrq8wvb/pl_Area_Test.png) (https://postimg.org/image/hgsrq8wvb/)
Com обычно не пользуюсь.

Получается, для более точного результата, лучше использовать Com?
Или самопересечение это особый случай, и штатных средств его определения нет?
Название: Re: Polyline.GetArea и IAcadLWPolyline.Area
Отправлено: Александр Ривилис от 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. Посмотрим что они ответят.
Название: Re: Polyline.GetArea и IAcadLWPolyline.Area
Отправлено: Дмитрий Загорулькин от 01-08-2016, 13:46:47
Я поэкспериментировал немного. Попробовал через MPolygon получить площадь. Результат - тот же самый. Но зато стало понятно, откуда такое значение берется.
COM метод возвращает правильный результат - площадь образованной всеми "петлями" фигуры. DotNET метод вычисляет сумму площадей "петель" с учетом их знака.
Извините, вам запрещён просмотр содержимого спойлеров.
Название: Re: Polyline.GetArea и IAcadLWPolyline.Area
Отправлено: Александр Ривилис от 01-08-2016, 18:37:50
Теперь осталось написать алгоритм, который работал бы во всех версиях AutoCAD, а не только в трех последних - COM/ActiveX дает правильные результаты начиная с AutoCAD 2015.
Название: Re: Polyline.GetArea и IAcadLWPolyline.Area
Отправлено: Дмитрий Загорулькин от 01-08-2016, 19:05:42
COM/ActiveX дает правильные результаты начиная с AutoCAD 2015
Я в 2014 (Civil 3D) проверял - там тоже правильные результаты. В более ранних по другому работает?
Название: Re: Polyline.GetArea и IAcadLWPolyline.Area
Отправлено: Александр Ривилис от 01-08-2016, 20:15:35
Я в 2014 (Civil 3D) проверял - там тоже правильные результаты.
Я перепроверил. В чистом 2014 действительно работает правильно. А в 2013 нет. Хотя они из одной линейки.
Название: Re: Polyline.GetArea и IAcadLWPolyline.Area
Отправлено: Александр Ривилис от 05-08-2016, 16:24:23
При переписке с ADN DevHelp обнаружился некое недокументированное поведение. Если использовать метод AcDbCurve::list (Curve.List в .NET), то для полилинии (возможно и для других кривых - не проверял) вычисляется площадь и (!!!) эта площадь попадает в системную переменную AREA. Площадь та же, что и при вызове команды _AREA.
Название: Re: Polyline.GetArea и IAcadLWPolyline.Area
Отправлено: Александр Ривилис от 09-08-2016, 16:28:12
Мне удалось убедить Autodesk'овцев, что отмеченное мной поведение - это баг, который следует исправить.