CADxp: Lecture/Écriture d'un fichier INI - CADxp

Aller au contenu

  • 2 Pages +
  • 1
  • 2
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Lecture/Écriture d'un fichier INI

#1 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3033
  • Inscrit(e) : 17-décembre 05
  • LocationSAINT FLORENTIN (Yonne)

Posté 14 avril 2018 - 18:56

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 :

Citation

;;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...
LinkedIn et mon site...
Windows 10 Pro 64bits / AutoCAD MAP 3D 2018.0.2
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#2 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3033
  • Inscrit(e) : 17-décembre 05
  • LocationSAINT FLORENTIN (Yonne)

Posté 14 avril 2018 - 20:20

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 :

Citation

((((((((((((((((((((((((((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 :

Citation

(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...
LinkedIn et mon site...
Windows 10 Pro 64bits / AutoCAD MAP 3D 2018.0.2
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#3 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3033
  • Inscrit(e) : 17-décembre 05
  • LocationSAINT FLORENTIN (Yonne)

Posté 14 avril 2018 - 20:22

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

Citation

;;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

LinkedIn et mon site...
Windows 10 Pro 64bits / AutoCAD MAP 3D 2018.0.2
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#4 L'utilisateur est hors-ligne   Olivier Eckmann 

  • ceinture noire 2em dan
  • Groupe : Membres
  • Messages : 1109
  • Inscrit(e) : 29-décembre 11
  • LocationLongjumeau (91)

Posté 14 avril 2018 - 20:36

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
0

#5 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3033
  • Inscrit(e) : 17-décembre 05
  • LocationSAINT FLORENTIN (Yonne)

Posté 14 avril 2018 - 20:43

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...
LinkedIn et mon site...
Windows 10 Pro 64bits / AutoCAD MAP 3D 2018.0.2
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#6 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11005
  • Inscrit(e) : 02-septembre 05

Posté 14 avril 2018 - 21:05

Salut

Que penses tu que fait cette ligne :
(setq LstIni (list LstIni 'Line))
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#7 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11005
  • Inscrit(e) : 02-septembre 05

Posté 14 avril 2018 - 21:14

Pour construire une liste, on utilise la fonction cons.
Les fonctions cons, car et cdr sont les fonctions fondamentales du traitement des listes, voir ce sujet.
Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#8 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 3em dan
  • Groupe : Membres
  • Messages : 1802
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 14 avril 2018 - 22:05

Bonjour,

Citation

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.
...plus je sais où je suis, moin je sais où je vais.... Extrait d''une double interview simultanée d'une particule élémentaire.
0

#9 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 7853
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 15 avril 2018 - 09:42

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 :
  • Tu peux l’interroger facilement
  • Il se déplace avec le fichier dessin
  • Tu peux avoir plusieurs "configurations" dans le même répertoire
Voila, c'est une idée...

Amicalement



Éternel débutant ...
Les bases AutoLisp
0

#10 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11005
  • Inscrit(e) : 02-septembre 05

Posté 15 avril 2018 - 10:17

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
Image IPB
0

#11 L'utilisateur est hors-ligne   Patrick_35 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 6260
  • Inscrit(e) : 06-janvier 03

Posté 16 avril 2018 - 09:03

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
0

#12 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 7853
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 16 avril 2018 - 17:09

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

Éternel débutant ...
Les bases AutoLisp
0

#13 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11005
  • Inscrit(e) : 02-septembre 05

Posté 16 avril 2018 - 18:13

Voir le messagedidier, le 16 avril 2018 - 17:09 , dit :

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
Image IPB
0

#14 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11005
  • Inscrit(e) : 02-septembre 05

Posté 16 avril 2018 - 18:27

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
Image IPB
0

#15 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 7853
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 16 avril 2018 - 18:36

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
Éternel débutant ...
Les bases AutoLisp
0

#16 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11005
  • Inscrit(e) : 02-septembre 05

Posté 16 avril 2018 - 19:42

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
Image IPB
0

#17 L'utilisateur est hors-ligne   Patrick_35 

  • ceinture rouge et blanche 8em dan
  • Groupe : Membres
  • Messages : 6260
  • Inscrit(e) : 06-janvier 03

Posté 17 avril 2018 - 07:01

Bonjour

Voir le messagedidier, le 16 avril 2018 - 17:09 , dit :

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
0

#18 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3033
  • Inscrit(e) : 17-décembre 05
  • LocationSAINT FLORENTIN (Yonne)

Posté 17 avril 2018 - 08:08

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...
LinkedIn et mon site...
Windows 10 Pro 64bits / AutoCAD MAP 3D 2018.0.2
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#19 L'utilisateur est hors-ligne   Tramber 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8433
  • Inscrit(e) : 29-mars 03
  • LocationStrasbourg

Posté 17 avril 2018 - 09:07

Voir le messagePatrick_35, le 17 avril 2018 - 07:01 , dit :

- 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...
Image IPB

Bureau d'études dessin.
Spécialiste Escaliers
Développement - Formation

./__\.
(.°=°.)
0

#20 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 3em dan
  • Groupe : Membres
  • Messages : 1802
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 17 avril 2018 - 09:22

Bonjour,

Citation

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
...plus je sais où je suis, moin je sais où je vais.... Extrait d''une double interview simultanée d'une particule élémentaire.
0

Partager ce sujet :


  • 2 Pages +
  • 1
  • 2
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)