Lire et écrire des fichiers
AutoLISP ne se limite pas à manipuler le dessin AutoCAD. Il permet aussi de lire et écrire des fichiers texte, ce qui ouvre de nombreuses possibilités : exporter des données, générer des rapports, lire des fichiers de configuration, importer des coordonnées depuis un fichier CSV, etc.
Ouvrir un fichier avec open
La fonction open ouvre un fichier et retourne un descripteur de fichier que vous utiliserez pour lire ou écrire :
(setq fichier (open "C:/temp/mon-fichier.txt" "r"))
Le deuxième argument est le mode d'ouverture :
| Mode | Description |
|---|---|
"r" |
Lecture (read) — le fichier doit exister |
"w" |
Écriture (write) — crée le fichier ou écrase son contenu |
"a" |
Ajout (append) — crée le fichier ou ajoute à la fin |
Si le fichier ne peut pas être ouvert (par exemple, il n'existe pas en mode "r"), open retourne nil.
Rappel : dans les chemins de fichiers en AutoLISP, utilisez des barres obliques
/(et non des antislash\), ou doublez les antislash\\.
Écrire dans un fichier
write-line : écrire une ligne
(setq fichier (open "C:/temp/export.txt" "w"))
(write-line "Première ligne" fichier)
(write-line "Deuxième ligne" fichier)
(write-line "Troisième ligne" fichier)
(close fichier)
Chaque appel à write-line écrit une ligne suivie d'un retour à la ligne automatique. Le fichier résultant contiendra :
Première ligne
Deuxième ligne
Troisième ligne
princ et prin1 : écrire sans retour à la ligne
Si vous avez besoin de contrôler précisément le formatage, princ peut écrire dans un fichier sans ajouter de retour à la ligne :
(setq fichier (open "C:/temp/export.csv" "w"))
(princ "Nom;X;Y;Z" fichier)
(princ "\n" fichier) ; Retour à la ligne manuel
(princ "Point1;10.0;20.0;0.0" fichier)
(princ "\n" fichier)
(close fichier)
Ne jamais oublier close
La fonction close est indispensable. Si vous ne fermez pas le fichier :
- Les données en mémoire tampon risquent de ne pas être écrites sur le disque
- Le fichier reste verrouillé par AutoCAD et ne peut pas être ouvert par un autre programme
- Vous risquez de perdre des données
Bonne pratique : écrivez toujours
closeimmédiatement aprèsopen, puis ajoutez votre code entre les deux. Ainsi, vous ne risquez pas de l'oublier.
Lire un fichier
read-line : lire une ligne
read-line lit la prochaine ligne du fichier et retourne son contenu sous forme de chaîne. Quand il n'y a plus de lignes à lire, elle retourne nil :
(setq fichier (open "C:/temp/export.txt" "r"))
(read-line fichier) ; → "Première ligne"
(read-line fichier) ; → "Deuxième ligne"
(read-line fichier) ; → "Troisième ligne"
(read-line fichier) ; → nil (fin du fichier)
(close fichier)
Lire toutes les lignes d'un fichier
Le pattern classique pour lire un fichier complet :
(setq fichier (open "C:/temp/export.txt" "r"))
(setq ligne (read-line fichier))
(while ligne
(princ (strcat "\n" ligne)) ; Traiter la ligne
(setq ligne (read-line fichier))
)
(close fichier)
La boucle while continue tant que read-line retourne une chaîne (c'est-à-dire tant qu'on n'a pas atteint la fin du fichier).
Exemple pratique : exporter les coordonnées des points
Ce programme exporte les coordonnées de tous les points du dessin dans un fichier CSV :
(defun c:export-points (/ jeu index entite donnees point fichier compteur)
(setq jeu (ssget "_X" '((0 . "POINT")))) ; Sélectionner tous les points
(if jeu
(progn
(setq fichier (open "C:/temp/points.csv" "w"))
(write-line "X;Y;Z" fichier) ; En-tête
(setq index 0)
(setq compteur 0)
(repeat (sslength jeu)
(setq entite (ssname jeu index))
(setq donnees (entget entite))
(setq point (cdr (assoc 10 donnees)))
(write-line
(strcat
(rtos (nth 0 point) 2 4) ";"
(rtos (nth 1 point) 2 4) ";"
(rtos (nth 2 point) 2 4)
)
fichier
)
(setq index (1+ index))
(setq compteur (1+ compteur))
)
(close fichier)
(princ (strcat "\n" (itoa compteur) " point(s) exporté(s) dans C:/temp/points.csv"))
)
(princ "\nAucun point trouvé dans le dessin.")
)
(princ)
)
Exemple pratique : importer des points depuis un CSV
L'opération inverse — lire un fichier CSV et créer des points dans le dessin :
(defun c:import-points (/ fichier ligne position-separateur x y z compteur)
(setq fichier (open "C:/temp/points.csv" "r"))
(if fichier
(progn
(read-line fichier) ; Sauter l'en-tête
(setq ligne (read-line fichier))
(setq compteur 0)
(while ligne
;; Découper la ligne au séparateur ";"
(setq position-separateur (vl-string-search ";" ligne))
(setq x (atof (substr ligne 1 position-separateur)))
(setq ligne (substr ligne (+ position-separateur 2)))
(setq position-separateur (vl-string-search ";" ligne))
(setq y (atof (substr ligne 1 position-separateur)))
(setq z (atof (substr ligne (+ position-separateur 2))))
;; Créer le point
(entmake
(list
'(0 . "POINT")
(list 10 x y z)
)
)
(setq compteur (1+ compteur))
(setq ligne (read-line fichier))
)
(close fichier)
(princ (strcat "\n" (itoa compteur) " point(s) importé(s)."))
)
(princ "\nImpossible d'ouvrir le fichier.")
)
(princ)
)
Rechercher un fichier avec findfile
La fonction findfile recherche un fichier dans les chemins de support d'AutoCAD (ceux définis dans les Options, onglet Fichiers). Si le fichier est trouvé, elle retourne son chemin complet. Sinon, elle retourne nil :
(findfile "acad.pgp") ; → "C:\\Program Files\\Autodesk\\AutoCAD 2026\\Support\\acad.pgp"
(findfile "mon-fichier.lsp") ; → nil si le fichier n'est pas dans les chemins de support
C'est très utile pour localiser des fichiers de configuration ou des ressources associées à votre programme, sans avoir à coder un chemin absolu en dur :
(defun charger-configuration (/ chemin fichier ligne)
(setq chemin (findfile "mon-programme.cfg"))
(if chemin
(progn
(setq fichier (open chemin "r"))
(setq ligne (read-line fichier))
(while ligne
(princ (strcat "\nConfig : " ligne))
(setq ligne (read-line fichier))
)
(close fichier)
)
(princ "\nFichier de configuration introuvable.")
)
(princ)
)
findfile accepte aussi un chemin complet — dans ce cas, elle vérifie simplement que le fichier existe :
(if (findfile "C:/temp/donnees.csv")
(princ "\nLe fichier existe.")
(princ "\nLe fichier n'existe pas.")
)
Ajouter du contenu à un fichier existant
Le mode "a" (append) permet d'ajouter des lignes à la fin d'un fichier existant, sans écraser son contenu :
(setq fichier (open "C:/temp/journal.log" "a"))
(write-line (strcat (rtos (getvar "CDATE") 2 6) " - Opération terminée") fichier)
(close fichier)
C'est pratique pour tenir un journal d'activité ou accumuler des données au fil des exécutions.
Résumé
| Fonction | Rôle | Exemple |
|---|---|---|
open |
Ouvrir un fichier | (open "fichier.txt" "r") |
close |
Fermer un fichier | (close fichier) |
read-line |
Lire une ligne | (read-line fichier) |
write-line |
Écrire une ligne | (write-line "texte" fichier) |
princ |
Écrire sans retour à la ligne | (princ "texte" fichier) |
findfile |
Rechercher un fichier | (findfile "acad.pgp") |
| Mode | Description |
|---|---|
"r" |
Lecture |
"w" |
Écriture (écrase) |
"a" |
Ajout (à la fin) |
Dans le prochain chapitre, nous verrons comment gérer les erreurs avec *error* pour écrire des programmes robustes qui restaurent toujours leur état, même en cas d'interruption.
Besoin d'un développement AutoCAD (AutoLISP, ObjectARX, .NET, VBA) ? Contactez-moi pour un devis gratuit.