Room and Space Geometry

Room and Space Geometry

The Revit API provides access to the 3D geometry of spatial elements (rooms and spaces).

The SpatialElementGeometryCalculator class can be used to calculate the geometry of a spatial element and obtain the relationships between the geometry and the element's boundary elements. There are 2 options which can be provided to this utility:

The results of calculating the geometry are contained in the class SpatialElementGeometryResults. From the SpatialElementGeometryResults class, you can obtain:

Each subface offers:

Some notes about the use of this utility:

The following example calculates a room's geometry and finds its boundary faces

Code Region: Face Area using SpatialElementGeometryCalculator

SpatialElementGeometryCalculator calculator = new SpatialElementGeometryCalculator(doc);

// compute the room geometry
SpatialElementGeometryResults results = calculator.CalculateSpatialElementGeometry(room);

// get the solid representing the room's geometry
Solid roomSolid = results.GetGeometry(); 

foreach (Face face in roomSolid.Faces)
{
    double faceArea = face.Area;

    // get the sub-faces for the face of the room
    IList<SpatialElementBoundarySubface> subfaceList = results.GetBoundaryFaceInfo(face);
    foreach (SpatialElementBoundarySubface subface in subfaceList)
    {
        if (subfaceList.Count > 1) // there are multiple sub-faces that define the face
        {
            // get the area of each sub-face
            double subfaceArea = subface.GetSubface().Area;             
            
            // sub-faces exist in situations such as when a room-bounding wall has been
            // horizontally split and the faces of each split wall combine to create the 
            // entire face of the room
        }
    }
}

The following example calculates a room's geometry and finds its the material of faces that belong to the elements that define the room.

Code Region: Face Material using SpatialElementGeometryCalculator

public void MaterialFromFace()
{
        string s = "";
    Document doc = this.Document;
        UIDocument uidoc = new UIDocument(doc);
        Room room = doc.GetElement(uidoc.Selection.PickObject(ObjectType.Element).ElementId) as Room;
        
        SpatialElementBoundaryOptions  spatialElementBoundaryOptions = new SpatialElementBoundaryOptions();
        spatialElementBoundaryOptions.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Finish;
        SpatialElementGeometryCalculator calculator = new SpatialElementGeometryCalculator(doc, spatialElementBoundaryOptions);
        SpatialElementGeometryResults results = calculator.CalculateSpatialElementGeometry(room);
        Solid roomSolid = results.GetGeometry(); 

        foreach (Face roomSolidFace in roomSolid.Faces)
        {
            foreach (SpatialElementBoundarySubface subface in results.GetBoundaryFaceInfo(roomSolidFace))
            {
                Face boundingElementface = subface.GetBoundingElementFace();
                ElementId id = boundingElementface.MaterialElementId;
                s +=  doc.GetElement(id).Name + ", id = " + id.IntegerValue.ToString() + "\n";
            }
        }
    TaskDialog.Show("revit",s);                 
}