Aller au contenu

Orientation du SCU


Messages recommandés

Invité Djjulio
Posté(e)

Bonjour tout le monde :)

 

J'écrit actuellement une routine dans laquelle je fait tourner des blocs, mais lorsque que je change le SCU, la rotation du bloc est cumulée avec celle du SCU. Voila mes questions pour résoudre ces problèmes :

Comment savoir si le SCU courant est parallèle au SCG ? Et, si c'est le cas, comment obtenir la rotation selon l'axe z du SCU ?

 

Merci d'avance pour vos réponses et vos conseils ;)

Posté(e)

Salut,

Regarde du côté de la fonction trans.

 

j'ai pas tester mais logiquement, si SCU SCG :

(trans '(0 0 0) 0 1) = (trans '(0 0 0) 1 0)

 

Comment savoir si le SCU courant est parallèle au SCG ?

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

 

La variable UCSXDIR retourne le vecteur directeur de l'axe X du SCU courant (coordonnées SCG)

 

(angle '(0. 0. 0.) (getvar 'ucsxdir)) retourne l'angle (en radians) de rotation du SCU suivant Z.

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

Posté(e)

Bonjour,

 

Il y a aussi la variable worlducs

Si elle est a zéro le scu n'est pas général

 

donc, tu peux te remettre au début du lisp en général

et revenir a ton scu courant a la fin

exemple

 

 
(setq uc (getvar "worlducs"))
(if (= uc 0) (command "_ucs" ""))

(ton code)

(if (= uc 0) (command "_ucs" "p"))

 

Invité Djjulio
Posté(e)

Merci pour vos réponses :D

 

En reprenant l'expression de (gile), voila le test que j'ai effectué dans ma routine pour tester le parallélisme du SCU et du SCG :

(and (= (caddr(getvar 'ucsxdir)) 0.0) (= (caddr(getvar 'ucsydir)) 0.0)) 

Posté(e)

Re,

ma proposition ne fonctionne pas ?

elle est plus courte (et devrait fonctionner suivant n'importe quel orientation du SCU)

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Si je reprends la question initiale :

 

Comment savoir si le SCU courant est parallèle au SCG ?

(equal '(0. 0. 1.) (trans '(0. 0. 1.) 1 0 T))

 

Et, si c'est le cas, comment obtenir la rotation selon l'axe z du SCU ?

(angle '(0. 0. 0.) (getvar 'ucsxdir))

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

Invité Djjulio
Posté(e)

Bonjour,

Tout d'abord merci a tous pour vos réponses.

 

Re,

ma proposition ne fonctionne pas ?

elle est plus courte (et devrait fonctionner suivant n'importe quel orientation du SCU)

 

J'ai testé mais l'expression renvoi nil peut importe l'emplacement et l'orientation du scu

 

Bonsoir,

Juste pour éliminer quelques parenthèses :

Il y en a déjà assez comme ça !

 

Effectivement c'est plus simple :D

Je vais prendre la formule de (gile), qui est plus courte et plus claire.

 

Sinon, toujours sur cette routine, j'ai une nouvelle question. En ce moment je peut tourner mes blocs en direct à la souris grâce à un grread. La rotation fonctionne parfaitement en direct et lorsque que je fait un clic gauche, le bloc a bien subi la rotation que j'ai indiquée. J'aimerai cependant pouvoir aussi rentrer la valeur de rotation au clavier, la à cause du grread ca pose quelques problèmes.

 

La première solution à laquelle j'ai pensé, est de mettre un getreal lorsque j'appuis sur la touche "v" (valeur). Ca marche mais j'aimerai plutôt rentrer la valeur directement sans a avoir a appuyer sur la touche "v".

 

;; Entrée d'une valeur numérique
(if (= (cadr gr) 118)
 (progn
   (redraw)
   (setq rota (getreal "\nIndiquez la nouvelle rotation : ")
         boucle nil)
 )
)

 

Deuxième solution :

J'initialise à nil une variable au début de ma routine nommé valeurnum. Dès qu'une touche numérique est appuyée, il rajoute le chiffre rentré dans la chaîne valeurnum. Si la touche retour arrièe est appuyée, je retire le dernier chiffre de la chaîne. Il suffit après de récupérer et convertir en réel la chaîne valeurnum lorsque la touche entrée est appuyée. Je me suis pas encore occupé des appuis sur "-" et "." pour les nombre négatifs et à virgules.

 

(if (and (>=(cadr gr)48)(<=(cadr gr)57))
 (if valeurnum
   (setq valeurnum (strcat valeurnum(chr (cadr gr))))
   (setq valeurnum (chr (cadr gr)))
 )
)
(if (and valeurnum (= (cadr gr) 8))
 (if (/=(strlen valeurnum)1)
   (setq valeurnum (substr valeurnum 1 (1-(strlen valeurnum))))
   (setq valeurnum nil)
 )
)

 

Est-ce que vous avez d'autres solutions qui seraient mieux que celles-ci ?

Posté(e)

Salut,

 

Une petite routine pour tester les possibilités de grread.

Pour les entrées au clavier la valeur de la chaîne est affectée à la variable string.

Tu peux ensuite tester la validité de la valeur avec angtof (qui acceptera les - et .).

 

(defun grgetangle (base / loop gr pt str)
 (prompt "\nSpécifiez l'angle: ")
 (setq loop T)
 (while
   (and (setq gr (grread T 4 0)) loop)
    (redraw)
    (cond

      ((= (car gr) 5)
(setq pt (cadr gr))
(grdraw base pt -1)
      )
      ;; clic gauche = valider le point
      ((= 3 (car gr))
(setq ang (angle base pt))
(redraw)
(setq loop nil)
      )
      ;; clic droit = annuler
      ((member(car gr) '(11 25))
(redraw)
(setq ang nil loop nil)
      )
      ;; Entrée = valider l'entrée au clavier
      ((equal gr '(2 13))
(if (setq ang (angtof str))
  (progn (redraw) (setq loop nil))
  (progn
    (alert "Angle non valide")
    (repeat (strlen str) (princ (chr 8)))
    (setq str "")
  )
)
      )

      ;; récupérer les entrées au clavier
      (T
(if (= (cadr gr) 8) ;_ 8 = retour/effacer
  (or
    (and str
	 (/= str "")
	 (setq str (substr str 1 (1- (strlen str))))
	 (princ (chr 8))
	 (princ (chr 32))
    )
    (setq str nil)
  )
  (or
    (and str (setq str (strcat str (chr (cadr gr)))))
    (setq str (chr (cadr gr)))
  )
)
(and str (princ (chr (cadr gr)))) ;_ affichage sur la ligne de commande
      )
    )
 )
 ang
)

(defun c:test (/ base ang)
 (if (setq base (getpoint "\nPoint de base: "))
   (if	(setq ang (grgetangle base))
     (alert (angtos ang))
     (alert "Fonction annulée")
   )
 )
 (princ)
)

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

Posté(e)
citation extraite du message original:

Re,

ma proposition ne fonctionne pas ?

elle est plus courte (et devrait fonctionner suivant n'importe quel orientation du SCU)

 

J'ai testé mais l'expression renvoi nil peut importe l'emplacement et l'orientation du scu

 

... Ce n'étais pas un code... c'était une explication.... ça me semblais évident...

Si tu pensais que cela ne fonctionnais pas, un message aurait été le bienvenue....

 

en extrapolation, le code était :

 

(equal (trans '(0 0 0) 0 1) (trans '(0 0 0) 1 0))

 

(gile) l'a reprit en encore plus court mais en prenant comme référence le point '(0 0 1)...

((gile) : pourquoi pas '(0 0 0) ? -merci-)

 

 

 

[Edité le 23/3/2011 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

(gile) l'a reprit en encore plus court mais en prenant comme référence le point '(0 0 1)...

((gile) : pourquoi pas '(0 0 0) ? -merci-)

 

(equal (trans '(0 0 0) 0 1) (trans '(0 0 0) 1 0))

 

Retournera T si et seulement si l'origine du SCU courant est confondue avec l'origine du SCG et ce quelle que soit la (ou les) rotations du SCU.

 

Essaye, à partir du SCG : SCU X 90

Le SCU est pivoté de 90° sur X, il n'est donc plus parallèle au SCG et ton expression retourne T.

 

Par contre, toujours à partir du SCG si tu déplaces seulement l'origine du SCU ton expression retourne nil alors que SCU et SCG sont bien parallèles.

 

Quand je fais :

(equal '(0. 0. 1.) (trans '(0. 0. 1.) 1 0 T))

 

(0. 0. 1.) n'est pas un point mais un vecteur : le vecteur normal du plan XY du SCG (vecteur Z)

 

(trans '(0. 0. 1.) 1 0 T) traduit le vecteur normal du plan XY du SCU en coordonnées SCG en le considérant comme un vecteur et non comme un point à cause de l'argument T.

Si les deux plans ont le même vecteur normal, c'est qu'ils sont parallèles.

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

Invité Djjulio
Posté(e)

Merci beaucoup (gile), tout fonctionne impeccablement :D

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é