我只是想学习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 入门材料,所有内容都会得到解释。这将为您和其他人节省许多进一步的问题和答案。
无论如何要解决这个具体问题,
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" );