bonuscad Posté(e) le 3 août 2016 Posté(e) le 3 août 2016 Bonjour, Je vais partager une routine lisp que j'ai conçue pour l'import de points à partir d'un fichier CSV.Je poste ici, car c'est plutôt destiné à Autocad Map, peut être que ça peut fonctionner sous une version classique... (pas testé) Celle ci permet de générer les points géolocalisés avec:- Soit constitution automatique des Données d'objet pour les points- Soit écritures automatique de données sous formes de texte.- Soit les deux formes (Textes et OD)- Soit Aucun; juste les points... Je vous joins un fichier CSV tiré depuis Data.gouv.fr pour tester la routine et voir ainsi la structure souhaitée du fichier CSV.Pour un bon import il est souhaitable d'avoir une première ligne d'intitulé et au minimum les données X et Y en nombres réels. L'agencement de l'ordre des colonnes de données dans le fichier CSV n'a pas d'importance, il suffit de répondre correctement au question posées par la routine (Caractère, Entier, Réel , X, Y) Voilà, si ça peut faire le bonheur d'utilisateurs! Le code (defun translate_str (word / nw_str) (foreach el (mapcar '(lambda (str) (vl-string->list str)) word) (setq nw_str (cons (subst 95 32 el) nw_str))) (reverse (mapcar '(lambda (str) (vl-list->string str)) nw_str)) ) (defun c:readCSV ( / input f_open key l_read make_value flag lay_nam ht_txt n i l_od table_def x_data y_data new_pt data_str name_lay e_last field_od typ_od od_data ) (setq input (getfiled "Sélectionner un fichier CSV" "" "csv" 2) f_open (open input "r") key nil ) (while (setq l_read (read-line f_open)) (if (not key) (progn (if (not (tblsearch "LAYER" (vl-filename-base input))) (entmake (list (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 (vl-filename-base input)) (cons 70 0) (cons 62 1) (cons 370 -3) (cons 6 "Continuous") ) ) ) (print l_read) (initget "Oui Non") (if (eq (getkword "\nConstituer intitulé de calques ou OD avec la 1ère ligne? [Oui/Non] <N>: ") "Oui") (progn (initget "OD Texte Deux Aucun") (setq make_value (getkword "\nInscrire les valeurs en tant que [OD/Texte/Deux/Aucun]? <Deux>: ") flag T) (if (not make_value) (setq make_value "Deux")) (while (/= (substr l_read 1 (vl-string-position 59 l_read)) "") (setq lay_nam (cons (substr l_read 1 (vl-string-position 59 l_read)) lay_nam)) (if (not (tblsearch "LAYER" (substr l_read 1 (vl-string-position 59 l_read)))) (if (or (eq make_value "Deux") (eq make_value "Texte")) (entmake (list (cons 0 "LAYER") (cons 100 "AcDbSymbolTableRecord") (cons 100 "AcDbLayerTableRecord") (cons 2 (substr l_read 1 (vl-string-position 59 l_read))) (cons 70 0) (cons 62 7) (cons 370 -3) (cons 6 "Continuous") ) ) ) ) (if (vl-string-position 59 l_read) (setq l_read (substr l_read (+ 2 (vl-string-position 59 l_read)))) (setq l_read "") ) ) (setq l_read (read-line f_open) ht_txt (getdist (getvar "VIEWCTR") (strcat "\nHauteur du texte <" (rtos (getvar "TEXTSIZE") 2) ">")) lay_nam (reverse lay_nam) ) (if ht_txt (setvar "TEXTSIZE" ht_txt)) ) (setq flag nil) ) ) ) (setq n 0 i 0) (while (vl-string-position 59 l_read) (if (not (zerop n)) (setq l_read (substr l_read (+ 2 (vl-string-position 59 l_read))))) (set (read (strcat "data_" (itoa (setq n (1+ n))))) (substr l_read 1 (vl-string-position 59 l_read))) ) (if (not key) (progn (repeat n (princ (strcat "\"" (strcat "data_" (itoa (setq i (1+ i))) " = " (eval (read (strcat "data_" (itoa i))))))) (initget 1 "Entier Reel Chaine") (setq key (getkword "\nLa donnée est un [Entier/Reel/Chaine]?: ")) (cond ((eq key "Entier") (set (read (strcat "typ_" (itoa i))) (cons 'INT 0)) (setq l_od (cons "Integer" l_od)) ) ((eq key "Reel") (initget "X Y Autre") (setq key (getkword "\nValeur de la donnée [X/Y/Autre]? <Autre>: ")) (cond ((eq key "X") (set (read (strcat "typ_" (itoa i))) (cons 'REAL 1))) ((eq key "Y") (set (read (strcat "typ_" (itoa i))) (cons 'REAL 2))) (T (set (read (strcat "typ_" (itoa i))) (cons 'REAL 0))) ) (setq l_od (cons "Real" l_od)) ) ((eq key "Chaine") (set (read (strcat "typ_" (itoa i))) (cons 'STR 0)) (setq l_od (cons "Character" l_od)) ) ) ) (setq l_od (reverse l_od) table_def (car (translate_str (list (vl-filename-base input)))) ) (if (and flag (not (member table_def (ade_odtablelist)))) (ade_oddefinetab (list (cons "Tablename" table_def) '("TableDesc" . "") (append '("Columns") (mapcar '(lambda (x y) (list (cons "ColName" x) '("ColDesc" . "") (cons "ColType" y) (cond ((eq y "Character") (cons "DefaultVal" "")) ((eq y "Integer") (cons "DefaultVal" 0)) ((eq y "Real") (cons "DefaultVal" 0.0)) ) ) ) (translate_str lay_nam) l_od ) ) ) ) ) ) ) (setq i 0) (repeat n (cond ((eq (car (eval (read (strcat "typ_" (itoa (setq i (1+ i))))))) 'REAL) (cond ((eq (cdr (eval (read (strcat "typ_" (itoa i))))) 1) (setq x_data (atof (eval (read (strcat "data_" (itoa i)))))) ) ((eq (cdr (eval (read (strcat "typ_" (itoa i))))) 2) (setq y_data (atof (eval (read (strcat "data_" (itoa i)))))) ) ) ) ) ) (cond ((and x_data y_data) (setq new_pt (list x_data y_data) i 0 name_lay lay_nam) (entmake (list '(0 . "POINT") '(100 . "AcDbEntity") (cons 8 (vl-filename-base input)) (cons 10 new_pt) '(210 0.0 0.0 1.0) '(50 . 0.0) ) ) (setq e_last (entlast) field_od (translate_str lay_nam) typ_od l_od) (repeat n (setq data_str (eval (read (strcat "data_" (itoa (setq i (1+ i))))))) (if data_str (progn (setq od_data (cond ((eq (car typ_od) "Character") data_str) ((eq (car typ_od) "Integer") (atoi (if (eq data_str "") "0" data_str))) ((eq (car typ_od) "Real") (atof (if (eq data_str "") "0.0" data_str))) ) ) (if (and flag (or (eq make_value "Deux") (eq make_value "OD"))) (progn (ade_odaddrecord e_last table_def) (ade_odsetfield e_last table_def (car field_od) 0 od_data ) ) ) (if (or (eq make_value "Deux") (eq make_value "Texte")) (progn (entmake (list '(0 . "TEXT") '(100 . "AcDbEntity") (cons 8 (car name_lay)) (cons 10 new_pt) (cons 40 (getvar "TEXTSIZE")) (cons 1 data_str) '(50 . 0.0) '(41 . 1.0) '(51 . 0.0) '(7 . "Standard") '(71 . 0) '(72 . 0) '(11 0.0 0.0 0.0) '(210 0.0 0.0 1.0) '(100 . "AcDbText") '(73 . 0) ) ) ) ) (setq new_pt (polar new_pt (* 1.5 pi) (* 1.5 (getvar "TEXTSIZE"))) name_lay (cdr name_lay) typ_od (cdr typ_od) field_od (cdr field_od) ) ) (setq name_lay (cdr name_lay) typ_od (cdr typ_od) field_od (cdr field_od) ) ) ) ) ) ) (close f_open) (setq i 0) (repeat n (set (read (strcat "typ_" (itoa (setq i (1+ i))))) nil) (set (read (strcat "data_" (itoa i))) nil) ) (prin1) ) Supports_Cartoradio.zip Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
je56 Posté(e) le 3 août 2016 Posté(e) le 3 août 2016 Merci Bruno, Pour ceux qui n'ont pas toujours covadis sous la main, ça va tirer une belle épine du pied. Eric
bonuscad Posté(e) le 10 août 2016 Auteur Posté(e) le 10 août 2016 Pour ceux qui n'ont pas toujours covadis sous la main, ça va tirer une belle épine du pied.Je pense qu'il y a mieux pour faire des imports de points même sans Covadis. L’intérêt ici est surtout pour MAP.Voici par exemple un autre exemple tiré de data.gouv.fr, il concerne les bornes de rechargement pour les véhicules électriques sur la France entière.Je vous cache pas que j'ai eu besoin de retoucher le CSV téléchargé:*convertir le séparateur de "," à ,";" (ils ont la bonne idée d'utiliser la virgule dans leur cellules)*supprimer les retour de ligne présent dans certaines cellules...*supprimer la colonne sans intitulé (ou alors rajouter un intitulé) Le résultat sera dans un système de projection "WGS84", système à attribuer au dessin si l'on veut le reprojeter dans un autre système. Voici l'extrait de l'import complet (notez bien que la latitude est le Y et la longitude le X) avec le fichier joint pour obtenir les textes et les Données d'Objets.Commande: READCSV "ID_station;nom_station;adresse_station;latitude;longitude;nom_porteur;type_charge;nbre_pdc;type_connecteur;date_maj;observations;source"Constituer intitulé de calques ou OD avec la 1ère ligne? [Oui/Non] <N>: O Inscrire les valeurs en tant que [OD/Texte/Deux/Aucun]? <Deux>: Hauteur du texte <0.2000>.001"data_1 = FR*SEO*PAB79005P0027ALa donnée est un [Entier/Reel/Chaine]?: C"data_2 = Réseau Alterbase - Airvault - Pl du CygneLa donnée est un [Entier/Reel/Chaine]?: C"data_3 = Place du Cygne - 79600 AIRVAULTLa donnée est un [Entier/Reel/Chaine]?: C"data_4 = 46.825164La donnée est un [Entier/Reel/Chaine]?: R Valeur de la donnée [X/Y/Autre]? <Autre>: Y"data_5 = -0.142448La donnée est un [Entier/Reel/Chaine]?: R Valeur de la donnée [X/Y/Autre]? <Autre>: X"data_6 = SEOLISLa donnée est un [Entier/Reel/Chaine]?: C"data_7 = accéléréeLa donnée est un [Entier/Reel/Chaine]?: C"data_8 = 2La donnée est un [Entier/Reel/Chaine]?: E"data_9 = T E/F-T2-T3La donnée est un [Entier/Reel/Chaine]?: C"data_10 = 2015-05-10T00:00:00ZLa donnée est un [Entier/Reel/Chaine]?: C"data_11 = www.alterbase.frLa donnée est un [Entier/Reel/Chaine]?: C"data_12 = AlterbaseLa donnée est un [Entier/Reel/Chaine]?: C NB:Autocad peut afficher qu'il ne répons pas, mais laissez faire (Ne tuez pas la tâche), pour moi une trentaine de secondes ont suffit pour faire l'import et qu'Autocad reprenne la main normalement.IRVE-201605.zip Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
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