Aller au contenu

[Résolu] Problème entre une variable Lisp et un champs


Messages recommandés

Posté(e)

Bonjour à la communauté.

 

Voilà, j'ai fais un petit LISP qui créer des variables :

;;;Enregistrement des détails du dossier dans le fichier courant
(defun c:DHDoss (/ DH_Departement DH_Commune)
 (princ "\nDéveloppé par Denis H. (V3.0)")
;;; Saisie de la commune***************************************************************************
 (setq DH_Departement (vlax-ldata-get "DenisH" "Departement"))
 (if DH_Departement                           ; si donnee est déjà défini
   (progn (if (setq DH_Departement (getstring T
                                       (strcat "\nNom du département ("
                                               DH_Departement
                                               ") - Nouveau nom : "
                                       ) ;_ Fin:strcat
                            ) ;_ Fin:getstring
              ) ;_ Fin:setq
                                       ; Si donnee est re-défini
            (if (/= DH_Departement "")
              (vlax-ldata-put "DenisH" "Departement" DH_Departement)
            ) ;_ Fin:if
          ) ;_ Fin:if
   ) ;_ Fin:progn
                                       ; si Ech n'est pas encore défini
   (progn (setq DH_Departement (getstring T "\nNom du département : "))
          (vlax-ldata-put "DenisH" "Departement" DH_Departement)
   ) ;_ Fin:progn
 ) ;_ Fin:if
;;; Saisie de la commune***************************************************************************
 (setq DH_Commune (vlax-ldata-get "DenisH" "Commune"))
 (if DH_Commune                           ; si donnee est déjà défini
   (progn (if (setq DH_Commune (getstring T
                                       (strcat "\nNom de la commune ("
                                               DH_Commune
                                               ") - Nouveau nom : "
                                       ) ;_ Fin:strcat
                            ) ;_ Fin:getstring
              ) ;_ Fin:setq
                                       ; Si donnee est re-défini
            (if (/= DH_Commune "")
              (vlax-ldata-put "DenisH" "Commune" DH_Commune)
            ) ;_ Fin:if
          ) ;_ Fin:if
   ) ;_ Fin:progn
                                       ; si Ech n'est pas encore défini
   (progn (setq DH_Commune (getstring T "\nNom de la commune : "))
          (vlax-ldata-put "DenisH" "Commune" DH_Commune)
   ) ;_ Fin:progn
 ) ;_ Fin:if
 ;;;Affichage des données saisies***************************************************************************
 (setq DH_Departement (vlax-ldata-get "DenisH" "Departement"))
 (setq DH_Commune (vlax-ldata-get "DenisH" "Commune"))
 (alert (strcat "\nDépartement : \t" DH_Departement
                "\nCommune : \t" DH_Commune
        ) ;_ Fin de strcat
 ) ;_ Fin de alert
 (c:CtrlSvGrd)
 (princ)
) ;_ Fin de defun

 

Mon problème est que lorsque j'insert un champs avec le nom du champs : VariableLisp et la variable dh_departement, j'ai le droit à "----" et nom au contenu de ma variable...

 

L'expression est "%<\AcVar.17.0 Lisp.dh_departement>%"

 

Je ne sais pas pourquoi, les deux derniers (setq ne fonctionnent pas, car si je le fais en ligne de commande, c'est OK...

 

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)

Posté(e)

Bonjour,

 

Ta variable DH_Departement est déclarée comme variable locale de ton programme. Donc dès que le programme a fini son exécution, elle est remise à nil. Donc tu récupères nil en dehors du programme.

Si tu veux pouvoir récupérer sa valeur, elle doit être globale donc non déclarée dans le (defun

Penses à nommer tes variables globales avec une syntaxe pour les différentier des autres valeurs, ça rend le code plus lisible.

Olivier

  • Upvote 1
Posté(e)

Penses à nommer tes variables globales avec une syntaxe pour les différentier des autres valeurs, ça rend le code plus lisible.

Olivier

 

Une convention* consiste à préfixer et suffixer le nom de variable avec des astérisques (*).Autodesk respecte cette convention avec certains nom de fonctions "globales" : *error*, *push-error-using-command*, *pop-error-mode*, *push-error-using-stack*.

 

 

* il s'agit bien d'une convention, aucune obligation.

J'ajouterais qu'il faut choisir un nom de commande qui a peu de chance d'être utilisé par d'autres noms de variables globales** (ent, lst, etc.) même si on sait bien qu'en informatique, une chose qui a peu de chance de survenir finit toujours par arriver...

 

** beaucoup de variables globales sont, tout simplement, des variables qui n'ont pas été déclaré localement par simple oubli ou négligence...

  • Upvote 1

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

Posté(e)

Salut.

 

Et merci à vous deux, ça fonctionne nickel...

 

Juste une petite question. Est-ce que ces variables restent dans le DWG ?

 

Si mes clients n'ont pas ce LISP, les champs garderont-ils leur valeur ?

 

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)

Posté(e)

Re.

 

Apparament pas, j'ai fais quelques testes sur différents DWG sur d'autres postes et les variables LISP ne sont pas enregistrées dans les DWG...

 

Au démarrage d'AutoCAD, j'ai un LISP contenant :

  (setq DH_Departement (vlax-ldata-get "DenisH" "Departement"))
 (setq DH_Commune (vlax-ldata-get "DenisH" "Commune"))

Ce qui me permet de placer dans les champs ces deux variables.

 

Mais ce LISP, ou même ces deux lignes, doivent être lancées au chargement d'AuroCAD ou du DWG puisque les valeurs de ces variables sont bien dans le DWG avec (vlax-ldata...

 

Les postes de mes clients n'ont pas ce LISP... Donc, ça ne fonctionnera chez moi, mais pas chez le client...

 

Et je n'ai rien trouvé pour placer dans le champs une phrase LISP qui serait du type :

(vlax-ldata-get "DenisH" "Departement")
;;; Ou alors 
(vlax-ldata-get "DenisH" "Commune")

 

Peut-être dans une expression DIESEL... Mais je ne connais pas le DIESEL...

 

Si quelqu'un a une astuce, un conseil... Je suis preneur...

 

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)

Posté(e)

Salut

 

Tu peux aussi créer des champs dans propriétés du fichier (Fichier --> Propriétés du dessin --> Personnaliser)

 

Par exemple

(setq sum (vla-get-summaryinfo (vla-get-activedocument (vlax-get-acad-object))))
(vla-addcustominfo sum "Denis_H" "I am the BEST")

 

Ensuite, dans les noms de champs, tu vas retrouver Denis_H et donc la valeur qui lui est associé :D

 

De plus, si tu vas dans l'explorateur de Windows, tu choisis ton fichier --> clic droit --> Propriétés --> Personnalisées et que retrouve-t-on ?

 

@+

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 Patrik_35.

 

Mille mercis pour cette astuce... Je n'avais jamais pensé à passer par ce genre de variable...

 

Ca fonctionne nickel ! !

 

Encore un grand merci (ça fait 1001 pour aujourd'hui... ;) )

 

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)

Posté(e)

Re.

 

Par contre, lorsque je change ces variables, AutoCAD me répond :

; erreur: Erreur Automation Clé dupliquée

 

En fait, le addcustominfo ajoute une variable, mais ne la change pas...

 

Comment changer le contenu de ces variables lorsqu'elles existent déjà ?

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)

Posté(e)

Re.

 

Par contre, lorsque je change ces variables, AutoCAD me répond :

 

En fait, le addcustominfo ajoute une variable, mais ne la change pas...

 

Comment changer le contenu de ces variables lorsqu'elles existent déjà ?

Par exemple

(vla-setcustombykey sum "Denis_H" "Ben pourquoi")

 

Pour récupérer la valeur

(vla-getcustombykey sum "Denis_H" 'valeur)

 

Si jamais la clé existe

(and (vl-catch-all-error-p (vl-catch-all-apply 'vla-addcustominfo (list sum "Denis_H" "Je veux une nouvelle clé")))
 (vla-setcustombykey sum "Denis_H" "Ben non, elle existe")
)

 

Plus d'info avec

(vlax-dump-object sum T)

 

@+

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)

Que dire...

 

Codes, explications... Tout est excellent...

 

Un grand merci à toi Patrick_35...

 

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)

Posté(e)

Re,

 

Finalement, j'ai maintenant une autre approche... J'utilise la fenêtre des propriétés du dessin plutôt que de multiplier les lignes de saisie...

 

Voici donc mon code ainsi qu'un cartouche "exemple" : Dossier.zip

 

Ce code créé les variables s'il elles n'existent pas, puis, les affiches...

 

Avec cette technique, les champs sont mis à jour à chaque changement...

 

Je l'utilise quand j'ai des dizaines de cartouches dans des dizaines de présentations... C'est beaucoup plus rapide et sûr...

 

Encore un grand merci à Patrick_35 (ça fait 1002...)

 

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)

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é