📐 AutoCAD APIbeginnerLayer Management

Manage AutoCAD Layers Programmatically

Create, modify, freeze, and organize AutoCAD layers using the .NET API for drawing standardization.

1 views12/14/2025

Manage AutoCAD Layers Programmatically

Application: AutoCAD .NET API
Category: Layer Management
Difficulty: Beginner
Language: C#

Problem

You need to create, modify, or organize layers in AutoCAD drawings - such as standardizing layer names, setting colors and linetypes, or freezing/thawing layers based on naming conventions.

Solution

Use the LayerTable and LayerTableRecord classes to manage layers. The LayerTable acts as a dictionary of all layers in the drawing, while each LayerTableRecord represents an individual layer with its properties.

Code Example: Create and Configure Layers

using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Colors;

[CommandMethod("CREATELAYERS")]
public void CreateStandardLayers()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable;
        
        // Define standard layers
        var standardLayers = new[]
        {
            new { Name = "A-WALL", Color = 7, LineWeight = LineWeight.LineWeight030 },
            new { Name = "A-DOOR", Color = 3, LineWeight = LineWeight.LineWeight025 },
            new { Name = "A-WINDOW", Color = 4, LineWeight = LineWeight.LineWeight025 },
            new { Name = "A-FURNITURE", Color = 8, LineWeight = LineWeight.LineWeight013 },
            new { Name = "A-ANNOTATION", Color = 1, LineWeight = LineWeight.LineWeight009 }
        };
        
        int createdCount = 0;
        
        foreach (var layerDef in standardLayers)
        {
            if (!lt.Has(layerDef.Name))
            {
                // Create new layer
                LayerTableRecord ltr = new LayerTableRecord();
                ltr.Name = layerDef.Name;
                ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, (short)layerDef.Color);
                ltr.LineWeight = layerDef.LineWeight;
                
                // Add to layer table
                lt.Add(ltr);
                tr.AddNewlyCreatedDBObject(ltr, true);
                
                createdCount++;
                ed.WriteMessage($"\nCreated layer: {layerDef.Name}");
            }
            else
            {
                ed.WriteMessage($"\nLayer already exists: {layerDef.Name}");
            }
        }
        
        tr.Commit();
        
        ed.WriteMessage($"\n\nTotal layers created: {createdCount}");
    }
}

Advanced: Modify Existing Layers

[CommandMethod("MODIFYLAYERS")]
public void ModifyLayerProperties()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
        
        foreach (ObjectId layerId in lt)
        {
            LayerTableRecord ltr = tr.GetObject(layerId, OpenMode.ForWrite) as LayerTableRecord;
            
            // Freeze all layers starting with "TEMP-"
            if (ltr.Name.StartsWith("TEMP-"))
            {
                ltr.IsFrozen = true;
            }
            
            // Lock all annotation layers
            if (ltr.Name.Contains("ANNOTATION"))
            {
                ltr.IsLocked = true;
            }
            
            // Set all structural layers to color 5 (blue)
            if (ltr.Name.StartsWith("S-"))
            {
                ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, 5);
            }
        }
        
        tr.Commit();
    }
}

Freeze/Thaw Layers by Pattern

[CommandMethod("FREEZELAYERS")]
public void FreezeLayersByPattern()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    
    // Prompt for pattern
    PromptStringOptions pso = new PromptStringOptions("\nEnter layer pattern to freeze (use * as wildcard): ");
    pso.AllowSpaces = false;
    PromptResult pr = ed.GetString(pso);
    
    if (pr.Status != PromptStatus.OK) return;
    
    string pattern = pr.StringResult.ToUpper();
    pattern = pattern.Replace("*", ".*"); // Convert to regex
    
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
        
        int frozenCount = 0;
        
        foreach (ObjectId layerId in lt)
        {
            LayerTableRecord ltr = tr.GetObject(layerId, OpenMode.ForWrite) as LayerTableRecord;
            
            // Don't freeze layer 0 or current layer
            if (ltr.Name == "0" || ltr.Name == db.Clayer.ToString())
                continue;
            
            if (System.Text.RegularExpressions.Regex.IsMatch(ltr.Name, pattern))
            {
                ltr.IsFrozen = true;
                frozenCount++;
                ed.WriteMessage($"\nFroze layer: {ltr.Name}");
            }
        }
        
        tr.Commit();
        
        ed.WriteMessage($"\n\nTotal layers frozen: {frozenCount}");
    }
}

Delete Unused Layers

[CommandMethod("PURGELAYERS")]
public void DeleteUnusedLayers()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
        
        List<ObjectId> layersToDelete = new List<ObjectId>();
        
        foreach (ObjectId layerId in lt)
        {
            LayerTableRecord ltr = tr.GetObject(layerId, OpenMode.ForRead) as LayerTableRecord;
            
            // Skip layer 0, Defpoints, and current layer
            if (ltr.Name == "0" || ltr.Name == "Defpoints" || layerId == db.Clayer)
                continue;
            
            // Check if layer is empty
            if (!ltr.IsUsed)
            {
                layersToDelete.Add(layerId);
            }
        }
        
        // Delete layers
        foreach (ObjectId layerId in layersToDelete)
        {
            LayerTableRecord ltr = tr.GetObject(layerId, OpenMode.ForWrite) as LayerTableRecord;
            
            try
            {
                ltr.Erase();
                ed.WriteMessage($"\nDeleted layer: {ltr.Name}");
            }
            catch
            {
                ed.WriteMessage($"\nCould not delete layer: {ltr.Name}");
            }
        }
        
        tr.Commit();
        
        ed.WriteMessage($"\n\nTotal layers deleted: {layersToDelete.Count}");
    }
}

Set Current Layer

[CommandMethod("SETLAYER")]
public void SetCurrentLayer()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    
    // Prompt for layer name
    PromptStringOptions pso = new PromptStringOptions("\nEnter layer name: ");
    PromptResult pr = ed.GetString(pso);
    
    if (pr.Status != PromptStatus.OK) return;
    
    string layerName = pr.StringResult.ToUpper();
    
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
        
        if (lt.Has(layerName))
        {
            ObjectId layerId = lt[layerName];
            LayerTableRecord ltr = tr.GetObject(layerId, OpenMode.ForRead) as LayerTableRecord;
            
            // Check if layer is frozen or off
            if (ltr.IsFrozen)
            {
                ed.WriteMessage("\nCannot set frozen layer as current.");
                return;
            }
            
            if (ltr.IsOff)
            {
                ed.WriteMessage("\nCannot set layer that is off as current.");
                return;
            }
            
            // Set as current layer
            db.Clayer = layerId;
            
            ed.WriteMessage($"\nCurrent layer set to: {layerName}");
        }
        else
        {
            ed.WriteMessage($"\nLayer not found: {layerName}");
        }
        
        tr.Commit();
    }
}

Export Layer List to CSV

[CommandMethod("EXPORTLAYERS")]
public void ExportLayerList()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
        
        System.Text.StringBuilder csv = new System.Text.StringBuilder();
        csv.AppendLine("Layer Name,Color,Linetype,LineWeight,Frozen,Locked,Off");
        
        foreach (ObjectId layerId in lt)
        {
            LayerTableRecord ltr = tr.GetObject(layerId, OpenMode.ForRead) as LayerTableRecord;
            
            LinetypeTableRecord linetypeRec = tr.GetObject(ltr.LinetypeObjectId, OpenMode.ForRead) as LinetypeTableRecord;
            
            csv.AppendLine($"{ltr.Name}," +
                          $"{ltr.Color.ColorIndex}," +
                          $"{linetypeRec.Name}," +
                          $"{ltr.LineWeight}," +
                          $"{ltr.IsFrozen}," +
                          $"{ltr.IsLocked}," +
                          $"{ltr.IsOff}");
        }
        
        tr.Commit();
        
        string csvPath = @"C:\Temp\LayerList.csv";
        System.IO.File.WriteAllText(csvPath, csv.ToString());
        
        ed.WriteMessage($"\nLayer list exported to: {csvPath}");
    }
}

Key Points

  • Layer "0" cannot be deleted or renamed
  • Cannot set frozen or off layers as current
  • Use IsUsed property to check if layer contains objects
  • Layer colors use ACI (AutoCAD Color Index) from 1-255
  • LineWeight values are enum members (e.g., LineWeight025 = 0.25mm)

Common Pitfalls

Mistake: Not checking if layer exists before accessing

// WRONG - throws exception if layer doesn't exist
ObjectId layerId = lt["WALLS"];

// CORRECT - check first
if (lt.Has("WALLS"))
{
    ObjectId layerId = lt["WALLS"];
}

Mistake: Trying to delete layer 0 or current layer

// WRONG - will fail
ltr.Erase(); // Fails if this is layer 0 or current

// CORRECT - check first
if (ltr.Name != "0" && layerId != db.Clayer)
{
    ltr.Erase();
}

Related Topics

  • Layer filters
  • Layer states
  • Layer standards
  • Xref layer management
  • Layer property overrides in viewports

Code Example

C#
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Colors;

[CommandMethod("CREATELAYERS")]
public void CreateStandardLayers()
{
    Document doc = Application.DocumentManager.MdiActiveDocument;
    Database db = doc.Database;
    Editor ed = doc.Editor;
    
    using (Transaction tr = db.TransactionManager.StartTransaction())
    {
        LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForWrite) as LayerTable;
        
        // Define standard layers
        var standardLayers = new[]
        {
            new { Name = "A-WALL", Color = 7, LineWeight = LineWeight.LineWeight030 },
            new { Name = "A-DOOR", Color = 3, LineWeight = LineWeight.LineWeight025 },
            new { Name = "A-WINDOW", Color = 4, LineWeight = LineWeight.LineWeight025 },
            new { Name = "A-FURNITURE", Color = 8, LineWeight = LineWeight.LineWeight013 },
            new { Name = "A-ANNOTATION", Color = 1, LineWeight = LineWeight.LineWeight009 }
        };
        
        int createdCount = 0;
        
        foreach (var layerDef in standardLayers)
        {
            if (!lt.Has(layerDef.Name))
            {
                // Create new layer
                LayerTableRecord ltr = new LayerTableRecord();
                ltr.Name = layerDef.Name;
                ltr.Color = Color.FromColorIndex(ColorMethod.ByAci, (short)layerDef.Color);
                ltr.LineWeight = layerDef.LineWeight;
                
                // Add to layer table
                lt.Add(ltr);
                tr.AddNewlyCreatedDBObject(ltr, true);
                
                createdCount++;
                ed.WriteMessage($"\nCreated layer: {layerDef.Name}");
            }
            else
            {
                ed.WriteMessage($"\nLayer already exists: {layerDef.Name}");
            }
        }
        
        tr.Commit();
        
        ed.WriteMessage($"\n\nTotal layers created: {createdCount}");
    }
}