Aller au contenu

[Résolu] Comment savoir si un calque contient des entités ?


Messages recommandés

Posté(e)

Bonjour à tous.

 

Aujourd'hui, je cherche à savoir si un calque contient des entités pour proposer à l'utilisateur de "vider" ce calque s'il n'est pas vide avant de continuer mon code.

 

J'ai donc écris ça :

  (if (/= (sslength (setq Select (ssget "_A" (list (cons 8 "Test"))))) nil);; Sachant que ce calque est vide
   (progn (initget 1 "Oui Non")
          (if (= (getkword "\nEffacer le contenu du calque courant ? [Oui/Non]: ") "Oui")
            (command "_erase" Select "")
          ) ;_ Fin de if
   ) ;_ Fin de progn
 ) ;_ Fin de if

Mais ça ne fonctionne pas.

 

Après de multiples recherche dans la Console, j'ai trouvé où était l'erreur :

_$ (sslength (ssget "_A" (list (cons 8 "Test"))))

type d'argument incorrect: lselsetp nil

Mais je ne sais pas trop quoi en faire.

 

Je suis allé faire un tour du coté de da-code, et j'ai fait un defun "test" qui donne ça :

(defun c:TestSSlenth ( / jeusel)
 (setq jeusel (ssget "x" '((0 . "*SOLID"))));; Sachant que je n'ai pas ce type d'entité
 (setq nombre-lignes (sslength jeusel))
) ;_ Fin de defun

Mais là aussi, même erreur :

Commande: TESTSSLENTH

type d'argument incorrect: lselsetp nil

 

Voici le déroulement en français :

Voir si le calque contient des entités :

....Si oui, demander si on les efface,

........Si oui, on les efface et on continu,

....Si non, on continu

 

Je sais, ça en fait une tartine pour juste un code de quelques lignes... Mais c'est pour montrer mes recherches et mieux faire comprendre mon problème... ;)

 

Quelqu'un aurait une idée ?

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)

Posté(e)

Hello

 

Desole mais je suis NUL (ou presque) en Lisp ... Donc je ne peux pas t'aider !

 

Neanmoins voir ci-dessous une Routine "Count_Objects_per_Layer" qui compte le nombre d'objet par Calque / Layer !

Cela pourra eventuellement t'aider !?

 

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

Posté(e)

Hello

 

Et une autre "Del-Layer" qui supprime TOUT ce qui est sur un Calque / Layer ...

 

Bye, lecrabe

 


;; 
;; http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/easy-lisp-to-delete-all-objects-on-layer/m-p/2755056/highlight/true#M291622
;; del-layer will delete all objects on a selected layer and purge it
;; 

(defun c:Del-Layer (/ ent l_name ss cntr amt ssent) 

;;; 
;;; erases all objects on selected layer then purges that layer 
;;; 

(setvar 'clayer "0") ; set layer to 0 

(if 
; make sure we get something 
(setq ent (car (entsel "\nSelect Layer to remove/delete (and purge if possible) : "))); test 
(progn 
; extract the layer name from the entity 
(setq l_name (cdr (assoc 8 (entget ent)))) 

; create a selection set of all entites on layer 'l_name' 
(setq ss (ssget "X" (list (cons 8 l_name))) 
; set 'cntr' to number of items in selection set 
cntr (1- (sslength ss)) 
amt (itoa cntr); make a string from an integer 
) 

(if 
; does the sel set have anything in it 
(> cntr 0); test 

(while 
; as long as 'cntr' is greater than or equal to 0 
; keep looping 
(>= cntr 0) 

; extract the ename from the sel set 
(setq ssent (ssname ss cntr)) 
(entdel ssent); delete that entity 
(setq cntr (1- cntr)); subtract 1 from cntr 
) 

) 
) 
) 
(command "_.purge" "_LA" l_name "N") 
(princ (strcat "\nErased " amt " items ")) 
(princ) 
) 

Autodesk Expert Elite Team

Posté(e)

Salut Ô Décapode, et merci pour cette routine.

 

Mais elles ne traitent pas de mon sujet puisqu'il faut qu'une entité soit sélectionnée... :huh:

 

Merci encore... ;)

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)

Posté(e)

Re.

 

je crois que je me compliquais la vie avec le (sslenth, je l'ai supprimé et ça donne :

  (if (/= (setq Select (ssget "_A" (list (cons 8 "Test")))) nil)
   (progn (initget 1 "Oui Non")
          (if (= (getkword "\nEffacer le contenu du calque courant ? [Oui/Non]: ") "Oui")
            (command "_erase" Select "")
          ) ;_ Fin de if
   ) ;_ Fin de progn
 ) ;_ Fin de if

Et ça fonctionne très bien désormais...

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)

Posté(e)

Salut

 

ssget renvoie nil si aucun objet n'est sélevtionné :

 

(if (setq ss (ssget "_X" (list (cons 8 "Test"))))
 (prompt "\nLe calque n'est pas vide"))
 (prompt "\nLe calque est vide"))
)

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

Posté(e)

Salut (gile) et merci pour ta réponse...

 

Que j'avais fini par trouver seul... ;)

 

Champagne ! ! ! :(rires forts):

 

Voici la dernière mouture grâce à ton exemple :

  (if (setq Select (ssget "_A" (list (cons 8 "Test"))))
   (progn (initget 1 "Oui Non")
          (if (= (getkword "\nEffacer le contenu du calque courant ? [Oui/Non]: ") "Oui")
            (command "_erase" Select "")
          ) ;_ Fin de if
   ) ;_ Fin de progn
 ) ;_ Fin de if

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)

Posté(e)

Coucou

 

Tu as bien lu ou j'ai mal écrit ?

Cette option "_A" fait une sélection sur la totalité du dessin en ignorant les calques gelés

Donc pourquoi t'en sers-tu puisque tu réduis ensuite le filtre avec une référence à un nom de calque ?

 

Ensuite tu poses la question : effacer le calque courant ?

Mais tu ne vérifies pas que le calque courant est "Test", celui sur lequel tu as fait un filtre

C'est contradictoire

 

Amicalement

Posté(e)

Salut didier et merci pour ton aide.

Tu as bien lu ou j'ai mal écrit ?

Cette option "_A" fait une sélection sur la totalité du dessin en ignorant les calques gelés

Donc pourquoi t'en sers-tu puisque tu réduis ensuite le filtre avec une référence à un nom de calque ?

Tu veux dire que je pouvais écrire ça ?

  (if (setq Select (ssget (list (cons 8 "Test"))))

 

Ensuite tu poses la question : effacer le calque courant ?

Mais tu ne vérifies pas que le calque courant est "Test", celui sur lequel tu as fait un filtre

C'est parce-que je l'ai déjà testé en avant dans mon programme (environ 500 lignes). Le calque "Test" ne peux être que le courant.

 

Denis...

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)

Posté(e)

Coucou

 

(environ 500 lignes)

Mazette y'a du lourd !

Oui cette ligne est suffisante

Je ne pouvais pas le savoir et si c'est vérifié c'est OK, après tout c'est ton programme mais contrôle DANS le IF serait un plus.

 

Je reprends les propos de (gile) d'il y a quelques temps :

Si un jour tu "lâches" des routines, des programmes obèses sur CadXP ne t'attend pas à ce qu'on décortique des centaines de lignes

Il est bien préférable de proposer des petites fonctions et de les améliorer (ou pas) suivant les retours,

À moins que ce soit totalement fonctionnel auquel cas tu seras félicité comme il se doit.

 

Et s'il y a des commentaires dans le code ça ira encore mieux.

 

Amicalement

 

Posté(e)

Re.

Et s'il y a des commentaires dans le code ça ira encore mieux.

Je le fais déjà, ne serait-ce que pour moi (pas assez à mon gout), car il est vrai que remettre les mains dans une routine qui date, c'est déjà loin d'être facile, alors s'il n'y a pas de commentaires...

 

@Phil : je tablerais sur plusieurs dizaines de millier... ;)

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)

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é