2

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

特别是 DialogBoxShowing,所以我可以查看它是否是“使用临时隐藏/隔离导出”警告并选择“打开并导出临时隔离模式”?

它在这里用 C# 完成:

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

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

谢谢!

4

3 回答 3

2

为了使它比教程中的更简单:

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

事件处理程序只是一个带有两个参数的可调用对象:senderevent。然后事件或发送者提供参数来玩,DialogIdOverrideResult我们的例子中。

为了保留 Building Coder 示例,让我们继续:

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)
于 2017-07-06T18:23:18.780 回答
1

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

于 2017-07-06T05:51:25.900 回答
1

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

要扩展处理对话框一点...

订阅 DialogBoxShowing 非常强大,我们刚刚推出了一个对话框抑制器,以消除令人沮丧的“你想把墙连接到你刚刚制作的地板上吗”和“你想把这些墙连接到屋顶上吗”。它还可以用于查看用户通常遇到的错误等。

  • 调查 Dialogs 消息文本:event.Message
  • 向对话框回复“取消”:event.OverrideResult(0)
  • 向对话框回复“是”:event.OverrideResult(1)
  • 向对话框回复“OK”:event.OverrideResult(6)
于 2017-07-06T20:19:51.730 回答