在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;
}
}
