如何加快搜索点的速度
本帖最后由 cjs 于 2011-6-17 15:24 编辑有两组点,分别在两个图层,想匹配出相互距离小于0.1m的点组
过滤和窗选的方法速度都比较慢(约有8000多点),有没有其它办法?
(defun tt (/ BL DIS EP F I J ST SV TD TP UP UR VE VP vtp)
(setq sv (ssget "X" '((0 . "POINT") (8 . "水公司VRS")))
i0
) ;_ 结束setq
(setq f (open "c:\\point.dat" "w"))
(repeat (sslength sv)
(setq ve(ssname sv i)
i (1+ i)
vp(cdr (assoc 10 (entget ve)))
st(ssget "X"
(list '(0 . "POINT")
'(8 . "导线点")
'(-4 . "<AND")
'(-4 . ">=,>=,*")
(list 10 (- (car vp) 0.1) (- (cadr vp) 0.1) (last vp))
'(-4 . "<=,<=,*")
(list 10 (+ (car vp) 0.1) (+ (cadr vp) 0.1) (last vp))
'(-4 . "AND>")
) ;_ 结束list
) ;_ 结束ssget
j 0
dis 10.0
epnil
et nil
) ;_ 结束setq
;;; (setq
;;; vtp (list (car vp) (cadr vp) )
;;; bl(polar vtp 3.926991 0.1414)
;;; ur(polar vtp 0.785398 0.1414)
;;; j 0
;;; dis 10.0
;;; epnil
;;; ) ;_ 结束setq
;;; (if (setq st (ssget "_C" bl ur '((0 . "POINT") (8 . "导线点") ))) ;_ 结束setq
;;;
(if st
(repeat (sslength st)
(if (< (setq td (distance vp (setq tp (cdr (assoc 10 (entget (ssname st j))))))) dis)
(setq dis td
eptp
et(ssname st j)
) ;_ 结束setq
) ;_ 结束if
(setq j (1+ j))
) ;_ 结束repeat
) ;_ 结束if
(if ep
(princ (strcat (getpn ve)
","
(rtos (car vp) 2 3)
","
(rtos (cadr vp) 2 3)
","
(rtos (last vp) 2 3)
","
(getpn et)
","
(rtos (car ep) 2 3)
","
(rtos (cadr ep) 2 3)
","
(rtos (last ep) 2 3)
"\n"
) ;_ 结束strcat
f
) ;_ 结束princ
) ;_ 结束if
) ;_ 结束repeat
(close f)
(princ "OK")
) ;_ 结束defun
(defun getpn (e / pn ed)
(setq ed (entget e '("pointname"))) ;_ 结束setq
(if (/= nil (assoc -3 ed))
(setq pn (cdr (nth 2 (cadr (assoc -3 ed))))) ;_ 结束setq
(setq pn "NULL")
) ;_ 结束if
) ;_ 结束defun
页:
[1]