试试这个,帮助李的子功能。。。
- (defun _vertices ( l )
- (if (eq "LWPOLYLINE" (cdr (assoc 0 l)))
- (_vertices1 l)
- (_vertices2 (entnext (cdr (assoc -1 l))))
- )
- )
- (defun _vertices1 ( l / p )
- (if (setq p (assoc 10 l))
- (cons (cdr p) (_vertices1 (cdr (member p l))))
- )
- )
- (defun _vertices2 ( e )
- (if (eq "VERTEX" (cdr (assoc 0 (entget e))))
- (cons (cdr (assoc 10 (entget e))) (_vertices2 (entnext e)))
- )
- )
- (defun _uniquefuzz ( l f )
- (if l
- (cons (car l)
- (_uniquefuzz
- (vl-remove-if '(lambda ( x ) (equal x (car l) f)) (cdr l))
- f
- )
- )
- )
- )
- (defun c:len&bre ( / ss pl ptlst l-r-ptlst d-u-ptlst midl midr midd midu len bre )
- (while (not ss)
- (prompt "\nSelect 2dpolyline")
- (setq ss (ssget "_+.:E:S:L" '((0 . "*POLYLINE"))))
- )
- (setq pl (ssname ss 0))
- (setq ptlst (_uniquefuzz (_vertices (entget pl)) 1e-)
- (setq l-r-ptlst (vl-sort ptlst '(lambda (a b) (< (car a) (car b)))))
- (setq d-u-ptlst (vl-sort ptlst '(lambda (a b) (< (cadr a) (cadr b)))))
- (setq midl (mapcar '(lambda (a b) (/ (+ a b) 2.0)) (car l-r-ptlst) (cadr l-r-ptlst)))
- (setq midr (mapcar '(lambda (a b) (/ (+ a b) 2.0)) (caddr l-r-ptlst) (cadddr l-r-ptlst)))
- (setq midd (mapcar '(lambda (a b) (/ (+ a b) 2.0)) (car d-u-ptlst) (cadr d-u-ptlst)))
- (setq midu (mapcar '(lambda (a b) (/ (+ a b) 2.0)) (caddr d-u-ptlst) (cadddr d-u-ptlst)))
- (setq len (distance midl midr))
- (setq bre (distance midd midu))
- (prompt "\nLength : ")(princ len)
- (prompt "\nBreadth : ")(princ bre)
- (princ)
- )
M、 R。 |