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

版权声明:本文为转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接

一、本节课程

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

二、本节要讲解的知识点

Revit API的概述、基础以及第一个应用程序

  • 具体内容

0.0了解Revit和Revit API

Revit三维、附加信息的三维模型

Revit API :应用程序开发接口,Application Programming Interface ,使用.NET相关的语言来编程,VB.NET C# C++/CLI,F#。

建议进行Revit 二次开发编程之前熟悉一下Revit产品。

帮助你设计与Rebvit 产品一直的软件界面、快速理解API中的类和成员、指导不用Revit API 编程,Revit提供了哪些功能。

0.1 Revit API可以做什么

访问模型的图形数据。

访问模型的参数数据。

创建、修改、删除模型元素。

创建插件UI进行增强。

创建插件完成对重复自有工作的自动化。

集成第三个程序。

执行一切种类的BIM分析。

如何自动创建项目文档。

1、第一个应用程序Hello World

  1. Create a new project
    选择新建项目中的C#–类库,建立项目名称为“HelloWorld”。
    (2)Add Reference
    1)在Revit安装路径中添加RevitAPI.dll。
    2)添加引用后,右键选择 RevitAPI.dll属性,将复制本地种的true改为false。
    3)RevitAPIUI.dll 按以上步骤添加。
image

(3)Add Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;

namespace HelloWorld
{     [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class Class1 : IExternalCommand
    {
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData revit, ref string message, ElementSet elements)
        {
            TaskDialog.Show("Revit", "Hello World");
            return Autodesk.Revit.UI.Result.Succeeded;
        }
    }
}
  1. Build the Program
    (5)Create a .addin manifest file
    在C#中新建一个文本文件,将代码写入
<?xml version="1.0" encoding="utf-8" standalone="no"?>
 <RevitAddIns>
<Assembly>E:\C#\sample\HelloWorld\HelloWorld\bin\Debug\HelloWorld.dll</Assembly>
<AddIn Type=”Command”>
//此处的HelloWorld.dll在项目生成后才会有,开始看不到
<AddInId>239BD853-36E4-461f-9171-C5ACEDA4E721</AddInId>
 //此处的ID在解决方案管理器项目中Properties的AssemblyInfo.cs中可以查看
 <FullClassName>HelloWorld.Class1</FullClassName>
 //此处的HelloWorld为项目名,Class1为类名
<Text>HelloWorld</Text>
<VendorId>ADSK</VendorId>
<VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
</AddIn>
</RevitAddIns>
  1. 将文本格式保存在.addin格式,并保存在C:\ProgramData\Autodesk\Revit\Addins\2018(2018为目前revit的版本)
    注:C:\ProgramData为隐藏文件,若要显示,步骤如下:
    组织–文件夹和搜索选项–查看–显示隐藏的文件、文件夹和驱动器
  2. Debug the Add-in
    在解决方案资源管理器中,将项目的内容展示出来,点击其中的Properties,窗口会出现。
Properties

击其中的调试(Debug),选择启动外部程序,将revit.exe的路径写出来即可。

最后进行调试,调试时会自动开启revit软件,在添加外部工具中可找到helloworld。

2、外部命令和外部应用

RevitAPI.dll程序集包括了访问Revit中DB级别的Application、Document、Element、以及Parameter方法。RevitAPIUI.dll包括了所有操作和定制Revit UI的接口,包括了:IExternalCommand、IExternalApplication、Selection、菜单RibbonPanel、RibbonItem、以及其子类。想通过API 来访问或扩展Revit,需要用户在自己的插件中实现特殊的接口,就是IExternalCommand、IExternalApplication、IExternalDBApplication。

3、IExternalCommand外部命令

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

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

 //
    // 摘要:
    //     An interface that should be implemented to provide the implementation for a Revit
    //     add-in External Command.
    //
    // 备注:
    //     To add an external command to Autodesk Revit the developer should implement an
    //     object that supports the IExternalCommand interface.
    public interface IExternalCommand
    {
        //
        // 摘要:
        //     Overload this method to implement and external command within Revit.
        //
        // 参数:
        //   commandData:
        //     An ExternalCommandData object which contains reference to Application and View
        //     needed by external command.
        //
        //   message:
        //     Error message can be returned by external command. This will be displayed only
        //     if the command status was "Failed". There is a limit of 1023 characters for this
        //     message; strings longer than this will be truncated.
        //
        //   elements:
        //     Element set indicating problem elements to display in the failure dialog. This
        //     will be used only if the command status was "Failed".
        //
        // 返回结果:
        //     The result indicates if the execution fails, succeeds, or was canceled by user.
        //     If it does not succeed, Revit will undo any changes made by the external command.
        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的数据都可以通过这个参数直接或者间接的取到。

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上。

Error

(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会把外部命令所做的所有操作和修改都撤销。

    // 摘要:
    // Informs Autodesk Revit of the status of your application after execution.
    public enum Result
    {
        //
        // 摘要:
        //     The external application was unable to complete its task.
        Failed = -1,
        //
        // 摘要:
        //     The external application completed successfully. Autodesk Revit will keep this
        //     object during the entire Revit session.
        Succeeded = 0,
        //
        // 摘要:
        //     Signifies that the external application is cancelled.
        Cancelled = 1
    }

4、IExternalApplication外部应用

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

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

    // 摘要:
    //     An interface that supports addition of external applications to Revit.
    //
    // 备注:
    //     External applications are permitted to customize the Revit UI, and to add events
    //     and updaters to the session.
    public interface IExternalApplication
    {
        //
        // 摘要:
        //     Implement this method to execute some tasks when Autodesk Revit shuts down.
        //
        // 参数:
        //   application:
        //     A handle to the application being shut down.
        //
        // 返回结果:
        //     Indicates if the external application completes its work successfully.
        Result OnShutdown(UIControlledApplication application);
        //
        // 摘要:
        //     Implement this method to execute some tasks when Autodesk Revit starts.
        //
        // 参数:
        //   application:
        //     A handle to the application being started.
        //
        // 返回结果:
        //     Indicates if the external application completes its work successfully.
        Result OnStartup(UIControlledApplication application);
    }

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

  1. 数据库DB级别的外部应用

数据库DB级别的外部应用:它用于一般事件的处理。

   //
    // 摘要:
    //     An interface that supports addition of DB-level external applications to Revit,
    //     to subscribe to DB-level events and updaters.
    //
    // 备注:
    //     DB-level applications are permitted to add DB-level events and updaters to the
    //     session. They cannot create or modify UI.

    public interface IExternalDBApplication
    {
        //
        // 摘要:
        //     Implement this method to execute some tasks when Autodesk Revit shuts down.
        //
        // 参数:
        //   application:
        //     Handle to the Revit Application object.
        //
        // 返回结果:
        //     Indicates if the external db application completes its work successfully.
        ExternalDBApplicationResult OnShutdown(ControlledApplication application);
        //
        // 摘要:
        //     Implement this method to execute some tasks when Autodesk Revit starts.
        //
        // 参数:
        //   application:
        //     Handle to the Revit Application object.
        //
        // 返回结果:
        //     Indicates if the external db application completes its work successfully.
        //
        // 备注:
        //     Typically, event handlers and updaters are registered in this method.
        ExternalDBApplicationResult OnStartup(ControlledApplication application);
    }

6、addin文件

(1)注册

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

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

<Assembly>*****</Assembly>放置我们的开发的插件.DLL的路径;

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

<FullClassName>HelloWorld.Class1</FullClassName> 类的全名:命名空间.类名。

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

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
   <AddIn Type="Command">     <Assembly>C:\RevitProject\HelloWorld\HelloWorld\bin\Debug\HelloWorld.dll</Assembly>
      <AddInId>619fa21b-37c6-4efb-b886-91c24e30d13b</AddInId>
      <FullClassName>HelloWorld.Class1</FullClassName>
      <Name>HelloWorld</Name>
      <VendorId>ADSK</VendorId>
      <VendorDescription>Autodesk, www.autodesk.com</VendorDescription> 
   </AddIn>
<AddIn Type="Command">
   ....... 
   </AddIn>
<AddIn Type="Command">
   ....... 
   </AddIn>
</RevitAddIns>

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

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
   <AddIn Type="Application">
      <Assembly>C:\Program Files\Autodesk\Revit 2018\RevitLookup.dll</Assembly>
      <ClientId>356CDA5A-E6C5-4c2f-A9EF-B3222116B8C8</ClientId>
      <FullClassName>RevitLookup.App</FullClassName>
      <Name>Revit Lookup</Name>
      <VendorId>ADSK</VendorId>
      <VendorDescription>Autodesk, www.autodesk.com</VendorDescription>  
   </AddIn>
</RevitAddIns>

(4****)DB****级别的外部应用

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
   <AddIn Type="DBApplication">
      <Assembly>C:\Program Files\Autodesk\Revit 2018\RevitLookup.dll</Assembly>
      <ClientId>356CDA5A-E6C5-4c2f-A9EF-B3222116B8C8</ClientId>
      <FullClassName>RevitLookup.App</FullClassName>
      <Name>Revit Lookup</Name>
      <VendorId>ADSK</VendorId>
      <VendorDescription>Autodesk, www.autodesk.com</VendorDescription>       
   </AddIn>
</RevitAddIns>

7、Transaction

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

TransactionMode,控制Revit API框架如何在调用外部命令时处理其中的事务。

 public enum TransactionMode

    {
        //
        // 摘要:
        //     The API framework will not create a transaction (but will create an outer group
        //     to roll back all changes if the external command returns a failure status). Instead,
        //     you may use combinations of transactions, sub-transactions, and groups. You will
        //     have to follow all rules regarding use of transactions and related classes. You
        //     will have to give your transactions names, which will then appear in the undo
        //     menu. Revit will check that all transactions (also groups and sub-transaction)
        //     are properly closed upon return from an external command. If not, it will discard
        //     all changes to the model.
        Manual = 1,
        //
        // 摘要:
        //     No transaction (nor group) will be created, and no transaction may be created
        //     for the lifetime of the command. The External command may use methods that only
        //     read from the model, but not methods that write anything to it. Exceptions will
        //     be thrown if the command either tries to start a transaction (or group) or attempts
        //     to write to the model.
        //
        // 备注:
        //     A command with this transaction mode should not be associated to a command visible
        //     when there is no active document. The command will not be permitted to be started.
        ReadOnly = 2
    }

四、总结

1、Revit插件的三种实现方式:外部命令、外部应用和DB级别的外部应用。
2、三种插件的addin文件的写法。
3、写出Revit API 的HelloWorld程序。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容