Topheur Posté(e) le 31 mars 2018 Posté(e) le 31 mars 2018 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. ExempleOn 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 aideLe code est dispo à la demande, je ne le note pas pour éviter un message trop long ;) Citer
Fraid Posté(e) le 31 mars 2018 Posté(e) le 31 mars 2018 Bonjour, Tu peux peut etre utiliser getkword ou getstring a la place de getint.va voir dans l'aide il explique bien. Bon week end Citer https://github.com/Fraiddd
didier Posté(e) le 31 mars 2018 Posté(e) le 31 mars 2018 Coucou Auto-promo : Explications sur mon site À moins que tu veux qu'on le fasse à ta place, manque de temps, de facilité avec le langage... Amicalement Citer Éternel débutant... Mon site perso : Programmer dans AutoCAD
Fraid Posté(e) le 31 mars 2018 Posté(e) le 31 mars 2018 et evidement tu joue avec les fonctions atoi et itoa pour avoir le type de variable souhaité. et en passant, Bravo Didier pour ton site simple et efficace. Citer https://github.com/Fraiddd
Topheur Posté(e) le 31 mars 2018 Auteur Posté(e) le 31 mars 2018 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 Citer
Fraid Posté(e) le 31 mars 2018 Posté(e) le 31 mars 2018 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'anglaisexemple get string = obtenir chaîne Citer https://github.com/Fraiddd
DenisHen Posté(e) le 31 mars 2018 Posté(e) le 31 mars 2018 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 tubele (initget 3) interdit le retour (réponse nulle) et le 0. Tu peux aussi le mettre à 7, pour interdire aussi les nombres négatifs. Citer 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)
Topheur Posté(e) le 31 mars 2018 Auteur Posté(e) le 31 mars 2018 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'anglaisexemple 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 à avoirentrer le numéro du premier tube : 21 (21 étant la variable numero_tube et que celle ci soit modifiable) Merci de votre aide. Citer
(gile) Posté(e) le 31 mars 2018 Posté(e) le 31 mars 2018 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 getstringpour une option (mot clé) : getkword plutôt que getstringpour 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)) ) ) ) Citer Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Topheur Posté(e) le 7 avril 2018 Auteur Posté(e) le 7 avril 2018 Bonjour, Merci Gile, c'est exactement se que je voulais ;) Merci à tous pour votre aide :) Citer
Messages recommandés