Aller au contenu

Attention au vla-get-textstring


Patrick_35

Messages recommandés

Bonjour

 

Mettez le caractère spécial qui suit dans un texte --> ■

Faites un (vla-get-textstring (vlax-ename->vla-object (car (entsel)))) sur le texte et le caractère se transforme en | :o

Faites un (cdr (assoc 1 (entget (car (entsel))))) et vous aurez la bonne valeur.

 

@+

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,

 

c'est un bug connu.

Lee Mac a écrit une fonction pour remplacer (vla-get-textstring)

http://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/vla-get-textstring-u-symbols/m-p/4365391/highlight/true#M314323

 

;; Get Textstring  -  Lee Mac
;; Returns the text content of Text, MText, Multileaders, Dimensions & Attributes

(defun LM:gettextstring ( ent / enx itm str typ )
   (setq enx (entget ent)
         typ (cdr (assoc 0 enx))
   )
   (cond
       (   (wcmatch typ "TEXT,*DIMENSION")
           (cdr (assoc 1 (reverse enx)))
       )
       (   (and (= "MULTILEADER" typ)
                (= acmtextcontent (cdr (assoc 172 (reverse enx))))
           )
           (cdr (assoc 304 enx))
       )
       (   (wcmatch typ "ATTRIB,MTEXT")
           (setq str (cdr (assoc 1 (reverse enx))))
           (while (setq itm (assoc 3 enx))
               (setq str (strcat (cdr itm) str)
                     enx (cdr (member itm enx))
               )
           )
           str
       )
   )
)

Aide au téléchargement du cadastre dgfip-download-helper
Insertion de photos géolocalisées exif https://www.dropbox.com/s/gkf6o9ac2hxen97/exifscr.zip?dl=0
Script correction BUG SPDC V2, propriétaire département 21 et 22 : https://greasyfork.org/scripts/442400-spdcv2/code/SPDCV2.user.js

Lien vers le commentaire
Partager sur d’autres sites

Bonjour

 

Bien vu, et j'ose même pas imaginer ce sur quoi tu t'exerçais pour trouver ça… ;)

On m'a contacté pour une demande spécifique et c'est lors des échanges que je me suis aperçu de ce problème.

 

c'est un bug connu.

Si tu en connais d'autres, je suis preneur.

Merci pour le code et le lien.

 

@+

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,

 

Si tu en connais d'autres, je suis preneur.

 

Le problème va se poser avec toutes les fonctions vla* qui retournent une chaîne susceptible de contenir des caractères unicode.

J'ai eu ce genre de problème avec des fichiers chinois, j'avais alors écrit des fonctions utilisant les listes DXF pour remplacer vla-get-Name, vla-get-EffectiveName et vla-get-Layer.

 

;; gc:GetName
;; Retourne le nom de l'objet.
;; Fonctionne avec les noms contenant des caractères unicode.
;;
;; Argument
;; obj : objet dont on cherche le nom (ENAME ou VLA-OBJECT)

(defun gc:GetName (obj / elst)
 (or (= (type obj) 'ENAME)
     (setq obj (vlax-vla-object->ename obj))
 )
 (cond
   ((cdr (assoc 2 (entget obj))))
   ((vla-get-Name (vlax-ename->vla-object obj)))
 )
)

;; gc:GetEffectiveName
;; Retourne le nom de l'objet.
;; Fonctionne avec les noms contenant des caractères unicode.
;;
;; Argument
;; blkRef : référence de bloc (ENAME ou VLA-OBJECT)

(defun gc:GetEffectiveName (blkRef / ent elst name)
 (setq	ent
 (if (= (type blkRef) 'VLA-OBJECT)
   (setq blkRef (vlax-vla-object->ename blkRef))
   blkRef
 )
 )
 (setq	elst (entget ent)
name (cdr (assoc 2 elst))
 )
 (if (wcmatch name "`*U*")
   (cdr
     (assoc
2
(entget
  (cdr
    (assoc 340
	   (entget
	     (cdr
	       (assoc 360
		      (entget
			(cdr
			  (assoc 360
				 (entget (cdr (assoc 360 elst)))
			  )
			)
		      )
	       )
	     )
	   )
    )
  )
)
     )
   )
   name
 )
)

;; gc:GetLayer
;; Retourne le nom du calque de l'entité.
;; Fonctionne avec les nom contenant des caractères unicode.
;;
;; Argument
;; ent : entité dont on cherche le nom du calque (ENAME ou VLA-OBJECT)

(defun gc:GetLayer (ent)
 (and (= (type ent) 'VLA-OBJECT)
      (setq ent (vlax-vla-object->ename ent))
 )
 (cdr (assoc 8 (entget ent)))
)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Tu as le même problème en .NET ?

 

Non (comme le dit goldorak44) et ça ne m'étonnes pas, l'API .NET d'AutoCAD est très proche d'ObjectARX donc de la source même d'AutoCAD (comme les listes DXF).

Mais curieusement, il n'y a pas de problème en utilisant l'interface COM depuis une commande .NET.

 

        [CommandMethod("TEST")]
       public void Test()
       {
           Document doc = Application.DocumentManager.MdiActiveDocument;
           Database db = doc.Database;
           Editor ed = doc.Editor;
           PromptEntityResult per = ed.GetEntity("\nSélectionnez un texte: ");
           if (per.Status != PromptStatus.OK) return;
           using (DBText dbText = (DBText)per.ObjectId.Open(OpenMode.ForRead))
           {
               AcadText acadText = (AcadText)dbText.AcadObject;
               ed.WriteMessage("\nNET: {0}\nCOM: {1}", dbText.TextString, acadText.TextString);
           }
       }

 

Commande: TEST
Sélectionnez un texte:
NET: ■
COM: ■

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

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é