设为首页收藏本站

晓东CAD家园-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 161|回复: 8

[图块] 框选复制块内的实体

[复制链接]

已领礼包: 243个

财富等级: 日进斗金

发表于 2022-6-14 10:09:19 | 显示全部楼层 |阅读模式
  • 插件名称 : 框选复制块内的实体
  • 作  者 : qxlonmsn
  • 运行环境 :不限 
  • 发布时间 :2022-06-14
  • 命令名称 :KCOPY
  • 插件介绍 :框选复制块内的实体
  • 备  注 : (点击图片可以放大)
    不支持嵌套块,如果出现bug请自行修改
    不足:不能保证复制后选择集的基点在左下点,希望哪位大神能改进下
(点击图片可以放大)

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

插件详细内容

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

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

x
本帖最后由 qxlonmsn 于 2022-6-14 10:28 编辑

;|
框选块内实体
不适用嵌套块
By qxlonmsn
原理:

1.获取块选择集(从右到左框选)
2.获取选择集的选择方式和框选点表
3.炸块
4.新建空选择集,把要复制的实体加入新选择集
5.(ssget "_p")实体加入要删除的选择集
6.原地插入块
7.复制粘贴
8.删除炸块的选择集实体
|;
;                  路径或块名  插入点    xy比例 旋转角度
;(command "_INSERT" "D:\\12.dwg" (getpoint) 1 1 30)


(defun c:kcopy ( / old_osmode ss_b ss ss_delete lst ents lst_fs pt1 pts km xbl ybl xzjd ss_x  ss_copy )
  (vl-load-com)
  (LM:startundo (LM:acdoc));标记撤销的开始位置
  (setq old_osmode (getvar "osmode"));备份捕捉模式
  (setvar "osmode" 0);关闭捕捉

;;ssget有4种选择方式
;;1点选 2框选(从左到右2点矩形[W]或者多边形[WP]【实体全部在内部才选中】) 3窗交(从右到左2点矩形[C]或者多边形[CP]【实体内部或相交就选中】) 4栏选(多段线[F]【实体相交就选中】)
;;而2框选只有全部框中实体才会被选中,就相当于全选块,因此不包含1点选和2框选的方式

  (princ "\n请使用窗交、栏选")
  (if (and
        (setq ss_b (ssget '((0 . "INSERT"))))
      );end and
      (progn
        (setq ss (ssadd));建立空选择集
        (setq ss_delete (ssadd));;建立要删除的空选择集
        (setq lst (ssnamex ss_b));获取选择集的选择方式信息列表
        (setq ents (vl-remove-if '(lambda (x) (< (car x) 0)) lst));包含选择方式的图元表
        (setq lst_fs (vl-remove-if '(lambda (x) (> (car x) 0)) lst));包含选择顺序的点表

              (foreach n ents
                (cond
                  ((= (car n) 3)
                   (setq pt1 (cdr (assoc 10 (entget (cadr n)))));获取块的插入点
                   (setq pt1 (trans pt1 0 1));转换为用户坐标系,避免坐标系改变导致偏差
                   (setq pts (mapcar 'cadr (cdr (car (vl-remove-if '(lambda (x) (/= (car x) (last n))) lst_fs)))));取得点表
                   (setq pts (mapcar '(lambda (x) (trans x 0 1)) pts));全部转换用户坐标系
                   (setq km (cdr (assoc 2 (entget (cadr n)))));获取块名
                   (setq xbl (cdr (assoc 41 (entget (cadr n)))));原x比例
                   (setq ybl (cdr (assoc 42 (entget (cadr n)))));原y比例
                   (setq xzjd (XD::R2D (cdr (assoc 50 (entget (cadr n))))));原旋转角度
                   (command "_EXPLODE" (cadr n));炸块
                   (setq ss_x (ssget "_p"));炸块的选择集
                   (setq ss_copy (ssget "_cp" pts));要复制的选择集
                   (foreach nn (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss_copy))) (setq ss (ssadd nn ss)));图元加入新选择集
                   (foreach nn (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss_x))) (setq ss_delete (ssadd nn ss_delete)));图元加入要删除的选择集
                   (command "_insert" km
                                  pt1;插入点
                                  xbl;原x比例
                                  ybl;原y比例
                                  xzjd;原旋转角度
                   );原地插入块
                  );end 1

                  ((= (car n) 4)
                   (setq pt1 (cdr (assoc 10 (entget (cadr n)))));获取块的插入点
                   (setq pt1 (trans pt1 0 1));转换为用户坐标系,避免坐标系改变导致偏差
                   (setq pts (mapcar 'cadr (vl-remove-if '(lambda (x) (not (listp x))) n)));取得点表
                   (setq pts (mapcar '(lambda (x) (trans x 0 1)) pts));全部转换用户坐标系
                   (setq km (cdr (assoc 2 (entget (cadr n)))));获取块名
                   (setq xbl (cdr (assoc 41 (entget (cadr n)))));原x比例
                   (setq ybl (cdr (assoc 42 (entget (cadr n)))));原y比例
                   (setq xzjd (XD::R2D (cdr (assoc 50 (entget (cadr n))))));原旋转角度
                   (command "_EXPLODE" (cadr n));炸块
                   (setq ss_x (ssget "_p"));炸块的选择集
                   (setq ss_copy (ssget "_f" pts));要复制的选择集
                   (foreach nn (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss_copy))) (setq ss (ssadd nn ss)));图元加入新选择集
                   (foreach nn (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss_x))) (setq ss_delete (ssadd nn ss_delete)));图元加入要删除的选择集
                   (command "_insert" km
                                  pt1;插入点
                                  xbl;原x比例
                                  ybl;原y比例
                                  xzjd;原旋转角度
                   );原地插入块
                  );end 2
                );end cond
              );end foreach
        (command "_copyclip" ss "");复制
        (command "_pasteclip" );粘贴实体
        (foreach nn (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss_delete))) (entdel nn));删除打散的实体
      );end progn
  );end if


  (LM:endundo (LM:acdoc));标记撤销的结束位置
  (setvar "osmode" old_osmode);还原备份捕捉模式

  (setq *error* err);错误函数
  (princ)
)


;自定义异常错误处理函数-----
(defun *error* (msg)
  (LM:endundo (LM:acdoc));;标记撤销的结束位置
  (setvar "osmode" old_osmode);还原备份捕捉模式
  (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
      (princ (strcat "\nError: " msg))
  ) ;_ 结束if
  (princ)
) ;_ 结束defun
;自定义异常错误处理函数-----

;;标记开始和结束---------------------------标记开始和结束
;;函数名称:        LM:endundo
;;调用格式:        (LM:endundo (LM:acdoc))
;;参数说明:        
;;(LM:acdoc) ---- (vla-get-activedocument (vlax-get-acad-object))
;;返回值:        t
;;函数简介:        建立UNDO结束标记
;; End Undo  -  Lee Mac
;; Closes an Undo Group.
;;标记结束用法  (LM:endundo (LM:acdoc))
(defun LM:endundo (doc)
  (vl-load-com)
  (while (= 8 (logand 8 (getvar 'undoctl)))
    (vla-endundomark doc)
  ) ;_ 结束while
) ;_ 结束defun

;;函数名称:        LM:startundo
;;调用格式:        (LM:startundo (LM:acdoc))
;;参数说明:        
;;(LM:acdoc) ---- (vla-get-activedocument (vlax-get-acad-object))
;;返回值:        t
;;函数简介:        建立UNDO开始标记
;; Start Undo  -  Lee Mac
;; Opens an Undo Group.
;;标记开始用法  (LM:startundo (LM:acdoc))
(defun LM:startundo (doc)
  (vl-load-com)
  (LM:endundo doc)
  (vla-startundomark doc)
) ;_ 结束defun

;; Active Document  -  Lee Mac
;; Returns the VLA Active Document Object
(defun LM:acdoc nil
  (eval (list 'defun
                'LM:acdoc
                'nil
                (vla-get-activedocument (vlax-get-acad-object))
          ) ;_ 结束list
  ) ;_ 结束eval
  (vl-load-com)
  (LM:acdoc)
) ;_ 结束defun
;;标记开始和结束---------------------------标记开始和结束

;弧度转角度
(defun XD::R2D (ang)
  (* 180 (/ ang Pi))
)

(princ "\n启动命令:kcopy")


评分

参与人数 1D豆 +5 收起 理由
HLCAD + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 296个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 756个

财富等级: 财运亨通

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 41个

财富等级: 招财进宝

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-8-8 21:06 , Processed in 0.136630 second(s), 36 queries , Gzip On, WinCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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