Aller au contenu

Block imbriqués


Messages recommandés

Bonjour à tous,

 

je cherche par le code ci-dessous à savoir si le bloc en cours fait parti d'un autre bloc.

 

           Database database = HostApplicationServices.WorkingDatabase;

           using (Transaction transaction = database.TransactionManager.StartTransaction())
           {
               BlockTable blkTable = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);

               foreach (ObjectId id in blkTable)
               {
                   BlockTableRecord btRecord = (BlockTableRecord)transaction.GetObject(id, OpenMode.ForRead);
                   
                   /* Comment savoir si ce bloc fait parti d'un autre bloc
               }

               transaction.Commit();
           }

 

j'espère avoir été clair.

 

merci par avance.

http://www.carpetdiem.net

Plugins pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

La fonction ci-dessous renvoie un dictionnaire avec les noms des blocs contenant des blocs imbriqués.

Pour chaque entrée, la clé est le nom du bloc parent, la valeur est la liste des noms des blocs imbriqués au premier niveau.

 

        public static Dictionary<string, List<string>> GetNestedBlocks(Database db)
       {
           var result = new Dictionary<string, List<string>>();
           using (var tr = new OpenCloseTransaction())
           {
               // on parcourt la table des blocs
               var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
               // pour chaque définition de bloc (excepté les espaces)
               foreach (ObjectId btrId in bt)
               {
                   var btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForRead);
                   if (btr.IsLayout)
                       continue;
                   // pour chaque entité dans la définition de bloc
                   foreach (ObjectId id in btr)
                   {
                       // si c'est une référence de bloc, on l'ajout au dictionnaire
                       if (id.ObjectClass.DxfName == "INSERT")
                       {
                           var br = (BlockReference)tr.GetObject(id, OpenMode.ForRead);
                           if (!result.ContainsKey(btr.Name))
                               result[btr.Name] = new List<string>();
                           result[btr.Name].Add(br.Name);
                       }
                   }
               }
           }
           return result;
       }

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

hello Gile

 

le code que tu donnes en message 4

 

existe til en version lisp ou vlisp.

 

 

j'ai récupérer un IFC

il y a des blocs avec des blocs imbriqués sur pas mal de niveaux,

les couleurs des blocs semblent par contre bien ordonnées par type

 

mon idée en lisp aurait été de décomposer tous les blocs comportant des blocs imbriqués

et de redistribuer les blocs de niveau 1 ( qui ne comporte pas de blocs imbriqués)

dans des couches en fonction de leurs couleurs

 

ton code donnait déja la liste des blocks avec des blocks imbriqués a décomposer

 

a+ merci

Phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

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é