设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 134|回复: 15

[工具] 填充图案批量合并

[复制链接]

已领礼包: 149个

财富等级: 日进斗金

发表于 5 天前 | 显示全部楼层 |阅读模式
  • 插件名称 : 填充图案批量合并
  • 作  者 : dyjwyqz5221
  • 运行环境 :XDRX API 
  • 发布时间 :2020-06-29
  • 命令名称 :hatch-union
  • 插件介绍 :对相交、包含的填充图案批量合并
  • 备  注 : (点击图片可以放大)
(点击图片可以放大)

晓东温馨提示 1、运行环境为 晓东工具箱XDRX API 的插件,请下载最新版本的 晓东工具箱XDRX API开发环境 一键安装
2、在ACAD中如何加载插件,请看 论坛插件使用方法
3、如果您有要求需要定制插件,请到 编程申请 论坛发帖求助

插件详细内容

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

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

x
本帖最后由 dyjwyqz5221 于 2020-6-29 17:40 编辑

批量选取填充图案,对其中相交或包含的填充图案进行合并。

[Actionscript3] 纯文本查看 复制代码
(defun c:hatch-union(/ ss)
        (defun _pross(ss / lst pts e1 lst1)
                (setq lst (xdrx-pickset->ents ss))
                (while (setq e1 (car lst))
                        (setq pts (xdrx-geom-searchoutline e1 t))
                        (setq lst1 (xdrx-pickset->ents (ssget "cp" pts '((0 . "hatch")))))
                        (setq lst (XD::List:subtract lst lst1))
                        (if (> (length lst1) 1)
                                (progn
                                        (mapcar
                                                '(lambda(x)
                                                        (xdrx-get-union e1 x)
                                                );;;lambda
                                                (vl-remove e1 lst1)
                                        );;;mapcar
                                        (xdrx-document-redraw);;;更新数据库
                                );;;progn
                        );;;if
                );;;while
        );;;defun
        (while (setq ss (xdrx-ssget "\n选择填充图案<退出>:" ":L" '((0 . "hatch"))))
                (_pross ss)
        );;;while
);;;defun

附函数:
;;;两个表的差(无容差):lst-lst1
(defun XD::List:subtract(lst lst1)
        (mapcar
                '(lambda(x)
                            (setq lst (vl-remove x lst))
                   )
                lst1
           )
           lst
);;;defun

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

已领礼包: 19个

财富等级: 恭喜发财

发表于 5 天前 | 显示全部楼层
楼主,检查下,会有合并不净的现象

搜狗截图20200629182848.jpg

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 5 天前 | 显示全部楼层
因为使用了SSGET 所以,建议加上判断是否在屏幕内的处理
(xd::doc:safezoom ss)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 5 天前 | 显示全部楼层
修改下代码,楼主试试,直接求表里面合并的,不用每个在SSGET了

  1. (defun c:xdtb_hatchunion ( / a b c e1 ents lst lst1 pts ss)
  2.   (defun _pross        (ss / lst pts e1 lst1)
  3.     (setq ents (xdrx-pickset->ents ss))
  4.     (while (cdr ents)
  5.       (setq a (car ents)
  6.             b (cdr ents)
  7.       )
  8.       (setq ents (cdr ents))
  9.       (while (car b)
  10.         (setq c (car b))
  11.         (if (xdrx-get-union a c)
  12.           (progn (setq ents (cons a ents)
  13.                        b    (vl-remove c b)
  14.                        ents (vl-remove c ents)
  15.                  )
  16.           )
  17.         )
  18.         (setq b (cdr b))
  19.       )
  20.     )
  21.   )
  22.   (while (setq ss (xdrx-ssget
  23.                     "\n选择要合并的填充图案<退出>:"
  24.                     ":L"
  25.                     '((0 . "hatch"))
  26.                   )
  27.          )
  28.     (_pross ss)
  29.   )
  30.   (princ)
  31. )


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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 5 天前 | 显示全部楼层
进而可以提取出来一个通用的批量合并的函数
  1. (defun xd::get:union (ents / a b c)
  2.   (if (= (type ents) 'PICKSET)
  3.     (setq ents (xdrx-pickset->ents ents))
  4.   )
  5.   (while (cdr ents)
  6.     (setq a (car ents)
  7.           b (cdr ents)
  8.     )
  9.     (setq ents (cdr ents))
  10.     (while (car b)
  11.       (setq c (car b))
  12.       (if (xdrx-get-union a c)
  13.         (progn (setq ents (cons a ents)
  14.                      b          (vl-remove c b)
  15.                      ents (vl-remove c ents)
  16.                )
  17.         )
  18.       )
  19.       (setq b (cdr b))
  20.     )
  21.   )
  22.   (if (= (type a) 'PICKSET)
  23.     (ssname a 0)
  24.   )
  25. )

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 5 天前 | 显示全部楼层
合并后的填充可能是由多个单独的外部环组成,可以加一句
(xdrx-getpropertyvalue a "detach")
变成独立的单个的填充

搜狗截图20200629192305.jpg

函数可以变为
加个mode参数,为T,返回整体一个实体表,NIL分解为单独外部边界的填充实体表
  1. (defun xd::get:union (ents mode / a b c)
  2.   (if (= (type ents) 'PICKSET)
  3.     (setq ents (xdrx-pickset->ents ents))
  4.   )
  5.   (while (cdr ents)
  6.     (setq a (car ents)
  7.           b (cdr ents)
  8.     )
  9.     (setq ents (cdr ents))
  10.     (while (car b)
  11.       (setq c (car b))
  12.       (if (xdrx-get-union a c)
  13.         (progn (setq ents (cons a ents)
  14.                      b          (vl-remove c b)
  15.                      ents (vl-remove c ents)
  16.                )
  17.         )
  18.       )
  19.       (setq b (cdr b))
  20.     )
  21.   )
  22.   (if mode
  23.     (xdrx-pickset->ents a)
  24.     (xdrx-getpropertyvalue a "detach")
  25.   )
  26. )




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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 5 天前 | 显示全部楼层
本帖最后由 newer 于 2020-6-29 20:14 编辑

下面更通用,适合*polyline, region,hatch,mpolygon
  1. (defun xd::get:union (ents mode / a b c ents1 x)
  2.   (if (= (type ents) 'PICKSET)
  3.     (setq ents (xdrx-pickset->ents ents))
  4.   )
  5.   (setq ents1 ents)
  6.   (while (cdr ents)
  7.     (setq a (car ents)
  8.           b (cdr ents)
  9.     )
  10.     (setq ents (cdr ents))
  11.     (while (car b)
  12.       (setq c (car b))
  13.       (if (xdrx-get-union a c)
  14.         (progn
  15.           (setq ents (cons a ents)
  16.                 b (vl-remove c b)
  17.                 ents (vl-remove c ents)
  18.           )
  19.         )
  20.       )
  21.       (setq b (cdr b))
  22.     )
  23.   )
  24.   (cond
  25.     ((xdrx-object-iskindof a "region,hatch,mpolygon")
  26.       (if mode
  27.         (list a)
  28.         (xdrx-getpropertyvalue a "detach")
  29.       )
  30.     )
  31.     ((xdrx-object-iskindof a "*polyline")
  32.       (vl-remove nil (mapcar
  33.                        '(lambda (x)
  34.                           (if (entget x)
  35.                             x
  36.                           )
  37.                         )
  38.                        ents1
  39.                      )
  40.       )
  41.     )
  42.   )
  43. )

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 5 天前 | 显示全部楼层
本帖最后由 newer 于 2020-6-29 23:03 编辑

整合下函数:xd::get:union
http://bbs.xdcad.net/thread-726197-1-1.html
把代码里面的HATCH过滤,变成曲线,REGION,MPOLYGON,就都通用

  1. (defun c:xdtb_hatchunion ( / a b c e1 ents lst lst1 pts ss)
  2.   (xdrx-begin)
  3.   (xdrx-initget "Y N")
  4.   (setq yeorno (xdrx-yesorno "\n是否拆离" 1))
  5.   (while (setq ss (xdrx-ssget
  6.                     "\r选择要合并的填充图案<退出>:"
  7.                     ":L"
  8.                     '((0 . "hatch"))
  9.                   )
  10.          )

  11.     (if (= yeorno 1)
  12.       (xd::get:union ss nil)
  13.       (xd::getunion ss t)
  14.     )
  15.     (xdrx-prompt "\n>>成功合并了" (sslength ss) "个填充实体.")
  16.   )
  17.   (xdrx-end)
  18.   (princ)
  19. )


点评

问题的关键在于,如何找到相交的hatch、包含的hantch,这样才能有效的分组。按分组进行xdrx-get-union  详情 回复 发表于 4 天前
xdrx-get-union这个函数的用法应该是改变了吧,我用的是最新的api。 要想将所有的hatch都union在一起,只需要都和第一个进行union就可以了。  详情 回复 发表于 4 天前
相同多数量的hatch情况下,我做的这个与你设计的这个命令,效率相差很大。你可以测试下。  详情 回复 发表于 4 天前
你这个函数可能有点问题,我弄了84个填充,拷贝了一次,边缘部分重叠在一起,在测试过程中,cad卡死不动了。  详情 回复 发表于 4 天前
弄复杂了吧,使用就可以。 (progn (setq ss (xdrx-ssget "\n选择填充图案:" ":L" '((0 . "hatch")))) (setq lst (xdrx-pickset->ents ss) a (car lst) lst (cdr lst) ) (mapcar '(lambda(x) (  详情 回复 发表于 4 天前
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 123个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 149个

财富等级: 日进斗金

 楼主| 发表于 4 天前 | 显示全部楼层
本帖最后由 dyjwyqz5221 于 2020-6-30 08:13 编辑
newer 发表于 2020-6-29 22:51
整合下函数:xd::get:union
http://bbs.xdcad.net/thread-726197-1-1.html
把代码里面的HATCH过滤,变成 ...

弄复杂了吧,要将hantch都union在一起,这样就可以实现的。
(progn
        (setq ss (xdrx-ssget "\n选择填充图案<退出>:" ":L" '((0 . "hatch"))))
        (setq lst (xdrx-pickset->ents ss)
                a (car lst)
                lst (cdr lst)
        )
        (mapcar
                '(lambda(x)
                        (xdrx-get-union a x)
                )
                lst
        )
)
都union在一起,时间挺长的,所以想通过分组来进行。而且不连在一起。

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

使用道具 举报

已领礼包: 149个

财富等级: 日进斗金

 楼主| 发表于 4 天前 | 显示全部楼层
newer 发表于 2020-6-29 22:51
整合下函数:xd::get:union
http://bbs.xdcad.net/thread-726197-1-1.html
把代码里面的HATCH过滤,变成 ...

你这个函数可能有点问题,我弄了84个填充,拷贝了一次,边缘部分重叠在一起,在测试过程中,cad卡死不动了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 149个

财富等级: 日进斗金

 楼主| 发表于 4 天前 | 显示全部楼层
newer 发表于 2020-6-29 22:51
整合下函数:xd::get:union
http://bbs.xdcad.net/thread-726197-1-1.html
把代码里面的HATCH过滤,变成 ...

相同多数量的hatch情况下,我做的这个与你设计的这个命令,效率相差很大。你可以测试下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 149个

财富等级: 日进斗金

 楼主| 发表于 4 天前 | 显示全部楼层
Lisphk 发表于 2020-6-29 18:30
楼主,检查下,会有合并不净的现象

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

使用道具 举报

已领礼包: 149个

财富等级: 日进斗金

 楼主| 发表于 4 天前 | 显示全部楼层
newer 发表于 2020-6-29 22:51
整合下函数:xd::get:union
http://bbs.xdcad.net/thread-726197-1-1.html
把代码里面的HATCH过滤,变成 ...

xdrx-get-union这个函数的用法应该是改变了吧,我用的是最新的api。

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

使用道具 举报

已领礼包: 149个

财富等级: 日进斗金

 楼主| 发表于 4 天前 | 显示全部楼层
newer 发表于 2020-6-29 22:51
整合下函数:xd::get:union
http://bbs.xdcad.net/thread-726197-1-1.html
把代码里面的HATCH过滤,变成 ...

问题的关键在于,如何找到相交的hatch、包含的hantch,这样才能有效的分组。按分组进行xdrx-get-union

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2020-7-4 19:26 , Processed in 0.229174 second(s), 96 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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