这是判断顺逆时针的程序第二个问题左上角的概念不够明确- (vl-load-com)
- (defun GetCen(pl / pt1 pt2)
- (vla-getboundingbox (vlax-ename->vla-object pl) 'pt1 'pt2)
- (setq pt1 (vlax-safearray->list pt1))
- (setq pt2 (vlax-safearray->list pt2))
- (list (/ (+ (car pt1) (car pt2)) 2.0)
- (/ (+ (cadr pt1) (cadr pt2)) 2.0)
- )
- )
- (defun GEO_CCW (p0 p1 p2 p3 / ang1 ang2 ang3)
- (setq ang1 (angle p0 p1))
- (setq ang2 (angle p0 p2))
- (setq ang1 (- ang2 ang1))
- (if (> (abs ang1) pi)
- (setq ang1 (+ (* -2 pi (/ ang1 (abs ang1))) ang1))
- )
- (setq ang3 (angle p0 p3))
- (setq ang2 (- ang3 ang2))
- (if (> (abs ang2) pi)
- (setq ang2 (+ (* -2 pi (/ ang2 (abs ang2))) ang2))
- )
- (if (> (* ang1 ang2) 0)
- (/ ang1 (abs ang1))
- (cond
- ((> (abs ang1) (abs ang2))
- (if (= ang2 0)
- 0
- (/ ang2 (abs ang2)))
- )
- ((<= (abs ang1) (abs ang2))
- (if (= ang1 0)
- 0
- (/ ang1 (abs ang1)))
- )
- )
- )
- );DEFUN
- (defun c:PlineCCW (/ pline step param nParam pt pt1 pt2 ptc i mp CCWLST)
- (setq pline (car (entsel "Select lwpline")))
- (setq step 100)
- (setq mp (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
- (setq ptc (getcen pline))
- (setq param (/ (vlax-curve-getDistAtParam pline (vlax-curve-getEndParam pline)) step))
- (setq i 0)
- (repeat (1- step)
- (setq nParam (* i param))
- (setq pt (vlax-curve-getPointAtdist pline nParam))
- (setq pt1 (vlax-curve-getPointAtdist pline (+ (* (/ 0.5 step) param) nParam)))
- (setq pt2 (vlax-curve-getPointAtdist pline (+ (* (/ 1.0 step) param) nParam)))
- (setq CCWLST (append CCWLST (list (GEO_CCW ptc pt pt1 pt2))))
- (setq i (1+ i))
- )
- (if (> (length (vl-remove 1.0 CCWLST)) (length (vl-remove -1.0 CCWLST)))
- (progn
- (princ "\nPline is clockwise")
- )
- (princ "\nPline is counterclockwise")
- )
- (princ)
- ) ;end defun
|