明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4558|回复: 21

能否全选图纸中,和指定选择集一致的所有选择集?(有思路了)

  [复制链接]
发表于 2011-11-7 16:39:00 | 显示全部楼层 |阅读模式
本帖最后由 mandala 于 2011-11-9 22:55 编辑

比如,框选得到一个选择集,是一个由4条LINE组成的正方形。然后我要删除图纸中所有跟这个正方形形状、大小、层名、线型等完全相同的正方形!如何来选中?

当然,假设写lsp前,就已经知道要选的是该正方形,那么根据该正方形的几何特性可以遍历图纸并找出其它正方形。

但如果随意框选一些图元,或随意指定一个选择集呢?

这个问题其实很常见,也困扰了我很久。我开始怀疑lisp能否胜任这样的任务!

欢迎各位高手挑战!
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-3-7 12:38:53 | 显示全部楼层
xiaxiang 发表于 2011-11-7 16:56
gu_xl版主有一个函数,功能:选择除了位置不一样,其他都完全一样的的实体
为单选,可以改为批选。
我改 ...

版主,您好!
相同的实体,如果旋转了,就选不上了……
发表于 2018-9-17 16:17:14 | 显示全部楼层
xiaxiang 发表于 2011-11-7 16:56
gu_xl版主有一个函数,功能:选择除了位置不一样,其他都完全一样的的实体
为单选,可以改为批选。
我改 ...

你好下载不了
发表于 2022-2-11 08:24:55 | 显示全部楼层


请教:框选得到一个选择集,是一个由4条LINE组成的方形!(或*polyline)
1.线长相等=然后我要,子程序~
2.线长不等=然后我要,子程序~
发表于 2011-11-7 16:56:11 | 显示全部楼层
gu_xl版主有一个函数,功能:选择除了位置不一样,其他都完全一样的的实体
为单选,可以改为批选。
我改了一下传上来,如果你受得了速度的话,可以尝试一下。
转载自gu_xl版主博客,欢迎去看看http://gyh060707.blog.sohu.com/



本帖子中包含更多资源

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

x
 楼主| 发表于 2011-11-7 20:03:58 | 显示全部楼层
本帖最后由 mandala 于 2011-11-7 20:10 编辑
xiaxiang 发表于 2011-11-7 16:56
gu_xl版主有一个函数,功能:选择除了位置不一样,其他都完全一样的的实体
为单选,可以改为批选。
我改了 ...


谢谢xiaxiang老兄。

gu_xl 的单选没问题,不过你改的这个批选的思路有点问题。比如下图有六个图形,当我框选左上的三条竖线作为一个选择集时,gt.lsp运行的结果是全选了图中所有线条。或者当框选右上角的一条竖线作为一个选择集时,gt.lsp也会选中所有线条。不知道如何加上判断每个选择集中总图元数,及每个图元相互位置关系的条件语句?


本帖子中包含更多资源

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

x
发表于 2011-11-8 08:24:40 | 显示全部楼层
mandala 发表于 2011-11-7 20:03
谢谢xiaxiang老兄。

gu_xl 的单选没问题,不过你改的这个批选的思路有点问题。比如下图有六个图形, ...

“不知道如何加上判断每个选择集中总图元数,及每个图元相互位置关系的条件语句?”
难吧?没有思路吧,因为可能的情况太多。。。
 楼主| 发表于 2011-11-9 22:04:26 | 显示全部楼层
本帖最后由 mandala 于 2011-11-9 23:11 编辑
xiaxiang 发表于 2011-11-8 08:24
“不知道如何加上判断每个选择集中总图元数,及每个图元相互位置关系的条件语句?”
难吧?没有思路吧, ...


想了好久,感觉上还是可以办到的,我的思路就是直接用(cdr(assoc 10 (entget ent)))这个点的位置来判断每个图元间的相互关系,循环遍历!
下边这个lsp是用来选择一个选择集,然后找出整个图纸中所有跟其形状一样的选择集,然后用一个形来原地替换每个选择集!
现在暂时做了一个替换只包含三个图元的选择集,其实做包含4个、5个、6个乃至任意数目图元的选择集,思路也是一样的!

要试这个lsp的话,要把其中两句插入形的语句:
(command "shape" "149" (cdr (assoc 10 (entget (ssname ss 0)))) "1" "0")
(command "shape" "149" (cdr (assoc 10 (entget ss1ent))) "1" "0")

随便改一下,因为你们电脑中没有一个叫“149”的形。比如改成插入一个块,或者画一根线什么的,比如:
(command "insert" "???图块名" (cdr (assoc 10 (entget ss1ent))) "1" "0")等等。

由于匆忙,lsp写得比较粗糙,抛砖引玉,请大家指教。




  1. (defun c:aaa (/       ss      p1     p2    entx   ent1  ent2   ent3
  2.         ss1    ss2    ss3     d2    d3   n  j      x
  3.         ssx    ss1ent ss2ent ss3ent dist2   dist3  goodss
  4.        )
  5.   (setvar "osmode" 0)
  6.   (command "._undo" "_be")
  7. (prompt "\n请选择你需要替换的选择集(本lsp只考虑包含三个图元的选择集):")
  8.   (setq ss (ssget))
  9.   (setq p1 (sscenter ss));求选择集的中心
  10.   (command "shape"
  11.      "149"
  12.      (cdr (assoc 10 (entget (ssname ss 0))))
  13.      "1"
  14.      "0"
  15.   ) ;_ 结束command,插入一个形
  16.   (setq entx (entlast))
  17.   (setq p2 (entcenter entx));求形的中心
  18.   (entdel entx)
  19.   (setq ent1 (ssname ss 0))
  20.   (setq ent2 (ssname ss 1))
  21.   (setq ent3 (ssname ss 2))
  22.   (setq ss1 (enfindx ent1));ss1为图纸中所有与ent1相同的图元
  23.   (setq ss2 (enfindx ent2));ss2为图纸中所有与ent2相同的图元
  24.   (setq ss3 (enfindx ent3));ss3为图纸中所有与ent3相同的图元
  25.   (setq  d2 (distance (cdr (assoc 10 (entget ent1)))
  26.          (cdr (assoc 10 (entget ent2)))
  27.      ) ;_ 结束distance
  28.   ) ;_ 结束setq,如此来判断第一、第二两个图元间距离
  29.   (setq  d3 (distance (cdr (assoc 10 (entget ent1)))
  30.          (cdr (assoc 10 (entget ent3)))
  31.      ) ;_ 结束distance
  32.   ) ;_ 结束setq,如此来判断第一、第三两个图元间距离
  33.   (setq  goodss (ssadd)
  34.   endss  (ssadd)
  35.   ) ;_ 结束setq
  36.   (repeat (sslength ss1)
  37.     (setq ssx (ssadd))
  38.     (setq ss1ent (ssname ss1 0))
  39.     (setq catchit
  40.      (vl-catch-all-apply
  41.        '(lambda ()
  42.     (setq j  0
  43.           x  0
  44.     ) ;_ 结束setq
  45.     (repeat  (sslength ss2);开始遍历ss2,和ss1ent做比较,用相对距离来找出符合条件的图元。
  46.       (setq ss2ent (ssname ss2 j))
  47.       (setq  dist2 (distance  (cdr (assoc 10 (entget ss1ent)))
  48.           (cdr (assoc 10 (entget ss2ent)))
  49.             ) ;_ 结束distance
  50.       ) ;_ 结束setq
  51.       (if (equal dist2 d2 0.00001)
  52.         (progn
  53.           (ssadd ss1ent ssx)
  54.           (ssadd ss2ent ssx)
  55.           (setq x 1)
  56.         ) ;_ 结束progn
  57.       ) ;_ 结束if
  58.       (setq j (1+ j))
  59.       (if (= x 1)
  60.         (exit)
  61.       ) ;_ 结束if,如果找到则跳出循环
  62.     ) ;_ 结束repeat
  63.         ) ;_ 结束lambda
  64.      ) ;_ 结束vl-catch-all-apply
  65.     ) ;_ 结束setq,遍历ss2,判断位置关系

  66. ;;;;;;;;;;;;;;;
  67. ;;如果在ss2中找到符合条件的图元,以下开始遍历ss3:
  68.     (if  (= x 1)
  69.       (progn
  70.   (setq catchit
  71.          (vl-catch-all-apply
  72.      '(lambda ()
  73.         (setq j 0
  74.         x 0
  75.         ) ;_ 结束setq
  76.         (repeat (sslength ss3)
  77.           (setq ss3ent (ssname ss3 j))
  78.           (setq dist3 (distance (cdr (assoc 10 (entget ss1ent)))
  79.               (cdr (assoc 10 (entget ss3ent)))
  80.           ) ;_ 结束distance
  81.           ) ;_ 结束setq
  82.           (if (equal dist3 d3 0.00001)
  83.       (progn
  84.         (ssadd ss3ent ssx)
  85.         (setq x 1)
  86.       ) ;_ 结束progn
  87.           ) ;_ 结束if
  88.           (setq j (1+ j))
  89.           (if (= x 1)
  90.       (exit)
  91.           ) ;_ 结束if
  92.         ) ;_ 结束repeat
  93.       ) ;_ 结束lambda
  94.          ) ;_ 结束vl-catch-all-apply
  95.   ) ;_ 结束setq
  96.       ) ;_ 结束progn
  97.     ) ;_ 结束if,遍历ss3完毕
  98. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  99.     (if  (= (sslength ssx) (sslength ss))
  100.       (progn
  101.   (command "shape"
  102.      "149"
  103.      (cdr (assoc 10 (entget ss1ent)))
  104.      "1"
  105.      "0"
  106.   ) ;_ 结束command,插入形
  107.   (ssadd (entlast) endss);把所有插入的形放入一个选择集,以便一起移动到正确位置
  108.   (setq j 0)
  109.   (repeat  (sslength ssx)
  110.     (ssadd (ssname ssx j) goodss)
  111.     (setq j (1+ j))
  112.   ) ;_ 结束repeat,保存已被替换的图元,以备后边统一删除
  113.   (ssdel ss1ent ss1)
  114.   (ssdel ss2ent ss2)
  115.   (ssdel ss3ent ss3);从选择集中去掉已经被选中的图元,提高遍历速度
  116.       ) ;_ 结束progn
  117.       (ssdel ss1ent ss1)
  118.     ) ;_ 结束if
  119.   ) ;_ 结束repeat
  120.   (command "erase" goodss "")
  121.   (command "move" endss "" p2 p1);尽量做到原地替换
  122.   (command "._undo" "_e")
  123. ) ;_ 结束defun

  124. ;;寻找选择集的中心
  125. (defun sscenter  (ssm / cent)
  126.   (command "_zoom" "_object" ssm "")
  127.   (setq cent (getvar "viewctr"))
  128.   (command "_zoom" "_p")
  129.   (setq cent cent)
  130. ) ;_ 结束defun
  131. ;;寻找图元的中心:
  132. (defun entcenter (ent / ll ur)
  133.           ;(setq ent (car(entsel)))
  134.   (vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
  135.   (midp  (car (mapcar 'vlax-safearray->list (list ll ur)))
  136.   (cadr (mapcar 'vlax-safearray->list (list ll ur)))
  137.   ) ;_ 结束midp
  138. ) ;_ 结束defun
  139. ;求中点
  140. (defun midp (P1 P2)
  141.   (mapcar '(lambda (X Y) (/ (+ X Y) 2.0)) P1 P2)
  142. ) ;_ 结束defun
  143. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  144. (defun enfindx (en / enl filter ss ss1)
  145.   (setq enl (entget en))
  146.   (setq  filter
  147.    (vl-remove-if-not
  148.      '(lambda (X)
  149.         (or
  150.     (= 0 (car x))
  151.     (= 8 (car x))
  152.     (= 62 (car x))
  153.     (= 6 (car x))
  154.     (= 370 (car x))
  155.     (= 48 (car x))
  156.     (= 100 (car x))
  157.     (= 67 (car x))
  158.     (= 60 (car x))
  159.         ) ;_ 结束or
  160.       ) ;_ 结束lambda
  161.      enl
  162.    ) ;_ 结束vl-remove-if-not
  163.   ) ;_ 结束setq
  164.   (setq ss (ssget "x" filter))
  165.   (setq  ss (GXL-SEL-SS->LIST ss)
  166.   ss (mapcar '(lambda (X) (list x (gxl-dxf x 10))) ss)
  167.   ) ;_ 结束setq
  168.   (mapcar '(lambda (x)
  169.        (vla-move (vlax-ename->vla-object (car x))
  170.            (vlax-3d-point (cadr x))
  171.            (vlax-3d-point '(0 0 0))
  172.        ) ;_ 结束vla-move
  173.      ) ;_ 结束lambda
  174.     ss
  175.   ) ;_ 结束mapcar
  176.   (setq  filter
  177.    (vl-remove-if
  178.      '(lambda (X)
  179.         (or
  180.     (= -1 (car x))
  181.     (= 5 (car x))
  182.     (= 330 (car x))
  183.     (= 360 (car x))
  184.     (= 370 (car x))
  185.     (= 347 (car x))
  186.     (= 390 (car x))
  187.         ) ;_ 结束or
  188.       ) ;_ 结束lambda
  189.      (entget en)
  190.    ) ;_ 结束vl-remove-if
  191.   ) ;_ 结束setq
  192.   (setq el (entget (caar ss)))
  193.   (setq ss1 (ssget "x" filter))
  194.   (mapcar '(lambda (x)
  195.        (vla-move (vlax-ename->vla-object (car x))
  196.            (vlax-3d-point '(0 0 0))
  197.            (vlax-3d-point (cadr x))
  198.        ) ;_ 结束vla-move
  199.      ) ;_ 结束lambda
  200.     ss
  201.   ) ;_ 结束mapcar
  202.           ;(princ)
  203.           ;(SSSETFIRST nil ss1)
  204.   (setq ss1 ss1)
  205. ) ;_ 结束defun
  206. (defun gxl-Sel-SS->List  (ss / i s)
  207.   (if ss
  208.     (repeat (setq i (sslength ss))
  209.       (setq s (cons (ssname ss (setq i (1- i))) s))
  210.     ) ;_ 结束repeat
  211.   ) ;_ 结束if
  212. ) ;_ 结束defun
  213. (defun gxl-dxf (ent i)
  214.   (cond  ((= (type ent) 'ename)
  215.    (cdr (assoc i (entget ent)))
  216.   )
  217.   ((= (type ent) 'list)
  218.    (cdr (assoc i ent))
  219.   )
  220.   ) ;_ if
  221. ) ;_ 结束defun







本帖子中包含更多资源

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

x
 楼主| 发表于 2011-11-9 22:25:15 | 显示全部楼层
本帖最后由 mandala 于 2011-11-9 22:29 编辑

由于用了循环中跳出,所以遍历的速度也还可以忍受,试了一幅有1000多个选择集的图纸,全部替换完毕大概花了7秒钟。

顺便问下,如何最快找出一个选择集的中心点?不要用下边这个办法,图纸太大的时候,zoom会来不及!

(defun sscenter (ssm / cent
(command "_zoom" "_object" ssm "")
(setq cent (getvar "viewctr"))
(command "_zoom" "_p")
(setq cent cent)
) ;_ 结束defun

点评

zoom o 好像在04版本以下不支持  发表于 2011-11-10 08:04
发表于 2012-12-24 11:34:06 | 显示全部楼层
      谁能不能把上面的选择完全一样的实体tg批选.lsp 程序中在选择选择完全一样的实体之前加一个指定选择的范围和全部图元范围两个选项啊,把改后程序贴出来,谢谢!
发表于 2012-12-24 15:55:02 | 显示全部楼层
本帖最后由 xiaxiang 于 2012-12-24 16:02 编辑
lish 发表于 2012-12-24 11:34
谁能不能把上面的选择完全一样的实体tg批选.lsp 程序中在选择选择完全一样的实体之前加一个指定选择的 ...


看到你的私人信息了。。。
(ssget "x")是全图选中
(ssget)提示用户选择
加个选项而已,自己动动手吧
edit:似乎加上全图选中后毫无意义

发表于 2014-11-11 17:16:33 | 显示全部楼层
很经典 值得收藏和学习
发表于 2014-11-11 19:55:05 | 显示全部楼层
这个要顶一个,这绝对用得上的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 01:30 , Processed in 0.271672 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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