Aller au contenu

Conversion txt-mtxt et inversement


Matt666

Messages recommandés

Salut !

Voici, pour ceux qui n'ont pas AutoCAD et les outils express, deux routines de conversion de textes...

;;Transforme des textes simples en textes mutliples
(defun c:T2MT (/ CMDECHO ENT41 ENTNUN MYERROR NEWTXT NOUVENT TEMPERROR TOU)
    (setq cmdecho (getvar "cmdecho"))
    (setvar "cmdecho" 0)
    (command "_undo" "d")
    (princ "\nSélectionner les textes à transformer en un texte multiple unique...\n")
    (if (setq tou (ssget '((0 . "text"))))
         (progn 
              (setq 
                   entnun (entget (ssname tou (setq cntr 0)))
                   newtxt (cdr (assoc 1 entnun))
              )
              (entdel (ssname tou 0))
              (while (setq nouvent (ssname tou (setq cntr (1+ cntr))))
                   (setq newtxt (strcat newtxt " " (cdr (assoc 1 (entget nouvent)))))
                   (entdel nouvent)
              )
              (if (> (strlen newtxt) 40)
                   (setq ent41 (* (cdr (assoc 40 entnun)) 40))
                   (setq ent41 (* (cdr (assoc 40 entnun)) (strlen newtxt)))
              )
              (entmake (list 
                        (cons 0 "MTEXT")
                        (cons 1 newtxt)
                        (cons 6 (cdr (assoc 6 entnun)))
                        (cons 7 (cdr (assoc 7 entnun)))
                        (cons 8 (cdr (assoc 8 entnun)))
                        (cons 10 (cdr (assoc 10 entnun)))
                        (cons 40 (cdr (assoc 40 entnun)))
                        (cons 41 ent41)
                        (cons 50 (cdr (assoc 50 entnun)))
                        (cons 62 (cdr (assoc 62 entnun)))
                        (cons 71 (aligne (cdr (assoc 72 entnun)) (cdr (assoc 73 entnun))))
              ))
              (princ "\nConversion réussie.")
    ))
    (command "_undo" "f")
    (setvar "cmdecho" cmdecho)
    (princ)
)

Bon le principal pb dans cette routine est de donner une largeur au mtexte... Donc ya une bidouille un peu pourrie, qui va surement faire rire les pros du lisp ;)

 

;;Transforme des textes multiples en textes simples
(defun c:MT2T (/ CMDECHO CN CNT3 CNTR ENT10 ENT72 ENT73 JUSTIF TOU)
    (setq cmdecho (getvar "cmdecho"))
    (setvar "cmdecho" 0)
    (command "_undo" "d")
    (princ "\nSélectionner les textes multiples à transformer en textes simples...\n")
    (if (setq tou (ssget '((0 . "MTEXT")))) 
         (repeat (setq cn (sslength tou))
              (setq
                   entnun (entget (ssname tou (setq cn (1- cn))))
                   justif (aligne (cdr (assoc 71 entnun)) nil)
                   ent72 (atoi (substr justif 1 1))
                   ent73 (atoi (substr justif 2 1))
                   ent10 (cdr (assoc 10 entnun))
              )
              (foreach pt (str2lst (cdr (assoc 1 entnun)) "\\P")
                   (if (/= pt "")
                        (entmake (list
                                  (cons 0 "TEXT")
                                  (cons 1 pt)
                                  (cons 6 (cdr (assoc 6 entnun)))
                                  (cons 7 (cdr (assoc 7 entnun)))
                                  (cons 8 (cdr (assoc 8 entnun)))
                                  (cons 11 ent10)
                                  (cons 40 (cdr (assoc 40 entnun)))
                                  (cons 50 (cdr (assoc 50 entnun)))
                                  (cons 62 (cdr (assoc 62 entnun)))
                                  (cons 72 ent72)
                                  (cons 73 ent73)
                        ))
                   )
                   (setq ent10 (list 
                             (car ent10) 
                             (- (cadr ent10) (* (cdr (assoc 44 entnun)) (/ 5.00 3.00) (cdr (assoc 40 entnun))))
                             (caddr ent10)
                   ))
              )
              (entdel (ssname tou cn))
              (princ "\nConversion réussie.")
         )
    )
    (command "_undo" "f")
    (setvar "cmdecho" cmdecho)
    (princ)
)

Le pb pour celui a été de trouver le décalage entre les lignes d'un mtexte... Merci Gile, qui a répondu ici...

 

Et pour finir, une routine qui permet de recopier l'alignement des textes... C'est pareil, un peu bidouille, mais ça a le mérite de fonctionner !

;;Pour gérer les variables de justification de texte
(defun aligne (arg1 arg2 / lst)
    (cond 
         ((and arg1 arg2)
              (setq lst '
                   ((1 . "03")(1 . "04")(1 . "05")(1 . "30")(2 . "01")(2 . "31")(3 . "02")(3 . "32")
                   (4 . "20")(5 . "21")(6 . "22")(7 . "10")(8 . "11")(9 . "12")(1 . "00"))
              )
              (car (nth (position (strcat (itoa arg1)(itoa arg2))(mapcar 'cdr lst)) lst))
         )
         ((and arg1 (not arg2))
              (setq lst '((1 . "03")(2 . "13")(3 . "32")(4 . "02")(5 . "12")(6 . "22")(7 . "01")(8 . "11")(9 . "21")))
              (cdr (nth (position arg1 (mapcar 'car lst)) lst))
         )
         
    )
)

 

La fonction hors autolisp pur ("position") est disponible ! Au passage copiez toutes ces fonctions et lancez-les au démarrage, elles sont très pratiques !

 

Quand je te disais, Gile, que je les utilise tous les jours tes équivalences :P

 

Voilà, évidemment ces routines sont largement améliorables, donc si quelqu'un est tenté, n'hésite pas !

 

A bientot.

Matt.

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

beau boulot !

je n'ai pas testé, mais queqlues remarque :

 

;;Transforme des textes simples en textes mutliples

Pourquoi ne pas utiliser "entmode" ?

 

;;Transforme des textes multiples en textes simples

Pourquoi ne pas tout simplement décomposer le MTEXT ?

 

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

Lien vers le commentaire
Partager sur d’autres sites

Merci !!

 

Pourquoi ne pas utiliser "entmode" ?

je n'ai pas réussi à passer de text à mtext en entmod

 

Pourquoi ne pas tout simplement décomposer le MTEXT ?

Non diponible avec le logiciel que j'utilise... :mad: (moteur intellicad)

 

Merci pour tes remarques !

A bientot..

Matt

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

Lien vers le commentaire
Partager sur d’autres sites

es_tu sur de l'orthographe de (entmode)

C'est (entmod) la vraie orthographe... Cette fonction sert entre autres à substituer une code DXF par un autre...

Mais ça ne fonctionne pas sur le code dxf 0...

 

Tiboulen, ce message s'adresse surtout aux utilisateurs des moteurs intellicad...

Mais j'ai déjà entendu parler de ltextender, qui permet d'utiliser du lisp sur une version lt de autoCAD... Et ça fonctionne bien ? C'est vrai que c'est une bonne alternative, et assez bon marché... à peu drès 400 € c'est ça ? En plus si on peut insérer les outils express , c'est vraiment dément !!

 

[Edité le 20/9/2007 par Matt666]

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

Lien vers le commentaire
Partager sur d’autres sites

Attends...

Comment utilises-tu entmod ???? :casstet:

ici, pour essayer, il faut dans ta routine que tu intègres un

(entmod (subst (cons 0 "MTEXT")(assoc 0 ;;;entget de l'entité) ;;;entget de l'entité))

Tu vois ?

 

J'ai l'impression (je dois me planter) que tu entres entmod dans la ligne de commande...

Forcément ça ne fonctionnera pas !! :)

 

A bientot

Matt.

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

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é