Aller au contenu

Convertir un fichier .pat ou .lin


(gile)

Messages recommandés

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

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é