Aller au contenu

Messages recommandés

Posté(e)

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

 

Amicalement

Vincent

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)

Posté(e)

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

 

Ç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 ?

 

Amicalement

Vincent

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)

Posté(e)

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

Posté(e)
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

 

Amicalement

Vincent

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)

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é