Aller au contenu

Blocs constituant un bloc imbriqué...


Messages recommandés

Posté(e)

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...

Posté(e)

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

Posté(e)

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...

Posté(e)

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

Posté(e)

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...

Posté(e)

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...

Posté(e)

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

Posté(e)

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...

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é