Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

WWWWW et iiiii ne fait pas la même taille dans un dessin Autocad.

 

Comment récupère t'on la taille d'un texte? (l'emprise exacte dans le dessin)

 

Pour un texte // au SCU un zoom sur l'objet permet de récupérer, mais dés qu'il est rotationné, c'est mort....

 

Pas d'autre idée... :huh:

Posté(e)

Salut,

 

Sinon en lisp avec textbox l'expression suivante retourne une liste (x y z) représentant l'encombrement du texte..

 

((lambda (lst) (mapcar '- (cadr lst) (car lst))) (textbox (list (assoc 1 (entget (car (nentsel)))))))

A+

Apprendre => Prendre => Rendre

Posté(e)

j'ai fait cela grace a l'aide

 

(longeff (vlax-ename->vla-object (car (entsel "\nSélectionnez l'objet: "))))

(defun  longeff ( vlaobj / pt1 pt2)

(vla-GetBoundingBox vlaobj 'pt1 'pt2)

(- (car(vlax-safearray->list pt2)) (car (vlax-safearray->list pt1)))

)

 

Mais je vais allez me balader dans vos exemples pour voir comment vous vous dépatouillez du SCU... :D

Posté(e)

Dans le mien tu verra aucun problème de scu n'y de rotation ;)

 

c'est vrai, mais textbox ne fonctionne qu'avec des objets de type TEXT. Avec les MTEXT ça marche beaucoup moins bien.

 

(setq tb (textbox (list (cons -1 (car (entsel))))))

 

renvoi nil pour un texte MTEXT. Et c'est bien dommage, à moins que ça ait changé dernièrement ?

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

J'utiliserais la fonction textbox pour les textes simples et les groupes DXF 42 et 43 pour les textes multilignes. On trouveras un exemple dans Cadre&Masque.lsp avec la routine Text2box-plst qui retourne la liste de points du cadre du texte dans son SCO (donc indépendamment du SCU courant).

 

S'il s'agit juste de la largeur et la hauteur du texte, la routine ci dessous fonctionne quelle que soit le système de coordonnées dans lequel a été créé le texte (ou mtext) :

 

(defun textdims (text / elst box)
 (setq elst (entget text))
 (cond
   ((= "TEXT" (cdr (assoc 0 elst)))
    (setq box (textbox elst))
    (reverse (cdr (reverse (mapcar '- (cadr box) (car box)))))
   )
   ((= "MTEXT" (cdr (assoc 0 elst)))
    (list (cdr (assoc 42 elst)) (cdr (assoc 43 elst)))
   )
 )
)

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

Posté(e)

Re,

 

Pour les sommets du rectangle englobant un texte ou mtexte (coordonnées SCG) quels que soient le plan de construction, la justification et la rotation du texte, on peut utiliser la routine suivante :

 

;; gc:TextBox (gile)
;; Retourne la liste des sommets (coordonnées SCG) de la boite englobant le texte
;;
;; Argument
;; ent : le nom d'entité du texte ou mtexte

(defun gc:TextBox (ent / elst nor ref rot wid hgt jus org box pts mat)
 (setq elst (entget ent))
 (if (= "MTEXT" (cdr (assoc 0 elst)))
   (setq nor (cdr (assoc 210 elst))
  ref (trans (cdr (assoc 10 elst)) 0 nor)
  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)
	)
      )
  pts (mapcar
	(function
	  (lambda (p)
	    (mapcar '+ org p)
	  )
	)
	(list
	  '(0. 0.)
	  (list wid 0.)
	  (list wid hgt)
	  (list 0. hgt)
	)
      )
   )
   (setq box (textbox elst)
  nor (cdr (assoc 210 elst))
  ref (cdr (assoc 10 elst))
  rot (cdr (assoc 50 elst))
  pts (list
	(list (caar box) (cadar box))
	(list (caadr box) (cadar box))
	(list (caadr box) (cadadr box))
	(list (caar box) (cadadr box))
      )
   )
 )
 (setq	mat (list
      (list (cos rot) (- (sin rot)) 0.)
      (list (sin rot) (cos rot) 0.)
      '(0. 0. 1.)
    )
 )
 (mapcar
   (function
     (lambda (p)
(trans (mapcar '+ (mxv mat p) ref) nor 0)
     )
   )
   pts
 )
)

;; MXV
;; 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)

Bonjour,

 

c'est vrai, mais textbox ne fonctionne qu'avec des objets de type TEXT. Avec les MTEXT ça marche beaucoup moins bien.

 

(setq tb (textbox (list (cons -1 (car (entsel))))))

 

renvoi nil pour un texte MTEXT. Et c'est bien dommage, à moins que ça ait changé dernièrement ?

 

Oui c’est bien dommage, sans doute parce que la fonction textbox a été écrit avant qu’apparaisse les entités MTEXT dans AutoCAD et que son code n’a jamais été révisé depuis…

 

Mais même si il n’est pas possible d’utiliser textbox directement avec le nom d’entité, on peut tout de même arriver à un résultat en passant par les codes dxf 1 et le réglage préalable des codes 7 & 40 (respectivement TEXTSTYLE et TEXTSIZE) ce que j’avais omis de préciser précédemment…

 

Une seconde illustration reprenant le souhait de Fraid :

((lambda (ent)
  (cond ((and ent (wcmatch (cdr (assoc 0 (setq ent (entget ent)))) "MTEXT,TEXT"))
    (setvar 'TEXTSTYLE (cdr (assoc 7 ent)))
    (setvar 'TEXTSIZE(cdr (assoc 40 ent)))
    (caadr (textbox (list (assoc 1 ent))))
  )
))
 (car (nentsel))
)

 

Certes le code est beaucoup moins robuste que celui de (gile) car les MTEXT doivent être homogène et ne pas utiliser de caractère spéciaux et être sur la même ligne, mais bon l’idée principal était de monter une autre voie que l’emploie systématique de GetBoundingBox fonction plus polyvalente.

 

A rapeller également que l’idée de passer par le code 1 et le réglage éventuelle des codes 7 & 40 permet également de connaitre l’encombrement des textes sans que ceci ne soit créé...

_$ (caadr (textbox (list (cons 1 "WWWWW"))))
79.296
_$ (caadr (textbox (list (cons 1 "iiiii"))))
24.864

 

Amicalement

Bruno

Apprendre => Prendre => Rendre

Posté(e)

Re,

Ou plus simplement comme ceci en ne transmettant à textbox qu'une liste partiel correspondant aux élements à prendre en compte…

 

((lambda (ent)
  (if (and ent (wcmatch (cdr (assoc 0 (setq ent (entget ent)))) "MTEXT,TEXT"))     
    (caadr (textbox (list (assoc 1 ent)(assoc 40 ent) (assoc 7 ent))))
  )
)
 (car (nentsel))
)

 

Ce qui permet de travailler indistinctement avec les TEXT et MTEXT (avec les restrictions rappelées précédemment), et même de connaitre tout ou partie de la longueur d’un texte..

 

A+

Apprendre => Prendre => Rendre

Posté(e)

Ou plus simplement comme ceci en ne transmettant à textbox qu'une liste partiel

 

Ou surtout plus justement <_< comme ceci le caadr dans des codes précédents étant un raccourci un peu malheureux..

((lambda (ent) 
  (if (and ent (wcmatch (cdr (assoc 0 (setq ent (entget ent)))) "MTEXT,TEXT"))      
    (car (apply 'mapcar (cons '- (reverse (textbox (list (assoc 1 ent)(assoc 40 ent) (assoc 7 ent))))))) 
  ) 
) 
 (car (entsel)) 
)

Apprendre => Prendre => Rendre

Posté(e)

Je ne regrette pas d'avoir poser cette question que je pensais redondante...

 

Par contre un texbox sur un attribut renvois nil

et vla-GetBoundingBox "Erreur Automation Etendus nuls" ça c'est sur :(rires forts): c'est vraiment nul

 

connaissez vous la solution avec un Attribut?

Posté(e)

Salut,

 

La fonction textbox tout comme les routines que j'ai proposé fonctionnent aussi avec les attributs (l'objet attribut "hérite" de toutes les propriétés de l'objet texte).

 

Il peut y avoir des corrections à faire si le texte, mtexte est dans un bloc ou si attribut appartient à un bloc imbriqué.

 

Avec textdims, il faut juste affecter aux dimensions les facteurs d'échelle du bloc s'ils sont différents de 1.0;

 

Avec gc:TextBox (et nentsel), il faut affecter la matrice de transformation de la référence de bloc aux coordonnées retournées. Cette matrice est dans la liste retournée par nentsel (3éme élément). C'est une matrice 4x3 les 3 premières rangées décrivent les rotations et facteurs d'échelle, la dernière le déplacement (point d'insertion).

 

Une commande de test qui dessine le rectangle englobant des textes, mtextes, attributs sélectionnés quels que soient la justification, le plan d'insertion et les échelles et rotations pour les objets imbriqués.

 

;; TRP
;; transpose une matrice -Doug Wilson-
(defun trp (m) (apply 'mapcar (cons 'list m)))

(defun c:test (/ nent pts)
 (if (setq nent (nentsel))
   (setq pts
   (if (= (length nent) 2)
     ;; texte, mtexte ou attribut non imbriqué
     (gc:TextBox (car nent))
     ;; texte, mtexte ou attribut imbriqué
     (mapcar
       (function
	 (lambda (p)
	   (mapcar
	     '+
	     (mxv (trp (reverse (cdr (reverse (caddr nent))))) p)
	     (last (caddr nent))
	   )
	 )
       )
       (gc:TextBox (car nent))
     )
   )
   )
 )
 (command "_line")
 (foreach p pts (command "_non" p))
 (command "_close")
 (princ)
)

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

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é