Aller au contenu

Petit problème avec un LISP...


Messages recommandés

Posté(e)

Bonjour à la communauté...

 

Voilà, j'ai écris un LISP avec une DCL, tout fonctionne correctement, sauf que si je lance une deuxième fois cette commande "DHPtTopo", la fenêtre du DCL s'ouvre et se referme immédiatement... Mais pas toujours... ? ? ?

 

Télécharger ces deux fichiers depuis WeTransfer

 

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

 

C'est à mon avis un problème de variables.

Pour trouver ce que tu as oublié de déclarer localement

 

1) Tu fermes et ré-ouvres ton dessin (pour repartir sur de bonnes bases).

2) Tu lances l'instruction (setq variables (atoms-family 1))

3) Tu lances ton lisp est tu fais toutes les manips.

4) Tu lances (vl-remove-if '(lambda(x)(vl-position x variables)) (atoms-family 1))

5) Tu as le résultat de ce qui traine (dont la variable variables, ce qui est normal, car non déclarée auparavant)

 

@+

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 Maître Patrick_35 pour ta réponse.

 

Je prendrais le temps la semaine prochaine pour vérifier cette variable grâce à ta méthode...

 

J'avais le temps de me mettre perfectionner ce LISP et hop, boulo urgent de dernière minute...

 

Merci encore...

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)

Bon, j'ai trouvé 5 minutes ce midi pour revoir mon LISP.

 

avec ta méthode, j'ai trouvé deux variables non ou mal déclarées, ensuite, j'ai ça :

 

1. nouveau dessin,

2. une liste de variables à perdre la raison,

3. ma routine se lance,

4. seule la variable "VARIABLES" reste,

5. Rien ne traîne...

 

Que faire maintenant...

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,

 

Un vieil adage disais qu'une bonne routine LISP ne devait pas dépasser 10 lignes.

Sans essayer de respecter stricto-sensu cette adage, je dirais qu'une bonne pratique est de fractionner son code en plusieurs fonctions ce qui permet de les tester séparément.

Par exemple, si une commande LISP utilise une boite de dialogue, il est souvent profitable qu'une fonction indépendante (locale ou globale) ouvre la boite de dialogue et en retourne le résultat (éventuellement sous forme de liste).

 

Un petit exemple vite fait :

 

Le DCL

hello :dialog{
 label = "Hello";
 :boxed_radio_row{
   label = "Civilité";
   key = "civilite";
   :radio_button{
     label = "Madame";
     key = "madame";
   }
   :radio_button{
     label = "Monsieur";
     key = "monsieur";
   }
 }
 :edit_box{
   label = "Nom";
   key = "nom";
 }
 :edit_box{
   label = "Prénom";
   key = "prenom";
 }
 spacer;
 ok_cancel;
}

 

La routine qui ouvre la boite de dialogue et retourne le résultat :

(defun helloDlg	(/ dcl_id civilite nom prenom status result)
 (setq dcl_id (load_dialog "HelloWorld.dcl"))
 (if (new_dialog "hello" dcl_id)
   (progn
     (setq civilite "madame")
     (set_tile "civilite" civilite)
     (action_tile "civilite" "(setq civilite $value)")
     (action_tile "nom" "(setq nom $value)")
     (action_tile "prenom" "(setq prenom $value)")
     (action_tile "accept" "(done_dialog 1)")
     (action_tile "cancel" "(done_dialog 0)")
     (setq status (start_dialog))
     (unload_dialog dcl_id)
     (if (= status 1)
(setq lst (list civilite nom prenom))
     )
   )
 )
)

 

La commande :

(defun c:Hello (/ lst)
 (if (setq lst (helloDlg))
   (alert
     (strcat
"Hello "
(if (= (car lst) "madame")
  "Mme "
  "M. "
)
(caddr lst)
" "
(cadr lst)
     )
   )
 )
 (princ)
)

 

La commande pourrait, bien sûr être plus complexe (appeler d'autres sous-routines) mais on peut tester séparément la boite de dialogue en appelant juste : (helloDlg) dans la console ou à la ligne de commande.

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

Posté(e)

Salut Maître (gile), et merci pour ta réponse...

 

Mais là... Wouaouw... Claire, net et précis... Comme toujours...

 

Je m'en vais de ce pas appliquer tes conseils... Enfin, quand j'en aurais le temps...

 

Ce qui implique la restructuration presque total de ma routine...

 

Merci encore pour ton aide...

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é