bazoul Posté(e) le 26 juillet 2007 Posté(e) le 26 juillet 2007 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 distanceinteger <= 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]
bseb67 Posté(e) le 26 juillet 2007 Posté(e) le 26 juillet 2007 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ésultatde 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...
bazoul Posté(e) le 26 juillet 2007 Auteur Posté(e) le 26 juillet 2007 Je te remercie et je garde l'astuce du read....j'y avais jamais pensé.
didier Posté(e) le 26 juillet 2007 Posté(e) le 26 juillet 2007 hello, je n'ai pas tout compris :( regarde si INITGET ne serait pas utile dans ton cas de figure. amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
bazoul Posté(e) le 26 juillet 2007 Auteur Posté(e) le 26 juillet 2007 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 videdeca=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.
Patrick_35 Posté(e) le 26 juillet 2007 Posté(e) le 26 juillet 2007 SalutAjoute une variable dans la boucle while avec une gestion d'erreur afin de gérer ton echap @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bazoul Posté(e) le 27 juillet 2007 Auteur Posté(e) le 27 juillet 2007 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?
(gile) Posté(e) le 28 juillet 2007 Posté(e) le 28 juillet 2007 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
Patrick_35 Posté(e) le 29 juillet 2007 Posté(e) le 29 juillet 2007 SalutJe 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bazoul Posté(e) le 30 juillet 2007 Auteur Posté(e) le 30 juillet 2007 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.
(gile) Posté(e) le 30 juillet 2007 Posté(e) le 30 juillet 2007 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
bazoul Posté(e) le 31 juillet 2007 Auteur Posté(e) le 31 juillet 2007 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:
Patrick_35 Posté(e) le 31 juillet 2007 Posté(e) le 31 juillet 2007 SalutJ'ai eu un peu de tempsDonc, 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant