Revit二次开发 族参数的获取

本文章代码写的是对族参数的获取,并转成DataTable可作为数据源直接绑定在form窗体控件上

流程思路为:

1.在固定位置找到族文件,加载到项目中

2.读取族文件中所有类型:Get_FamilySymbol(Family family);

3.获取族文件参数: GetParameter(Element e, string header)

4. 获取族文件中所有类型参数:getSymbolpara()

5.将族类型信息参数转成DataTable表格:ShowAllBuildinPara()

6.卸载族文件

添加引用

using System.Collections.Generic;
using System.Data;
using System.Text;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace ceshi
{
    [Transaction(TransactionMode.Manual)]
    public class Class1 : IExternalCommand
    {
        Family family = null;
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document doc = commandData.Application.ActiveUIDocument.Document;
            string s = @"C:\卧式不带联轴器.rfa";            
            Transaction tran = new Transaction(doc);
            tran.Start("载入族");
            bool b = doc.LoadFamily(s,out family);
            tran.Commit();
            if (b){TaskDialog.Show("11","加载成功");}         
            Get_FamilySymbol(family);//获取族类型
            Element element = family as Element;
            GetParameter(element,"11");//获取族文件参数
            getSymbolpara();//获取族类型参数
            ShowAllBuildinPara();//将族类型信息参数转成table表格
            Transaction trandelete = new Transaction(doc);//创建事物
            trandelete.Start("删除族");//开启事物                 
            trandelete.Commit();//关闭事物
            return Result.Succeeded;
        } 
        public void Get_FamilySymbol(Family family)//获取族类型
        {
            StringBuilder message = new StringBuilder("选择的族文件名称: " + family.Name+ "\n " + "\n ");
            ISet familySymbolIds = family.GetFamilySymbolIds();           
            if (familySymbolIds.Count == 0){message.AppendLine("Contains no family symbols.");}
            else
            {
                message.AppendLine("文件中有以下类型 : ");
                foreach (ElementId id in familySymbolIds)
                {
                    FamilySymbol familySymbol = family.Document.GetElement(id) as FamilySymbol; 
                    message.AppendLine("\nName: " + familySymbol.Name);
                    foreach (ElementId materialId in familySymbol.GetMaterialIds(false))
                    {
                        Material material = familySymbol.Document.GetElement(materialId) as Material;
                        message.AppendLine("\nMaterial : " + material.Name);
                    }
                }
            }
            TaskDialog.Show("Revit", message.ToString());
        }
        public void GetParameter(Element e, string header)//获取族文件参数
        {
            StringBuilder sb = new StringBuilder();//得到所有的枚举名称
            string[] strs = System.Enum.GetNames(typeof(BuiltInParameter));
            foreach (string str in strs)
            {
                BuiltInParameter paramEnum =(BuiltInParameter)System.Enum.Parse(typeof(BuiltInParameter), str);// 查看枚举名称对应的BuiltInParameter
                Parameter tmpParam = e.get_Parameter(paramEnum);// 通过BuiltInParameter的到参数
                if (tmpParam != null)
                {
                    string paraName = "";
                    paraName = tmpParam.Definition.Name;
                    string val = tmpParam.AsValueString();
                    sb.Append(e.Name + ":\t" + str + "(" + paraName + ")" + " \t= \t" + val + "\r\n");
                }
            }
            TaskDialog.Show(header, sb.ToString());
        }
        public void getSymbolpara()//获取族类型参数
        {
            ISet familySymbolIds = family.GetFamilySymbolIds();
            StringBuilder message = new StringBuilder("选择的族文件名称: " + family.Name );
            foreach (ElementId id in familySymbolIds)
            {
                FamilySymbol familySymbol = family.Document.GetElement(id) as FamilySymbol;
                message.AppendLine("\nName: " + familySymbol.Name);
                foreach (Parameter p in familySymbol.Parameters)
                {                   
                    string sname= p.Definition.Name;
                    string svalue = p.AsValueString();
                    message.AppendLine(sname+"  :  "+svalue);
                }
            }
            TaskDialog.Show("Revit", message.ToString());
        }
        public void ShowAllBuildinPara()//将族类型信息参数转成table表格
        {
            ISet familySymbolIds = family.GetFamilySymbolIds();
            ElementId[] ids = new ElementId[familySymbolIds.Count];
            familySymbolIds.CopyTo(ids, 0);
            var id = ids[0];
            DataTable dataTable = new DataTable();
            FamilySymbol familySymbol = family.Document.GetElement(id) as FamilySymbol;
            dataTable.Columns.Add("类型名称");
            foreach (Parameter p in familySymbol.Parameters)
            {
                if (p.Definition.Name == "类别"||p.Definition.Name == "类型名称")
                    continue;
                dataTable.Columns.Add(p.Definition.Name);
            }
            foreach (ElementId rowId in ids)
            {
                FamilySymbol symbol = family.Document.GetElement(rowId) as FamilySymbol;
                DataRow row = dataTable.NewRow();
                row["类型名称"] = symbol.Name;
                foreach (Parameter p in symbol.Parameters)
                {
                    if (p.Definition.Name == "类别"||p.Definition.Name == "类型名称")
                        continue;
                    row[p.Definition.Name] = p.AsValueString();
                }
                dataTable.Rows.Add(row);
            }
        }
    }
}

你可能感兴趣的:(Revit二次开发 族参数的获取)