Aller au contenu

Comment lire un fichier de "paire pointée" ?


Messages recommandés

Posté(e)

Salut à la communauté...

 

Voilà, j'ai un LiSP qui fusionne des calques depuis une suite de "paires pointés", Comme ça :

  (setq LstCalq '(("1COMM" . "CAD_LIM_COMMUN") ; Amorces des limites communales
                 ("1DEPART" . "CAD_LIM_DEPART") ; Amorces des limites départementales
                 ("1ETAT" . "CAD_LIM_ETAT") ; Amorces des limites étatiques
                 ("1LIEUDIT" . "CAD_LIM_LIEUDIT") ; Périmètre du lieut-dit
                 ("1PARCELLE" . "CAD_LIM_PARC") ; Périmètre de la parcelle figurée au plan
                 .........
                 .........
                 ("3TUNNELTEX" . "CAD_DIVERS_TEXT") ; Nom du tunnel
                 ("3ZONCOMMTEX" . "CAD_DIVERS_TEXT") ;Nom de la voie du DP routier
                )
 ) ;_ Fin de setq

 

que j'utilise comme suit :

  (foreach PosLst LstCalq
   (if (tblsearch "layer" (car PosLst))
     (progn (if (not (tblsearch "layer" (cdr (assoc (car PosLst) LstCalq))))
              (command "-calque" "n" (cdr (assoc (car PosLst) LstCalq)) "")
            ) ;_ Fin de if
            (command "fuscalques" "n" (car PosLst) "" "n" (cdr (assoc (car PosLst) LstCalq)) "o") ;_ Fin de command
     ) ;_ Fin de progn
   ) ;_ Fin de if
 ) ;_ Fin de foreach

 

Maintenant, j'ai plusieurs "configurations" de paires pointés. Plustôt que de faire plusieurs LiSP pour chaque liste, j'aimerai faire autant de fichiers type texte (comme un .lst par exemple) pour y placer les différentes paires...

 

J'aimerais faire, en fait, un fichier "Cadastre.lst", un "Primagaz.lst", un "Carto200.lst"...

 

Si quelqu'un a un conseil ou une astuce... Je suis preneur...

 

J'ai déjà lu l'excellent "Introduction _a_AutoLISP.pdf" du grand (gile), mais je n'arrive à rien...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bonjour,

 

je pense que tu t'en tireras avec la fonction read.

 

Dans un premier temps, tu fais un fichier texte sauvegardé dans un répertoire où Autocad recherche les fichiers de support. Il contiendra la liste des paires pointées.

Je pense que le plus simple est de mettre une paire par ligne.

("1COMM" . "CAD_LIM_COMMUN")

("1DEPART" . "CAD_LIM_DEPART")

("1ETAT" . "CAD_LIM_ETAT")

("1LIEUDIT" . "CAD_LIM_LIEUDIT")

("1PARCELLE" . "CAD_LIM_PARC")

 

Ensuite dans le lisp, tu ouvres le fichier avec la commande open. Findfile n'a pas besoin de chemin si le fichier est dans un répertoire inclus dans la liste des chemins de recherche de fichiers de support.

 

(setq FCALQUE (findfile "cadastre.lst"))

(setq F (open FCALQUE "r"))

 

puis tu fais un read-line de chaque ligne et tu mets ça bout à bout. Ce sera du texte, puisque cela provient d'un fichier de ce type.

 

(setq L "")

(while (setq LIGNE (read-line F))

(setq L (strcat L LIGNE))

)

 

puis tu refermes le fichier.

 

(close F)

 

A ce moment, tu disposes de la variable L qui contient la liste de paires pointées, mais sous forme texte. Il suffit d'utiliser la fonction read, puisque (read "(a b c)")->(A B C), pour transformer ce texte en liste :

(read (strcat "(" L ")"))

 

Ensuite on pourra éventuellement s'intéresser à rajouter un contrôle dans le while qui permettrait de supprimer des commentaires après des ; (vl-string-position ...) et (substr ...)

 

ou de demander à l'utilisateur de choisir le fichier qu'il veut ouvrir (getfiled...).

 

Je n'ai pas les moyens de vérifier si ce que j'écris fonctionne : je n'ai pas d'autocad sur le pc que j'utilise à l'instant. Mais cela peut déjà être une piste de recherche.

 

Amicalement

Vincent

 

PS : si cela t'a aidé, tu pourras dire que je suis grand. Même si cela ne t'as pas aidé, tu pourras le dire aussi, cela ne sera pas faux du haut de mes 2m :)

Mais l'adjectif "grand" en français est l'un des rares pour lequel la position par rapport au nom qu'il qualifie est significative. En effet, un homme grand n'est pas forcément un grand homme... contrairement à bonnet blanc et blanc bonnet :D

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Bonsoir Denish,

 

Je me suis lancé, j'ai essayé et apparement chez moi tout marche bien.

 

J'ai créé un fichier texte (.txt) :

AncienCalque1

NouveauCalque1

AncienCalque2

NouveauCalque2

... etc

 

Pour ce qui est du code, je me suis permis de traduire tes commandes en langage international (comme je travaille avec AutoCAD en anglais, certaines choses ne passaient pas).

 

(setq calqFile (open (getfiled "Open txt file" "txt" "*" 0) "r"))
(while (setq line (read-line calqFile))
 (setq temp (cons line temp))
)
(close file)

(setq ind 0
     temp (reverse temp)
     calqList nil
)

(while (< ind (length temp))
 (setq calqList (cons (nth ind temp) (nth (1+ ind) temp)))
   (if (tblsearch "LAYER" (car calqList))
     (progn (if (not (tblsearch "LAYER" (cdr calqList)))
              (command "_-LAYER" "N" (cdr calqList) "")
            )
            (command "_-LAYMRG" "_N" (car calqList) "" "_N" (cdr calqList) "_Y")
     )
   )
 (setq ind (1+ (1+ ind)))
)

 

Il y a sûrement mieux mais j'espère que ça peut t'aider.

 

EDIT : Désolé je viens de me rendre compte que j'ai changé ta variable "LstCalq" par "calqList".

 

Cordialement,

GJulien

Posté(e)

Salut à tous,

 

Et merci beaucoup à vous deux...

 

Zebulon : un "grand" merci pour ta proposition de code, je ne pensais pas à écrire directement mon fichier .lst en paire pointée... Et je ne connaissais pas (read, intéressant...

 

GJulien : pas de problème pour le nom de la liste, je corrigerais...

 

Je vais essayé tout ça cet après-midi, si j'en ai le temps... Si non, ce sera demain...

 

Merci encore à tous...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bon, j'ai tenté ça :

(setq FichierLu (open (getfiled "Open txt file" "txt" "*" 0) "r"))
 (princ (strcat "FichierLu =" FichierLu))

 

Mais AutoCAD me réponds ça :

Commande: CONVERTCALQUE ; erreur: type d'argument incorrect: stringp #<file "C:\\Cadastre.lst">

Et bien entendu, je ne sais pas quoi faire avec ça...

 

Denis...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Posté(e)

Bonsoir,

 

La réponse s'explique par le fait que tu tentes d'utiliser une fonction qui permet d'écrire du texte (princ) avec la variable FichierLu qui n'est pas de type texte, mais de type fichier.

 

C'est la fonction (getfiled) qui renvoie du texte ou nil, pas la fonction (open) qui, elle, renvoie un "descripteur" de fichier qui n'est utilisable que par les autres fonctions d'entrée/sortie comme (close ...) (read-line ...)

 

Par conséquent, si tu veux afficher le nom du fichier choisi par l'utilisateur, il faut récupérer la variable à la sortie de (getfiled ) et faire un princ puis un open de cette variable... si elle n'est pas nil.

 

Pour read, voir ce fil qui explique un peu comme il est facile de transformer du texte en liste.

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)
je ne pensais pas à écrire directement mon fichier .lst en paire pointée...

 

pourquoi pas, après tout ?

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

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é