Aller au contenu

\"Align_text\" a t-il un cousin ?


doublecriquet

Messages recommandés

Salut,

 

...maintenant que je deviens un "super-pro" dans le maniement de la routine "Align_text", je commence à devenir exigent avec elle ! :mad:

 

J'aimerais savoir si vos connaissiez un cousin d'"Align_text" qui permettrait d'aligner en même temps plusieurs éléments de texte sur la polyligne la plus proche, au lieu d'avoir à répéter la routine pour chaque texte un à un.

 

En effet, j'ai un très grand nombre de textes différents à aligner sur une même polyligne, et je cherche une fonction simple, ne proposant pas toutes les options présentes dans "align_text" (au dessus/en dessous, rotation). Cela me suffirait si le texte se place automatiquement au dessus ou en dessous de cette polyligne (ça m'est indifférent), avec la rotation la plus simple, comme align_text le propose par défaut (le long de la polyligne, dans le sens de lecture le plus courant, à l'endroit de gauche à droite).

Lien vers le commentaire
Partager sur d’autres sites

Demande très spécifique...

 

Je tentes une proposition, mais qui suppose une situation précise pour que le résultat souhaité soit au rendez-vous.

Il faut que les textes soient positionnés (mais pas forcément alignés en rotation) à peu prés à leur position finale par rapport à la polyligne.

C'est seulement dans ce cas que la distribution le long de la polyligne sera le plus correct.

 

Voici le code pour faire cela. (non testé en profondeur)

 

(defun c:Multalign_text ( / js n pojs vla_po vla_obj pt deriv alpha)
 (princ "\nSélectionner les textes à aligner. ")
 (setq js (ssget '((0 . "*TEXT"))) n -1)
 (cond
   (js
     (vl-load-com)
     (princ "\nSélectionner la polyligne. ")
     (while (null (setq pojs (ssget "_+.:E:S" '((0 . "LWPOLYLINE"))))))
     (setq vla_po (vlax-ename->vla-object (ssname pojs 0)))
     (repeat (sslength js)
       (setq
         vla_obj (vlax-ename->vla-object (ssname js (setq n (1+ n))))
         pt (vlax-curve-getClosestPointTo vla_po (vlax-get vla_obj 'InsertionPoint))
         deriv (vlax-curve-getfirstderiv vla_po (vlax-curve-getparamatpoint vla_po pt))
         alpha (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR")))
       )
       (if (or (> alpha (* pi 0.5)) (< alpha (- (* pi 0.5)))) (setq alpha (+ alpha pi)))
       (vlax-put vla_obj 'Rotation alpha)
       (vlax-put vla_obj 'InsertionPoint (polar pt (+ alpha (* pi 0.5)) (vlax-get vla_obj 'Height)))
     )
   )
 )
)

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

Salut,

 

Merci pour vos réponses.

 

torient d'express, c'est presque ce que je cherchais, sauf que l'alignement se fait par rapport à une ligne à tracer et non une polyligne existante comme je le voudrais (à moins que je n'ai pas vu l'option ?)

 

En revanche "Multalign_text" de Bonuscad est exactement ce que je cherchais. Ca marche parfaitement dans mon cas. la distribution le long de la polyligne est super correcte, voire nickelle !!!

 

Aller, faut que j'me mette au boulot maintenant du coup...

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines après...

Bonjour,

 

Après plusieurs utilisations d'"Align_text" et de "multialign_text", je me suis rendu compte qu'une petite variable supplémentaire serait très utile à rajouter... mais je n'y connais rien en développement, alors je me tourne vers vous :

 

En effet, souvent les textes traités sont alignés trop près de la polyligne. En effet, je travaille sur des routes de plusieurs centaines de kilomètres, à des échelles très éloignées, et du coup on a presque l'impression que les textes sont collés à la polyligne une fois "Align_text" ou "multialign_text" éxécutés.

Serait-il possible de rajouter une option pour rentrer la valeur de distance à la polyligne à la main ? Ou peut-être est-ce plus simple de créer un align_text 2, un peu plus éloigné de la polyligne ?

 

merci pour vos réponses

 

 

 

:P

Lien vers le commentaire
Partager sur d’autres sites

Bonjour doublecriquet,

 

Voici une fonction que j'avais développée pour rendre parallèle des objets textuels par rapport à d'autres objets :

 

; PARALLELE.LSP

;---------------------------------------------------------------

; MODIFIE L'ANGLE D'UN OU PLUSIEURS TEXTES

; A PARTIR D'UN OBJET.

;---------------------------------------------------------------

; Cree le 17.05.1999

;---------------------------------------------------------------

; FONCTION MAITRE

(defun c:parallele ()

(setvar "cmdecho" 0)

(setq js (sel-txts))

(if js

(progn

(prompt (strcat "\nNombre de textes : " (rtos (setq nbr (sslength js)) 2 0)))

(meme-ang js)

);fin progn

(progn

(prompt "\n---Pas de Textes selectionnés---")

(princ)

);fin progn

);fin if js

(princ)

(prompt "\n---COPYRIGHT mai 2003 par Fabrice DEMIEL---")

(prin1)

);fin c:parallele

;---------------------------------------------------------------

(defun sel-txts ()

(ssget

'(

(-4 . "

(-4 . "

(0 . "TEXT")

 

(-4 . "AND>")

(-4 . "

(0 . "MTEXT")

 

(-4 . "AND>")

(-4 . "OR>")

)

);ssget

)

;-----------------------------------------------------------------

(defun meme-ang (js / c1 i ang nbr sel-obj chx2)

(setq cnt2 T)

(while cnt2

(initget "Global Element")

(setq chx2 (getkword "\n Quel type de travail [Global/Element] "))

(cond

((= chx2 "Global")

(progn

(while (= (setq sel-obj (nentsel "\n Choisir un objet de reference : ")) nil));fin select

(setq ang (ang-obj (car sel-obj)))

(setq nbr (sslength js))

(setq i 0)

(while (<= i (- nbr 1))

(setq c1 (ssname js i))

(setq ent (entget c1))

(setq ent (subst (cons 50 ang) (assoc 50 ent) ent))

(entmod ent)

(setq i (+ i 1))

); fin 1er while

);fin progn

);fin si chx2 est egal à Global

((= chx2 "Element")

(progn

(setq nbr (sslength js))

(setq i 0)

(while (<= i (- nbr 1))

(setq c1 (ssname js i))

(redraw c1 3)

(while (= (setq sel-obj (nentsel "\n Choisir un objet de reference : ")) nil));fin select er

(setq ang (ang-obj (car sel-obj)))

(setq ent (entget c1))

(setq ent (subst (cons 50 ang) (assoc 50 ent) ent))

(entmod ent)

(setq i (+ i 1))

); fin 1er while

);fin progn

);fin si chx2 est egal à Element

 

(T (setq cnt2 nil))

 

);fin cond

);fin while cnt2

(setvar "cmdecho" 1)

)

;-----------------------------------------------------------------

(defun ang-obj (er / obj)

(setq obj (cdr (assoc 0 (entget er))))

(cond

((= obj "CIRCLE")

(progn

(princ "\nObjet Cercle definir 2 points : ")

(setq ang (getangle "\n Définissez l'angle > Premier Point: "))

);fin progn

);fin CIRCLE

 

((= obj "LINE")

(progn

(princ "\nObjet Ligne : ")

(setq p1 (cdr (assoc 10 (entget er))))

(setq p2 (cdr (assoc 11 (entget er))))

(setq ang (angle p1 p2))

);fin progn

);fin LINE

 

((= obj "ARC")

(progn

(princ "\nObjet Arc : ")

(setq cent-arc (cdr (assoc 10 (entget er))))

(setq ray (cdr (assoc 40 (entget er))))

(setq ang-50 (cdr (assoc 50 (entget er))))

(setq ang-51 (cdr (assoc 51 (entget er))))

(setq p2 (polar cent-arc ang-50 ray))

(setq p1 (polar cent-arc ang-51 ray))

(setq ang (angle p1 p2))

);fin progn

);fin ARC

 

((= obj "MPOLYGON")

(progn

(princ "\nObjet MPolygone MAP 3D definir 2 points : ")

(setq ang (getangle "\n Définissez l'angle > Premier Point: "))

);fin progn

);fin MPOLYGON

 

((= obj "LWPOLYLINE")

(progn

(princ "\nObjet LWPolyligne definir 2 points : ")

(setq ang (getangle "\n Définissez l'angle > Premier Point: "))

);fin progn

);fin LWPOLYLINE

 

((= obj "INSERT")

(progn

(setq ang (cdr (assoc 50 (entget er))))

);fin progn

);fin INSERT

 

((= obj "TEXT")

(progn

(princ "\nObjet Texte : ")

(setq ang (cdr (assoc 50 (entget er))))

);fin progn

);fin TEXT

 

((= obj "MTEXT")

(progn

(princ "\nObjet Mtexte : ")

(setq ang (cdr (assoc 50 (entget er))))

);fin progn

);fin MTEXT

 

);fin cond

);fin defun ang-obj

;-----------------------------------------------------------------

Lien vers le commentaire
Partager sur d’autres sites

on a presque l'impression que les textes sont collés à la polyligne

Serait-il possible de rajouter une option pour rentrer la valeur de distance à la polyligne à la main ?

 

Pour ma réponse n°2

 

(vlax-put vla_obj 'InsertionPoint (polar pt (+ alpha (* pi 0.5))[surligneur] (vlax-get vla_obj 'Height)  [/surligneur] )) 

 

c'est (vlax-get vla_obj 'Height) qui défini la distance de l'éloignement du texte par rapport à la polyligne, (ici je récupère la hauteur du texte, cette valeur a l'air insuffisante pour toi).

 

Soit tu remplace cette expression par une valeur numérique de ton choix, ou alors juste avant la boucle (repeat, tu définis une nouvelle variable.

Par exemple (initget 7) (setq offset_txt (getdist "\nDistance de décalage du texte: "))

et tu remplace (vlax-get vla_obj 'Height) par offset_txt.

 

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

Bonjour,

 

J'ai fait le test.

 

La modif que tu proposes bonuscad marche bien :

j'ai défini la variable (initget 7) (setq offset_txt (getdist "\nDistance de décalage du texte: "))

et remplacé (vlax-get vla_obj 'Height) par offset_txt.

... enfin ça n'est que du ctrl+c - ctrl+v, car je n'y connais rien de rien en dev et encore moins en LISP. Donc vraiment merci encore.

 

juste qq petits soucis parfois avec la distance, qui ne réagit pas pareil suivant les zones de ma route : je n'obtiens pas les mêmes distance du texte à la polyligne sur les partie plutôt horizontale et les parties plutôt verticales de mes routes.

Aussi, le sens du texte change suivant les zones d'une même route : par exemple, sur une route qui va globalement d'ouest en est (dc vers la droite (dsl pr la précision)), lorsque la route part vers l'ouest sur une petite distance, le texte associé à cette petite distance change de sens par rapport au reste du texte qui lui est dans le bon sens.

 

 

Merci aussi fabcad pour parallele, mais je n'arrive pas à le faire fonctionner. Je suis sur la version 2009 d'autocad.

Quand je lance toute l'intégralité de ta routine, il me propose de tracer un arc de cercle (ce n'est pas vraiment ce que je voulais faire...). et lorsque j'exécute uniquement parallèle (les 1eres lignes seulement de la routine), il me met le message : "erreur : no function definition : SEL-TXTS". Mais je dois mal m'y prendre. Je réessaierai à l'occasion.

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

juste qq petits soucis parfois avec la distance, qui ne réagit pas pareil suivant les zones de ma route

 

Je pense que le souci vient de la justification du texte.

Le rendu serait meilleur si le texte a au départ une justification au centre, à ce moment là on peut imposer le point 'TextAlignmentPoint au lieu de 'InsertionPoint comme auparavant.

 

Le code deviendrait ceci (la justification originale du texte est changé pour le centre)

 

(defun c:Multalign_text ( / js n pojs vla_po offset_txt vla_obj pt deriv alpha)
(princ "\nSélectionner les textes à aligner. ")
(setq js (ssget '((0 . "*TEXT"))) n -1)
(cond
(js
(vl-load-com)
(princ "\nSélectionner la polyligne. ")
(while (null (setq pojs (ssget "_+.:E:S" '((0 . "LWPOLYLINE"))))))
(setq vla_po (vlax-ename->vla-object (ssname pojs 0)))
(initget 7)
(setq offset_txt (getdist "\nDistance de décalage du texte: "))
(repeat (sslength js)
(setq
vla_obj (vlax-ename->vla-object (ssname js (setq n (1+ n))))
pt (vlax-curve-getClosestPointTo vla_po (vlax-get vla_obj 'InsertionPoint))
deriv (vlax-curve-getfirstderiv vla_po (vlax-curve-getparamatpoint vla_po pt))
alpha (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR")))
)
(if (or (> alpha (* pi 0.5)) (< alpha (- (* pi 0.5)))) (setq alpha (+ alpha pi)))
(vlax-put vla_obj 'Alignment 1)
(vlax-put vla_obj 'Rotation alpha)
(vlax-put vla_obj 'TextAlignmentPoint (polar pt (+ alpha (* pi 0.5)) offset_txt))
)
)
)
)

 

Aussi, le sens du texte change suivant les zones d'une même route

 

Là je ne sais pas si j'ai bien compris, mais dans le code la ligne suivante:

(if (or (> alpha (* pi 0.5)) (< alpha (- (* pi 0.5)))) (setq alpha (+ alpha pi)))

force l'angle d'écriture dans le 1er et 4ème quadrant trigonométrique.

 

Il me semblait plus logique d'avoir les écritures comme ceci pour ne pas avoir à tourner la tête pour la lecture de bas en haut.

Si cela te gêne tu mets simplement un [surligneur]; [/surligneur] (coma) au début de la ligne citée pour ne pas faire son évaluation. L'orientation restera identique à la tangente de la polyligne.

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

Après réflexion, en gardant ma philosophie du 1er et 4 ème quadrant, cela donnerait ceci:

 

(defun c:Multalign_text ( / js n pojs vla_po offset_txt vla_obj pt deriv alpha)
 (princ "\nSélectionner les textes à aligner. ")
 (setq js (ssget '((0 . "*TEXT"))) n -1)
 (cond
   (js
     (vl-load-com)
     (princ "\nSélectionner la polyligne. ")
     (while (null (setq pojs (ssget "_+.:E:S" '((0 . "LWPOLYLINE"))))))
     (setq vla_po (vlax-ename->vla-object (ssname pojs 0)))
     (initget 7)
     (setq offset_txt (getdist "\nDistance de décalage du texte: "))
     (repeat (sslength js)
       (setq
         vla_obj (vlax-ename->vla-object (ssname js (setq n (1+ n))))
         pt (vlax-curve-getClosestPointTo vla_po (vlax-get vla_obj 'InsertionPoint))
         deriv (vlax-curve-getfirstderiv vla_po (vlax-curve-getparamatpoint vla_po pt))
         alpha (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR")))
       )
       (vlax-put vla_obj 'Alignment 1)
       (vlax-put vla_obj 'Rotation (if (or (> alpha (* pi 0.5)) (< alpha (- (* pi 0.5)))) (+ alpha pi) alpha))
       (vlax-put vla_obj 'TextAlignmentPoint
         (polar pt (+ alpha (* pi 0.5))
           (if (or (> alpha (* pi 0.5)) (< alpha (- (* pi 0.5))))
             (+ (vlax-get vla_obj 'Height) offset_txt)
             offset_txt
           )
         )
       )
     )
   ) 
 )
 (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

Je viens de faire quelques textes. Tous les problèmes sont résolus javascript:insertAtCaret(':D','') :

 

Le problème de distance est complètement réglé avec l'avant dernière routine que tu as posté, bien entendu je viens de remarquer que ça marche BEAUCOUP mieux quand le texte est justifié en centre-milieu. Merci pour ce conseil !

 

Pour le problème de sens du texte, effectivement si je rajoute le point virgule à l'endroit que tu m'as indiqué, tout fonctionne parfaitement. En revanche, la dernière routine que tu as posté (gardant ta philosophie du 1er et 4 ème quadrant) ne correspond pas à ce que je cherche à faire.

 

En conclusion,

Je suis donc entièrement satisfait avec l'avant dernière routine et en y rajoutant un point virgule avant la ligne de code concernée : (if (or (> alpha (* pi 0.5)) (< alpha (- (* pi 0.5)))) (setq alpha (+ alpha pi))).

 

Merci bonuscad pour tous ces précieux conseils et ton soutien exemplaire !!

 

A+

 

 

Lien vers le commentaire
Partager sur d’autres sites

Je suis donc entièrement satisfait

Merci bonuscad pour tous ces précieux conseils et ton soutien exemplaire !!

 

De rien, ce fut un plaisir ;)

 

Il reste certainement des imperfections dans ce code pour qu'il soit d'un usage général (écrit sans faire de tests approfondis)

Mais s'il répond à ton besoin précis, derrière c'est du temps d'exécution en moins :exclam:

 

 

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

  • 3 ans après...

Bonjour je suis novice en Lisp

 

Cette routine m'interresse est il possible de l'avoir complete,

je dois aussi aligner des textes sur des lignes mais l'espacement est bcps trop grand et quand je fait votre routine elle ne fonctionne pas

 

Pourriez vous m'aider svp

 

merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Cette routine m'interresse est il possible de l'avoir complete

 

??? La dernière postée en 11 est complète.

 

mais l'espacement est bcps trop grand et quand je fait votre routine elle ne fonctionne pas

 

Tu ne pourrais pas joindre un exemple pour bien comprendre ton souci/souhait?

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

Bonjour,

 

 

??? La dernière postée en 11 est complète.

 

 

 

Tu ne pourrais pas joindre un exemple pour bien comprendre ton souci/souhait?

 

 

 

 

la routine en 11 me marque "serveur ActiveX a renvoyé l'erreur: nom inconnu: "ALIGNMENT"

au moment il me demande la distance de décalage ?

 

ce que je recherche c'est de pouvoir orienter un texte sur une ligne avec le choix du décalage en distance

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é