Revit二次开发:API调用RevitUI界面的命令/ribbon按钮(含自己开发的功能按钮)

Revit二次开发:API调用RevitUI界面的命令(功能/ribbon按钮)

一、背景

有时候我们需要用代码调用RevitUI界面上的功能,比如用代码触发一次管道命令,模拟手动点一下功能。
Revit二次开发:API调用RevitUI界面的命令/ribbon按钮(含自己开发的功能按钮)

二、引用

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;
            }
        }
    }
}

注意事项:

  1. 以上方法是用功能的名字在所有菜单中搜索,如果不怕菜单名重复,你也可以精准定位菜单,不必循环所有菜单。
  2. 如果怕功能重名,也可以用功能的ID进行搜索RibbonCommandItem.Id,这个Id的本质是字符串,并且是二次开发的时候自己定义的。
  3. 调用命令方法Application.PostCommand()方法需要在事务中执行。
上一篇:SQL中的存储过程和事务


下一篇:关于SQL事务的一些坑