Azerty Posté(e) le 12 septembre 2013 Posté(e) le 12 septembre 2013 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 !
fauxsuisse Posté(e) le 12 septembre 2013 Posté(e) le 12 septembre 2013 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.
Azerty Posté(e) le 12 septembre 2013 Auteur Posté(e) le 12 septembre 2013 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 !
fabcad Posté(e) le 12 septembre 2013 Posté(e) le 12 septembre 2013 Bonjour, Voici une routine qui traite cette copie d'index de textuel. Bonne journée, Fabcad le Rennais métropolitain.ID-TXT.LSP
x_all Posté(e) le 12 septembre 2013 Posté(e) le 12 septembre 2013 question? que deviens le dernier texte? quelques trucs sur autocad
Steven Posté(e) le 12 septembre 2013 Posté(e) le 12 septembre 2013 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.
Azerty Posté(e) le 12 septembre 2013 Auteur Posté(e) le 12 septembre 2013 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_allC'est à moi que tu posais la question ?Peu importe le texte manquant, ça dépend du cas de figure, mais je le retape normalementMais 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 !
(gile) Posté(e) le 12 septembre 2013 Posté(e) le 12 septembre 2013 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
(gile) Posté(e) le 12 septembre 2013 Posté(e) le 12 septembre 2013 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
Azerty Posté(e) le 16 septembre 2013 Auteur Posté(e) le 16 septembre 2013 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 !
(gile) Posté(e) le 16 septembre 2013 Posté(e) le 16 septembre 2013 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
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