Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

J’ai commencé à coder mes premières petites routines (pour le moment j’essaye de faire simple et efficace), à force de patience et de travail, ainsi qu’avec l’aide puisé sur ce forum, je réussi à solutionner la plus part des problèmes rencontrés (pour cela je remercie les membres de ce forum pour l’aide qu’ils m’ont fournis).

 

Pour rendre mes routines un peu plus conviviales, je me suis intéressé à la création de variable d’environnement histoire de mémoriser (sauvegarder) des paramètres de configuration (propre à mes routines ou à mon environnement de travail).

 

 

En convention je préfixe mes noms de variables avec mes initiales lorsque la variable n’est pas spécifique à une routine sinon je préfixe son nom en fonction de la routine qui va avec.

 

 

 

Cas 1 : Dans le cas ou j’ai un seul paramètre d’environnement à définir dans mon code.

 

D’une manière générale comment je procède :

 

Je teste l’existence de ma variable d’environnement

 (if (getenv "MaVariable")

 

Si elle existe je stocke sa valeur dans un symbole

   (setq valvar (getenv "MaVariable"))

 

Sinon je la crée en lui affectant une valeur par défaut (au format chaine), éventuellement je récupère sa valeur.

   (setq val-var (setenv "MaVariable" val-defaut))
)

 

Dans le déroulement de mon programme, si je viens à modifier la valeur de mon symbole val-var, je mets à jour ma variable.

 (setenv "MaVariable" val-var)

 

 

 

Cas 2 : Dans le cas ou j’ai plusieurs paramètres d’environnement à définir dans mon code.

 

Plutôt que de créer plusieurs variables ( au risque de polluer ma base de registre), j’ai choisi de procéder d’une façon plus « lispienne » c'est-à-dire :

 

Je regroupe tous mes paramètres dans une liste (associative ou pas).

 (setq lstparm ‘(parm1 parm2 parm3 …))

 

Puis je converti cette liste en chaîne que je mémorise dans ma variable d’environnement.

 (setenv "MesVariable" (vl-princ-to-string lstparm))

 

Si je veux lire la valeur d’un paramètre, par exemple le 2ème (cas ou ma liste n’est pas associative).

 (setq parm2 (cadr (read (getenv "MesVariable"))))

 

Ou si je veux récupérer ma liste de paramètres

 (setq lstparm (read (getenv "MesVariable")))

 

 

 

Maintenant que j’ai résumé comment je procède avec setenv & getenv, mon questionnement est le suivant :

 

En 1-La méthode employé vous semble-t-elle acceptable. Dans mon 2ème cas le fait de convertir une liste en chaîne, cela pose t’il un problème de précision dans le cas de nombre réel ( j’ai pas complément fini mes évaluations en ce sens), car dans ce cas je ne fait pas intervenir la fonction rtos.

 

En 2-Qu’elle est la taille maximal des informations que je peux stocker dans ma variable ( surtout pour le cas ou je stocke des listes).

 

En 3- Il me semble avoir compris que les variables définit pas setenv le sont dans la base de registre, mais qu’est ce qu’une base de registre ? Ou est elle localisée ?

 

En 4- Vous vous doutez bien que pour en arriver là, j’ai passablement « pollué » ma base de registre avec la création de variables inutiles au cours de mes diverses tentatives. Pour être le plus propre possible j’ai bien mis mes variables inutiles à "" (c.a.d. nil). Est-ce suffisant car il me semble que cela libère l’espace mémoire mais ne supprime pas le nom du symbole dans la base.

 

 

Voilà si quelqu’un peux me renseigner (même partiellement), en attendant je continue mes recherches..

 

A+ Bruno

 

Apprendre => Prendre => Rendre

Posté(e)

Et personnellement je préfère créer mes Variables directement dans le registre

 

dans un dossier personnel (on pollue moins)

 

je me suis fait 2 petite fonctions

 
(defun PUT-var (RegVar RegVal)
 (vl-registry-write
   "HKEY_CURRENT_USER\\Software\\Dev\\Test"
   RegVar
   RegVal
 )
 (princ)
)

(defun GET-var (RegVar)

 (setq	ExtVal (vl-registry-read
	 "HKEY_CURRENT_USER\\Software\\Dev\\Test"
	 RegVar
       )
 )
 ExtVal
)

 

Dans les lisps qui les utilisent, je ne les déclare pas, elle devienne globale a la premiere lecture

 

 

[Edité le 2/12/2010 par Fraid]

Posté(e)

Salut,

 

Juste un petit point de méthode.

 

setenv/getenv est plus facile/rapide à utiliser que vl-registry-write/read mais je pense comme Fraid que la seconde méthode est plus "propre". Personnellement je crée une clé par application et des sous clés pour chaque variable. Dans les deux cas, la méthode est à utiliser quand on a besoin de stocker des informations à l'extérieur du dessin (pour qu'elles soient accessibles depuis n'importe quel dessin.

 

Mais il n'est pas toujours nécessaire ou judicieux de conserver des données à l'extérieur du dessin.

Pour lier des données à un dessin, il est préférable d'utiliser les données étendues (xdata) ou les dictionnaires. Pour ces derniers, les fonctions vlax-ldata-* sont très pratiques tant que ces données ne doivent servir qu'à du LISP (ces dictionnaires sont inaccessibles pour d'autres langages). Les fonctions vlax-ldata-* permettent de stocker et de récupérer facilement tout type de données (chaînes, nombres entiers ou réels, listes).

 

Si les données n'ont pas à être conservées au delà du dessin dans une session, des variable globales, correctement nommées pour éviter des conflits sont en général bien suffisantes.

 

Concernant la précision des nombres réels sous forme de chaînes, vl-princ-to-string tronque les décimales, il vaut mieux utiliser rtos.

 

1$ (vl-princ-to-string pi)
"3.14159"
_1$ (rtos pi 2 16)
"3.141592653589793"

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci à tous les deux pour vos réponses,

 

Je dois avouer tout de même que, j’ai un problème de vocabulaire pour bien saisir la portée de vos propos. En ce qui concerne les données étendues ( xdata), j’ai un peu épluché la documentation DXF, la notion ne met pas étrangère, je pense même me faire une bonne idée de la chose..

 

Par contre les termes registres et dictionnaires me sont encore étrangers, je ne visualise pas ce à quoi vous faite référence, à l’occasion je ferais des recherche en ce sens.

 

(Ps: Il semblerai à vous lire que le registre n'a pas le même sens pour vous, que ce que j'ai nommé la base de registre.dans mon post)

 

A+ Bruno

 

 

[Edité le 4/12/2010 par VDH-Bruno]

Apprendre => Prendre => Rendre

Posté(e)

Salut,

 

Quand on parle de "registre", il s'agit de la base de registre de Windows. Celle dans laquelle setenv stocke les variables d'environnement. Les fonction vl-registry-* permettent d'accéder au registre (sauf HKEY_USERS et KEY_LOCAL_MACHINE) de manière plus "fine" que setenv.

 

Les "dictionnaires" sont des objets non graphique d'AutoCAD servant à stocker des données dans le dessin, il peuvent contenir d'autres dictionnaires (arborescence), des données "classiques (chaines, nombres) sous forme de Xrecord ou encore des objets "non graphiques". AutoCAD en utilise plusieurs pour stocker les présentations (ACAD_LAYOUT), les styles de lignes de tableaux (ACAD_TABLESTYLES), les groupes (ACAD_GROUP), etc.

 

Il existe en gros deux types de dictionnaires :

- les dictionnaires du dessin, tous contenus dans le "Dictionnaire des Objets Nommés (Named Objects Dictionnary) auquel on accède avec la fonction LISP namedobjdict.

- les dictionnaires d'extension qui sont liés à un objet graphique ou non (tout objet AutoCAD peut avoir un dictionnaire d'extension qui peut en contenir plusieurs autres).

 

On peut accéder à tous ces dictionnaires avec les fonctions dictadd (pour en créer), dictnext (pour parcourir les entrées), dictremove (pour en supprimer), dictrename (pour les renommer) ou dictsearch (pour les chercher).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Bonjour,

 

La base de registre et le registre sont la meme chose.

 

Il me semble que c'est a partir de Windoxs XP que cela s'appel le registre (à confirmer, c'est peut etre windows 2000)

 

On y accède directement en cliquant sur Démarrer/Exécuter puis Tapper regedit

 

Faire trés attention quand on fait une modification. N'en faire qu'une a la fois et redémarrer son PC a chaque fois.

 

Bonne exploration

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é