简介
在使用 Dynamo 的过程,想把房间里的所有的构建都找出来,发现如果构件数量较多的话,性能上有很大的问题。于是还是使用API来找房间里的构件。
思路也很简单:
- 找到房间(可以单选,你也可以把所有房间都过滤出来)
- 把房间的几何图形找出来,这个就需要你自己确保房间是有几何形体的了
- 使用
ElementIntersectsSolidFilter
去求交,得到所有相交的构件
代码
可以单选,你也可以把所有房间都过滤出来。
namespace ElementInRoom
{
// 所有房间
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class ElementInRoomCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;
// Get all rooms
FilteredElementCollector roomCollector = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms);
IList<Element> rooms = roomCollector.ToElements();
// Find elements in rooms
Dictionary<string, int> room2elements = new Dictionary<string, int>();
foreach(Room room in rooms)
{
if (room.Volume <= 0.01)
continue;
GeometryElement geomElement = room.get_Geometry(new Options());
Solid solid = null;
foreach (GeometryObject geomObj in geomElement)
{
solid = geomObj as Solid;
if (solid != null) break;
}
if (solid == null)
continue;
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(FamilyInstance));
collector.WherePasses(new ElementIntersectsSolidFilter(solid));
room2elements.Add(room.Name, collector.ToElementIds().Count);
}
// Make string
string result = "Result:\n";
foreach(KeyValuePair<string, int> keyValuePair in room2elements)
{
result += keyValuePair.Key + " has " + keyValuePair.Value + " elements.\n";
}
TaskDialog.Show("Elements in Room", result);
return Result.Succeeded;
}
}
// 单个房间
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
public class ElementInOneRoomCommand : IExternalCommand
{
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Document doc = uiDoc.Document;
// Select a room
Reference refer = uiDoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
Room room = doc.GetElement(refer.ElementId) as Room;
if(room == null)
{
TaskDialog.Show("Invalid room", "Please select a room!");
return Result.Succeeded;
}
// Find elements in rooms
GeometryElement geomElement = room.get_Geometry(new Options());
Solid solid = null;
foreach (GeometryObject geomObj in geomElement)
{
solid = geomObj as Solid;
if (solid != null) break;
}
if (solid == null)
{
TaskDialog.Show("Invalid room", "Please select a room!");
return Result.Succeeded;
}
FilteredElementCollector collector = new FilteredElementCollector(doc);
collector.OfClass(typeof(FamilyInstance));
collector.WherePasses(new ElementIntersectsSolidFilter(solid));
uiDoc.ShowElements(collector.ToElementIds());
uiDoc.Selection.SetElementIds(collector.ToElementIds());
return Result.Succeeded;
}
}
}