Author Topic: Replace block and change value of conterminous attributes  (Read 458 times)

0 Members and 1 Guest are viewing this topic.

Offline fixo

  • Full Member
  • ***
  • Posts: 135
  • Karma: +4/-0
  • Gender: Male
    • prefered language: C
    • Prog expertise: Good
    • View Profile
Replace block and change value of conterminous attributes
« on: May 22, 2012, 06:40:26 PM »
         
Code: [Select]
        [CommandMethod("TestReplace")]
        public static void TestReplaceWithAttributes()
        {
            Database db = HostApplicationServices.WorkingDatabase;
            Document doc = acadApp.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            try
            {
            using (Transaction tr = db.TransactionManager.StartTransaction())
            {
                //----------------------------------------------------------
                PromptEntityOptions peo = new PromptEntityOptions("\nSelect the block instance >>");
                peo.SetRejectMessage("\nYou have to select the block instance only >>");
                peo.AddAllowedClass(typeof(BlockReference), false);
                PromptEntityResult res;
                res = ed.GetEntity(peo);
                if (res.Status != PromptStatus.OK)
                    return;
                Entity ent = (Entity)tr.GetObject(res.ObjectId, OpenMode.ForRead);
                if (ent == null)
                    return;
                BlockReference bref = (BlockReference)ent as BlockReference;
                if (bref == null) return;

                //----------------------------------------------------------
                PromptStringOptions pso = new PromptStringOptions("\nEnter a block name to replace : ");
                pso.AllowSpaces = true;
                pso.UseDefaultValue = true;
                pso.DefaultValue = "newblock";//  <---    change a new block name here
                PromptResult stres;
                string repblk = string.Empty;
                stres = ed.GetString(pso);
                if (stres.Status == PromptStatus.OK)
                {
                    repblk = stres.StringResult;
                }
                if (stres.Status == PromptStatus.None)
                {
                    repblk = "newblock";//  <---    change a new block name here
                }
                //----------------------------------------------------------
               
                BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;

                if (!bt.Has(repblk)) return;

                BlockTableRecord btrec = null;

                if (bref.IsDynamicBlock)
                {
                    btrec = tr.GetObject(bref.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;

                    if (btrec.IsAnonymous)
                    {
                        btrec = tr.GetObject(bref.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;                 
                    }

                }
                else
                {
                    btrec = tr.GetObject(bref.BlockTableRecord,   OpenMode.ForRead) as BlockTableRecord;   
                }
                //----------------------------------------------------------
               BlockTableRecord btr =  tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
               //----------------------------------------------------------
               Dictionary<string, string> attdic = new Dictionary<string, string>();

               if (btrec.HasAttributeDefinitions)
               {
                 AttributeCollection atts=  bref.AttributeCollection;
                 foreach (ObjectId id in atts)
                 {
                     DBObject obj = tr.GetObject(id, OpenMode.ForRead) as DBObject;
                     AttributeReference atref = obj as AttributeReference;
                     if (atref != null)
                         attdic.Add(atref.Tag.ToUpper(), atref.TextString);
                 }

               }
               //----------------------------------------------------------
               BlockTableRecord newbtrec =  tr.GetObject(bt[repblk], OpenMode.ForRead) as BlockTableRecord;
               Point3d inspt = bref.Position;
               BlockReference newbref = new BlockReference(inspt, bt[repblk]);
               if (!newbref.IsWriteEnabled) newbref.UpgradeOpen();
               newbref.BlockUnit = bref.BlockUnit;
               newbref.Layer = bref.Layer;
               newbref.Rotation = bref.Rotation;
               newbref.ScaleFactors = bref.ScaleFactors;
                btr.AppendEntity(newbref);
                tr.AddNewlyCreatedDBObject(newbref, true);
                //----------------------------------------------------------
                if (attdic.Count > 0)
                {
                    if (newbtrec.HasAttributeDefinitions)
                    {
                        AttributeCollection atcoll = newbref.AttributeCollection;

                        foreach (ObjectId subid in newbtrec)
                        {
                            Entity subent = (Entity)subid.GetObject(OpenMode.ForRead);

                            AttributeDefinition attDef = subent as AttributeDefinition;

                            if (attDef != null)
                            {                               

                                AttributeReference attRef = new AttributeReference();

                                attRef.SetPropertiesFrom(attDef);

                                attRef.Visible = attDef.Visible;

                                attRef.SetAttributeFromBlock(attDef, bref.BlockTransform);

                                attRef.HorizontalMode = attDef.HorizontalMode;

                                attRef.VerticalMode = attDef.VerticalMode;

                                attRef.Rotation = attDef.Rotation;

                                attRef.TextStyle = attDef.TextStyle;//  <---    A2009 syntax

                                attRef.Position = attDef.Position+inspt.GetAsVector();

                                attRef.Tag = attDef.Tag;

                                attRef.FieldLength = attDef.FieldLength;

                                if (attdic.ContainsKey(attRef.Tag.ToUpper()))
                                {
                                    attRef.TextString = attdic[attRef.Tag.ToUpper()];
                                }
                                else
                                {
                                    attRef.TextString = attDef.TextString;
                                }

                                attRef.Justify = attDef.Justify;

                                attRef.AdjustAlignment(db);

                                atcoll.AppendAttribute(attRef);

                                tr.AddNewlyCreatedDBObject(attRef, true);

                            }

                        }
                    }
                }
                //----------------------------------------------------------
                if (!bref.IsWriteEnabled) bref.UpgradeOpen();
                bref.Erase();
                btr.UpdateAnonymousBlocks();
                tr.Commit();
                }
            }
            catch (System.Exception ex)
            {
                ed.WriteMessage("Error:\n{0}\nTrace:\n{1}", ex.Message, ex.StackTrace);
            }
            finally
            {
                //do whatever you need

            }
        }

~'J'~