revit二次开发之族环境

之前在做族相关插件的过程中遇到过很多问题,现在分享出来。

一、移除族的某个参数(我这里是根据分组方式移除的,移除的分组名 为 “测试”)

  我这里通过族所在的路径打开族 进入到族环境,也可以直接通过当前项目进入到族环境

Document.EditFamily Method

 UIDocument uilink = uiApp.OpenAndActivateDocument(filepath);
                Document linkDoc = uilink.Document;
                FamilyManager manager = linkDoc.FamilyManager;
                Family family = linkDoc.OwnerFamily;
               
                BuiltInParameterGroup paraGroup = BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES;//分组方式
                ParameterType paraType = ParameterType.Text;//类型
                Transaction tr = new Transaction(linkDoc, "移除参数");
                tr.Start();
                FamilyParameterSet flyParams = manager.Parameters;
                foreach (FamilyParameter fp in flyParams)
                {                  
                    string grouptype = LabelUtils.GetLabelFor(fp.Definition.ParameterGroup);
                    try
                    {
                        if (grouptype=="测试")
                        {
                            manager.RemoveParameter(fp);
                        }
                    }
                    catch (Exception)
                    {
                    }
                }
                tr.Commit();

二、给当前族的每个族类型创建参数

  1、我这里是通过创建共享参数来给族的,就需要先创建共享参数,并绑定给族

   /// <summary>
        /// 创建共享参数
        /// </summary>
        /// <param name="parameterName">参数名称</param>
        /// <param name="parameterType">参数类型</param>
        /// <param name="canModify">能否被修改</param>
        /// <param name="typename">组名称</param>
        /// <param name="doc"></param>
        /// <returns></returns>
        public Definition CreatShareParam(string parameterName, ParameterType parameterType, bool canModify, string typename, Document doc)
        {
            Autodesk.Revit.ApplicationServices.Application app = doc.Application;
            DefinitionFile dfile = app.OpenSharedParameterFile();
            DefinitionGroup dg;
            try
            {
                dg = dfile.Groups.Create(typename);//创建一个组(如果有的话会进入catch去获取)
            }
            catch (Exception)
            {
                dg = dfile.Groups.get_Item(typename);
            }
            if (dg != null)
            {
                ExternalDefinitionCreationOptions edco = new ExternalDefinitionCreationOptions(parameterName, parameterType);
                edco.UserModifiable = canModify;
                Definition df;
                try
                {
                    df = dg.Definitions.Create(edco);//创建参数名字和参数类型(如果有的话会进入catch)
                }
                catch (Exception)
                {
                    df = dg.Definitions.get_Item(edco.Name);
                }
                return df;
            }
            return null;
        }

 2、创建参数,需要用到   

  BuiltInParameterGroup paraGroup = BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES;//分组方式(模型属性)
  ParameterType paraType = ParameterType.Text;//类型(文字)

3、绑定参数

绑定参数时候,需要验证当前族是否已经有该参数,否则会导致报错。无该参数时候再插入

//linkdoc为当前族的doc   
 FamilyManager manager1_bianhao = linkDoc.FamilyManager;
                FamilyParameterSet flyParam1_bianhao = manager1_bianhao.Parameters;
                Transaction tr2 = new Transaction(linkDoc, "添加编码参数");
                tr2.Start();
                foreach (FamilyParameter fp in flyParam1_bianhao)
                {
                    //存在不添加 编码
                    if (fp.Definition.Name == bianhaoname)
                    {
                        paramAdded_bianhao = fp;
                        exitFlag_bianhao = true;
                    }
                }
                if (exitFlag_bianhao == false)
                {
                    //先创建共享参数。然后通过新建的共享参数,绑定给族
                    Definition df = CreatShareParam(bianhaoname, paraType, true, "共用", doc);
                    if (df == null)
                        continue;
                    //创建完共享参数后,绑定给族
                    Autodesk.Revit.ApplicationServices.Application app1 = this._doc.Application;
                    DefinitionFile dfile = app1.OpenSharedParameterFile();
                    DefinitionGroups myGroups = dfile.Groups;
                    DefinitionGroup myGroup = myGroups.get_Item("共用");//获取到共享参数中的类型组
                    if (myGroup != null)
                    {
                        //从共享参数中获取到参数名称,并添加给当前的族(通过族管理器)
                        ExternalDefinition myExtDef = myGroup.Definitions.get_Item(bianhaoname) as ExternalDefinition;
                        if (myExtDef != null)
                        {
                            paramAdded_bianhao = manager.AddParameter(myExtDef, paraGroup, true);
                        }
                    }
                }
                tr2.Commit();

三、在族环境下取到当前族的某个参数的值 

      /// <summary>
        /// 获取参数值  取的是当前族中 参数名为 “测试参数”的值
        /// </summary>
        /// <param name="family">族</param>
        /// <param name="manager">族管理器</param>
        /// <returns></returns>
        internal static string getCode(Family family, FamilyManager manager)
        {
            FamilyParameterSet flyParams = manager.Parameters;
            string value= "";
            FamilyTypeSet fts = manager.Types;
            foreach (FamilyParameter fp in flyParams)
            {
                if (value!= null && value!= "")
                    break;
                if (fp.Definition.Name=="测试参数")
                {
                    foreach (FamilyType ft in fts)
                    {
                        code = ft.AsString(fp);
                        if (value!= null && value!= "")
                            break;
                    }
                }
            }
       
            return value;
        }

四、在族环境中,给族的某个参数写入值或绑定公式

   1、写入值

     manager.Set(paraAdd, paravalue); //manger 为族管理器;paraAdd为 当前需要写入值的族参数;paravalue 为需要写入的值内容

  2、绑定公式

    manager.SetFormula(paraAdd, paravalue); //manger 为族管理器;paraAdd为 当前需要写入值的族参数;paravalue 为需要写入的公式内容

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值