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" );
我只是想学习 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" );