Тема: LISP, VBA. Изменение направления обхода точек в полилинии

Виталий (2004-09-30 14:21:46) в ветке приемы работы писал
День добрый!
Как поменять обход точек в полилинии по часовой (против часовой) стрелки.

> Виталий
Сам и отвечу себе.

(defun GetVertexList (entlist / vertlist coords)
(setq vertlist (member (assoc 10 entlist) entlist))
(repeat (cdr (assoc 90 entlist))
(setq coords (cons (cdar vertlist) coords)
vertlist (cddddr vertlist)))
(reverse coords)
) ;end defun
(defun GEO_CCW (p0 p1 p2 / dx1 dx2 dy1 dy2)
(setq dx1 (- (car p1) (car p0))
dy1 (- (cadr p1) (cadr p0))
dx2 (- (car p2) (car p0))
dy2 (- (cadr p2) (cadr p0)))
(cond
((> (* dx1 dy2) (* dy1 dx2)) 1)
((< (* dx1 dy2) (* dy1 dx2)) -1)
(t
(cond
((or (minusp (* dx1 dx2))
(minusp (* dy1 dy2))) -1)
;; explicit distance
((>= (+ (* dx1 dx1) (* dy1 dy1)) (+ (* dx2 dx2) (* dy2 dy2))) 0)
(t 1)
)
)
)
) ;end defun
(defun c:PlineCCW (/ pline res ptlst rptlst lay)
(setq pline (entsel "\nSelect lwpolyline"))
(setq ptlst (GetVertexList (entget (car pline))))
(setq res (GEO_CCW (nth 0 ptlst) (nth 1 ptlst) (nth 2 ptlst)))
(if (= res -1)
(princ "\nНаправление против часовой."))
(if (= res 1)
(progn
(setvar "cmdecho" 0)
(setq lay (getvar "clayer"))
(setq rptlst (reverse ptlst))
(setvar "clayer" (cdr (assoc 8 (entget (car pline)))))
(command "pline" (foreach p rptlst (command p)))
(command "erase" (car pline) "")
(setvar "clayer" lay)
(setvar "cmdecho" 1)
(princ "\Направление по часовой стрелке.")
) ;end progn
) ;end if
(princ)
) ;end defun

Я сохранил код в файле PlineCCW.lsp, загрузил в ACAD, запустил командой PlineCCW, выбрал полилинию и получил ответ - Направление против часовой.
Подскажите что здесь не так и как все таки поменять направление полилинии.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

В порядке "я тоже наступил на эти грабли":
1. Не обрабатываются полилинии с переменной шириной сегмента.
2. Не обрабатываются дуговые сегменты.
Посмотри на http://www.kurganobl.ru/cad/book.jsp?id … ;tn=main#b
Недостающие лиспы можно там же поискать. Если не найдешь - пиши, пришлю.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

Вот мое решение проблемы на VBA.
Про дуговые сегменты ничего не скажу. Скорее не прокатит, но у меня и надобности в подобном не возникало.

Public Sub Проверка()
'Выделяем все и запускаем этот макрос, дальше он сам разберется.
Dim sel As AcadSelectionSet
Dim i As Integer
Dim pl As AcadLWPolyline
Dim chek As Integer
Dim ssobjs(0) As AcadEntity
Set sel = SetActiveSel
chek = 0
For i = 0 To sel.count - 1
If sel.Item(i).ObjectName = "AcDbPolyline" Then
Set pl = sel.Item(i)
If Not (PolyRight(pl)) Then
Set ssobjs(0) = pl
chek = chek + 1
ReVert pl
End If
End If
Next i
ThisDrawing.Utility.prompt "Всего объектов: " + VBA.Str(sel.count)
ThisDrawing.Utility.prompt "Исправлено объектов: " + VBA.Str(chek)
End Sub
Public Function PolyRight(pl As AcadLWPolyline) As Boolean
'Функция проверяет направление обхода точек
Dim i As Integer
Dim rez As Double
rez = 0
rez = rez + pl.Coordinates(0) * (pl.Coordinates(3) - pl.Coordinates(UBound(pl.Coordinates)))
For i = 2 To UBound(pl.Coordinates) - 2 Step 2
rez = rez + pl.Coordinates(i) * (pl.Coordinates(i + 3) - pl.Coordinates(i - 1))
Next i
rez = rez + pl.Coordinates(i) * (pl.Coordinates(1) - pl.Coordinates(i - 1))
PolyRight = rez < 0
End Function
Public Function ReVert(pl As AcadLWPolyline) As AcadLWPolyline
'Функция переворачивает полелинию
Dim i As Integer
Dim coord() As Double
Dim vc As Integer
Dim newpl As AcadLWPolyline
Dim s As String
vc = UBound(pl.Coordinates)
ReDim coord(vc) As Double
For i = 0 To vc Step 2
coord(i) = pl.Coordinates(vc - i - 1)
coord(i + 1) = pl.Coordinates(vc - i)
Next i
pl.Coordinates = coord
pl.Update
Set ReVert = pl
End Function

Запускать нужно макрос "Проверка"

Re: LISP, VBA. Изменение направления обхода точек в полилинии

мой вариант (уже не помню, может и не совсем мой) Лупит линии и полилинии:
(с дуговыми лупит ессесно не верно)

;;;реверс для линий и полилиний
(defun c:ARL (/ pline name_pline ass)
  (VL-LOAD-COM)
  (prompt "\nSelect *Lines to reverse:")
  (if (ssget (list (cons 0 "*LINE")))
    (progn
      (setq ass    (vla-get-ActiveSelectionSet
          (vla-get-ActiveDocument (vlax-get-acad-object))
        )
      )
      (vlax-for    pline ass
    (setq name_pline (vla-get-ObjectName pline))
    (cond ((or (eq "AcDbPolyline" name_pline)
           (eq "AcDb3dPolyline" name_pline)
           )
           (APEL-REVERSE-PLINE pline)
          )
          ((eq "AcDbLine" name_pline) (APEL-REVERSE-LINE pline))
    )
      )
    )
  )
  (princ)
)
;;;Аргументы: line - лининия
(defun APEL-REVERSE-LINE (line / sp ep)
  (setq    ep (vla-get-EndPoint line)
    sp (vla-get-StartPoint line)
  )
  (vla-put-StartPoint line ep)
  (vla-put-EndPoint line sp)
)
;;;Аргументы: pline - полининия
(defun APEL-REVERSE-PLINE (pline / safearray-list)
  (vla-put-coordinates
    pline
    (vlax-safearray-fill
      (setq safearray-list
         (vlax-variant-value (vla-get-coordinates pline))
      )
      (apply 'append
         (reverse
           (APEL_SP_PO_N
         (vlax-safearray->list safearray-list)
         (cond ((eq "AcDbPolyline"
                (setq name_pline (vla-get-ObjectName pline))
            )
            2
               )
               ((eq "AcDb3dPolyline" name_pline) 3)
         )
           )
         )
      )
    )
  )
)
(DEFUN APEL_SP_PO_N (spis n /)
  (if (and (listp spis)
       (eq (type n) 'INT)
       (> n 0)
       (<= n (length spis))
      )
    (cons
      (APEL_PER_n_IS_SP spis n)
      (APEL_SP_PO_N
    (reverse
      (APEL_PER_n_IS_SP (reverse spis) (- (length spis) n))
    )
    n
      )
    )
  )
)
;;;Возвращает первые n элементы списка spis
(defun apel_per_N_is_sp    (spis n /)
  (if (and (eq (type n) 'INT) (> n 0) (<= n (length spis)))
    (append (apel_per_N_is_sp spis (1- n))
        (list (nth (1- n) spis))
    )
  )
)

Re: LISP, VBA. Изменение направления обхода точек в полилинии

Попробуйте мой старый вариант. Сохраняет дуги, сохраняет ширины.

(defun c:cb ( / rzltsel)
  (setq rzltsel (entsel "Select polyline:"))
  (comeback (car rzltsel))
  (princ)
);defun c:cb------------------------------------------------------
(defun comeback (plin / plinlst plout ploutlst nn n fl)
  (setq
    fl t n 0
    plinlst (entget plin)
    k0 (cdr (assoc 0 plinlst))
    k90 (cdr (assoc 90 plinlst))
    nin k90
  )
  (if (eq k0 "LWPOLYLINE")
    (progn;--------------------------
  ;-----------------------------------
  (while fl
    (if (eq 10 (car (nth n plinlst)))
      (setq fl nil)
      (setq
        ploutlst (append ploutlst (list (nth n plinlst)))
        n (1+ n)
      )
    )
  );while fl
  (setq
    n 0
    plinlst (member (assoc 10 plinlst) plinlst)
  )
  (repeat (1- nin)
    (setq
      ploutlst
      (append ploutlst
        (list
          (nth (* (- nin n 1) 4) plinlst)
          (cons 40    (cdr (nth (+ (* (- nin n 2) 4) 2) plinlst)))
          (cons 41    (cdr (nth (+ (* (- nin n 2) 4) 1) plinlst)))
          (cons 42 (- (cdr (nth (- (* (- nin n 1) 4) 1) plinlst))))
        )
      )
      n (1+ n)
    )
  );repeat (1- nin)
  (setq
    ploutlst
    (append ploutlst
      (list
        (nth (* (- nin n 1) 4) plinlst)
        (cons 40 (cdr (nth (+ (* (- nin 1) 4) 2) plinlst)))
        (cons 41 (cdr (nth (+ (* (- nin 1) 4) 1) plinlst)))
        (cons 42 (- (cdr (nth (+ (* (- nin 1) 4) 3) plinlst))))
        (nth (+ (* (- nin 1) 4) 4) plinlst)
      )
    )
  )
  (entmod ploutlst)
  ;-----------------------------------
  ));------- if ----- "LWPOLYLINE" ---
);defun comeback------------------------------------------------------

Re: LISP, VBA. Изменение направления обхода точек в полилинии

Пожалуй и я оставлю свой вариант, тоже подходит для реверса любых "lwpolyline"...

(defun c:rlw(/ E LW X1 X2 X3 X4 X5 X6)
(if(and(setq lw(car(entsel "\nSelect lwpolyline")))
(=(cdr(assoc 0(setq e(entget lw)))) "LWPOLYLINE"))
(progn
(foreach a1 e
(cond
((=(car a1) 10)(setq x2(cons a1 x2)))
((=(car a1) 40)(setq x4(cons(cons 41(cdr a1)) x4)))
((=(car a1) 41)(setq x3(cons(cons 40(cdr a1)) x3)))
((=(car a1) 42)(setq x5(cons(cons 42(-(cdr a1))) x5)))
((=(car a1) 210)(setq x6(cons a1 x6)))
(t(setq x1(cons a1 x1)))))
(entmod
(append
(reverse x1)
(append
(apply
(function append)
(apply
(function mapcar)
(cons
'list
(list x2
(cdr(reverse(cons(car x3)(reverse x3))))
(cdr(reverse(cons(car x4)(reverse x4))))
(cdr(reverse(cons(car x5)(reverse x5))))))))x6)))
(entupd lw))))

И до кучи проверка направления обхода вершин, в отличии от многих программ выдает правильный результат во всех сложных случаях, впрочем если нет пересечений...

(defun c:lwcl(/ LW LST MAXP MINP)
(setq lw(vlax-ename->vla-object(car(entsel))))
(vla-GetBoundingBox lw 'MinP 'MaxP)
(setq
minp(vlax-safearray->list minp)
MaxP(vlax-safearray->list MaxP)
lst(mapcar(function(lambda(x)
(vlax-curve-getParamAtPoint lw
(vlax-curve-getClosestPointTo lw x))))
(list minp(list(car minp)(cadr MaxP))
MaxP(list(car MaxP)(cadr minp)))))
(if(or
(<=(car lst)(cadr lst)(caddr lst)(cadddr lst))
(<=(cadr lst)(caddr lst)(cadddr lst)(car lst))
(<=(caddr lst)(cadddr lst)(car lst)(cadr lst))
(<=(cadddr lst)(car lst)(cadr lst)(caddr lst)))t))

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

Re: LISP, VBA. Изменение направления обхода точек в полилинии

Вот мой рабочий вариант
Public Sub PolyVers()
    Dim i As Integer
    Dim vc As Integer
    Dim basepnt As Variant
    Dim pl As AcadLWPolyline
    On Error Resume Next
    ThisDrawing.Utility.GetEntity pl, basepnt, "Select polyline"
    ' Make sure the user selected a polyline.
    If Err <> 0 Then
        If pl.EntityName <> "AcDbPolyline" Then
            MsgBox "You did not select a polyline"
        End If
        Exit Sub
    End If
vc = UBound(pl.Coordinates)
ReDim coord(vc) As Double
For i = 0 To vc Step 2
coord(i) = pl.Coordinates(vc-i-1)
coord(i + 1) = pl.Coordinates(vc-i)
Next i
pl.Coordinates = coord
pl.Update
End Sub

Re: LISP, VBA. Изменение направления обхода точек в полилинии

Очень часто стали задавать вопросы про изменение направления полилинии по часовой стрелке.
Команда позволяет выбрать несколько полилиний и произвести их реверс, если они отрисованы против часовой стрелки. Проверки направления обхода осуществляется командой c:lwcl Евгения Елпанова, переделанной в ф-цию :)
Взято отсюда https://www.caduser.ru/forum/topic34236.html
Команда PlineCCW

;;;Реверс LW полилиний
;;;Код Евгения Елпанова
;;;http://www.arcada.com.ua/forum/viewtopic.php?t=481&sid=69bf50f6022d526c7c56ad2029d9f24c
(defun plineLW-reverse ( lw / e x1 x2 x3 x4 x5 x6)
  (if (= (type lw) 'VLA-OBJECT)
    (setq lw (vlax-vla-object->ename lw)))
    (setq e (entget lw))
(foreach a1 e
   (cond
     ((= (car a1) 10) (setq x2 (cons a1 x2)))
     ((= (car a1) 40) (setq x4 (cons (cons 41 (cdr a1)) x4)))
     ((= (car a1) 41) (setq x3 (cons (cons 40 (cdr a1)) x3)))
     ((= (car a1) 42) (setq x5 (cons (cons 42 (- (cdr a1))) x5)))
     ((= (car a1) 210) (setq x6 (cons a1 x6)))
     (t (setq x1 (cons a1 x1)))
     ) ;_ end of cond
   )
(entmod (append(reverse x1)(append(apply(function append)
  (apply (function mapcar)(cons 'list (list x2
         (cdr (reverse (cons (car x3) (reverse x3))))
         (cdr (reverse (cons (car x4) (reverse x4))))
         (cdr (reverse (cons (car x5) (reverse x5))))
         ) ;_ end of list
        ) ;_ end of cons
      ) ;_ end of apply
         ) ;_ end of apply
       x6
       ) ;_ end of append
     ) ;_ end of append
   ) ;_ end of entmod
  (entupd lw)
  ) ;_ end of defun
;проверка направления обхода вершин
;https://www.caduser.ru/forum/topic20537.html
;Евгений Елпанов проверка
;Возвращаем t   — по часовой
;           nil — против
(defun lwcl( lw  / LST MAXP MINP)
(if (= (type lw) 'ENAME)
    (setq lw (vlax-ename->vla-object lw)))
(vla-GetBoundingBox lw 'MinP 'MaxP)
(setq
minp(vlax-safearray->list minp)
MaxP(vlax-safearray->list MaxP)
lst(mapcar(function(lambda(x)
(vlax-curve-getParamAtPoint lw
(vlax-curve-getClosestPointTo lw x))))
(list minp(list(car minp)(cadr MaxP))
MaxP(list(car MaxP)(cadr minp)))))
(if(or
(<=(car lst)(cadr lst)(caddr lst)(cadddr lst))
(<=(cadr lst)(caddr lst)(cadddr lst)(car lst))
(<=(caddr lst)(cadddr lst)(car lst)(cadr lst))
(<=(cadddr lst)(car lst)(cadr lst)(caddr lst))) t nil))
(defun C:PlineCCW ( / int:i e1 res clk+)
  (vl-load-com)
  (or *activedoc*
       (setq *activedoc* (vla-get-activedocument (vlax-get-acad-object))))
  (vla-startundomark *activedoc*)
  (princ "\nВыберите Полилинии")
  (setq PICK1 nil
  PICK1 (ssget "_:L" '((0 . "LWPOLYLINE"))))
  (setq int:i 0 clk+ 0)
  (while (and PICK1 (setq e1 (ssname PICK1 int:i)))
    (if (not(lwcl e1))
      (progn
        (plineLW-reverse e1)
        (setq clk+ (1+ clk+))
        )
      )
    (setq int:i (1+ int:i))
  )
  (princ (strcat "\nОбработано " (itoa int:i) " полилиний. Из них"))
  (princ "\n\t")(princ clk+)(princ " \tпротив часовой (реверсировано)")
  (princ "\n\t")(princ (- int:i clk+))(princ " \tпо часовой")
  (setq PICK1 nil)(vla-endundomark *activedoc*) (princ))
(princ "\nType PlineCCW to start command")

Если нужно наоборот реверсировать те, которые по часовой, то строчку

(if (not(lwcl e1))

заменить на

(if (lwcl e1)

Re: LISP, VBA. Изменение направления обхода точек в полилинии

http://algolist.manual.ru/maths/geom/polygon/orient.php

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Vovka
Хороший способ для многоугольников, а если дуговые сегменты?

Re: LISP, VBA. Изменение направления обхода точек в полилинии

По поводу проверки обхода лежит в загашнике еще один код

;;; Ang<2pi Returns the angle between 0 and 2*pi
(defun ang<2pi (ang)
  (if (and (<= 0 ang) (< ang (* 2 pi)))
    ang
    (ang<2pi (rem (+ ang (* 2 pi)) (* 2 pi)))
  )
)
;;; Clockwisep Returns T if p1 p2 et p3 are turning clockwise
(defun Clockwisep (p1 p2 p3)
  (< pi (ang<2pi (- (angle p2 p3) (angle p1 p2))) (* 2 pi))
)

отсюда http://www.theswamp.org/index.php?topic=15323.30
Правда пока не тестировал. Код Евгения пока сбоев не дает.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Евгений Елпанов
наличие дуговых сегментов никакого влияния не оказывает.

(defun vk_IsBoundaryClockwise (CoordsList / YList)
  (setq YList (mapcar 'cadr CoordsList))
  (minusp
    (/ (apply '+
          (mapcar (function (lambda (xi yi-1 yi+1) (* xi (- yi+1 yi-1))))
              (mapcar 'car CoordsList)
              (cons (last YList) YList)
              (append (cdr YList) (list (car YList)))
          )
       )
       2
    )
  )
)
(vk_IsBoundaryClockwise
  (mapcar 'cdr
      (vl-remove-if-not
        '(lambda (x) (= (car x) 10))
        (entget (car (entsel)))
      )
  )
)

Re: LISP, VBA. Изменение направления обхода точек в полилинии

если в функции vk_IsBoundaryClockwise заменить minusp на abs, то получится функция vk_GetArea.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

Vovka пишет:

наличие дуговых сегментов никакого влияния не оказывает.

А вот тут Володя Вы в корне не правы. Сравните:

Command: (entget (car(entsel)))
Select object: ((-1 . <Entity name: 7ed39328>) (0 . "LWPOLYLINE") (330 .
<Entity name: 7ed37cc8>) (5 . "14D") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "A0-02") (100 . "AcDbPolyline") (90 . 5) (70 . 0) (43 . 0.0) (38
. 0.0) (39 . 0.0) (10 121500.0 180000.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10
121500.0 239100.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 181500.0 239100.0) (40
. 0.0) (41 . 0.0) (42 . 0.0) (10 181500.0 178200.0) (40 . 0.0) (41 . 0.0) (42 .
-1.03045) (10 121500.0 180000.0) (40 . 0.0) (41 . 0.0) (42 . -1.21782) (210 0.0
0.0 1.0))
Command: (entget (car(entsel)))
Select object: ((-1 . <Entity name: 7ed39368>) (0 . "LWPOLYLINE") (330 .
<Entity name: 7ed37cc8>) (5 . "155") (100 . "AcDbEntity") (67 . 0) (410 .
"Model") (8 . "A0-02") (100 . "AcDbPolyline") (90 . 5) (70 . 0) (43 . 0.0) (38
. 0.0) (39 . 0.0) (10 275400.0 156900.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10
275400.0 241200.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 341700.0 241200.0) (40
. 0.0) (41 . 0.0) (42 . 0.0) (10 341700.0 156900.0) (40 . 0.0) (41 . 0.0) (42 .
3.19002) (10 275400.0 156900.0) (40 . 0.0) (41 . 0.0) (42 . -0.115228) (210 0.0
0.0 1.0))

Re: LISP, VBA. Изменение направления обхода точек в полилинии

P.S.: Функция vk_IsBoundaryClockwise
для обоих контуров возвращает T, хотя второй контур против часоыой стрелки - дуговой сегмент меняет его ориентацию.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Александр Ривилис
согласен, когда тестировал о таком варианте примитива не подумал :( спасибо
давайте считать, что моя версия пригодна только для списков координат, а не для примитивов. в принципе я только для списков ее и делал, так как с готовыми примитивами не работаю.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Vovka
Именно так. Более того она не годится для "тяжелых" полилиний, сплайнов и т.д. в отличие от функции Евгения Елпанова. Аналогичную твоей функцию я использую в ObjectARX для полилиний имеющих только линейные сегменты. Её с определенными доработками (с учетом кривизны) можно использовать и для полилиний с дуговыми сегментами, но работает ли она в 100% случаев я не уверен.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Александр Ривилис
алгоритм имеет математическое обоснование и тут проблем нет, одно ограничение - не должно быть самопересечений.
все будет зависеть только от правильности получения координат дуговых елементов (через аппроксимацию)

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Vovka
Вообще то я частенько использую другой алгоритм, если на пальцах, то вычисляю одну точку на контуре, ближайшую к минимальной точке габаритного контейнера и исследую первую производную, с учетом где находится точка, если на сегменте, то направляющий вектор определяет направление контура, если это вершина, то нужно смотреть два сегмента, сходящихся в этой вершине.
Такой подход я использую для контуров с очень большим количеством вершин - получается быстрее...

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Vovka
Я в курсе, т.к. этот алгоритм на ObjectARX (точнее на ADS) использую приблизительно с 1995 года. :) Речь идет о том, что дуги в расширении этого алгоритма я не аппроксимирую, а использую площадь секторов со знаком. Знак зависит от знака кривизны, квадранта в котором расположена полилиния, знака площади без секторов и еще кучи разных вещей. Все полилиниии, которые у меня были анализируются правильно, но на 100% я не уверен, что учел все нюансы. Если бы был уверен, то выложил бы его в свободный доступ.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Евгений Елпанов
я делал функцию по алгоритму, схожему с тем, о котором вы говорите. он работает медленнее. может просто я плохо его реализовал, но думаю, что это процес нахождения крейней вершины отбирает много времени. делал вариант функции, которая вычисляла сумму всех внутренних углов (думал, что справится с самопересечениями - а нет) - тоже медленно. все это только для списков координат, без готовых замкнутых примитивов.

Re: LISP, VBA. Изменение направления обхода точек в полилинии

> Александр Ривилис
я работаю в землеустройстве, а там, как вы понимаете, дуги не предусмотрены :) поэтому и занимаюсь аппроксисацией, и только списками координат, потому что и площадь и перимтер и углы надо вычислять по округленным координатам (.два знака). специфика така, вот подход такой :)

Re: LISP, VBA. Изменение направления обхода точек в полилинии

1. Из замкнутой полилинии можно сделать область.
Эта область прозрачна с одной стороны и непрозрачна сдругой. Непрозрачная сторона показывет направление нормали?
Если считать, что нормаль направлена по правилу буравчика. Т.е. вращаемся по точкам полилинии.
Так?
2. Зависит ли последовательность точек полилинии от координат. Т.е. начертил полилиню, изменил UCS, и изменилась последовательность точек. Может быть такое?

Re: LISP, VBA. Изменение направления обхода точек в полилинии

olegator пишет:

Если считать, что нормаль направлена по правилу буравчика.

Неверное утверждение, нормаль не зависит от направления обхода...

Зависит ли последовательность точек полилинии от координат.

Тоже нет.
Полилиния отрисовывается в своей плоскости, заданной вектором нормали в 210 коде DXF... Т.е. если изменить вектор нормали, то изменится плоскость, в которой отрисованна  полилиния. Другими словами, полилинию можно перевернуть, но она не изменит своего внутреннего направления! Например, при использовании метода VLA-OFFSET - создается подобная полилиния с отступом в право, по ходу... или другими словами, как не меняй нормаль, но если оффсет получается наружу, то он и будет наружу, пока не поменяешь направление обхода. То же самое и с USC...