Aller au contenu

Comment lier une boite de dialoge à un fichier lisp


Messages recommandés

Posté(e)

Bonjour,

 

Je me suis lancé dans la creation de boite de dialogue pour rendre mes app lisp plus conviviale.

Apres de multiple tentative, j'ai réussis à creer une boite de dalogue et compris comment les creer via le lisp interface.

Maitenant, je souhaite lier les deux boite de dialogue à app lisp (compiler) si je peux dire.

J'ai séparé le lisp en deux pour essayé de le faire fonctionner. La premiére partie consiste à faire apparaitre une premiére boite de dialogue pour définir les données pour la création d'une platine. la deuxieme pour exécuter un percage sur cette meme platine.

Je me suis base sur l'exemple d'un livre mais je bute sur un probleme de debugague.

Quand je lance l'app, la boite e dialogue apparait puis l'interface lisp. Sur la ligne e command une erreur apparait: ERROR TYPE D'ARGUMENT INCORRECT NUMBERP NIL.

Quand je click sur l'icone (dernière intérruoption) il me signale l'erreur sur la ligne des

(SET_TILE wt (rtos wt)). le [ rtos wt ] est en surbrillance et je n'arrive pas à resoudre le probleme.

Les valeur à récupérer sont des nombre comme largeur hauteur et epaisseur de la platine

Sans résolution de se plobleme je ne peu pas passer a la deuxieme partie.

Voici un winrar des boites de dialogue, le teste que j'ai commencé à faire avec la platine ainsi que l'app lisp compilé

Ne pouvant pas coller de winrar dans mon message, je posterai les code ultérieurement

 

Merci pour votre aide

Posté(e)

Salut,

 

;error: type d'argument incorrect: numberp nil

 

Ce message signifie que la fonction attend comme argument un nombre (de type INT ou REAL) mais qu'elle reçoit nil.

Si la dernière interruption met (rtos wt) en surbrillance on a bien la fonction rtos qui requiert un argument de type INT ou REAL et certainement qu'à ce moment là de l'exécution wt est nil (tu peux le vérifier en faisant un "Arrêt sur erreur" et en interrogeant la variable wt).

 

Il faut que tu cherches dans le code qui précède cette expression, la variable wt ne doit pas être initialisée.

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

Posté(e)

Bonjour, (gile)

Je n'ai toujours pas reussi à resoudre le probleme.

voici la boite de dialogue que j'ai crée au format DCL

 

PLATE_1 : dialog {
label = "Plate Shape";
:boxed_column {
   label = "Dimensions :";
   fixed_width = true;
   width = 30;

 :edit_box {
   label = "WIDTH :";
   key = "wt";
   edit_width = 10;
   value =" ";
}

:edit_box {
   label = "HEIGTH :";
   key = "ht";
   edit_width = 10;
   value =" ";
}

:edit_box {
 label = "THICKNESS :";
 key = "thk";
 edit_width = 10;
 value =" ";
}
spacer;spacer;
}
:row {

 : button {
    key = "accept";
    label = "OK";
    width = 15;
    is_default = true ;
}

: button {
    key = "cancel";
    label = " ANNULER ";
    width = 15;
    is_default = false ;
    is_cancel = true ;
}
}
}

 

(defun C:PLATE (/ id wt ht thk)
 (setq id (load_dialog "PLATE_1.dcl"))
 (if (not (new_dialog "PLATE_1" id))
   (exit)
 )

Puis j'ai utilisé ( set_tile ) pour l'écriture des valeurs dans la boite de dialogue si j'ai bien compris avec:

(set_tile "wt" (rtos wt))
(set_tile "ht" (rtos ht ))
(set_tile "thk" (rtos thk ))

 

Suivi par la lecture des valeurs avec ( get_tile ) donc j'ai ecris les ligne suivant:

 

(setq wt (atof (get_tile "wt")))
(setq ht (atof (get_tile "ht")))
(setq thk (atof (get_tile "thk"))

)

 

J'ai assigné des actions à OK et CANCEL avec:

 

(action_tile
   "accept"
   "(setq ddiag 1)(done_dialog)"	
 ) 
 (action_tile
   "cancel"
   "(setq ddiag 2)(done_dialog)"
 )

l"ensemble de ses codes sont suivient par

 

(start_dialog)

 

Action si le bouton annuler est activé

 

(if (= dddiag 1)
   (princ "\n...exist dialogue\n")
 )

 

Action si le bouton OK est activé

 

(if (= ddiag 2)
   (progn
     (setq wt (atof (get_tile "wt")))
     (setq ht (atof (get_tile "ht")))
     (setq thk (atof (get_tile "thk")))
     (Setq pt (getpoint "\nBase point of plate :"))
     (Setq pt1 (polar A1 (/ Pi 2) ht))
     (Setq pt2 (polar A2 0 wt))
     (Setq pt3 (list (car pt2) (cadr pt1)))
     (Command "_pline" pt pt1 pt2 pt3 pt "")
     (command "_extrude" "D" "" thk "")
     (done_dialog dcl_id)
   )
 )
)

 

Dans le code LISP tu me dis que wt n'a pas été initialisé cependant, aucun code ne précede le code set_tile pourrais-tu m'indiquer les code que je devrais ecrire pour resoudre le probleme

Merci

 

 

Posté(e)

Salut,

 

Quand tu fais : (set_tile "wt" (rtos wt)) c'est pour afficher la valeur de wt dans la case d'édition "wt".

À l'ouverture de la boite de dialogue si tu n'as pas affecté de valeur à wt (rtos wt) provoque une erreur : c'est comme si tu faisais (rtos nil).

 

Je te propose un exemple qui utilise des valeurs par défaut pour wt, ht et thk (tu peux les changer).

Ces valeurs pourront être changées par l'utilisateur.

Pour chacune des cases, quand la valeur est changée une expression (action_tile ...) lance une sous routine (foo) qui évalue la valeur entrée. Si la valeur est un nombre valide, ce nombre est affecté à la variable de même nom que la clé, sinon une boite d'alerte s'ouvre.

 

J'ai aussi modifié le DCL en utilisant le contrôle ok_cancel qui évite de faire une rangée de deux boutons

 

Le DCL

PLATE_1 : dialog {
 label = "Plate Shape";
 :boxed_column {
   label = "Dimensions :";
   fixed_width = true;
   width = 30;
   :edit_box {
     label = "WIDTH :";
     key = "wt";
     edit_width = 10;
     value =" ";
   }
   :edit_box {
     label = "HEIGTH :";
     key = "ht";
     edit_width = 10;
     value =" ";
   }
   :edit_box {
     label = "THICKNESS :";
     key = "thk";
     edit_width = 10;
     value =" ";
   }
   spacer;
   spacer;
 }
 ok_cancel;
}

 

Le LISP

(defun C:PLATE (/ foo id wt ht thk ok pt pt1 pt2 pt3)

 ;; foo sous routine locale
 ;; évalue si l'entrée est un nombre valide
 ;; si oui : affecte la valeur à la variable de même nom que la clé
 ;; si non : ouvre une boite d'alerte
 (defun foo (key val /)
   (if (distof val)
     (set (read key) (distof val))
     (progn
       (alert "Nécessite un nombre valide")
       (mode_tile key 2)
     )
   )
 )

 (setq id (load_dialog "PLATE_1.dcl"))
 (if (not (new_dialog "PLATE_1" id))
   (exit)
 )

 ;; affecte les valeurs par défaut aux variables
 (setq wt  80.
       ht  50.
       thk 5.
 )

 ;; affiche les valeurs par défaut
 (set_tile "wt" (rtos wt))
 (set_tile "ht" (rtos ht))
 (set_tile "thk" (rtos thk))

 ;; action si la valeur est changée (lance foo)
 (action_tile "wt" "(foo \"wt\" $value)")
 (action_tile "ht" "(foo \"ht\" $value)")
 (action_tile "thk" "(foo \"thk\" $value)")
 (action_tile "accept" "(setq ok T) (done_dialog)")
 (start_dialog)
 (unload_dialog id)

 (if ok
   (progn
     (setq pt (getpoint "\nBase point of plate :"))
     (setq pt1 (polar pt (/ Pi 2) ht))
     (setq pt2 (polar pt1 0 wt))
     (setq pt3 (list (car pt2) (cadr pt)))
     (command "_pline" "_non" pt "_non" pt1 "_non" pt2 "_non" pt3 "_c" "")
     (command "_extrude" "_l" "" thk "")
   )
 )
 (princ)
)

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

Posté(e)

Suite à l'exemple que tu m'as fournie, j'ai réussi à faire fonctionner le programme avec quelque modification tel que la ligne get_tile que j'ais supprimé et je suis passé à la deuxieme partie.

Concernant la l'autre partie, j'ai reussie à le faire fonctionner en tronconnant la boite de dialogue initiale que j'ais crée en 6 selon les conditions de percage.

Maintenant, Je souhaite inserer une image dans chaque boite de dialogue lors de son apparition.

le code que j'ai ecris dans le DCL est le suivant:

:colum{

:image{

key="cliche";

height=5;

width=10;

aspect_ratio=1;

is_enable=false;

}

}

j'aimerai connaitre le code à ecrire dans le fichier LISP pour faire apparaitre une image dans la boite de dialogue.

 

Merci

  • 1 mois après...
Posté(e)

Salut,

 

Suite à la question sur l'insertion d'une image, j'ai réussi à écrire le code cependant, l'image apparait tout petit par rapport à la fenêtre crée dans la boite de dialogue. j'ai essayé de jouer sur la aspect ratio dans le dcl mais cela ne règle pas le problème. Dois-je joué sur l'échelle de l'image crée ou existe t-il un code pour rendre l'image proportionnel par rapport à la fenêtre crée.

 

 

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é