Aller au contenu

Bloc dans Espace Objet & Papier


PhilBat

Messages recommandés

Bonjour à tous

je 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 papier

et récuperer son nom (onglet ep) pour le dernier cas.

comment faire en VB net

merci

Philippe

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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.net

Plugins pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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é