10.Revit2016二次开发(基础篇)—— 族类型和族参数

主要讨论如何创建和修改族参数:
程序是在族文件上运行的(.rfa文件),例如打开这个示例的族文件:


点击属性窗口中的这个“族类型”:

10.Revit2016二次开发(基础篇)—— 族类型和族参数_第1张图片

可以看到族中具体的一些参数属性:

10.Revit2016二次开发(基础篇)—— 族类型和族参数_第2张图片

我们看见,名字还没有被创建;
接下来我们将开始程序设计:
首先我们得做一个检查,来看看是否文档中有族文档:

 public void FamilyTypesParameters(Document doc)
        {
            //如果没有文档中不包括族文档,那么就返回;
            if (!doc.IsFamilyDocument)
            {
                return;
            }
}

我们接下来会用到的类是FamilyManager,这个类中包含了很多对参数进行访问或者修改的方法:

10.Revit2016二次开发(基础篇)—— 族类型和族参数_第3张图片

因此,若要对参数进行创建或者修改,就要新建一个事物,添加代码如下:

        using (Transaction t = new Transaction(doc, "family test"))
            {
                t.Start();
                ...
                t.Commit();
            }

再继续添加代码如下:

        using (Transaction t = new Transaction(doc, "family test"))
            {
                t.Start();
                FamilyManager mgr = doc.FamilyManager;

                for (int i = 0; i < 5; i++)
                {
                    mgr.NewType(i.ToString());
                }
                t.Commit();
            }

运行之后的结果:


这样就创建了4个类型;

我们继续添加参数并设置值,这次我们使用方法AddParameter


在这里,传入的第二个参数实际上就是Revit中这个下拉选框中的所有类型供你选择:



第三个传入的参数是确定你创建的参数的类型;
第四个传入的参数是bool类型,true表示新的族参数是instance,false表示是一个type.
代码是:

运行之后的结果是,Data中有新的参数Parameter:

接下来如何依次在设置好的新类型参数中设置值呢?现在的情况是你创建了4个类型,每个类型里面都有参数New Parameter;而要设置New Parameter的值,肯定要一个一个地去赋值。
我们使用属性, CurrentType

注意:

10.Revit2016二次开发(基础篇)—— 族类型和族参数_第4张图片

底下有说明,意思是说如果你想对一些族类型属性进行修改,那么就一定要首先设置为当前的类型。

也就是说:我们需要每次都保存当前的族类型;
那么用什么类型的变量来储存当前类型呢?其实就是上图中CurrentType方法的返回值——FamilyType;

所以代码可以这样:

 public void FamilyTypesParameters(Document doc)
        {
            
            if (!doc.IsFamilyDocument)
            {
                return;
            }

            using (Transaction t = new Transaction(doc, "family test"))
            {
                t.Start();
                FamilyManager mgr = doc.FamilyManager;

                for (int i = 0; i < 5; i++)
                {
                    FamilyType newType = mgr.NewType(i.ToString());          //用一个变量记录当前的族类型;
                    mgr.CurrentType = newType;         //用该变量设置为当前需要操作的族类型才能进行之后的操作;
                    mgr.Set(...)                       // (伪代码)之后的操作
                    ...   
                }
                t.Commit();
            }
        }

这里之所以没有写,是因为set方法也有需求:



它的第一个传入参数类型是FamilyParamter;所以我们需要用一个变量保存这个值;
完整代码是:

        public void FamilyTypesParameters(Document doc)
        {
            if (!doc.IsFamilyDocument)
            {
                return;
            }

            using (Transaction t = new Transaction(doc, "family test"))
            {
                t.Start();
                FamilyManager mgr = doc.FamilyManager;
                FamilyParameter param = mgr.AddParameter
                                      ("New Parameter", BuiltInParameterGroup.PG_DATA, 
                                       ParameterType.Text, false);  //没错,这里就是我们需要告诉set方法的参数

                for (int i = 0; i < 5; i++)
                {
                    FamilyType newType = mgr.NewType(i.ToString());
                    mgr.CurrentType = newType;
                    mgr.Set(param, "this value" + i); //注意这里的第一个参数就是上面记录的;
                }
                t.Commit();
            }
        }

运行结果如下:

10.Revit2016二次开发(基础篇)—— 族类型和族参数_第5张图片

你可能感兴趣的:(10.Revit2016二次开发(基础篇)—— 族类型和族参数)