(gile) Posté(e) le 17 octobre 2013 Posté(e) le 17 octobre 2013 Salut, La lecture de ce sujet m'a donné l'idée d'un petit challenge : implémenter une fonction similaire à vl-filename-base. (vl-filename-base "toto.dwg") -> "toto"(vl-filename-base "toto") ->"toto"(vl-filename-base "toto.1.0.dwg") -> "toto.1.0"(vl-filename-base "totodwg.dwg") -> "totodwg" mais aussi avec un chemin complet : (vl-filename-base "C:\\Dir\\toto.dwg") -> "toto"(vl-filename-base "C:\\Dir\\toto") ->"toto"(vl-filename-base "C:\\Dir\\toto.1.0.dwg") -> "toto.1.0"(vl-filename-base "C:\\Dir\\totodwg.dwg") -> "totodwg"(vl-filename-base "C:\\Dir\\") -> "" Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
alala Posté(e) le 17 octobre 2013 Posté(e) le 17 octobre 2013 Bonjour, Le comportement décris est exactement celui rencontré sous ZWCAD.Ce serait différent sous AutoCad? :huh: C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
(gile) Posté(e) le 17 octobre 2013 Auteur Posté(e) le 17 octobre 2013 Salut, Le comportement décrit est bien celui d'AutoCAD et je me doute bien que celui de ZWCAD est identique (copier c'est faire pareil, non ?) Ce que je propose est une sorte d'exercice pour confronter différentes manières de coder.Il s'agit d'écrire une (ou plusieurs) routines qui auraient le même comportement que vl-filename-base. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
alala Posté(e) le 17 octobre 2013 Posté(e) le 17 octobre 2013 haaaaa ... j'avais mal compris, désolé! Je tenterais de faire quelque chose pour voir si j'en suis capable et si ça tiens la route! C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
alala Posté(e) le 18 octobre 2013 Posté(e) le 18 octobre 2013 Bonjour, Une version moche, mais qui fait le taf : (defun NomFichier ( Base / DebBase FinBase) (if (setq DebBase (vl-string-position (ascii "\\") (VL-STRING-TRANSLATE "/" "\\" Base) 0 T )) (setq DebBase (+ 2 DebBase)) (setq DebBase 1) ) (if (setq FinBase(vl-string-position (ascii ".") Base 0 T)) (if (> 1 (setq FinBase (- FinBase (1- DebBase)))) (setq FinBase nil) ) (setq FinBase nil) ) (substr Base DebBase FinBase) ) On reste sous Windows, mais on ne sait jamais alors j'ai estimé que l'on pouvais trouver des "." dans les nom de dossiers. C'est en forgeant que l'on devient forgerons.Et c'est en sciant que Léonard DeVinci!
Patrick_35 Posté(e) le 18 octobre 2013 Posté(e) le 18 octobre 2013 Salut Elle est très bien ta version alala. Simple et concise. Une autre version histoire de jouer avec une liste. (defun p35:vl-filename-base(str / lst) (setq lst (vl-string->list str)) (and (member 46 lst) (setq lst (reverse (cdr (member 46 (reverse lst))))) ) (while (member 92 lst) (setq lst (cdr (member 92 lst))) ) (vl-list->string lst) ) @+ 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 18 octobre 2013 Auteur Posté(e) le 18 octobre 2013 Salut, La même chose qu'alala (un peu plus concis) : (defun filename-base (filename / start) ((lambda (str) (substr str 1 (vl-string-position 46 str 0 T)) ) (substr filename (if (setq start (vl-string-position 92 filename 0 T)) (+ start 2) 1 ) ) ) ) L'équivalent en F# est encore plus concis : let filenameBase (filename: string) = filename.[ filename.LastIndexOf('\\') + 1 .. let i = filename.LastIndexOf('.') in (if i = -1 then filename.Length else i) - 1 ] et, dans la même veine que Patrick_35 mais plus comme un exercice de style qui devrait plaire aux amateurs de programmation fonctionnelle. (defun gile_filename-base (filename / loop) (defun loop (l a) (cond ((or (null l) (= (car l) 92)) a) ((= (car l) 46) (defun loop (l a) (cond ((or (null l) (= (car l) 92)) a) ((loop (cdr l) (cons (car l) a))) ) ) (loop (cdr l) nil) ) ((loop (cdr l) (cons (car l) a))) ) ) (vl-list->string (loop (reverse (vl-string->list filename)) nil)) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
VDH-Bruno Posté(e) le 18 octobre 2013 Posté(e) le 18 octobre 2013 (modifié) Bonsoir, Rapidement ma proposition par composition de fonctions AutoLisp standard.. (defun bv:filename-base (filename) ((lambda (a b ) (substr filename a (if b (1+ (- b a))))) (+ 2 (cond ((vl-string-position 92 filename nil T)) ((vl-string-position 47 filename nil T)) (-1) ) ) (vl-string-position 46 filename nil T) ) ) A+ EDIT : Je vois que (gile) et Patrick_35 ont fait l’impasse sur la syntaxe suivante "C:/Dir/toto.dwg" EDIT2 : Simplifié les (ascii "\\") (ascii "/") (ascii ".") par leurs codes correspondants 92, 47, 46, Modifié le 18 octobre 2013 par VDH-Bruno Apprendre => Prendre => Rendre
ElpanovEvgeniy Posté(e) le 23 octobre 2013 Posté(e) le 23 octobre 2013 SalutRien de nouveau. (defun test (s) (defun f (s a c) (if (wcmatch s (strcat "*" (chr a) "*")) (if c (substr s 1 (vl-string-position a s nil T)) (substr s (+ 2 (vl-string-position a s nil T))) ) s ) ) (f (f (f s 46 t) 92 nil) 47 nil)) Evgeniy
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