C# Revit二次开发基础/核心编程--- IExternalCommand/IExternalApplicaiton

一、本节课程
C# Revit二次开发基础/核心编程--- IExternalCommand/IExternalApplicaiton

二、本节要讲解的知识点

    IExternalCommand/IExternalApplicaiton帮助入门的案例

  • 具体内容

1、IExternalCommand外部命令

(1)基本原理:如果Revit没有其他命令在调用,或者是没有处于编辑模式,ExternalCommand会被激活。一旦插件被选中,外部命令对象就会被创建出来,并且执行Execute函数。执行完毕后,外部命令对象就被销毁。在两个命令之间数据不能保存在对象中,要通过其他方式来保存。

(2)IExternalCommand,用户通过外部命令来拓展功能的话,必须实现这个接口。重载Execute函数。作为外部命令的主函数来调用。

    public interface IExternalCommand

    {

        Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements);

    }

 

   public Autodesk.Revit.UI.Result Execute(ExternalCommandData revit, ref string message, ElementSet elements)

        {

            TaskDialog.Show("Revit", "Hello World");

            return Autodesk.Revit.UI.Result.Succeeded;

        }

(3)输入参数 ExternalCommandData

包含了外部命令所需要的Application以及一些视图的引用。在外部命令中,所有的Revit的数据都可以通过这个参数直接或者间接的取到。Application和Document是处于最顶层的,主要分为Application、UIApplication、Document、UIDocument这几个大类。

UIApplication uiApplication =revit.Application;

Application application=uiApplication.Application;

UIDcument uiDocument=uiApplication.ActiveUIDocument;

Document document=uiDocument.Document;

(4)输出参数message

外部命令可以通过这个参数返回执行过程中的错误信息。这个参数作用于整个外部命令的执行过程,用户可以在外部命令执行过程中的任何时候给这个信息设值或者追加信息。当外部命令的Execute函数返回Autodesk.Revit.UI.Result.Failed或者Autodesk.Revit.UI.Result.Canceled,这个错误信息将被显示在UI上。

C# Revit二次开发基础/核心编程--- IExternalCommand/IExternalApplicaiton_第1张图片

(5)输出参数elements(ElementSet

当外部命令返回Autodesk.Revit.UI.Result.Failed或者Autodesk.Revit.UI.Result.Canceled并且message参数不为空的时候,错误或者警告对话框会弹出来,点击上面的显示按钮,elements参数中的元素将被高亮显示。

(6)Execute函数的返回值

表示外部命令的执行状态,有三种情况:Autodesk.Revit.UI.Result.Succeeded,Autodesk.Revit.UI.Result.Failed或者Autodesk.Revit.UI.Result.Canceled

如果返回不是Succeeded ,那么Revit会把外部命令所做的所有操作和修改都撤销。

  

    public enum Result

    {

        Failed = -1,

        Succeeded = 0,

        Cancelled = 1

    }

2、IExternalApplication外部应用

插件开发者同样可以通过IExternalApplication来添加自己的应用,Revit同样通过.addin文件来识别和加载IExternalApplication的外部插件。

IExternalApplication接口有两个抽象函数OnStartup和OnShutdown。用户可以通过在实现了IExternalApplication的外部应用中重载OnStartup和OnShutdown函数,在Revit启动和关闭的时候定制所需要的功能。

 

    public interface IExternalApplication

    {

        Result OnShutdown(UIControlledApplication application);

        Result OnStartup(UIControlledApplication application);

    }

 

参数 UIControlledApplication :提供了访问定制UI和注册事件的方法。

3、addin文件

(1)注册

windows 7用户,如果希望所有登录用户都可以使用的话,要把.addin文件放在C:\ProgramData\Autodesk\Revit\Addins\2018\,三种方式的插件它的addin文件是有区别的。

(2)外部命令的addin文件示例

 *****放置我们的开发的插件.DLL的路径;

619fa21b-37c6-4efb-b886-91c24e30d13b从解决方案的AssemblyInfo.cs里面的[assembly: Guid("619fa21b-37c6-4efb-b886-91c24e30d13b")]获取。

 HelloWorld.Class1 类的全名:命名空间.类名

一个.addin文件可以包含过个插件。

   Command">

     C:\RevitProject\HelloWorld\HelloWorld\bin\Debug\HelloWorld.dll

      619fa21b-37c6-4efb-b886-91c24e30d13b

      HelloWorld.Class1

      HelloWorld

      ADSK

      Autodesk, www.autodesk.com       

  

   ....... 

  

   ....... 

  

(3)外部应用类型的addin文件

   Application">

      C:\Program Files\Autodesk\Revit 2018\RevitLookup.dll

      356CDA5A-E6C5-4c2f-A9EF-B3222116B8C8

      RevitLookup.App

      Revit Lookup

      ADSK

      Autodesk, www.autodesk.com       

  

(4)DB级别的外部应用

   DBApplication">

      C:\Program Files\Autodesk\Revit 2018\RevitLookup.dll

      356CDA5A-E6C5-4c2f-A9EF-B3222116B8C8

      RevitLookup.App

      Revit Lookup

      ADSK

      Autodesk, www.autodesk.com       

  

4、Hello Revit

(1)新建一个项目:

(2)添加引用:RevitAPI.dll   RevitAPIUI.dll  ;记得把复制本地属性改成false。

(3)编写代码:新建一个类实现了IExternalCommand接口,并且必须重载里面的函数Execute函数,在函数里面实现你想要实现的功能。

(4)给实现接口的类添加一个属性。

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]

(5)编译代码就生成的HelloRevit.dll。有两种方式使用:写一个addin文件;直接应用addinmanger这个工具来加载。

C# Revit二次开发基础/核心编程--- IExternalCommand/IExternalApplicaiton_第2张图片

(6)怎样调试我们编写的程序:附加外部程序,跟调试AUTOCAD的二次开发插件类似。

5、将Hello Revit添加到选项卡

(1)在HelloRevit项目中添加一个类叫做:CsAddpanel,并实现IExternalApplication接口,重载接口的函数:OnShutdown、OnStartup,代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Media.Imaging;

using Autodesk.Revit.UI;

using Autodesk.Revit.DB;

namespace HelloRevit

{

    public class CsAddpanel:Autodesk.Revit.UI.IExternalApplication

    {

        public Result OnShutdown(UIControlledApplication application)

        {

            return Result.Succeeded;

        }

        public Result OnStartup(UIControlledApplication application)

        {

            //添加一个新的Ribbon面板

            RibbonPanel ribbonPanel = application.CreateRibbonPanel("NewRibbonPanel");

            PushButton pushButton=ribbonPanel.AddItem(new PushButtonData("HelloRevit","HelloRevit", @"C:\RevitProject\HelloRevit\HelloRevit\bin\Debug\HelloRevit.dll","HelloRevit.Class1"))as PushButton;

            Uri uriImage = new Uri(@"C:\RevitProject\HelloRevit\HelloRevit\bin\Debug\logo.png");

            BitmapImage largeImage = new BitmapImage(uriImage);

            pushButton.LargeImage = largeImage;

            return Result.Succeeded;

        }

    }

}

2、addin文件:

  

      C:\RevitProject\HelloRevit\HelloRevit\bin\Debug\HelloRevit.dll

      cc4440d2-bc4f-481b-acd5-d1dfcc89f10e

      HelloRevit.CsAddpanel

      HelloRevit

      ADSK

      Autodesk, www.autodesk.com  

  

  

3、重新启动Revit,效果如下:

C# Revit二次开发基础/核心编程--- IExternalCommand/IExternalApplicaiton_第3张图片

四、总结

1、外部命令、外部应用的实际案例。

2、写出Revit插件命令,添加Ribbon按钮。

你可能感兴趣的:(Revit二次开发,Revit,BIM,二次开发,外部应用,外部命令)