在Revit API中加載族可以使用Doc.LoadFamily方法,傳入要加載的族文件路徑名,但是這種方式有一種缺點,就是如果族文件在當前工程中沒有加載的話則返回成功,如果已經加載過,則返回失敗,也就是拿不到FamilySymbol實例,而根據族生成實例圖元又需要這個FamilySymbol。網上看到有些帖子說可以傳入IFamilyLoadOptions實例就可以,但是筆者多次嘗試,該方法均沒有成功,始終返回失敗,無奈放棄這種方法,改為在當前工程中查找該族是否加載過,如果加載則直接返回FamilySymbol實例,否則加載族文件,下面貼出代碼。
該代碼在Revit 2016 + VS2013下調試通過:
public class CreateFamilyInstance : IExternalCommand { private class FamilyLoadOptions : IFamilyLoadOptions { public bool OnFamilyFound(bool familyInUse, out bool overwriteParameterValues) { overwriteParameterValues = true; return true; } public bool OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues) { source = FamilySource.Family; overwriteParameterValues = true; return true; } } private FamilySymbol FindFamilySymbol(Document rvtDoc, string familyName, string symbolName) { FilteredElementCollector collector = new FilteredElementCollector(rvtDoc); FilteredElementIterator itr = collector.OfClass(typeof(Family)).GetElementIterator(); itr.Reset(); while (itr.MoveNext()) { Autodesk.Revit.DB.Element elem = (Autodesk.Revit.DB.Element)itr.Current; if (elem.GetType() == typeof(Autodesk.Revit.DB.Family)) { if (elem.Name == familyName) { Autodesk.Revit.DB.Family family = (Autodesk.Revit.DB.Family)elem; foreach (Autodesk.Revit.DB.ElementId symbolId in family.GetFamilySymbolIds()) { Autodesk.Revit.DB.FamilySymbol symbol = (Autodesk.Revit.DB.FamilySymbol)rvtDoc.GetElement(symbolId); if (symbol.Name == symbolName) { return symbol; } } } } } return null; } public Autodesk.Revit.UI.Result Execute(ExternalCommandData cmdData, ref string message, Autodesk.Revit.DB.ElementSet elements) { UIApplication app = cmdData.Application; Document doc = app.ActiveUIDocument.Document; Transaction trans = new Transaction(doc, "ExComm"); trans.Start(); Family fs = null; FamilySymbol symbol = null; doc.LoadFamily(@"C:\\ProgramData\\Autodesk\\RVT 2016\\Libraries\\China\\結構\\柱\\混凝土\\混凝土柱-T形.rfa", new FamilyLoadOptions(), out fs); if (fs != null) { foreach (ElementId symbolId in fs.GetFamilySymbolIds()) { Element elem = doc.GetElement(symbolId); if (null != elem) { symbol = elem as FamilySymbol; if (null != symbol) { TaskDialog.Show("Info", symbol.Name); TaskDialog.Show("Info", symbol.FamilyName); break; } } } } else { symbol = FindFamilySymbol(doc, "混凝土柱-T形", "標准"); if (null != symbol) { TaskDialog.Show("Info", symbol.Name); TaskDialog.Show("Info", symbol.FamilyName); } } if (null != symbol) { if (!symbol.IsActive) symbol.Activate(); XYZ point = new XYZ(10, 10, 10); //創建族實例 FamilyInstance fi = doc.Create.NewFamilyInstance(point, symbol, Autodesk.Revit.DB.Structure.StructuralType.Column); } else { TaskDialog.Show("erorr", "FamilySymbol為空"); } trans.Commit(); return Autodesk.Revit.UI.Result.Succeeded; } }