(gile) Posté(e) le 13 mai 2008 Partager Posté(e) le 13 mai 2008 Pour répondre à une demande sur un autre forum, j'ai écrit un LISP qui convertit un fichier de type de ligne (.lin) en système impérial. Je l'ai un peu amélioré pour pouvoir convertir aussi les fichiers de motifs de hachures (.pat). CONVFILE demande à l'utilisateur de choisir le fichier et vers quel système d'unités faire la conversion. ;; CONVFILE (gile) ;; Convertit un fichier (.pat ou .lin) en système métrique ou impérial (defun c:convfile (/ conv ext path to file lst) (defun conv (lst / val) (mapcar (function (lambda (x) (if (setq val (distof x)) (rtos ((if (= to "imp") / *) val 25.4) 2 5) x ) ) ) lst ) ) (if (and (setq ext (ChooseBox "Type de fichier" '(("lin" . "Type de ligne") ("pat" . "Motif de hachure")))) (setq path (getfiled "Choisir un fichier" "" ext 0)) (setq to (ChooseBox "Convertion" '(("imp" . "Impérial") ("met" . "Métrique")))) (setq file (open path "r")) ) (progn (setq zin (getvar 'dimzin)) (setvar 'dimzin 12) (while (setq line (read-line file)) (if (member (substr line 1 1) '(";" "*")) (setq lst (cons line lst)) (setq line (str2lst line ",") lst (if (= ext ".lin") (cons (lst2str (conv line) ",") lst) (cons (lst2str (cons (car line) (conv (cdr line))) ",") lst) ) ) ) ) (close file) (setq file (open path "w")) (foreach l (reverse lst) (write-line l file)) (close file) (setvar 'dimzin zin) ) (princ "\nFormat de fichier incorrect.") ) (princ) ) ;; str2lst (gile) ;; Transforme un chaine avec séparateur en liste de chaines ;; ;; Arguments ;; str : la chaine à transformer en liste ;; sep : le séparateur ;; ;; Exemples ;; (str2lst "a b c" " ") -> ("a" "b" "c") ;; (str2lst "1,2,3" ",") -> ("1" "2" "3") ;; (mapcar 'read (str2lst "1,2,3" ",")) -> (1 2 3) (defun str2lst (str sep / pos) (if (setq pos (vl-string-search sep str)) (cons (substr str 1 pos) (str2lst (substr str (+ (strlen sep) pos 1)) sep) ) (list str) ) ) ;; lst2str (gile) ;; Concatène une liste et un séparateur en une chaine ;; ;; Arguments ;; lst : la liste à transformer en chaine ;; sep : le séparateur ;; ;; Exemples ;; (lst2str '(1 2 3) ",") -> "1,2,3" ;; (lst2str '("a" "b" "c") " ") -> "a b c" (defun lst2str (lst sep) (if (cadr lst) (strcat (vl-princ-to-string (car lst)) sep (lst2str (cdr lst) sep) ) (vl-princ-to-string (car lst)) ) ) ;; ChooseBox (gile) ;; Boite de dialogue permettant de choisir une option ;; ;; Arguments ;; title : le titre de la boite de dialogue (chaîne) ;; keylab : une liste d'association du type ((key1 . label1) (key2 . label2) ...) ;; ;; Retour : la clé de l'option choisie (chaîne) ;; ;; Exemple d'utilisation ;; (choosebox "Type de fichier" '(("lin" . "Type de ligne") ("pat" . "Motif de hachure"))) (defun ChooseBox (title keylab / tmp file dcl_id choice) (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) (write-line (strcat "ChooseBox:dialog{label=\"" title "\";:radio_column{key=\"choice\";" ) file ) (mapcar (function (lambda (p) (write-line (strcat ":radio_button{key=\"" (car p) "\";label=\"" (cdr p) "\";}" ) file ) ) ) keylab ) (write-line "}spacer;ok_cancel;}" file) (close file) (setq dcl_id (load_dialog tmp)) (if (not (new_dialog "ChooseBox" dcl_id)) (exit) ) (set_tile "choice" (caar keylab)) (action_tile "accept" "(setq choice (get_tile \"choice\")) (done_dialog)" ) (start_dialog) (unload_dialog dcl_id) (vl-file-delete tmp) choice ) [Edité le 18/5/2008 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
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