Aller au contenu

Petit problème avec un ForeEach


Messages recommandés

Posté(e)

Bonjour à tous,

 

Voilà, j’essaie de faire une macro qui change de calque certain blocs à partir d'une liste pointé.

 

Voici mon code :

;;; Liste pointé des blocs et de leur futur calque
 (setq LstBlk '(("AVSIMP*" . "RES_EP")
                 ("EAU*" . "RES_EAU")
                 ("EDF*" . "RES_ELEC")
                 ("EGO*" . "RES_ASS")
                 ("GAZ*" . "RES_GAZ")
                 ("MOB*" . "MOBILIER_URBAIN")
                 ("PLPTT*" . "RES_TEL")
                 ("PTT*" . "RES_TEL")
                 ("REGARD*" . "RES_ASS")
                 ("VEG52*" . "VEG_ARBRE")
                )
 ) ;_ Fin de setq
;;;Début de la boucle
(foreach PosLstBlk LstBlk
 ;;; Création du calque s'il n'existe pas
 (if (not (tblsearch "layer" (cdr (assoc (car PosLstBlk) LstBlk))))
   (command "-calque" "n" (cdr (assoc (car PosLstBlk) LstBlk)) "")
 ) ;_ Fin de if
 ;;;Affiche le Bloc en cour et le Calque en cour
 (princ (strcat "\nBloc= " (car PosLstBlk)))
 (princ (strcat "\nCalque= " (cdr (assoc (car PosLstBlk) LstBlk))))
 ;;;Vide la Sélection
 (setq Select nil)
 ;;Sélectiones les blocs  puis les place dans leur calque
 (if (setq Select (ssget "_X" '((0 . "INSERT") (2 . (car PosLstBlk)))))
   (command "chprop" Select "" "ca" (cdr (assoc (car PosLstBlk) LstBlk)) "")
 ) ;_ Fin de progn
) ;_ Fin de foreach

 

AutoCAD me dit :

Bloc= AVSIMP*

Calque= RES_EP; erreur: valeur de liste SSGET incorrecte

; redéfinir après erreur

 

Si quelqu'un a un conseil ou une astuce, je suis preneur...

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)

(ssget "_X" (list(cons 0  "INSERT") (cons 2  (car PosLstBlk))))

J'ai corrigé ton SSGET

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Posté(e)

Bonjour Tramber, et merci pour ton aide.

 

En gros, il fallait préciser que (car PosLstBlk) était une constante pour qu'il l’évalue correctement ?

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)

Bonjour (gile),

 

AutoCAD me répond :

erreur: type d'argument incorrect: stringp ("AVSIMP*" . "RES_EP")

 

Et la Console me dit :

_1$ (assoc (car PosLstBlk) LstBlk)

("AVSIMP*" . "RES_EP")

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)

Je ne te donnais pas une solution de simplification avec la question :

(assoc (car PosLstBlk) LstBlk) ça retourne quoi ?...

J'essayais juste de te faire réfléchir à ce que tu fais avec cette expression :

avec assoc, tu cherches dans la liste (LstBlk) la paire pointée dont le premier élément (car) est égal au premier élément de la paire pointée PosLstBlk.

C'est précisément cette expression qui peut être simplifiée.

 

Quant à ton problème de filtre de sélection solutionné par Tramber, c'est juste un problème d'évaluation de variable.

L'apostrophe (') avant une expression est un raccourci pour la fonction quote qui empêche l'évaluation de l'expression.

'((0 . "INSERT") (2 . (car PosLstBlk)) ou (quote ((0 . "INSERT") (2 . (car PosLstBlk)))) retournent :

((0 . "INSERT") (2 CAR POSLSTBLK))

Pour que (car PosLstBlk) soit évalué, il faut écrire comme l'a fait Tramber:

(list (cons 0 "INSERT") (cons 2 (car PosLstBlk)))

ou :

(list '(0 . "INSERT") (cons 2 (car PosLstBlk)))

puisque la paire (0 . "INSERT") n'a pas besoin d'être évaluée.

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

Posté(e)

Merci (gile) pour toutes ces précisions qui, malgré que le consulte dès que j'ai une macro à faire, sont pourtant dans ton super "Introduction_a_AutoLISP.pdf"...

 

J'avoue avoir toujours du mal avec la logique Lisp... C'est très dommage, car quand je vois ce que certains arrivent à faire...

 

En tous cas, merci encore à vous tous...

 

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)

La simplification que je te suggérais :

 

(cdr (assoc (car PosLstBlk) LstBlk)) 

est juste plus verbeux (donc moins lisible) et surtout moins effécient (surtout que tu appelles cette expression deux fois de suite) que :

 

(cdr PosLstBlk)

qui retourne exactement la même chose...

 

La différence d'exécution est, dans ce cas, insensible vu la taille de la liste, mais c'est une bonne habitude à prendre que d'éviter des procédures inutiles.

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

Posté(e)

Merci encore (gile) pour cette explication, mais je pense que ça dépasse mon piètre niveau...

 

Effectivement, c'est "moins lisible"... Et ça rejoint le "(car PosLstBlk)" pour la première occurrence de la paire.

 

Mais ce code est issue d'une aide fournie aimablement sur ce forum. Je ne suis pas capable d'écrire un tel code, mais une fois "analysé", j'en comprend l'essentiel pour pouvoir le modifier à mes besoins.

 

Merci encore...

 

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)

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é