找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2380|回复: 16

[原创]:简单的块内实体复制---Block OCS->WCS

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-9-16 07:27:35 | 显示全部楼层 |阅读模式

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

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

×

  1. (defun c:bcopy (/ e el)
  2.   (while (and (setq e (nentselp "\n选择块内实体: "))
  3.               (= (length e) 4)
  4.          )
  5.     (setq el (entget (car e)))
  6.     (entmake el)
  7.     (vla-transformby
  8.       (vlax-ename->vla-object (entlast))
  9.       (vlax-tmatrix (caddr e))
  10.     )
  11.   )
  12.   (princ)
  13. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-9-16 11:16:31 | 显示全部楼层
;;以前就發現的問題!
nentselp 對ployline & 屬性 會有問題
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2004-9-16 12:20:21 | 显示全部楼层
最初由 LUCAS 发布
[B];;以前就發現的問題!
nentselp 對ployline & 屬性 會有問題 [/B]

可能还需要转换,很久没有用矩阵了,快忘完了,又写个小的片断

  1. ;;矩阵应用之块添实体, 利用 nentselp 返回矩阵的逆矩阵往块内添加实体
  2. ;;演示中逆矩阵采用了 XDAPI 函数,其Lisp实现函数请搜索论坛以前帖子
  3. (defun c:test (/ bn ss bname blk ssl mat e typ obj doc)
  4.   (if (and
  5.         (setq bn (nentselp "\n拾取图块: "))
  6.         (= (length bn) 4)                ;块
  7.         (progn
  8.           (princ "\n选择添加实体...")
  9.           (setq        ss (ssget '((0 . "line,circle"))))
  10.         )
  11.       );end and 条件
  12.     (progn
  13.       (setq bname (cdr (assoc 2 (entget (last (last bn)))));获取块名
  14.             blk          (vla-item (vla-get-blocks
  15.                               (setq doc        (vla-get-activedocument
  16.                                           (vlax-get-acad-object)
  17.                                         )
  18.                               )
  19.                             )
  20.                             bname
  21.                   );获取块定义BlockDeference
  22.             ssl          (sslength ss)
  23.             mat          (xdrx_matrix_inverse (caddr bn));获取 WCS -> OCS 矩阵
  24.       );end setq
  25.       (while (> ssl 0)
  26.         (setq e          (vlax-ename->vla-object (ssname ss (setq ssl (1- ssl))))
  27.               typ (vla-get-objectname e)
  28.         )
  29.         (vla-transformby e (vlax-tmatrix mat));变换到块定义的UCS
  30.         (if (= typ "AcDbLine");块内添加实体
  31.           (vla-addline
  32.             blk
  33.             (vla-get-startpoint e)
  34.             (vla-get-endpoint e)
  35.           )
  36.           (vla-addcircle blk (vla-get-center e) (vla-get-radius e))
  37.         );end if
  38.         (vla-delete e);删除选择
  39.       );end while
  40.       (vla-regen doc acActiveviewport);更新Insert (BlockReference)
  41.     );end progn
  42.   );end if
  43.   (princ)
  44. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-16 20:10:38 | 显示全部楼层
如果是交互式的操作,我觉得双击进入参照块编辑也挺方便。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-9-16 21:29:50 | 显示全部楼层
  1. ;;; 凑凑热闹:)
  2. ;;; 将图块里的图元拷贝到Model Space
  3. ;;; 对polyline和nested block有效, attributes则生成texts
  4. ;;; dimension不要试,匿名块不详.
  5. (defun C:BC (/ objlst attlst InsertENameHold sel InsertEName EName attEName mirrtext_Hold doc mspace)
  6.   (setq mirrtext_Hold (getvar "MIRRTEXT"))
  7.   (setvar "MIRRTEXT" 1)
  8.   (setq doc (vla-get-activedocument (vlax-get-acad-object))
  9.         mspace (vla-get-modelspace doc)
  10.   )
  11.   (while (setq sel (nentselp "\n选择图块内的图元: "))
  12.     (if (= (length sel) 4)
  13.       (progn
  14.         (setq InsertEName (last (last sel)))
  15.         (if (> (length (last sel)) 1)
  16.           (setq EName (nth 1 (reverse (last sel))))
  17.           (if (= (dxf 0 (entget (car sel))) "VERTEX")
  18.             (setq EName (dxf 330 (entget (car sel))))
  19.             (setq EName (car sel))
  20.           )
  21.         )                               ; end if
  22.       )                                       ; progn
  23.       (if (/= (dxf 0 (entget (car sel))) "ATTRIB")
  24.         (alert "选择的不是图块内的图元.")
  25.         (progn
  26.           (princ "\n选择了属性...")
  27.           (setq attEName (car sel)
  28.                 InsertEname (dxf 330 (entget attEName))
  29.           )
  30.         )                               ; progn
  31.       )                                       ; end if
  32.     )                                       ; end if
  33.     (if (and
  34.           InsertENameHold
  35.           (not (eq InsertENameHold InsertEName))
  36.         )
  37.       (alert "不允许选择另一个块内的图元。")
  38.       (progn
  39.         (setq InsertENameHold InsertEName)
  40.         (if (and
  41.               EName
  42.               (not (member EName objlst))
  43.             )
  44.           (setq objlst (cons (vlax-ename->vla-object EName) objlst))
  45.         )                               ; end if
  46.         (if (and
  47.               attEName
  48.               (not (member attEName attlst))
  49.             )
  50.           (setq attlst (cons attEName attlst))
  51.         )                               ; end if
  52.       )                                       ; progn
  53.     )                                       ; end if
  54.   )                                       ; while
  55.   (if attlst
  56.     (foreach att attlst
  57.       (att->text att)
  58.     )
  59.   )
  60.   (setq Mat (InsertMat InsertENameHold))
  61.   (if objlst
  62.     (progn
  63.       (setq retObjs (vla-copyobjects doc (vlax-safearray-fill (vlax-make-safearray vlax-vbObject (cons 0 (1-
  64.                                                                                                              (length objlst)
  65.                                                                                                          )
  66.                                                                                                  )
  67.                                                               ) objlst
  68.                                          ) mspace
  69.                     )
  70.       )
  71.       (foreach obj (vlax-safearray->list (vlax-variant-value retobjs))
  72.         (vla-transformby obj (vlax-tmatrix Mat))
  73.       )
  74.     )
  75.   )
  76.   (setvar "MIRRTEXT" mirrtext_Hold)
  77.   (vlax-release-object doc)
  78.   (vlax-release-object mspace)
  79.   (princ)
  80. )
  81. ;;;
  82. ;;; THE FOLLOWING CODES ARE MODIFIED FROM JON FLEMING'S FAMOUS BIXform.lsp
  83. ;;; to get the 4X4 Transformation matrix from OCS of Block Reference to WCS
  84. ;;; Modified by AIDraft  16/9/2004
  85. (defun InsertMat (InsertEname / InsertEList ZAxis NCSXAxis InsertAngle tmp1 tmp2)
  86.   (setq ZAxis (cdr (assoc 210 (setq InsertEList (entget InsertEName))))
  87.         InsertAngle (cdr (assoc 50 InsertEList))
  88.         NCSXAxis (trans (list (cos InsertAngle) (- (sin InsertAngle)) 0.0) (cdr (assoc 210 InsertEList)) 0) ; _ end trans
  89.   )                                       ; _ end setq
  90.                                        ; Set up the return value
  91.                                        ; The insertion point of the insert
  92.   (setq tmp1 (trans (cdr (assoc 10 InsertEList)) ZAxis 0)) ; The scale factors
  93.   (setq tmp2 (list (cdr (assoc 41 InsertEList)) (cdr (assoc 42 InsertEList)) (cdr (assoc 43 InsertEList))) ; _ end list
  94.   )
  95.   (list (append
  96.           (mapcar
  97.             '*
  98.             NCSXAxis
  99.             tmp2
  100.           )
  101.           (list (nth 0 tmp1))
  102.         ) (append
  103.             (mapcar
  104.               '*
  105.               (VectorCrossProduct ZAxis NCSXAxis)
  106.               tmp2
  107.             )
  108.             (list (nth 1 tmp1))
  109.           ) (append
  110.               (mapcar
  111.                 '*
  112.                 ZAxis
  113.                 tmp2
  114.               )
  115.               (list (nth 2 tmp1))
  116.             ) '(0.0 0.0 0.0 1.0)
  117.   )                                       ; _ end list
  118. )
  119. ;;; _ end defun
  120. ;;; Vector cross product function
  121. ;;; Argument: Two lists, each of three real numbers defining
  122. ;;; a vector in 3-space
  123. ;;; Return value:  A list of three real numbers containing
  124. ;;; the first argument crossed with the second argument.
  125. (defun VectorCrossProduct (InputVector1 InputVector2)
  126.   (list (- (* (cadr InputVector1) (caddr InputVector2)) (* (cadr InputVector2) (caddr InputVector1))) ; _ end -
  127.         (- (* (caddr InputVector1) (car InputVector2)) (* (caddr InputVector2) (car InputVector1))) ; _ end -
  128.         (- (* (car InputVector1) (cadr InputVector2)) (* (car InputVector2) (cadr InputVector1))) ; _ end -
  129.   )                                       ; _ end list
  130. )
  131. ;;; _ end defun
  132. ;;;
  133. (defun att->text (attEN / attEL)
  134.   (setq attEL (entget attEN))
  135.   (entmake (list '(0 . "TEXT") '(100 . "AcDbEntity") (cons 8 (dxf 8 attEL)) '(100 . "AcDbText") (cons 10 (dxf 10 attEL))
  136.                  (cons 40 (dxf 40 attEL)) (cons 1 (dxf 1 attEL)) (cons 50 (dxf 50 attEL)) (cons 41 (dxf 41 attEL))
  137.                  (cons 51 (dxf 51 attEL)) (cons 7 (dxf 7 attEL)) (cons 71 (dxf 71 attEL)) (cons 72 (dxf 72 attEL))
  138.                  (cons 11 (dxf 11 attEL)) (cons 210 (dxf 210 attEL)) '(100 . "AcDbText") (cons 73 (dxf 73 attEL))
  139.            )                               ; list
  140.   )
  141. )
  142. ;;;
  143. (defun dxf (code elist)
  144.   (cdr (assoc code elist))
  145. )


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

使用道具 举报

发表于 2004-9-18 14:33:00 | 显示全部楼层
其实ACAD-bouns有一个很好的程序ncopy。可以在块、参照上复制物体,我经常用,很方便。(可以在R14上用)拷上来给大家参考参考
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2005-9-28 17:00:58 | 显示全部楼层
先谢谢了,但我试了以后出现  bc ; 错误: no function definition: VLAX-GET-ACAD-OBJECT

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

使用道具 举报

发表于 2009-2-10 09:09:12 | 显示全部楼层
不适用于不等比例缩放的块

  1. (defun c:bcopy (/ e el ss p1)
  2.    (setq ss (ssadd))
  3.    (while (and (setq e (nentselp "\n选择块内实体: "))
  4.         (= (length e) 4)
  5.    )
  6.      (setq el (entget (car e)))
  7.      (entmake el)
  8.       ;(vla-transformby ;该函数不能用于不等比例缩放的实体对象
  9.       ; (vlax-ename->vla-object (entlast))
  10.       ;(vlax-tmatrix (caddr e))
  11.       ;)
  12.      (setq ss (ssadd (entlast) ss))
  13.    )
  14.    (if (and SS (/= (sslength SS) 0))
  15.      (progn
  16.        (if (setq P1 (getpoint "\n指定基点 <原位置>: "))
  17.   (progn
  18.     (command "_.move" SS "" "_non" P1)
  19.     (princ "指定第二点: ")
  20.     (command "\")
  21.   )
  22.        )
  23.        (command "_.select" SS "")
  24.      )
  25.    )
  26.    (princ)
  27. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2009-2-11 09:51:16 | 显示全部楼层
最保险而且安全的方法还得是把块临时炸开,这样块的不等比、旋转、镜像统统不用去考虑了。再NENTSELP选中实体,复制一个。而后恢复图块。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 20:28 , Processed in 0.215712 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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