本帖最后由 st788796 于 2017-6-8 14:24 编辑
使用 xd::list:groupbyindex 后面代码就简化如下

- (defun c:tt (/ ss sl i e el lst filter pts p1 l elst s1 s)
- (if (setq ss (ssget '((0 . "circle"))))
- (progn
- (setq i 0
- slen (sslength ss)
- )
- (while (setq e (ssname ss i))
- (setq el (entget e)
- lst (cons (assoc 40 el) lst)
- i (1+ i)
- )
- )
- (if lst
- (progn
- (setq filter '((-4 . "<or") (0 . "circle")))
- (foreach x lst
- (setq filter (cons x filter))
- )
- (setq filter (cons '(-4 . "or>") filter))
- (if (setq s (ssget "x" (reverse filter)))
- (progn
- (setq i 0)
- (while (setq e (ssname s i))
- (setq el (entget e)
- elst (cons (list (cdr (assoc 10 el)) e) elst)
- i (1+ i)
- )
- )
- (setq elst (xd::list:groupbyindex elst 1e-6)
- s1 (ssadd)
- )
- (foreach x elst
- (if (= (length (cdr x)) slen)
- (mapcar '(lambda (x) (ssadd x s1)) (cdr x))
- )
- )
- (sssetfirst nil s1)
- )
- )
- )
- )
- )
- )
- (princ)
- )
不同写法

- (defun c:tt (/ ss slen lst filter s elst s1)
- (if (setq ss (ssget '((0 . "circle"))))
- (progn
- (setq slen (sslength ss)
- lst (mapcar '(lambda (x) (assoc 40 (entget x)))
- (xdrx_pickset->ents ss)
- )
- )
- (if lst
- (progn
- (setq filter '((-4 . "<or") (0 . "circle")))
- (foreach x lst
- (setq filter (cons x filter))
- )
- (setq filter (cons '(-4 . "or>") filter))
- (if (setq s (ssget "x" (reverse filter)))
- (progn
- (setq elst (mapcar '(lambda (x) (list (xdrx_getpropertyvalue x "center") x))
- (xdrx_pickset->ents s)
- )
- elst (xd::list:groupbyindex elst 1e-6)
- elst (apply 'append
- (vl-remove-if-not
- '(lambda (x) (= (length x) slen))
- (mapcar 'cdr elst)
- )
- )
- s1 (ssadd)
- )
- (foreach x elst (ssadd x s1))
- (sssetfirst nil s1)
- )
- )
- )
- )
- )
- )
- (princ)
- )
|