我正在尝试将 UI 设置为在订阅事件 DialogBoxShowing 时自动清除元素。我无法取消订阅,即使代码未执行,用户操作的替换也会继续。
我没有足够的经验来发现错误。也许有人遇到过这种情况。 预先感谢您!
def call_purge():
def import_replacement(sender, args):
print('5')
print(type(args))
if args.DialogId == 'Dialog_Revit_PurgeUnusedTree':
args.OverrideResult(1)
"""Call Revit "Purge Unused" after completion."""
# commandId = \
# UI.RevitCommandId.LookupPostableCommandId(
# UI.PostableCommand.PurgeUnused
# )
commandId = UI.RevitCommandId.LookupCommandId("ID_PURGE_UNUSED")
try:
__revit__.DialogBoxShowing += framework.EventHandler[UI.Events.DialogBoxShowingEventArgs](import_replacement)
__revit__.PostCommand(commandId)
__revit__.DialogBoxShowing -= framework.EventHandler[UI.Events.DialogBoxShowingEventArgs](import_replacement)
except:
print(traceback.format_exc())
if __name__ == '__main__':
call_purge()
print('-' * 50)
print('Script is finished.')
我在文章中找到了一个方法,将这些函数分离到一个单独的类中,但这也不起作用
我发现你的逻辑有问题。
PostCommand
在当前外部命令终止后将命令排队等待执行。您可以在同一个外部命令中调用 DialogBoxShowing +=
和 DialogBoxShowing -=
。因此,它们都在外部命令终止之前执行,因此在排队等待执行的命令有机会运行之前执行。所以,我认为它们根本不会有任何影响。
至少在理论上,解决此问题的一种简洁方法是实施三个外部命令。一个用于调用
DialogBoxShowing +=
,比方说 D1
,另一个用于 DialogBoxShowing -=
、D2
,第三个顶层用于对 PostCommand
进行三次调用:
PostCommand(D1)
PostCommand(commandId)
PostCommand(D2)
...希望您调用
PostCommand
的顺序也决定了执行顺序。我认为情况确实如此,但可能对此没有任何保证。