Aller au contenu

[Résolu] Recherche du dernier "_" dans un string


DenisHen

Messages recommandés

Bonjour à tous.

 

Voilà, aujourd'hui, je tente de renommer des blocs incrémentés comme ceci :

POTEAU_BOIS, POTEAU_BOIS_01, POTEAU_BOIS_02, POTEAU_BOIS_03,...POTEAU_BOIS_121

POTEAU_BOIS_MOISE, POTEAU_BOIS_MOISE_1, POTEAU_BOIS_MOISE_2,...POTEAU_BOIS_MOISE_145

 

j'ai fais un bout de lisp, mais je n'arrive pas à coder la recherche du dernier caractère "_".

 

Voici ou je cherche et remplace le nom "incrémenté" par le nom "brut" (sans les "_XXX").

             (if (/= (vl-string-position (ascii "_") BlkNom) nil)
              (progn (setq elst (subst (cons 2 (substr BlkNom 1 (vl-string-position (ascii "_") BlkNom))) (assoc 2 elst) elst))
                     (entmod elst)
              ) ;_ Fin de progn
            ) ;_ Fin de if

Si quelqu'un a une astuce, un conseil, je suis preneur...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Salut Gégé, et merci pour ton aide.

 

Quand tu écris "moncode", c'est le code ascii de "_" ?

 

J'ai écris ça, mais évidement, ça plante...:

(defun c:RechCar (/)
 (setq BlkNom "123_456_789_abc")
 (setq Resultat (vl-string->list "_" BlkNom))
 (setq Resultat (reverse Resultat))
 (setq posmirroir (vl-position 95 Resultat))
 (setq pos (- (length Resultat) posmirroir))
 (princ pos)
 (princ)
)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

aide en ligne:

Searching from left to right (the default), the “z” in position 1 is the first one vl-string-position encounters. But when searching from right to left, as in the following example, the “z” in position 3 is the first one encountered:

(vl-string-position (ascii "z") "azbzlmnqc" nil T)

3

Write a book about what ??

Lien vers le commentaire
Partager sur d’autres sites

Bon, j'ai réussi en test :

(defun c:RechCar (/)
 (setq BlkNom "123_456_789_abc")
 (setq Resultat (vl-string->list BlkNom))
 (setq Resultat (reverse Resultat))
 (setq posmirroir (vl-position 95 Resultat))
 (setq pos (- (length Resultat) posmirroir))
 (princ pos)
 (princ)
)

 

Mais pas dans mon code :

(defun c:RemplBlkV3 (/ ss i ent elst BlkNom)
;;; Remplacement des blocs incrémentés *
 (princ "\nRemplacement des blocs incrémentés...")
 (setq ss nil)
 (if (setq ss (ssget "_X" '((0 . "INSERT"))))
   (progn (setq i 0)
          (while (setq ent (ssname ss i))
            (setq i      (1+ i)
                  elst   (entget ent)
                  BlkNom (cdr (assoc 2 elst))
            ) ;_ Fin de setq
            (setq Resultat (vl-string->list BlkNom))
            (setq Resultat (reverse Resultat))
            (setq posmirroir (vl-position 95 Resultat))
            (setq pos (- (length Resultat) posmirroir))
            (if (/= pos nil)
              (progn (setq elst (subst (cons 2 (substr BlkNom 1 pos)) (assoc 2 elst) elst)) (entmod elst))
            ) ;_ Fin de if
          ) ;_ Fin de while
   ) ;_ Fin de progn
 ) ;_ Fin de if
)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Voici un lien pour télécharger mon DWG avec les blocs incrémentés.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Merci LrDb.

 

J'ai changé mon code :

(defun c:RemplBlkV3 (/ ss i ent elst BlkNom)
 (princ "\nDéveloppé par Denis H.")
;;; Remplacement des blocs incrémentés *
 (princ "\nRemplacement des blocs incrémentés...")
 (setq ss nil)
 (if (setq ss (ssget "_X" '((0 . "INSERT"))))
   (progn (setq i 0)
          (while (setq ent (ssname ss i))
            (setq i      (1+ i)
                  elst   (entget ent)
                  BlkNom (cdr (assoc 2 elst))
            ) ;_ Fin de setq
            (setq Resultat (vl-string->list BlkNom))
            (setq Resultat (reverse Resultat))
            (setq posmirroir (vl-position 95 Resultat))
            (setq pos (- (length Resultat) posmirroir))
            (setq pos (- pos 1))
            (setq NouvNomBlk (substr BlkNom 1 pos))
            (if (/= pos nil)
              (progn (setq elst (subst (cons 2 NouvBlkNom) (assoc 2 elst) elst)) (entmod elst))
            ) ;_ Fin de if
          ) ;_ Fin de while
   ) ;_ Fin de progn
 ) ;_ Fin de if
)

mais il me répond :

Commande: REMPLBLKV3

Développé par Denis H.

Remplacement des blocs incrémentés...; erreur: groupe DXF incorrect: (2)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Oops, j'ai écris NouvNomBlk et NouvBlkNom...

 

Mais ça ne fonctionne toujours pas...

 

Je n'ai même pas l'impression que mon code s'exécute...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Ça y est, mon code fonctionne, le voici :

(defun c:RemplBlkV3 (/ ss i ent elst BlkNom)
 (princ "\nDéveloppé par Denis H.")
;;; Remplacement des blocs incrémentés *
 (princ "\nRemplacement des blocs incrémentés...")
 (setq ss nil
       i  0
 ) ;_ Fin de setq
 (if (setq ss (ssget "_X" '((0 . "INSERT"))))
   (progn (while (setq ent (ssname ss i))
            (setq i      (1+ i)
                  elst   (entget ent)
                  BlkNom (cdr (assoc 2 elst))
            ) ;_ Fin de setq
            (setq Resultat (vl-string->list BlkNom))
            (setq Resultat (reverse Resultat))
            (setq posmirroir (vl-position 95 Resultat))
            (setq pos (- (length Resultat) posmirroir))
            (setq pos (- pos 1))
            (setq NouvBlkNom (substr BlkNom 1 pos))
            (if (/= pos nil)
              (progn (setq elst (subst (cons 2 NouvBlkNom) (assoc 2 elst) elst)) ;
                     (entmod elst)
              ) ;_ Fin de progn
            ) ;_ Fin de if
          ) ;_ Fin de while
   ) ;_ Fin de progn
 ) ;_ Fin de if
 (princ)
)

 

Mille mercis à vous...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ce conseil, mais alors pour le mettre en oeuvre...

 

Ça va être une autre paire de manche... :huh:

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

J'ai ajouter un (wcmatch dans ma condition :

             (if (and (/= pos nil) (/= (wcmatch BlkNom "*#") nil))
              (progn (setq elst (subst (cons 2 NouvBlkNom) (assoc 2 elst) elst)) ;
                     (entmod elst)
              ) ;_ Fin de progn
            ) ;_ Fin de if

Vous croyez que ça pourra fonctionner ?

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ce conseil, mais alors pour le mettre en oeuvre...

 

Ça va être une autre paire de manche... :huh:

 

Soit une liste "lst" par exemple comme ton exemple.

(setq lst '("POTEAU_BOIS" "POTEAU_BOIS_01" "POTEAU_BOIS_02" "POTEAU_BOIS_03" "POTEAU_BOIS_121" "POTEAU_BOIS_MOISE" "POTEAU_BOIS_MOISE_1" "POTEAU_BOIS_MOISE_2" "POTEAU_BOIS_MOISE_145"))

 

Ces quelques lignes devraient écarter seulement les indicés par un nombre.

(setq ln (mapcar 'vl-string->list lst))
(setq lindx (mapcar '(lambda (el / ) (- (length el) (vl-string-search "_" (vl-list->string (reverse el))))) ln))
(mapcar
'(lambda (ch i / )
	(if (eq (type (read (substr ch (1+ i)))) 'INT)
		(substr ch 1 (1- i))
		ch
	)
)
lst
lindx
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Salut bonuscad, et merci de ton aide.

 

Mais les (mapcar et les (lambda, j'essai d'éviter, je ne les maîtrise pas encore... Surtout que tu m'en a mis deux paires... Là, tu me surestimes... ;)

 

Et je n'ai pas la liste "exacte" des blocs, ils diffèrent à chaque dessin.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Le mapcar et le lambda n'était là que pour appliquer la fonction à une liste quelconque (et non pas à une liste exacte comme tu as l'air de le penser).

 

Si j'applique ce que je t'ais proposé dans ton code où tu fais une boucle while (donc plus besoin de traiter une liste mais seulement un élément), cela donnerait ceci (tu pourra commenter le (princ ..) qui te trace la conversion.

 

(defun c:RemplBlkV4 ( / ss i ent elst BlkNom Resultat indexs NouvBlkNom)
 (princ "\nDéveloppé par Denis H.")
;;; Remplacement des blocs incrémentés *
 (princ "\nRemplacement des blocs incrémentés...")
 (setq ss nil
       i  0
 ) ;_ Fin de setq
 (if (setq ss (ssget "_X" '((0 . "INSERT"))))
   (progn (while (setq ent (ssname ss i))
            (setq i      (1+ i)
                  elst   (entget ent)
                  BlkNom (cdr (assoc 2 elst))
            ) ;_ Fin de setq
            (setq Resultat (vl-string->list BlkNom))
            (setq index (- (length Resultat) (vl-string-search "_" (vl-list->string (reverse Resultat)))))
            (setq
              NouvBlkNom
              (if (eq (type (read (substr BlkNom (1+ index)))) 'INT)
                      (substr BlkNom 1 (1- index))
                      BlkNom
              )
            )
(princ (strcat "\nAncien bloc: " BlkNom " -> Nouveau bloc: " NouvBlkNom))
            (if (/= NouvBlkNom BlkNom)
              (progn (setq elst (subst (cons 2 NouvBlkNom) (assoc 2 elst) elst)) ;
                     (entmod elst)
              ) ;_ Fin de progn
            ) ;_ Fin de if
          ) ;_ Fin de while
   ) ;_ Fin de progn
 ) ;_ Fin de if
 (princ)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Mille mercis bonuscad.

 

Je comprend mieux maintenant... ;)

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour.

 

J'ai maintenant, ce code :

(defun c:RemplBlkV4 (/ ss i ent elst BlkNom Resultat indexs NouvBlkNom)
 (princ "\nDéveloppé par Denis H.")
 (princ "\nRemplacement des blocs incrémentés...")
 (setq ss nil
       i  0
 ) ;_ Fin de setq
 (if (setq ss (ssget "_X" '((0 . "INSERT"))))
   (progn
     (while (setq ent (ssname ss i))
       (setq i      (1+ i)
             elst   (entget ent)
             BlkNom (cdr (assoc 2 elst))
       ) ;_ Fin de setq
       (setq Resultat (vl-string->list BlkNom))
       (setq index (- (length Resultat) (vl-string-search "_" (vl-list->string (reverse Resultat)))))
       (setq NouvBlkNom
              (if (eq (type (read (substr BlkNom (1+ index)))) 'INT)
                (substr BlkNom 1 (1- index))
                BlkNom
              ) ;_ Fin de if
       ) ;_ Fin de setq
       (princ (strcat "\nAncien bloc: " BlkNom " -> Nouveau bloc: " NouvBlkNom))
       (if (/= NouvBlkNom BlkNom)
         (progn (setq elst (subst (cons 2 NouvBlkNom) (assoc 2 elst) elst)) ;
                (entmod elst)
         ) ;_ Fin de progn
       ) ;_ Fin de if
     ) ;_ Fin de while
   ) ;_ Fin de progn
 ) ;_ Fin de if
 (princ)
)

Mais ça ne fonctionne pas et AutoCAD me répond :

Commande: REMPLBLKV4

 

Développé par Denis H.

Remplacement des blocs incrémentés...; erreur: type d'argument incorrect: numberp: nil

 

J'avoue ne pas savoir quoi faire...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

J'ai adapté rapidement ma proposition à ta version V3.

Je n'ai pas fais de tests d'utilisation autre que sur ton DWG d'exemple.

 

erreur: type d'argument incorrect: numberp: nil

Une fonction attend un nombre mais nil lui est fournie.

 

Un petit coup de pouce!

(vl-string-search "_" "chaine ou trouver le caractère")

Si celui-ci n'est pas trouvé, le retour est nil, et faire une soustraction avec entraine une erreur...

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Lien vers le commentaire
Partager sur d’autres sites

Salut bonuscad, et merci pour ton aide, je pense avoir trouvé la solution, voici mon code qui a l'air de fonctionner :

(defun c:RemplBlkV4 (/ ss i ent elst BlkNom Resultat indexs NouvBlkNom)
 (princ "\nDéveloppé par Denis H.")
 (princ "\nRemplacement des blocs incrémentés...")
 (setq ss nil
       i  0
 ) ;_ Fin de setq
 (if (setq ss (ssget "_X" '((0 . "INSERT"))))
   (progn
     (while (setq ent (ssname ss i))
       (setq i      (1+ i)
             elst   (entget ent)
             BlkNom (cdr (assoc 2 elst))
       ) ;_ Fin de setq
       (setq Resultat (vl-string->list BlkNom))
       (if (/= (vl-string-search "_" (vl-list->string (reverse Resultat))) nil)
         (progn (setq index (- (length Resultat) (vl-string-search "_" (vl-list->string (reverse Resultat)))))
                (setq NouvBlkNom
                       (if (eq (type (read (substr BlkNom (1+ index)))) 'INT)
                         (substr BlkNom 1 (1- index))
                         BlkNom
                       ) ;_ Fin de if
                ) ;_ Fin de setq
                (princ (strcat "\nAncien bloc: " BlkNom " -> Nouveau bloc: " NouvBlkNom))
                (if (/= NouvBlkNom BlkNom)
                  (progn (setq elst (subst (cons 2 NouvBlkNom) (assoc 2 elst) elst)) ;
                         (entmod elst)
                  ) ;_ Fin de progn
                ) ;_ Fin de if
         ) ;_ Fin de progn
       ) ;_ Fin de if
     ) ;_ Fin de while
   ) ;_ Fin de progn
 ) ;_ Fin de if
 (princ)
) ;_ Fin de defun

Encore un grand merci...

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

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é