Тема: 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, выбрал полилинию и получил ответ - Направление против часовой.
Подскажите что здесь не так и как все таки поменять направление полилинии.