明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3014|回复: 7

求助,反应器问题,更新块属性时系统崩溃

[复制链接]
发表于 2008-6-2 15:18 | 显示全部楼层 |阅读模式
我想做一个反应器,对图块放大或缩小时,图块属性内容会根据图块尺寸更改.
更改的内容单独运行时可以,但在反应器中不行,不知是否是反应器未运用好.请各位指教
  1. [code](DEFUN test ( / ss)
  2.   (defun modify (notifier-object reactor-object parameter-list /  en en1 ent ent1 scale oldatt newatt)
  3.   (setq en (HandEnt (VLR-Data reactor-object)))
  4.   (setq en1 (vlax-vla-object->ename notifier-object))
  5.     (IF en
  6.     (PROGN
  7.     (SETQ ENT (ENTGET en)
  8.           ENT1 ENT)
  9.     (setq scale (cdr (assoc 41 ent)))
  10.     (WHILE (= (CDR (ASSOC 0 (SETQ ENT1 (ENTGET (ENTNEXT (CDR (ASSOC -1 ENT1))))))) "ATTRIB")
  11.      (progn
  12.        (setq OLDATT (atof (CDR (ASSOC 2 ENT1))))
  13.        (setq newatt (rtos (* scale OLDATT) 2 0))
  14.    (SETQ ENT1 (SUBST (CONS 1 NEWATT) (ASSOC 1 ENT1) ENT1))
  15.    (ENTMOD ENT1);这一步时会崩溃
  16.    (ENTMOD ENT)
  17.    )
  18.     )
  19.   ))
  20.   )
  21. (defun reactor(en / reactor chl ena)
  22.   (setq ena (vlax-ename->vla-object en))
  23.   (SetQ chl (Cdr (Assoc 5 (EntGet en))))
  24.   (setq Reactor (vlr-object-reactor (list ena)
  25.          chl '((:vlr-modified . modify))))
  26. )
  27.   (vl-load-com)
  28.   (if (AND (PRINC "\nSelect Block with attribute 选择带属性图块 :")
  29.            (SETQ SS (SSGET '((0 . "INSERT") (66 . 1)))))
  30.     (reactor (ssname ss 0))
  31.     )
  32.   (PRINC)
  33. )
[/code]
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2008-6-2 15:32 | 显示全部楼层
你这个是什么版本的啊?怎么有些东西都看不懂了,
反应器第一法则:不要用命令和entmod等autolisp,,,用vlisp的vla方法


 楼主| 发表于 2008-6-2 17:42 | 显示全部楼层
改成vla还是不行
  1. (DEFUN test ()
  2.     (defun modify (notifier-object reactor-object parameter-list /  )
  3.   (setq en (HandEnt (VLR-Data reactor-object)))
  4.   (setq en1 (vlax-vla-object->ename notifier-object))
  5.     (IF en
  6.     (PROGN
  7.     (SETQ ENT (ENTGET en))
  8.     (setq scale (cdr (assoc 41 ent)))
  9.     (if (/= scale 1)
  10.     (if (safearray-value
  11.             (setq atts
  12.                    (vlax-variant-value
  13.                      (vla-getattributes (vlax-ename->vla-object en))
  14.                    )
  15.             )
  16.           )
  17.         (progn
  18.             (mapcar
  19.               '(lambda (x)
  20.                  (progn
  21.        (setq OLDATT (atof (vla-get-textstring x)))
  22.                      (setq newatt (rtos (* scale OLDATT) 2 0))
  23.                      (vla-put-textstring x newatt)
  24.      )
  25.                  )
  26.               (vlax-safearray->list atts))
  27.    (vla-update (vlax-ename->vla-object en))
  28.             )
  29.         )
  30.       )
  31.   ))
  32.   )
  33. (defun reactor(en / reactor)
  34.   (setq ena (vlax-ename->vla-object en))
  35.   (SetQ chl (Cdr (Assoc 5 (EntGet en))))
  36.   (setq Reactor (vlr-object-reactor (list ena)
  37.          chl '((:vlr-modified . modify))))
  38. )
  39.   (vl-load-com)
  40.   (if (AND (PRINC "\nSelect Block with attribute 选择带属性图块 :")
  41.            (SETQ SS (SSGET '((0 . "INSERT") (66 . 1)))))
  42.     (reactor (ssname ss 0))
  43.     )
  44.   (PRINC)
  45. )
发表于 2008-6-3 08:10 | 显示全部楼层

請不要更新發出事件通知的物件。

此事件會導致物件觸發可能仍在進行中的回覆函數,以及當回覆函數被啟動時仍由 AutoCAD 使用中的物件。因此,請勿試圖從同一個物件的回覆函數更新物件。不過,您可以從觸發事件的物件中安全地讀取資訊。例如,假設您的地板上鋪滿了地磚,然後您將反應裝置貼到地板的邊界。如果您更改了地板的尺寸,反應裝置回覆函數將會自動增加或減少地磚來鋪滿新的區域。此函數將可讀取邊界的新區域,但無法嘗試對邊界本身進行任何變更。

发表于 2008-6-3 08:11 | 显示全部楼层
在很多cad命令运行中(command-end之前),命令运行对象数据是只读的,,,所以这种东西有两种方案:在vlr-modified中利用sendcommand(不推荐,因为复杂对象,例如多段线,在这个时间里读取的端点还是没有修改前的),在vlr-modified中标志,在command-end反应器里面做数据的修改.
另外说一下,你的 (if (/= scale 1)是不是有问题?例如我选择缩放2倍,你成功的运行反应器更改属性为2,这个时候应该还会引起你的反应器,因为你更改了该块,最后,,一个循环.
 楼主| 发表于 2008-6-3 08:24 | 显示全部楼层
谢谢龙版主的指点,我可不可以用图块的中的某一个子物体作为发出事件通知的物体
发表于 2008-6-4 08:07 | 显示全部楼层

注意xxsheng說的
在vlr-modified中標誌,在command-end反應器裡面做數據的修改

;;如何記錄比例才是問題點??
;;圖塊屬性內容會根據圖塊尺寸更改!!圖塊尺寸是甚麼??
;;屬性值=2,圖塊比例=1,放大3倍話,圖塊比例=3,屬性值2*3=6
;;縮少1/2倍話,圖塊比例=1.5,屬性值6*1.5=9...!!!???

 楼主| 发表于 2008-6-4 08:24 | 显示全部楼层
谢谢各位的指点,这个问题我已经解决了,我是用tagstring中记录了原始尺寸,然后用比例*tagstring得到新的尺寸.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 09:39 , Processed in 6.431632 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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