之前在做族相关插件的过程中遇到过很多问题,现在分享出来。
一、移除族的某个参数(我这里是根据分组方式移除的,移除的分组名 为 “测试”)
我这里通过族所在的路径打开族 进入到族环境,也可以直接通过当前项目进入到族环境
Document.EditFamily Method |
UIDocument uilink = uiApp.OpenAndActivateDocument(filepath);
Document linkDoc = uilink.Document;
FamilyManager manager = linkDoc.FamilyManager;
Family family = linkDoc.OwnerFamily;
BuiltInParameterGroup paraGroup = BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES;//分组方式
ParameterType paraType = ParameterType.Text;//类型
Transaction tr = new Transaction(linkDoc, "移除参数");
tr.Start();
FamilyParameterSet flyParams = manager.Parameters;
foreach (FamilyParameter fp in flyParams)
{
string grouptype = LabelUtils.GetLabelFor(fp.Definition.ParameterGroup);
try
{
if (grouptype=="测试")
{
manager.RemoveParameter(fp);
}
}
catch (Exception)
{
}
}
tr.Commit();
二、给当前族的每个族类型创建参数
1、我这里是通过创建共享参数来给族的,就需要先创建共享参数,并绑定给族
/// <summary>
/// 创建共享参数
/// </summary>
/// <param name="parameterName">参数名称</param>
/// <param name="parameterType">参数类型</param>
/// <param name="canModify">能否被修改</param>
/// <param name="typename">组名称</param>
/// <param name="doc"></param>
/// <returns></returns>
public Definition CreatShareParam(string parameterName, ParameterType parameterType, bool canModify, string typename, Document doc)
{
Autodesk.Revit.ApplicationServices.Application app = doc.Application;
DefinitionFile dfile = app.OpenSharedParameterFile();
DefinitionGroup dg;
try
{
dg = dfile.Groups.Create(typename);//创建一个组(如果有的话会进入catch去获取)
}
catch (Exception)
{
dg = dfile.Groups.get_Item(typename);
}
if (dg != null)
{
ExternalDefinitionCreationOptions edco = new ExternalDefinitionCreationOptions(parameterName, parameterType);
edco.UserModifiable = canModify;
Definition df;
try
{
df = dg.Definitions.Create(edco);//创建参数名字和参数类型(如果有的话会进入catch)
}
catch (Exception)
{
df = dg.Definitions.get_Item(edco.Name);
}
return df;
}
return null;
}
2、创建参数,需要用到
BuiltInParameterGroup paraGroup = BuiltInParameterGroup.PG_ADSK_MODEL_PROPERTIES;//分组方式(模型属性)
ParameterType paraType = ParameterType.Text;//类型(文字)
3、绑定参数
绑定参数时候,需要验证当前族是否已经有该参数,否则会导致报错。无该参数时候再插入
//linkdoc为当前族的doc
FamilyManager manager1_bianhao = linkDoc.FamilyManager;
FamilyParameterSet flyParam1_bianhao = manager1_bianhao.Parameters;
Transaction tr2 = new Transaction(linkDoc, "添加编码参数");
tr2.Start();
foreach (FamilyParameter fp in flyParam1_bianhao)
{
//存在不添加 编码
if (fp.Definition.Name == bianhaoname)
{
paramAdded_bianhao = fp;
exitFlag_bianhao = true;
}
}
if (exitFlag_bianhao == false)
{
//先创建共享参数。然后通过新建的共享参数,绑定给族
Definition df = CreatShareParam(bianhaoname, paraType, true, "共用", doc);
if (df == null)
continue;
//创建完共享参数后,绑定给族
Autodesk.Revit.ApplicationServices.Application app1 = this._doc.Application;
DefinitionFile dfile = app1.OpenSharedParameterFile();
DefinitionGroups myGroups = dfile.Groups;
DefinitionGroup myGroup = myGroups.get_Item("共用");//获取到共享参数中的类型组
if (myGroup != null)
{
//从共享参数中获取到参数名称,并添加给当前的族(通过族管理器)
ExternalDefinition myExtDef = myGroup.Definitions.get_Item(bianhaoname) as ExternalDefinition;
if (myExtDef != null)
{
paramAdded_bianhao = manager.AddParameter(myExtDef, paraGroup, true);
}
}
}
tr2.Commit();
三、在族环境下取到当前族的某个参数的值
/// <summary>
/// 获取参数值 取的是当前族中 参数名为 “测试参数”的值
/// </summary>
/// <param name="family">族</param>
/// <param name="manager">族管理器</param>
/// <returns></returns>
internal static string getCode(Family family, FamilyManager manager)
{
FamilyParameterSet flyParams = manager.Parameters;
string value= "";
FamilyTypeSet fts = manager.Types;
foreach (FamilyParameter fp in flyParams)
{
if (value!= null && value!= "")
break;
if (fp.Definition.Name=="测试参数")
{
foreach (FamilyType ft in fts)
{
code = ft.AsString(fp);
if (value!= null && value!= "")
break;
}
}
}
return value;
}
四、在族环境中,给族的某个参数写入值或绑定公式
1、写入值
manager.Set(paraAdd, paravalue); //manger 为族管理器;paraAdd为 当前需要写入值的族参数;paravalue 为需要写入的值内容
2、绑定公式
manager.SetFormula(paraAdd, paravalue); //manger 为族管理器;paraAdd为 当前需要写入值的族参数;paravalue 为需要写入的公式内容