MiniMinus Posté(e) le 18 juin 2006 Posté(e) le 18 juin 2006 Salut Dans le programme ci-dessous, lors de l'appel de la fonction "BlsFace", je reçois le message d'erreur suivant : "; erreur: type d'argument incorrect: numberp: nil". Alors que je peux manipuler la variable "Dia_Cho" en la multipliant,.. je n'arrive pas à la transmettre à l'argument "Dia". Je vois bien que c'est une erreur de type mais je n'arrive pas à la cerner. Quelqu'un pourrait-il eclaircir ma lanterne. D'avance merci. MiniMinus Programme :(defun C:DesBls (/ dcl_id ) (setq dcl_id (load_dialog "Diametre.dcl")) (if (not (new_dialog "Info_Diametre" dcl_id)) (exit) ) (action_tile "choix" "(Quel_Dia $value)") (action_tile "accept" "(progn (BlsFace Dia_Cho ) (done_dialog) )" ) (start_dialog) (unload_dialog dcl_id) (princ)) ( defun BlsFace ( Dia / Axe DemAxe Cent XCent YCent PoinHa PoinBa PoinGa PoinDo ObjCer ) (setq Axe (+ Dia 20) DemAxe (/ Axe 2) Cent (getpoint "Entrer le centre du boulon : ") XCent (car Cent) YCent (cadr Cent) PoinHa (list XCent (+ YCent DemAxe)) PoinBa (list XCent (- YCent DemAxe)) PoinGa (list (- XCent DemAxe) YCent) PoinDo (list (+ XCent DemAxe) YCent)) (command "_line" PoinHa PoinBa "") (command "_line" PoinGa PoinDo "") (command "_circle" Cent (/ Dia 2)) (setq ObjCer (entlast)) (command "_.hatch" "_s" ObjCer "") (princ) ) (defun Quel_Dia (quel / ) (cond ((= quel "dix") (setq Dia_Cho 10)) ((= quel "dou") (setq Dia_Cho 12)) ((= quel "sez") (setq Dia_Cho 16)) ((= quel "vin") (setq Dia_Cho 20)) ((= quel "qua") (setq Dia_Cho 24)) ((= quel "sep") (setq Dia_Cho 27)) ((= quel "tre") (setq Dia_Cho 30)) )) Boîte de dialogue : Info_Diametre : dialog { label = "Test Edit_box"; alignment = left; : boxed_radio_row { key = "choix"; : radio_button { label = "ø10"; key = "dix"; } : radio_button { label = "ø12"; key = "dou"; is_default = true; } : radio_button { label = "ø16"; key = "sez"; } : radio_button { label = "ø20"; key = "vin"; } : radio_button { label = "ø24"; key = "qua"; } : radio_button { label = "ø27"; key = "sep"; } : radio_button { label = "ø30"; key = "tre"; } } : row { : spacer { width = 30; } : button { key = "accept"; label = "OK"; fixed_width = true; is_default = true; alignment = centered; } : button { label = "Cancel"; is_cancel = true; key = "cancel"; width = 8; fixed_width = true; } }}
(gile) Posté(e) le 18 juin 2006 Posté(e) le 18 juin 2006 Salut, À première vue, l'erreur doit venir de l'utilsation des radio_button : la valeur -$value ou (get_tile ...)- retournée par un radio_button est "1" si le bouton est "enfoncé", sinon "0". Tu dois donc faire un truc du genre : (action_tile "dix" "(if (= \"1\" $value) (setq dia 10.0))") et ce, pour chaque bouton, ou dans le (action_tile "accept"...) "(cond ""((= (get_tile \"dix\") \"1\") (setq Dia 10.0))""((= (get_tile \"dou\") \"1\") (setq Dia 12.0))"...) Note que je donne des valeurs réelles (10.0 et pas 10) pour éviter toute erreur du style :(/ 27 2) qui retournerait 13 et pas 13.5 Je te laisse chercher un peu, c'est comme çà qu'on comprend le mieux... [Edité le 18/6/2006 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
MiniMinus Posté(e) le 18 juin 2006 Auteur Posté(e) le 18 juin 2006 Merci Gile, Mais je ne comprends pas car ma variable "Dia_Cho" prend bien la valeur dont j'ai besoin. C'est au passage à la fonction "BlsFace" que cela bloque. Après l'appel "(BlsFace Dia_Cho)", ma variable "Dia_Cho" a bien la valeur 24 (en exemple) mais la variable "Dia" est à "nil". Même avec des réels. J'ai quand même essayé ta façon et cela ne marche pas ! Il est des mondes où tout n'est qu'illusions, je crois !!! Pas facile le LISP. MiniMinus
MiniMinus Posté(e) le 18 juin 2006 Auteur Posté(e) le 18 juin 2006 A tous et particulièrement à Gile, Merci car j'apprends beaucoup avec vous. J'ai donc trouvé mon erreur. Il ne faut pas mettre l'appel de la fonction "BlsFace" dans "progn" mais après le "unload_dialog". Ok j'ai résolu ce tout petit problème (ce qui n'est pas un grand exploit) mais je ne peux pas expliquer pourquoi. Si quelqu'un peut me l'expliquer, il est le bienvenu. J'ai bien une petite idée que je vous soumet pour ce qu'elle vaut : tant que la boîte de dialogue n'est pas fermée, les variables ne sont pas véritablement mises à jour. Bon dimanche à tous. MiniMinus
(gile) Posté(e) le 18 juin 2006 Posté(e) le 18 juin 2006 Salut et bravo, Faire des boites dialogues avec .lsp et .dcl est une chose fort ingrate. L'argument Dia passait bien mais je pense que la routine buggait à cause de l'appel à (getpoint ...) La réponse était dans l'aide aux développeurs ->AutoLISP Developer's Guide -> Working with Programmable Dialog Boxes -> Managing Dialog Boxes -> Controlling Dialog Boxes with AutoLISP Programs -> Functions Restricted When a Dialog Box Is Open While a dialog box is active—that is, during the start_dialog call—you cannot call any function that requires user input on the AutoCAD command line, or affects the display outside the dialog box (for example, in the AutoCAD graphics window). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
MiniMinus Posté(e) le 18 juin 2006 Auteur Posté(e) le 18 juin 2006 Merci Gile, pour l'explication. J'ai cependant trouvé sans consulter l'aide en anglais. Ma femme est américaine et j'en ai parfois marre de l'anglais surtout pour le côté technique. Simplement avec un peu de logique, beaucoup d'essais et de l'observation, on y arrive aussi parfois. Je voulais te demander : t'es tout seul sur ce site ? Il n'y a que toi à me répondre ! loll Je plaisante. Je te souhaite une bonne soirée et encore merci pour ton aide et ta disponibilité. MiniMinus
(gile) Posté(e) le 18 juin 2006 Posté(e) le 18 juin 2006 t'es tout seul sur ce site ? Il n'y a que toi à me répondre ! Oh non, d'autres auraient très bien pu le faire (et le faire très bien), certains ont une bien plus grande pratique du LISP que moi. C'est, comme tu dis une question de disponibilté, ils devaient être parti en week end. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bonuscad Posté(e) le 19 juin 2006 Posté(e) le 19 juin 2006 L'astuce pour pouvoir obtenir une valeur via (getpoint) (getdist) (getangle).... et de mettre sa boite en boucle pour recharger sa boite avec la valeur mise à jour. exemple:(setq what_next 2)(while (< 1 what_next) (if (not (new_dialog "diamètre" dcl_id)) (exit)) (action_tile "pick_diam" "(done_dialog 2)") (action_tile "accept" "(done_dialog 1)") (action_tile "cancel" "(done_dialog 0)") (setq what_next (start_dialog)) (cond ((= what_next 2) (initget 1) (setq diam (getdist "\ndiametre")) ))(unload_dialog dcl_id)(cond ((not (zerop what_next))..... On continu Bien sur dans la boite de dialogue (dcl) il te faut un bouton associé à ta saisie graphique en plus de ta case de saisie numérique de diamètre. ici par exemple pick_diam Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
MiniMinus Posté(e) le 20 juin 2006 Auteur Posté(e) le 20 juin 2006 Merci BonusCad Je vais étudier ton programme mais seulement ce week-end car je n'aurais pas assez de temps avant. (Si je veux bien comprendre, je dois prendre mon temps ! Que veux-tu ! C'est ça les vieux !). Ton programme est plus conséquent que mes petites routines, du moins par rapport à ma connaissance du langage. Encore merci @+ MiniMinus
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