Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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!

Posté(e)

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

Posté(e)

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!

Posté(e)

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!

Posté(e)

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

 

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

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

EDIT2 : Simplifié les (ascii "\\") (ascii "/") (ascii ".") par leurs codes correspondants 92, 47, 46,

Modifié par VDH-Bruno

Apprendre => Prendre => Rendre

Posté(e)

Salut

Rien de nouveau. smile.gif

(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

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é