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

问题描述 投票:0回答:2

我只是想学习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
2个回答
2
投票

完成Revit API 入门材料,所有内容都会得到解释。这将为您和其他人节省许多进一步的问题和答案。

无论如何要解决这个具体问题,

GetDefaultFamilyTypeId
可能不会达到您对墙元素的期望。在
GetDefaultFamilyTypeId
方法 API 文档
中,它用于结构列,这是由单个 RFA 文件托管的标准可加载系列。墙是内置系统系列,其行为有所不同。也许
GetDefaultFamilyTypeId
只适用于非系统家庭。

要检索任意(非默认)墙壁类型,请使用过滤元素收集器检索所有

WallType
元素并选择您找到的第一个。

这里是一个代码片段,它从 The Building Coder 关于 Creating Face Wall 和 Mass Floor 的讨论中选择第一个具有特定名称的代码片段

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

© www.soinside.com 2019 - 2024. All rights reserved.