Aller au contenu

; erreur: type d'argument incorrect: stringp nil


Messages recommandés

Posté(e)

Bonjour à tous,

Je rencontre un petit problème avec mon programme LISP qui contient une liste déroulante en DCL.

Mon programme demande le type d'armature sous forme de liste "cadre, épingle, coupleur etc."

Puis après il est censé ajouter des blocs d'armatures mais une fois que la boite de dialogue se referme j'ai ce message d'erreur : ; erreur: type d'argument incorrect: stringp nil
"unable to get debug break position on a null text buffer"

 

Pouvez-vous me dire ce que cela signifie  ?

Je vous laisse le programme et la boite de dialogue ci dessous :

 

(defun c:Dessin_des_armatures ()
  (setq id (load_dialog "Boitearmatures.dcl"))
  (new_dialog "armaturesboite" id)
  (setq nom_arm 0)
  
  (if (or (= nom_arm nil) (= nom_arm ""))
      (set_tile "cléname" nom_arm)
      (set_tile "cléname" ""))
  
  (action_tile "accept" "(fonctionok)")
  (action_tile "cancel" "(fonctionannuler)")
  (start_dialog)
  
  (setq nom_arm (atoi (get_tile "cléname")))
  

    ((= 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))



(defun fonctionok ()
  (setq nom_arm (atoi (get_tile "cléname")))
  (done_dialog))

(defun fonctionannuler ()
  (done_dialog)
  (exit)
)
)
armaturesboite : dialog {
label = "Dessin des armatures";
     

: column {

:list_box
     {
       label = "Type d'armature";
       key = "cléname";
       list = "Cadre\nCoupleur\nEpingle\nU";
       width = 15;
       height = 8;
     }


: row {

: button {
	label = "OK";
	is_default = true;
	key = "accept";
	}
: button {
	label = "Annuler";
	is_default = false;
	is_cancel = true;
	key = "cancel";
	}
}
}
}

En vous remerciant par avance 🙂

Posté(e)

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)
)

 

  • Like 1

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

Posté(e)

Bonjour,

Merci pour votre  retour, j'y vois déjà mieux sur les boîtes de dialogue. Je ne connaissais pas le itoa 🙂

 

Bonne fin de journée

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

Salut à la communauté.
Rassure-toi Paulvdt, je fais encore la même erreur, et c'est souvent que Maître (gile), ou d'autres membres calés, m'aide ou me corrige.
L'échange entre Lisp et DCL n'est pas très aisée, voir très ardu. La rigueur est de mise, et ça n'est pas mon fort...
Comme à tous les novices, même les vieux novices. 😄

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é