Создал тестовый проект. 5 стен, два помещения. На одной из стен сделал проем, который затрагивает 2 помещения.
Написал такой вот макрос. Как только нашли нашу стенку в выбранном помещении, отображаем сообщение с площадью.
public void CalcSubArea()
{
var doc = Document;
var selectedRooms = Selection
.GetElementIds()
.OfType<ElementId>()
.Select(x=>doc.GetElement(x))
.OfType<Room>()
.ToList();
List<Room> rooms;
if (selectedRooms.Count ==0)
{
rooms = new FilteredElementCollector(doc)
.WherePasses(new RoomFilter())
.OfType<Room>()
.ToList();
}
else
{
rooms = selectedRooms;
}
using (var t = new Transaction(doc, "Create Room Solids"))
{
t.Start();
SpatialElementGeometryCalculator calculator = new SpatialElementGeometryCalculator(doc);
foreach (Room room in rooms)
{
SpatialElementGeometryResults results ;
results = calculator.CalculateSpatialElementGeometry(room);
var roomSolid = results.GetGeometry();
foreach (Face face in roomSolid.Faces)
{
var subfaces = results.GetBoundaryFaceInfo(face);
foreach (var subface in subfaces)
{
var elementId = subface.SpatialBoundaryElement.HostElementId;
//wall with opening
if (elementId.IntegerValue == 304732)
{
TaskDialog.Show("Area", subface.GetSubface().Area.ToString());
}
}
}
}
t.Commit();
}
}
Выбрал левое помещение, выполнил макрос. Затем удалил проем и выполнил его еще раз. Площадь изменилась.
Проект с макросом во вложении.