Aller au contenu

[Résolu] Conserver une variable même en éteignant le logiciel


Aleck_Ultimate

Messages recommandés

Bonjour à tous.

 

Je souhaiterais pouvoir créer des variables dont la valeur se conserve de la même façon que les variables systèmes, et surtout quelles sont les précautions à prendre avec ou leurs limitations ex...

 

Je n'ais rien trouvé là-dessus, ou alors je n'ais rien compris parce que c'était en anglais.

 

J'ais déjà lue et relue ce poste sur les variables : Arguments et variables

 

Merci.

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

essaye de mettre un setvar dans un des fichiers lu au démaragepar exemple pour avoir par défaut des hachures utilisateur j'ai rajouté ces lignes dans acaddoc.lsp (ou AutoCAD.mnl je sais plus le quel)

(setvar "HPNAME" "_USER") (setvar "hpspace" 0.1) (setvar "hpang" 45)

Si ce n'est pas une variable système mais une variable globale que tu veux définir, nomme ta variable avec une convention de nom qui fait que tu ne la retrouvera jamais modifié par erreur exemple (setq --mavariable-- x) il faut l'écrire dans un lisp de démarrage, mais en dehors du (defun c: .

 

Lien vers le commentaire
Partager sur d’autres sites

Setvar pourrait servir à créer des variables et pas seulement à modifier leur contenu ? Ce serait intéressant, mais je ne testerais rien avant d'avoir eu confirmation qu'il suffise de la remplir avec nil pour l'effacer complétement. Je sais pas du tout dans quoi je met les pieds, là... excès de prudence ou pas unsure.gif

 

Le truc des variables globales c'est qu'elle disparaissent en redémarrant le logiciel, mais je connais les mesures de précautions à leur appliquer.

 

Je voulais savoir comment se géraient des variables identiques aux variables systèmes avant de décider si je les utilises ou si je fait sans pour mon code.

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Tout dépend de la portée souhaitée pour ta variable.

Si c'est propre au dessin, regardes du cotés des dictionnaires ou Xdata sur un objet particulier (calque 0 par ex)

Si c'est propre à ton utilisateur (programme) quelque soit le dessin, alors regardes du côté de setenv / getenv (ça stocke en base de registre) ou bien tu peux stocker ça dans un fichier INI (ancienne techno) ou XML (nouvelle techno).

 

Pour les limitations, comme ce sont TES variables et que tu sais ce que tu y stockes normalement pas de souci. Si tu stockes en fichier, les réel et autres formats (date) seront écrits en ASCII donc il faudra faire les conversion. Pour les dictionnaires ou xdata, tu as directement presque tous les types entier/long/double...

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Il est assez aisé de définir des ersatz de variables système en LISP en enregistrant des valeurs dans un dictionnaire pour un enregistrement dans le dessin.

 

vlax-ldata-put (vlax-ldata-put dict key data [private])

Stocke une donnée LISP dans un dictionnaire ou une entité. Le dictionnaire est créé s'il n'existe pas.

Retourne la valeur de data ou nil.

dict : une entité AutoCAD (ename ou vla-object) ou un nom (clé primaire)

key : la clé (secondaire) pour récupérer la donnée.

data : tout type de donnée LISP

private : (optionnel) si vlax-ldata-put est exécuté depuis un VLX dans un espace de nom séparé et que cet argument est spécifié et non nil, la donnée ne sera récupérable que par ce VLX.

 

vlax-ldata-get (vlax-ldata-get dict key [default-data] [private])

Récupère une donnée LISP dans un dictionnaire ou une entité.

Retourne la donnée si elle est existe sinon la valeur de default-data si elle a été spécifiée, sinon nil.

dict : une entité AutoCAD (ename ou vla-object) ou un nom (clé primaire)

key : la clé (secondaire) pour récupérer la donnée.

default-data : (optionnel) la donnée à retourner si la clé n'est pas trouvée

private : (optionnel, default-data doit être spécifié) si vlax-ldata-get est exécuté depuis un VLX dans un espace de nom séparé et que cet argument est spécifié et non nil, vlax-ldata-get récupère la donnée.

 

Au début du lisp, on regarde si on trouve un enregistrement dans le dictionnaire. Si non, on le crée en mettant une valeur par défaut

(or (setq mavariable (vlax-ldata-get "MON_DICO" "maclef"))
   (setq mavariable (vlax-ldata-put "MON_DICO" "maclef" 0.5))  ;; valeur par défaut
)

 

 

A la fin du lisp, on sauvegarde la variable dans le dictionnaire pour pouvoir récupérer à la prochaine ouverture du fichier dwg.

 

(vlax-ldata-put "MON_DICO" "maclef" mavariable)

 

On peut aussi imaginer enregistrer quelque chose dans la base de registres, comme évoqué ci-dessus par Olivier, pour une variable qui devrait concerner non pas un seul fichier dwg mais tous.

 

 

Amicalement

Vincent

  • Upvote 1

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)

Lien vers le commentaire
Partager sur d’autres sites

non non... je m'exprime sans doute mal...Setvar, c'est pour les variable système. on ne crée pas de variable système sauf si on s’appelle totodesk.Mais tu peux créer des variables globales c'est a dire accessible par tout l’environnement.Le PB, c'est que si tu crée une variable globale "i" qui est traditionnellement utiliser pour compter, tu t'exposes a de possible erreurs dues a des "effets de bord". D'ou la convention de nom pour pas qu'il y ait de confusion possible.

Après, on a qqs fichiers lisp qui sont lu au démarrage (acaddoc.lsp pour en citer un) Il est facile d'y créer mettre a jour des variables globales .Si tu veux stoker une valeur qui est fixe dans le temps, pas de pb avec cette méthodes, si la variable doit changer il faudra la stoker dans un fichier texte quand tu changes ta valeur pour pouvoir la retrouver au démarage.

 

Lien vers le commentaire
Partager sur d’autres sites

si la variable doit changer il faudra la stoker dans un fichier texte quand tu changes ta valeur pour pouvoir la retrouver au démarage.

 

Un dictionnaire, c'est quand même plus pratique qu'un fichier texte. En plus, le dictionnaire est enregistré dans le dwg.

 

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)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Il existe aussi la solution du Registre Windows, avec ces 2 petites fonctions

 

;;; Ecrire/Changer les Variables dans le registre
(defun PUT-var (RegVar RegVal)
 (vl-registry-write
   "HKEY_CURRENT_USER\\Software\\User\\Variables"
   RegVar
   RegVal
 )
 (princ)
)

;;;Récupérer la valeur d'une variable inscrite dans le registre
(defun GET-var (RegVar / ExtVal)
 (setq	ExtVal (vl-registry-read
	 "HKEY_CURRENT_USER\\Software\\User\\Variables"
	 RegVar
       )
 )
 ExtVal
)

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Je vais parler des solutions qui n'ont pas été évoquées.

La plus ancienne:

Utiliser les variables USERI1 àUSERI5 pour des entiers USERRx pour les réels et USERSx pour les chaines.

Elles sont conservées dans le dessin, l'inconvénient et que d'autre programme utilisateur peuvent aussi utiliser ces variables et donc les modifier. (mais elles sont rarement utilisées...)

 

Autrement une autre solution non évoquée et de passer par les propriétés du dessin, soit de manière graphique par l'onglet "Personnaliser" où l'on peut rajouter autant de clés qu'on veut.

On peut les manipuler en lisp, voir l'Aide

  • Upvote 1

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup.

 

Avec tout ça j'ais du boulot devant moi...

Je suis dysorthographique alors lâchez-moi les basques avec ça, je fait déjà de mon mieux.
Membre d'Extinction Rebellion, car pour sauver le monde il n'est jamais trop tard, amour et rage !
Pour écrire un vraie point médian (e·x·e·m·p·l·e) [Alt + 0183] ou ajout d'un raccourci clavier personnalisé (ex. [AltGr + ;])

Utilisateur d'AutoCAD 2021 sous Windows 10

Lien vers le commentaire
Partager sur d’autres sites

hello

 

tu peux aussi sauvegarder des variables ou autres dans le fichier *.cfg d'autocad

 

 

pour lire une variable sauvegarde precedement si elle n'existe pas dans le *.cfg prendra la valeur "0"

 

 (setq hachsurplushorizontal (atof (getcfg "APPDATA/HACHSURPLUSHORIZONTAL")))

 

 

 

 

 (setq tmp (getdist (strcat "\nENTRER LA VALEUR DE DECALAGE HORIZONTAL POUR LE POINT D'ORIGINE DE LA HACHURE <"
                            (rtos hachsurplushorizontal 2 8)
                            ">: "
                    )
           )
 )
 (if tmp
   (setq hachsurplushorizontal tmp)
 )

 

 

pour sauvegarder la valeur de la variable dans le fichier *.cfg

 

  (setcfg "APPDATA/HACHSURPLUSHORIZONTAL" (rtos hachsurplushorizontal 2 8))

 

tu change le "HACHSURPLUSHORIZONTAL" par ce que tu veux du moment que tu es récupéré sa valeur

 

a+

Phil

  • Upvote 1

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Autrement une autre solution non évoquée et de passer par les propriétés du dessin, soit de manière graphique par l'onglet "Personnaliser" où l'on peut rajouter autant de clés qu'on veut.

On peut les manipuler en lisp, voir l'Aide

 

C'est un peu similaire à un dictionnaire. L'avantage comme évoqué, c'est qu'on peut ajouter ou supprimer des clés sans le lisp par la commande PROPDESS. L'inconvénient, a priori (je n'ai pas essayé !), c'est que les clés ne peuvent être que du texte. Il faudrait donc, si j'ai raison, toujours y penser quand on veut gérer d'autres types de données.

Les ldata dont je parle plus haut ne présentent pas cet inconvénient (data : tout type de donnée LISP !), mais ne sont exploitables que par LISP.

 

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)

Lien vers le commentaire
Partager sur d’autres sites

L'inconvénient, a priori (je n'ai pas essayé !), c'est que les clés ne peuvent être que du texte
Sur ce point tu as raison! Il faut penser à les transcrire (atof) ou (atoi) pour avoir des réels ou des entiers

 

C'est un peu similaire à un dictionnaire. L'avantage comme évoqué, c'est qu'on peut ajouter ou supprimer des clés sans le lisp par la commande PROPDESS
Oui et non, si ça semble similaire, ce ne l'est pas.

Un autre avantage de passer par PROPDESS est que ces variables déclarées sont accessible par les champs, ce qui facilite leur exploitation et la mise à jour automatique par quiconque sans avoir à programmer, mais c'était pas le sujet...

 

Par contre un inconvénient des ldata est qu'elles peuvent disparaître. Comment?

Bah je reconnais que c'est un peu vicieux mais possible, par exemple si on utilise sans discernement le lisp de (gile) pour faire du nettoyage:

;; RemoveAEC (gile)
;; Supprime tous les dictionnaires AEC du dessin
(defun c:RemoveDictOtherACAD ()
 (foreach p (entget (namedobjdict))
(if (and (= 3 (car p))
			(not (wcmatch (cdr p) "ACAD_*"))
   	)
   	(progn (princ (strcat "\n" (cdr p) " a été effacé!"))
 	(dictremove (namedobjdict) (cdr p)))
)
 )
 (princ)
)

 

Utiliser les variables USERI1 àUSERI5 pour des entiers USERRx pour les réels et USERSx pour les chaines.

Là je rectifie: seule USERI et USERR sont sauvegardées. Étrangement USERS n'est pas sauvegardée. Je pense que ça vient de l'usage unique par AutoCad LT de cette variable, les deux autre ne pouvant être exploitée (Le diesel n'exploite que des chaînes)

Edit:

Je rajouterais que les propriétés du dessin peuvent être propagée à un autre dessin.

La commande PROPULATE des ExpressTools le permet (je n'ai jamais utilisé) ou encore le lisp de LeeMac

  • Upvote 1

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Salut.

 

+1 avec Zebulon_, j'utilise les (vlax-ldata-put et (vlax-ldata-get à outrance depuis que je les connais (grace à Maître (gile))...

Et je n'ai jamais eu de problèmes...

C'est du solide ! ! !

Ça ne dépend de rien, c'est en "dur" dans le DWG, c'est compatible avec tous les AutoCAD "survivants", je ne connais pas le plus vieil AutoCAD compatible, mais il doit être vieux...

  • Upvote 1

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)

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é