x_all Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 bonjour je cherche à faire un bout de code que je croyais simple....j'avais fait une petite routine avec des rotations qui s’enchaînent avec un angle constant défini au départ...je voulais améliorer cette fonction pour qu'elle tienne compte de la position du départ (rotation avec référence).exemple du résultat attenduhttp://joch04.free.fr/tmp/RTF.png je voudrais que la poly en rouge se copie dans la position des noires... Voila mon code, mais il continu a fonctionner comme si je n'avais rien modifier c'est a dire comme une rotation normale en partant de l'axe des X ( remplacement de la ligne en commentaire : (command "_rotate" obj "" pts "C" ang2))une idée de pourquoi ou de comment faire?merci (defun c:rtf (/ pts pt1 pt2 ang ang1 ang2 continu ) (setq ptc (getpoint "centre de rotation /n") pt1 (getpoint "pts de départ ") pt2 (getpoint "pts d'arrivée ") ang 0.0 continu T ) (setq ang1 (angle ptc pt1) ang2 (angle ptc pt2) ang (- ang2 ang1) ) (princ (strcat "\n angle" (rtos (* ang (/ 180 pi))))) (setq obj (ssget) ang (* ang (/ 180 pi)) ang2 ang ptc (trans ptc 1 0) pt1 (trans pt1 1 0) ) (command "_rotate" obj "" ptc "C" "R" ptc pt1 ang2) (while continu (setq ang2 (+ ang ang2)) ;;; (command "_rotate" obj "" pts "C" ang2) (command "_rotate" obj "" ptc "C" "R" ptc pt1 ang2) (princ "\n cliquer pour sortir ou espace pour une autre copie ") (setq continu (= nil (getpoint))) ) (princ "sortie de rtf") (princ) quelques trucs sur autocad
zebulon_ Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 Bonjour, avec un réseau polaire, on devrait y arriver sans lisp ? En jouant sur les paramètres "ANgle entre" et "angle à remPlir". Ton problème ne viendrait-il pas des accrochages aux objets ?Par ailleurs, pourquoi faire un trans ? Si après tu fais un command, tu peux rester en coordonnées locales.Concernant la variable ANG, je préfère donner un point à la commande _rotate plutôt qu'un angle (qu'il faut calculer, sans se tromper de sens ni d'unité...) Sinon, j'ai fait quelque chose de similaire, mais avec un angle différent entre chaque copie (il faut cliquer un nouveau point entre chaque copie et c'est le point qui détermine l'angle, l'unité d'angle n'est pas importante, et le sens de rotation positif ou négatif non plus) (defun c:ricm (/ ss PTC PT1 PT2 CPT) (setvar "CMDECHO" 0) (prompt "\nRICM") (setq ss (ssget)) (setq PTC (getpoint "\nPoint de rotation : ")) (setq PT1 (getpoint PTC "\nAngle de référence : ")) (setq PT2 nil) (setq CPT 0) (while (/= PT2 "Q") (if (zerop CPT) (progn (initget "Q") (setq PT2 (getpoint PTC "\nSpécifier le second point ou [Quitter] <Quitter> : ")) ) (progn (initget "Q R") (setq PT2 (getpoint PTC "\nSpécifier le second point ou [Quitter/Rétablir] <Quitter> : ")) ) ) (cond ((= PT2 "R") (command "_undo" "1") (setq CPT (- CPT 1)) ) ((= (type PT2) 'LIST) (command "_rotate" ss "" "_non" PTC "_c" "_r" "_non" PTC "_non" PT1 "_non" PT2) (setq CPT (+ CPT 1)) ) (T (setq PT2 "Q")) ) ) (princ) ) AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
GEGEMATIC Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 salut,en fait il semble que la commande rotate ne comprend pas la séquence copie/référencecomme tu as calculé l'angle qui t'intéresse dès le départ, et que tu l'incrémente, il faut simplement faire rotate + copy.j'ai fait qq modification pour que ça marche plus convenablement à mon sens: (defun c:rtf (/ pts pt1 pt2 ang ang1 ang2 continu ) (setq ptc (getpoint "\ncentre de rotation") pt1 (getpoint ptc "\nAngle de départ ") pt2 (getpoint ptc "\nAngle d'arrivée ") ang 0.0 continu T ) (setq ang1 (angle ptc pt1);_SUD ang2 (angle ptc pt2);_angle d'incrément ang (- ang2 ang1) ) (princ (strcat "\n angle" (rtos (* ang (/ 180 pi))))) (setq obj (ssget) ang (* ang (/ 180 pi)) angR ang ptc (trans ptc 1 0) pt1 (trans pt1 1 0) ) (while continu (command "_rotate" obj "" ptc "C" angR) (setq angR (+ ang angR)) ;; (command "_rotate" obj "" ptc "C" "R" ptc pt1 angR) (princ "\n cliquer pour sortir ou espace pour une autre copie ") (setq continu (= nil (getpoint))) ) (princ "sortie de rtf") (princ) ) ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
zebulon_ Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 en fait il semble que la commande rotate ne comprend pas la séquence copie/référence _rotate comprend cette séquence, à moins d'avoir une version antique ! AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
x_all Posté(e) le 4 janvier 2019 Auteur Posté(e) le 4 janvier 2019 ok merci... je teste ça ce soir...pourquoi trans, parce que je m'en sert dans différents scu (en 3d )pourquoi pas de réseaux, bha... c'est bien plus rapide comme ça....il faut que je fille mais je vous remercie pour les idées... quelques trucs sur autocad
je56 Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 Bonjour à tous et bonne année!!Petite question sans doute bête mais si tu passais par la commande MOCORO pour faire des copy-rotate à la chaine? Eric
didier Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 Coucou Je prends le risque d'avoir mal compris et je propose ça :Qui fait ce que je crois avoir compris de la question :Je dis ça car je ne comprends l'affirmation : en fait il semble que la commande rotate ne comprend pas la séquence copie/référence Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 Coucouje fais un nouveau message car ma mise en page ne permet de mettre du code... (setq pt (getpoint "\n Point de base de la copie/rotation\n")) (setq ent (car(entsel"\nChoix de l'entité à traiter\n"))) (setq nb-copy (getint "\nNombre de copies\n")) (setq angle-rot (getreal "\nValeur de l'angle de rotation\n")) (repeat nb-copy (command "_copy" ent "" '(0 0) '(0 0)) (command "_rotate" ent "" pt "_r" "0" angle-rot) ) Éternel débutant... Mon site perso : Programmer dans AutoCAD
zebulon_ Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 ok merci... je teste ça ce soir...pourquoi trans, parce que je m'en sert dans différents scu (en 3d )pourquoi pas de réseaux, bha... c'est bien plus rapide comme ça....il faut que je file mais je vous remercie pour les idées... Pas de réseau, on peut comprendre : c'est une commande un peu compliquée...Concernant le trans, il faudrait ne le faire que si c'est nécessaire. Ici, sans doute que non. Personnellement, je ferais comme ça : (defun c:rtf (/ PTC PT1 PT2 REP) (setq ss (ssget)) (setq PTC (getpoint "\nPoint de rotation : ")) (setq PT1 (getpoint PTC "\nPremier point de l'angle de référence : ")) (setq PT2 (getpoint PTC "\nDeuxième point de l'angle de référence : ")) (setq ANG (- (angle PTC PT2) (angle PTC PT1))) (while (/= REP "Non") (command "_rotate" ss "" "_non" PTC "_c" "_r" "_non" PTC "_non" PT1 "_non" PT2) (initget "Oui Non") (setq REP (getkword "\nPoursuivre ? [Oui/Non] <Oui> : ")) (setq PT2 (polar PTC (+ (angle PTC PT2) ANG) 1)) ) (princ) ) l'avantage d'utiliser la fonction polar est qu'elle utilise toujours le radian. Cela tombe bien, c'est ce que renvoie la fonction angle. On n'a pas à faire de transformations entre degrés, grades ou je ne sais quoi. Par ailleurs, je ne connaissais pas la commande MOCORO. C'est issu des Express Tools qu'il faut avoir installé. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
DenisHen Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 Salut à tous. D'abord, bonne année 2019 à toutes et à tous... Ensuite, pourquoi ne pas passer par du DIESEL et les grips ?Rot;Ref;@;\\Et bon week-end à vous. Denis... 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)
zebulon_ Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 Salut à tous. D'abord, bonne année 2019 à toutes et à tous... Ensuite, pourquoi ne pas passer par du DIESEL et les grips ?Rot;Ref;@;\\Et bon week-end à vous. Denis... L'objectif, tel que je l'ai compris, c'est d'avoir toujours le même angle entre les copies, comme un réseau polaire. C'est possible avec DIESEL et les grips ? AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
x_all Posté(e) le 4 janvier 2019 Auteur Posté(e) le 4 janvier 2019 bon alors merci à tous...il y a effectivement un truc pas clair avec rotate et le copie + référence. Je problème semble être au niveau du passage de "r" ou "_r" comme j'ai cru naïvement, mais rien a faire, si on exécute cette séquence à la main ça marche, si on le fait en lisp ça passe pas.. je serai parti comme Gégé en recalculant le bon angle. Je ne connaissais pas ni polar ni MOCORO, et si vos deux solutions marchent parfaitement, celle de Zebfait bien plus pro.Au passage, il semble que tu as résolu le passage du "_r" à la commande rotate en ajoutant des "_non" entre chaque étape encore un nom que l'on ne m'avait pas présenté !mais merci beaucoup à vous tous...psj'ai mis Rot;Ref;@;\\ dans un bouton ça plantouille (il aime pas le @) comment l'utiliser? quelques trucs sur autocad
didier Posté(e) le 4 janvier 2019 Posté(e) le 4 janvier 2019 Coucou Je ne comprends pas pourquoi vous dîtes, vous êtes plusieurs, que le mode "référence" ne fonctionne pasCe que j'ai mis dans le message #8 ne fonctionne pas ?Merci de clarifier Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
x_all Posté(e) le 4 janvier 2019 Auteur Posté(e) le 4 janvier 2019 sisi, à la main, dans cet ordre ça marche (commencer rotation puis _reférence et on a pas la main pour la copie) mais en lisp, il semble que ça marche pas sans un "_non" entre les paramètres(non mais et puis quoi encore?) quelques trucs sur autocad
didier Posté(e) le 5 janvier 2019 Posté(e) le 5 janvier 2019 Coucou Il me semble qu'il y ait des confusions et que des contre-vérités soient claironnéesOn est bien d'accord que "à la main" lorsque qu'on lance la commande rotation aucune copie de l'objet concerné par la rotation n'est proposée ni possible par option ?Donc si ça n'existe pas "à la main" pourquoi ça existerait "en lisp" alors que ce n'est qu'un enchaînement de lignes de commandes ?Dans la ligne de code proposée dans mon message #8 : (command "_rotate" ent "" pt "_r" "0" angle-rot) Le "_r" est le lancement du point de référence,Le "0" est l'angle de référence que j'ai choisi 0 (au nord) mais qu'on peut diriger ailleurs au choixSur un autre message l'auteur a mis un "_non" c'est juste pour ne pas s'accrocher sur quelque chose si osmode n'est pas à 0 (zéro) Je pense avoir clarifiéAmicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
x_all Posté(e) le 5 janvier 2019 Auteur Posté(e) le 5 janvier 2019 à la main, si on fait Rotation puis Copie, alors on a l'option Référence disponible... quelques trucs sur autocad
didier Posté(e) le 5 janvier 2019 Posté(e) le 5 janvier 2019 Coucouje ne comprends toujours pas ce que tu veux direest-ce que tu parles de la commande Rotation en natif ou de la commande MOROCO ? Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 5 janvier 2019 Posté(e) le 5 janvier 2019 Salut, Petit rappel. Quand on appelle une commande depuis AutolISP avec la fonction command, les options peuvent différer de celles de la commande appelée directement. De plus, les options des commandes changent parfois avec les nouvelles versions et la fonction AutoLISP command peut ne pas refléter ces changements. Dans ce cas, la fonction initcommandversion permet de forcer la version de la commande utilisée par command. Après un rapide test, cette séquence semble fonctionner correctement (testé sur 2014 et 2019)(setq ent (car (entsel))) (setq pt (getpoint "\nPoint de base: ")) (command "_.rotate" ent "" pt "_copy" "_reference" pt pause pause) Il y a quelque temps, j'avais fait une petite vidéo qui donnait une méthode pour construire pas à pas un appel AutoLISP à command en utilisant les bons arguments. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 5 janvier 2019 Posté(e) le 5 janvier 2019 Hello Gilles Merci ! La Santé et Bonne Année, Bye, lecrabe Autodesk Expert Elite Team
zebulon_ Posté(e) le 5 janvier 2019 Posté(e) le 5 janvier 2019 Bonjour, Au passage, il semble que tu as résolu le passage du "_r" à la commande rotate en ajoutant des "_non" entre chaque étape encore un nom que l'on ne m'avait pas présenté !Les "_non" que j'ai rajouté comme le remarque très justement Didier, c'est avant chaque saisie de point, pour éviter qu'un éventuel accrochage aux objets ne vienne positionner le point ailleurs qu'à l'endroit voulu. Rien à voir, donc, avec le passage du "_r" à la commande "_rotate" Je ne connaissais pas polarC'est une fonction incontournable, il faut vraiment t'y intéresser ! Après un rapide test, cette séquence semble fonctionner correctement (testé sur 2014 et 2019) (setq ent (car (entsel)))(setq pt (getpoint "\nPoint de base: "))(command "_.rotate" ent "" pt "_copy" "_reference" pt pause pause) Je confirme, d'autant plus que cela correspond à ce que j'ai écrit et j'ai aussi testé sur 2014 et 2019 avec succès. AmicalementVincent C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme) C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)
x_all Posté(e) le 5 janvier 2019 Auteur Posté(e) le 5 janvier 2019 c'est vrai que j'étais passé par dessus le message 8 vite fait, car ce n'était pas bien dans le cahier des charges, mais la solution est tout à fait valide...c'est marrant comme un problème peut être abordé de manières différentes...et je retiens la routine, car ça peut être aussi bien pratique à l'usage. quelques trucs sur autocad
DenisHen Posté(e) le 9 janvier 2019 Posté(e) le 9 janvier 2019 j'ai mis "Rot;Ref;@;\\" dans un bouton ça plantouille (il aime pas le @) comment l'utiliser?Désolé, je ne t'ai pas précisé la méthode. 1.tu sélectionnes l'entité pour la rotation,2.tu cliques sur le grip de base,3.tu lances ma "macro" depuis un bouton... je m'en sers assez souvent... 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)
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