如何在 Python(Revit Dynamo) 中自动处理 DialogBoxShowing 事件?
How to automatically handle DialogBoxShowing event in Python(Revit Dynamo)?
如何在 Python (Dynamo) 中订阅 Revit 事件?
特别是 DialogBoxShowing,所以我可以查看它是否是 "Export with Temporary Hide/Isolate" 警告和 select "Leave the Temporary Isolate Mode on and Export"?
这里是用 C# 完成的:
http://thebuildingcoder.typepad.com/blog/2013/03/export-wall-parts-individually-to-dxf.html
参见sub-heading:处理和消除警告消息
谢谢!
回答你的第一个问题。尝试阅读 Pierre Moureu 的教程:https://github.com/PMoureu/samples-Python-RPS/tree/master/Tutorial-IUpdater。
他正在订阅 IUpdater。
为了使它比教程中的更简单:
在 Revit 中,使用 RevitPythonShell,事件订阅部分可以非常简单。
事件处理程序只是一个带有两个参数的可调用对象:sender
和event
。然后事件,或者发送者给参数玩,DialogId
and OverrideResult
in our case.
为了保留 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)
(抱歉没有足够的声誉将此添加为 PRMoureu 的回复的评论...)
稍微扩展一下处理对话框...
订阅 DialogBoxShowing 非常强大,我们刚刚推出了一个对话框抑制器来消除令人沮丧的 'Would you like to join walls to the floor you just made' 和 'Would you like to attach these walls to the roof'。它还可用于查看用户通常遇到的错误等。
- 调查对话消息文本:event.Message
- 要回复 'Cancel' 对话:event.OverrideResult(0)
- 要回复 'Yes' 对话:event.OverrideResult(1)
- 要回复 'OK' 对话:event.OverrideResult(6)
如何在 Python (Dynamo) 中订阅 Revit 事件?
特别是 DialogBoxShowing,所以我可以查看它是否是 "Export with Temporary Hide/Isolate" 警告和 select "Leave the Temporary Isolate Mode on and Export"?
这里是用 C# 完成的:
http://thebuildingcoder.typepad.com/blog/2013/03/export-wall-parts-individually-to-dxf.html
参见sub-heading:处理和消除警告消息
谢谢!
回答你的第一个问题。尝试阅读 Pierre Moureu 的教程:https://github.com/PMoureu/samples-Python-RPS/tree/master/Tutorial-IUpdater。 他正在订阅 IUpdater。
为了使它比教程中的更简单:
在 Revit 中,使用 RevitPythonShell,事件订阅部分可以非常简单。
事件处理程序只是一个带有两个参数的可调用对象:sender
和event
。然后事件,或者发送者给参数玩,DialogId
and OverrideResult
in our case.
为了保留 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)
(抱歉没有足够的声誉将此添加为 PRMoureu 的回复的评论...)
稍微扩展一下处理对话框...
订阅 DialogBoxShowing 非常强大,我们刚刚推出了一个对话框抑制器来消除令人沮丧的 'Would you like to join walls to the floor you just made' 和 'Would you like to attach these walls to the roof'。它还可用于查看用户通常遇到的错误等。
- 调查对话消息文本:event.Message
- 要回复 'Cancel' 对话:event.OverrideResult(0)
- 要回复 'Yes' 对话:event.OverrideResult(1)
- 要回复 'OK' 对话:event.OverrideResult(6)