Aller au contenu

Lisp pour aligner un texte sur un autre ?


brunomu

Messages recommandés

Bonjour le Forum !

 

J'aimerais disposer d'un lisp tout bête pour aligner un texte sur un autre texte :

(ce lisp existe peut-être déjà mais je ne l'ai pas trouvé)

 

– je clique sur un texte A, puis sur un texte B

→ le texte A se déplace en x, de sorte que son point d'insertion ait la même valeur en x que celui du texte B

(sans changer la coordonnée y)

C'est tout !

 

En fait, il faudrait 2 lisps : un pour aligner un texte sur un autre en x, un pour l'aligner en y.

 

 

Quelqu'un sait où trouver ça, ou saurait écrire ce lisp (trop difficile pour mon maigre niveau) ?

Merci !!!

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Merci pour ta réponse.

 

Les 2 lisp sont alléchants, malheureusement :

– quand j'utilise rrt.lsp pour déplacer des textes jusqu'à la même valeur en .x, il ne se passe rien...

– DynamicTextAlignV1-6.lsp est tellement sophistiqué que je n'obtiens pas le résultat escompté !

 

:o|

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Deux lisps vite fait

 

Pour aligner en X

(defun c:txx(/ bas doc ori pos sel txt)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and	(setq bas (entsel "\nSélectionnez le texte de référence : "))
(setq bas (vlax-ename->vla-object (car bas)))
(vl-position (vla-get-objectname bas) '("AcDbText" "AcDbMText"))
(ssget (list (cons 0 "TEXT,MTEXT")))
(setq pos (car (vlax-get bas 'insertionpoint)))
   (progn
     (vlax-for txt (setq sel (vla-get-activeselectionset doc))
(setq ori (vlax-get txt 'insertionpoint))
(vlax-put txt 'insertionpoint (list pos (cadr ori) (caddr ori)))
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

Pour aligner en Y

(defun c:txy(/ bas doc ori pos sel txt)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and	(setq bas (entsel "\nSélectionnez le texte de référence : "))
(setq bas (vlax-ename->vla-object (car bas)))
(vl-position (vla-get-objectname bas) '("AcDbText" "AcDbMText"))
(ssget (list (cons 0 "TEXT,MTEXT")))
(setq pos (cadr (vlax-get bas 'insertionpoint)))
   (progn
     (vlax-for txt (setq sel (vla-get-activeselectionset doc))
(setq ori (vlax-get txt 'insertionpoint))
(vlax-put txt 'insertionpoint (list (car ori) pos (caddr ori)))
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup, très chou en effet !

 

Je sens qu'on s'approche du but...mais les textes ne se déplacent pas au point attendu.

Plus précisément, quand je travaille avec un SCU (donc pas en SCG), les textes se déplacent vers l'endroit où ils iraient dans le SCG (j'ai fait le test).

 

→ y a-t-il moyen de faire fonctionner le LISP dans le SCU courant ?

 

Merci !

Lien vers le commentaire
Partager sur d’autres sites

Voila

 

(defun c:txx(/ bas doc ori pos sel txt)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and  (setq bas (entsel "\nSélectionnez le texte de référence : "))
       (setq bas (vlax-ename->vla-object (car bas)))
       (vl-position (vla-get-objectname bas) '("AcDbText" "AcDbMText"))
       (ssget (list (cons 0 "TEXT,MTEXT")))
       (setq pos (car (trans (vlax-get bas 'insertionpoint) 1 0)))
   (progn
     (vlax-for txt (setq sel (vla-get-activeselectionset doc))
       (setq ori (trans (vlax-get txt 'insertionpoint) 1 0))
       (vlax-put txt 'insertionpoint (trans (list pos (cadr ori) (caddr ori)) 0 1))
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

(defun c:txy(/ bas doc ori pos sel txt)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and  (setq bas (entsel "\nSélectionnez le texte de référence : "))
       (setq bas (vlax-ename->vla-object (car bas)))
       (vl-position (vla-get-objectname bas) '("AcDbText" "AcDbMText"))
       (ssget (list (cons 0 "TEXT,MTEXT")))
       (setq pos (cadr (trans (vlax-get bas 'insertionpoint) 1 0)))
   (progn
     (vlax-for txt (setq sel (vla-get-activeselectionset doc))
       (setq ori (trans (vlax-get txt 'insertionpoint) 1 0))
       (vlax-put txt 'insertionpoint (trans (list (car ori) pos (caddr ori)) 0 1))
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

ps : Mon petit tourteau, on dirait que tu as trouvé mon point faible ;)

pps : Mon petit décapode, je t'ai donné une réponse pour tes fenêtres.

 

@+

Modifié par Patrick_35

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Merci beaucoup !

 

...problème(s) :

– quand je lance la commande, je dois sélectionner 2 fois l'objet de référence

– mais surtout, AutoCad me renvoie un message d'erreur :

erreur: Le serveur ActiveX a renvoyé l'erreur: nom inconnu: "TEXTALIGNMENTPOINT"

 

A tout hasard, j'ai remplacé TEXTALIGNMENTPOINT par _TEXTALIGNMENTPOINT parce mon AutoCad est en français, mais peine perdue...

 

 

Des idées ?

 

Merci en tous cas.

Lien vers le commentaire
Partager sur d’autres sites

– quand je lance la commande, je dois sélectionner 2 fois l'objet de référence

Non, pas besoin :huh:

 

– mais surtout, AutoCad me renvoie un message d'erreur :

C'est corrigé avec insertionpoint

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Peut-être cela te convient-il mieux ?

 

(defun getInputText (/ txt ss i lst)
 (if (setq txt (car (entsel "\nSélectionnez le texte de référence: ")))
   (if	(wcmatch (cdr (assoc 0 (entget txt))) "*TEXT")
     (if (setq ss (ssget '((0 . "*TEXT"))))
(cons txt
      (repeat (setq i (sslength ss))
	(setq lst (cons (ssname ss (setq i (1- i))) lst))
      )
)
     )
     (prompt "\nL'objet sélectionné n'est pas un texte.")
   )
 )
)

(defun alignText (fun lst / coord elst dxf10 ucsPt)
 (and
   lst
   (setq fun	(eval fun)
  coord	(fun (trans (cdr (assoc 10 (entget (car lst)))) (car lst) 1))
   )
   (foreach txt (cdr lst)
     (setq elst  (entget txt)
    dxf10 (assoc 10 elst)
    ucsPt (trans (cdr dxf10) txt 1)
     )
     (entmod
(subst
  (cons 10 (trans (subst coord (fun ucsPt) ucsPt) 1 txt))
  dxf10
  elst
)
     )
   )
 )
 (princ)
)

(defun c:txx () (alignText 'car (getInputText)))
(defun c:txy () (alignText 'cadr (getInputText)))

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

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é