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