Programmatically refresh layer usage information .NET

Programmatically refresh layer usage information .NET

Anonymous
Not applicable
2,776 Views
7 Replies
Message 1 of 8

Programmatically refresh layer usage information .NET

Anonymous
Not applicable

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.

0 Likes
Accepted solutions (1)
2,777 Views
7 Replies
Replies (7)
Message 2 of 8

Anonymous
Not applicable

Have not tested it but have you tried the LayerTable method GenerateUsageData

0 Likes
Message 3 of 8

Anonymous
Not applicable

I tried calling GenerateUsageData before doing a foreach loop on the LayerTable but it still didn't return all the layers.

0 Likes
Message 4 of 8

Anonymous
Not applicable

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.

0 Likes
Message 5 of 8

Anonymous
Not applicable

Can you post your code that would help alot for helping you out.

0 Likes
Message 6 of 8

Anonymous
Not applicable

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
          }
        }
      }

 

0 Likes
Message 7 of 8

Anonymous
Not applicable
Accepted solution

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.

0 Likes
Message 8 of 8

harryliu3140
Enthusiast
Enthusiast

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?

0 Likes