明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4187|回复: 8

请教如何自动给新复制来的属性块下的属性添加反应器?

[复制链接]
发表于 2011-11-12 23:28:43 | 显示全部楼层 |阅读模式
本帖最后由 snddd2000 于 2011-11-12 23:29 编辑

文档打开时已经给图纸中一种块名下的属性加了对象反应器,
如果在这图中又复制了一些或者从其他图里又拷来一些这种块
如何同时自动也给新来的属性块下的属性加上同样的反应器呢?
多谢!

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2011-11-13 11:15:13 | 显示全部楼层
自己顶一下,具体情况是
这个属性块(明细表)里有12个属性,其中三个分别为数量,单重,总重,
实现的功能是更改其中的数量或者单重,总重随之自动变更。
上边的功能打开文件的时候可以加载,使图中已有的块得到这个功能。
但是如果复制或者从其他图里粘贴来的新块就没有这个功能了,如何能让这些个后来的块也有这个功能?
成功与否就在这个地方了。
望高人指点一二。
 楼主| 发表于 2011-11-13 17:00:44 | 显示全部楼层
Private Sub AcadDocument_EndCommand(ByVal CommandName As String)
    MsgBox "A drawing has just finished a " & CommandName & " command."
End Sub
vba里endcommand里自带了commandname变量
请问下边lisp反应器里如何得到运行的是哪个命令?
(setq command-reactor0
       (vlr-command-reactor
         nil
         '((:vlr-commandEnded . commandcallback))
       )
)
发表于 2011-11-13 20:52:42 | 显示全部楼层
本帖最后由 chg 于 2011-11-13 20:55 编辑

在命令反应器的回调函数中有下列点对(event-name . callback_function),其中event-name是命令反应器事件中的符号之一,如:vlr-commandEnded,callback_function为符号,代表事件发生时要调用的函数。每个回调函数都接受两个参数:reactor_boject和list,list中就存放了命令名。以下为简单的例子
首先定义一个命令反应器
(VLR-CommandReactor nil '((:vlr-commandEnded . lizi:command-ended)))
这里的回调函数名为LIZI:COMMAND-ENDED
然后在定义这个回调函数时:
(defun lizi:command-ended (reactor  command-list)
(setq commandname (car command-list))
)
回调函数中的参数COMMAND-LIST为触发回调函数时,自动赋予的,它是单个命令名的表,你用CAR即可获得。   

评分

参与人数 1明经币 +1 金钱 +5 收起 理由
snddd2000 + 1 + 5 赞一个!就是我想要的

查看全部评分

发表于 2011-11-13 21:05:59 | 显示全部楼层
用COPY时,你可以用command反应器(commandended)和object反应器(:vlr-copied)结合,为新增加的对象添加新的反应器,这样就可以实现新复制出来的对象也具有反应器,但对从黏贴板复制来的,我没有试验过,也不懂如何下手,请高手解答了。
 楼主| 发表于 2011-11-14 09:26:17 | 显示全部楼层
谢谢chg指点,
我试试PASTECLIP和COPY命令能不能实现我要的功能再结合(entlast)判断是否复制的是此种块。
如果能行就发上源码供坛友参考指正。
 楼主| 发表于 2011-11-14 10:25:41 | 显示全部楼层
本帖最后由 snddd2000 于 2011-11-14 11:15 编辑

功能基本能实现了,还有个问题。
在属性栏和用ddedit都能实现,可是当用命令 attedit编辑块属性时出现下面的错误

命令: ATTEDIT
选择块参照: error: Automation 错误。未提供说明。error: Automation 错误。未提供说明。error: Automation
错误。未提供说明。error: Automation 错误。未提供说明。


请教原因和解决之道?
 楼主| 发表于 2011-11-14 22:04:38 | 显示全部楼层
本帖最后由 snddd2000 于 2011-11-15 11:09 编辑

还是不能用ATTEDIT来编辑
先把对象反应器的代码发上来看看吧。望能找到解决attedit问题的办法。
  1. (vl-load-com)
  2. (defun mxbzdszzl ( / attblock_object)
  3.   (setq ss0 (ssget "X" '((0 . "INSERT"))))
  4. ;;;筛选明细表图块
  5.   (setq        attblock_object
  6.          '()
  7.         n 0
  8.         ss1 (ssadd)
  9.   )
  10.   (repeat (sslength ss0)
  11.     (setq ent0 (ssname ss0 n))
  12.     (setq ent0-val (vlax-ename->vla-object ent0))
  13.     (setq BlkName (vla-get-effectivename ent0-val))
  14.     (if        (= "明细(DW)" BlkName)
  15.       (progn
  16.         (setq arr (vlax-invoke-method ent0-val 'GetAttributes))
  17.         (setq arrlist (vlax-safearray->list (vlax-variant-value arr)))
  18.         (setq attblock_object (cons (nth 9 arrlist) attblock_object))
  19.                                         ;单重对象
  20.         (setq attblock_object (cons (nth 5 arrlist) attblock_object))
  21.                                         ;数量对象
  22.       ) ;_ end progn
  23.     ) ;_ end if
  24.     (setq n (1+ n))
  25.   ) ;_ end repeat

  26. ;;;加对象反应器
  27. (if attblock_objectReactor (vlr-remove attblock_objectReactor))        ;释放之前的反应器
  28.   (setq        attblock_objectReactor
  29.          (vlr-object-reactor
  30.            attblock_object
  31.            nil
  32.            '((:vlr-objectClosed . total_mass))
  33.          )
  34.   )
  35. ) ;_ end defun mxbzdszzl

  36. (defun total_mass (notifier-object reactor-object parameter-list)
  37.   (setq ent0 (vlax-vla-object->ename notifier-object))
  38.   (setq entlist0 (entget ent0))
  39.   (setq Blk0 (cdr (assoc 330 entlist0)))
  40.   (setq Blk0-val (vlax-ename->vla-object Blk0))
  41.   (setq arr (vlax-invoke-method Blk0-val 'GetAttributes))
  42.   (setq arrlist (vlax-safearray->list (vlax-variant-value arr)))
  43.   (setq att-text5 (vla-get-TextString (nth 5 arrlist)))
  44.                                         ;数量数值-字符串

  45.   (setq att-text9 (vla-get-TextString (nth 9 arrlist)))
  46.                                         ;单重数值-字符串
  47.   (setq att-text10 (vla-get-TextString (nth 10 arrlist)))
  48.   (setq olddimzin (getvar "dimzin"))
  49.   (setvar "dimzin" 0)
  50.   (setq zzl (* (atof att-text9) (atof att-text5)))
  51.   (setq zzl-rtos (rtos zzl))
  52.   (setq zzl-5 (substr zzl-rtos 5 1))
  53.   (cond
  54.     ((< zzl 0.005) (setq zzl "0.00"))
  55.     ((< zzl 100.0)
  56.      (progn
  57.        (if (>= (atoi zzl-5) 5)
  58.          (setq zzl (strcat (substr zzl-rtos 1 3)
  59.                            (itoa (1+ (atoi (substr zzl-rtos 4 1))))
  60.                    )
  61.          )
  62.          (setq zzl (substr zzl-rtos 1 4))
  63.        )
  64.      )
  65.     )
  66.     (t (setq zzl (itoa (fix (+ 0.5 zzl)))))
  67.   )

  68.   (setvar "dimzin" olddimzin)
  69.   (if (or (= "" att-text9) (= "" att-text5))
  70.     (setq zzl att-text10)
  71.   )
  72.   (setq        att-text10
  73.          (vla-put-TextString
  74.            (nth 10 arrlist)
  75.            zzl
  76.          )
  77.   )        ;赋值总重数值-字符串
  78. ;;;  (alert "Ok!-Object")                       
  79. ) ;_ end defun total_mass

  80. (mxbzdszzl)
  81. ;;加载即运行
发表于 2020-9-20 21:18:13 | 显示全部楼层
为啥不用字段就可以解决的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-1 07:26 , Processed in 0.171962 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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