bigsyke Posté(e) le 7 janvier 2013 Posté(e) le 7 janvier 2013 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
Patrick_35 Posté(e) le 7 janvier 2013 Posté(e) le 7 janvier 2013 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bigsyke Posté(e) le 7 janvier 2013 Auteur Posté(e) le 7 janvier 2013 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
Patrick_35 Posté(e) le 9 janvier 2013 Posté(e) le 9 janvier 2013 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
VDH-Bruno Posté(e) le 9 janvier 2013 Posté(e) le 9 janvier 2013 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
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