Déméter_33 Posté(e) le 6 février Posté(e) le 6 février Bonjour, Dans une routine assez imposante de fusion d'un fichier natif dans un modèle pré-paramétré, je cherche à transformer l'apparence et la composition de certains "TEXT" en éléments "MTEXT" avec l'insertion de préfixes et suffixes composés de caractères unicodes , ◄ en préfixes et ► en suffixes. Pour cela, j'ai adapté un morceau de LISP (PTX-STX) trouvé sur ce même forum, mais dans lequel je n'arrive pas à paramétrer les caractères UNICODE, même en les entrants manuellement. (defun TextDp1b2Mtext (/ doc ent Pref Suff) (setq TDPsel (ssget "X" '((0 . "TEXT") (8 . "Sectionnement_PlotsAnno")))) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (setq Pref (getstring "\Entrer alt+17")) ;Définition du préfixe manuelle (setq Suff (getstring "\Entrer alt+16")) ;Définition du suffixe manuelle (while (< i (sslength TDPsel)) (setq ent (vlax-ename->vla-object (ssname TDPsel i))) (vla-put-textstring ent (strcat Pref (vla-get-textstring ent) Suff)) (setq i (1+ i)) ) (vla-endundomark doc) (setq Setlen (sslength TDPsel) Count 0 ) (repeat SetLen (setq Ntxt (ssname TDPsel Count)) (command "_txt2mtxt" Ntxt "") (setq jsF (ssadd (entlast)) NMtxt (entlast)) (setq dxf_ent (entget NMtxt)) (entmod (append dxf_ent (list (cons 90 19) ;Encadrement (cons 8 "G-ANNOTATIONS") ;Calque (cons 40 0.15) ;Hauteur de texte (cons 45 1.2) ;Bordure (cons 441 0) ;Echelle (cons 41 1.4) ;Largeur ) ) ) (setq Count (+ 1 Count)) ) (princ) ) Le résultat du code joint me donne bien l'apparence désirée mais n'insère pas les caractères demandés. Help me please.
JPhil Posté(e) le 6 février Posté(e) le 6 février En passant par chr, ça pourrait peut-être fonctionner ? Source : https://www.da-code.fr/chr/
Déméter_33 Posté(e) le 6 février Auteur Posté(e) le 6 février J'y ai pensé (je suis allé sur la même page), mais la liste des 255 caractères ASCII ne comporte pas les deux caractères, seulement les caractères < et > qui ne sont pas assez visuellement explicites dans l'utilisation de nos plans... https://www.purebasic.com/french/documentation/reference/ascii.html Il s'agit d'Alt codes issus de la table de codage graphique de la page de code 850, en fait si je tape (setq A ►) j'ai nil comme réponse, donc je pense juste que ça ne devrai pas être possible... SAUF QUE quand j'utilise le code duquel je me suis inspiré ça fonctionne, donc mon problème doit être ailleurs... Je cherche encore.
didier Posté(e) le 6 février Posté(e) le 6 février Bonjour @Déméter_33 Je ne suis pas sûr de bien comprendre. Est-il possible d'avoir un visuel du rendu souhaité en image ? Est-ce qu'on travaille bien avec du MTEXT, j'ai bien une idée, mais je voudrais voir ce rendu souhaité avant de répondre à côté si je me fourvoie. Amicalement Éternel débutant… Mon site perso : Programmer dans AutoCAD
Déméter_33 Posté(e) le 6 février Auteur Posté(e) le 6 février Bonjour @didier, L'élément de base : L'élément une fois converti :
Déméter_33 Posté(e) le 6 février Auteur Posté(e) le 6 février Pourtant, j'utilisais avant un autre LISP mais qui correspondait moins bien à mes besoins et qui lui fonctionne très bien avec ces caractères : ; Ajouter un morceau de texte (prefix) (defun c:ptx(/ doc ent tx1 tx2 txt) (vl-load-com) (setq doc (vla-get-activedocument (vlax-get-acad-object))) (vla-startundomark doc) (and (ssget (list (cons 0 "TEXT,MTEXT"))) (setq tx1 (getstring "\nTexte à ajouter : ")) (progn (vlax-for ent (setq sel (vla-get-activeselectionset doc)) (vla-put-textstring ent (strcat tx1 (vla-get-textstring ent))) ) (vla-delete sel) ) ) (vla-endundomark doc) (princ) ) Peut être faut-il que je pense mon code autrement en ajustant la commande de sélection de celui-ci ?
didier Posté(e) le 6 février Posté(e) le 6 février Bonjour @Déméter_33 J'ai un peu utilisé le même principe, il n'y en a pas cent. Par contre, je change la police, Wingdings 3 en l'occurrence, les caractères t et u sont des triangles orientés. Voici le visuel : Voici le code : (setq ent (car (entsel))) (setq val (cdr (assoc 1 (entget ent)))) (entmod (subst (cons 1 (strcat "{\\fWingdings 3|b0|i0|c2|p18;t\\" "fArial|b0|i0|c0|p34;" val "\\fWingdings 3|b0|i0|c2|p18;u}") ) (assoc 1 (entget ent)) (entget ent) ) ) Éternel débutant… Mon site perso : Programmer dans AutoCAD
Déméter_33 Posté(e) le 6 février Auteur Posté(e) le 6 février Bien trouvé sur le fond, mais mon dessin a pas aimé : Par contre j'ai réussi à me faire ma routine "propre" dans laquelle j'ai juste à taper les caractères et qui fonctionne nickel du coup : (defun c:TextDp1b2Mtext () (vl-load-com) (setq TDPsel (vla-get-activedocument (vlax-get-acad-object))) ; Récupérer le document actif (vla-startundomark TDPsel) (setq sel (ssget "_X" '((0 . "TEXT") (8 . "Sectionnement_PlotsAnno")))) ; Filtre de sélection : Texte + Mtext uniquement du calque "Sectionnement_PlotsAnno" (progn (setq Pref (getstring T "\Entrer alt+17")) ;; Préfixe facultatif (setq Suff (getstring T "\Entrer alt+16")) ;; Suffixe facultatif (vlax-for ent (vla-get-activeselectionset TDPsel) ; Traiter chaque entité sélectionnée (vla-put-textstring ent (strcat Pref (vla-get-textstring ent) Suff))) (vla-delete (vla-get-activeselectionset TDPsel)) ; Supprimer la sélection après modification ) (vla-endundomark TDPsel) (setq TPsel (ssget "X" '((0 . "TEXT") (8 . "Sectionnement_PlotsAnno")))) ;Sélection de tous les textes du calque Sectionnement_PlotsAnno (setq Setlen (sslength TPsel) Count 0 ) ;setq le nombre d'entités dans Setlen, setq le compteur à 0 (repeat SetLen ;Boucle de répétition (Setlen) fois (setq Ntxt (ssname TPsel Count)) ;setq Ntxt comme étant la (Count)ième entité dans la selection Tsel (command "_txt2mtxt" Ntxt "") ;Transformation de l'entité de Ntxt de texte en mtext (setq jsF (ssadd (entlast)) NMtxt (entlast)) ;setq NMtext la dernière entité Mtext créée (setq dxf_ent (entget NMtxt)) ;Lis le code DXF de l'entité NMtext (entmod (append dxf_ent (list (cons 71 5) ;Justifier (cons 90 19) ;Encadrement (cons 8 "G-ANNOTATIONS") ;Calque (cons 40 0.15) ;Hauteur de texte (cons 45 1.2) ;Bordure (cons 441 0) ;Echelle (cons 41 1.4) ;Largeur ) ) ) (setq Count (+ 1 Count)) ;Ajoute 1 au compteur ) ;Fin de Repeat (princ) ) Fut juste taper les deux caractères... Mais pour le moment ça marche.
didier Posté(e) le 6 février Posté(e) le 6 février Bonjour @Déméter_33 C'est sans doute parce que la gestion des entités MTEXT est cauchemardesque ! Je n'ai pas fait de tests approfondis, mais chez moi ça fonctionne, voir le gif fourni. Si vous êtes arrivés à vos fins, c'est parfait, tant pis pour mes efforts qui tombent à côté de la cible. Amicalement Éternel débutant… Mon site perso : Programmer dans AutoCAD
Déméter_33 Posté(e) le 6 février Auteur Posté(e) le 6 février Bon c'est ma faute @didier, j'ai effectué le test de votre bout de code sur un "TEXT" et non un "MTEXT". En faisant le test correctement, j'obtiens bien les flèches : Sauf que mon code insère les caractères AVANT de faire la conversion de "TEXT" à "MTEXT", il faut donc que je change le processus pour faire les choses dans l'ordre. J'ai pas le temps ce soir, mais je vais bouger mes lignes dès que possible pour retenter dans le bon ordre.
didier Posté(e) le 7 février Posté(e) le 7 février Bonjour @Déméter_33 Je vous remercie pour cette précision. Sans être un grand programmeur, je suis assez habitué tout de même pour savoir que si ça fonctionne sur une machine et pas sur une autre, c'est qu'un ou plusieurs paramètres diffèrent. À vous de voir quel code vous souhaitez garder, car maintenant, vous avez toute possibilité de faire. Amicalement 1 Éternel débutant… Mon site perso : Programmer dans 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