- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hi,
I have been trying to rename layers in my drawing using following method. It runs perfectly on my AutoCAD files. However, when I have any of the Civil3D Drawings, the method is able to rename the layers in it just fine. However, because side loading the drawing into a database doesn't read the civil3d styles automatically. it breaks the hard references of the layers in AEC objects like alignment styles, corridor styles, etc. I have tried resetting the styles directly in using .net as well, but while sideloading the database, it doesn't read any styles in the drawing.
Am i missing something?
public static void UpdateLayerNamesInDrawings(this List<DrawingModel> dwgModels)
{
foreach (var dwgModel in dwgModels)
{
try
{
// Use .NET API for AutoCAD Files.
var trDel = new TransactionDelegates();
using (var extDb = new Database(true, false))
{
extDb.ReadDwgFile(dwgModel.Path, System.IO.FileShare.ReadWrite, true, "");
extDb.CloseInput(true);
trDel.UsingLayerTable((tr, layerTable) =>
{
layerTable.UpgradeOpen();
// Update layer name to layerModel.UpdateLayerNameTo and change status -> changed.
foreach (var lm in dwgModel.LayerModels)
{
try
{
if (!IsLayerNameUpdatable(layerTable, lm))
continue;
// Update layer name
var layer = (LayerTableRecord)tr.GetObject(layerTable[lm.OriginalName], OpenMode.ForWrite);
layer.Name = lm.UpdateNameTo;
// Change status to Updated Name only.
lm.LayerNameChangeStatus = LayerModel.Changestatus.UpdatedNameOnly;
}
catch (Exception ex)
{
lm.AppendComment($"Error Occured: {ex.Message}");
}
}
}, extDb);
/// Save drawing
extDb.SaveAs(dwgModel.Path, DwgVersion.Current); // Save a copy.
}
}
catch (Exception ex)
{
// Return original layerModels
foreach (var lm in dwgModel.LayerModels)
lm.AppendComment($"Failed to run Autopilot on Document Level {ex.Message}");
}
}
}
I have wrapped the boilerplate transaction related code in a delegate, if anyone is interested in that here it is:
public void UsingLayerTable(Action<Transaction, LayerTable> action, Database db)
{
if (db == null) db = Active.Database;
using (var tr = db.TransactionManager.StartTransaction())
{
// Open layer table
var layerTable = (LayerTable)tr.GetObject(db.LayerTableId, OpenMode.ForRead);
action(tr, layerTable);
tr.Commit();
}
}
Solved! Go to Solution.