Aller au contenu

Aligner textes et blocs sur la vue courante


(gile)

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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!

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

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

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

  • 5 ans aprè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 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é