(gile) Posté(e) le 15 octobre 2007 Posté(e) le 15 octobre 2007 Au départ, listd = nilUn (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
lovecraft Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 Ok merci de tous vos commentaires cela va me permettrev d'evoluer,Donc je regarde ce midi afin de vous proposer un nouveau code dans la soirée.@plus http://www.youtube.com/user/CADMINATOR?feature=mhee
lovecraft Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 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 http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 Salut, Regarde les fonctions acad_strlsort ou vl-sort Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lovecraft Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 comment dire; (vl-sort listd ' je pensais pas que c'était aussi simple Merci http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 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
Patrick_35 Posté(e) le 16 octobre 2007 Posté(e) le 16 octobre 2007 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
lovecraft Posté(e) le 16 octobre 2007 Auteur Posté(e) le 16 octobre 2007 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 http://www.youtube.com/user/CADMINATOR?feature=mhee
Patrick_35 Posté(e) le 17 octobre 2007 Posté(e) le 17 octobre 2007 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 bonC'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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
lovecraft Posté(e) le 17 octobre 2007 Auteur Posté(e) le 17 octobre 2007 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 http://www.youtube.com/user/CADMINATOR?feature=mhee
lili2006 Posté(e) le 17 octobre 2007 Posté(e) le 17 octobre 2007 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/
(gile) Posté(e) le 17 octobre 2007 Posté(e) le 17 octobre 2007 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
lovecraft Posté(e) le 17 octobre 2007 Auteur Posté(e) le 17 octobre 2007 Voila j'ai essayer autre chose pour le jeu de selectionj'ai remplacé (0 . "*TEXT") je l'ai remplacer par(100 . "AcDbText") =====> pour le jeu de selection me selectionne ton les objets du calque ? (setq ss (ssget "_X" '( [surligneur] (0 . "*TEXT")[/surligneur] (8 . "TEXTE_INDICE")))) Merci http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 17 octobre 2007 Posté(e) le 17 octobre 2007 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
Patrick_35 Posté(e) le 17 octobre 2007 Posté(e) le 17 octobre 2007 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
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