明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5941|回复: 38

[讨论] 批量选择最外矩形框

[复制链接]
发表于 2023-9-22 09:03:42 | 显示全部楼层 |阅读模式
5明经币
本帖最后由 qazxswk 于 2023-9-22 09:05 编辑

看到这么一个帖子,http://bbs.mjtd.com/thread-113219-2-1.html

删除方框内的对象,但这个方框是在独立的一个图层里,比较容易选择。
我今天突然有个想法,如果这个外方框,跟方框内的对象,在同一个图层,而且框里也有矩形框,那该如何选择中这些最外围的方框呢?如下面图片,如何框选选中箭头所指的外框?

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

最佳答案

查看完整内容

一个原理 把删图行改成删选择集
发表于 2023-9-22 09:03:43 | 显示全部楼层
qazxswk 发表于 2023-9-22 22:37
你们把我的要求看反了

一个原理 把删图行改成删选择集
  1. (defun c:tt(/ ptlst ss ss2)
  2.         (setq ss(ssget '((0 . "LWPOLYLINE")(90 . 4))))
  3.         (foreach ty (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex ss)))
  4.                 (if (entget ty)
  5.                         (progn
  6.                                 (setq ptlst nil)
  7.                                 (foreach x (entget ty) (if (= (car x) 10) (setq ptlst (cons (cdr x) ptlst))))
  8.                                 (setq ss2 (ssget "CP" ptlst))
  9.                                 (if(ssmemb ty ss2)(ssdel ty ss2))
  10.                                 (foreach ty (ss-enlst ss2)
  11.                                         (if(ssmemb ty ss)(ssdel ty ss))
  12.                                 )
  13.                         )
  14.                 )
  15.         )
  16.         (sssetfirst nil ss)
  17.         (princ)
  18. )
回复

使用道具 举报

发表于 2023-9-22 10:08:23 | 显示全部楼层
先分堆,可以在论坛上搜索分堆,有现成函数。再判断删除

评分

参与人数 1明经币 +1 收起 理由
qazxswk + 1 你的建议,帮我解决了另一个问题

查看全部评分

回复

使用道具 举报

发表于 2023-9-22 12:18:43 | 显示全部楼层
  1. (defun c:tt (/ pp s x xx)
  2. ;;本例是特例,矩形不相交
  3.   (if (and (setq s (ssget '((0 . "*PO*"))))
  4.         (setq s (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
  5.         (setq s (mapcar '(lambda(x)(list x (vla-get-Area (vlax-ename->vla-object x))))s))
  6.         (setq s (vl-sort s '(lambda(a b)(>= (cadr a) (cadr b)))))
  7.         (setq s (mapcar 'car s))
  8.       )
  9.     (foreach x s
  10.       (if (and (setq pp (mapcar 'cdr (vl-remove-if-not '(lambda(a)(= 10 (car a)))(entget x))))
  11.             (< 2 (length pp))
  12.             (setq xx (ssget "CP" pp))
  13.             (setq xx (ssdel x xx))
  14.           )
  15.         (command "ERASE" xx "")
  16.       )
  17.     )
  18.   )
  19. )


回复

使用道具 举报

发表于 2023-9-22 12:21:52 | 显示全部楼层
简单的方法就是挨个循环 每个矩形创建选择集后排除自身 删除
回复

使用道具 举报

发表于 2023-9-22 12:31:53 | 显示全部楼层
(defun c:tt (/ pp s x xx)
;;本例是特例,矩形不相交
  (if (and (setq s (ssget '((0 . "*PO*"))))
        (setq s (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
        (setq s (mapcar '(lambda(x)(list x (vla-get-Area (vlax-ename->vla-object x))))s))
        (setq s (vl-sort s '(lambda(a b)(>= (cadr a) (cadr b)))))
        (setq s (mapcar 'car s))
      )
    (foreach x s
      (if (and (setq pp (mapcar 'cdr (vl-remove-if-not '(lambda(a)(= 10 (car a)))(entget x))))
            (< 2 (length pp))
            (setq xx (ssget "CP" pp))
            (setq xx (ssdel x xx))
          )
        (command "ERASE" xx "")
      )
    )
  )
)
(defun c:tt (/ e pp s x x1 xx)
;;本例是特例,矩形不相交
        (if (and (setq s (ssget '((0 . "*PO*"))))
                          (setq s (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
                                (setq s (mapcar '(lambda(x)(list x (vla-get-Area (vlax-ename->vla-object x))))s))
                                (setq s (vl-sort s '(lambda(a b)(>= (cadr a) (cadr b)))))
                                (setq s (mapcar 'car s))
                        )
                (while (setq e (car s))
                        (if (setq pp (mapcar 'cdr (vl-remove-if-not '(lambda(a)(= 10 (car a)))(entget e))))
                                (cond
                                        (if (and (< 2 (length pp))
                                                                (setq xx (ssget "CP" pp))
                                                                (setq x1 (ssdel e xx))
                                                        )
                                                (progn
                                                        (command "ERASE" x1 "")
                                                        (setq xx (vl-remove-if 'listp (mapcar 'cadr (ssnamex xx))))
                                                        (setq s (vl-remove-if '(lambda(x)(member x xx))s))
                                                )
                                                (setq s (vl-remove e s))
                                        )
                                )
                        )
                )
        )
)
回复

使用道具 举报

发表于 2023-9-22 12:35:12 | 显示全部楼层
飞雪神光 发表于 2023-9-22 12:21
简单的方法就是挨个循环 每个矩形创建选择集后排除自身 删除

老大,你的注册时间=2016-11-20  最后登录时间=1970-1-1穿越回去了
回复

使用道具 举报

发表于 2023-9-22 12:37:26 | 显示全部楼层
我也发个
  1. (defun c:tt(/ ptlst ss ss2)
  2.         (setq ss(ssget '((0 . "LWPOLYLINE")(90 . 4))))
  3.         (foreach ty (vl-remove-if-not '(lambda (x) (= (type x) 'ENAME)) (mapcar 'cadr (ssnamex ss)))
  4.                 (if (entget ty)
  5.                         (progn
  6.                                 (setq ptlst nil)
  7.                                 (foreach x (entget ty) (if (= (car x) 10) (setq ptlst (cons (cdr x) ptlst))))
  8.                                 (setq ss2 (ssget "CP" ptlst))
  9.                                 (if(ssmemb ty ss2)(ssdel ty ss2))
  10.                                 (vl-cmdf "erase" ss2 "")       
  11.                         )
  12.                 )
  13.         )
  14.         (princ)
  15. )
回复

使用道具 举报

发表于 2023-9-22 12:40:58 | 显示全部楼层

需要从大到小先排序下,否则....
回复

使用道具 举报

发表于 2023-9-22 12:41:36 | 显示全部楼层
bonny 发表于 2023-9-22 12:35
老大,你的注册时间=2016-11-20  最后登录时间=1970-1-1穿越回去了

也许是浏览器的问题 不少人都这样吧
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 15:46 , Processed in 0.196488 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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