Revit二次开发:API调用RevitUI界面的命令(功能/ribbon按钮)
一、背景
有时候我们需要用代码调用RevitUI界面上的功能,比如用代码触发一次管道命令,模拟手动点一下功能。
二、引用
Revit提供了相关的API,在自己的项目中添加对RevitAPI.dll,RevitAPIUI.dll,AdWindows.dll引用.
三、开发
1、第一种调用Revit自身命令
using (Transaction tran = new Transaction(doc, "调用Revit自身命令"))
{
if (tran.Start() == TransactionStatus.Started)
{
if (cmdID != null || cmdID != string.Empty)
{
//用不同的枚举可以获取不同的自带命令
RevitCommandId revitCmdId=RevitCommandId.LookupPostableCommandId(PostableCommand.Default3DView);
if (revitCmdId!=null && uiApp.CanPostCommand(revitCmdId))
{
uiApp.PostCommand(revitCmdId);
}
}
if (tran.Commit() != TransactionStatus.Committed)
{
tran.RollBack();
}
}
}
2、第二种调用二次开发命令
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Windows;
namespace TriggerMenuButton
{
[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class TriggerRevitMenuButton : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
Transaction tran=null;
try
{
UIApplication uiApp = commandData.Application;
Document doc = uiApp.ActiveUIDocument.Document;
RibbonControl control = ComponentManager.Ribbon;
string cmdID = string.Empty;
foreach (var tab in control.Tabs)
{
foreach (var panel in tab.Panels)
{
RibbonItemEnumerator itor = panel.Source.GetItemEnumerator();
while (itor.MoveNext())
{
if (itor.Current is RibbonCommandItem cmd)
{
if (cmd.AutomationName == "管道")//你自己的命令名称
{
cmdID = cmd.Id;
if (cmdID == null || cmdID == string.Empty)
{
continue;
}
break;
}
}
}
}
}
using (tran = new Transaction(doc, "调用管道命令"))
{
if (tran.Start() == TransactionStatus.Started)
{
if (cmdID != null || cmdID != string.Empty)
{
//用命令Id,获取到RevitCommandId
RevitCommandId revitCmdId = RevitCommandId.LookupCommandId(cmdID);
if (revitCmdId!=null && uiApp.CanPostCommand(revitCmdId))//判断命令是否允许调用
{
uiApp.PostCommand(revitCmdId);
}
}
if (tran.Commit() != TransactionStatus.Committed)
{
tran.RollBack();
}
}
}
return Result.Succeeded;
}
catch
{
if (tran!=null && tran.GetStatus() == TransactionStatus.Started)
{
tran.RollBack();
}
return Result.Failed;
}
}
}
}
注意事项:
- 以上方法是用功能的名字在所有菜单中搜索,如果不怕菜单名重复,你也可以精准定位菜单,不必循环所有菜单。
- 如果怕功能重名,也可以用功能的ID进行搜索RibbonCommandItem.Id,这个Id的本质是字符串,并且是二次开发的时候自己定义的。
- 调用命令方法Application.PostCommand()方法需要在事务中执行。