找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 702|回复: 10

[每日一码] 块内图元复制到块外

[复制链接]
发表于 2020-5-19 22:10:35 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 dcl1214 于 2020-9-4 22:43 编辑

  1. (defun $kuai-nei-fu-zhi-dao-kuai-wai$
  2.        (ent lst / dxf ents ents-new pt-blk)
  3.                                         ;块内图元复制到块外
  4.   (if (and ent
  5.            (= (type ent) 'ename)
  6.            (= (cdr (assoc 0 (entget ent))) "INSERT")
  7.       )
  8.     (progn
  9.       (SETQ PT-BLK (vl-catch-all-apply
  10.                      'vlax-safearray->list
  11.                      (list (vlax-variant-value
  12.                              (vla-get-insertionpoint
  13.                                (vlax-ename->vla-object ent)
  14.                              )
  15.                            )
  16.                      )                        ;插入点
  17.                    )
  18.       )
  19.       (progn
  20.         (setq ents nil)
  21.         (setq Ent (tblobjname "BLOCK" (cdr (assoc 2 (entget ent)))))
  22.         (while (and ent (setq Ent (entnext Ent)))
  23.           (if (wcmatch (cdr (assoc 0 (setq dxf (entget Ent))))
  24.                        "[,LINE,*LINE,]"
  25.               )
  26.             (set 'ents (cons ent ents))
  27.           )
  28.         )
  29.         (setq ents (reverse ents))
  30.       )
  31.       (setq ents-new (MAPCAR
  32.                        (FUNCTION
  33.                          (LAMBDA (ENT / zt new)
  34.                            (if
  35.                              (not
  36.                                (vl-catch-all-error-p
  37.                                  (setq
  38.                                    zt
  39.                                     (vl-catch-all-apply
  40.                                       'vlax-invoke
  41.                                       (LIST
  42.                                         (vla-get-activedocument
  43.                                           (vlax-get-acad-object)
  44.                                         )
  45.                                         'copyobjects
  46.                                         (list (vl-catch-all-apply
  47.                                                 'vlax-ename->vla-object
  48.                                                 (list ent)
  49.                                               )
  50.                                         )
  51.                                         (vla-get-modelSpace
  52.                                           (vla-get-activedocument
  53.                                             (vlax-get-acad-object)
  54.                                           )
  55.                                         )
  56.                                       )
  57.                                     )
  58.                                  )
  59.                                )
  60.                              )
  61.                               (setq new (entlast))
  62.                               (vl-catch-all-error-message zt)
  63.                            )
  64.                            new
  65.                          )
  66.                        )
  67.                        ents
  68.                      )
  69.       )
  70.       (setq ents-new (vl-remove nil ents-new))
  71.       (and PT-BLK
  72.            ents-new
  73.            (MAPCAR (FUNCTION (LAMBDA (A)
  74.                                (VLA-MOVE (VLAX-ENAME->VLA-OBJECT A)
  75.                                          (VLAX-3D-POINT (LIST 0 0 0))
  76.                                          (VLAX-3D-POINT PT-BLK)
  77.                                )
  78.                              )
  79.                    )
  80.                    ents-new
  81.            )
  82.       )
  83.     )
  84.   )
  85.   ents-new
  86. )
  87. ($kuai-nei-fu-zhi-dao-kuai-wai$ (car (entsel)) nil)

  88. (defun ncopym (ent        /         blk          en           lst            lx
  89.                ly        lz         make-anonymous-block            mark
  90.                mat        mat:mxm         mat:mxv  mat:trp  mxm            mxv
  91.                new        news         obj          ownrobj  parent   ref
  92.                refgeom        sclmat         sx          sy           sz            trp
  93.                trsmat        vararray->list          vv           vx            vy
  94.                vz
  95.               )
  96.   ;; RefGeom (gile)
  97.   ;; Returns a list whose first item is a 3x3 transformation matrix and
  98.   ;; second item the object insertion point in its parent (xref, block or space)
  99.   (defun refgeom (ent / ang enx mat ocs)
  100.     (and ent
  101.          (setq enx (entget ent))
  102.          (setq ang (cdr (assoc 050 enx)))
  103.          (setq ocs (cdr (assoc 210 enx)))
  104.     )
  105.     (list
  106.       (setq mat
  107.              (mxm
  108.                (mapcar '(lambda (v) (trans v 0 ocs t))
  109.                        '((1.0 0.0 0.0)
  110.                          (0.0 1.0 0.0)
  111.                          (0.0 0.0 1.0)
  112.                         )
  113.                )
  114.                (mxm
  115.                  (list
  116.                    (list (cos ang) (- (sin ang)) 0.0)
  117.                    (list (sin ang) (cos ang) 0.0)
  118.                    '(0.0 0.0 1.0)
  119.                  )
  120.                  (list
  121.                    (list (cdr (assoc 41 enx)) 0.0 0.0)
  122.                    (list 0.0 (cdr (assoc 42 enx)) 0.0)
  123.                    (list 0.0 0.0 (cdr (assoc 43 enx)))
  124.                  )
  125.                )
  126.              )
  127.       )
  128.       (mapcar
  129.         '-
  130.         (trans (cdr (assoc 10 enx)) ocs 0)
  131.         (mxv mat
  132.              (cdr (assoc 10 (tblsearch "block" (cdr (assoc 2 enx)))))
  133.         )
  134.       )
  135.     )
  136.   )
  137.   (defun VarArray->List        (vaobj)
  138.     (vlax-SafeArray->List
  139.       (vlax-Variant-Value vaobj)
  140.     )
  141.   )
  142.   ;; Matrix Transpose  -  Doug Wilson
  143.   ;; Args: m - nxn matrix
  144.   (defun trp (m)
  145.     (apply 'mapcar (cons 'list m))
  146.   )
  147.   ;; Matrix x Matrix  -  Vladimir Nesterovsky
  148.   ;; Args: m,n - nxn matrices
  149.   (defun mxm (m n)
  150.     ((lambda (a) (mapcar '(lambda (r) (mxv a r)) m)) (trp n))
  151.   )
  152.   ;; Matrix x Vector  -  Vladimir Nesterovsky
  153.   ;; Args: m - nxn matrix, v - vector in R^n
  154.   (defun mxv (m v)
  155.     (mapcar '(lambda (r) (apply '+ (mapcar '* r v))) m)
  156.   )
  157. ;;;-----------------------------------------------------------;;
  158. ;;; 矩阵转置                                                  ;;
  159. ;;; MAT:trp Transpose a matrix -Doug Wilson-                  ;;
  160. ;;;-----------------------------------------------------------;;
  161.   (defun MAT:trp (m)
  162.     (apply 'mapcar (cons 'list m))
  163.   )
  164. ;;;-----------------------------------------------------------;;
  165. ;;; 向量的矩阵变换(向量乘矩阵)                                ;;
  166. ;;; Matrix x Vector - Vladimir Nesterovsky                    ;;
  167. ;;; Args: m - nxn matrix, v - vector in R^n                   ;;
  168. ;;;-----------------------------------------------------------;;
  169.   (defun MAT:mxv (m v)
  170.     (mapcar (function (lambda (r) (apply '+ (mapcar '* r v))))
  171.             m
  172.     )
  173.   )
  174. ;;;-----------------------------------------------------------;;
  175. ;;; 矩阵相乘                                                  ;;
  176. ;;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky-      ;;
  177. ;;;-----------------------------------------------------------;;
  178.   (defun MAT:mxm (m q)
  179.     (mapcar (function (lambda (r) (MAT:mxv (MAT:trp q) r))) m)
  180.   )
  181. ;;;-----------------------------------------------------------;;
  182. ;;; 匿名块程序                                                ;;
  183. ;;;-----------------------------------------------------------;;
  184.   (defun make-anonymous-block (obj / BLKOBJ origin bkName *space)
  185.     (if        obj
  186.       (progn
  187.         (setq origin (vlax-3d-point '(0.0 0.0 0.0)))
  188.         (setq blkobj
  189.                (vla-add        (vla-get-blocks
  190.                           (vla-get-activedocument (vlax-get-acad-object))
  191.                         )
  192.                         origin
  193.                         "*U"
  194.                )
  195.         )
  196.         (setq bkName (vla-get-name blkobj))
  197.         (vlax-invoke
  198.           (vla-get-activedocument (vlax-get-acad-object))
  199.           'copyobjects
  200.           (list obj)
  201.           blkobj
  202.         )
  203.         (if (zerop (vla-get-ActiveSpace
  204.                      (vla-get-activedocument (vlax-get-acad-object))
  205.                    )
  206.             )
  207.           (setq
  208.             *space (vla-get-PaperSpace
  209.                      (vla-get-activedocument (vlax-get-acad-object))
  210.                    )
  211.           )
  212.           (setq
  213.             *space (vla-get-modelspace
  214.                      (vla-get-activedocument (vlax-get-acad-object))
  215.                    )
  216.           )
  217.         )
  218.         (vla-insertblock *space origin bkName 1 1 1 0)
  219.       )
  220.     )
  221.     blkobj
  222.   )
  223.   (if (and ent (= (CDR (ASSOC 0 (ENTGET ENT))) "INSERT"))
  224.     (PROGN
  225.       (setq
  226.         mark (VLAX-VLA-OBJECT->ENAME
  227.                (VLA-ADDPOINT
  228.                  (vla-get-ModelSpace
  229.                    (vla-get-ActiveDocument
  230.                      (vlax-get-acad-object)
  231.                    )
  232.                  )
  233.                  (VLAX-3D-POINT (LIST 0 0 0))
  234.                )
  235.              )
  236.       )                                        ;获取最后一个图元作为标记位
  237.       (progn
  238.         (setvar 'errno 0)
  239.         (IF (= 'ename (type ent))
  240.           (PROGN
  241.             (setq obj (vlax-ename->vla-object ent))
  242.             (progn
  243.               (setq mat
  244.                      (vlax-tmatrix
  245.                        (apply
  246.                          (function
  247.                            (lambda (mat vec)
  248.                              (append (mapcar 'append mat (mapcar 'list vec))
  249.                                      '((0.0 0.0 0.0 1.0))
  250.                              )
  251.                            )
  252.                          )
  253.                          (refgeom ent)
  254.                        )
  255.                      )
  256.               )
  257.               (setq vv (reverse (cdr (reverse (varArray->List mat)))))
  258.                                         ;去掉第四行(0 0 0 1)
  259.               (setq vX (mapcar 'car vv)) ;X 向量
  260.               (setq vY (mapcar 'cadr vv)) ;Y 向量
  261.               (setq vZ (mapcar 'caddr vv)) ;Z 向量
  262.               (setq lX (distance vX '(0 0 0))) ;X 比例因子
  263.               (setq lY (distance vY '(0 0 0))) ;Y 比例因子
  264.               (setq lZ (distance vZ '(0 0 0))) ;Z 比例因子               
  265.               (vlax-for        obj (vla-item (vla-get-blocks
  266.                                         (vla-get-activedocument
  267.                                           (vlax-get-acad-object)
  268.                                         )
  269.                                       )
  270.                                       (vla-get-name obj)
  271.                             )
  272.                 (setq lst (cons obj lst))
  273.               )
  274.               (if lst
  275.                 (foreach obj lst
  276.                   (if (and (equal lX lY 1e-17) (equal lY lZ 1e-17))
  277.                                         ;如果是均匀缩放
  278.                     (progn
  279.                       (setq
  280.                         OwnrObj        (vla-get-Modelspace
  281.                                   (vla-get-activedocument
  282.                                     (vlax-get-acad-object)
  283.                                   )
  284.                                 )
  285.                       )
  286.                       (vl-catch-all-apply
  287.                         'vlax-invoke
  288.                         (list
  289.                           (vla-get-activedocument
  290.                             (vlax-get-acad-object)
  291.                           )
  292.                           'copyobjects
  293.                           (list obj)
  294.                           OwnrObj
  295.                         )
  296.                       )
  297.                       (setq new (vlax-ename->vla-object (entlast)))
  298.                       (vla-transformby new mat)
  299.                     )
  300.                     (progn
  301.                       (and (setq blk (make-anonymous-block obj))
  302.                                         ;先做一个匿名图块
  303.                            (setq ref (vlax-ename->vla-object (entlast)))
  304.                                         ;插入块参照
  305.                       )
  306.                       (setq sX (/ 1 lx))
  307.                                         ;非均匀缩放则要取得各个比例值
  308.                       (setq sY (/ 1 lY))
  309.                       (setq sZ (/ 1 lZ))
  310.                       (setq sclMat (list (list sX 0 0 1)
  311.                                         ;乘以一个比例缩放矩阵使得比例均匀
  312.                                          (list 0 sY 0 1)
  313.                                          (list 0 0 sZ 1)
  314.                                          (list 0 0 0 1)
  315.                                    )
  316.                       )
  317.                       (setq
  318.                         trsmat (MAT:mxm (varArray->List mat) sclMat)
  319.                       )                        ;得到一个均匀缩放的变换矩阵
  320.                       (vla-transformby ref (vlax-tmatrix trsmat))
  321.                                         ;变换参照
  322.                       ;;最后需要变换回去
  323.                       (vla-put-xscalefactor
  324.                         ref
  325.                         (* (vla-get-xscalefactor ref) lX)
  326.                       )
  327.                       (vla-put-yscalefactor
  328.                         ref
  329.                         (* (vla-get-yscalefactor ref) lY)
  330.                       )
  331.                       (vla-put-zscalefactor
  332.                         ref
  333.                         (* (vla-get-zscalefactor ref) lZ)
  334.                       )
  335.                       (vlax-put ref 'insertionpoint (mapcar 'last vv))
  336.                                         ;(vla-Explode ref)
  337.                       (vl-cmdf "explode" (vlax-vla-object->ename ref))
  338.                                         ;炸开匿名块参照
  339.                       (vla-delete blk)        ;删除匿名块定义                 
  340.                     )
  341.                   )
  342.                 )
  343.               )
  344.             )
  345.           )
  346.         )
  347.       )
  348.       (progn
  349.         (setq NEWS nil)
  350.         (setq en mark)
  351.         (while (setq en (entnext en))
  352.           (setq NEWS (cons en NEWS))
  353.         )
  354.         (SETQ NEWS (VL-REMOVE NIL NEWS))
  355.         (setq parent nil)
  356.         (setq NEWS
  357.                (mapcar
  358.                  (function (lambda (a)
  359.                              (cond
  360.                                ((and
  361.                                   (= (cdr (assoc 0 (entget a))) "SEQEND")
  362.                                   (cdr (assoc -2 (entget a)))
  363.                                 )
  364.                                 (set 'parent (cdr (assoc -2 (entget a))))
  365.                                 nil
  366.                                )
  367.                                ((and
  368.                                   parent
  369.                                   (= (cdr (assoc 5 (entget a)))
  370.                                      (cdr (assoc 5 (entget parent)))
  371.                                   )
  372.                                 )
  373.                                 (set 'parent nil)
  374.                                 a
  375.                                )
  376.                                ((AND parent)
  377.                                 nil
  378.                                )
  379.                                (t a)
  380.                              )
  381.                            )
  382.                  )
  383.                  NEWS
  384.                )
  385.         )
  386.         (ENTDEL mark)
  387.         (setq NEWS (reverse (vl-remove nil NEWS)))
  388.         (setq
  389.           NEWS (vl-remove-if-not
  390.                  (function (lambda (a) (entget a)))
  391.                  NEWS
  392.                )
  393.         )
  394.       )
  395.     )
  396.   )
  397.   NEWS
  398. )
  399. (setq dd (ncopym (car (entsel))))


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

已领礼包: 19个

财富等级: 恭喜发财

发表于 2020-5-19 23:43:10 | 显示全部楼层
能不能原位在INSERT上复制出来?

点评

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

使用道具 举报

已领礼包: 5295个

财富等级: 富甲天下

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

使用道具 举报

发表于 2020-5-20 08:53:38 | 显示全部楼层
这个怎样用呢?请问楼主

点评

这个只是复制一个图元,你需要循环找到你的块中块,找到后调用我这个代码就能复制到外面了  详情 回复 发表于 2020-5-25 16:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-25 16:14:06 | 显示全部楼层
tanjurun 发表于 2020-5-20 08:53
这个怎样用呢?请问楼主

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

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

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

使用道具 举报

 楼主| 发表于 2020-9-4 22:43:52 | 显示全部楼层
Lisphk 发表于 2020-5-19 23:43
能不能原位在INSERT上复制出来?

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

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

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

使用道具 举报

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-1-16 20:24:09 | 显示全部楼层
和Express扩展工具“NCOPY”命令有什么区别联系。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 12个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 10:06 , Processed in 0.253515 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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