目录

  • 前言
  • 一、创建DLL文件
  • 二、按钮类编写(UIRibbon)
    • 1.程序集的引用
    • 2.代码编写
    • 3.完整代码
  • 三、dll文件和addin文件的使用
  • 四、最终效果

前言

  我们在进行二次开发的时候经常会把自己开发好的DLL文件连同Addin文件发给别人,让别人复制到电脑上的Addin文件夹进行插件的使用。
  可是当我们把自己的DLL文件发给别人的时候会发现经常出现由于代码中的地址发生改变使得插件无法使用。我们可以在编程中将外部命令、创建UIRibbon的外部应用和UIRibbon使用的图片封装在一个DLL文件中。这样我们只要发送一dll和一个addin文件给对方,一起放在Addin文件夹中即可使用。类似LookUp插件的使用效果。

一、创建DLL文件

  新建一个UIRibbon类库(名字随意,我只是举例),在该类库中添加两个类,一个是继承IExteranlCommand接口的命令类(插件命令),一个是继承IExternalApplication接口创建UIRibbon的功能按钮类。UIRibbon是一个库(.dll),库中可以有很多类,所有命令类和按钮类可以封装在一个库中。
  这里我编写的最简单的显示HelloRevit的命令进行示例。

二、按钮类编写(UIRibbon)

1.程序集的引用

  除了正常的RevitAPI及RevitAPIUI的引用外,程序里图片的使用还需要引用PresentationCore和WindowsBase两个程序集。引用如下:

2.代码编写

1、新建一个选项卡,并在该选项卡下创建一个面板

application.CreateRibbonTab("NewTab");
RibbonPanel ribbonPanel = application.CreateRibbonPanel("NewTab", "NewPanel");

2、获得UIRibbon.dll的相对地址,即不是写死了的地址,会根据dll所放的位置的改变而改变

string assemblyPash = Assembly.GetExecutingAssembly().Location;

3、编写PushButtonDate

string className = "UIRibbon.HelloRevit";
PushButtonData pushButtonData = new PushButtonData("ButtonName", "CommandName", assemblyPash, className);

4、将图片封装在dll,并对其进行引用。在类库项目右键,新建文件夹,将准备好的图面拖到文件里面。(当然放根目录也行)
5、将图片的生成操作改成”嵌入的资源“,这样在生成dll的时候图片会一并封装在里面。
6、嵌入图片的使用

Stream sm = Assembly.GetExecutingAssembly().GetManifestResourceStream("UIRibbon.Image.图标.png");
pushButtonData.LargeImage = BitmapFrame.Create(sm);
ribbonPanel.AddItem(pushButtonData);

这里的UIRibbon对应的是类库名称(也是名称空间),Image是文件夹名,后面的就是图片的文件名称。这里的点相当于文件夹的访问。
第一句是获取当前程序集的指定资源,返回值是一个Stream。第二句是将返回的stream创建一个imagesource。并进行使用。最后添加按钮。完成。

3.完整代码

using Autodesk.Revit.UI;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media.Imaging;namespace UIRibbon
{class UIRibbon : IExternalApplication{public Result OnShutdown(UIControlledApplication application){return Result.Succeeded;}public Result OnStartup(UIControlledApplication application){application.CreateRibbonTab("NewTab");//创建选项卡RibbonPanel ribbonPanel = application.CreateRibbonPanel("NewTab", "NewPanel");//创建面板string assemblyPash = Assembly.GetExecutingAssembly().Location;//获取程序集的相对地址string className = "UIRibbon.HelloRevit";//外部命令的FullNamePushButtonData pushButtonData = new PushButtonData("ButtonName", "CommandName", assemblyPash, className);Stream sm = Assembly.GetExecutingAssembly().GetManifestResourceStream("UIRibbon.Image.图标.png");//获取嵌入的图片pushButtonData.LargeImage = BitmapFrame.Create(sm);//创建图片并赋值给LargeImageribbonPanel.AddItem(pushButtonData);return Result.Succeeded;}}
}

三、dll文件和addin文件的使用

1、打开Revit,点击附加模块的外部工具,选择右侧的LoadedApplications,选择下面的Load加载我们刚编译好的UIRibbon.dll点右下角的save,选择第二个(Save chacked items to local .addin file),Save前记得把Loaded Commads里面的勾全部去掉。在载入文件夹生成一个addin文件。这样在我们编译的文件夹就会生成一个我们需要的addin文件,不用去自己编写addin文件。


2、如果前面忘记把勾去掉,addin文件就是生成我们不需要加载的东西。记事本打开addin文件,将我们不需要加载的HelloRevit删掉,我们只需要加载UIRibbon这个类就行。HelloRevit在按钮中调用即可。

3、将dll和addin文件复制,粘贴到C:\ProgramData\Autodesk\Revit\Addins\2018文件夹下,打开Revit后就能正常使用。(2018是我安装的Revit版本,故放在此文件夹下)

四、最终效果


这样我们只需要把编译好的dll和addin文件发给别人,别人只需要放在上述的文件夹下就能使用。不会因为改变路径报错。
另外还有"黑夜de骑士"方法
将图片属性的“生成操作”改成“Resource”

代码变成

pushButtonData.LargeImage = new BitmapImage(new Uri("pack://application:,,,/UIRibbon;component/Image/图标.png"));

也能达到同样的效果。这里的UIRibbon名称空间,Image就是文件夹名,最后就是文件名,这三根据自己需求修改。其他就固定写法,照抄就行。
B站视频地址:https://www.bilibili.com/video/BV1MJ41167mb?t=2413

Revit二次开发-创建IURibbon中使用相对地址相关推荐

  1. Revit二次开发——引用dynamo中的几何库

    前沿 dynamo的几何库其实是非常强大的,如果自己靠着RevitAPI去写还是非常费劲的.所以想引用dynamo的几何库来做一些工作.主要参考的就是这篇文章.Revit二次开发--不开启Dynamo ...

  2. [Revit二次开发] 创建一个柱的族

    完整项目代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  3. #Revit二次开发# 创建剖面视图

    设置box的min和max只是设置box的范围大小.其中min和max的xyz方向的大小实际指的基于剖面视图坐标系.Box的原点和min,max可以确定位置关系:box的原点决定创建的剖面视图的原点. ...

  4. 【Revit二次开发】模型中存储数据——参数和外部存储(Parameter, Schema and Entity)

    模型中存储数据 参数 读取 写入 外部存储 Schema Entity 快速获取外部存储参数 参数 在Revit平台API中,每个图元对象都有参数属性,它是隶属于图元所有属性的集合,在此集合中更改属性 ...

  5. [Revit二次开发] 创建剖面并将视图切换至剖面

    前言 在Revit建模过程及后期出图的时候都有需要用到剖面,然而每次我们都通过手动去创建剖面再去对剖面视图进行调整就会显得很麻烦,工作量也是相当的大. 如果我们通过使用RevitAPI只需要简单的代码 ...

  6. revit二次开发 创建图纸图框,视图放到图框中心点位置

    创建图纸 /// <summary>/// 创建图纸/// </summary>private void CreateViewSheet2(){FilteredElementC ...

  7. revit二次开发-创建族

    通过文件路径载入族 并点击任意一点创建实例 代码如下: using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk ...

  8. Revit二次开发——读取cad中的文字信息

    Revit读取cad的文字信息需要借助Teigha的开源dll,在程序中添加下图中红色框的dll文件的引用,其他的dll文件全部放在同一个文件夹中即可,运行的时候,会自动把这些dll文件全部复制到bi ...

  9. Revit二次开发“创建组遍历组Group”

    group 就是吧一些有关系的对象放在一个组里面 [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manu ...

最新文章

  1. RNA-seq分析-数据库
  2. 简单java题_java
  3. C#异步编程のParallel(并行)
  4. 有多少种 “图片格式”?
  5. 网址收藏 2020.12.11
  6. jsf tree组件_JSF表单组件示例教程
  7. surfer 8 scripter 学习笔记(9)surfer与VB结合的VB源代码
  8. 曼昆微观经济学--十大原理
  9. 浏览器首页被360恶意篡改,解决方法
  10. ValueError: operands could not be broadcast together with shapes (416,416,4) (3,)
  11. 数码管动态显示从0显示到999999,每隔0.1s增加1个数
  12. 用DW编写网页--个人简历
  13. 微信小程序实现城市搜索功能(付源码)
  14. SQL 使用别名(使用 AS 关键字)
  15. pandas.Series.str.extract 正则提取数据
  16. 八种消除沟通上的不良习惯地的方法
  17. FTP错误详解及解决方案
  18. 问题 F: 猜球球 XUPT2019 哈夫曼树
  19. DeepLab系列理解
  20. SAP中供应商寄售库存返回操作实例

热门文章

  1. 微信公众号支付WeixinJSBridge
  2. 推荐几个不错的DOTNET控件网址
  3. 日本开发“后5G”技术 速度达5倍
  4. 什么是启发式算法(转)
  5. 新静安二手房房价依旧上涨
  6. Android电子书翻页效果实现
  7. 阿里云轻量服务器使用一年使用体验(个人心得,仅供参考)
  8. 亚马逊开店店铺选品技巧分析
  9. 如何用多台机器产生agent到A上。
  10. vue脚手架引入bootstrap3