Message 1 of 3
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
[CommandMethod("Multilayer")]
public void CreateCustomLayersFixed()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor editor = doc.Editor;
Database database = doc.Database;
ObjectId layerId = database.LayerTableId;
// Sample list: (Layer Name, Description, Color Index)
List<(string name, string description, short colorIndex)> layersList = new List<(string name, string description, short colorIndex)>
{
("C-NTWK-ELE3-CABL-AERL-E", "Existing Aerial Cable", 55),
("C-NTWK-ELE3-CABL-AERL-P", "Proposed Aerial Cable", 4),
("C-NTWK-ELE3-CABL-AERL-T", "Temporary Aerial Cable", 160),
};
using (Transaction tr = database.TransactionManager.StartTransaction())
{
// Register "LayerDescriptions" for XData
RegAppTable regAppTable = tr.GetObject(database.RegAppTableId, OpenMode.ForRead) as RegAppTable;
if (!regAppTable.Has("LayerDescriptions"))
{
regAppTable.UpgradeOpen();
RegAppTableRecord regAppRecord = new RegAppTableRecord
{
Name = "LayerDescriptions"
};
regAppTable.Add(regAppRecord);
tr.AddNewlyCreatedDBObject(regAppRecord, true);
}
LayerTable layerTable = tr.GetObject(layerId, OpenMode.ForRead) as LayerTable;
foreach (var lay in layersList)
{
string name = lay.name;
string description = lay.description;
short colorIndex = lay.colorIndex;
editor.WriteMessage($"\nProcessing: Name='{name}', Description='{description}'"); // DEBUG
if (!layerTable.Has(name))
{
layerTable.UpgradeOpen();
LayerTableRecord newLayer = new LayerTableRecord
{
Name = name,
Color = Color.FromColorIndex(ColorMethod.ByAci, colorIndex),
Description = description
};
// Attach XData description
ResultBuffer xdata = new ResultBuffer(
new TypedValue((int)DxfCode.ExtendedDataRegAppName, "LayerDescriptions"),
new TypedValue((int)DxfCode.ExtendedDataAsciiString, description)
);
newLayer.XData = xdata;
layerTable.Add(newLayer);
tr.AddNewlyCreatedDBObject(newLayer, true);
editor.WriteMessage($"\n Created layer: {name} (Color: {colorIndex}, Desc: {description})");
}
else
{
LayerTableRecord existingLayer = (LayerTableRecord)tr.GetObject(layerTable[name], OpenMode.ForWrite);
existingLayer.Description = description;
editor.WriteMessage($"\nUpdated existing layer: {name} (Desc: {description})");
}
}
tr.Commit();
}
}
Solved! Go to Solution.