Kean Walmsley

July 2009

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

Twitter Updates

    follow me on Twitter



    « Adding to the AutoCAD pickfirst set with .NET | Main | Using .NET reflection with AutoCAD to change object properties - Part 1 »

    February 02, 2007

    Changing the colour of nested AutoCAD entities through .NET

    Someone asked me earlier today how to iteratively change the color of entities inside blocks.

    The following code uses a recursive helper function to iterate down through the contents of a block, changing the various entities (other than block references, for which we simply recurse) to a specified colour.

    Here's the C# code:

    using Autodesk.AutoCAD.ApplicationServices;

    using Autodesk.AutoCAD.DatabaseServices;

    using Autodesk.AutoCAD.EditorInput;

    using Autodesk.AutoCAD.Runtime;

    using Autodesk.AutoCAD.Colors;


    namespace BlockTest

    {

      public class BlockCmds

      {

        [CommandMethod("CC")]

        public void ChangeColor()

        {

          Document doc =

            Application.DocumentManager.MdiActiveDocument;

          Database db = doc.Database;

          Editor ed = doc.Editor;


          PromptIntegerResult pr =

            ed.GetInteger(

              "\nEnter color index to change all entities to: "

            );


          if (pr.Status == PromptStatus.OK)

          {

            short newColorIndex = (short)pr.Value;

            ObjectId msId;

            Transaction tr =

              doc.TransactionManager.StartTransaction();

            using (tr)

            {

              BlockTable bt =

                (BlockTable)tr.GetObject(

                  db.BlockTableId,

                  OpenMode.ForRead

                );

              msId =

                bt[BlockTableRecord.ModelSpace];


              // Not needed, but quicker than aborting

              tr.Commit();

            }

            int count =

              ChangeNestedEntitiesToColor(msId, newColorIndex);

            ed.Regen();

            ed.WriteMessage(

              "\nChanged {0} entit{1} to color {2}.",

              count,

              count == 1 ? "y" : "ies",

              newColorIndex

            );

          }

        }


        private int ChangeNestedEntitiesToColor(

          ObjectId btrId, short colorIndex)

        {

          int changedCount = 0;

          Document doc =

            Application.DocumentManager.MdiActiveDocument;

          Database db = doc.Database;

          Editor ed = doc.Editor;

          Transaction tr =

            doc.TransactionManager.StartTransaction();

          using (tr)

          {

            BlockTableRecord btr =

              (BlockTableRecord)tr.GetObject(

                btrId,

                OpenMode.ForRead

              );

            foreach (ObjectId entId in btr)

            {

              Entity ent =

                tr.GetObject(entId, OpenMode.ForRead)

                as Entity;


              if (ent != null)

              {

                BlockReference br = ent as BlockReference;

                if (br != null)

                {

                  // Recurse for nested blocks

                  changedCount +=

                    ChangeNestedEntitiesToColor(

                      br.BlockTableRecord,

                      colorIndex

                    );

                }

                else

                {

                  if (ent.ColorIndex != colorIndex)

                  {

                    changedCount++;

                    // Entity is only open for read

                    ent.UpgradeOpen();

                    ent.ColorIndex = colorIndex;

                    ent.DowngradeOpen();

                  }

                }

              }

            }

            tr.Commit();

          }

          return changedCount;

        }

      }

    }

    TrackBack

    TrackBack URL for this entry:
    http://www.typepad.com/services/trackback/6a00d83452464869e200d8353db50d53ef

    Listed below are links to weblogs that reference Changing the colour of nested AutoCAD entities through .NET:

    Comments


    Dear Kean

    I´m working with .Net and Autocad. I´m trying to run a rutine that change the color of an object (line), I know how
    to do this with one color, but i want to change the line in various colors, for example from red to green to yellow in intervals of time, the rutine must be run while i´m working
    in the draw ( for example while i´m doing zoom ) but i need the line back to the original color when i do a click (event)
    with the mouse. I can´t find the solution, can you help me ?!

    Dear Claudio,

    It's certainly possible to set a timer and cycle through colours on a set of objects - the issue is doing so during a realtime pan/zoom and also accessing the database in a safe way irrespective of what is happening in the editor.

    Frankly I'd look at leveraging the in-built selection highlighting mechanism inside AutoCAD, which would be much safer.

    Regards,

    Kean

    Kean,
    thanks for your info, but I am still stuck. I am using acad2006 - I have a folder full of small A3 drgs, each with a title block. I want to update the attributes of the Revision from A to B and insert "issued for construction" and the date etc. How can I do this using Global Attribute Editing techniques for Multiple drawings?
    Cheers
    TonyE

    TonyE,

    I suggest checking out this post.

    Regards,

    Kean

    TonyE,

    I suggest checking out this post.

    Regards,

    Kean

    Verify your Comment

    Previewing your Comment

    This is only a preview. Your comment has not yet been posted.

    Working...
    Your comment could not be posted. Error type:
    Your comment has been posted. Post another comment

    The letters and numbers you entered did not match the image. Please try again.

    As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

    Having trouble reading this image? View an alternate.

    Working...

    Post a comment

    Feed & Share

    Search