I want in C#, count the number of layers included in the current file.

I want in C#, count the number of layers included in the current file.

Anonymous
Not applicable
1,121 Views
6 Replies
Message 1 of 7

I want in C#, count the number of layers included in the current file.

Anonymous
Not applicable

Hello , i want to create a function that count the number of layer in my current file .

 

tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
                
                string num = no_folio.ToString();
               
                foreach(var clq in calques)
                {
                   
                   LayerTableRecord clqr = tr.GetObject(clq,OpenMode.ForRead) as LayerTableRecord;
                   
                }

 

but i don't know ,how i can count the number of layer or get the number of layer.

 

thanks a lot 🙂 

0 Likes
Accepted solutions (2)
1,122 Views
6 Replies
Replies (6)
Message 2 of 7

_gile
Consultant
Consultant
Accepted solution

Hi,

You can simply use a counter in your foreach loop:

int nombreCalques = 0;
foreach(ObjectId id in calques)
{
    var clqr = (LayerTableRecord)tr.GetObject(id, OpenMode.ForRead);
    nombreCalques++;           
}

Or use Linq:

calques.Cast<ObjectId>().Count();


Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 Likes
Message 3 of 7

Anonymous
Not applicable

Bonjour Gilles,

 

Tout d'abord je tiens à vous remercier pour la réponse apporter et pour tout vos cours en ligne,

Je suis alternant et cela m'a beaucoup aidé. 

 

Pour revenir au code , j'ai bien une réponse correcte, 

Ce que je souhaite faire en réalité, c'est mettre une condition : Empêchant le lancement du code si nous avons des calques numéroté qui sont supérieur à 2,je ne veux pas prendre en compte les calques qui sont nommés par des chaînes de caractères. 

 

Remerciements,

Armand 🙂

0 Likes
Message 4 of 7

_gile
Consultant
Consultant

La demande n'est pas claire.

S'agit-il de traiter uniquement les calques nommés "0" ou "1" ?



Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 Likes
Message 5 of 7

Anonymous
Not applicable

Oui, c'est ce que je voulais dire.

 

Je souhaite uniquement traité les calques nommés "0" "1" "2" "3" ... "10"

et non pas les calques nommés "ABC" et "VEC" .

 

Remerciements,

Armand

0 Likes
Message 6 of 7

_gile
Consultant
Consultant
Accepted solution

On peut filtrer le calques par nom avec la méthode int.TryParse.

var layersToProcess = new List<LayerTableRecord>();
foreach (ObjectId id in layerTable)
{
    var layer = (LayerTableRecord)tr.GetObject(id, OpenMode.ForRead);
    if (int.TryParse(layer.Name, out int _))
    {
        layersToProcess.Add(layer);
    }
}

Ou utiliser Linq et Regex

var layersToProcess = layerTable
    .Cast<ObjectId>()
    .Select(id => (LayerTableRecord)tr.GetObject(id, OpenMode.ForRead))
    .Where(l => Regex.IsMatch(l.Name, @"^\d+$"))
    .ToList();


Gilles Chanteau
Programmation AutoCAD LISP/.NET
GileCAD
GitHub

0 Likes
Message 7 of 7

Anonymous
Not applicable

Merci beaucoup Gilles, 

 

J'ai réussi à filtré ! 🙂

 

0 Likes