jarod34 Posté(e) le 16 juillet 2009 Posté(e) le 16 juillet 2009 Bonjour à tous, Dans le cadre de mon travail j'utilise, une petite comande me permettant de renommer toute une sélection de texte ne comportant que des chiffres avec une incrémentation donné. Voici mon lisp: (defun c:aze () (debut) (setq js (ssget (list (cons 0 "TEXT")))) (if (not js) (exit)) (setq var 0.0) (setq var (mgetreal var "\nDépart ........ : ")) (setq pre 0) ;(setq pre (mgetint pre "\nPrecision ........ : ")) (setq incre 1) (setq incre (mgetint incre "\nincrémentation ........ : ")) (setq pre (fix pre)) (setq nb (sslength js)) (setq i 0) (while (< i (sslength js)) (setq e (entget (ssname js i))) (setq r (distof (cdr (assoc 1 e)))) (if r (progn (setq r (+ var (* incre (- (- nb 1) i)))) (entmod (subst (cons 1 (rtos r 2 pre)) (assoc 1 e) e)) ) ) (setq i (+ i 1)) ) (fin)) Bien que ça marche un petit problème subsiste qui est parfois génant:Les textes qui sont incrémentés sont traiter dans l'ordre où ils ont été créé, or cela me convient pas. Je voudrais que ce soit les textes qui soit le plus à gauche du dessin qui soit traité en premier et ainsi de suite en allant vers la droite! Auriez vous une idée sur la manière de paramétrer ça? ou de savoir quel fonction fait que l'ordre d'execution est ainsi... Merci par avance amis lispeur ;)
Patrick_35 Posté(e) le 16 juillet 2009 Posté(e) le 16 juillet 2009 Salut Avec les coordonnées des textes J'ai un vieux lisp qui correspond à ta demande @+ [Edité le 16/7/2009 par Patrick_35] Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jarod34 Posté(e) le 16 juillet 2009 Auteur Posté(e) le 16 juillet 2009 J''en déduis qu'il faut que j'utilise: (setq res (vl-sort lst '(lambda (a b) (< (caadr a) (caadr b))))) mais je ne vois pas comment l'intégrer. Si ça me trie les texte en fonction de leur coordonné (ce qui est exactement ce que je cherche merci bcp à toi Patrick_35 ;) ) Je dois donc les extraires de la liste que j'ai créé à partir de ma selection? puis cette ligne de code les classera dans l'ordre afin de les traiter de la droite à la gauche? Si déjà cela est correct, comment puis-je extraire a partir de ma premiere liste mes coordonées?
Patrick_35 Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 Voici un exemple plus épuré en copiant des parties du lisp que j'ai donné.La numérotation commence à 1 et s'incrémente de 1. (defun c:test(/ i lst res sel txt) ; fonctions vl dispo (vl-load-com) ; sélection des textes (ssget (list (cons 0 "MTEXT,TEXT"))) ; création d'une liste lst comprenant l'objet texte en vl ainsi que ses coordonnées (pour permettre le trie) (vlax-map-collection (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object) ) ) ) '(lambda (x) (setq lst (cons (list x (if (eq (vla-get-objectname x) "AcDbMText") (vlax-get x 'insertionpoint) (vlax-get x 'textalignmentpoint) ) ) lst ) ) ) ) ; effacer la sélection (vla-delete sel) ; trier les textes selon leurs coordonnées de la gauche vers la droite (option "GD" dans le lisp de base) (setq res (vl-sort lst '(lambda (a b) (< (caadr a) (caadr b)))) ; caadr = (car (cadr x)) i 1 ) ; boucle pour incrémenter les textes (foreach txt res (vla-put-textstring (car txt) (itoa i)) (setq i (1+ i)) ) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 Encore merci pour cette explication pratique, je vais essayer d'adapter le tout à mon problème ;)
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 Oups petit souci ton programme me traite toujours les texte dans l'ordre ou je les ais créés et non dans leur position.....!!!! :(
Patrick_35 Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 heu non J'ai aussi testé et le lisp fonctionne correctement. Tu disJe voudrais que ce soit les textes qui soit le plus à gauche du dessin qui soit traité en premier et ainsi de suite en allant vers la droite!Donc de gauche à droitepuisafin de les traiter de la droite à la gaucheL'ordre inverse ? Choisis l'ordre de trie dans le lisp de base. - DG veut dire de Droite vers la Gauche- HB veut dire du Haut vers le Bas- HDG veut dire du coin Haut-Droite vers la Gauche- BGH veut dire du coin Bas-Gauche vers le Haut @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 Oui autant pour moi c'est bien de la gauche vers la droite comme tu l'as fait dans ton programme. Cependant chez moi lorsque je créé 3 textes par exemple, puis que je lance ta comand test => Pas de souci Par contre si je recrée 2 textes suplémentaires positionné à gauche de mes 3 premiers textes, et bien lorsque je lance ta comande "test" il me traite d'habord les 3 premiers texte créés puis les deux créé ensuite ..... Ce qui fait que de gauche à droite il m'affiche dans l'ordre: "4" "5" "1" "2" "3" alors que je voudrais bien "1" "2" "3" "4" "5" Alors cela vien-t-il du fait que je sois sous 2009?
Patrick_35 Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 Je viens de faire tes manips et ça fonctionne correctement :casstet: J'ai aussi une 2009. Si c'est une adaptation du lisp, mets le à disposition que je regarde. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 NOn non ben j'ai juste copier le tien ... mais voici le mien également: (defun c:test(/ i lst res sel txt) ; fonctions vl dispo (vl-load-com) ; sélection des textes (ssget (list (cons 0 "MTEXT,TEXT"))) ; création d'une liste lst comprenant l'objet texte en vl ainsi que ses coordonnées (pour permettre le trie) (vlax-map-collection (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object) ) ) ) '(lambda (x) (setq lst (cons (list x (if (eq (vla-get-objectname x) "AcDbMText") (vlax-get x 'insertionpoint) (vlax-get x 'textalignmentpoint) ) ) lst ) ) ) ) ; effacer la sélection (vla-delete sel) (setq var (mgetreal var "\nDépart ........ : ")) (setq var (fix var)) (setq incre (mgetint incre "\nincrémentation ........ : ")) (setq incre (fix incre)) ; trier les textes selon leurs coordonnées de la gauche vers la droite (option "GD" dans le lisp de base) (setq res (vl-sort lst '(lambda (a b) (< (caadr a) (caadr b)))) ; caadr = (car (cadr x)) i var ) ; boucle pour incrémenter les textes (foreach txt res (vla-put-textstring (car txt) (itoa i)) (setq i (+ incre i)) ) (princ)) J'ai beau essayé ça me les traite pas dans l'ordre ... i d'ont understand !
Patrick_35 Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 Je vais tirer des oreilles ;) remplace dans ton lisp(setq var (mgetreal var "\nDépart ........ : "))par(setq var (getreal "\nDépart ........ : "))puis(setq incre (mgetint incre "\nincrémentation ........ : "))par(setq incre (getint "\nincrémentation ........ : ")) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 Ca ne change rien du tout si ce n'est de ne plus avoir la valeur précédente en mémoire ... Sinon l'ordre de traitement est toujours pas bon :P c'est a devenir fou si chez toi ça fonctione.... Pour toi le code te semble bon?
Patrick_35 Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 ben oui, ça fonctionne chez moi :casstet: Et sur plusieurs postes. Fais les lignes du lisp une par une pour comprendre, jusqu'au (vla-delete ...)Tu fais le trie. Si les coordonnées sont bien triés dans la liste res, le problème est ailleurs. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 J'ai d'habord tenter de tout fermé et réouvrir, cela fonction! comme quoi parfois ... En tout cas c'est nikel, un grand merci à toi et a ta patience ! Juste une derniere question qu'est qui te gene dans le fait d'utiliser les fonctions "mgetreal "et "mgetint"? (c'est pour plus me faire tirer les oreilles ;) )
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 Ah si y a une anguille sous roche :D Le code fonctionne avec les "textmult" mais pas les "texte" ... Et-ce qu'il ne manquerai pas quelque chose au niveau de la condition "if" ? [Edité le 17/7/2009 par jarod34]
Patrick_35 Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 Rien, c'est juste que ce ne sont pas des fonctions lisp (mais sûrement des persos) et comme ça ne fonctionnait pas, je pensais que c'était des fautes de frappes, que le lisp plantait et que c'est pour ça que tu n'avais pas le bon résultat.De plus, comme il devait y avoir un mélange entre ton lisp et le mien, totocad ne retrouvait plus ses petits.Le principal c'est que cela fonctionne maintenant, mais surtout, que tu ais compris mes lignes de codes. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Patrick_35 Posté(e) le 17 juillet 2009 Posté(e) le 17 juillet 2009 Le code fonctionne avec les "textmult" mais pas les "texte" ... C'est dans le filtre (ssget (list (cons 0 "MTEXT,TEXT"))) Textes et Mtext @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 Si je viens de trouver ce qui me bloc: c'est "AcDbMText", car lorsque je met AcDbText' il me traite les textes, me manque plus à coupler les deux pour que mes deux sorte de texte soit traiter de la bonne manière....
jarod34 Posté(e) le 17 juillet 2009 Auteur Posté(e) le 17 juillet 2009 Voilà mon code final qui fonctione avec une petite modif qui va bien : (defun c:test(/ i lst res sel txt) ; fonctions vl dispo (vl-load-com) ; sélection des textes (ssget (list (cons 0 "MTEXT,TEXT"))) ; création d'une liste lst comprenant l'objet texte en vl ainsi que ses coordonnées (pour permettre le trie) (vlax-map-collection (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object) ) ) ) '(lambda (x) (setq lst (cons (list x (if (member (vla-get-objectname x) '("AcDbMText" "AcDbText")) (vlax-get x 'insertionpoint) (vlax-get x 'textalignmentpoint) ) ) lst ) ) ) ) ; effacer la sélection (vla-delete sel) (setq var (getreal "\nDépart ........ : ")) (setq var (fix var)) (setq incre (getint "\nincrémentation ........ : ")) (setq incre (fix incre)) ; trier les textes selon leurs coordonnées de la gauche vers la droite (option "GD" dans le lisp de base) (setq res (vl-sort lst '(lambda (a b) (< (caadr a) (caadr b)))) ; caadr = (car (cadr x)) i var ) ; boucle pour incrémenter les textes (foreach txt res (vla-put-textstring (car txt) (itoa i)) (setq i (+ incre i)) ) (princ) ) Encore merci Patrick [Edité le 17/7/2009 par jarod34]
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