Aller au contenu

Messages recommandés

Posté(e)

Salut !

 

J'ai une autre question :

Dans les routines lisp que j'ai créées, certaines variables reviennent tout le temps...

On doit appeler ça des variables globales je crois...

 

La question est , vous vous en doutez : Comment stocker et appeler les variables globales ???

 

Pour moi la meilleure solution consiste à créer un fichier texte...

L'une de mes variables est stockée dans un fichier texte nommé "VAR.TXT". C'est la variable d'unité de dessin. je fais un read-line pour retourner l'unité.

J'aimerais bien pouvoir en ajouter d'autres mais je ne sais pas comment "demander à lire la deuxième ligne du fichier texe" par exemple !!!

 

Voilà...

Bon je sais ya deux questions... on va Q1 pour la 1ère et Q2 pour l'autre :laugh:

 

Merci d'avance pour vos réponses garanties !!

Qui sera le premier... (Gile), Patrick_35, BonusCad ou Bred ??? :D

J'rigole..

 

A bientôt !

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Salut,

Q1

La question est , vous vous en doutez : Comment stocker et appeler les variables globales ???

Si tu n'as pas besoin de récupérer ces vriables d'un dessin à un autre, il est inutile de les enregistrer "à l'exterieur".

1 - Tu appels tes variables d'un nom non "commun", qui auront peux de chance d'avoir de doublons dans le même dessin.

2 - Si cette variable est le résultat d'une action auto et fixe tu peux en faire une routine que tu rappels pour avoir le résultat.

Ex : Liste d'objet rouge:

(defun Lst-Ob-Red ()
'("tomate" "cerise" "poivron")
)

Donc, dans ton prog principal, si tu veux ressortir ta variable contenant tous les objets rouges :

(Lst-Ob-Red)

 

Q2

'aimerais bien pouvoir en ajouter d'autres
je ne sais pas comment "demander à lire la deuxième ligne du fichier texe"

; ouvrir/créer et écrire
(setq f (open "c://VAR.TXT" "w")
     i 0)
(repeat 5
 (princ (strcat "Ligne " (rtos (setq i (1+ i))) "\n") f)
 )
(close f)


; ouvrir et lire 2nde ligne
(setq f (open "c://VAR.TXT" "r"))
(repeat 2
 (setq 2ndeLigne (read-line f))
(close f)
 )

 

 

 

[Edité le 19/9/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Bing c'est Bred le premier !!!

; ouvrir et lire 2nde ligne
(setq f (open "c://VAR.TXT" "r"))
(repeat 2
(setq 2ndeLigne (read-line f))
(close f)
) 

Ah bah oui, c'est po con...

Il faut simplement répéter le read-line...

 

par contre imaginons que cette variable est à modifier, comme l'unité, pour reprendre l'exemple plus haut, Là je ne peux plus ouvrir le fichier en lecture seule... Il faudrait pour bien faire recopier les données du fichier et modifier la valeur qui nous intéresse inscrite à une ligne donnée...

 

Si tu n'as pas besoin de récupérer ces vriables d'un dessin à un autre

Si, justement...

 

merci pour ta réponse rapide...

Adtal !

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Re,

Alors, je vais ne pas être sympa dans un premier temps, je vais juste te donner une piste :

Le lisp est fait pour traiter des listes....

et tu as une floppée de fonctions pour travailler sur des listes....

 

.... ;)

 

Par contre, personnellement avant je faisais ça aussi, je créais un .txt ou je mettais ce qui m'interressais. Maintenant j'ai laissé tombé cette solution pour passer par la base de registre.

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)
Le lisp est fait pour traiter des listes...

oh bah t'inquiète je commence à sacrément le comprendre !!!

 

Maintenant j'ai laissé tombé cette solution pour passer par la base de registre

Oui, ça peut être intéressant, mais avec AutoCAD... Pas avec un clone...

 

Bon bah je vais rester sur mon fichier texte !

Merci pour ton temps perdu à me répondre...

 

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Salut

 

Tu peux aussi utiliser en autolisp les dictionnaires si c'est des variables à conserver dans le dessin.

 

Par contre, je ne sais pas si tu peux utiliser la lecture/ecriture des registres avec ton logiciel afin de passer des variables de manière globle et de ne plus dépendre d'un fichier :casstet:

 

@+

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

Posté(e)

Salut,

 

pour écrire/lire dans la base de registre, essaye les fonctions setenv et getenv (attention que des chaines de caractère et c'est sensible à la casse)

 

essaye :

(setenv "TestEcritureRegistre" "test")

 

puis :

(getenv "TestEcritureRegistre")

 

si ça retourne "test", c'est que ça marche.

 

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

Posté(e)

Salut,

 

Exemple d'utilisation d'une variable globale pour conserver la dernière valeur entrée par l'utilisateur et la re-proposer au prochain lancement de la routine :

 

;; Si la variable n'existe pas, lui attribuer une valeur par défaut
(if (not *largeur*)
 (setq *largeur* 10.0)
)

;; Si l'utilisateur entre une valeur pour larg, la variable globale *largeur*
;; prend cette nouvelle valeur et sera proposée au prochain lancement
;; S'il fait Entrée, larg prendra la valeur de *largeur*
(if (setq larg (getdist (strcat "\nSpécifiez la largeur 				  (rtos *largeur*)
			  ">: "
		  )
	 )
     )
 (setq *largeur* larg)
 (setq larg *largeur*)
) 

  • Like 1

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

Posté(e)

Dément ! Les (getent) (setenv) fonctionnent !!!

Je sais pas trop où ça va dans le registre mais ça fonctionne !

Patrick_35, c'est quoi les dictionnaires ?

Le but, aussi, est de retrouver les variables après fermeture/ouverture du logiciel...

Cool merci à vous tous !!

 

A bientot.

Matt.

"Chacun compte pour un, et nul ne compte pour plus d'un."

Posté(e)

Salut,

 

Récapitulons :

- pour ne conserver une donnée que pendant l'exécution d'une routine : dans une variable locale

- pour conserver une donnée dans un dessin, durant la session : dans une variable globale

- pour conserver une donnée dans un dessin au delà de la session : dans une donnée étendue (xdata) ou un dictionnaire

- pour conserver/diffuser une donnée au delà du dessin : dans la base de registre (getenv / setenv)

 

- les données étendues sont des données liées à un objet qui sont conservées dans le dessin tant que l'objet y est conservé. Pour ça je te renvoie à l'excellente bibliothèque de Didier-AD

- les dictionnaires sont des objets non-graphiques liés au dessin dans lesquels on peut stocker des données qui seront conservées avec le dessin. ils peuvent être imbriqués dans d'autre dictionnaire, et les données sont stockées dans un "XRECORD" imbriqué dans le dictionnaire.

encore une fois, des fonctions Visual LISP (vlax-ldata...) permettent de stocker et récupérer aisément des données.

J'ai essayé de faire des équivalents de ces fonction en AutoLISP, elle sont un peu plus limitées (stockage uniquement dans un dictionnaire nommé et uniquement données de type chaine, entier, réel ou liste).

 

Je te propose de les tester plus en profondeur avant de les ajouter à la liste des équivalences à vl-... (remplacer vl-prin1-to-string par prin1-to-string dans ldata-put)

 

EDIT : Modification des codes de groupe DXF du Xrecord pour conserver la précision des réels et des points

 

;; LDATA-PUT (vlax-ldata-put)
;;
;; Stocke une donnée dans un dictionnaire
;;
;; Arguments :
;; dict : le nom du dictionnaire (chaine)
;; key : la clé du dictionnaire (chaine)
;; data : la donnée (chaine, entier réel ou liste)
;;
;; Exemples :
;; (ldata-put "mon_dico" "txt" "test") -> "test"
;; (ldata-put "mon_dico" "lst" '(1 2 3)) -> (1 2 3)
;; (ldata-put "mon_dico" "num" 1) -> 1

(defun ldata-put (dict key data)
 (if
   (and
     (snvalid dict)
     (snvalid key)
     (member (type data) '(LIST INT REAL STR))
     (if (dictsearch (namedobjdict) dict)
(setq dict (cdr (assoc -1 (dictsearch (namedobjdict) dict))))
(setq dict (dictadd
	     (namedobjdict)
	     dict
	     (entmakex
	       (list '(0 . "DICTIONARY")
		     '(100 . "AcDbDictionary")
	       )
	     )
	   )
)
     )
     (if (dictsearch dict key)
(entdel (cdr (assoc -1 (dictsearch dict key))))
T
     )
     (dictadd
dict
key
(entmakex
  (list	'(0 . "XRECORD")
	'(100 . "AcDbXrecord")
	(cond
	  ((and	(= (type data) 'LIST) ; point (2d ou 3d)
		(			(vl-every 'numberp data)
	   )
	   (cons 10 data)
	  )
	  ((= (type data) 'REAL) (cons 40 data)) ; réel
	  ((= (type data) 'INT) (cons 60 data)) ; entier
	  (T (cons 300 (vl-prin1-to-string data))) ; chaine ou liste
	)
  )
)
     )
   )
    data
 )
)


;; LDATA-LIST (vlax-ldata-list)
;;
;; Liste les données d'un dictionnaire
;; Arguments :
;; dict : le nom du dictionnaire (chaine)
;;
;; Exemple :
;; (ldata-list "mon_dico") -> (("lst" 1 2 3) ("num" . 1) ("txt" . "test"))

(defun ldata-list (dict / elst key val lst)
 (if (and (setq dict (dictsearch (namedobjdict) dict))
   (setq elst (member (assoc 3 dict) dict))
     )
   (progn
     (while elst
(setq key  (cdar elst)
      val  (last (dictsearch (cdr (assoc -1 dict)) key))
      lst  (cons
	     (cons key
		   (if (= 300 (car val))
		     (read (cdr val))
		     (cdr val)
		   )
	     )
	     lst
	   )
      elst (cddr elst)
)
     )
     (reverse lst)
   )
 )
)


;; LDATA-DELETE (vlax-ldata-list)
;;
;; Supprime une donnée d'un dictionnaire
;; Arguments :
;; dict : le nom du dictionnaire (chaine)
;; key : la clé du dictionnaire (chaine)
;;
;; Exemple :
;; (ldata-delete "mon_dico" "lst") -> "test"

(defun ldata-delete (dict key)
 (and (setq dict (dictsearch (namedobjdict) dict))
      (setq key (dictsearch (cdr (assoc -1 dict)) key))
      (entdel (cdr (assoc -1 key)))
 )
)


;; LDATA-GET (vlax-ldata-get)
;;
;; Retrouve un donnée dans un dictionnaire
;; Arguments :
;; dict : le nom du dictionnaire (chaine)
;; key : la clé du dictionnaire (chaine)
;;
;; Exemples :
;; (ldata-get "mon_dico" "txt") -> "test"
;; (ldata-get "mon_dico" "num") -> 1
;; (ldata-get "mon_dico" "lst") -> nil

(defun ldata-get (dict key)
 (if (and (setq dict (dictsearch (namedobjdict) dict))
   (setq key (dictsearch (cdr (assoc -1 dict)) key))
     )
   (if	(= 300 (car (last key)))
     (read (cdr (last key)))
     (cdr (last key))
   )
 )
) 

[Edité le 23/9/2007 par (gile)]

 

[Edité le 24/9/2007 par (gile)]

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

Posté(e)

J'ai ajouté un contrôle pour les données de type point dans ldata-put (vl-every à remplacer par every pour ceux qui n'ont pas les fonctions vl-...).

 

[Edité le 24/9/2007 par (gile)]

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

Posté(e)

Houlàlà !!! Mais ça a l'air vachement bien tout ça !!

 

pour conserver/diffuser une donnée au delà du dessin : dans la base de registre (getenv / setenv)

C'est celle là qui m'intéresse le plus ! C'est exactement ça que je veux faire...

 

Par contre Je teste ta nouvelle routine bien bonnarde et je te redis !

Merci !

 

[Edité le 24/9/2007 par Matt666]

"Chacun compte pour un, et nul ne compte pour plus d'un."

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é