Aller au contenu

Lecture/Écriture d'un fichier INI


DenisHen

Messages recommandés

Bonjour à tous.

 

Pour les besoins d'une suite de lisp, j'aimerais faire des fichiers type .ini avec lecture et écriture de paramètres.

 

Mais voilà, je n'ai pas beaucoup de solutions à ma portée, je sais créer le fichier, je sais le consulter, mais je ne sais pas comment modifier juste une variable, mon .ini est formaté comme ça :

;;Style de texte des cotations périmétriques

LotiCoteLotPerim=LotiCoteLotPerim

;;Taille de texte pour les cotes périmétriques (en mm papier)

LotiCoteLotPerimHaut=2.5

....

....

Je cherche donc à modifier qu'une seule ligne.

 

Je pense qu'il faille lire tout le fichier (open fichier "r"), placer toutes les ligne dans une liste, changer la variable souhaitée et réécrire le fichier entier (open fichier "w").

 

Mais ça me semble un peut lourd à utiliser.

 

Peut-être laisser l'utilisateur faire ce changement "à la main" dans le fichier .ini, mais je ne suis pas pour cette solution. S'il fait une c*******, tout est fichu...

 

Si quelqu'un a une astuce, un conseil... je suis preneur...

Windows 10 Pro 64bits / AutoCAD 3D 2022

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. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Re.

Je viens de tenter plusieurs trucs, voici mon code expérimental :

(defun TC_EcriVarIni (Fich NomVar Var / File Line LstVar ValVar)
 (if (findfile Fich)
   (progn (setq File (open (findfile Fich) "r"))
   (setq Line (read-line File))
   (setq LstIni (list LstIni 'Line))
   (while Line
     (setq LstIni (list LstIni 'Line))
     (setq Line (read-line File))
   ) ;_ Fin de while
   (close File)
   ;;Réécriture des paramètres EN COURS...
          ;;(setq File (open (findfile Fich) "w"))
          ;;Placer ici la fouille de la variable a changer...
          ;;Traitement...
          ;;Puis, écrire la totalité du .ini
          ;;Fin de réécriture EN COURS...
   (princ LstIni)
   ) ;_ Fin de progn
   (princ (strcat "\nFichier '" Fich "' introuvable."))
 ) ;_ Fin de if
)

le résultat est :

((((((((((((((((((((((((((nil ";;Style de texte des cotations périmétriques") "LotiCoteLotPerim=LotiCoteLotPerim") ";;Taille de texte pour les cotes périmétriques (en mm papier)") "LotiCoteLotPerimHaut=2.5") ";;Nombre de décimales pour les cotes périmétriques") "LotiCoteLotPerimNbDec=2") ";;Flèches de cotation autour des cotes périmétriques (0=Non ; 1=Oui)") "LotiCoteLotPerimFlech=1") ";; Style de texte des numéros de lot") "LotiNumLot=LotiNumLot") ";;Hauteur des numéros de lot (en mm papier)") "LotiNumLotHaut=5") ";;Style de texte des cotations périmétriques") "LotiCoteLotPerim=LotiCoteLotPerim") ";;Taille de texte pour les cotes périmétriques (en mm papier)") "LotiCoteLotPerimHaut=2.5") ";;Nombre de décimales pour les cotes périmétriques") "LotiCoteLotPerimNbDec=2") ";;Flèches de cotation autour des cotes périmétriques (0=Non ; 1=Oui)") "LotiCoteLotPerimFlech=1") ";; Style de texte des numéros de lot") "LotiNumLot=LotiNumLot") ";;Hauteur des numéros de lot (en mm papier)") "LotiNumLotHaut=5") . LINE) . LINE)

Je ne sais pas comment gérer ce type de liste dans la liste, je pensait obtenir :

(nil ";;Style de texte des cotations périmétriques" "LotiCoteLotPerim=LotiCoteLotPerim" ";;Taille de texte pour les cotes périmétriques (en mm papier)" "LotiCoteLotPerimHaut=2.5"

...

Une liste "simple"...

J'ai juste deux question

- comment éviter le premier "atome" nil en début de liste,

- comment faire une liste simple, et non une infinité de liste dans une liste...

 

Bien à vous...

 

Denis...

Windows 10 Pro 64bits / AutoCAD 3D 2022

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. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

J'ai oublié de poster mon fichier .ini :

;;Style des coteations périmétriques

LotiCoteLotPerim=LotiCoteLotPerim

;;Taille de texte pour les cotes périmétriques (en mm papier)

LotiCoteLotPerimHaut=2.5

;;Nombre de décimales pour les cotes périmétriques

LotiCoteLotPerimNbDec=2

;;Flèches de cotation autour des cotes périmétriques (0=Non ; 1=Oui)

LotiCoteLotPerimFlech=1

;; Style des numéros de lot

LotiNumLot=LotiNumLot

;;Hauteur des numéros de lot (en mm papier)

LotiNumLotHaut=5

Windows 10 Pro 64bits / AutoCAD 3D 2022

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. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

si on parle réellement de fichier INI au sens Windows, il faut respecter une syntaxe précise

 

[sECTION1]

Cle1=Valeur1

Cle2=Valeur2

[sECTION2]

CleX=ValeurX

CleY=ValeurY

 

Dans ce cas si tu as les EsxpressTools installés, il y ales fonctions : acet-ini-get et acet-ini-set par exemple l'extrait du site TheSwamp

; Write to INI
(acet-ini-set "c:\\filename.ini" "dir_name" "name1" "value1")
(acet-ini-set "c:\\filename.ini" "dir_name" "name2" "value2")
; Read from INI
(acet-ini-get "c:\\filename.ini" "dir_name" "name1") ; will return "value1"
;or
(acet-ini-get "c:\\filename.ini" "dir_name" ) ; will return list  ("name1" "name2")

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Salut Olivier, et merci pour ton aide...

 

Mais j'aimerais me soustraire des ExpressTools, je ne sais pas si tous mes utilisateur l'ont...

 

Mais je vais fouiller dans ce sens... Mais question, où trouver ce fichier ? ? ?

 

Merci pour ta réponse...

Windows 10 Pro 64bits / AutoCAD 3D 2022

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. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

lecture et écriture de paramètres

 

Tu nous parle des "synapses".

Petits fichiers servant à stocker des variables statiques. (persistantes)

 

ton choix de .ini me semble inapproprié.

si le nombre de variables n'est pas important autant faire un .txt (tu peux l'appeler .ini si tu veux paraître plus pro...)

 

LotiCoteLotPerim;LotiCoteLotPerim
LotiCoteLotPerimHaut;2.5
LotiCoteLotPerimNbDec;2
...

 

les commentaires tu les fécrit dans un fichier à part.

après tu jongle avec read et write.

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Le choix du fichier ini (ou txt) est bien mais peut poser des soucis de déplacement de fichier, de perte de chemin des références

Aussi je me permets de te souffler une autre idée, idée que j'ai déjà appliquée dans certains cas

C'est de créer un bloc avec attributs dont les valeurs sont celles que tu aurais mises dans le fichier ini

Le bloc peut être discret, un point avec des attributs invisibles par exemple dans un coin du cartouche ou ailleurs mais unique dans le fichier

Comme ça :

  1. Tu peux l’interroger facilement
  2. Il se déplace avec le fichier dessin
  3. Tu peux avoir plusieurs "configurations" dans le même répertoire

Voila, c'est une idée...

 

Amicalement

 

 

Lien vers le commentaire
Partager sur d’autres sites

Le choix de la façon dont on veut enregistrer des données devrait dépendre en premier lieu du fait que ces données sont liées au dessin ou à l'application.

 

Dans le premier cas, on enregistre les données dans le dessin, soit dans un dictionnaire, soit dans des données étendues, soit dans des attributs de bloc. Ma préférence va plutôt au dictionnaire (avec la possibilité d'utiliser les dictionnaires de données LISP avec les fonctions vlax-ldata*).

 

Ecriture :

(vlax-ldata-put "DenisHen" "LotiCoteLotPerimHaut" 2.5)
(vlax-ldata-put "DenisHen" "LotiCoteLotPerimNbDec" 2)
(vlax-ldata-put "DenisHen" "LotiCoteLotPerimFlech" 1)
(vlax-ldata-put "DenisHen" "LotiNumLotHaut" 1)

Lecture :

(vlax-ldata-get "DenisHen" "LotiCoteLotPerimHaut")
(vlax-ldata-get "DenisHen" "LotiCoteLotPerimNbDec")
(vlax-ldata-get "DenisHen" "LotiCoteLotPerimFlech")
(vlax-ldata-get "DenisHen" "LotiNumLotHaut")

 

 

Dans le second cas, on enregistre les données à l'extérieur du dessin, dans un fichier texte, un fichier Excel, une base de données ou la base de registre. Ma préférence irait plutôt à la base de registre qui permet en plus d'enregistrer des données par produit AutoCAD, par profil, etc. AutoLISP fournit les fonctions vl-registry* qui permettent d'écrire et de lire dans la base de registre.

 

Ecriture :

(vl-registry-write "HKEY_CURRENT_USER\\Software\\DenisHen" "LotiCoteLotPerimHaut" "2.5")
(vl-registry-write "HKEY_CURRENT_USER\\Software\\DenisHen" "LotiCoteLotPerimNbDec" "2")
(vl-registry-write "HKEY_CURRENT_USER\\Software\\DenisHen" "LotiCoteLotPerimFlech" "1")
(vl-registry-write "HKEY_CURRENT_USER\\Software\\DenisHen" "LotiNumLotHaut" "5")

Lecture :

(vl-registry-read "HKEY_CURRENT_USER\\Software\\DenisHen" "LotiCoteLotPerimHaut")
(vl-registry-read "HKEY_CURRENT_USER\\Software\\DenisHen" "LotiCoteLotPerimNbDec")
(vl-registry-read "HKEY_CURRENT_USER\\Software\\DenisHen" "LotiCoteLotPerimFlech")
(vl-registry-read "HKEY_CURRENT_USER\\Software\\DenisHen" "LotiNumLotHaut")

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

J'ajouterai que l'on peut aussi de servir des fonctions setenv et getenv.

(valeurs que l'on retrouve dans HKEY_CURRENT_USER\Software\Autodesk\AutoCAD\RXX.X\ACAD-XXXX:XXX\FixedProfile\General)

 

@+

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

Coucou

 

Je confirme qu'enregistrer dans le dessin est préférable

Merci à (gile) de nous avoir expliqué les dictionnaires

Ne les connaissant pas j'avais trouvé un palliatif avec le bloc avec attributs, si je devais le faire aujourd'hui je passerais par les dictionnaires

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Je confirme qu'enregistrer dans le dessin est préférable

 

Ça dépend si les données à enregistrer sont liées au dessin ou si elles doivent être accessibles depuis tous les dessins.

Je pense qu'il peut être intéressant de s'inspirer des variables systèmes, celles qui sont enregistrées le sont soit dans le dessin soit dans la base registre (par utilisateur ou par profil).

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Pour revenir au sujet (2ème message), pour lire un fichier texte et retourner une liste de lignes, on fait généralement :

 

(lambda (filename / file line lst)
 (if (setq filename (findfile filename))
   (progn
     (setq file (open filename "r"))
     (while (setq line (read-line file))
(setq lst (cons line lst))
     )
     (close file)
     (reverse lst)
   )
 )
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

J'avais répondu à DenisHEN en mail perso pour ne pas polluer le site et déposer les solutions une fois les détails réglés car avec DenisHEN on ne va pas toujours droit au but, sans lui manquer de respect c'est juste une question d'organisation.

Et ce que je lui ai envoyé ressemble à ce que tu nous proposes

Le résultat est identique mais la méthode, toujours la méthode, est bien plus jolie dans ton code que dans le mien

La différence c'est que dans son fichier de configuration DenisHEN met les renseignements sur deux lignes

Une première étant la description,

Une deuxième ce que contiendra la description, je l'ai interrogé sur cette façon de faire sans réponse encore

Du coup dans ta liste ça va pas le faire à moins de lancer deux read-line de suite pour créer un élément de la future liste

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

Dans la plupart des cas, je préfère récupérer les données brutes sous forme de liste et traiter ensuite la liste renvoyée.

AutoLISP est dialecte du LISP (LISt Processing), donc plutôt bien armé pour le traitement des listes.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

Je confirme qu'enregistrer dans le dessin est préférable

J'aurai la même réponse que (gile)

Tout dépend comment tu veux exploiter tes données. Elles peuvent être utilisées :

- Par plusieurs ordinateurs --> Fichier texte.

- Par plusieurs utilisateurs sur le même ordinateur --> Dans les registres.

- Par profil sur Autocad --> Avec getenv / setenv

- Par dessin --> Avec les vlax-ldata

- Par objet graphique --> Avec les xdatas

 

@+

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

Bonjour à tous, et merci de vous intéresser à ce point à mon sujet. Je viens de recevoir deux semaines de boulo à faire en une, je vais donc être un peu débordé... Mais la moindre des choses est de vous rendre la politesse en vous répondant le plus "clair possible"...

 

@(gile) :

- merci pour ton code, je regarde ça dès que je peux,

- au sujet du fichier "ini", il devrait être disponible pour plusieurs dessin et disponible pour un export/import vers d'autres machines éventuellement, je ne vois qu'un fichier texte pour ça. Mais je vais suivre tes conseils (supportés par d'autres) et ne faire ce fichier QUE pour un export/import. En "interne" (sur une même machine) j'utiliserais les (vl-registry-write (pour une machine) et les (vlax-ldata (pour le fichier). Je ferais un fichier spécifique pour l'échange de variables entre machines. Merci pour ton aide.

 

@didier :

- désolé de ne pas t'avoir répondu, mais j'ai passé la nuit (en rêves) à essayer de te faire une réponse logique et structurée, je dois donc commencer par m'ordonner le cerveau avant de l'écrire ce qu'il y a dedans ;) .

- oui, je tente bien de faire une liste comme le propose (gile), une suite de chaines que je traiterais ensuite pour le changement de variable et la réécriture du .ini (ou .txt comme tu me le propose).Et merci pour ton aide.

 

@Patrick_35 :

- Je choisirais, je pense car plus facile à gérer pour moi, les solutions "par plusieurs ordinateurs" et "par dessin". Et merci pour ton aide.

 

Je pense que vous avez tous compris mon problème et vos conseils sont justes, comme toujours.

 

Je vais donc aller dans votre sens et les suivre...

 

Encore un grand merci à vous tous...

 

Denis...

Windows 10 Pro 64bits / AutoCAD 3D 2022

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. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

- Par dessin --> Avec les vlax-ldata

On devait pas les oublier ceux-là ? Rafraichissez-moi la mémoire. N'était-il pas question de leur abandon ? Ne disait-on pas qu'il fallait plutôt utiliser un dictionnaire....?

 

Pour le dessin, il y a peu, et par amusement, j'ai utilisé les _dwgprops accessibles facilement en Vlisp. Mais les propriétés personnalisées sont peu pratiques et le code lisp doit les compter pour au final ne bénéficier que de Strings (chaines de caractères). En revanche c'est d'accès facile pour les Champs...

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Mais les propriétés personnalisées sont peu pratiques

 

Tout à fait, encore un faux espoir.

Normalement les propriètées d'un fichier sont accessibles en externe.

J'avais eu l'idée de mettre certaine caracteristique des plans comme la commune

pas moyen d'y accéder en java par exemple pour remplir un base de données, on a toutes les proprietes sauf celle la..?? :huh:

du coups cela ne sert pas a grand chose

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

On devait pas les oublier ceux-là ? Rafraichissez-moi la mémoire. N'était-il pas question de leur abandon ? Ne disait-on pas qu'il fallait plutôt utiliser un dictionnaire....?

Pas à ma connaissance. Les vlax-ldata sont d'une grande facilité d'utilisation et sont en réalité la mise en oeuvre d'un dictionnaire, comme l'indique (gile) dans ce message.

 

Pour le dessin, il y a peu, et par amusement, j'ai utilisé les _dwgprops accessibles facilement en Vlisp. Mais les propriétés personnalisées sont peu pratiques et le code lisp doit les compter pour au final ne bénéficier que de Strings (chaines de caractères). En revanche c'est d'accès facile pour les Champs...

On y arrive plus facilement par cette méthode.

 

@+

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

On devait pas les oublier ceux-là ? Rafraichissez-moi la mémoire. N'était-il pas question de leur abandon ? Ne disait-on pas qu'il fallait plutôt utiliser un dictionnaire....?

 

Les fonctions vlax-ldata* étaient dépréciées au moment de leur arrivée avec Visual LISP (R14 / 2000), parce qu'elles présentaient, à l'époque, des problèmes de compatibilité entre versions d'AutoCAD. Ceci est oublié aujourd'hui.

L'autre reproche fait à ces fonctions (toujours d'actualité), c'est qu'elles utilisent pour stocker les données (dans des dictionnaires ou dictionnaires d'extension créés automatiquement) des objets de type vlo_VL au lieu d'objets Xrecord et que ces objets vlo_VL ne sont accessibles qu'en LISP contrairement aux objets Xrecord qui sont accessibles par tous les environnement de programmation.

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Merci Patrick mais c'est bien par ces méthodes que je fais. Comment faire autrement ?

Je voulais juste dire que c'était un peu complexe face aux ldatas. Un peu tiré par les cheveux mais possible pour stocker données dans dessin.

 

Merci Gilles pour ce rappel, c'est vraiment du très vieux, j'avais peur qu'il s'agisse d'une incompatibilité bien plus récente. Ma mémoire avait un index mais pas le contenu !

Je ferai un peu de ldata pour voir ce que sont ces vlo_VL (!). Cela me surprend que seul lisp puisse les lire ou écrire. Je les connais mal. Mais merci pour ces infos fignolant tout à fait la liste B)

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Je ferai un peu de ldata pour voir ce que sont ces vlo_VL (!). Cela me surprend que seul lisp puisse les lire ou écrire.

 

On doit certainement pouvoir y accéder avec ObjectARX/C++, mais pour VBA ou .NET les objets vlo_VL sont des objets personnalisés au même titre que les "custom objects" des applications verticales ou externes.

 

En .NET par exemple, je "vois" le dictionnaire et une (ou plusieurs) entrée(s) de type vlo_VL mais je ne peux pas accéder directement à leur valeur.

 

En "pur AutoLISP", on peut y accéder via les DXF :

(vlax-ldata-put "dict" "key" 42)

crée le dictionnaire nommé "dict" avec une entrée "key" qui a 42 pour valeur.

(setq dict (dictsearch (namedobjdict) "dict"))

retrouve le dictionnaire dans le dictionnaire des objets nommés.

(entget (cdr (assoc 350 (member '(3 . "key") dict))))

renvoie la liste DXF de l'objet vlo_VL (nom DXF : VLO-VL)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

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é