明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 17200|回复: 41

[风之影][讨论]块中图元原位复制

    [复制链接]
发表于 2012-1-1 09:46:13 | 显示全部楼层 |阅读模式
因开发需要,现希望广大高手提供思路。要求代码短些,而且操作简单,鼠标单选一下就复制出来,这是风之影推崇的人机工程,花里胡哨的功能就不需要了。
ET里有个块中图元复制ncopy,但是操作复杂。aidraft也有一个程序,比ET中的快些,但操作不能满足要求。qjchen也用.net开发了一个,可惜不能在低版本下使用。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-1-6 08:51:15 | 显示全部楼层
本帖最后由 highflybir 于 2012-1-25 20:27 编辑
byghbcx 发表于 2012-1-6 08:16
高飞鸟写的程序有点像HIGHFILYBIRD的风格,该程序对外部参照、嵌套非等比例块、属性文字等内容暂不支持原位 ...


其实对嵌套非等比例块还是支持的,只不过对非正交变换不支持。
回复 支持 1 反对 0

使用道具 举报

发表于 2018-7-31 18:57:49 来自手机 | 显示全部楼层
lee mac有个cxb命令跟高飞鸟的差不多,不是说谁抄谁。只是说谁先分享出来,高手还是要互相学习啊。框选要用arx,像添加对象到块,原位复制块内对象,都是同样的原理
发表于 2018-7-31 17:00:33 | 显示全部楼层
非常好的程序。我提个问题:有没有方法可以框选多个块内图元复制出来呢?
发表于 2012-1-1 10:15:26 | 显示全部楼层
风大侠也有求助的?
提供一个笨一点的思路:点选后把块信息保存,炸开,原位复制一个点选处的图元,再把炸开的块删除,原位插入原块。复制出来的图元就可以利用了。估计能行,只是对属性块和多重快可能有点麻烦
 楼主| 发表于 2012-1-1 10:22:34 | 显示全部楼层
langjs 发表于 2012-1-1 10:15
风大侠也有求助的?
提供一个笨一点的思路:点选后把块信息保存,炸开,原位复制一个点选处的图元,再把炸开 ...

有些块炸不开。操作也复杂,不是我要的
发表于 2012-1-1 19:47:34 | 显示全部楼层
本帖最后由 xianaihua 于 2012-1-1 19:48 编辑

这是别人的一个程序


  1. ;; LE
  2. ;; 块自动复制:程序复制所选的图块
  3. (setq blkautocopy_on t)

  4. ;; local error
  5. (defun blkautocopy-error  (g)
  6.   (if (not (member g '("console break" "Function cancelled")))
  7.     (princ (strcat "\nError: " g)))
  8.   (if (and
  9.   ;; is the ability on?
  10.   blkautocopy_on
  11.   ;; the new block exist?
  12.   new_obj
  13.   ;; has not been erased?
  14.   (not (vlax-erased-p new_obj))
  15.   ;; can we do something to it?
  16.   (vlax-write-enabled-p new_obj))
  17.     ;; erase it
  18.     (vla-delete new_obj))
  19.   ;; turn it nil
  20.   (setq new_obj nil)
  21.   ;; un-highlight our selection
  22.   (sssetfirst nil)
  23.   (setq *error* olderr)
  24.   (princ))

  25. ;; 图块拖拽移动
  26. (defun blk-drag-move (msg obj / take code5 p3)
  27.   (prompt (strcat "\n"
  28.       (cond  (msg)
  29.       ("Move")
  30.       )
  31.       "\n"
  32.     )
  33.   )
  34.   (while (and (setq take (grread 't 15)) (/= 3 (car take)))
  35.     (setq code5  (car take)
  36.     p3  (cadr take)
  37.     )
  38.     (if  (and p3 (= 5 code5))
  39.       (vla-move
  40.   obj
  41.   (vla-get-insertionpoint obj)
  42.   (vlax-3d-point p3)
  43.       )
  44.     )
  45.   )
  46. )


  47. ;; 复制一个块并移动到新的位置
  48. (defun blkautocopy (reactor params / olderr ss obj new_obj)
  49.   (setq  olderr  *error*
  50.   *error*  blkautocopy-error
  51.   )
  52.   (if (and
  53.   ;; ability is on?
  54.   blkautocopy_on
  55.   ;; no command is in use?
  56.   (= (getvar "cmdnames") "")
  57.   ;; the pickfirst value in on?
  58.   (eq 1 (logand 1 (getvar "pickfirst")))
  59.   ;; are we selecting a block?
  60.   (setq ss (ssget "_i" '((0 . "INSERT"))))
  61.   ;; did we got just one?
  62.   (eq 1 (sslength ss))
  63.   ;; get the ename and convert it into a vla-object
  64.   (setq obj (vlax-ename->vla-object (ssname ss 0)))
  65.       )
  66.     (progn
  67.       (prompt "\n正在复制一个块... \n")
  68.       ;; make a copy of the block
  69.       (setq new_obj (vla-copy obj))
  70.       ;; move the new block to another place
  71.       (blk-drag-move "指定第二个位置点: " new_obj)
  72.       ;; un-highlight our selection
  73.       (sssetfirst nil)
  74.     )
  75.   )
  76.   (setq *error* olderr)
  77. )

  78. ;; 主反应器
  79. (if (not blkautocopy_reactor)
  80.   (setq  blkautocopy_reactor
  81.    (vlr-miscellaneous-reactor
  82.      "blkautocopy block = miscellaneous reactor"
  83.      '((:vlr-pickfirstmodified . blkautocopy))
  84.    )
  85.   )
  86. )
  87. (princ)


  
发表于 2012-1-1 22:31:56 | 显示全部楼层
围观一下。。。。。。
发表于 2012-1-2 23:13:35 | 显示全部楼层
本帖最后由 高飞鸟 于 2012-1-2 23:14 编辑


下面的代码不知道可以吗:


  1. (if (null *doc)
  2.   (setq *doc (vla-get-activedocument (vlax-get-acad-object)))
  3. )

  4. (defun c:test (/ BLK ENT LX LY LZ MAT OBJ REF RET SCLMAT SX SY SZ TRSMAT VV VX VY VZ new *space)
  5.   (setq ret (nentselp))
  6.   (if (null ret)
  7.     (exit)
  8.   )
  9.   (setq mat (caddr ret))                                        ;这个是变换矩阵
  10.   (setq vv  (reverse (cdr (reverse mat))))                        ;去掉第四行(0 0 0 1)
  11.   
  12.   (setq vX  (mapcar 'car vv))                                        ;X 向量
  13.   (setq vY  (mapcar 'cadr vv))                                        ;Y 向量
  14.   (setq vZ  (mapcar 'caddr vv))                                        ;Z 向量

  15.   (setq lX  (distance vX '(0 0 0)))                                ;X 比例因子
  16.   (setq lY  (distance vY '(0 0 0)))                                ;Y 比例因子
  17.   (setq lZ  (distance vZ '(0 0 0)))                                 ;Z 比例因子

  18.   (setq ent (car ret))
  19.   (setq obj (vlax-ename->vla-object ent))
  20.   
  21.   (if (and (equal lX lY 1e-8) (equal lY lZ 1e-8))                     ;如果是均匀缩放
  22.     (progn
  23.       (if (zerop (vla-get-ActiveSpace *doc))
  24.         (setq *space (vla-get-PaperSpace *doc))
  25.         (setq *space (vla-get-modelspace *doc))
  26.       )
  27.       (vlax-invoke *doc 'copyobjects (list obj) *space)                ;则仅仅是copyObjects方式添加到空间中
  28.       (setq new (vlax-ename->vla-object (entlast)))
  29.       (vla-transformby new (vlax-tmatrix mat))                        ;然后再矩阵变换
  30.     )
  31.     (progn
  32.       (setq blk (make-anonymous-block obj))                        ;先做一个匿名图块
  33.       (setq ref (vlax-ename->vla-object (entlast)))                ;插入块参照
  34.       
  35.       (setq sX  (/ 1 lx))                                        ;非均匀缩放则要取得各个比例值
  36.       (setq sY  (/ 1 lY))
  37.       (setq sZ  (/ 1 lZ))
  38.       (setq sclMat (list (list sX 0 0 1)                        ;乘以一个比例缩放矩阵使得比例均匀
  39.                              (list 0 sY 0 1)
  40.                              (list 0 0 sZ 1)
  41.                              (list 0 0  0 1)
  42.                        )
  43.       )

  44.       (setq trsmat (MAT:mxm mat sclMat))                        ;得到一个均匀缩放的变换矩阵
  45.       (vla-transformby ref (vlax-tmatrix trsmat))                ;变换参照

  46.       ;;最后需要变换回去
  47.       (vla-put-xscalefactor ref (* (vla-get-xscalefactor ref) lX))
  48.       (vla-put-yscalefactor ref (* (vla-get-yscalefactor ref) lY))
  49.       (vla-put-zscalefactor ref (* (vla-get-zscalefactor ref) lZ))
  50.       (vlax-put ref 'insertionpoint (mapcar 'last vv))
  51.       
  52.       ;;(vla-Explode ref)
  53.       (command "explode" "L")                                        ;炸开匿名块参照
  54.       ;;(vla-delete ref)
  55.       (vla-delete blk)                                                ;删除匿名块定义
  56.     )
  57.   )
  58.   (princ)
  59. )

  60. ;;;-----------------------------------------------------------;;
  61. ;;; 匿名块程序                                                ;;
  62. ;;;-----------------------------------------------------------;;
  63. (defun make-anonymous-block(obj / BLKOBJ origin bkName *space)
  64.   (setq origin  (vlax-3d-point '(0.0 0.0 0.0)))
  65.   (setq blkobj (vla-add (vla-get-blocks *doc) origin "*U"))
  66.   (setq bkName (vla-get-name blkobj))
  67.   (vlax-invoke *doc 'copyobjects (list obj) blkobj)
  68.   (if (zerop (vla-get-ActiveSpace *doc))
  69.     (setq *space (vla-get-PaperSpace *doc))
  70.     (setq *space (vla-get-modelspace *doc))
  71.   )
  72.   (vla-insertblock *space origin  bkName 1 1 1 0)
  73.   (vla-put-Explodable blkobj :vlax-true)
  74.   blkobj
  75. )

  76. ;;;-----------------------------------------------------------;;
  77. ;;; 矩阵转置                                                  ;;
  78. ;;; MAT:trp Transpose a matrix -Doug Wilson-                  ;;
  79. ;;;-----------------------------------------------------------;;
  80. (defun MAT:trp (m)
  81.   (apply 'mapcar (cons 'list m))
  82. )
  83. ;;;-----------------------------------------------------------;;
  84. ;;; 向量的矩阵变换(向量乘矩阵)                                ;;
  85. ;;; Matrix x Vector - Vladimir Nesterovsky                    ;;
  86. ;;; Args: m - nxn matrix, v - vector in R^n                   ;;
  87. ;;;-----------------------------------------------------------;;
  88. (defun MAT:mxv (m v)
  89.   (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m)
  90. )
  91. ;;;-----------------------------------------------------------;;
  92. ;;; 矩阵相乘                                                  ;;
  93. ;;; MAT:mxm Multiply two matrices -Vladimir Nesterovsky-      ;;
  94. ;;;-----------------------------------------------------------;;
  95. (defun MAT:mxm (m q)
  96.   (mapcar (function (lambda (r) (MAT:mxv (MAT:trp q) r))) m)
  97. )

评分

参与人数 2明经币 +3 收起 理由
cabinsummer + 1 效果正是我需要的
Gu_xl + 2 好程序!

查看全部评分

发表于 2012-1-3 09:42:23 | 显示全部楼层
:) 那我也凑下热闹,帖子可以见此贴

http://bbs.mjtd.com/thread-91589-1-1.html

效果如下




 楼主| 发表于 2012-1-3 10:24:39 | 显示全部楼层
纵观各位高手的程序,只有高飞鸟是按我的要求点击后原位复制的。如果是多个操作步骤的话,我就直接用ET里的ncopy就可以实现。高手们程序虽好,但操作步骤并不比ncopy优化,可见还是没有跳出桌子公司画的圈子。高手们还得在人机工程上狠下功夫,也许这是和高飞鸟的最大差距之一吧。
发表于 2012-1-5 19:58:24 | 显示全部楼层
      向高手们学,但楼主也不错
发表于 2012-1-6 08:16:28 | 显示全部楼层
高飞鸟写的程序有点像HIGHFILYBIRD的风格,该程序对外部参照、嵌套非等比例块、属性文字等内容暂不支持原位复制,但对一般块已足够了。

点评

呵呵,高飞鸟和highflybird,还有highflybir,highflyingbird本来就是同一个人哦。  发表于 2012-1-6 08:47
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 10:42 , Processed in 0.205422 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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