如何在Python(Revit Dynamo)中自动处理DialogBoxShowing事件?

时间:2017-07-05 22:06:46

标签: revit-api revitpythonshell pyrevit

如何在Python(Dynamo)中订阅Revit事件?

特别是DialogBoxShowing所以我可以看到它是否是"导出与临时隐藏/隔离"警告并选择"打开临时隔离模式并导出"?

这是在C#中完成的:

http://thebuildingcoder.typepad.com/blog/2013/03/export-wall-parts-individually-to-dxf.html

参见子标题:处理和解除警告信息

谢谢!

3 个答案:

答案 0 :(得分:2)

使其比教程更简单:

在Revit内部,使用RevitPythonShell,事件订阅部分非常简单。

事件处理程序只能调用两个参数:senderevent。然后,事件或发件人提供参数,DialogId and OverrideResultin our case.

为了保持建筑编码器的示例,请使用:

def on_dialog_open(sender, event):
    try:
        if event.DialogId == 'TaskDialog_Really_Print_Or_Export_Temp_View_Modes':
            event.OverrideResult(1002) 
            # 1001 call TaskDialogResult.CommandLink1
            # 1002 call TaskDialogResult.CommandLink2
            # int(TaskDialogResult.CommandLink2) to check the result
    except Exception as e:
        pass #print(e) # uncomment this to debug 

您只需使用以下语法将此函数插入​​事件:

__uiControlledApplication__.DialogBoxShowing += on_dialog_open

这可以在RevitPythonShell的启动文件中完成:

C:\Users\USERNAME\AppData\Roaming\RevitPythonShell2017\startup.py

(或者在你的插件的启动部分)

更好的方法是取消注册处理程序,如果你不再需要它,即当Revit关闭时(查看教程了解更多细节):

__uiControlledApplication__.DialogBoxShowing -= on_dialog_open

如果您想在控制台中尝试此操作,可以使用:

def on_dialog_open(sender, event):
    # [...]

__revit__.DialogBoxShowing += on_dialog_open 

尝试导出后:

__revit__.DialogBoxShowing -= on_dialog_open

编辑:结果命令的快捷方式(感谢Callum!)

('Cancel', 2)
('Close', 8)
('CommandLink1', 1001)
('CommandLink2', 1002)
('CommandLink3', 1003)
('CommandLink4', 1004)
('No', 7)
('None', 0)
('Ok', 1)
('Retry', 4)
('Yes', 6)

答案 1 :(得分:1)

回答你的第一个问题。尝试阅读Pierre Moureu的这篇教程:https://github.com/PMoureu/samples-Python-RPS/tree/master/Tutorial-IUpdater。 他订阅了IUpdater。

答案 2 :(得分:1)

(抱歉没有足够的声誉将此作为评论添加到PRMoureu的回复......)

稍微扩展处理Dialogs ......

订阅DialogBoxShowing非常强大,我们刚刚推出了一个Dialog Suppressor来让那些令人沮丧的“你愿意将墙壁连接到刚刚制作的地板上”以及“你想将这些墙壁连接到屋顶” ”。它还可以用于查看用户通常会遇到的错误等。

  • 调查Dialogs消息文本:event.Message
  • 回复“取消”对话框:event.OverrideResult(0)
  • 向对话框回复“是”:event.OverrideResult(1)
  • 向对话框回复“确定”:event.OverrideResult(6)