(gile) Posté(e) le 23 juin 2007 Posté(e) le 23 juin 2007 Suite à cette discussion, j'ai fait une petite routine qui permet de pivoter les objets sélectionnés (textes, mtextes et références de bloc) sur le plan de la vue courante quelque soit la position initiale de chaque objet.La routine fonctionne en 3D (je pense que c'est là qu'elle peut être utile).Les objets pivotent sur leurs points d'insertion.Les attributs des blocs suivent. Version corrigée : ne prends plus en compte la variable VIEWTWIST ;; Pivote les textes et blocs dans le plan de la vue courante (defun c:r2v (/ doc nor ins dir mat) (vl-load-com) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-StartUndoMark doc) (if (ssget '((0 . "INSERT,*TEXT"))) (vlax-for obj (vla-get-ActiveSelectionSet doc) (setq nor (vlax-get obj 'Normal) ins (vlax-get obj 'InsertionPoint) dir (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0) ) mat (mxm (mapcar '(lambda (x) (trans x 0 dir T)) '((1 0 0) (0 1 0) (0 0 1)) ) (mapcar '(lambda (x) (trans x nor 0 T)) '((1 0 0) (0 1 0) (0 0 1)) ) ) ) (vla-TransformBy obj (vlax-tmatrix (append (mapcar '(lambda (v1 v2) (append v1 (list v2)) ) mat (mapcar '- ins (mxv mat ins)) ) (list '(0 0 0 1)) ) ) ) ) ) (vla-EndUndoMark doc) (princ) ) ;; Retourne le produit scalaire (réel) de deux vecteurs (defun vxv (v1 v2) (apply '+ (mapcar '* v1 v2)) ) ;; Transpose une matrice Doug Wilson (defun trp (m) (apply 'mapcar (cons 'list m)) ) ;; Applique une matrice de transformation à un vecteur Vladimir Nesterovsky (defun mxv (m v) (mapcar '(lambda (r) (vxv r v)) m) ) ;; Multiplie deux matrices Vladimir Nesterovsky (defun mxm (m q) (mapcar '(lambda (r) (mxv (trp q) r)) m) ) [Edité le 24/6/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 23 juin 2007 Posté(e) le 23 juin 2007 Salut (gile),j'ai fait un petit test de ta routine, et si je l'ai bien compris j'ai une erreur :si je me met en vue parrallèle au SCG (face, gauche...) et en vue isométrique S-O, S-E ... ça fonctionne.Par contre, si je me met en vue "quelquonque", mon bloc ne s'aligne pas sur cette vue. Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 23 juin 2007 Auteur Posté(e) le 23 juin 2007 Exact, je viens de découvrir une curiosité. La routine fonctionne avec les vues prédéfinies, avec l'orbite3d "contrainte" et, semble-t-il aussi, avec les vues faites avec la commande VUEDYN, mais ne marche pas si la vue est issue d'une orbite 3d "libre". :casstet: Je vais creuser ça, maerci pour le retour ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 juin 2007 Auteur Posté(e) le 24 juin 2007 Je pense avoir trouvé une "solution" : ignorer la variable VIEWTWIST. Les blocs et textes sont bien mis dans un plan parallèle à celui de la vue courante mais peuvent avoir une rotation dans ce plan (si VIEWTWIST est différent de 0.0). Remettre les objets à l'horizontale dans la vue entrainerait un changement de la rotation dans les données du bloc ou du texte. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
fabdo Posté(e) le 25 juin 2007 Posté(e) le 25 juin 2007 salut, Apparemment ta routine fonctionne bien pour moi en faisant des rotations successives autour des axes X, Y, Z, j'arrive bien à effectuer les rotations désirées (sur les blocs), et j'ai trouvé un moyen (pas trop dans les régles de l'art quoique) pour dessiner mes façades. Je te remercie encore!!! Bonne journée!
(gile) Posté(e) le 30 juin 2007 Auteur Posté(e) le 30 juin 2007 Dans le genre "pourquoi faire simple quand on peut faire compliqué", je me pose là avec le LISP donné ci-dessus ! J'aurais pu/du tout simplement écrire : ;; Pivote les textes et blocs dans le plan de la vue courante (defun c:r2v (/ doc ins dir att) (vl-load-com) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-StartUndoMark doc) (if (ssget '((0 . "INSERT,*TEXT"))) (vlax-for obj (vla-get-ActiveSelectionSet doc) (setq ins (vla-get-InsertionPoint obj) dir (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0) ) ) (vla-put-Normal obj (vlax-3d-point dir)) (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference") (setq att (vlax-invoke obj 'GetAttributes)) ) (foreach a att (vla-put-Normal a (vlax-3d-point dir))) ) (vla-put-InsertionPoint obj ins) ) ) (vla-EndUndoMark doc) (princ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
GEGEMATIC Posté(e) le 29 août 2007 Posté(e) le 29 août 2007 Salut et merci pour ce truc génial!J'ai ce projet en chantier depuis 2 ans, je l'avais, pour le fun, fait en VBA, car l'exemple transformby dont j'étais parti était en VBA.Je me suis heurté rapidement au problème de l'inversion de matrice, et au stockage de la dernière matrice utilisée, ce qui n'est pas simple en vba ... la ton truc est vraiment simple, il fallait y penser ...Par contre, il reste le problème du point d'insertion des attaributs:J'ai donc modifié le code pour que les attribut reste dans le plan de leur bloc:c'est mieux, mais ce n'est pas parfait:dans bien des cas, il reste un décalage en z égal au delta y entre le point d'insertion du bloc et le pt d'insertion de l'attribut:je ne comprends vraiment pas ? ;; Pivote les textes et blocs dans le plan de la vue courante ;;version ultra simple par Gile : ;;http://www.cadxp.com/sujetXForum-15754.htm (defun c:r2v (/ doc ins dir att attins) (vl-load-com) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))) (vla-StartUndoMark doc) (if (ssget '((0 . "INSERT,*TEXT"))) (vlax-for obj (vla-get-ActiveSelectionSet doc) (setq ins (vla-get-InsertionPoint obj) dir (mapcar '- (trans (getvar "viewdir") 1 0) (trans '(0 0 0) 1 0) ) ) (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference") (setq att (vlax-invoke obj 'GetAttributes)) ) ;;traite les attributs ;;stocke le pt d'insertion et normalise (setq att (mapcar '(lambda (a) (setq attins (vla-get-InsertionPoint a)) (vla-put-Normal a (vlax-3d-point dir)) (list a attins) ) att ) ) ) ;;traite les blocs : noprmalise et repositionne (vla-put-Normal obj (vlax-3d-point dir)) (vla-put-InsertionPoint obj ins) ;;traite les attributs ;;repositionne (foreach a att (vla-put-InsertionPoint (car a) (cadr a)) ) ) ) (vla-EndUndoMark doc) (princ) ) ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
(gile) Posté(e) le 1 septembre 2007 Auteur Posté(e) le 1 septembre 2007 Salut, Il me semble me souvenir avoir vu ce problème, mais je ne m'étais pas plus que ça penché dessus, et avais opté pour l'utilisation de la première routine (avec les matrices de transformation) qui elle, fonctionne sans soucis. Merci d'avoir réveillé le sujet et ma mémoire. Donc, aux utilisateurs de R2V, préférez la première version. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Carboleum Posté(e) le 12 mars 2013 Posté(e) le 12 mars 2013 Merci Giles et Gege!Voilà bien une commande très pratique! Carboléüm, qui dessine aussi à la main -> Carboleum's sketchblog
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