Aller au contenu

rotation attribut scu


Messages recommandés

Posté(e)

Bonjour à tous,

Je bloque sur un point :

 

J'ai des blocs qui ont un attribut ! Lorsque ce bloc est inséré dans un plan qui a un scu particulier, si le dessinateur n'a pas fait atention le texte peut être mal orienté.

 

Comment par une simple sélection réorienter le texte de cet attribut sur le scu courant !

 

Daniel

Posté(e)

Bonjour à toutes et tous,

 

Tu lances le lisp =>

 

Si tu tapes en ligne de commande ROT0 =>

 

Activation de l'angle des Attributs à 0

 

Si tu tapes en ligne de commande SROT0 =>

 

Désactivation de l'angle 0 des Attributs

 

A régler suivant le choix que tu décides avant l'insertion de tes attributs !

 

Ce qui donne, suivant le choix =>

 

http://images1.hiboox.com/images/0609/74b2ba1acba91baaf8451228cfcd61ba.jpg

Civil 3D 2025 - COVADIS_18.3b

https://www.linkedin...3%ABt-95313341/

Posté(e)

Bonsoir,

 

Comme je ne souhaite changer qu'une partie des étiquettes d'attribut, celles mal orientées, j'ai essayé la routine ci-aprés :

 

(defun c:rAttScu ()
; Permet le sélection d'une entité qui doit être un bloc !
(while (not (setq ename (entsel "\nSelectionner un bloc dont l'attribut est à orienter sur le SCU: "))))
; donne le nom de l'entité: 
(setq ename (car ename))
; donne la liste des codes DXF
(setq ent (entget ename))

(setq entb (cdar (entget ename)))

(setq blk (vlax-ename->vla-object entb))
(if (and (= (vla-get-hasattributes blk) :vlax-true)
	 (safearray-value (setq atts (vlax-variant-value (vla-getattributes blk))))
)
(progn
	(setq ucsxdir (getvar 'ucsxdir))
	(setq angle (* 180 (/ (atan (/ (cadr ucsxdir) (car ucsxdir))) 	3.141592654))) ; ( a, b , 0)  soit inv tg ( a / b )
	(if (< angle 0)
		(setq angle (+  360 angle))
	)
	(foreach tag (vlax-safearray->list atts)
		(vla-put-Rotation tag angle)
	)
)
)
(princ)
) 

 

Mais le résultat est surprenant la valeur récupérée correspond bien a l'angle mais celle inscrite est inexacte ???

 

Par exemple:

 

scu d'angle = 296.579

 

(0.447434 -0.894317 0.0)

l'angle extrait: -63.4208

 

mais l'angle inscrit par (vla-put-Rotation tag angle) est 72,7365...

 

C'est vrai que le travail avec des scu est assez particulier et pas évident a comprendre en programmation !

 

A+

 

Daniel OLIVES

Posté(e)

Salut,

 

L'angle de rotation d'un bloc telle que retournée par (cdr (assoc 50 ...)) ou (vla-get-Rotation ...) est toujours exprimé en radians , de la même façon quand une fonction LISP requiert une valeur d'angle comme argument, il doit être exprimé en radians.

Tu traduit l'angle en degrés, puis tu utilises ce résultat avec vla-put-Rotation.

D'autre part tu fais (setq angle ...), or angle est un symbole protégé (fonction LISP).

 

J'ai un peu simplifié ton LISP, il devrait fonctionner tant que lees plans XY du SCU courant et du SCO du bloc sont parallèles au plan XY du SCG.

 

(defun c:rAttScu (/ blk ang atts)
 (while
   (not
     (and
(setq blk
       (car
	 (entsel
	   "\nSelectionner un bloc dont l'attribut est à orienter sur le SCU: "
	 )
       )
)
(setq blk (vlax-ename->vla-object blk))
(= (vla-get-ObjectName blk) "AcDbBlockReference")
(= (vla-get-hasattributes blk) :vlax-true)
(setq atts (vlax-invoke blk 'GetAttributes))
     )
   )
    (princ "\nEntité non valide")
 )
 (setq ang (angle '(0. 0. 0.) (getvar "UCSXDIR")))
 (foreach att atts
   (vla-put-Rotation att ang)
 )
 (princ)
)

 

PS : tu peux noter les modifications :

- le contrôle de validité de l'entité sélectionnée,

- l'utilisation de (vlax-invoke blk 'GetAttributes) qui retourne directement une liste (au lieu d'un safearray),

- l'utilisationde la fonction angle pour l'angle du SCU courant et l'inutilité de faire des conversions en degrés.

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

Posté(e)

Bonjour Gile,

 

Merci pour ton aide (je suis plus a l'aise en VBA), maintenant je peux réorienter simplement les textes des attributs qui sont mal positionnés par rapport au "scu" courant !

 

Ce qui est pratique car plusieures personnes sont intervenues sur les fichiers et tous ne maitrises pas les SCU et sur le projet sité il y a 32 SCU différents !

Par contre une autre chose pratique, lorsque les scu sont nommés, je les importent si nécessaire via le lisp "scui" (voir autres forum ici!)

 

et j'ai créé via un lisp auto chargé pour cette affaire qui comporte les commandes de type:

 

 
(defun c:scuA () 
(command "_.ucs" "_r" "scuA" \r)
(command "repere" "_c")
(command "_zoom" "et")
)
(defun c:scusA () 
(command "_.ucs" "_s" "scuA" \r)
;(command "_zoom" "et")
)

 

Ce qui pernet d'appeler le scu avec le nom du batiment ou de la zone concernée !

 

Merci, bonne journée !

Daniel OLIVES

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é