Revit二次开发之 参数功能开发
一、参数归属
Revit的特点,就是其所有元素,都可以通过参数化驱动,参数之间可以进行计算,而驱动构件的运行,参数应用可划分为以下几个方面:
1、族参数
主要用于定义族的参数信息,用于驱动族的特点,其不会出现在明细表和标记之中,此参数存储在族文件本身。
2、项目参数
是之给当前项目中指定对象添加参数,此参数可以出现在明细表,但无法出现在标记中,此参数存储在项目文件之中。
3、共享参数
是文件外部定义的参数,这些参数需要共享文件来定义,其特点是可以由多个项目和族共享,也可以自由导出到任何明细表和标记中。
4、全局参数
是用于定义全局的参数信息,这个参数可以不归属任何构件,但可以作为其他构件参数中的变量。
二、参数的分类
参数的类型也可以划分为:
1、类型参数:所有实例都共享,改变一个,其他的全部改变,是位于类型界面之中,如下图所示:
2、实例参数:单个实例独有,改变当前实例的参数,不会影响其他实例,为实例属性之中,如下图所示:
三、参数的逻辑与开发(个人理解)
首先思考一个问题,为什么族参数无法出现在明细表和标记中,项目参数则有可能出现在明细表,但不能出现在标记中。
面向对象开发的人知道一个概念“耦合”,一旦2个对象高度耦合后,如果第三个对象要引用他,那么三个对象必形成耦合,一旦耦合太多,系统的维护性变得非常困难。所以对于族和项目内部的参数,一般只和构件和项目本身进行耦合,无法和明细表和标记族再次耦合,就出现了有些构件和项目自生的参数,是无法出现在明细表和标记中。
但共享参数的出现,就是为了打破这种耦合性产生的,共享参数的定义在外部,其可以通过参数的唯一guid进行关联,所以就带来了相对的灵活性。
四、参数的定义
Autodesk.Revit.DB.Definition 用于说明一个参数的定义,其确定了参数的位置:
其具有两个子类:
1、ExternalDefinition : 属于共享参数的参数定义,对应共享参数。
private void ReadEditExternalParam(DefinitionFile file) { //获取分组 DefinitionGroup myGroup = myGroups.get_Item("MyGroup"); if (myGroup != null) { ExternalDefinition myExtDef = myGroup.Definitions.get_Item("MyParam") as ExternalDefinition; if (myExtDef != null) {
DefinitionGroup newGroup = myGroups.get_Item("AnotherGroup");
} }
共享参数的定义,需要通过DefinitionFile 对象从共享参数文件中获取。
2、InternalDefinition:属于内部参数的定义,对应除共享参数以外的所有参数。
foreach (Parameter param in wall.Parameters) { InternalDefinition definition = param.Definition as InternalDefinition; if (null == definition) continue; if (BuiltInParameter.WALL_USER_HEIGHT_PARAM == definition.BuiltInParameter) { height = param.AsDouble(); } }
这两种参数定义有一个本质区别,就是InternalDefinition包含一个BuiltInParameter 属性,其定义定义参数的类别信息,用自定义的参数,当前属性都为INVALID,参数。
以上获取参数的两种方式:
1、get_Parameter(Guid) 获取共享参数 2、get_Parameter(BuiltInParameter) 获取内部参数信息
五、创建和绑定参数
1、DefinitionBindingMap对象,这个对象是包含所有的参数绑定对象,其是一个集合,保存所有参数定义和参数之间的关系,其具有一个子类
BindingMap,是记录着所有的绑定关系。其获取当时为:
var parameterBindings = document.ParameterBindings;
2、Binding对象,用于将参数绑定到指定的元素之上,其只有多个子类,其子类定义如下:
Autodesk.Revit.DB.Binding
Autodesk.Revit.DB.ElementBinding
Autodesk.Revit.DB.InstanceBinding
Autodesk.Revit.DB.TypeBinding
具有实例化绑定和类型绑定,对应的是实例化参数和类型参数。其中categorySet代表当前参数要绑定的元素类别,是一个类别的集合
instanceBinding = document.Application.Create.NewInstanceBinding(categorySet);
typeBinding = document.Application.Create.NewTypeBinding(categorySet);
3、添加参数定义与元素绑定
将创建的绑定对象添加当文档之中,其代码如下:
parameterBindings.Insert(parameterDefinition, instanceBinding, BuiltInParameterGroup.PG_DATA)
通过以上步骤,则将一个参数绑定到只当元素,
4、修改参数的值
1、get_Parameter(Guid) 获取共享参数
2、get_Parameter(BuiltInParameter) 获取内部参数信息
六、参数Parameter 对象,其包含几个关键属性:
Definition:参数的定义
Element:参数对应的元素
IsShared:是否是共享参数
StorageType:参数的存储类型。
根据以上边下代码如下: /// <summary> /// 创建实例参数 /// </summary> /// <param name="parameterDefinition"></param> /// <param name="document"></param> /// <param name="category"></param> public static void CreateInstanceBinding(Definition parameterDefinition, Document document, Category category) { var parameterBindings = document.ParameterBindings; //获取当前的绑定 var binding = parameterBindings.get_Item(parameterDefinition); //判断是否是实例绑定 var instanceBinding = binding as InstanceBinding; //假如绑定为null if (instanceBinding == null) { //创建一个新类别集合 var categorySet = document.Application.Create.NewCategorySet(); //插入类别 categorySet.Insert(category); //创建一个新的绑定 instanceBinding = document.Application.Create.NewInstanceBinding(categorySet); //添加到当前的绑定中 if (!parameterBindings.Insert(parameterDefinition, instanceBinding, BuiltInParameterGroup.PG_DATA)) { throw new Exception("进行参数绑定失败"); } } else { if (instanceBinding == null) { throw new Exception("实例绑定对象不存在"); } //假如已经存在绑定,则添加一个类别后,重新绑定 if (!instanceBinding.Categories.Contains(category)) { instanceBinding.Categories.Insert(category); if (!parameterBindings.ReInsert(parameterDefinition, instanceBinding, BuiltInParameterGroup.PG_DATA)) { throw new Exception("像实例参数中,添加新类别失败"); } } } }
七、共享参数
共享参数是revit中一个非常重要的功能,其主要通过Autodesk.Revit.ApplicationServices.Application对象的
SharedParametersFilename 属性获取
打开共享参数通过
OpenSharedParameterFile 函数获取