Aller au contenu

challenge debutant seulement avec l\'aide de nos maitres....


Messages recommandés

Posté(e)

Au départ, listd = nil

Un (setq listd (cons "Un_Texte" listd)) donnera ("Un_texte")

 

C'est ce que j'essayais de lui faire découvrir en lui proposant d'évaluer (cons 1 nil)

 

lovecraft,

le gros avantage de l'éditeur Visual LISP par rapport au notepad, au delà de la meilleure lisibilité due à la mise en forme du code, c'est de pouvoir y évaluer directement des expressions dans la console.

C'est en faisant beaucoup de tests qu'on apprend comment réagissent les fonctions.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Re voici le code avec qqes corrections:

 

 (defun sstext ()
(ssget "X" (list (cons 0 "*TEXT") (cons 8 "TEXTE_INDICE")))
)

;**************************************************************

(defun c:lstf ()

(setq jstext (sstext))

(setq listd nil)

(setq i 0)

(repeat (sslength jstext)

(setq enttxt (ssname jstext i) bdenttxt (entget enttxt))                
(setq listd (cons (atof(cdr(assoc 1 bdenttxt))) listd))
(setq i (+ 1 i))
 
);fin du repeat

 (princ listd)


 );fin du defun

 

Maintenant je voudrais passer a l'etape suivante mais là je ne sais pas comment faire . je pensais utiliser la fonction min mais je n'y arrive pas.

 

Peut on me donner le bout du fil....

 

PS:Gile j'appliquerai la suite de tes remarques a la fin de l'etape 4. ;)

 

Merci

Posté(e)

Ou encore :

 

(acad_strlsort lstd)

 

si tu conserves des chaînes

 

C'est pour ça que Patrick_35 te disais : "Ensuite, pourquoi tu convertis le texte avec atof ?"

 

Sachant que la prochaine étape sera d'écrire dans un fichier, donc avec des chaines, il est inutile de convertir une fois dans un sens puis après dans l'autre.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Juste une précision concernant les tries avec acad_strlsort et vl-sort pour des chaînes de caratères.

 

(acad_strlsort '("a" "A" "d" "D" "b" "B")) donne ("A" "a" "B" "b" "D" "d")

(vl-sort '("a" "A" "d" "D" "b" "B") '<) donne ("A" "B" "D" "a" "b" "d")

 

J'avais constaté cette différence lors d'un trie pour les noms de blocs.

 

@+

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)

ben voila j'ai fini une partie de ce challenge "mon challenge" puisque aucun aute debutant n'a participé. "je ne sais pas ce qu'il faut faire pour que d'autre peersonne puisse participer car il me semble que ce challenge etait a la hauteur de tout debutant. enfin bon

 

Voici mon code:

 

 (defun sstext ()
(ssget "X" (list (cons 0 "*TEXT") (cons 8 "TEXTE_INDICE")))
)

;**************************************************************

(defun c:lstf ()

(setq jstext (sstext))

(setq listd nil)

(setq i 0)

(repeat (sslength jstext)

(setq enttxt (ssname jstext i) bdenttxt (entget enttxt))
(setq listd (cons (atof(cdr(assoc 1 bdenttxt))) listd))
(setq i (+ 1 i))

);fin du repeat


(setq listfin (vl-sort listd '

(setq fic (open "D:\\AUTOCAD CIVIL 2008 FICHIERS\\LISP\\new.txt" "w"))
(setq k 0)
(repeat (sslength jstext)
(setq rfic (rtos (nth k listfin)))
(write-line rfic fic)
(setq k (+ 1 k))
);fin du repeat

(close fic)

);fin du defun 

 

PS: maintenant il me reste le plus dure de l'optimiser grave a vos commentaire que je vais reprendre et ceux à venir.

 

Merci

Posté(e)

Salut

 

ben voila j'ai fini une partie de ce challenge "mon challenge" puisque aucun aute debutant n'a participé. "je ne sais pas ce qu'il faut faire pour que d'autre peersonne puisse participer car il me semble que ce challenge etait a la hauteur de tout debutant. enfin bon

C'est une constatation, et c'est pour cela que j'ai arrêté. Même pour le niveau intermédiaire. :(

 

 

 

Tu n'as pas grand chose à optimiser.

 

Tu peux faire un seul setq pour plusieurs variables, mais d'autres préfère l'éviter pour la lisibilité du code

 

Tu peux aussi éviter de faire par exemple (setq listd nil) car si la variable listd n'a pas été utilisée, elle est à nil

 

Tu peux mettre tes variables en local dans la définition de ta fonction

ex : (defun c:lstf (/ jstext listd i bdenttxt enttxt listfin fic k rfic)

 

Tu te sers aussi de la fonction atof pour une conversion et ensuite rtos pour repartir dans l'autre sens. Cela ne sert à rien

 

Pour tes boucles, un jour tu utilises la variable i, un autre la variable K. C'est plus logique d'utiliser la même variable

 

Et une dernière chose, tu ne teste pas si la sélection est vide.

 

Sinon, voici une version vlisp que j'avais mis de coté.

 

(defun c:test(/ fic file lst n sel txt)
 (vl-load-com)
 (and (ssget "x" (list (cons 0 "*TEXT") (cons 8 "0")))
      (setq fic (getfiled "Veuillez choisir le fichier de destination" (getvar "dwgprefix") "txt" 1))
   (progn
     (vlax-map-collection (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) '(lambda (x) (setq lst (cons (vla-get-textstring x) lst))))
     (vla-delete sel)
     (setq n 0
    file (open fic "w")
    lst (vl-sort lst '<)
     )
     (while (setq txt (nth n lst))
(write-line txt file)
(setq n (1+ n))
     )
     (close file)
     (princ (strcat "\nFichier " fic " créé."))
   )
 )
 (princ)
)

 

@+

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)

Ah que dire de plus .... Merci (Gile and Patrcik_35)

je vais regarder ta version vlisp (comme je suis debutant )c'est peut etre le moment d'apprendre cette évolution d'autolisp.

 

PS:Je vais essayer de m'accrocher pour rivaliser sur les challenges des experts (c'est pas gagné).

En fait je crois qu'ici y a des gens qui viennent prendre , ce qu'ils veulent et rien d'autre (on leurs dévellope des lisps et puis oups disparu), enfin c'est ce que je ressents.

 

@plus

Posté(e)

Bonjour à toutes et tous,

 

ben voila j'ai fini une partie de ce challenge "mon challenge" puisque aucun aute debutant n'a participé. "je ne sais pas ce qu'il faut faire pour que d'autre peersonne puisse participer car il me semble que ce challenge etait a la hauteur de tout debutant. enfin bon

.

 

Je suis assez d'accord avec toi et m'en excuse car découvrir le lisp et progresser m'intéresse vraiment. MAIS (parce qu'il y a toujours un mais!), cela reste trés difficile de rentrer dedans, même quand on sait ce que l'on veut faire.(Ce qui était ton cas pour ce challenge)

Je viens tous juste de finaliser, suite aux conseils de nos maitres et expert ce dont j'ai traité en partie dans ce post et vous soumet le code pour critique, en espérant, lovecraft, qu'il te profite aussi car j'ai apprécié ta démarche. Suite sur le post citée plus haut.

 

 

 

[Edité le 17/10/2007 par lili2006]

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Alors voilà un exemple de ce qu'on aurait pu faire en AutoLISP

 

(defun c:test (/ ss n lst elst path file)
 (and
   (setq ss (ssget "_X" '((0 . "*TEXT") (8 . "TEXTE_INDICE"))))
   (repeat (setq n (sslength ss))
     (setq elst (entget (ssname ss (setq n (1- n)))))
     (if (numberp (read (setq val (cdr (assoc 1 elst)))))
(setq lst (cons val lst))
     )
   )
   (setq path (getfiled "Créer un fichier" "" "txt" 1))
   (setq file (open path "w"))
   (mapcar '(lambda (x) (write-line x file))
    (acad_strlsort lst)
   )
   (close file)
 )
 (princ)
) 

 

L'utilisation de (and ...) permet d'éviter les erreurs (si le jeu de sélection est vide par exemple) : à l'intérieur du (and ...) les expressions sont évaluée une après l'autre et si une expression retourne nil l'évaluation s'arrête.

 

La liste du filtre de sélection : comme toutes les données sont connues (pas de variable à évaluer) il n'est pas utile de faire (list (cons ...) (cons ...)).

 

La boucle (repeat ...) parcourt le jeu de sélection à l'envers (c'est une coquèterie avec les (setq n...)). Dans cette boucle chaque élément du jeu de sélection est évalué pour voir si le texte est bien l'expression d'un nombre.

 

L'écriture dans le fichier (choisi avec (getfiled...) comme Patrick_35) est faite dans une expression (mapcar ...). La liste est triée à ce moment là.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Je pense que ce n'est pas une bonne idée d'utiliser le groupe 100 dans les filtres de sélection.

Le groupe 0 est plus sûr et permet (comme tous les groupes dont la valeur est une chaine) d'utiliser les caractères génériques (regarde la fonction wcmatch) et/ou plusieurs valeurs séparés par une virgules.

 

(0 . "*TEXT") ou (0 . "MTEXTE,TEXTE")

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Je viens de me rendre compte que j'aurais pu simplifier aussi mon lisp (les vieilles habitudes ;) )

Merci (gile)

 

(defun c:test(/ fic file lst n sel txt)
 (vl-load-com)
 (and (ssget "x" (list (cons 0 "*TEXT") (cons 8 "TEXTE_INDICE")))
      (setq fic (getfiled "Veuillez choisir le fichier de destination" (getvar "dwgprefix") "txt" 1))
   (progn
     (vlax-map-collection (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))) '(lambda (x) (setq lst (cons (vla-get-textstring x) lst))))
     (vla-delete sel)
     (setq file (open fic "w")
    lst (vl-sort lst '<)
     )
     (mapcar '(lambda(x) (write-line x file)) lst)
     (close file)
     (princ (strcat "\nFichier " fic " créé."))
   )
 )
 (princ)
)

 

@+

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

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é