先看下Revit菜单的样子:
我们知道,要给上面的Revit菜单添加新的自定义菜单的话,需要扩展IExternalApplication接口,然后编写代码创建菜单即可。
本文通过抽象,编写了一份实际生产项目中可以使用的,通过xml文件或者json文件去配置Revit菜单的功能。源码价值较高,在附件可下载。
通过xml文件配置Revit菜单,可以不用去编写C#代码,也不用去编译C#代码,直接修改xml文件覆盖后,重启Revit即可立刻生效。
一、添加对IExternalApplication的接口扩展
二、构造配置文件,以及配置文件的读取类
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--菜单,tab节点可以多个-->
<menus>
<!--菜单项,name可以为空,为空的话,将被加载到附加模板中-->
<tab name="我的菜单 ">
<!--面板,必填-->
<panel name="建模"></panel>
<!--具体菜单项-->
<item name="Hello菜单" className="Practice.Client.Commands.DefaultCommand" toolTip="Hello菜单" largeImage="Practice.Client.Resources.a.png" image="Practice.Client.Resources.a.png"></item>
<!--下拉菜单项-->
<pulldownItem name="我的下拉菜单" toolTip="" largeImage="Practice.Client.Resources.a.png" image="Practice.Client.Resources.a.png">
<items>
<item name="菜单a" className="Practice.Client.Commands.DefaultCommand" toolTip="使用鼠标选点" largeImage="Practice.Client.Resources.a.png" image="Practice.Client.Resources.a.png"></item>
<item name="菜单b" className="Practice.Client.Commands.DefaultCommand" toolTip="创建梁" largeImage="Practice.Client.Resources.b.png" image="Practice.Client.Resources.b.png"></item>
</items>
</pulldownItem>
<!--堆栈菜单项-->
<stackedItem>
<item1 name="菜单1" className="Practice.Client.Commands.DefaultCommand" toolTip="创建柱" image="Practice.Client.Resources.a.png"></item1>
<item2 name="菜单2" className="Practice.Client.Commands.DefaultCommand" toolTip="创建立方体" image="Practice.Client.Resources.b.png"></item2>
</stackedItem>
</tab>
</menus>
</configuration>
三、构造xml节点解释类
四、构建菜单定义接口、菜单生成器接口
namespace Practice.Client
{
/// <summary>
/// 每一个Command的菜单定义
/// </summary>
/// <creator>marc</creator>
public interface IMenuDefinition
{
/// <summary>
/// 菜单tab项定义。可为空。若空,则菜单将加在附加模块中
/// </summary>
string Tab { get; }
/// <summary>
/// 面板定义。若Tab不为空,则面板将加在Tab中
/// </summary>
string Panel { get; }
/// <summary>
/// 普通项定义。
/// </summary>
Item Item { get; }
/// <summary>
/// 下拉项定义。
/// </summary>
Item PulldownItem { get; }
/// <summary>
/// 堆栈项。最少2个,最多3个
/// </summary>
StackedItems StackedItems { get; }
}
}
namespace Practice.Client
{
/// <summary>
/// 菜单生成器
/// </summary>
/// <cretor>marc</cretor>
public interface IMenuCreator
{
/// <summary>
/// 设置菜单定义
/// </summary>
/// <param name="definition">菜单定义</param>
void SetMenuDefinition(IMenuDefinition definition);
/// <summary>
/// 创建菜单tab项
/// </summary>
void CreateTab();
/// <summary>
/// 创建面板
/// </summary>
void CreatePanel();
/// <summary>
/// 创建项
/// </summary>
void CreateItem();
/// <summary>
/// 创建下拉项
/// </summary>
void CreatePulldownItem();
/// <summary>
/// 创建堆栈项
/// </summary>
void CreateStackedItems();
}
}
五、通过菜单驱动器管理生成
菜单生成的直接实现类的代码如下:
如此,我们就完成了读取xml文件配置,并抽象化生成菜单的代码编写。接下去我们就可以去实验一下了。
六、编写一个Revit指令,用来测试
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
namespace Practice.Client.Commands
{
/// <summary>
/// 用于测试的插件命令
/// </summary>
/// <creator>marc</creator>
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
public class DefaultCommand : IExternalCommand
{
/// <summary>
/// 运行
/// </summary>
/// <param name="commandData"></param>
/// <param name="message"></param>
/// <param name="elements"></param>
/// <returns></returns>
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
TaskDialog.Show("提示", "你好,点开菜单 了");
return Result.Succeeded;
}
}
}
七、编写.addin插件文件
<?xml version="1.0" encoding="utf-8"?>
<RevitAddIns>
<AddIn Type="Application">
<Name>配置菜单</Name>
<Assembly>Practice.Client.dll</Assembly>
<AddInId>9db84df0-b5b6-4ffb-ad16-a5c607f5525a</AddInId>
<FullClassName>Practice.Client.UiApplication</FullClassName>
<VendorId>ADSK</VendorId>
</AddIn>
</RevitAddIns>
八、将文件配置到Revit中
我们需要将.addin文件和编译生成的dll放在Revit的AddIns目录下,相信位置你是知道,不知道的可以网上搜索其它文章处理下。
然后我们还需要将xml的菜单配置文件和dll放在Revit的安装目录下,注意是安装目录,不是AddIns目录 。
九、见证结果
如上图,我们生成了“我的菜单”项,通过xml文件,我们可以任意指定我们的菜单配置。
关于xml文件的节点解释,在xml文件中已经有详细备注,直接参考即可。
若您需要多个类似于“我的菜单”的菜单项,则在xml文件中,创建多个<tab>节点即可实现。
十、让我们尝试点击一下菜单试试
如上图,成功调用了我们期望的插件。
源码下载:https://download.csdn.net/download/mazhiyuan1981/13060927