Aller au contenu

Lecture d\'une liste externe


Maximilien

Messages recommandés

Pour la gestion AutoCAD nous avons parfois besoin d'utiliser des listes. Or afin déviter d'encombrer la pile de multitude de liste je propose cette petie routine qui lit les fichiers de type CSV.

Cette routine retroune une [surligneur] liste[/surligneur].

Celle -ci se décompose ainsi:

-à chaque ligne il y a une [surligneur] liste[/surligneur]

chaque [surligneur] atome[/surligneur] de cette est séparé par des ";"

SI cet atome commence par "[" et fini par "]" séparé par ":" cet atome sera une [surligneur] paire pointée[/surligneur]

 

Cette routine ne fonctionne pas pour un atome = "" ni = nil (sauf s'il sont en dernière position)

 

Attention aussi les atomes de type (cons 10 (list 0.0 0.0 0.0)) ne sont pas reconnu non plus!

 

 (defun Lit_BIBLIOTHEQUE	(ARG_CHEMIN	 ARG_FILENAME
		 /		 PRIVE_LIGNE
		 PRIVE_LISTE1	 PRIVE_LISTE2
		 PRIVE_FILE	 PRIVE_BOUCLE
		 PRIVE_ELEMENT	 PRIVE_P1
		 PRIVE_P2
		)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Fonction qui lit le fichier bibliothèque Nommé                     ;;;
;;;                                                                    ;;;
;;; Argument : Chemin où trouver la bibliothèque                       ;;;
;;;            Nom du fichier de la bibliothèque (sans extension)      ;;;
;;;                                                                    ;;;
;;; Retourne : une liste de constantes pour l'utilisation de fonctions ;;;
;;;             du type liste des Style de texte avec toutes les       ;;;
;;;             variables                                              ;;;
;;;                                                                    ;;;
;;; Sémantique : Création à partir d'un fichier Excel type "CSV"       ;;;
;;;  les commentaire commence par "\\\" (la fonction ne lit pas la     ;;;
;;;  suite de la ligne)                                                ;;;
;;;  Chaque ligne est considérée comme une sous-liste. à l'intérieur   ;;;
;;;  de celle-ci chaque élément est séparé par ";"                     ;;;
;;;  Si un élément se présente sous forme :                            ;;;
;;;  [....:....] il sera pris en compte comme paire pointée            ;;;
;;;                                                                    ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Verification de la validité des arguments
;;;
 (if (= ARG_CHEMIN nil)
   (setq ARG_CHEMIN ".\\AUTOCAD\\BE.MNU\\BIB.AUTOCAD\\")
 )
 (if (= ARG_FILENAME nil)
   (setq ARG_FILENAME "RADIATEURS.CSV")
 )
 (setq ARG_CHEMIN (strcase ARG_CHEMIN))
 (setq ARG_FILENAME (strcase ARG_FILENAME))
 (if (vl-filename-extension ARG_FILENAME)
   (setq ARG_FILENAME (vl-string-subst "" (vl-filename-extension ARG_FILENAME) ARG_FILENAME))
 )
 (if (= (findfile (strcat ARG_CHEMIN ARG_FILENAME ".CSV")) nil)
   (progn
     (alert "Fichier Bibliothèque non trouvé")
     (exit)
   )
 )
;;;
;;; Exécution de la fonction
;;;
 ;; Ouverture de la bibliothèque
 (setq	PRIVE_FILE
 (open (findfile
	 (strcat ARG_CHEMIN
		 ARG_FILENAME
		 ".CSV"
	 )
       )
       "r"
 )
 )
 (setq PRIVE_LISTE1 nil)
 ;; Lecture de la première ligne du fichier
 (setq PRIVE_LIGNE (read-line PRIVE_FILE))
 ;; Parcours du fichier
 (while PRIVE_LIGNE 
   (progn
     ;; Enlève les point-virgules finaux
     (setq PRIVE_LIGNE (vl-string-right-trim ";" PRIVE_LIGNE))
     (setq PRIVE_LISTE2 nil)
     ;; Traite la ligne si elle n'est pas un "commentaire"
     (if (/= (vl-string-elt PRIVE_LIGNE 0) (ascii "\\"))
(while (or (/= PRIVE_LIGNE "") (> (strlen PRIVE_LIGNE) 0))
  (progn
    (setq PRIVE_BOUCLE 0)
    ;; détermine l'élément
    (setq PRIVE_BOUCLE
	   (vl-string-position (ascii ";") PRIVE_LIGNE)
    )
    (if	(= PRIVE_BOUCLE nil)
      (setq PRIVE_BOUCLE (strlen PRIVE_LIGNE))
    )
    ;; si l'élément est entier, réel ou chaine de caratères
    (if	(distof (substr PRIVE_LIGNE 1 PRIVE_BOUCLE) 2)
      (if (= (distof (substr PRIVE_LIGNE 1 PRIVE_BOUCLE) 2)
	     (atoi (substr PRIVE_LIGNE 1 PRIVE_BOUCLE))
	  )
	(setq PRIVE_ELEMENT
	       (atoi (substr PRIVE_LIGNE 1 PRIVE_BOUCLE)
	       )
	)
	(setq PRIVE_ELEMENT
	       (distof (substr PRIVE_LIGNE 1 PRIVE_BOUCLE) 2)
	)
      )
      (setq PRIVE_ELEMENT (substr PRIVE_LIGNE 1 PRIVE_BOUCLE))
    )
    ;; Pour le cas des paire pointée [...:...]
    (if
      (and
	(= (type PRIVE_ELEMENT) 'STR)
	(= (vl-string-elt PRIVE_ELEMENT 0) (ascii "["))
	(= (vl-string-elt PRIVE_ELEMENT (1- (strlen PRIVE_ELEMENT)))
	   (ascii "]")
	)
      )
       (progn
	 (setq PRIVE_P1	(substr	PRIVE_ELEMENT
				2
				(1- (vl-string-position
				      (ascii ":")
				      PRIVE_ELEMENT
				    )
				)
			)
	 )
	 (setq PRIVE_P2	(substr (vl-string-subst "" (strcat "[" PRIVE_P1 ":") PRIVE_ELEMENT)
				1
				(1- (strlen (vl-string-subst "" (strcat "[" PRIVE_P1 ":") PRIVE_ELEMENT)))))
	 ;; Paire pointée entier, réel ou chaine de caractères
	 ;; Pour le pointeur
	 (if (= (distof PRIVE_P1 2) (atoi PRIVE_P1))
	   (setq PRIVE_P1 (atoi PRIVE_P1))
	   (if (distof PRIVE_P1 2)
	     (setq PRIVE_P1 (distof PRIVE_P1 2))
	   )
	 )
	 ;; Pour la valeur
	 (if (= (distof PRIVE_P2 2) (atoi PRIVE_P2))
	   (setq PRIVE_P2 (atoi PRIVE_P2))
	   (if (distof PRIVE_P2 2)
	     (setq PRIVE_P2 (distof PRIVE_P2 2))
	   )
	 )
	 ;;Assigne la paire pointée
	 (setq PRIVE_ELEMENT (cons PRIVE_P1 PRIVE_P2))
       )
    )
    ;; Ajoute l'élément à la sous-liste
    (if	PRIVE_LISTE2
      (setq PRIVE_LISTE2
	     (append
	       PRIVE_LISTE2
	       (list PRIVE_ELEMENT)
	     )
      )
      (setq PRIVE_LISTE2
	     (list PRIVE_ELEMENT)
      )
    )
    ;; Retire de la ligne lue, l'élément
    (setq PRIVE_LIGNE
	   (substr PRIVE_LIGNE
		   (+ PRIVE_BOUCLE 2)
		   (strlen PRIVE_LIGNE)
	   )
    )
  )
)
     )
     ;; suivant la taille de la sous-liste ajoute celle-ci à la liste prinicipale
     (if (= (length PRIVE_LISTE2) 1)
(setq PRIVE_LISTE2 (nth 0 PRIVE_LISTE2))
     )
     (if PRIVE_LISTE2
(if PRIVE_LISTE1
  (setq	PRIVE_LISTE1
	 (append
	   PRIVE_LISTE1
	   (list PRIVE_LISTE2
	   )
	 )
  )
  (setq	PRIVE_LISTE1
	 (list PRIVE_LISTE2)
  )
)
     )
     ;; ligne suivante
     (setq PRIVE_LIGNE (read-line PRIVE_FILE))
   )
 )
 ;; retourne à la fonction la liste ainsi créée
 PRIVE_LISTE1
)
;;; ------------------------------------------------------------------------------

 

Exemple d'un fichier en cours de création Radiateurs.CSV

 \\\;;;;
\\\RADIATEURS;;;;
\\\;;;;
\\\(0:Modèle);(1:Command_ACAD);(Po_Lg(ou Nbéléments):Longueur);(Po_Ep:Epaisseur);(Po_Ht:Hauteur)
(0:Reggane_3000);(1:#_RECTANGLE);(9:0.5);(10S:0.072);(600:0.6)
(0:Chappee);;;;
(0:Lamella);;;;
(0:Acova);;;;
(0:Zendher);;;;
(0:Jaga);;;;
(0:Lydis);;;;
(0:CHORUS);;;;

 

Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier

Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To

AutoCAD, Revit, GstarCAD, Fisa-CAD, Microsoft Office

 

PlaquetteDeplianteMars2024.pdf

Lien vers le commentaire
Partager sur d’autres sites

Salut

Il pourrait être intérressant dans ton lisp d'avoir qu'un seul argument à saisir du type ARG_CHEMIN+ARG_FILENAME au lieu de deux et aussi d'y intégrer la possibilité d'avoir un getfiled (par le biais d'un "~" par exemple)

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

 (getfiled
"Bibliotheque Liste" 
(vl-filename-directory 
(findfile "./autocad/be.mnu/bib.autocad/Standard.csv" )
)
"CSV"
8)
;Attention il faut que Standard.csv existe et 
;que le dossier parent "./autocad/be.mnu/bib.autocad/" soit 
;présent dans le (getenv "ACAD")

 

zut alors et moi qui commençait par chercher un moyen de le faire avec un DCL

 

Patrick_35 tu viens de me sortir une épine du pied.

merci Patrick_35

Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier

Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To

AutoCAD, Revit, GstarCAD, Fisa-CAD, Microsoft Office

 

PlaquetteDeplianteMars2024.pdf

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é