将项目文件(.rvt)转换成族文件(.rfa), 项目中的系统族用这种方式转不了
1. 获取到项目中实例
2. 遍历实例记录属性/坐标/中心线等,并且将实例保存成.rfa格式文件
3. 加载一个空的族文件,并且把刚刚导出的实例全部加载到空的族文件中设置其属性/坐标等
4. 将族文件保存
//获取实例
FilteredElementCollector fec = new FilteredElementCollector(doc).ofClass(typeof(FamilyInstance));
fec.UnionWith(new FilteredElementCollector(doc).ofClass(typeof(HostObject))).ToElements();
//属性记录...
Dictionary<string,ParamaterSet> dicPara = new Dictionary<string,ParamaterSet>();
//导出路径
List<string> lstExportPath = new List<string>();
//把实例保存.rfa文件
if(elem is FamilyInstance)
{
Familyinstance ins = elem as Familyinstance;
Family family = ins.Symbol.Family;
Document insDoc = ins.EditFamily(family);
string sPath = "d:\\"+ins.Id+".rfa";
lstExportPath.Add(sPath);
insDoc.SaveAs("d:\\ins.rfa");
insDoc.Close(false);
dicPara.Add(sPath,ins.Paramters);
}
//加载一个空族并将实例加载 创建
Family fa = null;
using(Transaction trans = new Transaction(doc,"load"))
{
trans.start();
try
{
doc.LoadFamily("",familyLoadOption,out fa);
trans.Commit();
}
catch
{
trans.RollBack();
}
}
//遍历lstExportPath 创建
Document fDoc = doc.EditFamily(fa);
foreach(string path in lstExportPath)
{
Family loadFamily;
FamilySymbol fs = null;
fDoc.LoadFamily(path,familyLoadOption,out loadFamily);
ISet<ElementId> symbolIds = loadFamily.GetFamilySymbolIds();
foreach(Elementid symbolId in symbolIds)
{
fs = fDoc.GetElement(symbolId) as FamilySymbol;
if(fs == null) Continue;
if(!fs.IsActive) { fs.Activate(); break; }
}
if(fs == null) Comtinue;
//这里创建基于点的实例, 线/面 反正都是这个方法
fDoc.FamilyCreate.NewFamilyInstance(记录的坐标,fs,StructuralType.NoStructural);
//设置属性,旋转角度 Math.PI / 180 * 记录的角度
...
...
...
}
//都创建完保存就行了
fDoc.SaveAs("路径");
fDoc.Close(false);
手打心好累, 功能不难,写了一个大概。
希望能帮到大家。
------------------------------------------------------------------------------------------ 更新一下 -----------------------------------------------------------------------------------------------------------------------------
忘记考虑内建模型了,只需在 把项目中实例保存成rfa文件时 加个判断即可
if(!family.IsEditable) continue;