Attribute value changer in C#

Top  Previous 

Here is an attribute value changer in C#:

 

// This class lets you assign a block name an its attributes for change of the attributes

 

using System;

using System.Collections.Generic;

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

using Autodesk.AutoCAD.EditorInput;

using Autodesk.AutoCAD.Geometry;

 

namespace AU.MySoftware

{

  public class CTagValPair

   {

      public string m_sTag = "";

      public string m_sVal = "";

 

      public CTagValPair (string sTag, string sVal)

       {

           m_sTag = sTag;

           m_sVal = sVal;

       }

   }

 

 

  public class CAttChanger

   {

      // Inserts of this block may have attributes associated with them...

      private string m_sBlockName;

      public string BlockName

       {

          get

           {

              return m_sBlockName;

           }

       }

 

      // This is the list of tag names and the new values to assign to them...

      private List<CTagValPair> m_TagValList = new List<CTagValPair>() ;

 

 

      // We assume that you'll want to change at least one and at most three values

      public CAttChanger(string sBlockName, CTagValPair Pair1, CTagValPair Pair2 = null, CTagValPair Pair3 = null)

       {

           m_sBlockName = sBlockName;

 

           m_TagValList.Add(Pair1);

 

          if (Pair2 != null)

           {

               m_TagValList.Add(Pair2);

           }

 

          if (Pair3 != null)

           {

               m_TagValList.Add(Pair3);

           }

       }

 

 

      // We change all the values in the attributes to the ones in our own list

      // We assume the block name is correct and we only change pairs wihich match our tags

      public void ChangeValues(BlockReference Insert, OpenCloseTransaction tr)

       {

          AttributeCollection InsertAtts = Insert.AttributeCollection;

          int iNumAttribs = InsertAtts.Count;

          if (iNumAttribs == 0)

           {

              // Odd, but get out quick anyway

              return;

           }          

         

          foreach (ObjectId attId in InsertAtts)

           {

              AttributeReference attref = (AttributeReference)tr.GetObject(attId, OpenMode.ForWrite);

              foreach (CTagValPair TagPair in m_TagValList)

               {

                  if (TagPair.m_sTag == attref.Tag)

                   {

                      // I have a tag inside me which matches the attribute list passed to me...

                      try

                       {

                          LogWriter.LogWrite("Found reason tag to change " + attref.Tag + " value <" + attref.TextString + ">");

                           attref.TextString = TagPair.m_sVal;

                          LogWriter.LogWrite("Changed to <" + attref.TextString + ">");

                       }

                      catch (Autodesk.AutoCAD.Runtime.Exception e)

                       {

                          LogWriter.LogWrite("Exception " + e.Message);

                       }

                   }

               }

           }

       }

   }

}

 

It can be used like this:

 

 

      // This is a list of block names and attributes we want to change  

      static private readonly IList<CAttChanger> m_AttChangeTable = new ReadOnlyCollection<CAttChanger>

           (new[]

               {

                  new CAttChanger("CART_MECC_V002", // block name

                      new CTagValPair ("OGGETTO_REV","Sostituzione cappuccio"), // tag and value

                      new CTagValPair ("STATO_DA","Ransen"), // tag and value

                      new CTagValPair ("DATA_STATO","23.07.2019") // tag and value

                       ) ,

 

                   new CAttChanger("TC_LUVE_TEMPLATE",

                       new CTagValPair ("TC_DATE","23/07/2019"),

                       new CTagValPair ("TC_CHANGE_REASON","Sostituzione cappuccio")

                       ) ,

 

                  new CAttChanger("A1",

                      new CTagValPair ("MODIFICA","Sostituzione cappuccio"),

                      new CTagValPair ("DISEGN","Ransen"),

                      new CTagValPair ("DATAEM","23.07.2019")

                       ) ,

               }

           );

 

      public static void UpdateRevisionStuff(Database db)

       {

          using (var tr = db.TransactionManager.StartOpenCloseTransaction())

           {

              // Get the top level block table...

              BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForWrite);

 

              // Get the model space block table record (which contains block references within it)

              BlockTableRecord btrModelSpace = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

 

              // For every entity in the ModelSpace block table record....

              foreach (ObjectId btrId in btrModelSpace)

               {

                  if (btrId.ObjectClass.Name != "AcDbBlockReference")

                   {

                      continue; // this is not an insert

                   }

 

                  BlockReference Insert = (BlockReference)tr.GetObject(btrId, OpenMode.ForRead);

                  string sInsertedBlockName = Insert.Name;

 

                  foreach (CAttChanger Changer in m_AttChangeTable)

                   {

                      if (sInsertedBlockName == Changer.BlockName)

                       {

                           Changer.ChangeValues(Insert,tr);

                       }

                   }

               }

               tr.Commit();

           }

       }

 

Easy once you know how!