CadXP: Rotation d'objets en masse sur leur axe - CadXP

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Rotation d'objets en masse sur leur axe

#1 L'utilisateur est hors-ligne   Fundream 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 829
  • Inscrit(e) : 25-novembre 11

Posté 26 juin 2020 - 14:53

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

#2 L'utilisateur est hors-ligne   Fundream 

  • ceinture noire 1er dan
  • Groupe : Membres
  • Messages : 829
  • Inscrit(e) : 25-novembre 11

Posté 26 juin 2020 - 16:18

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

#3 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 11 411
  • Inscrit(e) : 02-septembre 05

Posté 27 juin 2020 - 14:16

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 -
Développements sur mesure pour AutoCAD
Image IPB
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

2 utilisateur(s) en train de lire ce sujet
0 membre(s), 2 invité(s), 0 utilisateur(s) anonyme(s)