无法取消订阅 Revit 中的活动

问题描述 投票:0回答:1

我正在尝试将 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.')

我在文章中找到了一个方法,将这些函数分离到一个单独的类中,但这也不起作用

python revit-api pyrevit
1个回答
0
投票

我发现你的逻辑有问题。

PostCommand
在当前外部命令终止后将命令排队等待执行。您可以在同一个外部命令中调用
DialogBoxShowing +=
DialogBoxShowing -=
。因此,它们都在外部命令终止之前执行,因此在排队等待执行的命令有机会运行之前执行。所以,我认为它们根本不会有任何影响。

至少在理论上,解决此问题的一种简洁方法是实施三个外部命令。一个用于调用

DialogBoxShowing +=
,比方说
D1
,另一个用于
DialogBoxShowing -=
D2
,第三个顶层用于对
PostCommand
进行三次调用:

  • PostCommand(D1)
  • PostCommand(commandId)
  • PostCommand(D2)

...希望您调用

PostCommand
的顺序也决定了执行顺序。我认为情况确实如此,但可能对此没有任何保证。

© www.soinside.com 2019 - 2024. All rights reserved.