gpt4 book ai didi

revit-api - RevitAPI : How can I change a family's part type?

转载 作者:行者123 更新时间:2023-12-04 10:56:11 28 4
gpt4 key购买 nike

更改族类别后,我试图通过 Revit 的 API 更改族的零件类型。

我可以检索相应的参数并设置其值,但是(尽管事务已成功提交)部分类型未更改。

由于“零件类型”UI 元素显示空字符串,因此我通过“Revit 查找”检查了尝试更改后参数的值。它仍然是旧的零件类型,该系列类别甚至不存在。

到目前为止,这是我的代码:

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();
}

编译执行,然后观察到类型改为风管附件,零件类型为弯头。似乎工作正常。

唯一的区别是您似乎处于略有不同的环境中。您从文档上下文中打开了您的家庭。如果您的实现中没有不明显的故障,这可能指向 API 错误。但是,在我的实验中,这种情况不会造成任何问题,因此如果有任何错误,则无法系统化。

我的目标是将任意窗族更改为风管弯头。我只发布相关部分(在 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 - RevitAPI : How can I change a family's part type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59175101/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com