找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 508|回复: 4

[原创]:fss 比et的fs 快一倍的粘连选集程序

  [复制链接]
发表于 2004-11-11 03:21:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
命令:fss (完善中)
功能同et的fs,选择有粘连的实体选集
测试:1551个实体
fs:58秒
fss:27秒

下载:解压为vlx文件,加载后输入fss命令执行。


[swf w=800 h=620]http://www.xdcad.net/article/upload/file/291_20041111032521_fss=fs粘连选集.swf[/swf]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2004-11-11 03:30:02 | 显示全部楼层
附 et 的fs原程序

  1. ;;;    FASTSEL.LSP
  2. ;;;    Created 7/21/97 by Randy Kintzley
  3. ;;;    Copyright ?1999 by Autodesk, Inc.
  4. ;;;
  5. ;;;    Your use of this software is governed by the terms and conditions of the
  6. ;;;    License Agreement you accepted prior to installation of this software.
  7. ;;;    Please note that pursuant to the License Agreement for this software,
  8. ;;;    "[c]opying of this computer program or its documentation except as
  9. ;;;    permitted by this License is copyright infringement under the laws of
  10. ;;;    your country.  If you copy this computer program without permission of
  11. ;;;    Autodesk, you are violating the law."
  12. ;;;
  13. ;;;    AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
  14. ;;;    AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
  15. ;;;    MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE.  AUTODESK, INC.
  16. ;;;    DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
  17. ;;;    UNINTERRUPTED OR ERROR FREE.
  18. ;;;
  19. ;;;    Use, duplication, or disclosure by the U.S. Government is subject to
  20. ;;;    restrictions set forth in FAR 52.227-19 (Commercial Computer
  21. ;;;    Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
  22. ;;;    (Rights in Technical Data and Computer Software), as applicable.
  23. ;;;
  24. ;;;  ----------------------------------------------------------------

  25. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  26. (defun c:fastsel ( / old_err ss ss2 n na )
  27. (setq old_err *error*)
  28. (defun *error* ( a / )
  29.   (princ a)
  30.   (setq *error* old_err)
  31.   (princ)
  32. );defun

  33. (fsmode_init)
  34. (princ "\nUse 'FSMODE to control chain selection.")
  35. (princ (strcat "\nFSMODE = " #fsmode))
  36. (setq ss2 (fs_get_current_sel)
  37.        ss (fastsel)
  38. );setq

  39. (if (and ss
  40.          (princ (strcat (itoa (sslength ss))
  41.                         " object(s) found."
  42.                 )
  43.          )
  44.          (not (equal (getvar "cmdnames") ""))
  45.     );and
  46.     (command ss);then pass in the selection set
  47.     (progn
  48.      (if (and ss
  49.               (equal 1 (getvar "pickfirst"))
  50.          );and
  51.          (progn
  52.           (if (not ss2)
  53.               (setq ss2 ss)
  54.               (progn
  55.                (setq n 0)
  56.                (repeat (sslength ss)
  57.                 (setq na (ssname ss n));setq
  58.                 (if (not (ssmemb na ss2))
  59.                     (setq ss2 (ssadd na ss2))
  60.                 );if
  61.                 (setq n (+ n 1));setq
  62.                );repeat
  63.               );progn then combine the previously gripped stuff with
  64.                       ;the selection set returned from fastsel
  65.           );if
  66.           (sssetfirst ss2 ss2)

  67.          );progn else just set a grip-ed selection set.
  68.          (princ "\nNothing found")
  69.      );if
  70.     );progn else
  71. );if

  72. (setq *error* old_err)
  73. (princ "\nExiting Fastsel")
  74. (princ)
  75. );defun c:fastsel


  76. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  77. (defun c:fs ()
  78. (c:fastsel)
  79. );defun c:fs

  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81. (defun c:fsmode ( / old_err fsmode )
  82. (setq old_err *error*)
  83. (defun *error* ( a / )
  84.   (princ a)
  85.   (setq *error* old_err)
  86.   (princ)
  87. );defun

  88. (fsmode_init)
  89. (initget "ON OFf")
  90. (if (setq fsmode (getkword (strcat "\nFASTSEL chain selection <" #fsmode ">: ")));setq
  91.     (progn
  92.      (setq #fsmode (xstrcase fsmode))
  93.      (setenv "BNS_FSMODE" #fsmode)
  94.     );progn then
  95. );if

  96. (setq *error* old_err)
  97. (princ)
  98. );defun c:fsmode

  99. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  100. (defun fsmode_init ()
  101. (if (not #fsmode)
  102.      (setq #fsmode (getenv "BNS_FSMODE"))
  103. );if
  104. (if (and (not (equal "ON" #fsmode))
  105.           (not (equal "OFF" #fsmode))
  106.      );and
  107.      (progn
  108.       (setq #fsmode "OFF");setq
  109.       (setenv "BNS_FSMODE" #fsmode)
  110.      );progn then
  111. );if
  112. );defun fsmode_init

  113. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  114. (defun fastsel ( / flt na fsmode lst2 ss px px2 z j lst a b lst3 lst4
  115.                        n c d ss2 ss4 ss5
  116.                )

  117. (setq    flt '(
  118.                 (0 . "LINE") (0 . "POLYLINE") (0 . "LWPOLYLINE") (0 . "CIRCLE")
  119.                 (0 . "ARC") (0 . "ATTDEF") (0 . "TEXT") (0 . "MTEXT")
  120.                 (0 . "ELLIPSE") (0 . "IMAGE") (0 . "SPLINE") (0 . "POINT")
  121.                 (0 . "INSERT") (0 . "3DFACE") (0 . "TRACE") (0 . "SOLID")
  122.               )
  123.           na (bns_fast_sel "\nSelect touching object: " flt)
  124.          flt (append '((-4 . "<OR")) flt '((-4 . "OR>")))
  125.       fsmode "ON"
  126. );setq
  127. (if na
  128.     (progn
  129.      (setq  lst2 (list na)
  130.               ss (ssadd na (ssadd))
  131.               px (acet-geom-pixel-unit)
  132.              px2 (* px 0.75)
  133.                z 0
  134.                j 0
  135.      );setq
  136.      (while (and (< j (length lst2))
  137.                  (equal fsmode "ON")
  138.             );and
  139.       (setq fsmode #fsmode)
  140.       (setq na (nth j lst2));setq
  141.       (setq  lst (acet-list-remove-adjacent-dups (acet-geom-object-point-list na (/ px 2.0)))
  142.                a (car lst)
  143.                b (cadr lst)
  144.       );setq
  145.       (if b
  146.           (setq lst3 (list (polar a (+ (angle b a) (/ pi 2.0)) px2));list
  147.                 lst4 (list (polar a (- (angle b a) (/ pi 2.0)) px2));list
  148.           );setq then
  149.       );if
  150.       (setq n 0)
  151.       (repeat (max 0 (- (length lst) 1))
  152.        (setq a (nth n lst)
  153.              b (nth (+ n 1) lst)
  154.              c (polar b (- (angle a b) (/ pi 2.0)) px2)
  155.              d (polar b (+ (angle a b) (/ pi 2.0)) px2)
  156.        );setq
  157.        (if (not (equal c (last lst3) 0.00001))
  158.            (setq lst3 (append lst3 (list c)));setq then
  159.        );if
  160.        (if (not (equal d (last lst4) 0.00001))
  161.            (setq lst4 (append lst4 (list d)));setq then
  162.        );if
  163.        (setq n (+ n 1));setq
  164.       );repeat
  165.       (setq ss2 (f_on_screen lst flt))
  166.       (setq ss4 (f_on_screen lst3 flt))
  167.       (setq ss5 (f_on_screen lst4 flt))
  168.       (if ss2
  169.           (progn
  170.            (setq n 0)
  171.            (repeat (sslength ss2)
  172.             (setq na (ssname ss2 n))
  173.             (if (not (member na lst2))
  174.                 (setq lst2 (append lst2 (list na))
  175.                         ss (ssadd na ss)
  176.                 );setq
  177.             );if
  178.             (setq n (+ n 1));setq
  179.            );repeat
  180.           );progn
  181.       );if
  182.       (if ss4
  183.           (progn
  184.            (setq n 0)
  185.            (repeat (sslength ss4)
  186.             (setq na (ssname ss4 n))
  187.             (if (not (member na lst2))
  188.                 (progn
  189.                  (setq lst2 (append lst2 (list na))
  190.                          ss (ssadd na ss)
  191.                  );setq
  192.                 );progn then
  193.             );if
  194.             (setq n (+ n 1));setq
  195.            );repeat
  196.           );progn
  197.       );if
  198.       (if ss5
  199.           (progn
  200.            (setq n 0)
  201.            (repeat (sslength ss5)
  202.             (setq na (ssname ss5 n))
  203.             (if (not (member na lst2))
  204.                 (progn
  205.                  (setq lst2 (append lst2 (list na))
  206.                          ss (ssadd na ss)
  207.                  );setq
  208.                 );progn then
  209.             );if
  210.             (setq n (+ n 1));setq
  211.            );repeat
  212.           );progn
  213.       );if
  214.       (setq j (+ j 1))
  215.      );while

  216.     );progn then
  217. );if

  218. ss
  219. );defun fastsel



  220. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  221. ;select the seed ent.
  222. (defun bns_fast_sel ( msg flt / filter_check na)
  223. ;local function
  224. (defun filter_check ( na flt / e1 a n flag)
  225.   (cond
  226.    ((not na) (setq flag nil))
  227.    ((not flt) (setq flag T))
  228.    (T
  229.     (setq e1 (entget na));setq
  230.     (setq n 0)
  231.     (while (and (not flag)
  232.                 (< n (length flt))
  233.            );and
  234.      (setq a (nth n flt));setq
  235.      (if (member a e1)
  236.          (setq flag T);setq then got a match for the filter
  237.      );if
  238.      (setq n (+ n 1));setq
  239.     );while
  240.    )
  241.   );cond close
  242.   flag
  243. );defun filter_check

  244. (if (not (equal (substr msg 1 1) "\n"))
  245.     (setq msg (strcat "\n" msg))
  246. );if
  247. (while (not na)
  248. (setvar "errno" 0)
  249. (while (or (and (not (setq na (car (entsel msg))))
  250.                  (equal 7 (getvar "errno"))
  251.             );and
  252.             (and na
  253.                  (not (filter_check na flt))
  254.             );and
  255.         );or
  256.    (if (equal 7 (getvar "errno"))
  257.        (princ "\n0 found")
  258.        (progn
  259.         (if na
  260.             (princ (strcat "\n*Invalid* Must select "
  261.                            "LINE, POLYLINE, LWPOLYLINE, CIRCLE, ARC, ATTDEF, TEXT,"
  262.                            "MTEXT, ELLIPSE, or IMAGE object.\n"
  263.                    );strcat
  264.             );princ
  265.         );if
  266.        );progn
  267.    );if
  268.    (setvar "errno" 0)
  269. );while
  270. (cond
  271.   ((equal (getvar "errno") 52) ;enter
  272.    (setq na 99);
  273.   )
  274. );cond close
  275. );while
  276. (if (equal na 99) (setq na nil))
  277. na
  278. );defun bns_fast_sel

  279. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  280. (defun fs_get_current_sel ( / ss)
  281. (if (and (equal 1 (getvar "pickfirst"))
  282.          (cadr (ssgetfirst))
  283.     );and
  284.     (setq ss (cadr (ssgetfirst)));then something is already selected so get it.
  285. );if
  286. ss
  287. );defun fs_get_current_sel

  288. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  289. ;returns a list of points on screen if the first two lists do not
  290. ;contain segments that intersect each other.
  291. ;
  292. (defun f_on_screen ( lst flt / vd p1 p2 p3 p4 lst2 lst3 n a b c d
  293.                                x1 x2 x3 x4 pnt j ss ss2 na pnt2 dst dlst
  294.                    )

  295. (setq  vd (trans (getvar "viewdir") 1 0 T)
  296.        p1 (acet-geom-m-trans (acet-geom-view-points) 1 vd)      ;variables p1, p2, p3, and  p4 are corner points
  297.        p3 (cadr p1)                       ; of the current view
  298.        p1 (car p1)
  299.        p2 (list (car p3) (cadr p1));list
  300.        p4 (list (car p1) (cadr p3));list
  301.       dst (distance (getvar "extmin") (getvar "extmax"))
  302.       lst (acet-geom-m-trans lst 1 vd)
  303.         a (car lst)                 ;the first point in lst expressed in view coords.
  304.         c (list (car a) (cadr a))
  305. );setq

  306. (if (and (<= (car c) (car p3))    ;if the first point is on screen then add it to lst2
  307.          (<= (cadr c) (cadr p3))
  308.          (>= (car c) (car p1))
  309.          (>= (cadr c) (cadr p1))
  310.     );and
  311.     (setq lst2 (list a));setq
  312. );if

  313. (setq n 0)
  314. (repeat (max (- (length lst) 1)
  315.              0
  316.         )
  317. (setq  a (nth n lst)             ;the first point
  318.         c (list (car a) (cadr a)) ;the same point without the z
  319.         b (nth (+ n 1) lst)       ;the second point
  320.         d (list (car b) (cadr b)) ;ditto with no z
  321.        x1 (inters p1 p2 c d)      ;check for intersections
  322.        x2 (inters p2 p3 c d)
  323.        x3 (inters p3 p4 c d)
  324.        x4 (inters p4 p1 c d)
  325. );setq
  326. (if (or x1 x2 x3 x4)
  327.      (progn             ;then intersection(s) were found
  328.       (setq dlst nil)   ;Now build a list of sublist containing the
  329.                         ;the distance from the intersecting point to point 'a'
  330.                         ; and 'a' the point it's self.
  331.       (if x1
  332.           (setq dlst (append dlst (list (list (distance x1 c) x1))));setq
  333.       );if
  334.       (if x2
  335.           (setq dlst (append dlst (list (list (distance x2 c) x2))));setq
  336.       );if
  337.       (if x3
  338.           (setq dlst (append dlst (list (list (distance x3 c) x3))));setq
  339.       );if
  340.       (if x4
  341.           (setq dlst (append dlst (list (list (distance x4 c) x4))));setq
  342.       );if
  343.       (setq dlst (acet-list-isort dlst 0)) ;sort the list of sublists based on distance from 'a'
  344.       (setq j 0)
  345.       (repeat (length dlst)                              ;then add them one at a time to lst2
  346.        (setq pnt (nth j dlst)                            ;the sub-list (dist, point)
  347.              pnt (cadr pnt)                              ;the point
  348.              pnt (list (car pnt) (cadr pnt) (* -1.0 dst));now get ready to create a segment
  349.             pnt2 (list (car pnt) (cadr pnt) dst)         ;that is normal to the view and very long
  350.              pnt (inters a b pnt pnt2 nil)               ;check for 3d intersect to get true
  351.                                                          ;location
  352.        );setq
  353.        (if (and pnt
  354.                 (not (equal pnt (last lst2)))
  355.            );and
  356.            (setq lst2 (append lst2 (list pnt)));setq
  357.        );if
  358.       (setq j (+ j 1));setq
  359.       );repeat
  360.      );progn then find the intersection closest to a
  361.      (setq dlst nil);else no intersections
  362. );if
  363. (if (and (<= (car d) (car p3))
  364.           (<= (cadr d) (cadr p3))
  365.           (>= (car d) (car p1))
  366.           (>= (cadr d) (cadr p1))
  367.           (not (equal b (last lst2)))
  368.      );and
  369.      (setq lst2 (append lst2 (list b)));setq then
  370. );if
  371. (if dlst
  372.      (progn
  373.       (setq lst2 (acet-geom-m-trans lst2 vd 1)
  374.             lst3 (append lst3 (list lst2))
  375.             lst2 nil
  376.       );setq
  377.       (if (and (<= (car d) (car p3))
  378.                (<= (cadr d) (cadr p3))
  379.                (>= (car d) (car p1))
  380.                (>= (cadr d) (cadr p1))
  381.                (not (equal b (last lst2)))
  382.           );and
  383.           (setq lst2 (append lst2 (list b)));setq then
  384.       );if
  385.      );progn then
  386. );if
  387. (setq n (+ n 1));setq
  388. );repeat
  389. (if (and lst2
  390.          (setq lst2 (acet-geom-m-trans lst2 vd 1))
  391.          (not (member lst2 lst3))
  392.     );and
  393.     (setq lst3 (append lst3 (list lst2)));setq then
  394. );if

  395. (setq ss2 (ssadd))
  396. (setq n 0)
  397. (repeat (length lst3)

  398. (if (and (> (length (nth n lst3)) 1)
  399.          (setq ss (ssget "_f" (nth n lst3) flt));setq
  400.     );and
  401.     (progn

  402.      (setq j 0)
  403.      (repeat (sslength ss)
  404.       (setq na (ssname ss j))
  405.       (if (not (ssmemb na ss2))
  406.           (setq ss2 (ssadd na ss2));setq then
  407.       );if
  408.      (setq j (+ j 1));setq
  409.      );repeat
  410.     );progn
  411. );if
  412. (setq n (+ n 1));setq
  413. );repeat

  414. ss2
  415. );defun f_on_screen


  416. (princ)

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-11 08:37:09 | 显示全部楼层
这个程序的实用性好像不是太强哦,斑竹?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-11 10:13:15 | 显示全部楼层
请问斑竹,
这种选择有什么作用?
意义好像不大啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-11-11 11:41:16 | 显示全部楼层
有什么用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-24 17:32 , Processed in 0.393574 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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