Тема: Как правильно определить площадь замкнутой полилинии ?

Приходится подсчитывать площади замкнутых полилилиний.К примеру имеем квадрат 6х6 и внутри него квадрат 2х2-если соединить данные контуры произвольной линией и обработать контур  при помощи_boundary получим замкнутую полилинию с площадью 32. Тотже контур можно создать простым рисованием контура полилинией с замыканием через clouse в конце- причем изменив порядок рисования полилинией -в одном случае получим замкнутый контур с площадью 32 в другом - 40.Один и тотже контур с разными площадями!!! получив чертёж я не знаю каким образом создавался контур. Как подсчитать площадь замкнутого контура исключающего все внутренние области.

Re: Как правильно определить площадь замкнутой полилинии ?

> akmar
Слегка изменил выложенную здесь:
https://www.caduser.ru/forum/topic28271.html
Пробуй, почти не проверена

;; written by Fatty T.O.H (c)2006
;; all rights removed
(defun group-by-num (lst num / ls ret)
  (if (= (rem (length lst) num ) 0)
    (progn
      (setq ls nil)
      (repeat (/ (length lst) num)
    (repeat num (setq ls
            (cons (car lst) ls)
          lst (cdr lst)))
    (setq ret (append ret (list (reverse ls)))
          ls nil)))
    )
ret
  )
(defun c:care (/ acsp adoc out_ar axss clear_ar coors inn inn_ar rec_obj ss util)
 (vl-load-com)
  (or adoc
      (setq adoc
         (vla-get-activedocument
           (vlax-get-acad-object)
         )
      )
  )
(if (and
    (= (getvar "tilemode") 0)
    (= (getvar "cvport") 1)
      )
    (setq acsp (vla-get-paperspace adoc))
    (setq acsp (vla-get-modelspace adoc))
  )
(or util
    (setq util (vla-get-utility    adoc))
    )
(while (not
(vl-catch-all-error-p
       (vl-catch-all-apply (function (lambda()
(vla-getentity util 'rec_obj 'pt
  "\n\t\t >> Select contour (Enter to exit)  >>\n"))))))
(setq out_ar (vlax-get rec_obj 'Area)) ; obtain the area
(setq coors (vlax-get rec_obj 'Coordinates) ; obtain the coordinates
      coors (group-by-num coors 2))
(setq ss (ssget "CP" coors (list (cons 0 "*POLYLINE"))))
(setq axss (vla-get-activeselectionset adoc))
(setq inn_ar 0.0)
(vlax-for a axss
  (if (not (eq (vlax-get a 'Handle)(vlax-get rec_obj 'Handle)))
    (progn
    (setq inn (vlax-get a 'Area)
    inn_ar (+ inn inn_ar)))))
(setq clear_ar (- out_ar inn_ar))
(alert (strcat "Чистая площадь:\n" (rtos clear_ar 2 2)))
  (vla-clear axss)
  (vla-delete axss)
  (vlax-release-object axss))
(princ)
  )
(c:care)

~'J'~

Re: Как правильно определить площадь замкнутой полилинии ?

> akmar
набросал по быстрому

(vl-load-com)
(defun area2 (/ sel sort_area_list)
  (if (setq sel (ssget (list'(0 . "CIRCLE,LWPOLYLINE"))))
    (progn
      (setq sort_area_list
         (vl-sort
           (mapcar (function
             (lambda (x)
               (vla-get-area
                 (vlax-ename->vla-object x)
               ) ;_ end vla-get-area
             ) ;_ end lambda
               ) ;_ end function
               (vl-member-if
             (function
               (lambda (x) (/= (type x) 'LIST))
             ) ;_ end function
             (reverse
               (mapcar
                 (function
                   (lambda (x) (cadr x))
                 ) ;_ end function
                 (ssnamex sel)
               ) ;_ end mapcar
             ) ;_ end reverse
               ) ;_ end vl-member-if
           ) ;_ end mapcar
           '>
         ) ;_ end vl-sort
      ) ;_ end setq
      (- (car sort_area_list) (apply '+ (cdr sort_area_list)))
    ) ;_ end progn
  ) ;_ end if
) ;_ end defun

Функция просто сотавляет список площадей всех выбранных полилиний и окружностей, находит наибольшее значение  и вычитает сумму всех остальных.
Без проверок на расположения пимитивов внутри контура с наибольшей площадью.

Re: Как правильно определить площадь замкнутой полилинии ?

Тотже контур можно создать простым рисованием контура полилинией с замыканием через clouse в конце- причем изменив порядок рисования полилинией -в одном случае получим замкнутый контур с площадью 32 в другом — 40.Один и тотже контур с разными площадями!!!

БЫТЬ ТАКОГО НЕ МОЖЕТ.

Re: Как правильно определить площадь замкнутой полилинии ?

Один из контуров не замкнут или двойная вершина

Re: Как правильно определить площадь замкнутой полилинии ?

БЫТЬ ТАКОГО НЕ МОЖЕТ!
А проверить можно?-я довольно подробно изложил построение - могу выложить на почту 2 абсолютно одинаковых эскиза с одними и теми же свойствами - и контуры замкнуты и вершины в одной плоскости а площади разные

Re: Как правильно определить площадь замкнутой полилинии ?

> akmar
Предварительно проверь, что:
1) ни одна из вершин не повторяется.
2) нет наложения (даже частичного)сегментов полилинии.
3) нет пересечения сегментов полилинии.
Если хотя бы одно из условий не выполнено - площадь будет подсчитана неправильно.
P.S.: У меня в обоих случаях площадь = 32.

Re: Как правильно определить площадь замкнутой полилинии ?

Да в том то и дело что пересечение полилиний есть - но получив чертёж с тысячами таких полигонов с различными конфигурациями я не могу проверить правильность построения каждого контура.Мне необходимо подсчитать плошадь всех контуров без внутренних "дырок"( на всякий случай выслал на почту пример)

Re: Как правильно определить площадь замкнутой полилинии ?

> akmar
Условие 2) не выполнено. :(

Re: Как правильно определить площадь замкнутой полилинии ?

Согласен - но как выявить из множества контуров "неправильные"?

Re: Как правильно определить площадь замкнутой полилинии ?

> akmar
Команда OVERKILL из Express.

Re: Как правильно определить площадь замкнутой полилинии ?

> KAI
В данном случае не поможет.

Re: Как правильно определить площадь замкнутой полилинии ?

> akmar
Если работаете с картой или генпланом, "грязную" графику можно почистить средствами Autodesk Map. Есть там хороший инструментик. Map > Tools > Drawing Cleanup...
Регулярно им пользуюсь, очень помогает.