PhilBat Posté(e) le 27 janvier 2012 Posté(e) le 27 janvier 2012 Bonjour à tousje voudrais sélectionner un bloc de façon automatique(pas de sélection écran car je connais son nom donc j'utilise une sélection par filtre)qui pourrais aussi bien se trouver dans l'espace objet que dans l'espace papieret récuperer son nom (onglet ep) pour le dernier cas.comment faire en VB netmerciPhilippe
(gile) Posté(e) le 27 janvier 2012 Posté(e) le 27 janvier 2012 Salut, Tu peux très bien utiliser la méthode Editor.SelectAll() avec un filtre de sélection pour sélectionner toutes les références du bloc dans le dessin. Une méthode plus efficace (qui évite de scanner tout le dessin) consiste à utiliser la méthode BlockTableRecord.GetBlockReferenceIds() qui retourne directement une collection d'ObjectId de toutes les références du bloc. public ObjectIdCollection GetBlockReference(string blkName, Database db) { ObjectIdCollection result = new ObjectIdCollection(); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); if (!bt.Has(blkName)) return null; BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[blkName], OpenMode.ForRead); return btr.GetBlockReferenceIds(true, false); } } Ensuite, et quelle que soit la méthode utilisée pour obtenir les ObjectId des références, on obtient l'ObjectId de l'objet propriétaire de la référence avec la propriété OwnerId et si c'est un Layout, on obtient le nom de la présentation avec Layout.LayoutName. [CommandMethod("Test")] public void Test() { Document doc = AcAp.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptStringOptions options = new PromptStringOptions("\nNom du bloc: "); options.AllowSpaces = false; PromptResult pr = ed.GetString(options); if (pr.Status != PromptStatus.OK) return; ObjectIdCollection refs = GetBlockReference(pr.StringResult, db); if (refs.Count == 0) { ed.WriteMessage("\nAucune référence trouvée dans le dessin."); return; } using (Transaction tr = db.TransactionManager.StartTransaction()) { foreach (ObjectId id in refs) { BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForRead); BlockTableRecord owner = (BlockTableRecord)tr.GetObject(br.OwnerId, OpenMode.ForRead); if (owner.IsLayout) { Layout layout = (Layout)tr.GetObject(owner.LayoutId, OpenMode.ForRead); ed.WriteMessage("\nUne référence trouvée dans : {0}.", layout.LayoutName); } } tr.Commit(); } } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
coyotte Posté(e) le 1 février 2012 Posté(e) le 1 février 2012 Bonjour Gile, j'ai un petit soucis avec cette routine. Elle fonctionne parfaitement avec des blocs classiques. Il en va différement avec des blocs dynamiques. J'ai remarqué qu'après avoir sélectionner un bloc dynamique et lui avoir fait subir quelque opération que se soit, son nom est modifier en anomyne et à partir de là la routine ne fonctionne plus. J'espère avoir été suffisament clair, et que tu as une solution au problème :P Merci d'avance. http://www.carpetdiem.netPlugins pour AutoCAD
(gile) Posté(e) le 1 février 2012 Posté(e) le 1 février 2012 Salut, Une méthode qui retourne tous les ObjectId des références directement insérées dans des espaces pour un nom de bloc et les blocs anonymes issus de ce bloc. public ObjectIdCollection GetBlockReference(string blkName, Database db) { ObjectIdCollection result = new ObjectIdCollection(); using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); if (!bt.Has(blkName)) return null; BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[blkName], OpenMode.ForRead); GetRefs(btr, ref result); foreach (ObjectId anonId in btr.GetAnonymousBlockIds()) { BlockTableRecord anonBtr = (BlockTableRecord)tr.GetObject(anonId, OpenMode.ForRead); GetRefs(anonBtr, ref result); } } return result; } private void GetRefs(BlockTableRecord btr, ref ObjectIdCollection ids) { foreach (ObjectId id in btr.GetBlockReferenceIds(true, false)) { BlockReference br = (BlockReference)id.GetObject(OpenMode.ForRead); BlockTableRecord owner = (BlockTableRecord)br.OwnerId.GetObject(OpenMode.ForRead); if (owner.IsLayout) ids.Add(br.Id); } } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
coyotte Posté(e) le 2 février 2012 Posté(e) le 2 février 2012 Merci Gile, Cela fonctionne à la perfection. Merci encore pour ta réactivité, et à la prochaine fois pour de nouvelles aventures :D http://www.carpetdiem.netPlugins 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