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.
Solved by skeletank. Go to Solution.
I tried calling GenerateUsageData before doing a foreach loop on the LayerTable but it still didn't return all the layers.
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.
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 } } }
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.
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?