Revit二次开发 外部命令和外部应用

  • 外部命令
通过IExternalCommand来添加自己的应用。Revit通过.addin文件来识别和加载外部插件
 
基本原理
Revit没有其他命令在运行或者没有处于编辑模式,那么已经注册了的外部命令(ExternalCommand)就可以被激活。插件被选中,外部命令对象将被创建出来,并且执行Execute函数。执行完毕,外部命令对象被销毁。
 
IExternalCommand是RevitAPI用户通过外部命令来扩展开发是必须实现的接口。IExternalCommand接口里面只有一个抽象函数Execute,重载这个函数来实现IExternalCommand。Execute有三个参数:输入参数commandData(ExcternalCommandData)、输出参数messamg(String)、输出参数elements(ElementSet)。
public interface IExternalCommand
{
public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements);
}
 
commandData(ExternalCommandData)
ExternalCommandData对象包含了外部命令所需要的Application以及一些视图的引用。在外部命令中,所有的Revit的数据都可以直接或者间接的获取到。
 
ExternalCommandData中的属性
属性
Application(Autodesk.Revit.UI.UIApplication)  用于表示适用于当前外部命令的Appliacation对象
View(Autodesk.Revit.DB.VIew)  用于表示当前外部命令起作用的视图对象
JournalData(IDictionary<String,String>)  用于在Revit Journal文件中读写的数据字典,只要应用与做自动化测试与外部命令交互使用。
 
message(String)
外部命令可以通过这个参数返回执行信息。用户可以在外部命令执行过程中的任何时候给这个参数设值或者追加信息。外部命令的Execute函数返回Autodesk.Revit.UI.Result.Failed或者Autodesk.Revit.UI.Result.Canceled,这个信息才会被显示在UI上。
 
elements(ElementSet)
外部命令返回Autodesk.Revit.UI.Result.Failed或者Autodesk.Revit.Result.Canceled并且message参数不为空的时候,错误或者警告对话框会弹出来,点击上面的显示按钮,elements参数中的元素将会被高亮显示。
 
Result(返回值)
Result返回值有三种:Result.Succeeded、Result.Failed、Result.Canceled。当命令部队Succeeded,那么Revit就会把此外部命令进行的所有操作撤销。
 
 
 
  • 外部应用
插件开发者可以通过实现IExternalApplications来添加自己的应用。Revit同样通过.addin文件来识别和加载实现IExternalApplication的外部插件。
IExternalApplication接口有两个抽象函数OnStartup和OnShutdown,参数都是UIControlledApplication类型。用户可以通过实现了IExternalApplication的外部应用中重载Onstartup和OnShutdown函数,在Revit启动或者关闭是定制所需的功能。
UIControlledApplication类是一种特殊的应用类,不提供访问Revit文档的途径。UIControlledApplication只在OnStartup和OnShutdown函数范围内起作用,在这个作用于区间内用户无法获得Revit文档。UIControlledApplicatiion类提供访问定制UI和注册时间的方法。
public Autodesk.Revit.UI.Result OnStarup(UIControlledApplication application)
{
//添加一个新的ribbon面包
RibbonPanel ribbonPanel = application.CreateRibbonPanel("NewRibbonPanel");
//在新的Ribbon面板上添加一个按钮
//点击这个按钮,调用Hello World 实例
PushButton pushButton = ribbonPanel.AddItem(new PushButtonData("HelloRevit","HelloRevit",@"c:\Projects\HelloRevit.dll","helloRevit.Class1")) as PushButton;
return Result.Succeeded;
}
 
Public Result OnShutdown(UIControlledApplication application)
{
//UI定制不需要特别在OnShutdown方法中处理
return Result.Succeeded;
}
 
数据库(DB)级别的外部应用
数据库级别的外部应用与一般外部应用不同的是,她没有提供任何访问RevitUI的就看,它一般用于事件处理,插件开发者可以同过实现IExternalDBAoolication来添加所需的DB基本的外部应用。
 
外部应用注册
如果想在Revit中调用插件,需要对插件进行注册。Reit通过后缀名为 .addin的文件(XML格式)来实现注册。
(1)如果希望该插件只有当前用户可以使用,需要将文件放入:
c:\Users\<user>\AppData\Roaming\Autodesk\Revit\Addins\20XX\
(2)如果希望所有用户都可以使用,需要将文件放入:
c:\ProgramData\Autodesk\Revit\Addins\20XX\
 
addin文件中的XML标签
Assembly 指定插件程序集的全路径。每个ExternalCommand和ExternalApplication都必须有这个值
FullClassName 指定实现了IExternalCommand或者IExternalApplication接口的插件程序集的类名。需要完整的命名空间,每个ExternalCommand和ExternalApplication都必须有这个值
AddInId 指定一个全局的GUID值。每一个插件都需要有一个GUID值,并且在一个Revit会话中,这个GUID值是唯一的。在插件中可以通过UIApplication.ActiveAddInId属性获取到.Addin文件中对应插件的GUID值
Name 为插件指定一个名字。只有类型为ExternalApplication的插件需要这个标签
Text 为插件指定一个在”附加模块“选项卡中显示的名字。类型为ExternalCommand的插件可以指定这个值
Description 为插件提供一段简介。类型为ExternalCommand的插件需要这个标签
VisibilituMode 为插件指定可见属性。类型为ExternalCommand的插件需要这个标签
Discipline 为插件指定在哪个产品可见。默认都可见。类型为ExternalCommand的插件需要这个标签
LargeImage 为插件设置在外部工具下啦菜单中显示的大图标。默认不显示。类型为ExternalCommand的插件需要这个标签
SmallImage 为插件设置在快速访问工具条中显示的小图标。类型为ExternalCommand的插件需要这个标签
LongDescription 为插件提供一段长的描述,这段描述将作为按钮的提示文本的扩展部分。类型为ExternalCommand的插件需要这个标签
TooltipImage 为插件的提示文本提供一个图片,当鼠标在这个外部命令上停留时显示。类型为ExternalCommand的插件需要这个标签
LanguageType 为插件设置语言种类。
AllowLoadIntoExistingSession 将该标签设置为false将阻止Revit不重启就自动加载到 .addin文件里面的插件。默认不重启自动加载新加入到.addin文件里面的插件
VendorId 改标签标明插件的插件提供商名称。
VendorDescription 插件提供商的描述。
 
属性
RevitAPI提供了多种属性方便用户配置自己的ExternalCommand和ExternalApplication的行为。
Transaction属性
用户必须在实现IExternalCommand接口时指定外面命令使用的TransactionMode属性。
该属性没有默认值,用户必须显示地指定。该属性控制RevitAPI矿建如何在调用外面命令时处理其中的事务(Transaction)。下面是RevitAPI支持的Transaction属性模式。
属性设置例如
[Transaction(Autodesk.Revit.Attributes.TransactionMode.Automatic)]
public class Hello : IExternalCommand
{
}
1)TransactionMode.Automatic:Revit会在调用外部命令之前自动创建一个Transaction,会在外面命令结束时提交或者回滚(成功提交,异常回滚)。该模式下外部命令不能创建自己的Transaction,但是可以创建SubTransactions。
2)TransactionMode.Maanual:在该模式下Revit不会自动创建Transaction。如过用户需要修改Revit模型,则需要在自己的外部命令中来创建自己的Transaction,并且自建管理这个Transaction提交还是回滚。
3)TransactionMode.ReadOnly:在该模式下外部命令不能有任何的Transaction。外部命令只能读取Revit模型。在该模式下试图创建任何Transaction或者修改Revit模型,都将抛出异常。
上述三种TransactionMode都只在活动文档范围内有效。
 
Journaling属性
Journaling属性是一个可选属性,用户可以自行选择使用或者不使用。该属性控制Revit Journal文件在执行外部命令过程中的行为。
属性设置例如
[Journaling(JournalingMode.NoCommandData)]
public class Hello : IExternalCommand
{
}
1)JournalingMode.NoCommandData:使用该模式,Revit将不会把ExternalCommandData.JournalData的内容写到Revit Journale中。
2)JournalingMode.,UsingCommandData:使用该模式,Revit使用IDictionary<String.String>格式把ExternalCpmmandData.JournalData的内容写到Revit Journale中。默认属性
 
 
  • Revit应用类和文档类(Application/Document)
Revit与office一样,使用多文档模式。在RevitAPI的类结构中,应用类的和文档类是处于最顶层的。他们主要分为Application、UIApplication、Document和UIDocument这几大类。
一个Revit应用对象对应一个独立的Revit会话。用户可以通过这个对象访问Revit文档、选项以及其他应用范围的数据和设置。
1)Autodesk.Revit.UI.UIApplication:提供访问UI级别接口的应用类,包括访问用户界面RibbonPanels、获得用户界面的活动文档等能力。
2)Autodesk.Revit.ApplicationServies.Application:提供访问其他应用级别内容接口的应用类。
一个Revit文档对象对象一个独立的Revit工程文件。Revit可以同时有多个工程打开,每个工程可以有多个视图。
1)Autodesk.Revit.UI.UIDocument:提供访问UI级别接口的文档类,比如提供Selectiong来表示拥护界面的选择集。
2)Autodesk.Revit.DB.Document:提供访问替他文档基本内容的文档类。
如果有多文档打开,那么处于最顶层或者活动的视图所在的工程或者文档就是活动文档。
 
Revit应用类
Revit应用类主要分为UIApplication和Application两大类。
RevitAPI分为UIControlledApplication和ControlledApplication。这两类Application是对UIApplication和Application的进一步封装,用户无法通过这两个应用类访问Revit文档。但是可以实现UI定制和一些事件处理。
Application表示一个Revit应用,提供对文档、选项以及其他应用范围的数据的访问和设置。 用户可以通过IExternalCommand的Execute函数中的ExternalCommandData来获取Application对象。例如:Autodesk.Revit.ApplicationSerbices.Application app = commandData.Application.Application;
Revit提供了共享参数机制。Application类中的OpenSharedParameterFile()方法可以用来访问共享参数文件。Application中的SharedParametersFilename属性提供了共享参数文件的名称。
获取UIApplication对象。用户可以通过IExternalCommand的Excute函数中的ExternalCommandData来获取UIApplication对象,例如:
Autodesk.Revit.UI.UIApplication uiApp = commandData.Application;
UIApplication提供了ActiveAddInId属性来获取当前活跃的外部命令或者外部应用的ID,同属UIApplication也提供了LoadedApplications属性来返回一个成功加载插件的列表。
UIApplication提供了创建自定义Ribbon面板和控件的方法。
 
文档类
Revit文档类主要分为UIDocument和Document两类
Document类用于表示打开的Revit工程。打开多个工程即同时拥有多个Document对象。对象用于存储Revit的元素、管理视图和数据。
Document类提供了SiteLoctaion属性来渠道项目地理位置信息。每个工程应该有一个场地信息来表示这个工程位于什么位置。下面是SiteLocation类的属性
Elevation 当前海拔位置
Latitude 当前维度
Longitude 当前经度
PlaceName 当前地名
TimeZone 当前时区
WeatherStationName 当前气象站名
 
 

猜你喜欢

转载自www.cnblogs.com/fields/p/10879751.html
今日推荐