序言:
前一章对Revit加载外部插件进行了简单的说明,本章详细说明Revit自定义菜单的设计与实现。
Revit菜单机制
Revit的菜单配置结构为Tab->Panel->Button如上图所示:
菜单的最顶级为选项卡(Tab)每个选项卡下包含很多面板(Panel),无论是Tab还是Panel都只是一个容器,其最终的目的是对Panel内的Button进行分类和布局。而Button共有以下几种类型。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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菜单中。(代码后续添加)。
AddIn文件
程序和Revit的交互主要通过命令实现,为了便于命令的管理。我们可以把命令单独放在一个项目之中。这样便于命令的查找,以及后续的维护。这样的话对于AddIn文件的处理就比较简单了。我们只需要把这一个项目的dll添加到AddIn文件之中。
元素的过滤
既然是基于Revit的二次开发,那么和Revit的交互是整个二次开发的核心。Revit提供了元素的过滤功能,利用过滤我们可以实现元素的快速定位。继而可以去改变元素的属性。
过滤元素就像是漏勺捞水饺,我们首先需要找到煮水饺的锅。这在Revit中对应着他的收集器 (FileredElementCollector)。而漏勺就是过滤器,而在Revit中存在这众多的过滤器。运用这些过滤器可以快速定位到元素。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
FilteredElementCollector filteredElements = new FilteredElementCollector(Doc);//煮水饺 ElementClassFilter classFilter = new ElementClassFilter(typeof(wall));//获得漏勺x1 filteredElements=filteredElements.WherePasses(classFilter);//捞水饺 foreach(Wall wall in filteredElements) { wall.Eat();//吃水饺 }
Revit常见的过滤器:
ExclusionFilter 过滤并排除一部分元素
LogicalAndFilter 双重过滤
ElementCategoryFilter 通过种类或者分类进行过滤
ElementClassFilter 通过种类进行匹配的过滤器
结语
自从工作以来,时间变得很零散,这意味着我没法集中时间实践我所学到的知识。零散的时间只够让我了解新知识的思想,而没法去实践去运用去把它转化成我自己的知识体系。这个系列的博客便是为了在学习的过程中,通过写博客来将知识进行转化,以期能融入我的知识体系。但是这段时间发现效果并不好,我把太多的时间浪费在了思考以及组织语言上。在前期一叶障目的情况下思考是没有任何意义的。而无论是编程技术还是Revit在我眼里都只是一种工具,一种让人们脱离重复工作,一种让人们专注于设计的工具。所以之后我会调整学习的方式,不再专注于概念,而专注于实际的运用。