DenisHen Posté(e) le 15 mai 2018 Posté(e) le 15 mai 2018 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 nilMais 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: TESTSSLENTHtype 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)
lecrabe Posté(e) le 15 mai 2018 Posté(e) le 15 mai 2018 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
lecrabe Posté(e) le 15 mai 2018 Posté(e) le 15 mai 2018 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
DenisHen Posté(e) le 15 mai 2018 Auteur Posté(e) le 15 mai 2018 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)
DenisHen Posté(e) le 15 mai 2018 Auteur Posté(e) le 15 mai 2018 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)
(gile) Posté(e) le 15 mai 2018 Posté(e) le 15 mai 2018 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
DenisHen Posté(e) le 15 mai 2018 Auteur Posté(e) le 15 mai 2018 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)
didier Posté(e) le 15 mai 2018 Posté(e) le 15 mai 2018 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ésDonc 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 filtreC'est contradictoire Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
DenisHen Posté(e) le 16 mai 2018 Auteur Posté(e) le 16 mai 2018 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ésDonc 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 filtreC'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)
philsogood Posté(e) le 16 mai 2018 Posté(e) le 16 mai 2018 @le crabe : t'as combien de milliers de routines lisp en stock??Phil Projeteur Revit Indépendant - traitement des eaux/CVC
didier Posté(e) le 16 mai 2018 Posté(e) le 16 mai 2018 Coucou (environ 500 lignes)Mazette y'a du lourd !Oui cette ligne est suffisanteJe 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 lignesIl 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 Éternel débutant... Mon site perso : Programmer dans AutoCAD
DenisHen Posté(e) le 16 mai 2018 Auteur Posté(e) le 16 mai 2018 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)
lecrabe Posté(e) le 16 mai 2018 Posté(e) le 16 mai 2018 Hello @philsogood: j'ai plus de 2500 routines en stock ... Bye, lecrabe Autodesk Expert Elite Team
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant