public class FamilyInstanceParameterInfo
{
public string ParamName;
public BuiltInParameterGroup ParamGroup;
public ParameterType ParamType;
public bool IsInstance = true;
}
public class FamilyInstanceParameterTool
{
public static bool AddParam(Document doc, Family f, List<FamilyInstanceParameterInfo> paramInfoVec)
{
try
{
if (doc == null || f == null) return false;
Document familyDoc = doc.EditFamily(f);
FamilyManager familyMgr = null;
using (Transaction trans = new Transaction(familyDoc))
{
trans.Start("Add Family Instance Parameter");
familyMgr = familyDoc.FamilyManager;
foreach(var paramInfo in paramInfoVec)
{
string paraName = paramInfo.ParamName;
bool exitFlag = false;
//判断参数是否已经存在
FamilyParameterSet flyParams = familyMgr.Parameters;
foreach (FamilyParameter fp in flyParams)
{
if (fp.Definition.Name == paraName)
{
exitFlag = true;
break;
}
}
if (!exitFlag)
{
familyMgr.AddParameter(paramInfo.ParamName,paramInfo.ParamGroup,paramInfo.ParamType,paramInfo.IsInstance);
}
}
trans.Commit();
}
var rfaPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\" + f.Name + ".rfa";
if (File.Exists(rfaPath)){File.Delete(rfaPath);}
familyDoc.SaveAs(rfaPath);
familyDoc.Close();
bool flag = false;
using (Transaction trans = new Transaction(doc))
{
trans.Start("ReLoadFamily");
flag = doc.LoadFamily(rfaPath, new MyFamilyLoadOptions(), out Family newFamily);
trans.Commit();
}
if (File.Exists(rfaPath)) { File.Delete(rfaPath); }
return true;
}
catch (Exception ex)
{
#if DEBUG
MessageBox.Show(ex.Message.ToString() + "\n" + ex.StackTrace.ToString());
#endif
return false;
}
}
}
public class MyFamilyLoadOptions : 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.Project;
overwriteParameterValues = true;
return true;
}
}