cjs 发表于 2011-6-17 15:23:23

如何加快搜索点的速度

本帖最后由 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]
查看完整版本: 如何加快搜索点的速度