Application: AutoCAD .NET API
Category: Layer Management
Difficulty: Beginner
Language: C#
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.
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.
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}");
}
}
[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();
}
}
[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}");
}
}
[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}");
}
}
[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();
}
}
[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}");
}
}
IsUsed property to check if layer contains objectsMistake: 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();
}
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}");
}
}