DenisHen Posté(e) le 19 février 2016 Posté(e) le 19 février 2016 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)
Tramber Posté(e) le 19 février 2016 Posté(e) le 19 février 2016 (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 ./__\. (.°=°.)
DenisHen Posté(e) le 19 février 2016 Auteur Posté(e) le 19 février 2016 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)
(gile) Posté(e) le 19 février 2016 Posté(e) le 19 février 2016 (cdr (assoc (car PosLstBlk) LstBlk)) Ça, ça demande vraiment à être simplifié !(assoc (car PosLstBlk) LstBlk) ça retourne quoi ?... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 19 février 2016 Auteur Posté(e) le 19 février 2016 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)
(gile) Posté(e) le 19 février 2016 Posté(e) le 19 février 2016 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
DenisHen Posté(e) le 19 février 2016 Auteur Posté(e) le 19 février 2016 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)
(gile) Posté(e) le 19 février 2016 Posté(e) le 19 février 2016 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
DenisHen Posté(e) le 19 février 2016 Auteur Posté(e) le 19 février 2016 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)
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