zebulon_ Posté(e) le 26 mai 2015 Posté(e) le 26 mai 2015 Bonjour, j'ai cherché une fonction de tri d'un tableau dans autocad, mais je n'ai pas trouvé (Autocad 2014). Le but est de trier selon la première colonne du tableau, dans l'ordre croissant et selon les valeurs numériques entières (sinon on a "1" "10" "100" "2" "20" "200", au lieu de 1 2 10 20 100 200) Je suis donc passé par un lisp(defun c:tabsort () (vl-load-com) (setq e (car (entsel))) (setq obj (vlax-ename->vla-object e)) (setq eRows (vla-get-rows obj)) (setq eColumns (vla-get-columns obj)) (setq R 2) ; je commence à la troisième ligne, 1ère titre, 2ème sous-titre (setq ltab nil) (repeat (- eRows 3) ; pas les 2 premières lignes, ni la dernière (totaux) (setq C 0) (setq lval nil) (repeat eColumns (setq val (vla-GetText obj R C)) (setq lval (cons val lval)) (setq C (+ C 1)) ) (setq ltab (cons (reverse lval) ltab)) (setq R (+ R 1)) ) ;; trier la liste svt la première colonne en prenant les valeurs numériques entières (setq ltab (vl-sort ltab '(lambda (e1 e2) (< (atoi (car e1)) (atoi (car e2)))))) ;; réinjecter les valeurs triées dans le même tableau (setq R 2) (repeat (- erows 3) (setq lval (car ltab)) (setq ltab (cdr ltab)) (setq C 0) (repeat ecolumns (setq val (car lval)) (setq lval (cdr lval)) (vla-SetText obj R C val) (setq C (+ C 1)) ) (setq R (+ R 1)) ) (princ) ) AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
Patrick_35 Posté(e) le 27 mai 2015 Posté(e) le 27 mai 2015 Salut J'ai un peu de mal à comprendre le trie que tu souhaites faire Comme ceci ?(mapcar 'atoi (acad_strlsort '("10" "1" "200" "2" "100" "20")))(mapcar 'atoi (vl-sort '("10" "1" "200" "2" "100" "20") '<))@+ 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 27 mai 2015 Posté(e) le 27 mai 2015 Salut, Ça serait pas plutôt : (vl-sort '("10" "1" "200" "2" "100" "20") '(lambda (x y) (< (atoi x) (atoi y)))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zebulon_ Posté(e) le 27 mai 2015 Auteur Posté(e) le 27 mai 2015 Salut, Ça serait pas plutôt : (vl-sort '("10" "1" "200" "2" "100" "20") '(lambda (x y) (< (atoi x) (atoi y)))) Bonjour, c'est ce que j'ai fait : ;; trier la liste svt la première colonne en prenant les valeurs numériques entières (setq ltab (vl-sort ltab '(lambda (e1 e2) (< (atoi (car e1)) (atoi (car e2)))))) En fait, j'ai précisé la méthode de tri parce qu'au départ, je n'avais pas mis (atoi ...) et, comme le résultat de la fonction vla-GetText est (on s'en doute...) de type texte, le résultat du tri était "1" "10" "100" "2" etc..., donc pas ce que je voulais. Je n'ai pas été assez précis, en fait, mon lisp fonctionne comme je le souhaite. Je voulais le partager au cas où quelqu'un d'autre aurait besoin de trier un tableau autocad.Je m'étonnais aussi de l'inexistance d'une fonction de tri dans un tableau. Vous me direz : c'est pas excel... ou vous me direz : bien sûr que ça existe, il faut faire ceci ou cela (j'avoue n'avoir rien trouvé qui irait dans ce sens) On pourrait aussi améliorer le lisp en demandant :- la plage de lignes à trier ?- quelle colonne utiliser pour faire le tri ?- du plus petit au plus grand ou inversement ?- utiliser des valeurs numériques ou alphanumériques ? AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
bonuscad Posté(e) le 28 mai 2015 Posté(e) le 28 mai 2015 Bonjour zebulon, Comme je me suis permis de prendre un bout de code de ta publication pour en améliorer une autre, je publie donc ègalement la modification que j'ai faite. Je l'ai d'ailleurs donné en réponse ici. Cette fonction modifiée permet de rechercher/changer du texte dans un tableau (objet ACAD_TABLE) (defun my_replace_text (new_string old_string / js n ename) (vl-load-com) (defun string-subst (nam_obj / value_string nbs tmp_nbs) (setq value_string (vlax-get nam_obj 'TextString) nbs 0) (while nbs (if (setq nbs (vl-string-search old_string value_string (setq tmp_nbs nbs))) (setq value_string (vl-string-subst new_string old_string value_string tmp_nbs) nbs (1+ nbs) ) ) ) (vlax-put nam_obj 'TextString value_string) ) (defun tabl_subst (obj / eRows eColumns R C val nbs tmp_nbs) (setq eRows (vla-get-rows obj) eColumns (vla-get-columns obj) R 0 ) (repeat eRows (setq C 0) (repeat eColumns (setq val (vla-GetText obj R C) nbs 0 tmp_nbs nil) (while nbs (if (setq nbs (vl-string-search old_string val (setq tmp_nbs nbs))) (setq val (vl-string-subst new_string old_string val tmp_nbs) nbs (1+ nbs) ) ) ) (vla-SetText obj R C val) (setq C (+ C 1)) ) (setq R (+ R 1)) ) ) (setq js (ssget "_X" '( (-4 . "<OR") (0 . "*TEXT,MULTILEADER,ATTDEF,ACAD_TABLE") (-4 . "<AND") (0 . "INSERT") (66 . 1) (-4 . "AND>") (-4 . "OR>") ) ) ) (cond (js (repeat (setq n (sslength js)) (setq ename (vlax-ename->vla-object (ssname js (setq n (1- n))))) (cond ((vlax-property-available-p ename 'TextString) (string-subst ename) ) ((vlax-property-available-p ename 'Rows) (tabl_subst ename) ) (T (mapcar '(lambda (att) (string-subst att) ) (vlax-invoke ename 'GetAttributes) ) ) ) ) ) ) (prin1) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
zebulon_ Posté(e) le 28 mai 2015 Auteur Posté(e) le 28 mai 2015 Comme je me suis permis de prendre un bout de code de ta publication c'est ce qu'on fait tous et c'est comme ça qu'on arrive à progresser collectivement :D AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
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