明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1007|回复: 0

如何加快搜索点的速度

[复制链接]
发表于 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")))
        i  0
  ) ;_ 结束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
          ep  nil
          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
;;;          ep  nil
;;;    ) ;_ 结束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
                ep  tp
                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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-7-25 08:13 , Processed in 0.219786 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表