C# Revit API,如何使用ExternalCommand创建简单的墙?

C# Revit API, how to create a simple wall using ExternalCommand?

我只是想学习 Revit API 并使用 ExternalCommand 创建一堵简单的墙。但是我想不通... 我想我的问题在这里:

var symbolId = document.GetDefaultFamilyTypeId(new ElementId(BuiltInCategory.OST_Walls));

当我调试它时symbolId总是-1。

你能帮我看看这段代码有什么问题吗?

public Autodesk.Revit.UI.Result Execute(
    Autodesk.Revit.UI.ExternalCommandData command_data,
    ref string message,
    Autodesk.Revit.DB.ElementSet elements)
{
    var document = command_data.Application.ActiveUIDocument.Document;

    var level_id = new ElementId(1526);
    // create line
    XYZ point_a = new XYZ(-10, 0, 0);
    XYZ point_b = new XYZ(10, 10, 10);
    Line line = Line.CreateBound(point_a, point_b);

    using (var transaction = new Transaction(doc))
    {
        transaction.Start("create walls");

        Wall wall = Wall.Create(doc, line, level_id, false);
        var position = new XYZ(0, 0, 0);
        var symbolId = document.GetDefaultFamilyTypeId(new ElementId(BuiltInCategory.OST_Walls));
        if (symbolId == ElementId.InvalidElementId) {
            transaction.RollBack();
            return Result.Failed;
        }

        var symbol = document.GetElement(symbolId) as FamilySymbol;
        var level = (Level)document.GetElement(wall.LevelId);
        document.Create.NewFamilyInstance(position, symbol, wall, level, StructuralType.NonStructural);

        transaction.Commit();
    }

    return Result.Succeeded;
}

完成 Revit API getting started material,所有内容都会得到解释。这将为您和其他人节省更多的问题和答案。

无论如何要解决这个具体问题,GetDefaultFamilyTypeId 大概不会按照您对墙元素的预期进行操作。在 GetDefaultFamilyTypeId method API documentation 中,它用于结构柱,这是一个由单独的 RFA 文件托管的标准可加载族。墙是内置的系统族并且表现不同。也许GetDefaultFamilyTypeId只适用于非系统家庭。

要检索任意(非默认)墙类型,请使用过滤元素收集器检索所有 WallType 元素并选择找到的第一个。

这是从 The Building Coder 关于 创建面墙和体量地板的讨论中选择第一个具有特定名称的代码片段 :

WallType wType = new FilteredElementCollector( doc )
  .OfClass( typeof( WallType ) )
  .Cast<WallType>().FirstOrDefault( q
    => q.Name == "Generic - 6\" Masonry" );