Fraid Posté(e) le 20 septembre 2012 Posté(e) le 20 septembre 2012 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: https://github.com/Fraiddd
Patrick_35 Posté(e) le 20 septembre 2012 Posté(e) le 20 septembre 2012 Salut En vlisp, regarde GetBoundingBox @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Fraid Posté(e) le 20 septembre 2012 Auteur Posté(e) le 20 septembre 2012 merci, je regarde de suite https://github.com/Fraiddd
VDH-Bruno Posté(e) le 20 septembre 2012 Posté(e) le 20 septembre 2012 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
VDH-Bruno Posté(e) le 20 septembre 2012 Posté(e) le 20 septembre 2012 Re, Ca y est j'ai retrouvé un sujet similaire que j'avais en tête sur le même thème, je le recommandehttp://cadxp.com/index.php?/topic/28718-bounding-box-texdyn/ Cordialement Apprendre => Prendre => Rendre
Fraid Posté(e) le 20 septembre 2012 Auteur Posté(e) le 20 septembre 2012 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 https://github.com/Fraiddd
VDH-Bruno Posté(e) le 20 septembre 2012 Posté(e) le 20 septembre 2012 Dans le mien tu verra aucun problème de scu n'y de rotation ;) Apprendre => Prendre => Rendre
zebulon_ Posté(e) le 21 septembre 2012 Posté(e) le 21 septembre 2012 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 ? AmicalementVincent 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)
(gile) Posté(e) le 22 septembre 2012 Posté(e) le 22 septembre 2012 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
(gile) Posté(e) le 23 septembre 2012 Posté(e) le 23 septembre 2012 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
VDH-Bruno Posté(e) le 24 septembre 2012 Posté(e) le 24 septembre 2012 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
VDH-Bruno Posté(e) le 24 septembre 2012 Posté(e) le 24 septembre 2012 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
VDH-Bruno Posté(e) le 24 septembre 2012 Posté(e) le 24 septembre 2012 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
Fraid Posté(e) le 25 septembre 2012 Auteur Posté(e) le 25 septembre 2012 Je ne regrette pas d'avoir poser cette question que je pensais redondante... Par contre un texbox sur un attribut renvois nilet vla-GetBoundingBox "Erreur Automation Etendus nuls" ça c'est sur :(rires forts): c'est vraiment nul connaissez vous la solution avec un Attribut? https://github.com/Fraiddd
(gile) Posté(e) le 25 septembre 2012 Posté(e) le 25 septembre 2012 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
Fraid Posté(e) le 26 septembre 2012 Auteur Posté(e) le 26 septembre 2012 Merci beaucoup Gile Je n'avais pas exploré à fond gc:TextBox :D https://github.com/Fraiddd
Messages recommandé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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant