我有两个与行关联的文本。因为文本表示线条的某些数据,所以他们总是被视为该行的子女,旁边可见。通过一些LISP例程,如果行的数据发生变化,文本实体通过更改其文本反映了变化。为此,我将行的句柄存储在每个文本上,例如XData,反之亦然,例如文本的把手进入行。
当我用每个文本中的文本复制新的手柄时,就会出现问题,但是存储的Xdata正在提供旧的手柄,这会导致进一步的问题。我认为vlr-copied
反应堆可以解决我的问题,但是由于我不太精通反应堆,因此我似乎无法使其起作用。
有人可以将我指向正确的方向吗?我发现这个
http://www.theswamp.org/index.php?topic=42654.0
,但我不明白何时进行选择集,还包括非相关的其他实体,如何将正确的选择设置传递给反应堆并更新手柄。
任何建议都赞赏。谢谢。
首先,您需要确定要展示对象的行为,假设对象(文本或行(是独立于另一个对象复制的。由于两个对象是链接的,因此您可能需要确定哪个对象是'master',哪个是'从'。。
例如,如果将文本对象复制到空白空间中,则可能会决定应删除所得副本,因为没有可以参考的行。鉴于,如果将行复制到空白空间中,则可能决定复制关联的文本对象并将其相对于新行定位。
这是我在开发关联文本框应用程序时遵循的方法(这基本上是在求解图形中两个对象的相同问题 - 在我的情况下,是文本对象和一个边界框架(。
在我的应用程序中,我使用单独的对象反应器分别处理文本对象和文本框的修改事件:
(vlr-object-reactor txt "tbox-textreactor"
'(
(:vlr-modified . tbox:textcallback)
(:vlr-copied . tbox:textcopied)
)
)
(vlr-object-reactor box "tbox-tboxreactor"
'(
(:vlr-modified . tbox:tboxcallback)
(:vlr-copied . tbox:tboxcopied)
)
)
类似于您的设置,它们是构建的&使用附带的文本和文本框上的扩展实体数据(XDATA(在程序加载上配置。
当触发TexBox的复制事件(评估tbox:tboxcopied
回调函数(时,我认为文本框无法没有包含文本的文本,因此我从图纸中删除了孤儿文本框。
但是,使用对象反应器工作时必须记住的最重要点是您无法在其自己的回调函数中修改对象反应器的所有者。
因此,对于我需要修改事件所有者的所有修改事件,我生成了一个临时命令反应器,该反应堆将在上启动已修改,以确保该对象未锁定用于修改。
例如,对于文本框复制事件,我使用以下内容:
(defun tbox:tboxcopied ( owner reactor params )
(if (/= 0 (car params))
(progn
(setq tbox:owner (append tbox:owner (list (car params))))
(vlr-command-reactor "tbox-tboxcopiedcommreactor"
'(
(:vlr-commandended . tbox:tboxcopiedcommandended)
(:vlr-commandcancelled . tbox:tboxcopiedcommandcancelled)
(:vlr-commandfailed . tbox:tboxcopiedcommandcancelled)
)
)
)
)
(princ)
)
i然后在其自己的任何回调功能中删除此临时命令反应器,以防止图纸中冗余反应器的传播:
(defun tbox:tboxcopiedcommandended ( reactor params / ent )
(vlr-remove reactor) ;; <----- Remove temporary Command Reactor
(if
(and
(setq ent (car tbox:owner))
(member (cdr (assoc 0 (entget ent))) '("CIRCLE" "LWPOLYLINE"))
)
(entdel ent) ;; <----- Delete orphan textbox
)
(setq tbox:owner (cdr tbox:owner))
(princ)
)
,当复制 text 时,我重新创建周围的文本框并构建新关联(再次,生成临时命令反应器以促进文本对象的修改(:
(:(defun tbox:textcopied ( owner reactor params )
(if (/= 0 (car params))
(progn
(setq tbox:owner (append tbox:owner (list (car params))))
(vlr-command-reactor "tbox-textcopiedcommreactor"
'(
(:vlr-commandended . tbox:textcopiedcommandended)
(:vlr-commandcancelled . tbox:textcopiedcommandcancelled)
(:vlr-commandfailed . tbox:textcopiedcommandcancelled)
)
)
)
)
(princ)
)
...并重新创建适当的文本框,作为临时命令反应器回调函数的一部分:
(defun tbox:textcopiedcommandended ( reactor params / box ent enx val )
(vlr-remove reactor) ;; <----- Remove temporary Command Reactor
(if
(and
(setq ent (car tbox:owner))
(setq enx (entget ent (list tbox:app)))
(member (cdr (assoc 0 enx)) '("TEXT" "MTEXT"))
(setq val (cdadr (assoc -3 enx)))
(setq box (tbox:createbox enx (cdr (assoc 1000 val)) (cdr (assoc 1040 val))))
)
(progn
(entmod
(append (vl-remove (assoc 40 enx) (entget ent))
(list
(list -3
(list tbox:app
'(1002 . "{")
(cons 1005 (cdr (assoc 5 (entget box))))
(assoc 1000 val)
(assoc 1040 val)
'(1002 . "}")
)
)
)
)
)
(if (= 'vlr-object-reactor (type tbox:textreactor))
(vlr-owner-add tbox:textreactor (vlax-ename->vla-object ent))
)
(if (= 'vlr-object-reactor (type tbox:tboxreactor))
(vlr-owner-add tbox:tboxreactor (vlax-ename->vla-object box))
)
)
)
(setq tbox:owner (cdr tbox:owner))
(princ)
)
我上面描述的方法是我建议您的方案的方法:
复制 text 时,删除结果孤立的文本对象;当复制 line 时,创建一个相应的文本对象并在复制的行之间构建关联&amp;新的文本对象。