Aller au contenu

Erreur: type d\'argument incorrect


Messages recommandés

Posté(e)

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;

}

}

}

 

 

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

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é