Aller au contenu

Messages recommandés

Posté(e)

Bonjour a tous,

 

alors voila j'ai fais une petite routine qui décales des entités,avec point de base,orientation...si l'utilisateur fais au moment de la saisie du décalage un clic droit sa quitte,si il appuie entrée sa prends le distance du décalage précédent....

 

Bref je récupere tous sa par un getstring,pour savoir ce que l'utilisateur a fais,je regarde si le getstring renvoi "q" ou "Q" pour quitter,si l'utilisateur a cliqué droit pour quitter.

Si le getstring renvoi "" alors l'utilisateur a fais entrée donc prendre la derniere valeur du décalage.

 

Ensuite je transforme mon string avec atoi pour en faire un integer,et en fonction du résultat de l'integer j'agis:

integer > 0 alors c'est une distance

integer <= 0 alors c'est soit une lette non autorisé,soit un négatif ou un nul.

 

Mon soucis c'est que n'importe quelle lettre renvoie 0 lors d'une tranformation en integer.

 

Donc je voudrais savoir su l'utilisateur a cliquer une touche,si oui alors quitter.Simple dis comme ça,mais devant mon clavier.....

 

J'utilise grread pour le clic droit et j'ai voulu adapter pour la clavier avec (grread nil 4 0).Seulement voila cette ligne attends que l'utilisateur fais une action et moi je veux que la récupération de la touche apuyer si il ya lieu soit faite de maniere silencieuse.

 

Ne comprennant pas trop comment fonctionne le grread,je m'en remet a vous.

Au passage si quelqu'un peut m'expliquer vite fais les options et fonctionnalité du grread,ou lien répondan a la question, je suis preneur.

 

Merci

 

[Edité le 26/7/2007 par bazoul]

Posté(e)

Salut!

 

le problème du 0 pour atoi m'a aussi ennuyer il y a quelques moi.

Pour contrer le problème je suis passé par un (read tmp) où tmp est le résultat

de getstring. Et si tu fais (type (read tmp)) il te renvoye SYM pour symbole si ce que tu as tappé

est différent d'un nombre (entier ou réel)

(type (read (getstring))) de 5.3 => REAL

(type (read (getstring))) de 5.3.2 => SYM

(type (read (getstring))) de entrée => nil

 

Par contre, il ne prend pas les Fx, fléches...

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

En fait didier c'est très simple,

 

eb gros j'ai refais la commande décaler de chez autocad,pour simplifier les choses mais sans gérer le scu pour le moment.

 

Mon probleme de ce matin étant solutionner,je vous expose le probleme de l'aprés midi!

 

Voila alors toujours le meme probleme,mais présenté autrement:

 

je demande a l'utilisateur de saisir l'entité a décaler,tant que l'utilisateur ne clique pas une entité,on repose la question...

(while (and (/= clic 1)(= deca nil))
 (setq deca(car(entsel "\nPointez l'entité a copier"))
)
   (clic_droit);récupéré par un grread
   (cond ((= clic 1) (setq deca nil))) 
.
.
.
);fin de while

Bon mais le petit probleme c'est que si l'utilisateur se trompe de commande,qu'il veut quitter mais sans faire de clic droit,en appuyant sur entrée ou espace....deca est a nil et donc on ne sors pas de la boucle.Moi se que je veux c'est différencier:

deca=nil parsque l'utilisateur a cliqué dans le vide

deca=nil parsque l'utilisateur a appuyé sur entrée ou espace pour quitter.

 

D'ou ma question,la meme que ce matin en fait,comment récupérer la touche utilisée,sachant que pour mémoire j'ai utilisé

 (setq touche (grread nil 4 0))

,mais que la commande récupére la touche que l'utilisateur appuyer et non la touche que l'utilisateur vient d'appuyer.

 

 

 

Posté(e)

Justement Patrick_35,

C'est la ou je coince.

 

Pour gérer une touche,une faut une variable dans laquelle on y met quelquechose,et moi avec ma demande en getstring,je récupere nil.....donc,vraiment personne ne sais comment récupérer le code d'une touche qui vient d'etre utilisée?

Posté(e)

Salut,

 

 

Si tu veux utiliser grread, tu peux essayer quelque chose dans ce genre :

 

(defun c:test1 (/ loop gr deca)
 (setq loop T)
 (princ "\nPointez l'entité a copier")
 (while (and loop (setq gr (grread nil 4 2)))
   (cond
     ((= 3 (car gr))
      (if (setq deca (ssget (cadr gr)))
 (setq deca (ssname deca 0)
       loop nil
 )
 (princ
   "\nAucune entité sélectionnée. Pointez l'entité a copier"
 )
      )
     )
     ((= (cadr gr) 13)
      (princ "\nL'utilisateur a tapé \"Entrée\".")
      (setq loop nil)
     )
     ((= (cadr gr) 32)
      (princ "\nL'utilisateur a tapé \"Espace\".")
      (setq loop nil)
     )
     ((member (car gr) '(11 25))
      (princ "\nL'utilisateur a fait \"Clic droit\".")
      (setq loop nil)
     )
     (T (princ "\nEntrée non valide. Pointez l'entité a copier"))
   )
 )
 (and deca
      (princ (strcat "\nEntité sélectonnée: " (vl-princ-to-string deca)))
 )
 (princ)
)

 

 

Sinon, tu peux aussi interroger la valeur de la variable système ERRNO après l'avoir remise à 0.

Si l'utilisateur clique dans le vide, ERRNO passe à 7 ; s'il fait Entrée, Espace ou clic droit, ERRNO passe à 52.

 

(defun c:test2 (/ loop deca)
 (setvar "ERRNO" 0)
 (setq loop T)
 (while loop
   (setq deca (car (entsel "\nPointez l'entité a copier")))
   (cond
     (deca (setq loop nil))
     ((= (getvar "ERRNO") 7)
      (princ
 "\nAucune entité sélectionnée."
      )
     )
     ((= (getvar "ERRNO") 52)
      (princ
 "\nL'utilisateur a fait Entrée, Espace ou clic droit."
      )
      (setq loop nil)
     )
   )
 )
 (and deca
      (princ (strcat "\nEntité sélectonnée: " (vl-princ-to-string deca)))
 )
 (princ)
)

 

 

Donc, plus simplement, pour boucler jusqu'à ce que l'utilisateur ait sélectionné une entité ou fait Entrée, Espace ou clic droit :

 

(defun c:test3 (/ deca)
 (setvar "ERRNO" 0)
 (while (not
   (or (setq deca (car (entsel "\nPointez l'entité a copier")))
       (= (getvar "ERRNO") 52)
   )
 )
 )
 (if deca
   (princ (strcat "\nEntité sélectonnée: " (vl-princ-to-string deca)))
   (princ "\nL'utilisateur a fait Entrée, Espace ou clic droit.")
 )
 (princ)
)

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

Posté(e)

Salut

Je viens de repenser que j'avais fait un truc à ce sujet

 

(defun INGcommand(/ g)
 (while (setq g (vl-catch-all-apply 'getstring (list "\nINGcommand: ")))
   (if (not (vl-catch-all-error-p g))
     (progn
       (if (vl-string-search "ING" g)(alert "You have entered a ING command"))
       (if (eq g "COMMAND")(exit))
       (if (and
         (not (vl-string-search "ING" g))
         (not (eq g "COMMAND")))
         (alert "Invalid ING command.\n Type \"Command\" to return to AutoCAd command.")
       )
     )
     (if (member (vl-catch-all-error-message g) (list "Fonction annulée" "Function cancelled"))
       (setq g T)
     )
   )
 )
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Je remerci les uns et les autres pour leur aides,sympa a vous de donner un peu de votre temps pour partager votre expérience,d'autant qu'a chaque fois que je viens vous voir j'apprends deux trois trucs.....bref je m'améliore quoi!

 

Gile,

test1 est un peu trop restrictif pour mon cas,je le garde tous de meme sous le coude au cas ou.

test2 et test3 me vont bien!!!

 

En revanche j'ai remarquer que la variable "errno" ne fonctionné pas si on remplacé le entsel par un getpoint...dommage!!

J'ai regarder la liste des variable systeme,et en effet,cette variable était belle et bien dans la liste,n'attedant qu'a etre utilisée!!!

Je me demande si certain parmis nous n'aurait pas appris la liste des commandes et variables par coeur pour pouvoir les ressortir,et les utiliser avec justesse!!!

 

 

Patrick35,

Faute de connaissance sur le vlisp,je ne comprends pas ta routine,ce qui fait que lorsque je la lance je suis obligé d'arréter autocad pour revenir en mode normal vu que j'ignore ce qu'il faut rentrer dans la ligne de commande.

Il va vraiment falloir que je me mettes au vlisp sérieusement!Je verrais ça a la fin de mon stage fin aout..;j'aurais alors 3bonnes semaine de libre avant de reprendre les cours et ainsi commencé a m'imprégnier de la philosophie du vlisp.

Posté(e)

la variable "errno" ne fonctionné pas si on remplacé le entsel par un getpoint

 

C'est qu'il ne peut y avoir d'erreur avec getpoint : un clic dans la fenêtre retourne le point, Entrée, Espace ou clic droit nil et toute entre entrée le message "Point incorrect" avec boucle.

 

Donc avec getpoint, il suffit de faire :

 

(if (not (setq pt (getpoint)))

(princ "\nL'utilisateur a fait Entrée, Espace ou clic droit.")

)

 

À moins d'utiliser la fonction initget...

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

Posté(e)

merci de ton aide précieuse giles,

Je dois dire que la fonction not je ne l'utilise pas très très souvent,et pourtant après réflection....

bon je retourne a mes occupations,justifier ma maigre rémunération! :cool:

Posté(e)

Salut

J'ai eu un peu de temps

Donc, voici un exemple avec des messages pour chaque action. A toi d'associer chaque action avec le programme que tu souhaites faire.

 

(defun c:deca(/ ok sel)
 (if (setq sel (entsel "\nVeuillez sélectionner l'objet à décaler : "))
   (progn
     (while (not ok)
(initget "Objet Quitter")
(setq sel (vl-catch-all-apply 'getpoint (list "\nDécalage / Objet / Quitter : ")))
(cond
  ((and	(vl-catch-all-error-p sel)
	(member (vl-catch-all-error-message sel) (list "Fonction annulée" "Function cancelled")))
    (princ "\nJe sors de la boucle avec \"ESC\".")
    (setq ok T)
  )
  ((eq sel "Quitter")
    (princ "\nJe sors de la boucle avec \"Quitter\".")
    (setq ok T)
  )
  ((eq sel "Objet")
    (princ "\nJe choisis un nouvel objet.")
  )
  (sel
    (princ "\nJ'ai saisi un point à l'écran --> ")
    (princ sel)
  )
  (T
    (princ "\nJ'ai fais un clic droit ou entrée au clavier.")
  )
)
     )
   )
 )
 (princ)
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

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é