BIM G CO Posté(e) le 15 février 2005 Posté(e) le 15 février 2005 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 GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
Patrick_35 Posté(e) le 15 février 2005 Posté(e) le 15 février 2005 SalutIl 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
BIM G CO Posté(e) le 15 février 2005 Auteur Posté(e) le 15 février 2005 (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 GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
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