Revit二次开发,通过xml或者json等文件自动生成菜单

先看下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

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值