edata 发表于 2014-1-25 13:14:54

USER2128 发表于 2014-1-25 08:38 static/image/common/back.gif
;;;来一个固版主的:
(setq ent (car(entsel "\n选取多段线: ")))
(mapcar 'cdr (vl-remove-if-not '(lam ...

G版的只能是多段线,二维用这个
;;支持2D\3D多段线点提取
;;edit by edata 2014-1-25
(defun sk_vertex(ent / lst ety x)
(defun sk_dxf(en code)
    (cdr (assoc code (entget en)))
    )
(setq        lst '()
        ety (sk_dxf ent 0)
        )
(cond
    ((= ety "POLYLINE")
   (while (/= (sk_dxf ent 0) "SEQEND")
       (setq ent(entnext ent))
       (if (= (sk_dxf ent 0) "VERTEX")
       (setq lst(cons (sk_dxf ent 10) lst))))
   (if(/= lst '())(reverse lst) nil))
    ((= ety "LWPOLYLINE")
   (setq e1(entget ent))
   (while (setq pt(car e1))
       (if(= (car pt) 10)
       (setq lst(cons (cdr pt) lst))
       )
       (setq e1(cdr e1)))
      
   (if(/= lst '())(reverse lst) nil)
   ;(mapcar 'cdr (vl-remove-if-not '(lambda(x)(= 10 (car x)))(entget ent)))
   )
    )
)
(defun c:tt()
(sk_vertex (car (entsel)))
)

llsheng_73 发表于 2014-1-25 13:41:31

(defun Plinexy(e / p a b n ob q et d d1 en et)
   (setq a(entget e)ob(vlax-ename->vla-object e)et(cdr(assoc 0 a))n 0 p nil d nil)
   (cond((="LWPOLYLINE"et)
         (repeat(length a)(setq b (nth n a) n (+ n 1))
         (if (= 10 (car b))(progn
                               (setq q(list (cadr b) (caddr b))d1(vlax-curve-getDistAtPoint ob q))
                               (if p (if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
                                 (setq p (list q))))
             )))
      ((="POLYLINE"et)
         (SETQ EN (ENTGET (SETQ E (ENTNEXT E))))
         (WHILE (/= (CDR (ASSOC 0 EN)) "SEQEND")
         (SETQ q (CDR (ASSOC 10 EN))d1(vlax-curve-getDistAtPoint ob q)q(reverse(cdr(reverse q))))
         (if p(if (not(member d1 d)) (setq p (append p (list q))d (append d (list d1))))
             (setq p (list q)))
         (SETQ EN (ENTGET (SETQ E (ENTNEXT E)))))
         (setq p(reverse p))
         ))
   P)
;;二维、三维、多线段节点坐标(滤掉了多余点,未处理假闭合)

重慶崽兒 发表于 2014-1-25 14:17:26

USER2128 发表于 2014-1-25 08:38 static/image/common/back.gif
;;;来一个固版主的:
(setq ent (car(entsel "\n选取多段线: ")))
(mapcar 'cdr (vl-remove-if-not '(lam ...

那啥,这是提取多段线的吧,二维多段线是不行的

重慶崽兒 发表于 2014-1-25 14:18:44

llsheng_73 发表于 2014-1-25 13:41 static/image/common/back.gif
;;二维、三维、多线段节点坐标(滤掉了多余点,未处理假闭合)

谢谢大大帮助,感谢!

edata 发表于 2014-1-25 16:15:04

llsheng_73 发表于 2014-1-25 13:41 ;;二维、三维、多线段节点坐标(滤掉了多余点,未处理假闭合)

看看7楼的链接,可以省点代码。

edata 发表于 2014-1-27 01:34:22

llsheng_73 发表于 2014-1-25 13:41 static/image/common/back.gif
;;二维、三维、多线段节点坐标(滤掉了多余点,未处理假闭合)

纯Alisp提取多段线 2D\3D多段线顶点,去重复点加闭合
;;支持2D\3D多段线点提取,重复点将去掉\处理假的闭合
;;暂时未考虑多点共线
;;edit by edata 2014-1-26
;;modfiy by edata 2014-1-27
;;要放假了,又得消失一段时间
;;(mapcar 'cdr (vl-remove-if-not '(lambda(x)(= 10 (car x)))(entget ent)))
(defun sk_vertex(ent / lst ety x)
(defun sk_dxf(en code)
    (cdr (assoc code (entget en)))
    )
(defun sk_removept(lst flag / newlst)
(setq newlst '())
    (while (car lst)
      (if (not(equal (car lst) (cadr lst) 1e-8))
        (setq newlst(cons (car lst) newlst)))
      (setq lst(cdr lst))
      )
(if(/= newlst '())
    (if (or(and flag
             (= flag 1)
             (equal (car newlst)(last newlst) 1e-8))
           (equal (car newlst)(last newlst) 1e-8))      
      (reverse (cdr newlst))
      (reverse newlst)
      )
    nil )
)
(setq lst '()
        ety (sk_dxf ent 0)
        isclosed (logand 1(sk_dxf ent 70))
        )
(cond
    ((= ety "POLYLINE")
   (while (/= (sk_dxf ent 0) "SEQEND")
       (setq ent(entnext ent))
       (if (= (sk_dxf ent 0) "VERTEX")
         (setq lst(cons (sk_dxf ent 10) lst))))
   (if(/= lst '())(sk_removept (reverse lst) isclosed) nil))
    ((= ety "LWPOLYLINE")
   (setq e1(entget ent))
   (while (setq pt(car e1))
       (if(= (car pt) 10)
         (setq lst(cons (cdr pt) lst))
         )
       (setq e1(cdr e1)))      
   (if(/= lst '())(sk_removept (reverse lst) isclosed) nil)      
   )
    )
)

(defun c:tt()
(princ(sk_vertex (car (entsel))))
;(princ(Plinexy (car (entsel))))
(princ)
)

我来看MM的 发表于 2018-7-2 21:35:26

学习,收藏

evayleung 发表于 2018-7-3 20:17:55

学习一下。。我一般都是把二维多段线转为多段线再编辑的。
页: 1 [2]
查看完整版本: 二维多段线没有顶点表,怎么提取顶点坐标呢?(注意:不是多段线)还请各位大大解答!