踏上Revit二次开发之路 2 从“HelloWorld”入手

2 从“HelloWorld”入手

在欧特克的官方网页上有个叫《My First Plug-in Training》的项目,号称可以让一个完全没有编程基础的人照着做出一个插件来。我快速浏览了一下,觉得这个例子还是太复杂了,虽然一步一步依葫芦画瓢能做出来,但最后能有多少收获就不好说了。所以,我决定还是先参考官方在线帮助的例子,从大家都喜闻乐见的“HelloWorld”入手,自己摸索一下。

2.1 先来看下具体步骤

1、启动Visual Studio,新建项目,在“模板”里选择“Visual C#”→“类库”,在下方的名称栏填上HelloWorld。好了以后点确定,可以看到程序自动生成了相关的代码。

2、添加引用,在引用管理器中选择“浏览”,在Revit安装目录下找到RevitAPI.dll和RevitAPIUI.dll,把这两个文件分别添加到项目中。然后记得把上述两个引用的“复制到本地”属性改为False,否则你编译会生成一大堆没什么用的东西。因为我们做的是插件,不可能脱离Revit程序本身来运行的。

3、把默认生成的“using……”代码块只留下
using System;
在后面加上
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

4、在默认生成的public class Class1{}前面加上
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]

5、把默认生成的public class Class1{}改成
public class Class1: IExternalCommand{}

6、在public class Class1: IExternalCommand{}内部添加
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { }

7、在public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { }内部添加
TaskDialog.Show("Demo", "Hello World!");
return Result.Succeeded;

8、完成的代码应该是这个样子:

 1 using System;
 2 using Autodesk.Revit.DB;
 3 using Autodesk.Revit.UI;
 4
 5 namespace HelloWorld
 6 {
 7     [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
 8     public class Class1: IExternalCommand
 9     {
10         public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
11         {
12             TaskDialog.Show("Demo", "Hello World!");
13             return Result.Succeeded;
14         }
15     }
16 }

9、保存全部文件。在项目属性里把“生成”→“目标平台”由Any CPU改成x64(省略这步的话编译时会出现警告)。检查无误后生成类库,并记下输出窗口中的文件位置。

10、添加一个文本文件,输入以下内容:

 1 <?xml version ="1.0" encoding ="utf-8" standalone ="no"?>
 2 <RevitAddIns>
 3   <AddIn Type="Command">
 4     <Assembly>{类库的路径(含文件名)}</Assembly>
 5     <AddInId>{Guid}</AddInId>
 6     <FullClassName>HelloWorld.Class1</FullClassName>
 7     <Text>HelloWorld</Text>
 8     <VendorId>NAME</VendorId>
 9   </AddIn>
10 </RevitAddIns>

注意第4行和第5行都要根据实际情况填写。第4行就是上一步记下的文件位置,第5行可以在ssemblyInfo.cs文件里找到。

11、把这个文本文件重命名为“HelloWorld.addin”,复制到Revit插件目录下。Win7/8的位置是%programdata%\Autodesk\Revit\addins\201*,其中“%programdata%”一般是“C:\ProgramData”(系统装在C盘),“201*”是Revit的版本。

12、启动Revit,在“附加模块”→“外部工具”的下拉箭头处找到“HelloWorld”,执行后,可以看到弹出对话框,成功。

2.2 接下来把代码逐行过一遍

2.2.1 先看程序本身

第1行,使用system命名空间。这个是默认生成的。其他暂时用不到所以删掉了。

第2行,使用Autodesk.Revit.DB命名空间。这个是自己添加的,要先添加引用RevitAPI.dll。

第3行,使用Autodesk.Revit.UI命名空间。这个是自己添加的,要先添加引用RevitAPIUI.dll。

“using+命名空间”的用法,可以粗略的理解为类似于Java和Python中的“import+包名称”的作用;也可以把各级命名空间想象成文件系统中的树状目录,那么就是类似于环境变量中“path”的作用。

第5行,声明一个叫HelloWorld的命名空间,没什么可说的。

第7行,定义Transaction特性。这个特性源自Autodesk.Revit.Attributes.TransactionAttribute。该特性有三种模式:Automatic(自动)、Manual(手动)和ReadOnly(只读)。因为该特性没有默认值,所以必须显式指定。在本例中,模式可任选。

如果觉得这句太长,可以在“using……”代码块加上using Autodesk.Revit.Attributes;

这句就可以写成[Transaction(TransactionMode.Manual)]

第8行,声明一个类,继承RevitAPI的IExternalCommand(外部命令)接口。

第9行,重载Execute()函数。可以把它粗略的理解为IExternalCommand接口类的主函数或入口函数,类似于Java里的main()函数那样的东西。这个函数被Autodesk.Revit.UI.Result限制,所以必须有返回值。

第12行,显示一个对话框,标题栏显示“Demo”字样,对话框显示"Hello World!"字样。当然显示的文字内容可以自己随便改。

第13行,返回Succeeded。Autodesk.Revit.UI.Result有三个值,分别是Succeeded、Failed和Canceled。如果没有返回Succeeded,Revit会撤销所做的操作。

2.2.1 再看配置文件.addin

第1行,XML头部声明,照抄就是。

第2行和第10行,成对<RevitAddIns>标签,固定格式,表明做的是Revit插件。

第3行和第9行,成对<AddIn>标签,type参数Command表明插件是IExternalCommand(外部命令)类型。相应的还有IExternalApplication(外部应用)和IExternalDBApplication(外部数据应用)类型。

第4行,成对<Assembly>标签,这里写插件所在的路径。

第5行,成对<AddInId>标签,这里写插件的Guid。

第6行,成对<FullClassName>标签,“命名空间”+“类名”。在程序代码里变了的话,这里也要相应改过来。

第7行,成对<Text>标签,插件显示的名字,随你喜欢。只有外部命令类型的插件才需要。

第8行,成对<VendorId>标签,这里写插件供应商的名称。注意要符合Autodesk插件供应商命名标准。没有注册过的,可以填写NAME之类。

以上几项都是必须的。

看上去是不是很简单。那么,下次我再试试稍稍复杂点的。

时间: 2024-10-08 01:19:56

踏上Revit二次开发之路 2 从“HelloWorld”入手的相关文章

踏上Revit二次开发之路 1 准备工作

1 准备工作 工欲善其事,必先利其器.在正式开始之前,我觉得有必要先盘点一下需要准备些什么. 1.1 硬件设备 PC机一台(谢绝Apple). 配置不能太低,至少要i3以上的cpu.4g以上的内存和支持DX11的独立显卡,否则跑不动Revit,建议不低于i5 CPU和8g内存.SSD不是必须品,我敢保证,当你把360.电脑管家和金山毒霸之类装了四五个以后,开机时间肯定会比裸奔的5400转机械硬盘长很多(珍爱生命,远离国产软件全家桶). 1.2 必要软件 1.2.1 64位Windows 7或8操

踏上Revit二次开发之路 3 自己的工具按钮

3 自己的工具按钮 上次的例子只能在"附加模块"→"外部工具"下运行,用作个人作品是没问题,如果打算搞个公司产品的话,估计BOSS是不会满意的.这次我来做一个直接显示在"附加模块"选项卡上的工具按钮. 3.1 基础 1.新建一个项目WelcomeToRevit.添加引用RevitAPI.dll和RevitAPI.dll.具体做法和上次一样,不赘述. 2.保留指令using System;添加指令using Autodesk.Revit.DB;us

Revit二次开发实现BIM盈利(以橄榄山快模为例讲解) 视频讲座下载

应笔墨闲谈群的邀请, 在10月11号晚8:30分在其群做了一次关于BIM二次开发的讲座. 由于参与者基本上都是从设计院和施工单位来的,所以对Revit二次开发做了纵览性的讲解, 以非程序员能听懂的方式讲解Revit二次开发.使这些行业领导或负责人能明白Revit二次开发的大概特点,以及其能实现的功能. 便于他们在自己的业务需要Revit插件时,能更好的思考和决策插件项目的立项和推动. 下面是这次讲座的提纲: Revit二次开发纵览,以橄榄山快模为例演示API概念Revit二次开发原理Revit二

Revit 二次开发 修改对象的颜色

//修改对象颜色 [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] public class ChangeColor : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements) { ChangeElementColor(comm

Revit二次开发实现BIM盈利(以橄榄山快模为例解说) 视频讲座下载

应笔墨闲谈群的邀请, 在10月11号晚8:30分在其群做了一次关于BIM二次开发的讲座. 因为參与者基本上都是从设计院和施工单位来的,所以对Revit二次开发做了纵览性的解说, 以非程序猿能听懂的方式解说Revit二次开发.使这些行业领导或负责人能明确Revit二次开发的大概特点,以及其能实现的功能. 便于他们在自己的业务须要Revit插件时,能更好的思考和决策插件项目的立项和推动. 以下是这次讲座的提纲: Revit二次开发纵览,以橄榄山快模为例演示API概念Revit二次开发原理Revit二

Revit 二次开发 自动选中对象

//获取选中对象 [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] public class setSelectEle : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements) { SetSelectionElement(co

Revit二次开发基础-在附加模块中添加外部工具选项

想必想投身与Revit二次开发的朋友们可能会出现这样的一种情景,当我们打开自己的revit(2014版本以上)时,点击附加模块,会发现缺少一个外部工具这个按钮!!!是不是Autodesk给你藏起来了,其实还真是! 接下来我就给大家演示下如何在附加模块下添加外部工具这个按钮. 本人使用的是Revit2016,所以以下是以该版本进行演示. 首先我们需要在Autodesk官网下载一个2016版本的SDK,如图所示: 另附网站:http://usa.autodesk.com/adsk/servlet/i

Revit二次开发,删除载入的族

Document doc = commandData.Application.ActiveUIDocument.Document; Family family = null; string s = "c:/xxx.rfa"; Transaction tran = new Transaction(doc,"载入族"); tran.Start(); bool b = doc.LoadFamily(s, out family); tran.Commit(); if (b)

Revit二次开发(一)获取参数

对于Revit的二次开发,基本技能需要Revit熟练使用,C#基本的语法,WPF的使用(MVVM或其他框架的使用),在此基础上进行开发 基本的格式 namespace ClassLibrary2 { [Transaction(TransactionMode.Manual)] public class Class1:IExternalCommand # 外部命令的接口 { public Result Execute(ExternalCommandData commandData, ref stri