Fundream Posté(e) le 26 juin 2020 Posté(e) le 26 juin 2020 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 EngineerI7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.
Fundream Posté(e) le 26 juin 2020 Auteur Posté(e) le 26 juin 2020 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 EngineerI7 6700K 4 cores @4.0Ghz - 32Go DDR4 - GTX980ti 6Gb - SSD 512Go - Windows 7 64 bits.
(gile) Posté(e) le 27 juin 2020 Posté(e) le 27 juin 2020 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant