sly 发表于 2005-3-24 19:05:00

[求助]如何改变多段线的顶点顺序

如何改变多段线的顶点顺序

sly 发表于 2005-3-24 20:02:00

难道真无人会吗?可怜啊!

sly 发表于 2005-3-24 20:31:00

高手帮忙,在该多段线的顶点标注点号的时候,怎么可以指定起点位置,并按顺时针和逆时针标注点号?

lockmyeye 发表于 2005-3-24 20:41:00

取出多段线的顶点坐标,重新生成一条多段线或者修改还来的多段线都可以实现。

lockmyeye 发表于 2005-3-24 21:00:00

取得顶点坐标的方法,论坛里一大堆了,仔细找一找吧。


重新定义起点的方法:


1、选择起点startpt,用曲线函数vlax-curve-getClosestPointTo得到线上距离startpt最近的点nestpt。


2、检查nestpt距离线上最近的坐标。


3、根据以上数据调整坐标,重新生成多段线。

onej 发表于 2005-3-24 21:05:00

陈Q的法子,受用!

sly 发表于 2005-3-24 21:09:00

可以编个lisp程序吗?谢!

meflying 发表于 2005-3-25 08:44:00

程序功能:判断是顺时针还是逆时针,如果是顺时针则更改为逆时针。。。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")
)

sly 发表于 2005-3-25 10:34:00

可以重新指定起点吗?

无痕 发表于 2005-3-26 20:28:00

起点不是可以随便指定的
页: [1] 2
查看完整版本: [求助]如何改变多段线的顶点顺序