Revit中的AddInCommandBinding
Revit Api提供了对已经有的命令的入口,可以调用Revit UI界面中的按钮命令,也可以调用鼠标右键的ContextMenu的命令。使用Revit命令有两个目的:
-
替换Revit命令原来所代表的功能
-
发送Revit自带的命令
重写Revit自带的命令
AddInCommandBinding类可以重写一个已经有的Revit命令,它有三个事件可以替换现在有的功能:
- BeforeExecuted——这个是一个只读的事件,该命令自带的功能发生发生之前会触发,但是不能开启事务去修改Document中的数据,也不会阻碍原来功能的正常实现
- CanExecute——决定该命令现在的可用性,如果是false则该命令无法使用
- Executed——替换命令原先功能的地方,注册了这个事件就不要去注册BeforeExecuted事件。现在这个事件的Handler里面的功能即将取代原先的功能。
Revit界面中点击画模型线的命令,可以看到TaskDialog的运行效果
public Result OnStartup(UIControlledApplication application)
{
//拿到画模型线的内置命令Id
var id = RevitCommandId.LookupPostableCommandId(PostableCommand.ModelLine);
//拿着命令创建对应的命令
var command = application.CreateAddInCommandBinding(id);
//注册执行前的事件
command.CanExecute += Command_CanExecute;
command.BeforeExecuted += Command_BeforeExecuted;
return Result.Succeeded;
}
//设置命令的可用性为false,这样UI中的按钮是灰色的,不可用的
private void Command_CanExecute(object sender, CanExecuteEventArgs e)
{
e.CanExecute = false;
}
private void Command_BeforeExecuted(object sender, BeforeExecutedEventArgs e)
{
TaskDialog.Show("Title", "运行后");
}
替换Revit中的模型线命令
public Result OnStartup(UIControlledApplication application)
{
var id = RevitCommandId.LookupPostableCommandId(PostableCommand.ModelLine);
var command = application.CreateAddInCommandBinding(id);
command.CanExecute += Command_CanExecute;
//command.BeforeExecuted += Command_BeforeExecuted;
command.Executed += Command_Executed;
return Result.Succeeded;
}
private void Command_CanExecute(object sender, CanExecuteEventArgs e)
{
e.CanExecute = true;
}
private void Command_Executed(object sender, ExecutedEventArgs e)
{
var app = sender as UIApplication;
if (app != null)
{
//获取创建窗户的命令Id
var id = RevitCommandId.LookupPostableCommandId(PostableCommand.Window);
//把画模型线的命令改写成创建窗户
//这样用户点了UI中的模型线按钮,界面会进入到创建窗户
app.PostCommand(id);
}
}
效果:
设置命令的可用性以后,Revit界面中的画模型线的按钮变成了不可用。
设置可用性为True,点击画模型线的命令可以看到这个效果