Aller au contenu

Rotation d'objets en masse sur leur axe


Messages recommandés

Posté(e)

Bonjour,

J'ai un dessin avec énormément de blocs identiques insérés dans l'espace mais 50% d'entre eux ont été inséré dans un mauvais SCU.J'aimerai pouvoir tourner tout ce beau monde de 90° autour de leur propre axe X (SCU OB) en une seule fois.Un petit lisp existe il ?

Merci

 

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Posté(e)

Bon je me suis basé sur un lisp existant et j'ai réussi à sortir ça qui semble fonctionner :

(defun c:rotmult ()
 (prompt "Selectionner les objets à tourner")
 (setq ss (ssget))
 (if (not ss) (setq ss (ssx)))
 (setq num (sslength ss))
 (setq x 0)
 (setq axe (getstring nil "Axe de rotation (X/Y/Z): "))
 (if ss 
 	(if (setq ang (getreal "Angle de rotation: "))
  	(repeat num
	  	(setq ename (ssname ss x))
		(setq elist (entget ename))
		(command "scu" "ob" ename)
		(command "3DRotation" ename "" axe "" ang)
			(setq x (1+ x))
		)
  	)
)
 )

 

Autocad 2015 - Lumion 3D - SCIA Engineer

I7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.

Posté(e)

Salut,

 

C'est bien que tu sois arrivé à tes fins tout seul.

 

Un exemple qui utilise des fonctions issues de la bibliothèque MathGeom en bas de cette page pour éviter le SCU objet.

 

;; TRP
;; Transpose une matrice -Doug Wilson-
;;
;; Argument
;; m : une matrice
(defun trp (m) (apply 'mapcar (cons 'list m)))

;; MXV
;; Applique une matrice de transformation à un vecteur -Vladimir Nesterovsky-
;;
;; Arguments-
;; m : une matrice
;; v : un vecteur
(defun mxv (m v)
 (mapcar (function (lambda (r) (apply '+ (mapcar '* r v))))
  m
 )
)

;; MXM
;; Multiplie (combine) deux matrices -Vladimir Nesterovsky-
;;
;; Arguments
;; m : une matrice
;; v : une matrice
(defun mxm (m q)
 (mapcar (function (lambda (r) (mxv (trp q) r))) m)
)

;; gc:TransformBy
;; Applique la matrice de transformation (4x4) au point
;;
;; Arguments
;; pt : un point
;; mat : une matrice 4x4
(defun gc:TransformBy (pt mat)
 ((lambda (m d)
    (mapcar '+ (mxv m pt) d)
  )
   (list
     (list (caar mat) (cadar mat) (caddar mat))
     (list (caadr mat) (cadadr mat) (caddr (cadr mat)))
     (list (caaddr mat) (cadr (caddr mat)) (caddr (caddr mat)))
   )
   (list (cadddr (car mat))
  (cadddr (cadr mat))
  (cadddr (caddr mat))
   )
 )
)

;; gc:BlockTransform
;; Retourne la matrice de transformation d'une référence de bloc.
;; Matrice 4x4 telle que renvoyée par nentsel.
;;
;; Argument
;; ename : le nom d'entité de la référence de bloc
(defun gc:BlockTransform (ename / elst ang norm)
 (setq	elst (entget ename)
ang  (cdr (assoc 50 elst))
norm (cdr (assoc 210 elst))
 )
 (append
   (mapcar
     (function
(lambda	(v1 v2)
  (append v1 (list v2))
)
     )
     (setq mat
     (mxm
       (mapcar (function (lambda (v) (trans v 0 norm T)))
	       '((1. 0. 0.) (0. 1. 0.) (0. 0. 1.))
       )
       (mxm
	 (list (list (cos ang) (- (sin ang)) 0.)
	       (list (sin ang) (cos ang) 0.)
	       '(0. 0. 1.)
	 )
	 (list (list (cdr (assoc 41 elst)) 0. 0.)
	       (list 0. (cdr (assoc 42 elst)) 0.)
	       (list 0. 0. (cdr (assoc 43 elst)))
	 )
       )
     )
     )
     (mapcar
'-
(trans (cdr (assoc 10 elst)) norm 0)
(mxv mat
     (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 elst)))))
)
     )
   )
   '((0. 0. 0. 1.))
 )
)

(defun c:rotmult (/ axe rot ss i br xform pt1 pt2)
 (if
   (and
     (progn
(initget 1 "X Y Z")
(setq axe (getkword "\nAxe de rotation [X/Y/Z]: "))
     )
     (setq rot (getangle "\nRotation: "))
     (setq ss (ssget '((0 . "INSERT"))))
   )
    (repeat (setq i (sslength ss))
      (setq br	   (ssname ss (setq i (1- i)))
     xform (gc:BlockTransform br)
     pt1   (gc:TransformBy '(0. 0. 0.) xform)
     pt2   (cond
	     ((= axe "X") (gc:TransformBy '(1. 0. 0.) xform))
	     ((= axe "Y") (gc:TransformBy '(0. 1. 0.) xform))
	     ((= axe "Z") (gc:TransformBy '(0. 0. 1.) xform))
	   )
      )
      (vla-Rotate3d
 (vlax-ename->vla-object br)
 (vlax-3d-point pt1)
 (vlax-3d-point pt2)
 rot
      )
    )
 )
 (princ)
)

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

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é