Aller au contenu

extrait une partie d\'une chaîne de texte


Messages recommandés

Posté(e)

Bonsoir,

 

Je recherche une méthode pour extrait une partie d'une chaîne de texte.

 

je m'explique:

 

j'aimerai une fonction ou la méthode qui me retour une partie d'une chaine de texte

 

exemple:

 

je sélectionne un objet je récupère le nom du calque(ex:BATI_HACH) "jusqu'ici je sais faire" par contre j'aimerai récupérer la chaîne qui se situe après "_" pour obtenir HACH.

 

Voilà j'espère que j'ai été assez clair.

 

Merci de votre aide

 

cordialement,

 

Laurent

Posté(e)

salut

 

tu as la fonction substr

substr "chaine" n m

 

n est le début de la recherche dans la chaine

m est le nombre de caractères depuis n à recopier (m est facultatif)

 

ex

 

Command: (substr "abcde" 2)

"bcde"

Command: (substr "abcde" 2 1)

"b"

Command: (substr "abcde" 3 2)

"cd"

 

 

Posté(e)

Bonsoir couçicouça,

 

Effectivement j'y avais pensé mais cela ne correspond pas à ce que je recherche.ou peut être dans une seconde étape. en fait j'aimerai trouver la position d'un caractère dans une chaîne de texte

 

Exemple:

trouver _ dans POINT_TN retourne 5

trouver - dans BATI-HACH retourne 4

 

ect....

 

Merci de votre aide

 

laurent

Posté(e)

Salut,

 

substr est effectivement une partie de ce que tu cherches, l'autre étant vl-string-position ou vl-string-search (les 2 sont utilisables dans ton cas).

 

Curieusement en AutoLISP substr est indexée à partir de 1 (0 pour les fonctions équivalentes dans la plupart des autres langages de programmation) et vl-string-position ou vl-string-search le sont à partir de 0.

L'index à passer à substr est donc celui retourné par vl-string-position ou vl-string-search + 2.

 

(setq str "POINT_TN")

 

(substr str (+ 2 (vl-string-position (ascii "_") str)))

ou

(substr str (+ 2 (vl-string-search "_" str)))

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

Posté(e)

quelque chose comme ça ?

 

(defun trouve (chaine carac / n ch ca)

 (setq n 1)  
 (while (<= n (strlen chaine))
   (setq ca (substr chaine n 1))
   (if (= ca carac)
     (setq ch (substr chaine (1+ n))
    n (1+ (strlen chaine))
    )
     (setq n (1+ n))
     )
   )
 (if ch
   ch
   (strcat "pas de " carac " trouvé")
   )
 )

(trouve "BATI-HACH" "-")

1er argument : ta chaine à analyser

2eme argument : le caractere à isoler

 

le tout te renvoie "HACH"

Posté(e)

Bonjour,

 

 

Tout d'abord merci à vous deux.

 

donc voici le p'tit code que je voulais faire:

 

(defun c:test()

(while

(setq str (entget (car (nentsel))))

(setq chaine (cdr (assoc 8 str)))

(setq val_txt (strcat "*" (substr chaine (+ 2 (vl-string-position (ascii "|") chaine)))))

(command "-calque" "g" Val_txt "")

);fin du while

);fin du defun

 

Le but de ce code c'est de pouvoir geler dans plusieurs Xref un calque pourtant le même Nom.

 

Il fonctionne pas trop mal en l'état, mais je suis confronté à une problème. C'est que lorsque je clique sur un bloc ma routine ne remonter pas le calque d'insertion du bloc mais celui de l'entité donc le calque "0"

 

Voilà Merci de vos lumière...

 

Laurent

 

Posté(e)

Salut,

 

sur une "entité complexe" (référence de bloc, polyligne 2d ou 3d, maillage), l'expression (car (nentsel)) retourne le nom d'entité de la sous-entité sélectionnée.

 

Dans le cas de blocs imbriqués (bloc dans une xref par exemple) c'est le nom d'entité de l'entité simple la plus profondément imbriquée qui est retournée.

 

Une solution consiste à utiliser la liste retournée par nentsel sur une entité complexe :

- premier élément : ename de la sous entité sélectionnée

- deuxième élément : point cliqué (coordonnées SCU courant)

- troisième élément : matrice de transformation de l'objet (combinaison des différentes transformations subies à chaque insertion)

- quatrième élément : liste des enames des objets parents (du plus imbriqué à l'objet inséré dans l'espace courant).

 

C'est ce quatrième élément qui nous intéresse. C'est le dernier de la liste retournée par nentsel, on y accède donc par :

(setq nent    (nentsel)
     parents (last nent)
)

Dans le cas d'un bloc inséré dans une xref, elle même insérée dans l'espace courant, le dernier élément de parents est le nom d'entité de la xref, l'avant dernier celui de la référence de bloc insérée dans la xref (si cette liste a plus de 2 éléments c'est que ce bloc contient un ou plusieurs blocs imbriqués dont le premier de la liste contient l'entité sélectionnée).

 

Pour ton code, il faut donc faire :

(while (setq nent (nentsel)) ...)

pour récupérer la liste nentsel complète, puis évaluer si l'entité sélectionnée est une entité simple dans l'espace courant (liste équivalente à celle retournée par entsel) une entité simple dans une xref (ou une référence de bloc) ou une entité composant d'un bloc imbriqué :

(if
 (or
   (= 2 (length nent)) ;_ dans l'espace courant
   (= 1 (length (last nent))) ;_ premier niveau d'imbrication dans une référence
 )
  (setq chaine (cdr (assoc 8 (entget (car nent)))))
  (setq elst (cdr (assoc 8 (entget (cadr (reverse (last nent))))))) ;_ niveau d'imbrication plus profond
)

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

  • 1 mois après...
Posté(e)

Bonsoir,

 

Merci Gile pour les explication et le code.

 

Donc voici ce que cela donne au final.

 

cette routine permet de geler des calques ayant le même nom dans plusieurs Xref.

 

 
(defun c:GXREF()

(while 

(setq nent (nentsel))

(if

 (or

   (= 2 (length nent)) ;_ dans l'espace courant

   (= 1 (length (last nent))) ;_ premier niveau d'imbrication dans une référence

 )

  (progn
	(setq chaine (cdr (assoc 8 (entget (car nent)))))
	(setq val_txt (strcat "*" (substr chaine (+ 2 (vl-string-position (ascii "|") chaine)))))
  )

  (progn
	(setq elst (cdr (assoc 8 (entget (cadr (reverse (last nent)))))))
	(setq val_txt (strcat "*" (substr elst (+ 2 (vl-string-position (ascii "|") elst)))))
  ) ;_ niveau d'imbrication plus profond

);fin du if

(command "-calque" "g" Val_txt "")

);fin du while

);fin du defun


 

Cordialement,

 

Laurent

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é