fools
发表于 2018-12-19 16:17:33
本帖最后由 fools 于 2018-12-19 16:20 编辑
提供两种方法,第一种是通过矩形嵌套几何关系判断
;;几何关系判断
(defun c:tt1 (/ box e i ss lst bound rects)
(defun ebox (e / pa pb)
(and (= 'ename (type e)) (setq e (vlax-ename->vla-object e)))
(vlax-invoke-method e 'GetBoundingBox 'pa 'pb)
(setq pa (trans (vlax-safearray->list pa) 0 1)
pb (trans (vlax-safearray->list pb) 0 1)
)
(list pa pb)
)
(defun area (pts) (apply '* (cdr (reverse (apply 'mapcar (cons '- pts)))))) ;_求面积
(defun pt4 (pt2)
(list (car pt2) (list (caadr pt2) (cadar pt2)) (cadr pt2) (list (caar pt2) (cadadr pt2)))
) ;_对角点生成四角点
(defun PtInPoly (pt pts)
(equal pi
(abs
(apply '+ (mapcar '(lambda (x y) (rem (- (angle pt x) (angle pt y)) pi)) (cons (last pts) pts) pts))
)
1e-6
)
) ;_点是否在凸多边形内(角度法)
;;
(setq ss (ssget '((0 . "INSERT"))))
(repeat (setq i (sslength ss))
(setq e (ssname ss (setq i (1- i))))
(setq lst (cons (ebox e) lst)) ;_提取边界对角点,不生产矩形
)
(setq lst (vl-sort lst '(lambda (x1 x2) (> (area x1) (area x2))))) ;_按面积大小排序
(while lst
(setq rects (cons (car lst) rects)) ;_矩形对角点集
(setq bound (pt4 (car lst))) ;_矩形边界
(setq lst (vl-remove-if '(lambda (x) (and (PtInPoly (car x) bound) (PtInPoly (cadr x) bound))) (cdr lst))) ;_移除大矩形边界内的小矩形
)
(mapcar '(lambda (x) (command-s "rectang" (car x) (cadr x))) rects) ;_批量生成矩形
(princ)
)
第二种方法是将所有矩形转换成面域后,再进行并集运算后,炸开重新生成矩形,源代码在附件中,收一点零花钱:lol
依然小小鸟
发表于 2018-12-19 16:37:16
fools 发表于 2018-12-19 16:17
提供两种方法,第一种是通过矩形嵌套几何关系判断
第二种方法是将所有矩形转换成面域后,再进行并集运算 ...
不知道可行不 你这是经过测试吧要是可行 我就破费下载了:lol:lol
fools
发表于 2018-12-19 18:08:21
依然小小鸟 发表于 2018-12-19 16:37
不知道可行不 你这是经过测试吧要是可行 我就破费下载了
有多种方法可以实现你的需求,提供两种方法只是为了丰富解决问题的思路。
你如果画图规范的话,画一个大框,再用BOUNDARY命令一次性就能生成所有外框PLINE
依然小小鸟
发表于 2018-12-20 08:50:26
fangmin723 发表于 2018-12-19 17:27
先点选要添加外框的块,然后在框选所有图元
亲测 此楼可以实现我想要的结果
依然小小鸟
发表于 2018-12-20 09:06:44
fools 发表于 2018-12-19 16:17
提供两种方法,第一种是通过矩形嵌套几何关系判断
第二种方法是将所有矩形转换成面域后,再进行并集运算 ...
此楼也可以解决问题 而且此楼的通用性更强一些 即使图框不是图块也可以 好想也给你一些明经币
lg328084985
发表于 2018-12-27 10:35:46
fools 发表于 2018-12-19 16:17
提供两种方法,第一种是通过矩形嵌套几何关系判断
第二种方法是将所有矩形转换成面域后,再进行并集运算 ...
谢谢老师的分享
softbird
发表于 2019-1-16 13:49:18
fangmin723 发表于 2018-12-18 09:18
先点选要添加外框的块,然后在框选所有图元
点选的块名字有好多个,就需要操作好几次,能否在程序中指定处理某几个块名,分别对每个块操作一次,完成所有的块加外框?
fangmin723
发表于 2019-1-16 14:01:04
softbird 发表于 2019-1-16 13:49
点选的块名字有好多个,就需要操作好几次,能否在程序中指定处理某几个块名,分别对每个块操作一次,完成 ...
可以啊,自己可以在我那个基础上进行修改!
softbird
发表于 2019-1-16 18:13:10
fangmin723 发表于 2019-1-16 14:01
可以啊,自己可以在我那个基础上进行修改!
不会修改,能否麻烦你帮忙修改成A1、A2两个块名,然后我就会依样画葫芦了,谢谢
mokson
发表于 2019-9-19 15:45:25
这个功能,平时都用得到,收藏了,谢谢楼主