DenisHen Posté(e) le 14 avril 2018 Posté(e) le 14 avril 2018 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étriquesLotiCoteLotPerim=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 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)
DenisHen Posté(e) le 14 avril 2018 Auteur Posté(e) le 14 avril 2018 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 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)
DenisHen Posté(e) le 14 avril 2018 Auteur Posté(e) le 14 avril 2018 J'ai oublié de poster mon fichier .ini :;;Style des coteations périmétriquesLotiCoteLotPerim=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étriquesLotiCoteLotPerimNbDec=2;;Flèches de cotation autour des cotes périmétriques (0=Non ; 1=Oui)LotiCoteLotPerimFlech=1;; Style des numéros de lotLotiNumLot=LotiNumLot;;Hauteur des numéros de lot (en mm papier)LotiNumLotHaut=5 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)
Olivier Eckmann Posté(e) le 14 avril 2018 Posté(e) le 14 avril 2018 Bonjour, si on parle réellement de fichier INI au sens Windows, il faut respecter une syntaxe précise [sECTION1]Cle1=Valeur1Cle2=Valeur2[sECTION2]CleX=ValeurXCleY=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
DenisHen Posté(e) le 14 avril 2018 Auteur Posté(e) le 14 avril 2018 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 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)
(gile) Posté(e) le 14 avril 2018 Posté(e) le 14 avril 2018 Salut Que penses tu que fait cette ligne :(setq LstIni (list LstIni 'Line)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 14 avril 2018 Posté(e) le 14 avril 2018 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 - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 14 avril 2018 Posté(e) le 14 avril 2018 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. https://github.com/Fraiddd
didier Posté(e) le 15 avril 2018 Posté(e) le 15 avril 2018 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érencesAussi je me permets de te souffler une autre idée, idée que j'ai déjà appliquée dans certains casC'est de créer un bloc avec attributs dont les valeurs sont celles que tu aurais mises dans le fichier iniLe bloc peut être discret, un point avec des attributs invisibles par exemple dans un coin du cartouche ou ailleurs mais unique dans le fichierComme ça : Tu peux l’interroger facilement Il se déplace avec le fichier dessinTu peux avoir plusieurs "configurations" dans le même répertoire Voila, c'est une idée... Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 15 avril 2018 Posté(e) le 15 avril 2018 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 - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 16 avril 2018 Posté(e) le 16 avril 2018 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
didier Posté(e) le 16 avril 2018 Posté(e) le 16 avril 2018 Coucou Je confirme qu'enregistrer dans le dessin est préférableMerci à (gile) de nous avoir expliqué les dictionnairesNe 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... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 16 avril 2018 Posté(e) le 16 avril 2018 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 - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 16 avril 2018 Posté(e) le 16 avril 2018 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 - GitHub Développements sur mesure pour AutoCAD
didier Posté(e) le 16 avril 2018 Posté(e) le 16 avril 2018 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 proposesLe résultat est identique mais la méthode, toujours la méthode, est bien plus jolie dans ton code que dans le mienLa différence c'est que dans son fichier de configuration DenisHEN met les renseignements sur deux lignesUne 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 encoreDu 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... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 16 avril 2018 Posté(e) le 16 avril 2018 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 - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 17 avril 2018 Posté(e) le 17 avril 2018 Bonjour Je confirme qu'enregistrer dans le dessin est préférableJ'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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
DenisHen Posté(e) le 17 avril 2018 Auteur Posté(e) le 17 avril 2018 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 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)
Tramber Posté(e) le 17 avril 2018 Posté(e) le 17 avril 2018 - Par dessin --> Avec les vlax-ldataOn 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 ./__\. (.°=°.)
Fraid Posté(e) le 17 avril 2018 Posté(e) le 17 avril 2018 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 communepas 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 https://github.com/Fraiddd
Patrick_35 Posté(e) le 17 avril 2018 Posté(e) le 17 avril 2018 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 17 avril 2018 Posté(e) le 17 avril 2018 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 - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 17 avril 2018 Posté(e) le 17 avril 2018 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 ./__\. (.°=°.)
(gile) Posté(e) le 17 avril 2018 Posté(e) le 17 avril 2018 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 - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 17 avril 2018 Posté(e) le 17 avril 2018 J'osais pas poser la question du DXF car pour moi il est ouvert et ne permet guère de "cacher".Je vois à peu près maintenant. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
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