IExternalCommand/IExternalApplicaiton帮助入门的案例
(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上。
(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 } |
插件开发者同样可以通过IExternalApplication来添加自己的应用,Revit同样通过.addin文件来识别和加载IExternalApplication的外部插件。
IExternalApplication接口有两个抽象函数OnStartup和OnShutdown。用户可以通过在实现了IExternalApplication的外部应用中重载OnStartup和OnShutdown函数,在Revit启动和关闭的时候定制所需要的功能。
public interface IExternalApplication { Result OnShutdown(UIControlledApplication application); Result OnStartup(UIControlledApplication application); } |
参数 UIControlledApplication :提供了访问定制UI和注册事件的方法。
(1)注册
windows 7用户,如果希望所有登录用户都可以使用的话,要把.addin文件放在C:\ProgramData\Autodesk\Revit\Addins\2018\,三种方式的插件它的addin文件是有区别的。
(2)外部命令的addin文件示例
一个.addin文件可以包含过个插件。
.......
.......
|
(3)外部应用类型的addin文件
|
(4)DB级别的外部应用
|
(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这个工具来加载。
(6)怎样调试我们编写的程序:附加外部程序,跟调试AUTOCAD的二次开发插件类似。
(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文件:
|
3、重新启动Revit,效果如下:
1、外部命令、外部应用的实际案例。
2、写出Revit插件命令,添加Ribbon按钮。