Bred Posté(e) le 8 juin 2006 Posté(e) le 8 juin 2006 Salut...Tant qu'à être dans les boucles, j'ai un souci que je n'arrive pas à résoudre :J'essaye de faire une routine permettant de copier un objet vers x (en gardant le plus possible le fonctionnement de "base" du copie d'Autocad...) mais je but sur la manière de sortir de mon 1er While : (setq sel (ssget)) (setq pA (getpoint "\n Spécifiez le Point de Base :") pA pB) (while (/= *error*) ;;; là !!! (while (= (car pA) (car pB)) (command "_copy" sel "" pA pause "_erase" "d" "") (setq pB (getvar "lastpoint")) (command "_copy" sel "" pA (list (car pB)(cadr pA)(caddr pA))) (setq sel (entlast)) (setq pA pB) ) ) ... en fait ça fonctionne comme je veux, sauf que je ne trouve pas la bonne méthode pour sortir de ma boucle avec "entrée" (ou click droit paramétrer en entrée)...J'ai remarqué que lorque je fais "entrée", j'ai pA = pB, mais ... (if (= pA pB)(quit)() ... ne semble pas fonctionner ... merci de votre aide. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 8 juin 2006 Posté(e) le 8 juin 2006 SalutEn lisant le lisp, je ne trouve pas le point de destination ?Ta boucle tu pourrais la faire sur PB en non sur PA=PB (while PB ....)Lors d'un (setq PB (getpoint "\n...."), si tu fais entrée, PB prend la valeur nil, ce qui du coup te fait sortir de ta boucle Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Tramber Posté(e) le 9 juin 2006 Posté(e) le 9 juin 2006 Ici, je t'avais donné le truc de CMDACTIVE. C'est frustrant, car il sempble que tu évites cette astuce pour former un code un peu bizarre, basé sur les erreurs !(bon, je le lis de loin, je ne sais pas). Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Bred Posté(e) le 9 juin 2006 Auteur Posté(e) le 9 juin 2006 Salut, Patrick : si je fais un (setq PB (getpoint "\n...."), je perd le principe de fonctionnement d'Autocad où les objets restes au bout du curseur pendant le déplacement ... et je voudrais garder le + possible le fonctionnement basic d'autocad... en gardant le principe du "multiple" (en + évoluer vu que je tranforme le second point en 1er point pour le copie suivant...) Tramber : ... mea culpa ... je suis désolé mais il faut que je t'avoue que après m'être pencher sur le fonctionnement de ta méthode, je me suis énervé parceque je ne comprenais vraiment pas le fonctionnement ... alors je l'ai mis de côté et je suis passé à autre chose... et là, je me remet sur cette routine pour la rendre enfin "propre", et j'ai occulté ta proposition...Donc ta propositions c'était ceci : (setq sel (ssget)) (setq lispoints nil) (command "_copy" sel "" (while (not (zerop (getvar "cmdactive"))) (progn(command pause)(setq lispoints(append lispoints(list(getvar"LASTPOINT"))))) ) ) lispoints ... eh bien ... je ne comprend vraiment toujours pas... (mais c'est vrais que ça fonctionne)... si tu pouvais m'en expliquer les finesses je t'en serais vraiment reconnaissant ... En tout cas merci à vous ... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Tramber Posté(e) le 9 juin 2006 Posté(e) le 9 juin 2006 Je viens d'essayer ta routine, et je suis rentré dans une boucle d'arrêt, en frisant le plantage.Je ne pense pas qu'il faille batir une fonction en espérant que les erreurs vont servir. Mon astuce (originellement apprise auprès de Didier) consiste à interroger continuellement AutoCAD si une commande est en cours. Elle permet de donner le contrôle à AutoCAD et ainsi de profiter des élastiques ou des commandes transparentes.Le truc, c'est le (command pause), "pause" est une syntaxe d'AutoCAD (comme \ dans une macro).Rien n'empêche d'écrire(command "instruction")(while ou repeat(command pause) pour continuer l'instruction Avec CMDACTIVE, on peut dire à AutoCAD si oui ou non l'utilisateur est encore dans une commande. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Bred Posté(e) le 9 juin 2006 Auteur Posté(e) le 9 juin 2006 ok ok ok ... merci tramber ta methode s'éclairci (pour info, dans l'aide Autocad, ils ne disent pas que lorque cmdactive=0 c'est qu'il n'y a pas de commande active, d'où mon trouble avec ton (not (zerop ...) Par contre, même si ton principe fonctionne pour avoir toujours la main dans une commande, je n'arrive pas à l'exploiter dans mon cas, vu qu'il faut que je ressorte le 1er point, puis le second pour le filtrer en coordonnées (j'arrive quand même à sortir le deuxième point ... mais comme il faut que je relance une commande je perd le "while" ... (setq sel (ssget)) (setq pA (getpoint "\n Spécifiez le Point de Base :")) (command "_copy" sel "" "m" pA (while (not (zerop (getvar "cmdactive"))) ;;; Tant que "cmdactive" différent de 0 (progn(command pause) (setq pB (getvar "lastpoint")) ) )) ... il y a peut-être une astuce permettant de filtrer les coordonnées au moment de la "pause", mais je ne vois vraiment pas comment ... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bonuscad Posté(e) le 9 juin 2006 Posté(e) le 9 juin 2006 Une autre voie possible, si j'ai bien compris ce que tu veux réaliser! :exclam: (defun c:Mcopy_XorY ( / mess filter_pt js borne pt_base e_next) (initget "X Y") (if (eq (getkword "\nSens de copie [X/Y]: ") "Y") (setq mess "Y" filter_pt ".xz") (setq mess "X" filter_pt ".yz") ) (princ (strcat "\nObjets à copier répétitivement dans le sens des " mess)) (setq js (ssget)) (cond (js (setvar "CMDECHO" 0) (setq borne (entlast)) (initget 1) (setq pt_base (getpoint "\nSpécifiez le point de base ou déplacement: ")) (while pt_base (command "_.copy" js "" pt_base filter_pt "@" pause) (if (equal pt_base (getvar "LASTPOINT") 1E-08) (setq pt_base nil) (progn (if (eq mess "X") (setq pt_base (list (car (getvar "LASTPOINT")) (cadr pt_base) (caddr pt_base))) (setq pt_base (list (car pt_base) (cadr (getvar "LASTPOINT")) (caddr pt_base))) ) (setq js (ssadd)) (while (setq e_next (entnext borne)) (setq js (ssadd e_next js) borne e_next) ) ) ) ) (command "_.u") (setvar "CMDECHO" 1) ) ) (prin1) ) [Edité le 9/6/2006 par bonuscad] Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 9 juin 2006 Auteur Posté(e) le 9 juin 2006 Une autre voie possible ... ça n'est pas une voie, c'est un (une) Autoroute !!!C'est exactement ça... en mieux !!!je vais décortiquer ton code avec plaisir! merci à tous en tout cas !!! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 9 juin 2006 Auteur Posté(e) le 9 juin 2006 ... après quelque test j'ai un petit souci avec l'entrée au clavier d'une distance au lieu d'un point, mais il doit y avoir une solution ... Par contre je ne comprend pas la commande "entnext" (aide en anglais... malheur à moi)si quelqu'un pourrait m'éclaircir ... merci Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bonuscad Posté(e) le 9 juin 2006 Posté(e) le 9 juin 2006 Je viens d'essayer avec une saisie clavier sous la forme "@500,0" que je rappelle avec la flèche haut et dans ce cas cela fonctionne, mais avec une distance seule, ça ne fonctionne pas :mad: (entnext [nom_ent])Si employé sans argument renvoie la première entité dans la base de données Avec un argument (qui est un nom d'entité) renvoie le nom de la première entité non supprimmé figurant après [nom_ent]. (entnext) renvoie aussi bien les entités principales que les sous-entités NB:modifié légèrement la routine précédente (test avec equal) qui dans un SCU ne fonctionnait pas bien + option X ou Y Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 9 juin 2006 Auteur Posté(e) le 9 juin 2006 MerciConcernant la distance donnée au clavier, j'ai trouvé l'astuce : je met l'origine au point de base. (defun c:cx ( / sel sauv-sel pA e_next) (princ "\nObjets à copier répétitivement dans le sens des X") (setq sel (ssget)) (setvar "CMDECHO" 0) (setq sauv-sel (entlast)) (initget 1) (setq pA (getpoint "\nSpécifiez le point de base : ")) (while pA (command "_ucs" "_o" pA) (setq pA (list 0 0 0)) (command "_.copy" sel "" pA ".yz" "@" pause) (if (equal pA (getvar "LASTPOINT")) (setq pA nil) (progn (setq pA (list (car (getvar "LASTPOINT")) (cadr pA) (caddr pA)) sel (ssadd)) (while (setq e_next (entnext sauv-sel)) (setq sel (ssadd e_next sel) sauv-sel e_next) ) ) ) ) (command "_.u") (setvar "CMDECHO" 1) (prin1) ) ... par contre il ne repere pas le sens du curseur pour les + ou -, mais ça me va comme ça. Concernant ta correction, je vais revoir ça... encore merci pour tout. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
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