Aller au contenu

Remplacer le contenu d'une zone de texte par celui d'une autre ...


Messages recommandés

Posté(e)

Bonjour à tous.

 

Il existe sur la toile différentes routines de remplacement de texte.

Exemple : http://teachinfo.over-blog.com/article-autolisp---remplacer-texte-53207314.html

 

Hors, j'ai une requête un peu différente :

 

- Imaginer 10, 20 voir 50 MTEXT disposés dans un dessin

- Le contenu de ces zones de texte doit être rempli à la main.

- La particularité c'est que l'ordre est important

 

Mais il m'arrive d'en oublier un ... et de tout décaler.

Ce qui en gros aboutirait, sur 50 points, que le texte n°50 serait en face du point n° 49.

Le problème c'est qu'il est long et fastidieux de re-déplacer / ré-aligner tous les textes erronés.

 

( je ne sais pas si mon histoire est très claire ... !?? )

 

 

Toujours est-il que j'aimerai si possible, un lisp qui permet de :

- clic sur une zone de texte multiligne

- (la routine met en mémoire le contenu)

- clic sur une autre zone de textmult

- (la routine recopie le texte précédemment copier (sans changer l'orientation ou autre))

 

Le tout répétable (encore une fois, si possible) ... comme ça je peux spammer la barre d'espace. Car il m'arrive d'avoir à faire 200 fois ce genre de manip en peu de temps.

 

Bref, si une âme de programmeur charitable passe dans le coin, par avance merci !

Une seule chose à dire : MERCI CADxp !

Posté(e)

Et si ton texte mltiligne serait un bloc qui lui utilise comme attribut un texte multiligne, cela te permettrais d'exporter l'attribut et de le modifier avec excel, là tu peux faire un copié collé pour toutes les cellules puis ré-importer les attributs dans Autocad et tout se remets à jour automatiquement.

Posté(e)

Bonne idée ; mais peu adaptée à mon cas de figure.

Cette routine me servirait aussi à moins grande échelle que "plusieurs fois 40 ou 50 textes"

Face à un dessin, à la volée par clic de souris, copier un texte A vers un texte B.

 

Un résumé :

Existe-t-il un .lsp qui permet de copier l'index d'un MTEXT vers un autre, via sélection à la souris ?

Une seule chose à dire : MERCI CADxp !

Posté(e)

Salut.

 

Tu as aussi Swap_texte qui gère les textes et les attributs.

Steven________________________________________

Pour le taf; Windows (et ses emmerdes) sinon pas d'AutoCAD.

Pour le perso Linux Mint et pas de problèmes. Mais pas d'AutoCAD.

En rêve; AutoCAD sous Linux.

Posté(e)

Merci pour toutes ces réponses !

 

ID-TEXT fonctionne, mais un peu trop lourd à utiliser.

 

Par contre SWAP_TEXTE me convient bien, sans que j'ai à me pencher sur une ligne de commande perso (là, je peux répéter ESPACE rapidement, c'est le mode "copie d'index" prévu par défaut)

 

Le seul petit bémol, c'est la non-reconnaissance de certains caractères spéciaux.

Exemple le ─ (alt+196) est remplacé par le - (moins du 6)

C'est possible à corriger ?

(parce qu'évidement, 95% du temps j'utilise volontairement ce fameux ─ )

 

@ x_all

C'est à moi que tu posais la question ?

Peu importe le texte manquant, ça dépend du cas de figure, mais je le retape normalement

Mais imagine une clôture non rectiligne avec un n° à chaque piquet ... je préfère en retaper 1 et aller vite à tout décaler d'un piquet ... que de tous les retaper 1 par 1.

Une seule chose à dire : MERCI CADxp !

Posté(e)
Le seul petit bémol, c'est la non-reconnaissance de certains caractères spéciaux.

Exemple le ─ (alt+196) est remplacé par le - (moins du 6)

C'est possible à corriger ?

(parce qu'évidement, 95% du temps j'utilise volontairement ce fameux ─ )

Je crains que ce ne soit difficile en LISP.

L'encodage/décodage des caractères reste un problème en programmation, c'est pourquoi il est fortement conseillé de n'utiliser les caractères spéciaux qu'avec parcimonie, tant qu'on se cantonne aux caractères ASCII on est pratiquement assuré de n'avoir aucun souci, mais suivant les logiciels ceux-ci peuvent commencer dès l'utilisation de caractères accentués (on a tous vu ça...).

 

EDIT:

De plus, je pense que remplacer un caractère qui est aussi un signe arithmétique (tiret = moins) ne facilitera pas les choses le jour où tu aura besoin d'un programme qui aura besoin de convertir les textes en nombres...

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

Posté(e)

J'ai modifié Swap_Text.lsp pour qu'il réponde à ta demande.

Ceci n'enlève rien à ce que j'ai dit ci dessus.

 

(vl-load-com)
(defun c:swap_texte ( / AcDoc Space loop key_mod e1name e2name string1 string2)
 (defun sel_onlyText (msg / js)
   (princ msg)
   (while
     (not
       (setq js
         (ssget "_+.:E:S:N" 
           (list
             (cons 0 "*TEXT,MULTILEADER,ATTRIB,INSERT")
             (cons 67 (if (eq (getvar "CVPORT") 2) 0 1))
             (cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB")))
           )
         )
       )
     )
   )
   (vlax-ename->vla-object (cadar (ssnamex js 0)))
 )
 (setq
   AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
   Space
   (if (eq (getvar "CVPORT") 1)
     (vla-get-PaperSpace AcDoc)
     (vla-get-ModelSpace AcDoc)
   )
   loop nil
 )
 (initget "Permutation Copie Multiple")
 (while (eq (setq key_mod (getkword (strcat "\nMode opératoire [Permutation/Copie/Multiple] " (if loop "**MULTIPLE**" "") "<Copie>: "))) "Multiple")
   (if (eq key_mod "Multiple")
     (if loop (setq loop nil) (setq loop T))
   )
   (initget "Permutation Copie Multiple")
 )
 (if (not key_mod) (setq key_mod "Copie"))
 (cond
   (loop
     (while (setq e1name (sel_onlyText (strcat "\nSélectionner le texte source pour la " key_mod " **MULTIPLE**: ")))
;;;        (setq
;;;          string1 (if (vlax-property-available-p e1name 'TextString) (vlax-get e1name 'TextString))
;;;          e2name (sel_onlyText (strcat "\nSélectionner le texte cible pour la " key_mod " **MULTIPLE**: "))
;;;          string2 (if (vlax-property-available-p e2name 'TextString) (vlax-get e2name 'TextString))
;;;        )
(setq
         string1 (cdr (assoc 1 (entget (vlax-vla-object->ename e1name))))
         e2name (sel_onlyText (strcat "\nSélectionner le texte cible pour la " key_mod " **MULTIPLE**: "))
         string2 (cdr (assoc 1 (entget (vlax-vla-object->ename e2name))))
       )
       (cond
         ((and string1 string2)
           (if (eq key_mod "Permutation") (vlax-put e1name 'TextString string2))
           (vlax-put e2name 'TextString string1)
         )
       )
     )
   )
   (T
;;;      (setq
;;;        e1name (sel_onlyText (strcat "\nSélectionner le texte source pour la " key_mod  ": "))
;;;        string1 (if (vlax-property-available-p e1name 'TextString) (vlax-get e1name 'TextString))
;;;        e2name (sel_onlyText (strcat "\nSélectionner le texte cible pour la " key_mod ": "))
;;;        string2 (if (vlax-property-available-p e2name 'TextString) (vlax-get e2name 'TextString))
;;;      )
    (setq
       e1name (sel_onlyText (strcat "\nSélectionner le texte source pour la " key_mod  ": "))
       string1 (cdr (assoc 1 (entget (vlax-vla-object->ename e1name))))
       e2name (sel_onlyText (strcat "\nSélectionner le texte cible pour la " key_mod ": "))
       string2 (cdr (assoc 1 (entget (vlax-vla-object->ename e2name))))
     )
     (cond
       ((and string1 string2)
         (if (eq key_mod "Permutation") (vlax-put e1name 'TextString string2))
         (vlax-put e2name 'TextString string1)
       )
     )
   )
 )
 (prin1)
)

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

Posté(e)

Quelle réactivité ... chapeau !

 

Je prends bonne note de tes conseils sur la non-utilisation de l'ASCII trop étendu et de ses caractères farfelus qui pourraient poser problème avec d'autres routines. Je fini quelques trucs en cours, et je partirai sur de meilleures bases prochainement. D'ici là, ton lisp va bien me servir !!

 

J'ai une petite question complémentaire :

Qu'est-ce-qui fait que la 1ère ligne ne fonctionne pas du tout, mais la 2ème oui !???

 

(defun c:CT ()	(command "_swap_texte"	"_copie"	pause))

(defun c:SS ()	(command "_ucs"		"_n"	"_obj"	pause))

Une seule chose à dire : MERCI CADxp !

Posté(e)

Salut,

 

Une commande définie en LISP (comme swap_text) n'est pas une commande AutoCAD à proprement parler (comme celles définies avec ObjectARX ou .NET).

On ne peut l'appeler avec la fonction LISP command.

On peut l'appeler par l'expression LISP :

(c:swap_text)

mais dans ce cas, il faudra renseigner les options.

Pour faire ce que tu veux, il faut définir une routine LISP séparée qui exécute le code en fonction de l'option choisie, la fonction c:swap_text sert alors à inviter l'utilisateur à spécifier l'option puis appelle la routine en lui passant l'option comme argument.

 

(vl-load-com)
(defun c:swap_texte (/ AcDoc Space loop key_mod)
 (setq
   AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
   Space
  (if (eq (getvar "CVPORT") 1)
    (vla-get-PaperSpace AcDoc)
    (vla-get-ModelSpace AcDoc)
  )
   loop  nil
 )
 (initget "Permutation Copie Multiple")
 (while (eq (setq key_mod (getkword (strcat "\nMode opératoire [Permutation/Copie/Multiple] "
				     (if loop
				       "**MULTIPLE** "
				       ""
				     )
				     "<Copie>: "
			     )
		   )
     )
     "Multiple"
 )
   (if	(eq key_mod "Multiple")
     (setq loop (not loop))
   )
   (initget "Permutation Copie Multiple")
 )
 (if (not key_mod)
   (setq key_mod "Copie")
 )
 (do_swap_texte key_mod loop)
)

(defun do_swap_texte (key_mod loop / sel_onlyText e1name e2name string1 string2)
 (defun sel_onlyText (msg / js)
   (princ msg)
   (while
     (not
(setq js
       (ssget "_+.:E:S:N"
	      (list
		(cons 0 "*TEXT,MULTILEADER,ATTRIB,INSERT")
		(cons 67
		      (if (eq (getvar "CVPORT") 2)
			0
			1
		      )
		)
		(cons 410
		      (if (eq (getvar "CVPORT") 2)
			"Model"
			(getvar "CTAB")
		      )
		)
	      )
       )
)
     )
   )
   (vlax-ename->vla-object (cadar (ssnamex js 0)))
 )
 (cond
   (loop
    (while (setq e1name (sel_onlyText (strcat "\nSélectionner le texte source pour la " key_mod " **MULTIPLE**: ")))
      (setq
 string1 (cdr (assoc 1 (entget (vlax-vla-object->ename e1name))))
 e2name	 (sel_onlyText (strcat "\nSélectionner le texte cible pour la " key_mod " **MULTIPLE**: "))
 string2 (cdr (assoc 1 (entget (vlax-vla-object->ename e2name))))
      )
      (cond
 ((and string1 string2)
  (if (eq key_mod "Permutation")
    (vlax-put e1name 'TextString string2)
  )
  (vlax-put e2name 'TextString string1)
 )
      )
    )
   )
   (T
    (setq
      e1name  (sel_onlyText (strcat "\nSélectionner le texte source pour la " key_mod ": "))
      string1 (cdr (assoc 1 (entget (vlax-vla-object->ename e1name))))
      e2name  (sel_onlyText (strcat "\nSélectionner le texte cible pour la " key_mod ": "))
      string2 (cdr (assoc 1 (entget (vlax-vla-object->ename e2name))))
    )
    (cond
      ((and string1 string2)
(if (eq key_mod "Permutation")
  (vlax-put e1name 'TextString string2)
)
(vlax-put e2name 'TextString string1)
      )
    )
   )
 )
 (prin1)
)

 

Avec le code ci-dessus, la "commande" swap_text est toujours accessible, mais on peut en définir d'autres qui ne demande pas de spécifier les options.

 

Option Copie non multiple

(defun c:CT () (do_swap_test "copie" nil)

Option Copie multiple

(defun c:CTM () (do_swap_test "copie" T)

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é