前一章對Revit加載外部插件進行了簡單的說明,本章詳細說明Revit自定義菜單的設計與實現。編程
Revit的菜單配置結構爲Tab->Panel->Button如上圖所示:ide
菜單的最頂級爲選項卡(Tab)每一個選項卡下包含不少面板(Panel),不管是Tab仍是Panel都只是一個容器,其最終的目的是對Panel內的Button進行分類和佈局。而Button共有如下幾種類型。工具
1 public enum RibbonItemType 2 3 { 4 5 PushButton = 0, 6 7 PulldownButton = 1, 8 9 SplitButton = 2, 10 11 ToggleButton = 3, 12 13 RadioButtonGroup = 4, 14 15 ComboBoxMember = 5, 16 17 ComboBox = 6, 18 19 TextBox = 7 20 21 }
菜單是插件的入口,作Revit的二次開發菜單的變更是比較頻繁的。把菜單的定義寫到代碼裏會使代碼變得臃腫以致於很難維護,並且無法作到關注點分離,無法協同開發。所以把菜單定義的數據序列化,交由產品去維護和控制是一個很好的辦法。佈局
Revit菜單的藉口相似於Xml文件的結構,並且Xml文件的可讀性和可維護性比較強。所以咱們把菜單的數據序列化爲Xml數據。這樣咱們能夠在Revit啓動的時候去讀取菜單配置,將配置的菜單加載到Revit菜單中。(代碼後續添加)。學習
程序和Revit的交互主要經過命令實現,爲了便於命令的管理。咱們能夠把命令單獨放在一個項目之中。這樣便於命令的查找,以及後續的維護。這樣的話對於AddIn文件的處理就比較簡單了。咱們只須要把這一個項目的dll添加到AddIn文件之中。spa
既然是基於Revit的二次開發,那麼和Revit的交互是整個二次開發的核心。Revit提供了元素的過濾功能,利用過濾咱們能夠實現元素的快速定位。繼而能夠去改變元素的屬性。插件
過濾元素就像是漏勺撈水餃,咱們首先須要找到煮水餃的鍋。這在Revit中對應着他的收集器 (FileredElementCollector)。而漏勺就是過濾器,而在Revit中存在這衆多的過濾器。運用這些過濾器能夠快速定位到元素。設計
FilteredElementCollector filteredElements = new FilteredElementCollector(Doc);//煮水餃 ElementClassFilter classFilter = new ElementClassFilter(typeof(wall));//得到漏勺x1 filteredElements=filteredElements.WherePasses(classFilter);//撈水餃 foreach(Wall wall in filteredElements) { wall.Eat();//吃水餃 }
Revit常見的過濾器:code
ExclusionFilter 過濾並排除一部分元素blog
LogicalAndFilter 雙重過濾
ElementCategoryFilter 經過種類或者分類進行過濾
ElementClassFilter 經過種類進行匹配的過濾器
自從工做以來,時間變得很零散,這意味着我無法集中時間實踐我所學到的知識。零散的時間只夠讓我瞭解新知識的思想,而無法去實踐去運用去把它轉化成我本身的知識體系。這個系列的博客即是爲了在學習的過程當中,經過寫博客來將知識進行轉化,以期能融入個人知識體系。可是這段時間發現效果並很差,我把太多的時間浪費在了思考以及組織語言上。在前期一葉障目的狀況下思考是沒有任何意義的。而不管是編程技術仍是Revit在我眼裏都只是一種工具,一種讓人們脫離重複工做,一種讓人們專一於設計的工具。因此以後我會調整學習的方式,再也不專一於概念,而專一於實際的運用。