Aller au contenu

Problème de boucle sur les attributs de bloc


Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

Salut (gile)

Ton lisp est bon, mais tu aurais pu faire ton test sur le SEQEND, que je trouve plus logique que sur le ATTRIB

Bon, c'était juste une remarque en passant ;)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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

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é