Building Coder 链接:http://thebuildingcoder.typepad.com/blog/2010/07/shared-type-parameter.html
Revit 二次开发论坛链接:http://revit.5d6d.com/viewthread.php?tid=1299&extra=
距离我们上次讨论“为不同的元素类别创建共享参数”已经有段时间了。眼下有一个与此相关的问题,虽然很常见但是之前我们真没涉及过。
问题:
我想为 Wall 类型添加一个新的共享参数。不过我现有的代码是添加实例共享参数的。请问如何为类别添加共享参数?
回答:
答案比你想象的简单 :) 你只需要用 NewTypeBinding 替换目前使用的 NewInstanceBinding 就行了。
下面我摘录一段 Revit API 帮助中对 Binding 类的描述:
绑定对象(Binding Object)允许你将一个参数定义(Parameter Definition)绑定到一个或多个类别。绑定类其实是 Revit 中所有参数绑定类型的基类。
一旦绑定对象被创建,并且被添加到文档中,那些从属于指定类别(在创建绑定对象时指定)的元素就会新增指定的参数。目前有两种具体的绑定:实例绑定和类型绑定。
这两种绑定主要的区别在于:
- 实例绑定参数虽然同样会出现在从属于指定类别的所有元素的属性类表中,但是修改其中一个元素的绑定参数的值只会影响该元素;
- 类型绑定参数则不同。首先该绑定参数只会出现在类型对象(而不是具体的元素)的属性列表中。这个类型对象就是指定类别的类型对象。其次对该绑定参数的修改会
影响所有从属于指定类别的元素。
另外需要注意的是:一个参数定义只能用于一个实例绑定或者一个类型绑定,而不能同时绑定到一个实例绑定和一个类型绑定。
将一个共享参数绑定到某个元素类型,你首先需要指定元素类型对应的类别(即使只有一个 Category,也需要使用一个 CategorySet 来包含它)。Revit API 中用于创建
对象的基类 ItemFactoryBase 提供两个并列方法:NewInstanceBingding() 和 NewTypeBinding()。
译者注:族文档中的 Autodesk.Revit.DB.FamilyCreate 和项目文档中的 Autodesk.Revit.Creation.Document 都继承自 ItemFactoryBase。在我的项目中为了实现项目文档
和族文档兼容的逻辑,就干脆使用一个成员变量 ItemFactoryBase m_Creator 来代表文档创建器对象。只是在初始化 m_Creator 时根据当前文档是族文档还是项目文档给它
赋值 Autodesk.Revit.DB.FamilyCreate 或者 Autodesk.Revit.Creation.Document。
我在 2011.0.74.2 版本的 Building Coder Samples中为 CmdCreateSharedParams 外部命令方法增加了对类型参数绑定的支持。
译者注:下面我简单介绍一个为元素或者类型绑定共享参数的步骤。当然 Jeremy 的代码简洁明了,如果你是“代码即文档”观点的粉丝,还是建议直接看大师的代码吧。
1. 打开(如不存在则创建)共享参数文件
文件名:Application.SharedParametersFilename
打开方法:DefinitionFile file = Application.OpenSharedParameterFile();
2. 读取(如不存在则创建)共享参数定义组
DefinitionGroup group = file.Groups.get_Item([group name]);
DefinitionGroup group = file.Groups.Create([group name]);
3. 判断指定类别是否允许被绑定参数
通过 Category.AllowsBoundParameters 属性判断。但是 Jeremy 在代码中对此有段注释:该属性为 False 则说明该类别可能(注意措辞)无法被绑定参数。另外不可见
的参数也可以被绑定。
4. 读取(如不存在则创建)共享参数定义
Definition definition = group.Definitions.get_item([definition name]);
Definition definition = group.Definitions.Create([definition name]);
5. 创建需要绑定参数的指定类别集合
CategorySet catSet = ItemFactoryBase.NewCategorySet();
catSet.Insert(category1);
......
6. 创建绑定
Binding binding = ItemFactoryBase.NewTypeBinding(catSet) as Binding;
Binding binding = ItemFactoryBase.NewInstanceBinding(catSet) as Binding;
7. 将绑定添加到文档
Document.ParameterBindings.Insert(definition, binding);