Aller au contenu

Messages recommandés

Posté(e)

Bonjour à toutes et à tous :)

 

Bonne et heureuse année 2013 ;)

 

Je suis entrain de m'exercer sur un petit lisp afin de changer la valeur d'un texte multiligne avec un code DXF 3. J'y suis donc allez gentillement avec ce lisp :

 

(setq txt (car (entsel "Cliquez sur le texte: ")))
(setq se (entget txt))
(while (vl-string-search "5000CDE" (cdr (assoc 3 se)))
	(setq nouv (cons 3 (vl-string-subst "6000CDC" "5000CDE" (cdr (assoc 3 se)))))
	(setq anc (assoc 3 se))
	(entmod (subst nouv anc se))
	(setq se (entget txt))
)
(princ "fin...")
(princ)

 

J'ai testé ce petit lisp sur un texte multiligne ou la valeur 5000CDE apparaissait a plusieurs reprise (il semblerait d'ailleurs qu'un saut de ligne sois representé par //P) et le lisp fonctionne bien.

 

Maintenant, je souhaite modifier mon code pour cette fois ci faire une selection via ssget et voilà ce que cela donne:

(setq ss (ssget "_X" '((0 . "MTEXT"))))
(setq nb 0)
(setq txt (ssname ss nb))
(setq se (entget txt))
(while (or (vl-string-search "5000CDE" (cdr (assoc 3 se))) (ssname ss nb))
	(setq txt (ssname ss nb))
	(setq se (entget txt))
	(if (assoc 3 se)
	(progn
	(setq nouv (cons 3 (vl-string-subst "6000CDC" "5000CDE" (cdr (assoc 3 se)))))
	(setq anc (assoc 3 se))
	(entmod (subst nouv anc se))
	(setq se (entget txt))
	)
	)
	(setq nb (+ 1 nb))
)
(princ "fin...")
(princ)

 

Et comme vous vous en doutez,ça marche pas <_< (sinon ce serai trop facile je suppose...)

alors si quequ'un voit mon erreur et peut me l'expliquer le pourquoi du comment je lui en serais reconnaissant

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Bonjour et tous mes voeux de bonheur et de santé

 

Tu n'as pas fait de boucle sur ta sélection

 

Par exemple

(while (setq txt (ssname ss nb))
 ...
 (setq nb (1+ nb))
)

 

@+

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)

Bonjour Patrick_35 et merci de ton attention.

 

Je pensais pourtant que la boucle de selection se faisais en meme temps que ma boucle sur la recherche du texte. Ici precisement:

 

(or (vl-string-search "5000CDE" (cdr (assoc 3 se))) (ssname ss nb))

 

Mon erreur ne serais pas dû au faite (vl-string-search "5000CDE" (cdr (assoc 3 se))) est peut etre egal a nil d'entré de jeu?

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Salut

 

Ce n'est pas exactement ça car tu mélanges les boucles.

Tu as une boucle imbriquée dans une autre.

Tu fais une 1ere boucle pour parcourir ta sélection.

Dans cette boucle, tu récupères donc chaque entité sélectionnée et ensuite ses codes dxf.

Ensuite, à la lecture de ton lisp, tu fais une boucle pour rechercher autant de fois que nécessaire le texte "5000CDE" dans le mtext pour le modifier.

 

@+

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)

Salut,

 

Si l’opération consiste à substitué la valeur, 6000CDE par 5000CDE dans un MTEXT, pour une fois je conseillerais de passer par les propriétés ActiveX.. Plutôt que de passer par les listes DXF.

 

Car en plus de boucler sur ta sélection, puis sur le traitement au moyen de vl-string-subst (qui ne traite par défaut que la première occurrence trouvé comme rappelé par Patrick_35 ), il faut également penser à l’éventualité de la présence ou non de plusieurs code de groupe 3 (avec une routine de type massoc) et le code de groupe 1 n’est peut-être pas négliger non plus dans ton traitement.

 

 

Alors que la propriété textstring accessible en Vlisp retourne l’intégralité du texte définie dans un MTEXT et ce quelque soit la longueur de sa chaine de caractère ( inférieure ou supérieur à 250 caractères).

 

Pour lire la valeur dans d’un mtext :

(vla-get-textstring  (vlax-ename->vla-object (car (entsel))))

 

Et pour l’exemple que tu donnes cela pourrait donner ceci à tester:

(defun c:bigsyke  (/ i ss ent obj)
 (and (setq i  -1 ss (ssget "_X" '((0 . "MTEXT"))))
      (while (setq ent (ssname ss (setq i (1+ i))))
        (setq txt (vla-get-textstring (setq obj (vlax-ename->vla-object ent))))
        (vla-put-textstring obj (while (/= txt (setq txt (vl-string-subst "6000CDC" "5000CDE" txt))) txt))
      )
 )
 (princ)
)

 

A+

Apprendre => Prendre => Rendre

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é