CADxp: Changer variable lisp - CADxp

Aller au contenu

Page 1 sur 1

Changer variable lisp Modifier une variable par l'utilisateur

#1 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

  Posté 31 mars 2018 - 07:19

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

#2 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 3em dan
  • Groupe : Membres
  • Messages : 1926
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 31 mars 2018 - 09:01

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
...plus je sais où je suis, moins je sais où je vais....
Extrait d'une double interview simultanée d'une particule élémentaire.
0

#3 L'utilisateur est hors-ligne   didier 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 8425
  • Inscrit(e) : 18-décembre 02
  • LocationPlanète : Terre

Posté 31 mars 2018 - 10:13

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


Éternel débutant ...
Programmer AutoCAD
0

#4 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 3em dan
  • Groupe : Membres
  • Messages : 1926
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 31 mars 2018 - 10:40

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.
...plus je sais où je suis, moins je sais où je vais....
Extrait d'une double interview simultanée d'une particule élémentaire.
0

#5 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 31 mars 2018 - 10:47

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
0

#6 L'utilisateur est hors-ligne   Fraid 

  • ceinture noire 3em dan
  • Groupe : Membres
  • Messages : 1926
  • Inscrit(e) : 08-août 05
  • LocationST Malo 35

Posté 31 mars 2018 - 11:25

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

Citation

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
...plus je sais où je suis, moins je sais où je vais....
Extrait d'une double interview simultanée d'une particule élémentaire.
0

#7 L'utilisateur est hors-ligne   DenisHen 

  • ceinture rouge et blanche 6em dan
  • Groupe : Membres
  • Messages : 3400
  • Inscrit(e) : 17-décembre 05
  • LocationDIERREY SAINT JULIEN (10190)

Posté 31 mars 2018 - 11:55

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 10 Pro 64bits / AutoCAD MAP 3D 2019 (22.0.022.4)
Covadis 16 / Microstation V8i

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres...
Davantage d'avantages, avantagent davantage. (Bobby Lapointe)
La connaissance s'accroît quand on la partage.(Socrate)
0

#8 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 31 mars 2018 - 12:42

Voir le messageFraid, le 31 mars 2018 - 11:25 , dit :

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.
0

#9 L'utilisateur est en ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11291
  • Inscrit(e) : 02-septembre 05

Posté 31 mars 2018 - 15:11

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 -
Développements sur mesure pour AutoCAD
Image IPB
0

#10 L'utilisateur est hors-ligne   Topheur 

  • ceinture verte
  • Groupe : Membres
  • Messages : 93
  • Inscrit(e) : 05-janvier 16

Posté 07 avril 2018 - 13:04

Bonjour,

Merci Gile, c'est exactement se que je voulais ;)

Merci à tous pour votre aide :)
0

Partager ce sujet :


Page 1 sur 1


Réponse rapide

  

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)