• 外部命令
通过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 当前气象站名

转载于:https://www.cnblogs.com/fields/p/10879751.html

Revit二次开发 外部命令和外部应用相关推荐

  1. Revit 二次开发---用命令绘制墙体预设置定位线

    绘制墙之前要预先设置"定位线"(我是调用的Revit命令去画墙), 首先是预设置"定位线": 直接在百度上搜索"Revit 预设值定位线", ...

  2. Revit二次开发有几种方式?做Revit二次开发的必看!

    Revit二次开发有三种方式:外部命令(IExternalCommand).外部应用(IExternalApplication)和宏(Macro).下面将简要说明外部应用.宏的开发过程,并着重说明外部 ...

  3. Revit二次开发5、外部事件(ExternalEvent)

    Revit二次开发5.外部事件(ExternalEvent) 外部事件ExternalEvent简介 事件 外部事件 实现步骤 外部事件的实现 实现IExternalEventHandler接口 Ex ...

  4. Revit二次开发之使用外部程序集DT_Mgd读取CAD图遇到的问题

    Revit二次开发学习笔记(一) 最近学习在revit中读取链接的CAD图纸信息(包括文字.图层.各种线型),由于小白也是初学者,遇到了一些问题,如图所示: 通过大量查阅参考资料发现,问题是:在类库项 ...

  5. python revit二次开发_Revit怎么二次开发?Revit开发问题汇总

    现如今Revit软件还无法满足所有领域的工作需求,然而其二次开发技术能够适应用户个性化的定制要求,来扩展软件功能或对其功能进行修正. 为了更大程度上方便二次开发,开发商将集成的数据库函数封装到Revi ...

  6. Revit二次开发2、RevitAPI、RevitAPIUI及Revit开发三大利器

    Revit二次开发2.开发基础之--RevitAPI.RevitAPIUI及Revit开发三大利器 RevitAPI.dll RevitAPIUI.dll Revit开发三大利器 外部命令(IExte ...

  7. C# Revit二次开发基础/核心编程--- Application\Document\Transaction

    一.本节课程 C# Revit二次开发基础/核心编程--- Application\Document\Transaction 二.本节要讲解的知识点 Application\Document\Tran ...

  8. Revit二次开发01——环境搭建(附Revit 2018 + Visual Studio 2017下载地址)

    目录 1.准备工作 1.1 安装Revit 2018 1.2 安装Revit 2018 SDK 1.3 安装Visual Studio 2017 2.配置Addin Manager 3.测试 3.1 ...

  9. Revit二次开发教程提纲

    本文提供Revit二次开发教程提纲,教程内容包括下列部分 前言--BIM开发需要用到的技术 .NET及C#的基本介绍 1.1 基本语法 1.2 版本介绍 1.3 Visual Studio 1.4 C ...

最新文章

  1. Highmaps网页图表教程之数据标签与标签文本
  2. ubuntu 查看串口,设置串口权限
  3. mysql提示符prompt的用法
  4. 微信小程序访问云数据库
  5. java登陆session用法_Java web 登录 使用shiro和基于session的方式有何不同?
  6. 低学历的人就不能创业了吗?
  7. leetcode 321 Create Max Number
  8. IbatiS关联字段映射
  9. keras + tensorflow —— 使用预训练模型
  10. 数的分解、分解质因数
  11. 漫画Linux 并发、竞态、互斥锁、自旋锁、信号量
  12. 射击类游戏html代码,超简单射击游戏
  13. 网聚云联受邀出席5G和边缘计算高峰论坛,与清华研究院达成战略合作
  14. WDN302国产化网络存储控制模块
  15. young GC和Full GC的区别、什么时候触发young gc和Full GC、如何优化GC
  16. 解决更新页面数据回显时时间不匹配问题:The specified value “Fri Nov 05 08:00:00 CST 2021“ does not conform to the requir
  17. SEO具体是怎么优化的?
  18. 计算机与软件学院在北辰校区的东区还西区,如何坐公交 或 地铁去天津的河北工业大学北辰校区教师公寓-45号楼| Moovit...
  19. 汽车保养知识知多少?这篇文章让你秒懂
  20. 信息管理导论川大667 | 第二章核心知识点

热门文章

  1. 万字干货!核心用户获取和运营策略
  2. 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止;
  3. Zlib库的使用实现对zip文件的解压缩
  4. 【python】分苹果
  5. android无法启动守护进程,Android Studio无法启动守护进程异常怎么解决?
  6. linux shell 判断一个文件是不是链接文件
  7. 网新恒天php,网新恒天,为德邦快递插上数字化翅膀
  8. 天不怕,地不怕,就怕李佳琦的“OMG,太好看了吧!”
  9. 优化Hexo性能,使用hexo-neat插件压缩页面,大幅度提升页面性能和响应速度
  10. gel文件的作用——摘自百度