Salut,
L'erreur que tu as signifie qu'une fonction attend un chaîne comme argument (stringp) mais reçoit nil. Mais elle ce type d'erreur est d'autant plus difficile à localiser que tu ne déclares pas tes variables.
Dans tous les cas, ton code comporte d'autres erreurs.
Avec les list_box (et popup_list), les fonction get_tile, set_tile et action_tile utilisent l'indice de l'élément (base 0) sous forme de chaîne ("0", "1", "2", ...). si tu veux stocker cette valeur dans une variable de type entier (INT), il faut la convertir avec atoi dans un sens et itoa dans l'autre.
Pour savoir si la boite de dialogue a été fermée avec "OK" ou "Annuler", on utilise généralement des valeurs passées à done_dialog qu'on récupère dans la valeur de retour de start_dialog.
Un exemple commenté.
Le DCL :
armaturesboite : dialog {
label = "Dessin des armatures";
: list_box {
label = "Type d'armature";
key = "cléname";
list = "Cadre\nCoupleur\nEpingle\nU";
width = 15;
height = 8;
}
ok_cancel;
}
Le LISP :
(defun c:Dessin_des_armatures (/ id nom_arm status)
(setq id (load_dialog "Boitearmatures.dcl"))
(new_dialog "armaturesboite" id)
;; valeur par défaut
(setq nom_arm 0)
;; afficher la valeur par défaut dans la liste
(set_tile "cléname" (itoa nom_arm))
;; mettre à jour la variable nom_arm quand un nouvel élément est sélectionné
(action_tile "cléname" "(setq nom_arm (atoi $value))")
;; renvoyer 1 si la boite est fermée par OK
(action_tile "accept" "(done_dialog 1)")
;; renvoyer 0 si la boite est fermée par Annuler
(action_tile "cancel" "(done_dialog 0)")
;; démarrer la boite de dialgue
;; et récupérer le résultat de done_dialog dans la variable status
(setq status (start_dialog))
(unload_dialog id)
;; si la boite est fermée avec OK agir en fonction de la valeur de nom_arm
(if (= status 1)
(cond
((= nom_arm 0) (command "_insert" "ARM-CADRE HA" p1 1 1))
((= nom_arm 1) (command "_insert" "ARM-COUPLEUR HA" p1 1 1))
((= nom_arm 2) (command "_insert" "ARM-EPINGLE HA" p1 1 1))
((= nom_arm 3) (command "_insert" "ARM-U HA" p1 1 1))
)
)
(princ)
)