1. 程式人生 > >踏上Revit二次開發之路 2 從“HelloWorld”入手

踏上Revit二次開發之路 2 從“HelloWorld”入手

import none 工具 環境變量 各級 style first app ati

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 }
View Code

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>
View Code

註意第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之類。

以上幾項都是必須的。

看上去是不是很簡單。那麽,下次我再試試稍稍復雜點的。

踏上Revit二次開發之路 2 從“HelloWorld”入手