Aller au contenu

Messages recommandés

Posté(e)

Essayes le code suivant qui devrait répondre à tes souhaits.

 

Il bosse dans les blocs pour les attributs, mais cela oblige à faire une sélection unique en boucle.

 

Pour l'écart, dans le code, il est fixé à ces lignes (j'ai fais un rapport de 5):

ht_txt (/ (cdr (assoc 40 dxf_ent)) 5.0)

 

PS: outre le calque, je pompe aussi la couleur et l'épaisseur de trait attribué au texte

 

(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:box_text ( / ent_txt dxf_ent ins_point ht_txt lg_box ht_box ang_box pt_just lst_box transform diag_box)
(while (null (setq ent_txt (nentsel "\nChoix d'un MultiTEXTE ou TEXTE: "))))
(setq dxf_ent (entget (car ent_txt)))
(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 (atan (/ (caddr (assoc 11 dxf_ent)) (cadr (assoc 11 dxf_ent))))
			pt_just (cdr (assoc 71 dxf_ent))
		)
		(if (< (cadr (assoc 11 dxf_ent)) 0) (setq ang_box (+ pi ang_box)))
		(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 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))
	)
	((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)) 5.0)
			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))
	)
	(T
		(princ "\nN'est pas un TEXTE/TEXTE MultiLigne, ou non parallèle au SCG.")
		(setq lst_box nil)
	)
)
(cond
	(lst_box
		(entmake
			(append
				(list
					(cons 0 "LWPOLYLINE")
					(cons 100 "AcDbEntity")
					(assoc 67 dxf_ent)
					(assoc 410 dxf_ent)
					(assoc 8 dxf_ent)
					(if (assoc 62 dxf_ent) (assoc 62 dxf_ent) (cons 62 256))
					(if (assoc 6 dxf_ent) (assoc 6 dxf_ent) (cons 6 "BYLAYER"))
					(if (assoc 370 dxf_ent) (assoc 370 dxf_ent) (cons 370 -1))
					(cons 100 "AcDbPolyline")
					(cons 90 4)
					(cons 70 1)
				)
				(apply 'append
					(mapcar
						'(lambda (x10)
							(list (list 10 (car x10) (cadr x10)) '(42 . 0))
						)
						lst_box
					)
				)
				'((210 0.0 0.0 1.0))
			)
		)
	)
)
(princ)
)

 

[Edité le 8/11/2007 par bonuscad]

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

  • Réponses 63
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

Posté(e)

est-il possible de sélectionner plusieurs texte en même temps ?

est-il possible d'utiliser le jeux de sélection actif avant la commande pour mettre en boîte les texte précédemment sélectionnés ?

 

 

j'ai noté que ça ne marche pas pour :

- les Mtextes justifiés par le haut gauche avec une rotation de 91 à 269° inclus, pour les Textes tout va pour le mieux.

- les attributs non contenu dans un bloc ne sont pas pris en compte (je sais c'est pas bien d'utiliser ces attributs là, mais j'en trouve souvent sur les plans archi...)

 

 

Merci déjà pour ce travail, qui va me faire gagner du temps :-)

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

j'ai noté que ça ne marche pas pour :

- les Mtextes justifiés par le haut gauche avec une rotation de 91 à 269° inclus

 

J'ai édité le code, cela devrait aller mieux, merci pour le retour. ;)

 

es attributs non contenu dans un bloc ne sont pas pris en compte

Là, je n'ai pas trop saisi... pourrais tu faire un (entget (car (entsel))) sur le type d'entité que tu voudrais traiter et me coller le retour d'info DXF

 

est-il possible de sélectionner plusieurs texte en même temps ?

 

Si tu veux pouvoir traiter les Attributs dans les bloc, c'est non, autrement il faut reprendre le mode sélection comme fait dans "arround_text".

 

Cependant j'ai commencé à réfléchir à une solution de sélection (objet-unique-imbriqué/objet-multiple/implicite) dont voici une épure, je te laisse chercher (toi ou d'autre) dans cette voie.

 

((lambda ( / js tmp e_sel js_tmp n)

(setq js (ssadd) n -1)

(if (setq js_tmp (ssget "_I" '((0 . "*TEXT"))))

(repeat (sslength js_tmp)

(ssadd (ssname js_tmp (setq n (1+ n))) js)

(redraw (ssname js_tmp n) 3)

)

)

(princ "\nChoix des MultiTEXTE ou TEXTE: ")

(while (or (= 5 (car (setq tmp (grread t 5 2)))) (= 3 (car tmp)) (null js))

(cond

((= 3 (car tmp))

(setq e_sel (nentselp (cadr tmp)))

(if e_sel

(progn

(ssadd (car e_sel) js)

(redraw (car e_sel) 3)

)

(progn

(setq js_tmp (ssget '((0 . "*TEXT"))) n -1)

(cond

(js_tmp

(repeat (sslength js_tmp)

(ssadd (ssname js_tmp (setq n (1+ n))) js)

(redraw (ssname js_tmp n) 3)

)

)

)

)

)

)

)

)

(if js (sssetfirst nil js))

(prin1)

))

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

Posté(e)

Merci bonuscad pour ta réponse rapide : pour les attribut qui ne sont pas encore dans un bloc voilà le retour que code que tu m'a donné :

 

[Commande: (entget (car (entsel)))

 

Choix de l'objet: ((-1 . ) (0 . "ATTDEF") (330 .

d'entité: 7ef7fcf8>) (5 . "253") (100 . "AcDbEntity") (67 . 0) (410 . "Model")

(8 . "Calque1") (100 . "AcDbText") (10 -750.0 2350.0 0.0) (40 . 144.934) (1 .

"zerg") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 0) (11

0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (3 . "ergz")

(2 . "SDMUIB") (70 . 0) (73 . 0) (74 . 0))]

 

 

Merci pour la modification sur ton lisp qui fonctionne parfaitement pour les Multitextes et les textes, maintenant je vais de le faire marcher avec une sélection selectonscreen

 

 

[Edité le 12/11/2007 par sechanbask]

ATEGIE - Bureau d'Études Fluides

http://www.ategie.fr/uploads/ategie/ategie-at%C3%A9gie-bureau-%C3%A9tudes-etudes-fluides-logo-100x56.png

Exécution, Synthèse, Conception, Maîtrise d'Oeuvre, Audit, Chiffrage

www.ategie.fr

Posté(e)

La modification est très simple pour inclure les définitions d'attributs (les codes DXF sont équivalents aux textes).

 

donc pour modifier arround_text, il suffit de modifier

(setq js (ssget '((0 . "*TEXT") (-4 . "=") (210 0.0 0.0 1.0))) n -1)

en

(setq js (ssget '((0 . "*TEXT,ATTDEF") (-4 . "=") (210 0.0 0.0 1.0))) n -1)

 

et

((eq (cdr (assoc 0 dxf_ent)) "TEXT"))

en

((or (eq (cdr (assoc 0 dxf_ent)) "TEXT") (eq (cdr (assoc 0 dxf_ent)) "ATTDEF"))

 

 

De même pour box_text en modifiant

((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"))

)

en

((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"))

(and (equal (assoc 210 dxf_ent) '(210 0.0 0.0 1.0)) (eq (cdr (assoc 0 dxf_ent)) "ATTDEF"))

)

 

C'est vrai que l'utilisation de définitions d'attribut en dehors des blocs est surprenante ;)

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

Posté(e)

Comme j'ai fait un truc avec les textes/mtextes suivant jeurs justifications, j'y vais aussi de mon code.

 

Le décalage proposé par défaut (20% de la hauteur de texte courante) est exprimé en unité de dessin.

Il peut être modifier en faisant Entrée, Espace ou clic droit au lieu de sélectionner les textes.

La dernière valeur est conservée dans le dessin pendant la session et est proposée comme valeur par défaut au prochain lancement.

 

Ça semble fonctionner quelque soit la justification, la rotation, l'élévation et le SCO des objets sélectionnés.

 

;; CT (gile) 15/11/07
;; Encadre les textes (simples ou multilignes) sélectionnés

(defun c:ct (/ of n ss tx elst nor ref elv rot wid hgt jus org box plst	mat)
 (or *TextFrameOffset*
     (setq *TextFrameOffset* (/ (getvar "TEXTSIZE") 5.0))
 )
 (setq of *TextFrameOffset*)
 (princ (strcat "\nDécalage courant : "
	 (rtos of)
	 "\tSélectionnez les textes ou ."
 )
 )
 (while (not (setq ss (ssget '((0 . "*TEXT")))))
   (if	(setq of (getdist (strcat "\nSpécifiez le décalage du cadre 				  (rtos of)
			  ">: "
		  )
	 )
)
     (setq *TextFrameOffset* of)
     (setq of *TextFrameOffset*)
   )
 )
 (setq n -1)
 (while (setq tx (ssname ss (setq n (1+ n))))
   (if	(= "MTEXT" (cdr (assoc 0 (setq elst (entget tx)))))
     (setq nor	 (cdr (assoc 210 elst))
    ref	 (trans (cdr (assoc 10 elst)) 0 nor)
    elv	 (caddr ref)
    rot	 (angle '(0 0 0) (trans (cdr (assoc 11 elst)) 0 nor))
    wid	 (cdr (assoc 42 elst))
    hgt	 (cdr (assoc 43 elst))
    jus	 (cdr (assoc 71 elst))
    org	 (list
	   (cond
	     ((member jus '(2 5 8)) (/ wid -2))
	     ((member jus '(3 6 9)) (- wid))
	     (T 0.0)
	   )
	   (cond
	     ((member jus '(1 2 3)) (- hgt))
	     ((member jus '(4 5 6)) (/ hgt -2))
	     (T 0.0)
	   )
	 )
    plst (mapcar
	   (function
	     (lambda (p)
	       (mapcar '+ org p)
	     )
	   )
	   (list
	     (list (- of) (- of))
	     (list (+ wid of) (- of))
	     (list (+ wid of) (+ hgt of))
	     (list (- of) (+ hgt of))
	   )
	 )
     )
     (setq box	 (textbox elst)
    ref	 (cdr (assoc 10 elst))
    rot	 (cdr (assoc 50 elst))
    plst (list
	   (list (- (caar box) of) (- (cadar box) of))
	   (list (+ (caadr box) of) (- (cadar box) of))
	   (list (+ (caadr box) of) (+ (cadadr box) of))
	   (list (- (caar box) of) (+ (cadadr box) of))
	 )
     )
   )
   (setq mat  (list (list (cos rot) (- (sin rot)) 0)
	     (list (sin rot) (cos rot) 0)
	     '(0 0 1)
       )
  plst (mapcar
	 (function
	   (lambda (p)
	     (cons 10
		   (mapcar '+ (mxv mat p) (list (car ref) (cadr ref)))
	     )
	   )
	 )
	 plst
       )
   )
   (entmake
     (append
(list '(0 . "LWPOLYLINE")
      '(100 . "AcDbEntity")
      (assoc 8 elst)
      '(100 . "AcDbPolyline")
      '(90 . 4)
      '(70 . 1)
      (cons 38 (caddr ref))
      (assoc 210 elst)
)
plst
     )
   )
 )
 (princ)
)

;; Applique une matrice de transformation à un vecteur (Vladimir Nesterovsky)
(defun mxv (m v)
 (mapcar (function (lambda (r) (apply '+ (mapcar '* r v))))
  m
 )
) 

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

Posté(e)

 

Hello Gilles - Encore MERCI

 

Je viens de tester ton CT sur AutoCAD 2004 et 2008, donc on peut supposer que ca fonctionne aussi sur 2005 / 2006 / 2007 !? :)

 

Comme d'hab, c nickel-chrome :D

 

Par contre, j'imagine tout de suite une variante : obtenir un masque d'arriere plan et non pas un simple rectangle autour du TEXT / MTEXT !

 

Mais, mais, les masques ne sont possibles que sur les MTEXT, donc ca me pose un problème !

Je n'envisage pas du tout de transformer les TEXT en MTEXT !!

 

Donc j'imagine l'option suivante, dessiner le rectangle et (en plus) une hachure de type solid dont la couleur sera (Question à poser au début) ... ;)

 

Les priorités d'affichage en montant seraient bien sur :

Hachure puis Rectangle puis le TEXT ou MTEXT

 

On pourra toujours par une sélection rapide resortir les rectangles et hachures pour les mettre (si nécessaire) sur un autre calque !

 

Le Decapode "chiant"

 

 

 

Autodesk Expert Elite Team

Posté(e)

Bah pas forcément une hachure, puisqu'une hachure change de couleur en fonction de la couleur d'affichage...

 

Ptet plutot une image !

Ca ressemble fortement à l'outil express, mais en muitligne, et en mieux !

 

Je trouve que le décapode, malgré son poids, a de bonnes idées :thumbup:

Désolé, je charrie...

 

A bientot

Matt.

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

Posté(e)

.... et bien moi, je vais titiller beaucoup plus (gile) je pense.....

Déjà, bravo pour ton code (gile) !

 

Mais un truc bluffant que je pense être possible (... pour les connaisseurs des réacteurs ! ;) )

Grouper le texte et le cadre, et si l'on modifie le textes, le cadre suit !....

mmmm ? ;) ;) :P

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

 

Hello

 

Non désolé, je pense que la hachure SOLID, c mieux car elle peut être de couleur soit DUCALQUE, soit en couleur forcée et plus particulièrement en couleur RGB 16M qui va permettre d'obtenir un fond de couleur palichonne/pastel du plus bel effet !

 

On pourrait aussi envisager de poser la question de la couleur du rectangle

soit DUCALQUE, soit couleur forcée !?

 

N'oublions pas que ce dessin pourrait être repris par un AutoCAD LT :casstet:

 

Le Decapode qui reste sur ses positions ... :mad:

 

 

Autodesk Expert Elite Team

Posté(e)

Et voilà,

tu leur donne ça : -

et tout de suite ils veulent ça : --------------------------------------------------

;)

 

Je vais essayer de répondre dans l'ordre

 

Matt666,

 

la fonction function équivaut à la fonction quote (') :

(mapcar (function (lambda ...))) fonctionne comme (mapcar '(lambda ...))

mais elle permet de lier et d'optimiser la fonction dans le compileur Visual LISP comme si c'était une fonction prédéfinie ou un defun.

 

lecrabe,

 

je vais essayer de voir ce que je peux faire...

 

Bred,

 

alors toi tu exagères !

je ne maîtrise pas vraiment les réacteurs, et en plus, ça demanderais de tout ré-écrire en Visual LISP...

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

Posté(e)

Le décapode Têtu :) :

Oui c'est vrai. Plus simple à coder, en plus ! Par contre pour ACLT, vu qu'ils n'ont pas de possibilité de lisp, ça change pas grand chose (les pauvres !!)...

 

Gile :

Ah ok d'ac !

Merci pour la précision..

 

[Edité le 15/11/2007 par Matt666]

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

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é