RevitAPI:如何更改族的零件类型?
RevitAPI: How can I change a family's part type?
我试图在更改族类别后通过 Revit 的 API 更改族的零件类型。
我可以检索到相应的参数并设置它的值,但是(尽管事务已成功提交)部件类型没有改变。
由于 'Part type' UI 元素显示空字符串,我通过 "Revit Lookup" 检查了尝试更改后参数的值。它仍然是旧零件类型,甚至不存在该系列类别。
到目前为止,这是我的代码:
Family f = familyDocument.OwnerFamily;
Category c = f.FamilyCategory;
Parameter p = f.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE);
f.FamilyCategoryId = new ElementId(BuiltInCategory.OST_LightingFixture);
p.Set((int) PartType.Normal);
我还尝试了两个单独的交易(第一个设置类别,第二个设置零件类型)。那里也没有成功。
更新:
事实证明,这段代码已经起作用了。是周围的代码造成了错误。
我在 Revit 2018.3 和 2020.2 中尝试了同样的方法并成功。只需创建任何族类型(我使用了照明设备模板),然后将以下代码片段插入到新宏中。
var f = Document.OwnerFamily;
var c = f.FamilyCategory;
var partTypeParam = f.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE);
using(var t = new Transaction(Document, "Change part type"))
{
t.Start();
f.FamilyCategoryId = new ElementId(BuiltInCategory.OST_DuctAccessory);
partTypeParam.Set((int)PartType.Elbow);
t.Commit();
}
编译执行,观察类型变为duct accessory with part type elbow。似乎工作正常。
唯一的区别是您似乎处于略有不同的环境中。您从文档上下文中打开了您的家庭。如果您的实施中没有不明显的故障,这可能指向一个 API 错误。但是,在我的实验中,这种情况没有造成任何问题,因此,如果有任何错误,则不能系统化。
我的目标是将任意 window 系列更改为管道弯头。我post只有相关部分(在Revit 2020.2中测试):
internal class FamilyOption : IFamilyLoadOptions
{
bool IFamilyLoadOptions.OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = false;
return true;
}
bool IFamilyLoadOptions.OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
{
source = FamilySource.Family;
overwriteParameterValues = false;
return true;
}
}
public void PartTypeTester()
{
var f = new FilteredElementCollector(Document)
.OfClass(typeof(Family))
.First(ff => ff.Name == "ExampleFamily")
as Family;
var familyDoc = Document.EditFamily(f);
f = familyDoc.OwnerFamily;
var c = f.FamilyCategory;
var partTypeParam = f.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE);
using(var t = new Transaction(familyDoc, "Change part type"))
{
t.Start();
f.FamilyCategoryId = new ElementId(BuiltInCategory.OST_DuctAccessory);
partTypeParam.Set((int)PartType.Elbow);
t.Commit();
}
var opt = new FamilyOption();
f = familyDoc.LoadFamily(Document, opt);
familyDoc.Close(false);
}
很有魅力。不过,您不应期望生成的族表现得像风管附件 ;-)。
我试图在更改族类别后通过 Revit 的 API 更改族的零件类型。
我可以检索到相应的参数并设置它的值,但是(尽管事务已成功提交)部件类型没有改变。
由于 'Part type' UI 元素显示空字符串,我通过 "Revit Lookup" 检查了尝试更改后参数的值。它仍然是旧零件类型,甚至不存在该系列类别。
到目前为止,这是我的代码:
Family f = familyDocument.OwnerFamily;
Category c = f.FamilyCategory;
Parameter p = f.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE);
f.FamilyCategoryId = new ElementId(BuiltInCategory.OST_LightingFixture);
p.Set((int) PartType.Normal);
我还尝试了两个单独的交易(第一个设置类别,第二个设置零件类型)。那里也没有成功。
更新: 事实证明,这段代码已经起作用了。是周围的代码造成了错误。
我在 Revit 2018.3 和 2020.2 中尝试了同样的方法并成功。只需创建任何族类型(我使用了照明设备模板),然后将以下代码片段插入到新宏中。
var f = Document.OwnerFamily;
var c = f.FamilyCategory;
var partTypeParam = f.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE);
using(var t = new Transaction(Document, "Change part type"))
{
t.Start();
f.FamilyCategoryId = new ElementId(BuiltInCategory.OST_DuctAccessory);
partTypeParam.Set((int)PartType.Elbow);
t.Commit();
}
编译执行,观察类型变为duct accessory with part type elbow。似乎工作正常。
唯一的区别是您似乎处于略有不同的环境中。您从文档上下文中打开了您的家庭。如果您的实施中没有不明显的故障,这可能指向一个 API 错误。但是,在我的实验中,这种情况没有造成任何问题,因此,如果有任何错误,则不能系统化。
我的目标是将任意 window 系列更改为管道弯头。我post只有相关部分(在Revit 2020.2中测试):
internal class FamilyOption : IFamilyLoadOptions
{
bool IFamilyLoadOptions.OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
{
overwriteParameterValues = false;
return true;
}
bool IFamilyLoadOptions.OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
{
source = FamilySource.Family;
overwriteParameterValues = false;
return true;
}
}
public void PartTypeTester()
{
var f = new FilteredElementCollector(Document)
.OfClass(typeof(Family))
.First(ff => ff.Name == "ExampleFamily")
as Family;
var familyDoc = Document.EditFamily(f);
f = familyDoc.OwnerFamily;
var c = f.FamilyCategory;
var partTypeParam = f.get_Parameter(BuiltInParameter.FAMILY_CONTENT_PART_TYPE);
using(var t = new Transaction(familyDoc, "Change part type"))
{
t.Start();
f.FamilyCategoryId = new ElementId(BuiltInCategory.OST_DuctAccessory);
partTypeParam.Set((int)PartType.Elbow);
t.Commit();
}
var opt = new FamilyOption();
f = familyDoc.LoadFamily(Document, opt);
familyDoc.Close(false);
}
很有魅力。不过,您不应期望生成的族表现得像风管附件 ;-)。