Aller au contenu

(résolu) rotation avec référence


x_all

Messages recommandés

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 attendu

http://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)

Lien vers le commentaire
Partager sur d’autres sites

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

 

Amicalement

Vincent

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)

Lien vers le commentaire
Partager sur d’autres sites

salut,

en fait il semble que la commande rotate ne comprend pas la séquence copie/référence

comme 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.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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 !

 

Amicalement

Vincent

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)

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Coucou

je 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)
)

Lien vers le commentaire
Partager sur d’autres sites

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

 

Amicalement

Vincent

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)

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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 ?

 

Amicalement

Vincent

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)

Lien vers le commentaire
Partager sur d’autres sites

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 Zeb

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

ps

j'ai mis Rot;Ref;@;\\ dans un bouton ça plantouille (il aime pas le @) comment l'utiliser?

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Il me semble qu'il y ait des confusions et que des contre-vérités soient claironnées

On 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 choix

Sur 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

 

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 polar

C'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.

 

Amicalement

Vincent

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)

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

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é