steelbe Posté(e) le 12 juillet 2010 Posté(e) le 12 juillet 2010 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 platineSans 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
(gile) Posté(e) le 12 juillet 2010 Posté(e) le 12 juillet 2010 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
steelbe Posté(e) le 14 juillet 2010 Auteur Posté(e) le 14 juillet 2010 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
(gile) Posté(e) le 15 juillet 2010 Posté(e) le 15 juillet 2010 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 DCLPLATE_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
steelbe Posté(e) le 18 juillet 2010 Auteur Posté(e) le 18 juillet 2010 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
(gile) Posté(e) le 18 juillet 2010 Posté(e) le 18 juillet 2010 Salut, Suivant les images que tu veux utiliser, regarde l'aide pour les fonctions LISP : vector_image, fill_image et slide_image. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
steelbe Posté(e) le 26 août 2010 Auteur Posté(e) le 26 août 2010 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.
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant