[求助]如何改变多段线的顶点顺序
如何改变多段线的顶点顺序 难道真无人会吗?可怜啊! 高手帮忙,在该多段线的顶点标注点号的时候,怎么可以指定起点位置,并按顺时针和逆时针标注点号? 取出多段线的顶点坐标,重新生成一条多段线或者修改还来的多段线都可以实现。 取得顶点坐标的方法,论坛里一大堆了,仔细找一找吧。重新定义起点的方法:
1、选择起点startpt,用曲线函数vlax-curve-getClosestPointTo得到线上距离startpt最近的点nestpt。
2、检查nestpt距离线上最近的坐标。
3、根据以上数据调整坐标,重新生成多段线。 陈Q的法子,受用! 可以编个lisp程序吗?谢! 程序功能:判断是顺时针还是逆时针,如果是顺时针则更改为逆时针。。。REV函数更改顶点顺序,可单独使用。。。(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
(rev pline)
(princ "\nPline is clockwise")
(princ "\nChanged to counterclockwise")
)
(princ "\nPline is counterclockwise")
)
(princ)
) ;end defun
(defun Rev(pl / ents i m ptlst ptlst2 item)
(setq ents (entget pl))
(setq i 0)
(setq ptlst (reverse (member (assoc 10 ents) ents)))
(setq ptlst (cdr (member (assoc 10 ptlst) ptlst)))
(repeat (/ (length ptlst) 4)
(setq ptlst2 (append ptlst2 (list (list (nth i ptlst) (nth (+ i 1) ptlst) (nth (+ i 2) ptlst) (nth (+ i 3) ptlst)))))
(setq i (+ i 4))
)
(setq ptlst2 (mapcar '(lambda(x) (subst (cons 42 (- (cdr (assoc 42 x)))) (assoc 42 x) x)) ptlst2))
(setq ptlst2 (apply 'append ptlst2))
(setq i 0 m t ptlst nil)
(while m
(setq item (nth i (reverse ents)))
(setq ptlst (append ptlst (list item)))
(if (= (car item) 10) (setq m nil))
(setq i (1+ i))
)
(setq ptlst (reverse (subst (cons 42 (- (cdr (assoc 42 ptlst)))) (assoc 42 ptlst) ptlst)))
(setq ptlst2 (cons (car ptlst) ptlst2))
(setq ptlst2 (append ptlst2 (cdr ptlst)))
(setq i 0 m (vl-position (assoc 10 ents) ents) ptlst nil)
(repeat m
(setq ptlst (append ptlst (list (nth i ents))))
(setq i (1+ i))
)
(command "_.undo" "be")
(entmod (append ptlst ptlst2))
(command "_.undo" "e")
) 可以重新指定起点吗? 起点不是可以随便指定的
页:
[1]
2