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 函数获取
posted @ 2022-08-09 15:48  Min.Xiaoshuang  阅读(1401)  评论(1编辑  收藏  举报