Aller au contenu

Modifier les valeurs des attributs d'un block qui est situé dans une feuille


Messages recommandés

Posté(e)

Bonjour,

 

Je cherche a modifier un block qui contient des attributs. Et je n'y parvient pas.

 

Je sais que je suis dans le bloc mais la valeur ne change pas.

 

[CommandMethod("ListBlockAtts")]
       public static void ListBlockAtts()
       {
           // Get the current document and start the Transaction Manager
           Document acDoc = Application.DocumentManager.MdiActiveDocument;
           Database acCurDb = acDoc.Database;
           using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
           {
               // This example returns the block table for the current database
               BlockTable acBlkTble;
               acBlkTble = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
               foreach (ObjectId objId in acBlkTble)
               {
                   BlockTableRecord btr;
                   btr = acTrans.GetObject(objId, OpenMode.ForRead) as BlockTableRecord;
                   
                   if (btr.HasAttributeDefinitions && btr.Name.Equals("CARTOUCHE LU"))
                   {                        
                       foreach (ObjectId bObjId in btr)
                       {
                           DBObject dbObj = bObjId.GetObject(OpenMode.ForRead);

                           AttributeDefinition AttDef = dbObj as AttributeDefinition;

                           if (AttDef != null)
                           {
                               if (AttDef.Tag == "TITRE")
                               {
                                   btr.UpgradeOpen();
                                   dbObj.UpgradeOpen();
                                   AttDef.UpgradeOpen();
                                   AttDef.TextString = "Something";
                               }
                           }                            

                       }

                   }
               }
               acTrans.Commit();
           }
       }

 

 

Est-ce que quelqu'un pourrait m'aider svp

 

François.

Posté(e)

Salut,

 

Sauf si l'attribut est constant, la propriété TextString d'une définition d'attribut (AttributeDefifnition) correspond à la valeur par défaut des références d'attribut (AttributeReference).

Donc ton code devrait modifier cette valeur par défaut, mais n'a aucune influence sur les référence d'attributs des références de blocs déjà insérées dans le dessin.

 

Si tu veux modifier les références d'attributs des blocs insérés, il faut collecter les références de bloc (BlockReference) insérées avec une sélection filtrée ou avec la méthode BlockTableRecord.GetBlockReferencIds() de la défintion de bloc (plus performant), puis pour chaque référence, parcourir la collection de références d'attributs (AttributeCollection) pour trouver la référence d'attribut recherchée.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Un exemple de code qui traite toutes les références insérées du bloc "CARTOUCHE LU" (fonctionne aussi avec les blocs dynamiques.

 

        [CommandMethod("ListBlockAtts")]
       public static void ListBlockAtts()
       {
           var doc = Application.DocumentManager.MdiActiveDocument;
           var db = doc.Database;
           using (var tr = db.TransactionManager.StartTransaction())
           {
               var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
               // si la table de blocs contient le bloc "CARTOUCHE LU"
               if (bt.Has("CARTOUCHE LU"))
               {
                   // on ouvre la définition du bloc
                   var btr = (BlockTableRecord)tr.GetObject(bt["CARTOUCHE LU"], OpenMode.ForRead);

                   // on recherche toutes les références insérées
                   var ids = new ObjectIdCollection();
                   foreach (ObjectId brId in btr.GetBlockReferenceIds(true, true))
                   {
                       ids.Add(brId);
                   }
                   // si le bloc est dynamique on cherche aussi les reférence des blocks anonymes
                   if (btr.IsDynamicBlock)
                   {
                       foreach (ObjectId btrId in btr.GetAnonymousBlockIds())
                       {
                           var anonymousBtr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
                           foreach (ObjectId brId in anonymousBtr.GetBlockReferenceIds(true, true))
                           {
                               ids.Add(brId);
                           }
                       }
                   }

                   // pour chaque référence trouvée, on modifie l'attribut "TITRE"
                   foreach (ObjectId brId in ids)
                   {
                       var br = (BlockReference)tr.GetObject(brId, OpenMode.ForRead);
                       foreach (ObjectId attId in br.AttributeCollection)
                       {
                           var att = (AttributeReference)tr.GetObject(attId, OpenMode.ForRead);
                           if (att.Tag == "TITRE")
                           {
                               att.UpgradeOpen();
                               att.TextString = "Something";
                               break; // on sort de la boucle
                           }
                       }
                   }
               }
               tr.Commit();
           }
       }

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour Gilles,

 

Merci beaucoup pour ton aide.

 

Désolé pour la réponse tardive j'avais mis un suivi pour mon sujet par contre, le courriel n'était pas bon.

 

Je vais tester le code sous peu.

 

Et te revenir avec des question surment :D

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité