Aller au contenu

Echelle et Rotation relatives sur TEXT/MTEXT


lecrabe

Messages recommandés

 

Hello

 

SVP je desire une routine qui agissent de 2 facons sur les TEXT/MTEXT

avec une selection AutoCAD classique :)

J'ai cherche mais je n'ai pas trouve !

 

Changement d'echelle relatif ET changement de rotation relatif

 

TROT & TSCALE qui demandent

- soit un facteur d'echelle = +/- xx.xx

- soit un facteur de rotation = +/- xx.xx

 

Par exemple, tous les TEXT & MTEXT vont changer relativement d'echelle et DIMINUER de UN TIERS car j'ai donne le facteur : -1.333

 

Par exemple, tous les TEXT & MTEXT vont tourner relativement de 45 degres (Sens Trigo) car j'ai donne une rotation de : 45.0

Donc si possible, interpretation du systeme d'angle et du sens

 

Merci d'avance, Le Decapode (Tripatouilleur de textes)

 

 

 

 

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

Salut !

Un truc un peu comme ça ?

(defun fonction_relative (i c / sel r n cmdecho ent)
   (defun CPE_Error (msg)
       (if (/= msg "Fonction annulée")
           (princ (strcat "\nErreur -> " msg))
       )
       (command "_.undo" "_end")
       (setvar "CMDECHO" cmdecho)
       (setq 
           *error* m:err
           m:err nil
       )
       (princ)
   )
   (setq m:err *error* *error* CPE_Error)

   (if (and 
           (setq sel (ssget (list (cons 0 "TEXT,MTEXT"))))
           (setq r (getreal i))
       )
       (progn
           (setq 
               n 0
               cmdecho (getvar "cmdecho")
           )
           (setvar "cmdecho" 0)
           (command "_.undo" "d")
           (while (< n (sslength sel))
               (setq 
                   ent (ssname sel n)
                   n (1+ n)
               )
               (command c ent "" (cdr (assoc 10 (entget ent))) r)
           )
           (redraw)
           (command "_.undo" "f")
           (setvar "cmdecho" cmdecho)
           
       )
   )
   (setq *error* m:err m:err nil)
   (princ)
)

;;; Echelle relative
(defun c:srel ()
   (fonction_relative "\nFacteur d'échelle : " "_scale")
   (princ)
)

;;; Rotation relative
(defun c:rrel ()
   (fonction_relative "\nRotation : " "_rotate")
   (princ)
)

Entrer "SREL" pour echelle relative et "RREL" pour rotation relative.

 

[Edité le 28/10/2009 par Matt666]

"Chacun compte pour un, et nul ne compte pour plus d'un."

Lien vers le commentaire
Partager sur d’autres sites

Deux de mes créations qui datent un peu! (Une gagnerai a être réécrite: la seconde ...). Mais d'autre vont certainement faire quelque chose de plus conscis.

 

En attendant...

 

((lambda ( / jsel scal_txt nbr_txt ent_dxf)
(princ "\nSélectionner les textes à modifier: ")
(setq jsel
	(ssget
		'((-4 . "				(0 . "TEXT")
			(0 . "MTEXT")
		(-4 . "OR>"))
	)
)
(cond
	(jsel
		(initget 7)
		(setq
			scal_txt (getreal "\nEchelle de transformation pour la taille des textes selectionnés: ")
			nbr_txt 0
		)
		(repeat (sslength jsel)
			(setq ent_dxf (entget (ssname jsel nbr_txt)))
			(entmod
				(subst
					(cons 40 (* scal_txt (cdr (assoc 40 ent_dxf))))
					(assoc 40 ent_dxf)
					ent_dxf
				)
			)
			(setq nbr_txt (1+ nbr_txt))
		)
		(princ (strcat (itoa nbr_txt) " ligne(s) de texte a (ont) changé(s) de taille."))
	)
	(T (princ "\nAucun Texte ou MTexte trouvé."))
)
(prin1)	
))

 

(defun transpts (apt matrix / )
(list
	(+
		(* (car (nth 0 matrix)) (car apt))
		(* (car (nth 1 matrix)) (cadr apt))
		(* (car (nth 2 matrix)) (caddr apt))
		(cadddr (nth 0 matrix))
	)
	(+
		(* (cadr (nth 0 matrix)) (car apt))
		(* (cadr (nth 1 matrix)) (cadr apt))
		(* (cadr (nth 2 matrix)) (caddr apt))
		(cadddr (nth 1 matrix))
	)
	(+
		(* (caddr (nth 0 matrix)) (car apt))
		(* (caddr (nth 1 matrix)) (cadr apt))
		(* (caddr (nth 2 matrix)) (caddr apt))
		(cadddr (nth 2 matrix))
	)
)
)
(defun v_matr (dpt alphax alphay alphaz echx echy echz / )
(list
	(list
		(* echx (cos alphaz) (cos alphay))
		(- (sin alphaz))
		(sin alphay)
		(car dpt)
	)
	(list
		(sin alphaz)
		(* echy (cos alphaz) (cos alphax))
		(- (sin alphax))
		(cadr dpt)
	)
	(list
		(- (sin alphay))
		(sin alphax)
		(* echz (cos alphax) (cos alphay))
		(caddr dpt)
	)
	(list 0.0 0.0 0.0 1.0)
)
)
(defun c:pivotext ( / jsel n angplus pt_base dxf_ent ins_point ht_txt lg_box ht_box ang_box pt_just lst_box transform diag_box)
(princ "\nSélectionner les Textes/MTextes à faire pivoter sur leur point central: ")
(setq jsel (ssget '((0 . "*TEXT"))) n -1)
(cond
	(jsel
		(initget 1)
		(setq angplus (getangle "\nAngle à rajouter pour faire pivoter les textes selectionnés: "))
		(initget "Insertion MCentre _Insert MCenter")
		(if (eq (getkword "\nRotation des textes par rapport au point [insertion/MCentre]? : ") "MCenter")
			(setq pt_base T)
			(setq pt_base nil)
		)
(repeat (sslength jsel)
(setq dxf_ent (entget (ssname jsel (setq n (1+ n)))))
(cond
	((and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "MTEXT"))
		(setq
			ins_point (cdr (assoc 10 dxf_ent))
			ht_txt (/ (cdr (assoc 40 dxf_ent)) 5.0)
			lg_box (cdr (assoc 42 dxf_ent))
			ht_box (cdr (assoc 43 dxf_ent))
			ang_box (cdr (assoc 50 dxf_ent))
			pt_just (cdr (assoc 71 dxf_ent))
		)
		(setq lst_box
			(list 
				(list (- ht_txt) ht_txt 0.0)
				(list (+ lg_box ht_txt) ht_txt 0.0)
				(list (+ lg_box ht_txt) (- 0.0 ht_box ht_txt) 0.0)
				(list (- ht_txt) (- 0.0 ht_box ht_txt) 0.0)
			)
		)
		(cond
			((eq pt_just 1)
				(setq transform (v_matr (list 0.0 0.0 0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
			((eq pt_just 2)
				(setq transform (v_matr (list (- (/ lg_box 2.0)) 0.0 0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
			((eq pt_just 3)
				(setq transform (v_matr (list (- lg_box) 0.0  0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
			((eq pt_just 4)
				(setq transform (v_matr (list 0.0 (+ (/ ht_box 2.0)) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
			((eq pt_just 5)
				(setq transform (v_matr (list (- (/ lg_box 2.0)) (/ ht_box 2.0) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
			((eq pt_just 6)
				(setq transform (v_matr (list (- lg_box) (/ ht_box 2.0) 0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
			((eq pt_just 7)
				(setq transform (v_matr (list 0.0 ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
			((eq pt_just 8)
				(setq transform (v_matr (list (- (/ lg_box 2.0)) ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
			((eq pt_just 9)
				(setq transform (v_matr (list (- lg_box) ht_box 0.0) 0.0 0.0 0.0 1.0 1.0 1.0))
			)
		)
		(setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box))
		(setq transform (v_matr (trans ins_point 0 1) 0.0 0.0 (- ang_box) 1.0 1.0 1.0))
		(setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box))
	)
	((or
		(and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "TEXT"))
		(and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTRIB"))
	 )
		(setq
			diag_box (textbox dxf_ent)
			ins_point (cdr (assoc 10 dxf_ent))
			ht_txt (cdr (assoc 40 dxf_ent))
			ang_box (cdr (assoc 50 dxf_ent))
		)
		(setq lst_box
			(list
				(list (- (caar diag_box) ht_txt) (- (cadar diag_box) ht_txt) 0.0)
				(list (+ (caadr diag_box) ht_txt) (- (cadar diag_box) ht_txt) 0.0)
				(list (+ (caadr diag_box) ht_txt) (+ (cadadr diag_box) ht_txt) 0.0)
				(list (- (caar diag_box) ht_txt) (+ (cadadr diag_box) ht_txt) 0.0)
			)
		)
		(setq transform (v_matr ins_point 0.0 0.0 (- ang_box) 1.0 1.0 1.0))
		(setq lst_box (mapcar '(lambda (x) (transpts x transform)) lst_box))
		(setq lst_box (mapcar '(lambda (x) (trans x 0 1)) lst_box))
	)
	(T
		(princ "\nN'est pas un TEXTE/TEXTE MultiLigne, ou non parallèle au SCG.")
		(setq lst_box nil)
	)
)
(cond
	(lst_box
		(if pt_base
			(if (eq (cdr (assoc 0 dxf_ent)) "TEXT")
				(setq
					dxf_ent (subst (cons 72 1) (assoc 72 dxf_ent) dxf_ent)
					dxf_ent (subst (cons 73 2) (assoc 73 dxf_ent) dxf_ent)
					dxf_ent (subst (cons 11 (trans (mapcar '(lambda (x y) (/ (+ x y) 2.0)) (car lst_box) (caddr lst_box)) 1 (cdar dxf_ent))) (assoc 11 dxf_ent) dxf_ent)
				)
				(setq
					dxf_ent (subst (cons 71 5) (assoc 71 dxf_ent) dxf_ent)
					dxf_ent (subst (cons 10 (trans (mapcar '(lambda (x y) (/ (+ x y) 2.0)) (car lst_box) (caddr lst_box)) 1 (cdar dxf_ent))) (assoc 10 dxf_ent) dxf_ent)
				)
			)
		)
		(setq dxf_ent (subst (cons 50 (rem (+ (cdr (assoc 50 dxf_ent)) angplus) (* 2 pi))) (assoc 50 dxf_ent) dxf_ent))
		(entmod dxf_ent)
	)
)
)
	)
)
(print (1+ n))
(princ " ligne(s) de texte a (ont) tourné à ")
(princ (angtos angplus))
(if pt_base (princ " et points d'alignement fixés à MCentre"))
(prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

 

Hello Matt666

 

Je viens de tester ta routine dans MAP 2006 et dans MAP 2010, ca marche bien ! :)

 

Bien entendu, il faut manipuler dans le SCG (et non pas dans un SCU)

MAIS cela me convient tout a fait !! :D

 

Je n'ai pas teste la version Bonuscad, mais j'ai confiance et je suppose qu'elle gere les SCus vu la complexite et les matrices de transformation ... :casstet:

 

Encore Merci pour vos efforts et votre aide, Le Decapode

 

 

 

Autodesk Expert Elite Team

Lien vers le commentaire
Partager sur d’autres sites

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é