RevitAPI:如何更改家庭的零件类型?

时间:2019-12-04 11:34:37

标签: revit-api

我正在尝试在更改族类别之后通过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);

我还尝试了两个单独的事务(第一个事务设置类别,第二个事务设置零件类型)。那里也没有成功。


更新: 原来,此代码已经起作用。导致错误的是周围的代码。

1 个答案:

答案 0 :(得分:2)

我在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);
}

像魅力一样工作。您不应该期望最终的家庭表现得像风管配件;-)。