判断顺逆时针的代码
;计算PT1-PT2的测量方位角
(defun zfwj(pt1 pt2 / ang1)
(setq ang1 (angle pt1 pt2))
(cond
((<= ang1 (* 0.5 pi))
(- (* 0.5 pi) ang1 )
)
(t
(- (* 2.5 pi) ang1)
)
)
)
;判断点序列是顺时针还是逆时针
;1为顺时针,0为逆时针
;搜索最西面的点,比较其与相邻两点的方位,判断是顺时针还是逆时针
;暂未考虑重复点、回头线2010.09.28
(defun pdc (l1 / i j x pt1 pt2 pt3 pt4 ang1 ang2)
(setq j 0
i 0
x (car (nth 0 l1)))
(repeat (1- (length l1))
(if (< (car (nth (1+ j) l1)) x)
(setq i (1+ j)
x (car (nth (1+ j) l1)))
)
(setq j (1+ j))
)
;第i点为最西侧的点
(cond
((= i 0)
(setq pt1 (last l1)
pt2 (nth 0 l1)
pt3 (nth 1 l1))
)
((= i (1- (length l1)))
(setq pt1 (nth (1- i) l1)
pt2 (nth i l1)
pt3 (car l1))
)
(t
(setq pt1 (nth (1- i) l1)
pt2 (nth i l1)
pt3 (nth (1+ i) l1))
)
)
(setq ang1 (zfwj pt2 pt1)
ang2 (zfwj pt2 pt3))
(if (< ang1 ang2)
(progn
(alert "逆时针!")
0)
(progn
(alert "顺时针!")
1)
)
;(princ "\n")
;(princ (itoa i))
)
;主程序
(defun c:pdsn ( / s1fbt1 t2 lptn lplt lpli)
;选择一个范围线
(setq s1(entget (car (entsel)))
lpl nil
)
;检测是否是多段线
(if (/= (cdr (assoc 0 s1)) "LWPOLYLINE")
(progn
(alert "请选择一条多段线!")
(exit)
)
)
;检测多段线是否封闭
(setq fb (cdr (assoc 70 s1)))
(while (> fb 1)
(setq fb (- fb 2))
)
(if (= fb 0)
(progn
(alert "多段线不封闭!")
(exit)
)
)
;取多段线各顶点
;检测多段线是否含圆弧
(setq lptn (cdr (assoc 90 s1)))
(while (assoc 10 s1)
(setq t1(assoc 10 s1)
t2(assoc 42 s1)
lpl (append lpl (list (cdr t1)))
s1(vl-remove t1 s1)
s1(vl-remove t2 s1)
)
(if t2
(progn
(if (/= (cdr t2) 0.0)
(progn
(alert "多段线不能含圆弧!")
(exit)
)
)
)
)
)
(pdc lpl)
)
感谢楼主分享判断顺逆时针的代码 谢谢楼主分享,正需要。 学到了。感谢您的分享。
页:
[1]