mandala 发表于 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版主有一个函数,功能:选择除了位置不一样,其他都完全一样的的实体
为单选,可以改为批选。
我改 ...

版主,您好!
相同的实体,如果旋转了,就选不上了……

664571221 发表于 2018-9-17 16:17:14

xiaxiang 发表于 2011-11-7 16:56
gu_xl版主有一个函数,功能:选择除了位置不一样,其他都完全一样的的实体
为单选,可以改为批选。
我改 ...

你好下载不了

894560869 发表于 2022-2-11 08:24:55



请教:框选得到一个选择集,是一个由4条LINE组成的方形!(或*polyline)
1.线长相等=然后我要,子程序~
2.线长不等=然后我要,子程序~

xiaxiang 发表于 2011-11-7 16:56:11

gu_xl版主有一个函数,功能:选择除了位置不一样,其他都完全一样的的实体
为单选,可以改为批选。
我改了一下传上来,如果你受得了速度的话,可以尝试一下。
转载自gu_xl版主博客,欢迎去看看http://gyh060707.blog.sohu.com/



mandala 发表于 2011-11-7 20:03:58

本帖最后由 mandala 于 2011-11-7 20:10 编辑

xiaxiang 发表于 2011-11-7 16:56 static/image/common/back.gif
gu_xl版主有一个函数,功能:选择除了位置不一样,其他都完全一样的的实体
为单选,可以改为批选。
我改了 ...

谢谢xiaxiang老兄。

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


xiaxiang 发表于 2011-11-8 08:24:40

mandala 发表于 2011-11-7 20:03 static/image/common/back.gif
谢谢xiaxiang老兄。

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

“不知道如何加上判断每个选择集中总图元数,及每个图元相互位置关系的条件语句?”
难吧?没有思路吧,因为可能的情况太多。。。

mandala 发表于 2011-11-9 22:04:26

本帖最后由 mandala 于 2011-11-9 23:11 编辑

xiaxiang 发表于 2011-11-8 08:24 static/image/common/back.gif
“不知道如何加上判断每个选择集中总图元数,及每个图元相互位置关系的条件语句?”
难吧?没有思路吧, ...

想了好久,感觉上还是可以办到的,我的思路就是直接用(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写得比较粗糙,抛砖引玉,请大家指教。




(defun c:aaa (/       ss      p1   p2    entx   ent1ent2   ent3
      ss1    ss2    ss3   d2    d3   nj      x
      ssx    ss1ent ss2ent ss3ent dist2   dist3goodss
       )
(setvar "osmode" 0)
(command "._undo" "_be")
(prompt "\n请选择你需要替换的选择集(本lsp只考虑包含三个图元的选择集):")
(setq ss (ssget))
(setq p1 (sscenter ss));求选择集的中心
(command "shape"
   "149"
   (cdr (assoc 10 (entget (ssname ss 0))))
   "1"
   "0"
) ;_ 结束command,插入一个形
(setq entx (entlast))
(setq p2 (entcenter entx));求形的中心
(entdel entx)
(setq ent1 (ssname ss 0))
(setq ent2 (ssname ss 1))
(setq ent3 (ssname ss 2))
(setq ss1 (enfindx ent1));ss1为图纸中所有与ent1相同的图元
(setq ss2 (enfindx ent2));ss2为图纸中所有与ent2相同的图元
(setq ss3 (enfindx ent3));ss3为图纸中所有与ent3相同的图元
(setqd2 (distance (cdr (assoc 10 (entget ent1)))
         (cdr (assoc 10 (entget ent2)))
   ) ;_ 结束distance
) ;_ 结束setq,如此来判断第一、第二两个图元间距离
(setqd3 (distance (cdr (assoc 10 (entget ent1)))
         (cdr (assoc 10 (entget ent3)))
   ) ;_ 结束distance
) ;_ 结束setq,如此来判断第一、第三两个图元间距离
(setqgoodss (ssadd)
endss(ssadd)
) ;_ 结束setq
(repeat (sslength ss1)
    (setq ssx (ssadd))
    (setq ss1ent (ssname ss1 0))
    (setq catchit
   (vl-catch-all-apply
       '(lambda ()
    (setq j0
          x0
    ) ;_ 结束setq
    (repeat(sslength ss2);开始遍历ss2,和ss1ent做比较,用相对距离来找出符合条件的图元。
      (setq ss2ent (ssname ss2 j))
      (setqdist2 (distance(cdr (assoc 10 (entget ss1ent)))
          (cdr (assoc 10 (entget ss2ent)))
            ) ;_ 结束distance
      ) ;_ 结束setq
      (if (equal dist2 d2 0.00001)
      (progn
          (ssadd ss1ent ssx)
          (ssadd ss2ent ssx)
          (setq x 1)
      ) ;_ 结束progn
      ) ;_ 结束if
      (setq j (1+ j))
      (if (= x 1)
      (exit)
      ) ;_ 结束if,如果找到则跳出循环
    ) ;_ 结束repeat
      ) ;_ 结束lambda
   ) ;_ 结束vl-catch-all-apply
    ) ;_ 结束setq,遍历ss2,判断位置关系

;;;;;;;;;;;;;;;
;;如果在ss2中找到符合条件的图元,以下开始遍历ss3:
    (if(= x 1)
      (progn
(setq catchit
         (vl-catch-all-apply
   '(lambda ()
      (setq j 0
      x 0
      ) ;_ 结束setq
      (repeat (sslength ss3)
          (setq ss3ent (ssname ss3 j))
          (setq dist3 (distance (cdr (assoc 10 (entget ss1ent)))
            (cdr (assoc 10 (entget ss3ent)))
          ) ;_ 结束distance
          ) ;_ 结束setq
          (if (equal dist3 d3 0.00001)
      (progn
      (ssadd ss3ent ssx)
      (setq x 1)
      ) ;_ 结束progn
          ) ;_ 结束if
          (setq j (1+ j))
          (if (= x 1)
      (exit)
          ) ;_ 结束if
      ) ;_ 结束repeat
      ) ;_ 结束lambda
         ) ;_ 结束vl-catch-all-apply
) ;_ 结束setq
      ) ;_ 结束progn
    ) ;_ 结束if,遍历ss3完毕
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (if(= (sslength ssx) (sslength ss))
      (progn
(command "shape"
   "149"
   (cdr (assoc 10 (entget ss1ent)))
   "1"
   "0"
) ;_ 结束command,插入形
(ssadd (entlast) endss);把所有插入的形放入一个选择集,以便一起移动到正确位置
(setq j 0)
(repeat(sslength ssx)
    (ssadd (ssname ssx j) goodss)
    (setq j (1+ j))
) ;_ 结束repeat,保存已被替换的图元,以备后边统一删除
(ssdel ss1ent ss1)
(ssdel ss2ent ss2)
(ssdel ss3ent ss3);从选择集中去掉已经被选中的图元,提高遍历速度
      ) ;_ 结束progn
      (ssdel ss1ent ss1)
    ) ;_ 结束if
) ;_ 结束repeat
(command "erase" goodss "")
(command "move" endss "" p2 p1);尽量做到原地替换
(command "._undo" "_e")
) ;_ 结束defun

;;寻找选择集的中心
(defun sscenter(ssm / cent)
(command "_zoom" "_object" ssm "")
(setq cent (getvar "viewctr"))
(command "_zoom" "_p")
(setq cent cent)
) ;_ 结束defun
;;寻找图元的中心:
(defun entcenter (ent / ll ur)
          ;(setq ent (car(entsel)))
(vla-getboundingbox (vlax-ename->vla-object ent) 'll 'ur)
(midp(car (mapcar 'vlax-safearray->list (list ll ur)))
(cadr (mapcar 'vlax-safearray->list (list ll ur)))
) ;_ 结束midp
) ;_ 结束defun
;求中点
(defun midp (P1 P2)
(mapcar '(lambda (X Y) (/ (+ X Y) 2.0)) P1 P2)
) ;_ 结束defun
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun enfindx (en / enl filter ss ss1)
(setq enl (entget en))
(setqfilter
   (vl-remove-if-not
   '(lambda (X)
      (or
    (= 0 (car x))
    (= 8 (car x))
    (= 62 (car x))
    (= 6 (car x))
    (= 370 (car x))
    (= 48 (car x))
    (= 100 (car x))
    (= 67 (car x))
    (= 60 (car x))
      ) ;_ 结束or
      ) ;_ 结束lambda
   enl
   ) ;_ 结束vl-remove-if-not
) ;_ 结束setq
(setq ss (ssget "x" filter))
(setqss (GXL-SEL-SS->LIST ss)
ss (mapcar '(lambda (X) (list x (gxl-dxf x 10))) ss)
) ;_ 结束setq
(mapcar '(lambda (x)
       (vla-move (vlax-ename->vla-object (car x))
         (vlax-3d-point (cadr x))
         (vlax-3d-point '(0 0 0))
       ) ;_ 结束vla-move
   ) ;_ 结束lambda
    ss
) ;_ 结束mapcar
(setqfilter
   (vl-remove-if
   '(lambda (X)
      (or
    (= -1 (car x))
    (= 5 (car x))
    (= 330 (car x))
    (= 360 (car x))
    (= 370 (car x))
    (= 347 (car x))
    (= 390 (car x))
      ) ;_ 结束or
      ) ;_ 结束lambda
   (entget en)
   ) ;_ 结束vl-remove-if
) ;_ 结束setq
(setq el (entget (caar ss)))
(setq ss1 (ssget "x" filter))
(mapcar '(lambda (x)
       (vla-move (vlax-ename->vla-object (car x))
         (vlax-3d-point '(0 0 0))
         (vlax-3d-point (cadr x))
       ) ;_ 结束vla-move
   ) ;_ 结束lambda
    ss
) ;_ 结束mapcar
          ;(princ)
          ;(SSSETFIRST nil ss1)
(setq ss1 ss1)
) ;_ 结束defun
(defun gxl-Sel-SS->List(ss / i s)
(if ss
    (repeat (setq i (sslength ss))
      (setq s (cons (ssname ss (setq i (1- i))) s))
    ) ;_ 结束repeat
) ;_ 结束if
) ;_ 结束defun
(defun gxl-dxf (ent i)
(cond((= (type ent) 'ename)
   (cdr (assoc i (entget ent)))
)
((= (type ent) 'list)
   (cdr (assoc i ent))
)
) ;_ if
) ;_ 结束defun







mandala 发表于 2011-11-9 22:25:15

本帖最后由 mandala 于 2011-11-9 22:29 编辑

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

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

(defun sscenter (ssm / cent
http://bbs.mjtd.com/source/plugin/mc_colorcode/images/jssc_none.gif (command "_zoom" "_object" ssm "")
http://bbs.mjtd.com/source/plugin/mc_colorcode/images/jssc_none.gif (setq cent (getvar "viewctr"))
http://bbs.mjtd.com/source/plugin/mc_colorcode/images/jssc_none.gif (command "_zoom" "_p")
http://bbs.mjtd.com/source/plugin/mc_colorcode/images/jssc_none.gif (setq cent cent)
http://bbs.mjtd.com/source/plugin/mc_colorcode/images/jssc_none.gif) ;_ 结束defun

lish 发表于 2012-12-24 11:34:06

      谁能不能把上面的选择完全一样的实体tg批选.lsp 程序中在选择选择完全一样的实体之前加一个指定选择的范围和全部图元范围两个选项啊,把改后程序贴出来,谢谢!

xiaxiang 发表于 2012-12-24 15:55:02

本帖最后由 xiaxiang 于 2012-12-24 16:02 编辑

lish 发表于 2012-12-24 11:34 http://bbs.mjtd.com/static/image/common/back.gif
谁能不能把上面的选择完全一样的实体tg批选.lsp 程序中在选择选择完全一样的实体之前加一个指定选择的 ...

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

l450760664 发表于 2014-11-11 17:16:33

很经典 值得收藏和学习

panliang9 发表于 2014-11-11 19:55:05

这个要顶一个,这绝对用得上的!
页: [1] 2 3
查看完整版本: 能否全选图纸中,和指定选择集一致的所有选择集?(有思路了)