0

我对如何访问 Revit 的元素数据(例如元素的参数、位置、ID 等)有点困惑。如果我有以下代码:

collector = FilteredElementCollector(doc)
collector.OfCategory(BuiltInCategory.OST_Walls)
walls = collector.OfClass(FamilySymbol)
return walls

它将打印:Autodesk.Revit.DB.FilteredElementCollector object at 0x0000000000000038 [Auto...]。我从这里去哪里?例如,我如何获得墙壁位置的返回?

这里可能有很多,每个项目都有多个步骤。我主要是在寻找获取和/或设置新元素数据的一般概念。

有什么想法吗?

4

2 回答 2

1

我对 Python 无能为力,但我对 Revit 的 API + C# 非常熟悉。

您正在使用收集器列出项目中的所有墙壁。您想要(获取位置)是这些墙的 FamilyInstance 对象。

在 C# 中会是这样的:

new FilteredElementCollector(uidoc.Document).OfClass(FamilyInstance).ToElements();

接下来,您应该循环结果以获取每个单独的元素并将其转换为墙:

foreach (Wall i in instances)
{
   var location = i.Location as LocationCurve;

   // The Curve element is a Line - 2 points defining it's position
   var p0 = location.Curve.GetEndPoint(0);
   var p1 = location.Curve.GetEndPoint(1);
}

您想要的大部分信息都在此 FamilyInstance 对象上-> http://wikihelp.autodesk.com/Revit/enu/2014/Help/3665-Developers/0074-Revit_Ge74/0083-Family_I83/0086-FamilyIn86

于 2014-02-07T02:57:10.153 回答
0

Revit API 文档指出 aFilteredElementCollectorIEnumerable<Element>. 所以你实际上有一个墙对象列表。我喜欢将这些添加到 python 列表中,以便更轻松地使用它们:

walls = list(collector)

在幕后,list(collector)将执行以下操作:

walls = []
for w in collector:
    walls.append(w)

(请注意,这实际上并不是它的工作原理,而是对其进行了某种解释)。

您可以通过执行以下操作使用 .NET 内部工作来枚举墙壁collector

enumerator = collector.GetEnumerator()
walls = []
while not enumerator.IsDone():
    walls.append(enumerator.Current)
    enumerator.MoveNext()

您将要检查该collector.OfClass(FamilySymbol)行是否正确-在我的示例文档中,该行产生了一个空列表-但也许您确实有墙FamilySymbol...

接下来,您要使用墙壁对象。所以,拿第一面墙:

wall = walls[0]
interior_type_parameter = wall.Parameter['Interior Type']

然后使用参数... 用这个!探索!玩得开心!

于 2014-02-07T08:13:01.133 回答