Bred Posté(e) le 13 juillet 2006 Posté(e) le 13 juillet 2006 Salut,Grâce à l'aide des maîtres "lispien" de ce forum, et des exemples que j'ai récupérer par-ci par-là, j'ai écrit un lisp qui liste les types de blocs dont est constitué un blocs imbriqué (1er niveau).... (defun c:Bloc_Explorer ( / list_Bloc_Imb sel Ent_SS_Bloc List_Final Nb n) (while (null (setq sel (ssget "_:S" '((0 . "INSERT")))))) (setq Ent_bloc (tblsearch "BLOCK" (cdr (assoc 2 (entget (ssname sel 0))))) list_Bloc_Imb (list (cdr (assoc 2 Ent_bloc))) Ent_SS_Bloc (entget (cdr (assoc -2 Ent_bloc)))) (cond ((eq (cdr (assoc 0 Ent_SS_Bloc)) "INSERT") (setq list_Bloc_Imb (append list_Bloc_Imb (list (cdr (assoc 2 Ent_SS_Bloc))))) (while (setq Ent_SS_Bloc (entnext (cdar Ent_SS_Bloc))) (setq Ent_SS_Bloc (entget Ent_SS_Bloc)) (if (eq (cdr (assoc 0 Ent_SS_Bloc)) "INSERT") (setq list_Bloc_Imb (append list_Bloc_Imb (list (cdr (assoc 2 Ent_SS_Bloc))))) ) ) ) ) (setq List_Final (list (car list_Bloc_Imb)) list_Bloc_Imb (vl-remove (car list_Bloc_Imb) list_Bloc_Imb)) (While (not (null list_Bloc_Imb)) (setq Nb 0) (foreach n list_Bloc_Imb (if (apply 'eq (list n (car list_Bloc_Imb))) (setq Nb (+ 1 Nb))) ) (setq List_Final (append List_Final (list (strcat (rtos Nb) " x " (car list_Bloc_Imb) "\n")))) (setq list_Bloc_Imb (vl-remove (car list_Bloc_Imb) list_Bloc_Imb)) ) (princ (strcat "\n---------------------------------------\n Blocs imbriqués dans "(car List_Final) " : \n")) (princ (cdr List_Final)) (prin1) ) Tout à l'air de fonctionner...Le détail que je n'arrive pas à mettre en place est l'écriture de la liste dans une boite de dialogue (alert ...), car sur la ligne de commande, ce n'est pas trés "pratique"... :casstet: Merci de vos conseils. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 13 juillet 2006 Posté(e) le 13 juillet 2006 Salut, Je te repasse un lien que m'avait donné Tramber : un LISP nommé NESTED sur cette page. De mon côté, pour récupérer tous les blocs imbriqués, j'ai fait une boucle sur une liste blocs qui, pour chaque bloc de la liste, cherchait dans les composant du bloc s'il y en avait un (ou des) autre(s), et si c'est la cas, ajoute le nom du bloc à la fin de la liste où il est traité à son tour. Pour (alert ...) tu peux faire : (alert (strcat "\n---------------------------------------\n Blocs imbriqués dans " (car List_Final) " : \n" (apply 'strcat (mapcar '(lambda (x) (strcat "\n" x)) (cdr List_Final)) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 13 juillet 2006 Auteur Posté(e) le 13 juillet 2006 merci (gile) de ta réponse. De mon côté, pour récupérer tous les blocs imbriqués, j'ai fait une boucle sur une liste blocs qui, pour chaque bloc de la liste, cherchait dans les composant du bloc s'il y en avait un (ou des) autre(s), et si c'est la cas, ajoute le nom du bloc à la fin de la liste où il est traité à son tour. ... je comprends, mais plus j'avance, plus je rencontre une difficulté : la mises en place des étapes du code...Je fait ça sur un bout de papier... j'ai essayer d'utiliser Excel pour pouvoir rendre la lecture + simple, mais je me suis vite énervé car je perdais du temps entre les test sur AutoCAD, le fait de revenir sur Excel, etc... alors qu'avec l'Editeur Visual Lisp, un seul click suffit pour tester... merci encore en tout les cas... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 13 juillet 2006 Posté(e) le 13 juillet 2006 Voilà ce que pourrait donner ton code pour récupérer les blocs imbriqués de tous niveaux et retourner le résultat dans la boite de message : (defun c:Bloc_Explorer (/ sel list_Bloc_Imb Ent_SS_Bloc List_Final Nb n) (while (not (setq sel (ssget "_:S" '((0 . "INSERT")))) ) ) ;;*****************************************************;; ;; boucle pour récupérer toutes les imbrications de blocs (setq list_Bloc_Imb (list (cdr (assoc 2 (entget (ssname sel 0))))) n_lst 0 ) (while (setq Nom_Bloc (nth n_lst list_Bloc_Imb)) (setq Ent_bloc (tblsearch "BLOCK" Nom_Bloc) Ent_SS_Bloc (cdr (assoc -2 Ent_bloc)) ) (while (and Ent_ss_Bloc (/= (cdr (assoc 0 (entget Ent_ss_Bloc))) "SEQEND") ) (if (= (cdr (assoc 0 (entget Ent_ss_Bloc))) "INSERT") (setq list_Bloc_Imb (append list_Bloc_Imb (list (cdr (assoc 2 (entget Ent_ss_Bloc)))) ) ) ) (setq Ent_SS_Bloc (entnext Ent_SS_Bloc)) ) (setq n_lst (1+ n_lst)) ) ;;*****************************************************;; (setq List_Final (list (car list_Bloc_Imb)) list_Bloc_Imb (vl-remove (car list_Bloc_Imb) list_Bloc_Imb) ) (While (not (null list_Bloc_Imb)) (setq Nb 0) (foreach n list_Bloc_Imb (if (apply 'eq (list n (car list_Bloc_Imb))) (setq Nb (+ 1 Nb)) ) ) (setq List_Final (append List_Final (list (strcat (rtos Nb) " x " (car list_Bloc_Imb) "\n" ) ) ) ) (setq list_Bloc_Imb (vl-remove (car list_Bloc_Imb) list_Bloc_Imb)) ) ;; Alert ;;*****************************************************;; (alert (strcat "\n---------------------------------------\n Blocs imbriqués dans " (car List_Final) " : \n" (apply 'strcat (mapcar '(lambda (x) (strcat "\n" x)) (cdr List_Final)) ) ) ) ;;*****************************************************;; (prin1) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 13 juillet 2006 Auteur Posté(e) le 13 juillet 2006 Merci (gile).Je vais tranquillement regarder ça....-------------------------------------------------------------Donc, j'apprends (encore!) quelque chose : "SEQUEND" ...bien bien bien.... :o [Edité le 13/7/2006 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 13 juillet 2006 Auteur Posté(e) le 13 juillet 2006 En fait je suis bluffer...Dans mon lisp (1er post), je traite les blocs imbriqué constitué de "bloc de base" (ayant attribut).... ;) mais quand je selectionne un "bloc de base", et bien il ne compte pas les petits "blocs secondaires" (sans attribut) .... :casstet: je l'ai fait... et j'avoue que je ne comprend pas pourquoi ça fonctionne comme ça.... et ça m'enerve encore plus !!!... :mad: Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 13 juillet 2006 Posté(e) le 13 juillet 2006 Donc, j'apprends (encore!) quelque chose : "SEQUEND" ... Attention SEQEND ! pas SEQUEND ! D'ailleurs je me demande pourquoi j'ai mis ce test sur SEQEND (copier/coller sans réfléchir !) il est ici parfaitement inutile. :casstet: Il suffit d'écrire (while Ent_ss_Bloc ...) [Edité le 13/7/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 13 juillet 2006 Auteur Posté(e) le 13 juillet 2006 Pas besoin de SEQEND...C'est pour ça que je ne le trouvais pas dans les entités !!!!.... :P C'est donc soit "INSERT", soit nil .... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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