PhilBat Posté(e) le 25 juillet 2012 Posté(e) le 25 juillet 2012 Bonjour,a partir d'un bloc existant dans un dessin DWGje 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-ciavec 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 blocavec des valeurs DeltaX, DeltaY en plus (déterminées au préalable). et tout cela en vb.netMerci d'avance pour vos idéesa+Philippe
(gile) Posté(e) le 25 juillet 2012 Posté(e) le 25 juillet 2012 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant