Aller au contenu

[Résolu] Listing des calques des objets sélectionnés


CTZen

Messages recommandés

Bonjour à tous,

 

 

Je cherche à exporter (ou tout du moins connaitre) la liste des calques utilisé par les objets sélectionné dans mon dessin.

 

Dans l'autre sens ça fait "Je sélectionne des objets dans mon dessin et j'aimerai exporter la liste des calques dans lesquels ils se trouvent" <img src='http://cadxp.com/public/style_emoticons/<#EMO_DIR#>/laugh.gif' class='bbc_emoticon' alt=':(rires forts):' />

 

Est-ce que quelqu'un à une solution ?

 

 

Merci beaucoup :)

 

 

Charles

AutoCAD Map 3D 2023 (26.0.37.2 base T.53.0.0)
Covadis 18.0 + AutoPiste
Windows 11 Famille v.21H2 - 64 bits

Toujours à l'affût des bonnes astuces

Lien vers le commentaire
Partager sur d’autres sites

Salut.

Voilà, j'ai fais ce petit bout de Lisp pour faire la liste des calques des éléments sélectionnés :

(defun c:LstCalq_Charles (/ Ent JsEnt i)
 (prompt "\n Selectionez les objets a traiter : ")
 (setq JsEnt (ssget))
 (setq i 0)
 (princ "\nListe des calques :\n")
 (while (setq Ent (ssname JsEnt i))
   (princ (cdr (assoc 8 (entget Ent))))
   (princ "\n")
   (setq i (+ i 1))
 ) ;_ Fin de while
 (princ)
) ;_ Fin de defun

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

La même réponse que Denis qui a été le plus rapide.

Je donne quand même ma solution.

(defun c:lstc(/ ent lst sel)
 (and (ssget)
   (progn
     (vlax-for ent (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
(or (vl-position (vla-get-layer ent) lst)
  (setq lst (cons (vla-get-layer ent) lst))
)
     )
     (vla-delete sel)
     (mapcar 'print lst)
   )
 )
 (princ)
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Salut.

 

Même si nos deux codes font la même chose, on vois une différence énorme de niveau... ;)

 

Quant à ma rapidité, j'ai peut-être fini avant toi, mais je suis sûr d'avoir commencer nettement avant... ;)

 

J'ai essayé de faire la même chose que Patrick_35 : utiliser une liste pour pouvoir gérer les doublons et la trier par ordre alphabétique.

 

Je me suis permis (excuse-moi Patrick_35) de reprendre le dernier code avec ces deux options :

(defun c:LstCalq_Charles (/ ent lst sel)
 ;; Suprime tous les doublons d'une liste de (gile)
 (defun distinct (l)
   (if l
     (cons (car l) (distinct (vl-remove (car l) l)))
   ) ;_ Fin de if
 ) ;_ Fin de defun
 (and (ssget)
      (progn (vlax-for ent (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
               (or (vl-position (vla-get-layer ent) lst) (setq lst (cons (vla-get-layer ent) lst)))
             ) ;_ Fin de vlax-for
             (vla-delete sel)
             (setq LstCalq (vl-sort Lst '<))
             (setq LstCalq (distinct LstCalq))
             (mapcar 'print LstCalq)
      ) ;_ Fin de progn
 ) ;_ Fin de and
 (princ)
) ;_ Fin de defun

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Tu peux reprendre le code, au contraire :D

Mais une chose , tu as déjà un filtre qui évite les doublons avec

(or (vl-position (vla-get-layer ent) lst)...

Traduction avec le or --> Si je n'ai pas la position du calque dans la liste, alors ...

 

Ensuite, on peut aussi faire

(mapcar 'print (vl-sort lst '<))

Ce qui évite une variable

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Je me posais justement la question, que veut dire

(or (vl-position 

J'ai ma réponse... ;)

 

Ensuite :

(mapcar 'print (vl-sort lst '<))

Effectivement, mais je n'ai toujours pas la maîtrise de mapcar, ainsi que lambda... :huh:

 

Quant au 'print, je suis sur le c*l... Une fonction qui se comporte comme une liste... C'est bien ça ? Je l'avais déjà lu dans un poste de (gile), mais jamais vu en code...

 

J'ai encore beaucoup de chemin à faire... :mellow:

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Non, on appelle directement la fonction, pas une liste

 

En général, tu vois

(mapcar '(lambda(x)(print x)) (vl-sort lst '<))

car lambda est une fonction anonyme

 

(defun imprime(doc)
 (print doc)
)

(mapcar 'imprime (vl-sort lst '<))

fonctionne aussi

 

tout comme

(mapcar 'print (vl-sort lst '<))

 

Si tu regardes certaines réponses de Bonus, tu verras qu'il se sert de la fonction lambda pour réaliser une routine

Par exemple

 

ps : ici, on pourrait très bien utiliser un foreach car le retour du mapcar importe peu, mais c'est pour économiser les variables.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Ok, merci pour ces précisions...

 

Je comprends mieux... ;)

 

Au fait, Charles T, ça te convient ce qu'on a fait ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Hello Les Pros du Lisp / VLisp

 

1) Desole mais j'etais occupe cet AM ...

 

2) Neanmoins je participe (un peu tard) avec une routine en Stock de Marko Ribar

 

Elle defile sur l'Ecran texte les Noms des calques + le Nombre d'objet par calque !

 

3) En esperant que cela puisse vous etre agreable !?

 

Bye, lecrabe

 


;; 
;; https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/add-counter-to-lisp/td-p/7941574
;; 
;; Routine: Count_Objects_per_Layer by marko_ribar
;; 


(defun c:Count_Objects_per_Layer ( / ss n1 loop laylist layer n2 numlist stringlist listex ) ; mylist is global variable
 (princ "\nSelect objects to list used layers... ") 
 (if (setq ss (ssget))
   (progn
     (setq n1 (sslength ss))
     (setq loop 0)
     (textscr)
     (repeat n1
       (setq layer (cdr (assoc 8 (entget (ssname ss loop)))))
       (if (not (member layer laylist))
         (setq laylist (cons layer laylist))
       )
       (setq loop (1+ loop))
     )
     (setq laylist (acad_strlsort laylist))
     (setq mylist laylist)
     (setq n2 (length laylist))
     (setq numlist 0)
     (setq stringlist "\nSelected Layers...\n") 

     (princ "\n    LayerName   ( Count ) \n ")

     (repeat n2
       (sssetfirst nil ss)
       (setq listext (nth numlist laylist))
       (setq listext (strcat listext "    ( " (itoa (sslength (ssget "_I" (list (cons 8 listext))))) " ) " ))
       (setq stringlist (strcat stringlist "\n    " listext))
       (setq numlist (1+ numlist))
     )
     (princ stringlist)
     (sssetfirst nil nil)
   )
   (princ "\nNo Entities Selected... ") 
 )
 (princ)	
) 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Wooooow !

 

Je ne pensais pas avoir autant de réponses en moins de 24h !

 

Je vais essayer toutes vos solutions !!!

 

Vous êtes tous redoutablement efficaces !!!!

 

1000 mercis !

AutoCAD Map 3D 2023 (26.0.37.2 base T.53.0.0)
Covadis 18.0 + AutoPiste
Windows 11 Famille v.21H2 - 64 bits

Toujours à l'affût des bonnes astuces

Lien vers le commentaire
Partager sur d’autres sites

Re !

 

J'ai fais le tour de vos charmantes solutions.

 

Je vais partir sur les LISP de nos amis Patrick et Denis qui font simple et efficace !

 

 

En tout cas super ça fait franchement plaisir de voir autant d'engouement ! ;)

AutoCAD Map 3D 2023 (26.0.37.2 base T.53.0.0)
Covadis 18.0 + AutoPiste
Windows 11 Famille v.21H2 - 64 bits

Toujours à l'affût des bonnes astuces

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é