Aller au contenu

Rotation sur axe x du monde


Messages recommandés

Invité ingoenius
Posté(e)

Je cherche depuis deux jours de faire un lisp qui me permettreai de faire une rotazione sur l'axe x Du monde des blocs selectionnes ( en changeant de scu etc ) ma quand je change de scu les coordonner du point d'insertion du blocs changent et je n'arrive pas a m'en sortir

 

ici le debut du script en question

je part d'un bloc inserer a plans dans une vue du haut (standard en autocad) et je veut en une commande le tourner autour de l'axe x globale du monde , ensuite je veux faire un script de rotation pour l'axe Y et Z (le Z est la rotation normale)

 

 
(defun C:RXX();rotation d'un bloc sur l'axe x du monde

(setq DTR (/ PI 180))
(SETQ OSN (GETVAR "OSMODE"))

;(setq BLOCCO (car (entsel "\nSelect bloks")))

(setq ANG (getreal "\Angle? "))
;(setq ANG 90.0)

 
 
(setq BLOCCO (ssget)) 
(setq I 0)
(setq N (sslength BLOCCO))

(repeat N


(setq ENT (ssname BLOCCO I))  
(setq DatiB (entget ENT))	
(setq P (cdr (assoc 10 DatiB)))	

(setq xP (car P))
(setq yP (cadr P))
(setq zP (caddr P))

(setq P0 (list xP yP zP))
 
(command "_.UCS" "_Y" 90) ; changement de SCU
(setq P (list zP yP xP))

 
(command "_ucs" "O" P "")
(setq P (list 0 0 0 ));

 


 ;(SETVAR "OSMODE" 3)
;(SETQ PT (GETPOINT "\ncentro rotazione"))
(SETVAR "OSMODE" 0)

(command "_rotate" ENT "" P ANG)
(command "_.UCS" "_p") ; restauration du SCU
(command "_.UCS" "_g" "") ; restauration du SCU
(setq P (cdr (assoc 10 DatiB)))	;rimetto il punto P a posto 

(setq I (1+ I))

 )

(SETVAR "OSMODE" OSN)
 
)

 

impossible pour moi d'avancer ;-(

Posté(e)

Salut,

 

Il n'est pas nécessaire de changer de SCU en utilisant la commande _rotate3d et la fonction trans.

 

Le point d'insertion du bloc (pt1) est exprimé, dans la liste DXF, en coordonnées SCO, il faut d'abord le traduire en coordonnées SCG.

Puis on peut définir un point (pt2) sur l'axe X du SCG passant par pt1 en ajoutant 1 à la coordonnées x de pt1.

Il faut ensuite traduire ces deux points en coordonnées SCU courant pour les utiliser avec la fonction command.

 

(defun c:rxx (/ ang ss ent n pt1 pt2)
 (and
   (setq ang (getreal "Angle: "))
   (setq blocco (ssget '((0 . "INSERT"))))
   (setq n 0)
   (while (setq ent (ssname blocco n))
     (setq pt1 (trans (cdr (assoc 10 (entget ent))) ent 0)
    pt2 (list (1+ (car pt1)) (cadr pt1) (caddr pt1))
    pt1 (trans pt1 0 1)
    pt2 (trans pt2 0 1)
    )
     (command "_rotate3d" ent "" "_non" pt1 "_non" pt2 ang)
     (setq n (1+ n))
   )
 )
 (princ)
) 

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

Invité ingoenius
Posté(e)

merci gile, je vais travailler ces fonction de transformation sco scg

 

grand merci ;-)

Invité ingoenius
Posté(e)

maintenant comment faire pour appelle le script directement avec la variable angle (est possible?)

 

 

ex je tape Ryy90 e le script agit avec l'angle 90, ryy45 et l'angle pris en compte est 45........

il y aune facon de faire ce type de chose?

 

Posté(e)

Bonjour,

 

(defun ryy (ANG / ss ent n pt1 pt2)
...
...
) 

 

le code est le même, mais sans le getreal.

 

Après on peut faire

(ryy 90) ou (ryy 45)

 

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)

Posté(e)

Re,

 

Pour ta dernière demande, hormis la réponse donnée par zebulon_, on pourrait définir des fonctions pour des angle déterminés, mais ça limiterait considérablement les possibilités.

 

Dans tous les cas la différence est vraiment minime étant donné qu'on ne supprime qu'une validation (Entrée) entre l'appel de la commande et l''entrée de l'angle.

 

Pour le code, l'utilisation de Visual LISP permet d'éviter tous les "trans" puisque toutes les valeurs sont exprimées en coordonnées SCG

 

(defun c:rxx (/ ang ss pt1 pt2)
 (vl-load-com)
 (or *acdoc*
     (setq *acdoc* (vla-get-ActiveDocument (vlax-get-acad-object)))
 )
 (and
   (setq ang (getangle "\nAngle: "))
   (ssget '((0 . "INSERT")))
   (progn
     (vla-StartUndoMark *acdoc*)
     (vlax-for	o (setq ss (vla-get-ActiveSelectionSet *acdoc*))
(setq pt1 (vlax-get o 'InsertionPoint)
      pt2 (list (1+ (car pt1)) (cadr pt1) (caddr pt1))
)
(vla-Rotate3d o (vlax-3d-point pt1) (vlax-3d-point pt2) ang)
     )
     (vla-EndUndoMark *acdoc*)
   )
 )
) 

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

Invité ingoenius
Posté(e)

Ok merci pour les reponse donc j'ai fait les lisp generiques +

in rx90 ry90 et rz90 que sont les options que j'utilise le plus

 

pour le visual lisp, j'aimerai bien l'apprendre, mais tant que il y a pas un livre en francais ou italien c'est pas possible pour moi

 

possible que personne n'edite un livre sur le vlisp en francais???

 

[Edité le 20/5/2008 par ingoenius]

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é