Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

a partir d'un bloc existant dans un dessin DWG

je dois tester l'existance de l'attribut "REP",

si celui-ci existe je modifie sa valeur (tagstring).

Jusque là ... je sais faire.

Par contre, si l'attribut n'existe pas je dois rajouter celui-ci

avec paramétrage de couleur, calque, position, visibilité...

Je dois faire ceci pour trois attributs différents (REP,PUIS,ARM).

Leurs points d'insertions seront basés par rapport au point d'insertion du bloc

avec des valeurs DeltaX, DeltaY en plus (déterminées au préalable).

 

et tout cela en vb.net

Merci d'avance pour vos idées

a+

Philippe

Posté(e)

Salut,

 

La méthode "classique" consiste à ajouter une définition d'attribut à la définition du bloc puis d'ajouter la référence d'attribut correspondante à toutes les référence du bloc (synchroniser l'attribut).

 

Un exemple de méthodes : AddAttributeDefinition pour ajouter la définition d'attribut et AddAttributeToAllReferences pour synchroniser l'attribut.

        public AttributeDefinition AddAttributeDefinition(
           BlockTableRecord btr, // définition de bloc à laquelle ajouter l'attribut
           Point3d position,     // position de l'attribut dans le bloc
           string text,          // valeur par défaut
           string tag,           // étiquette
           string prompt,        // message d'invite
           ObjectId textStyleId) // ObjectId du style de texte
       {
           Transaction tr = btr.Database.TransactionManager.TopTransaction;

           // contrôler si une transaction est active
           if (tr == null)
           {
               throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NotTopTransaction);
           }

           // créer une définition d'attribut et l'ajouter à la définition du bloc
           AttributeDefinition attDef =
               new AttributeDefinition(position, text, tag, prompt, textStyleId);
           btr.AppendEntity(attDef);
           tr.AddNewlyCreatedDBObject(attDef, true);
           return attDef;
       }

       public void AddAttributeToAllReferences(AttributeDefinition attDef, BlockTableRecord btr)
       {
           Transaction tr = btr.Database.TransactionManager.TopTransaction;

           // contrôler si une transaction est active
           if (tr == null)
           {
               throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NotTopTransaction);
           }

           // récupérer les références du bloc
           ObjectIdCollection refIds = btr.GetBlockReferenceIds(true, false);

           // ajouter les références des blocs anonymes issues du bloc dynamique
           if (btr.IsDynamicBlock)
           {
               foreach (ObjectId id in btr.GetAnonymousBlockIds())
               {
                   BlockTableRecord dynBtr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead);
                   foreach (ObjectId brId in dynBtr.GetBlockReferenceIds(true, false))
                   {
                       refIds.Add(brId);
                   }
               }
           }

           // ajouter la référence d'attribut à toutes les références du bloc
           foreach (ObjectId id in refIds)
           {
               BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForWrite);
               AttributeReference attRef = new AttributeReference();
               attRef.SetAttributeFromBlock(attDef, br.BlockTransform);
               attRef.TextString = attDef.TextString;
               br.AttributeCollection.AppendAttribute(attRef);
               tr.AddNewlyCreatedDBObject(attRef, true);
           }
       }

 

Et un exemple de commande de test :

        [CommandMethod("AddToDef")]
       public void AddToDef()
       {
           Document doc = AcAp.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;
           PromptResult pr = ed.GetString("\nNom du bloc: ");
           if (pr.Status != PromptStatus.OK)
               return;
           string blockName = pr.StringResult;
           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
               if (!bt.Has(blockName))
               {
                   Application.ShowAlertDialog("Bloc introuvable");
                   return;
               }
               BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[blockName], OpenMode.ForWrite);

               // ajouter la nouvelle définition d'attribut
               AttributeDefinition attDef = 
                   AddAttributeDefinition(btr, new Point3d(0.0, -10.0, 0.0), "toto", "ATT0", "Valeur ?", db.Textstyle);

               // modifier les propriétés de la définition d'attribut
               attDef.Color = Color.FromColorIndex(ColorMethod.ByAci, 1);

               // ajouter une référence d'attribut à toutes les références de bloc
               AddAttributeToAllReferences(attDef, btr);

               tr.Commit();
           }
       }

 

 

Mais on peut aussi, par programmation, ajouter une référence d'attribut à une seule référence de bloc sans changer la définition du bloc et donc les autres références de ce bloc. Ceci explique un peu pourquoi l'insertion des références d'attribut est dissociée de l'insertion de la référence de bloc.

 

        public AttributeReference AddAttributeToReference(
           BlockReference br,    // référence de bloc à laquelle ajouter l'attribut
           Point3d position,     // position de l'attribut par rapport au point d'insertion
           string textString,    // valeur de l'attribut
           string tagString,     // étiquette de l'attribut
           ObjectId textStyleId) // ObjectId du style de texte
       {
           Transaction tr = br.Database.TransactionManager.TopTransaction;

           // contrôler si une transaction est active
           if (tr == null)
           {
               throw new Autodesk.AutoCAD.Runtime.Exception(ErrorStatus.NotTopTransaction);
           }

           // créer une référence d'attribut et l'ajouter à la collection d'attributs du bloc
           AttributeReference attref = 
               new AttributeReference(position,textString,tagString,textStyleId);
           attref.TransformBy(br.BlockTransform);
           br.AttributeCollection.AppendAttribute(attref);
           tr.AddNewlyCreatedDBObject(attref, true);
           return attref;
       }

 

Une commande de test :

        [CommandMethod("AddToRef")]
       public void AddToRef()
       {
           Document doc = AcAp.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;
           PromptEntityOptions peo = new PromptEntityOptions("\nSélectionnez un bloc: ");
           peo.SetRejectMessage("Objet non valide.");
           peo.AddAllowedClass(typeof(BlockReference), true);
           PromptEntityResult per = ed.GetEntity(peo);
           if (per.Status != PromptStatus.OK) return;
           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               BlockReference br = (BlockReference)tr.GetObject(per.ObjectId, OpenMode.ForWrite);

               // ajouter la référence d'attribut à la référence de bloc
               AttributeReference attref = 
                   AddAttributeToReference(br, new Point3d(0.0, -10.0, 0.0), "toto", "ATT0", db.Textstyle);

               // modifier les propriétés de la référence d'attribut
               attref.Color = Color.FromColorIndex(ColorMethod.ByAci, 1);

               tr.Commit();
           }
       }

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

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é