.NET
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic to the Top
- Bookmark
- Subscribe
- Printer Friendly Page
Programmat ically refresh layer usage informatio n .NET
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
In C# I noticed that when I loop through the LayerTableRecords in the LayerTable some of the layers in the drawing do not show up. If I look at the layers in the UI it shows the missing layers with a grey icon for their status while the ones that it does detect have a blue icon for their status. The status has to do with which layers that the drawing believes are in use. In the UI you can press a refresh button and this will fix the problem. I want to know how I can fix this through the .NET API, COM API, or command line.
Solved! Go to Solution.
Re: Programmat ically refresh layer usage informatio n .NET
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Have not tested it but have you tried the LayerTable method GenerateUsageData
Re: Programmat ically refresh layer usage informatio n .NET
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
I tried calling GenerateUsageData before doing a foreach loop on the LayerTable but it still didn't return all the layers.
Re: Programmat ically refresh layer usage informatio n .NET
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Another thing that I noticed is that this problem only occurs when I open the database using Database.ReadDwgFile. If I first open the drawing using Application.DocumentManager.Open and then get the database from MdiActiveDocument then all of the layers show up correctly. I would open the drawing but it is much faster to alter the database. All that I'm doing is setting Freeze/On/Locked on the layers.
Re: Programmat ically refresh layer usage informatio n .NET
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Can you post your code that would help alot for helping you out.
Re: Programmat ically refresh layer usage informatio n .NET
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
The following shows two examples of enumerating through the layers. The second option will work, but I as I said earlier I do not want to open the drawing.
Here's the code for just opening the database:
using (Database database = new Database(false, true))
{
database.ReadDwgFile(drawingFilePath, FileShare.ReadWrite, true, String.Empty);
using (Transaction transaction = database.TransactionManager.StartTransaction())
{
LayerTable layerTable = transaction.GetObject(database.LayerTableId, OpenMode.ForWrite) as LayerTable;
database.Clayer = database.LayerZero;
foreach (ObjectId layerID in layerTable)
{
LayerTableRecord layer = (LayerTableRecord)transaction.GetObject(layerID, OpenMode.ForWrite);
//Do something to layer
}
transaction.Commit();
}
}
Here's the code when opening the drawing:
Application.DocumentManager.Open(drawingFilePath, false);
Document document = Application.DocumentManager.MdiActiveDocument;
Database database = document.Database;
DocumentLock documentLock = document.LockDocument(DocumentLockMode.Write, null, null, true);
using (documentLock)
{
using (Transaction transaction = database.TransactionManager.StartTransaction())
{
LayerTable layerTable = transaction.GetObject(database.LayerTableId, OpenMode.ForWrite) as LayerTable;
database.Clayer = database.LayerZero;
foreach (ObjectId layerID in layerTable)
{
LayerTableRecord layer = (LayerTableRecord)transaction.GetObject(layerID, OpenMode.ForWrite);
//Do something to layer
}
}
}
Re: Programmat ically refresh layer usage informatio n .NET
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
It seems that the problem was that one of the entities in the particular drawing was corrupt. When one of the users recreated the drawing (including re-adding some xrefs) and ran the program it worked just fine. I also double checked the code and it was definitely hitting the correct layers this time. I am however open to suggestions or solutions on how to detect corruption problems in AutoCAD drawings.
Re: Programmat ically refresh layer usage informatio n .NET
- Mark as New
- Bookmark
- Subscribe
- Subscribe to RSS Feed
- Highlight
- Email to a Friend
- Report Inappropriate Content
Exactly the same issue hasn't been solved in ACAD2012. I tried to Audit and recover my dwg file and found nothing corrupted. How many years needed to solve it?

