Aller au contenu

Messages recommandés

Posté(e)

Bonjour au roi du lisp :)

 

Comme à mon habitude, j'ai besoin des experts pour modifier un de mes lisps...

 

J'ai un lisp qui demande un point de base puis un numéro de tube à l'utilisateur via cette ligne de code :

setq numero_tube (getint  "\nentrer le numéro du premier tube :")) ;; récupère le numéro du premier tube

 

Ensuite, le lisp demande le 2e point de cotation et place se numéro au point de cotation.

 

Une boucle while permet d'incrémenter la variable numero_tube et demande le point de cotation pour placer le numéro suivant.

 

J'aimerais que lorsque mon code incrémente la variable numero_tube, celle ci demande à l'utilisateur de valider ou de modifier la variable car le prochain chiffre est incrémenté dans 80% des cas mais peut aussi sauter plusieurs numéro.

Donc aujourd'hui je sors de mon lisp et relance avec le numero_tube, le problème c'est que je dois reprendre mon point de base et je perds de précieuses secondes.

 

Exemple

On lance le lisp, l'utilisateur entre 20 en numero_tube, il place sa cote le lisp continue mais demande à l'utilisateur si 21 est le prochain numero_tube

 

setq numero_tube (getint "\nentrer le numéro du premier tube :" 21))

 

(j'ai essayé setq numero_tube (getint "\nentrer le numéro du premier tube :" numero_tube)) mais ça ne fonctionne pas :( )

 

Merci de votre aide

Le code est dispo à la demande, je ne le note pas pour éviter un message trop long ;)

Posté(e)

Tous d'abord merci de ces premières réponses :)

 

- Mon premier problème, je dispose de l'aide autocad mais en anglais...

 

- Mon deuxième problème c'est que je ne sais pas utiliser getkword avec une variable.

 

Je m'en sers sur une autre macro mais avec un choix simple (désirez vous une boite ? réponse oui ou non et insert un bloc ou non)

 

Dans mon cas, je ne sais pas comment l'utiliser :(

 

J'avoue manquer de culture en lisp...

 

J'ai essayer

(initget 1 numero_tube)

(setq numero_tube (getkword "\nentrer le numéro du premier tube : "(numero_tube))) ;; récupère le numéro du premier tube

 

mais ça ne marche pas, je n'arrive pas à avoir en choix utilisateur numero_tube et pouvoir le modifier.

 

Je reviens donc vous demander un indice pour réussir au résultat escompter ;)

 

Merci de votre aide

Posté(e)

oui, c'est plus getstring qu'il te faut. et n'oublie pas de transformer ton str en int avec atoi

 

Mon premier problème, je dispose de l'aide autocad mais en anglais...

 

la tu te freine tout seul, des connaissance en anglais sont "obligatoires" en programmation.

sinon, t'avance beaucoup moins vite.

et si tu regarde le nom des fonctions, elles sont quasiment toutes dérivées de l'anglais

exemple get string = obtenir chaîne

Posté(e)

Salut.

 

Vite fait, je pense à ça :

(initget 3)
(setq numero_tube (getkword "\nEntrer le numéro du premier tube : ")) ;; récupère le numéro du premier tube

le (initget 3) interdit le retour (réponse nulle) et le 0.

 

Tu peux aussi le mettre à 7, pour interdire aussi les nombres négatifs.

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)

Posté(e)

oui, c'est plus getstring qu'il te faut. et n'oublie pas de transformer ton str en int avec atoi

 

 

 

la tu te freine tout seul, des connaissance en anglais sont "obligatoires" en programmation.

sinon, t'avance beaucoup moins vite.

et si tu regarde le nom des fonctions, elles sont quasiment toutes dérivées de l'anglais

exemple get string = obtenir chaîne

 

J'espère ne pas t'offusquer avec ma réponse mais ...

Je sais que l'anglais m'aiderais grandement mais je sais aussi que l'on peut faire sans (je développe en VBA des applications relativement complexe sans comprendre l'anglais)

Par contre pour arriver à ce résultat, il m'a fallut un nombre d'années, de test, etc.

J'ai commençais l'arduino (pseudo codage en C), je fais quelques bricoles, et quelques programmes complexe et encore une fois, sans comprendre l'anglais.

 

J'avoue ne pas avoir envie d'apprendre le lisp par manque de temps et parce que mes petits programme font le boulot mais ne sont pas optimisé.

 

Pour en revenir au fait, le seul point de blocage et que j'arrive à avoir la phrase utilisateur :

entrer le numéro du premier tube :

MAIS je n'arrive pas à avoir

entrer le numéro du premier tube : 21 (21 étant la variable numero_tube et que celle ci soit modifiable)

 

Merci de votre aide.

Posté(e)

Salut,

 

Il est primordial de bien choisir la fonction getXXX en fonction du type de données qu'on souhaite obtenir.

Utiliser getstring pour obtenir un nombre est possible (getstring accepte tout type d'entrée au clavier) mais ça suppose que le programme vérifie que l'utilisateur a bien entré un nombre.

Avec getint, AutoLISP fera lui même ce contrôle à notre place, ce qui garantit que la valeur entrée sera bien un nombre entier (ou nil).

En règle générale, on choisi la fonction getXXX la plus adaptée au type de donnée souhaitée :

  • pour un entier: getint plutôt que getstring
  • pour une option (mot clé) : getkword plutôt que getstring
  • pour une distance : getdist plutôt que getreal et que getstring

 

Si je comprends bien la demande, il faudrait inviter l'utilisateur à entrer un nombre entier en lui proposant une valeur par défaut.

Dans AutoCAD, pour spécifier une valeur par défaut on fait Entrée au lieu se spécifier une valeur. Avec la fonction getint, quand on fait Entrée au lieu de spécifier un nombre la fonction getint renvoie nil. C'est ça qu'on va utiliser pour proposer une valeur par défaut.

 

Voilà un exemple qui montre aussi l'utilisation de initget pour empêcher l'utilisateur d'entrer 0 ou un nombre négatif, et dans le premier cas, de faire Entrée.

 

;; Si numero_tube est nil (la variable n'a jamais été initialisée)
(if (null numero_tube)

 ;; Alors, on invite l'utilisateur à entrer un nombre
 (progn
   (initget 7) ;_ <- force l'utilisateur à en entrer un nombre strictement positif
   (setq numero_tube (getint "\nEntrez le numéro du premier tube :"))
 )

 ;; Sinon, on invite l'utilisateur à entrer un nombre
 ;; en lui proposant la valeur courante de numero_tube + 1 par défaut
 (progn
   (initget 6) ;_ <- le nombre doit être strictement positif, mais l'utilisateur peut faire Entrée

   ;; Si l'utilisateur entre un nombre
   (if (setq n_tube (getint (strcat
                              "\nEntrer le numéro du premier tube <"
                              (itoa (1+ numero_tube))
                              ">:"
                            )
                    )
       )

     ;; Alors, on assigne à numero_tube la valeur spécifiée
     (setq numero_tube n_tube)

     ;; Sinon, on incrémente numero_tube
     (setq numero_tube (1+ numero_tube))
   )
 )
)

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

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • 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é