本文章代碼寫的是對族參數的獲取,並轉成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:\xx.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<ElementId> 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<ElementId> 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<ElementId> 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); } } } }