zoukankan      html  css  js  c++  java
  • 踏上Revit二次开发之路 3 自己的工具按钮

    3 自己的工具按钮

    上次的例子只能在“附加模块”→“外部工具”下运行,用作个人作品是没问题,如果打算搞个公司产品的话,估计BOSS是不会满意的。这次我来做一个直接显示在“附加模块”选项卡上的工具按钮。

    3.1 基础

    1、新建一个项目WelcomeToRevit。添加引用RevitAPI.dll和RevitAPI.dll。具体做法和上次一样,不赘述。

    2、保留指令
    using System;
    添加指令
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;
    using Autodesk.Revit.Attributes;

    3、把默认生成的public class Class1{}改成
    public class Class1: IExternalApplication{}

    4、在public class Class1: IExternalApplication{}内部添加两个函数OnStartup(UIControlledApplication application){}和OnShutdown(UIControlledApplication application){},分别用Result加以约束,并设定返回值为Succeeded。

    5、在OnStartup(UIControlledApplication application){}内添加以下内容:
    RibbonPanel ribbonPanel = application.CreateRibbonPanel("演示");
    PushButtonData buttonData = new PushButtonData("cmdWelcomeToRevit","欢迎",@"C:RevitBlogProjectsWelcomeToRevitWelcomeToRevitinDebugWelcomeToRevit.dll","WelcomeToRevit.Class2");
    PushButton pushButton = ribbonPanel.AddItem(buttonData) as PushButton;
    pushButton.ToolTip = "欢迎来到Revit。";

    6、在命名空间WelcomeToRevit内部(不是Class1内部)添加一个类Class2,继承于IExternalCommand接口类。在该类前面添加[Transaction(TransactionMode.ReadOnly)],在入口函数里添加内容TaskDialog.Show("RevitDemo", "Welcome To Revit!");并返回Succeeded。

    7、完成后的代码如下:

     1 using System;
     2 using Autodesk.Revit.DB;
     3 using Autodesk.Revit.UI;
     4 using Autodesk.Revit.Attributes;
     5 
     6 namespace WelcomeToRevit
     7 {
     8     public class Class1: IExternalApplication
     9     {
    10         public Result OnStartup(UIControlledApplication application)
    11         {
    12             RibbonPanel ribbonPanel = application.CreateRibbonPanel("演示");
    13 
    14             PushButtonData buttonData = new PushButtonData("cmdWelcomeToRevit","欢迎",@"C:TestWelcomeToRevitWelcomeToRevitinDebugWelcomeToRevit.dll","WelcomeToRevit.Class2");
    15             PushButton pushButton = ribbonPanel.AddItem(buttonData) as PushButton;
    16 
    17             pushButton.ToolTip = "欢迎来到Revit。";
    18 
    19             return Result.Succeeded;
    20         }
    21         public Result OnShutdown(UIControlledApplication application)
    22         {
    23             return Result.Succeeded;
    24         }
    25     }
    26 
    27     [Transaction(TransactionMode.ReadOnly)]
    28     public class Class2 : IExternalCommand
    29     {
    30         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    31         {
    32             TaskDialog.Show("RevitDemo", "Welcome To Revit!");
    33             return Result.Succeeded;
    34         }
    35     }
    36 }
    View Code

    仔细对比一下上个例子,会发现只是多了从8行到25行这一段。
    8行,声明一个类,继承自RevitAPI的IExternalApplication(外部程序)接口。与IExternalCommand不同,IExternalApplication用两个成员函数OnStartup和OnShutdown来对应启动和关闭状态。
    10行,重载OnStartup函数。
    12行,实例化对象RibbonPanel,并通过CreateRibbonPanel方法新建一个面板,这个面板是用来承载按钮的,面板下方显示“演示”字样。
    14行,实例化对象PushButtonData,并通过构造函数新建一个按钮数据。该构造函数有四个参数:第一个是程序内部使用的按钮名称,这个只要注意不要重名就可以;第二个是用户可见的按钮文字,这个可以自己随便写;第三个是按钮对应的类库地址,即dll的路径,要按实际的填;第四个是按钮命令实现代码的类名,这里要和28行对应。其中第三个参数前面的@用来忽略后面的转义字符“”,这是个很实用的小技巧。
    15行,根据按钮数据实例化对象PushButton,并把这个按钮添加到面板上。
    17行,给按钮添加一个提示,当鼠标停在上面时会出现相应提示。

    8、编写WelcomeToRevit.addin复制到revit插件目录下。

     1 <?xml version ="1.0" encoding ="utf-8" standalone ="no"?>
     2 <RevitAddIns>
     3   <AddIn Type="Application">
     4     <Assembly>
     5       C:	estWelcomeToRevitWelcomeToRevitinDebugWelcomeToRevit.dll
     6     </Assembly>
     7     <AddInId>86394068-436d-4d15-ba53-96eefd77252c</AddInId>
     8     <Name>WelcomeToRevit</Name>
     9     <FullClassName>WelcomeToRevit.Class1</FullClassName>
    10     <VendorId>NAME</VendorId>
    11   </AddIn>
    12 </RevitAddIns>
    View Code

    对比上个例子,有几点不同:
    <AddIn Type>标签由"Command"变成"Application",表明本插件是外部应用而不是外部命令。
    没有<Text>标签,这个标签对外部应用不起作用。
    增加<Name>标签,为插件指定一个名字,这个标签只用于外部应用。

    3.2 美化

    测试一下刚完成的插件,这次在“附加模块”里出现了独立的按钮,执行后弹出对话框,不过没有图片,看上去不够美观。接着我来个它添加图片。

    1、在本插件所在目录下建立一个文件夹,丢一个图片文件进去。

    2、在项目中添加引用WindowsBase、PresentationCore和System.Xaml(都是框架)。

    3、添加指令using System.Windows.Media.Imaging;

    4、在OnStartup函数里添加如下内容:
    Uri uri = new Uri(@"C: estWelcomeToRevitWelcomeToRevitinDebugimageswtr.png");
    BitmapImage bitmapImage = new BitmapImage(uri);
    pushButton.LargeImage = bitmapImage;
    也可以直接写成
    pushButton.LargeImage = new BitmapImage(new Uri(@"C: estWelcomeToRevitWelcomeToRevitinDebugimageswtr.png"));

    重新编译生成,执行后看到按钮有图片了。

    简单解释一下:
    Autodesk.Revit.UI的PushButton有个参数LargeImage用来定义按钮图片,但这个参数的类型是BitmapImage,不能直接接收Image类型,所以要通过Uri来转换。

    3.3 进阶

    其实上面的代码还是有缺陷的,就是把插件和按钮图片的路径在程序里写死了,这样很不灵活。所以我还要改一下。

    1、添加指令using System.Reflection;

    2、在定义按钮数据的语句前加上string thisAssemblyPath = Assembly.GetExecutingAssembly().Location;用以获取程序路径。

    3、把定义按钮数据的语句改成PushButtonData buttonData = new PushButtonData("cmdWelcomeToRevit","欢迎",thisAssemblyPath,"WelcomeToRevit.Class2");就是替换掉第三个参数。

    插件路径的问题解决了,再来看按钮图片的问题。小火车公布的源码用的是Replace方法,用图片文件名替换掉dll文件名,但它把dll文件名写死了,所以还是不够灵活,所以我用另一个方法。

    4、添加指令using System.IO;

    5、在定义Uri的语句前加上string imagePath = Path.GetDirectoryName(thisAssemblyPath) + @"imageswtr.png";

    6、把定义Uri的语句改成Uri uri = new Uri(imagePath, UriKind.RelativeOrAbsolute);

    最终代码如下:

     1 using System;
     2 using System.IO;
     3 using System.Reflection;
     4 using System.Windows.Media.Imaging;
     5 using Autodesk.Revit.DB;
     6 using Autodesk.Revit.UI;
     7 using Autodesk.Revit.Attributes;
     8 
     9 namespace WelcomeToRevit
    10 {
    11     public class Class1: IExternalApplication
    12     {
    13         public Result OnStartup(UIControlledApplication application)
    14         {
    15             RibbonPanel ribbonPanel = application.CreateRibbonPanel("演示");
    16 
    17             string thisAssemblyPath = Assembly.GetExecutingAssembly().Location;
    18             PushButtonData buttonData = new PushButtonData("cmdWelcomeToRevit","欢迎",thisAssemblyPath,"WelcomeToRevit.Class2");
    19             PushButton pushButton = ribbonPanel.AddItem(buttonData) as PushButton;
    20 
    21             pushButton.ToolTip = "欢迎来到Revit。";
    22 
    23             string imagePath = Path.GetDirectoryName(thisAssemblyPath) + @"imageswtr.png";
    24 
    25             Uri uri = new Uri(imagePath, UriKind.RelativeOrAbsolute);
    26             BitmapImage bitmapImage = new BitmapImage(uri);
    27             pushButton.LargeImage = bitmapImage;
    28             
    29             return Result.Succeeded;
    30         }
    31         public Result OnShutdown(UIControlledApplication application)
    32         {
    33             return Result.Succeeded;
    34         }
    35     }
    36 
    37     [Transaction(TransactionMode.ReadOnly)]
    38     public class Class2 : IExternalCommand
    39     {
    40         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    41         {
    42             TaskDialog.Show("RevitDemo", "Welcome To Revit!");
    43             return Result.Succeeded;
    44         }
    45     }
    46 }
    View Code

    3.4 总结

    本例主要有如下知识点:

    1、外部应用类型插件的基本写法和相应配置文件的基本写法。

    2、在“附加模块”选项卡里添加按钮。

    3、给按钮添加图片。

    4、使用相对路径。

  • 相关阅读:
    有关linux查看的命令 及本机yum创建
    linux系统命令1
    手机百度网盘加群方法
    百度网盘保存超限解决办法
    c#委托、泛型委托和匿名方法
    值类型和引用类型的总结
    SQL数据查询语句(一)
    c# Invoke和Begininvoke区别
    c#public、private、protected、internal、protected internal修饰符及访问权限
    C#之打印乘法表
  • 原文地址:https://www.cnblogs.com/bimer/p/7503903.html
Copyright © 2011-2022 走看看