MaterialId Property


Id of the material assigned to this layer.

Namespace: Autodesk.Revit.DB
Assembly: RevitAPI (in RevitAPI.dll) Version: 22.0.0.0 (22.1.0.0)

Syntax

C#
public ElementId MaterialId { get; set; }
Visual Basic
Public Property MaterialId As ElementId
	Get
	Set
Visual C++
public:
property ElementId^ MaterialId {
	ElementId^ get ();
	void set (ElementId^ value);
}

Field Value

The default is InvalidElementId.

Examples

Copy C#
public void GetWallLayerMaterial(Autodesk.Revit.DB.Document document, Wall wall)
{
    // get WallType of wall
    WallType aWallType = wall.WallType;
    // Only Basic Wall has compoundStructure
    if (WallKind.Basic == aWallType.Kind)
    {
        // Get CompoundStructure
        CompoundStructure comStruct = aWallType.GetCompoundStructure();
        Categories allCategories = document.Settings.Categories;

        // Get the category OST_Walls default Material; 
        // use if that layer's default Material is <By Category>
        Category wallCategory = allCategories.get_Item(BuiltInCategory.OST_Walls);
        Autodesk.Revit.DB.Material wallMaterial = wallCategory.Material;

        foreach (CompoundStructureLayer structLayer in comStruct.GetLayers())
        {
            Autodesk.Revit.DB.Material layerMaterial = document.GetElement(structLayer.MaterialId) as Material;

            // If CompoundStructureLayer's Material is specified, use default
            // Material of its Category
            if (null == layerMaterial)
            {
                switch (structLayer.Function)
                {
                    case MaterialFunctionAssignment.Finish1:
                        layerMaterial = 
                            allCategories.get_Item(BuiltInCategory.OST_WallsFinish1).Material;
                        break;
                    case MaterialFunctionAssignment.Finish2:
                        layerMaterial = 
                            allCategories.get_Item(BuiltInCategory.OST_WallsFinish2).Material;
                        break;
                    case MaterialFunctionAssignment.Membrane:
                        layerMaterial = 
                            allCategories.get_Item(BuiltInCategory.OST_WallsMembrane).Material;
                        break;
                    case MaterialFunctionAssignment.Structure:
                        layerMaterial =  
                            allCategories.get_Item(BuiltInCategory.OST_WallsStructure).Material;
                        break;
                    case MaterialFunctionAssignment.Substrate:
                        layerMaterial = 
                            allCategories.get_Item(BuiltInCategory.OST_WallsSubstrate).Material;
                        break;
                    case MaterialFunctionAssignment.Insulation:
                        layerMaterial = 
                            allCategories.get_Item(BuiltInCategory.OST_WallsInsulation).Material;
                        break;
                    default:
                        // It is impossible to reach here
                        break;
                }
                if (null == layerMaterial)
                {
                    // CompoundStructureLayer's default Material is its SubCategory
                    layerMaterial = wallMaterial;
                }
            }
            TaskDialog.Show("Revit","Layer Material: " + layerMaterial);
        }
    }
}
Copy VB.NET
Public Sub GetWallLayerMaterial(document As Autodesk.Revit.DB.Document, wall As Wall)
    ' get WallType of wall
    Dim aWallType As WallType = wall.WallType
    ' Only Basic Wall has compoundStructure
    If WallKind.Basic = aWallType.Kind Then
        ' Get CompoundStructure
        Dim comStruct As CompoundStructure = aWallType.GetCompoundStructure()
        Dim allCategories As Categories = document.Settings.Categories

        ' Get the category OST_Walls default Material; 
        ' use if that layer's default Material is <By Category>
        Dim wallCategory As Category = allCategories.Item(BuiltInCategory.OST_Walls)
        Dim wallMaterial As Autodesk.Revit.DB.Material = wallCategory.Material

        For Each structLayer As CompoundStructureLayer In comStruct.GetLayers()
            Dim layerMaterial As Autodesk.Revit.DB.Material = TryCast(document.GetElement(structLayer.MaterialId), Material)

            ' If CompoundStructureLayer's Material is specified, use default
            ' Material of its Category
            If layerMaterial Is Nothing Then
                Select Case structLayer.[Function]
                    Case MaterialFunctionAssignment.Finish1
                        layerMaterial = allCategories.Item(BuiltInCategory.OST_WallsFinish1).Material
                        Exit Select
                    Case MaterialFunctionAssignment.Finish2
                        layerMaterial = allCategories.Item(BuiltInCategory.OST_WallsFinish2).Material
                        Exit Select
                    Case MaterialFunctionAssignment.Membrane
                        layerMaterial = allCategories.Item(BuiltInCategory.OST_WallsMembrane).Material
                        Exit Select
                    Case MaterialFunctionAssignment.[Structure]
                        layerMaterial = allCategories.Item(BuiltInCategory.OST_WallsStructure).Material
                        Exit Select
                    Case MaterialFunctionAssignment.Substrate
                        layerMaterial = allCategories.Item(BuiltInCategory.OST_WallsSubstrate).Material
                        Exit Select
                    Case MaterialFunctionAssignment.Insulation
                        layerMaterial = allCategories.Item(BuiltInCategory.OST_WallsInsulation).Material
                        Exit Select
                    Case Else
                        ' It is impossible to reach here
                        Exit Select
                End Select
                If layerMaterial Is Nothing Then
                    ' CompoundStructureLayer's default Material is its SubCategory
                    layerMaterial = wallMaterial
                End If
            End If
            TaskDialog.Show("Revit", "Layer Material: " & layerMaterial.ToString())
        Next
    End If
End Sub

Exceptions

Exception Condition
Autodesk.Revit.Exceptions ArgumentNullException When setting this property: A non-optional argument was null

See Also

ArchiLabs Desktop

Put AI to work inside Revit.

Give Desktop your instructions and project files to build Revit families, update model elements, and create views and schedules. Works directly in Revit and AutoCAD.

Explore Desktop →