Aller au contenu

Messages recommandés

Posté(e)

bonjour

 

Je souhaite supprimer du dessin (pas purger) toutes les références de blocs dont le nom est "LEGENDE".

j'applique ce code, mais rien ne se passe :

 

                public static void KillLegendes(Database db, Editor ed)
       {
           List<BlockAttribute> result = new List<BlockAttribute>();
           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
               foreach (ObjectId id in bt)
               {
                   BlockTableRecord btr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead);
                   if (!(btr.IsAProxy || btr.IsFromExternalReference || btr.IsLayout))
                   {
                       foreach (ObjectId brId in btr.GetBlockReferenceIds(true, false))
                       {
                           BlockReference br = (BlockReference)brId.GetObject(OpenMode.ForWrite);
                           BlockTableRecord owner = (BlockTableRecord)br.OwnerId.GetObject(OpenMode.ForRead);
                           if (owner.IsLayout)
                           {

                               if (btr.Name.ToLower() == "legende")
                               {
                                   br.Erase(true);
                               }

                           }

                       }
                   }
               }
           }
       }

 

Avez-vous une idée ?

Merci

Posté(e)

Salut,

 

tu fais des choses inutiles dans ton code comme parcourir toute la table des blocs pour retrouver le bloc alors que tu peux y accéder directement.

 

        public void EraseBlockRefs(Database db, string blkName)
       {
           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
               if (!bt.Has(blkName))
                   return;
               BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[blkName], OpenMode.ForRead);
               foreach (ObjectId id in btr.GetBlockReferenceIds(true, false))
               {
                   BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForRead);
                   BlockTableRecord owner = (BlockTableRecord)tr.GetObject(br.OwnerId, OpenMode.ForRead);
                   if (owner.IsLayout)
                   {
                       br.UpgradeOpen();
                       br.Erase();
                   }
               }
               tr.Commit();
           }
       }

 

Mais on peut aussi passer par un jeu de sélection :

 

        public void EraseBlockRefs(Document doc, string blkName)
       {
           Database db = doc.Database;
           Editor ed = doc.Editor;
           SelectionFilter filter = new SelectionFilter(
               new TypedValue[] { new TypedValue(0, "INSERT"), new TypedValue(2, blkName) });
           PromptSelectionResult psr = ed.SelectAll(filter);
           if (psr.Status != PromptStatus.OK)
               return;
           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               foreach (ObjectId id in psr.Value.GetObjectIds())
               {
                   BlockReference br = (BlockReference)tr.GetObject(id, OpenMode.ForWrite);
                   br.Erase();
               }
               tr.Commit();
           }
       }

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

Posté(e)

Salut,

Perso, j'y connais pas grand chose en programmation, alors je propose une autre solution.

J'utiliserais la commande "filter" avec comme nom de bloc "*LEGENDE*". Cela permet de sélectionner tous les blocs contenant LEGENDE dans leurs noms et de les supprimer....

 

http://img.imagesia.com/fichiers/34/capture_imagesia-com_34k2_large.JPG

 

Maintenant, il y a un bug, c'est si les blocs se trouvent sur des présentations, là, il faut faire présentations par présentations.

 

Du coup, par la programmation, c'est plus rapide, et le fait d'essayer de programmer est plus instructif de ce point de vue là.

 

A plus.

www.cad-is.fr
Autocad Map 2021 - Covadis/Autopiste V18.0c
Pisser sous la douche ne suffira pas

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é