踏上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 }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”入手