Morgul Posté(e) le 30 août 2006 Posté(e) le 30 août 2006 Bonjour à tous, J'ai des blocs avec plusieurs attributs, que je n'arrive pas à renseigner via un lisp.Hiers, j'ai eu de l'aide sur ce forum et, je suis vraiment nul, car je n'arrive pas à exploiter ce que l'on m'a donné. En effet les lignes suivantes marchent pour renseigner un attribut, mais je n'arrive pas à faire correctement ma boucle pour attaquer les autres attributs. (setq BlocAnt (car (entsel))) ; pour sélectionner un bloc contenant des attributs (setq att (entget (entnext BlocAnt))) ; pour trouver le premier attribut (setq att (subst (cons 1 "TYPE ANT") (assoc 1 att) att)) ; pour changer la valeur de l'attribut(entmod att)(entupd (cdr (assoc -1 att))) (setq att (entnext (cdr (assoc -1 att)))) Merci de pour votre aide. Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent. Maréchal Foch
Bred Posté(e) le 30 août 2006 Posté(e) le 30 août 2006 Salut,dans ton précedent message http:// http://www.cadxp.com/sujetXForum-11471.htm je te donnais un exemple de lisp où justement une boucle se fait jusqu'à rencontrer "SEQEND" qui signale la "fin" d'un bloc ... mais pour que l'on puisse te répondre plus facilement, tu devrais poster ton code.... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Morgul Posté(e) le 30 août 2006 Auteur Posté(e) le 30 août 2006 Merci pour ton aide. Voici mon code : (defun c:TEST (/ NEWVAL1 NEWVAL2 NEWVAL3 NEWVAL4 BlocSelec att ) (setq NEWVAL1 (getstring t "\nEntrez la valeur de l'attribut 1 : "))(setq NEWVAL2 (getstring t "\nEntrez la valeur de l'attribut 2 : "))(setq NEWVAL3 (getstring t "\nEntrez la valeur de l'attribut 3 : "))(setq NEWVAL4 (getstring t "\nEntrez la valeur de l'attribut 4 : ")) (setq BlocSelec (car (entsel))) ; pour sélectionner un bloc contenant des attributs (setq att (entget (entnext BlocSelec))) ; pour trouver le premier attribut (setq att (subst (cons 1 NEWVAL1) (assoc 1 att) att)) ; pour changer la valeur de l'attribut(entmod att)(entupd (cdr (assoc -1 att))) (setq att (entnext (cdr (assoc -1 att)))) )(c:TEST) Il fonctionne, mais je n'arrive pas à changer toutes les nouvelles valeures d'attribut que je souhaite, il change qu'une valeure. Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent. Maréchal Foch
(gile) Posté(e) le 30 août 2006 Posté(e) le 30 août 2006 Salut, Le problème vient, je pense de : (setq att (entnext (cdr (assoc -1 att)))) qui retourne un nom d'entité et pas la liste des données DXF de l'entité. Si tu fais (setq att (entget (entnext (cdr (assoc -1 att))))) tu pourras modifier la liste de données du second attribut comme tu l'a fait pour le premier et ainsi de suite... Pour éviter d'avoir à répéter 4 fois le même code (à la valeur de NEWVALn près) on peut faire une boucle. Comme la valeur des attributs est déjà définie (sinon tu utiliserais ATTEDIT) de façon incrémentée NEWVAL1, NEWVAL2, NEWVAL3... on peut récupérer ces valeurs dans la boucle à l'aide d'un compteur. Exemple de ce que l'on pourrait faire (j'ai volontairement décomposé le codes pour une meilleure compréhension, il pourrait être plus concis) (defun c:TEST (/ NEWVAL1 NEWVAL2 NEWVAL3 NEWVAL4 BlocSelec att n newval) (setq NEWVAL1 (getstring t "\nEntrez la valeur de l'attribut 1 : ")) (setq NEWVAL2 (getstring t "\nEntrez la valeur de l'attribut 2 : ")) (setq NEWVAL3 (getstring t "\nEntrez la valeur de l'attribut 3 : ")) (setq NEWVAL4 (getstring t "\nEntrez la valeur de l'attribut 4 : ")) (setq BlocSelec (car (entsel))) ; pour sélectionner un bloc contenant des attributs (setq att (entget (entnext BlocSelec))) ; pour trouver le premier attribut (setq n 0) ; mise du compteur à 0 (while (= (cdr (assoc 0 att)) "ATTRIB") ; boucle tant que att est un attribut (setq n (1+ n)) ; incrémentation du compteur (setq newval (eval (read (strcat "NEWVAL" (itoa n))))) ; valeur de NEWVALn (setq att (subst (cons 1 newval) (assoc 1 att) att)) ; pour changer la valeur de l'attribut (entmod att) (entupd (cdr (assoc -1 att))) (setq att (entget (entnext (cdr (assoc -1 att))))) ; données de l'attribut suivant (setq att (subst (cons 1 NEWVAL2) (assoc 1 att) att)) ; pour changer la valeur de l'attribut (entmod att) (entupd (cdr (assoc -1 att))) ) ; fin de while (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 30 août 2006 Posté(e) le 30 août 2006 Salut (gile)Ton lisp est bon, mais tu aurais pu faire ton test sur le SEQEND, que je trouve plus logique que sur le ATTRIBBon, c'était juste une remarque en passant ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 30 août 2006 Posté(e) le 30 août 2006 Plus logique, peut-être mais ça me semblait plus simple à comprendre avec le commentaire : "boucle tant que att est un attribut". Pour Morgul, donc, on peut aussi boucler en faisant : (while (not (= (cdr (assoc 0 att)) "SEQEND")) ...) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 30 août 2006 Posté(e) le 30 août 2006 ou encore (while (/= (cdr (assoc 0 att)) "SEQEND") ...)on gagne deux parenthèses :D @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 30 août 2006 Posté(e) le 30 août 2006 En fait, je fais une boucle avec while par habitude, mais le plus logique serait de faire un :(repeat 4 ...)comme sait qu'il y a 4 attributs à modifier, ce qui devrait être plus rapide (quand on est à la micro seconde près). ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 30 août 2006 Posté(e) le 30 août 2006 On la fait plus subtile avec un inputbox et la valeur par défaut dans la boucle ? ;) (quand on est à la micro seconde près)Ce sont les petites rivières qui font les grands fleuves et comme ça, j'ai un peu plus de temps pour la pause café :cool: @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Morgul Posté(e) le 31 août 2006 Auteur Posté(e) le 31 août 2006 Merci à vous deux pour vos réponses, c'est super cool ! Mais je pense, qu'il y a trop de lignes dans le code, elles ce sont surement glissées par inadvertance. A la fin du code, il y a : (setq att (subst (cons 1 NEWVAL2) (assoc 1 att) att)) ; pour changer la valeur de l'attribut(entmod att)(entupd (cdr (assoc -1 att))) Si j'ai bien compris le code, je pense qu'elles ne servent pas. Je vous remerci encore, pour votre rapidité ainsi que votre disponiblité. A+. Il n'y a pas d'homme cultivé, il n'y a que des hommes qui se cultivent. Maréchal Foch
(gile) Posté(e) le 31 août 2006 Posté(e) le 31 août 2006 Bien sûr qu'elle servent !!!Ce sont elles qui modifient les données du bloc. (setq att (subst (cons 1 NEWVAL2) (assoc 1 att) att))Modifie la liste des données contenues dans la variable att (changement de la valeur de l'attribut) (entmod att)Met à jour les nouvelles données de l'attribut (entupd (cdr (assoc -1 att)))Met à jour le bloc dans le dessin (cette dernière peut peut-être être supprimée, à essayer) [Edité le 31/8/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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