Aller au contenu

Gestion de caractères dans une chaine


DenisHen

Messages recommandés

Bonjour à tous.

 

Voilà, je cherche à supprimer tout les caractère à droite d'un "_" dans une chaine.

 

Je m'explique, je remplace des blocs nommés "CA03_1" "CA03_2, "CA03_3" ainsi de suite par le bloc "CA03". Bien sûr, la position du "_" n'est pas toujours la même...

 

Donc, dans un (subst, je ne sais pas trop quoi mettre ensuite...

J'ai une liste de paires pointées :

  (setq LstBlk '(                       ;
                ("AA04_*" . "AA04")
                ("AA05_*" . "AA05")
                ("AB01_*" . "AB01")
                ("AB03_*" . "AB03")
                ("AF01_*" . "AF01")
                ("AF03_*" . "AF03")
                ("AF05_*" . "AF05")
                ...
               )
 ) ;_ Fin de setq

Et la liste est longue et, pas complète, je l'augmente à mesure que je trouve des "nouveaux" blocs.

Et voici ma boucle :

  (foreach PosLstBlk LstBlk
   (setq n 0)
   (if (setq Select (ssget "_X" (list (cons 0 "INSERT") (cons 2 (car PosLstBlk)))))
     (while (setq ent (ssname Select n))
       (setq elst (entget ent))
       (setq elst (subst (cons 2 (cdr PosLstBlk)) (assoc 2 elst) elst))
       (entmod elst)
       (setq n (+ n 1))
     ) ;_ Fin de while
   ) ;_ Fin de if
 ) ;_ Fin de foreach

 

Je suis sûr que je peut éviter la liste des paires... J'ai essayé avec un (vl-position mais je tourne en rond...

 

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,

 

La fonction substr retourne la sous-chaîne depuis l'index spécifié (base 1) et, optionnellement, de la longueur spécifiée.

La fonction vl-string-position retourne la position d'un caractère dans une chaîne.

Ce que veux obtenir, c'est la sous-chaine depuis le premier caractère (indice 1) d'une longueur égale à la position du caractère "_".

 

(substr str 1 (vl-string-position (ascii "_") str))

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

Lien vers le commentaire
Partager sur d’autres sites

Salut (gile), et merci, encore une fois, pour ton aide précieuse...

 

Mais je ne comprend pas où ça déconne, voici ce que j'ai fais :

  (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
            (princ (strcat "\nNom du bloc=" BlkNom))
            (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
            (setq n (+ n 1))
          ) ;_ Fin de while
   ) ;_ Fin de progn
 ) ;_ Fin de if

Et AutoCAD me répond :

; erreur: type d'argument incorrect: numberp: nil

 

Je ne sais pas où est l'erreur...

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

Je ne sais pas où est l'erreur...

 

Pour savoir ou est l'erreur, tu peux utiliser la méthode décrite chapitre 4.5 de "Introduction à AutoLISP" :

Si le déroulement d’une routine génère une erreur, on peut déterminer l’expression en cause en activant Arrêt sur erreur (Menu Débogage), puis en utilisant l’outil : Source de la dernière interruption (Ctrl+F9). Une fois l’erreur localisée, on doit Réinitialiser(Ctrl+Q).

 

Je pense que ça devrait être : (setq n (+ n 1)) où n est nil.

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

Lien vers le commentaire
Partager sur d’autres sites

Salut, et merci pour votre aide.

 

(gile) : je n'arrive pas à utiliser le debogueur, tout ses icones sont toujours grisé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

Salut à tous.

 

Lorsque je place, dans Visual LISP, un point d'arrêt (F9), j'enregistre et recharge ce Lisp dans AutoCAD, la routine ne s'arrête pas sur ce point, elle est exécuté dans sa totalité...

 

Qu'est-ce que je fais de mal ?

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 (gile) et merci pour ta réponse.

 

Oui, je viens de le faire, sans changement... Et lorsque je retourne dans Visual LISP, il n'y a plus de points d'arrêt...

 

Où dois-je les placer, avant une parenthèse, après...?

 

Du coup, je ne sais toujours pas ce qui cloche dans mon code :(

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,

 

Un petit screencast pour montrer quelques fonctions de débogage de l'éditeur Visual LISP.

Mais qu'un code soit débogué (qu'il ne génère plus d'erreurs) ne veut pas dire qu'il fonctionne comme attendu.

On ne renomme pas des référence de bloc, on renomme les définitions de bloc...

 

  • Upvote 2

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

Lien vers le commentaire
Partager sur d’autres sites

Finalement il l'a eue ou pas sa formation AutoLisp l'ami DenisHEN ?

Pas encore, mais ça arrive... C'est début juin... Mais pas où je voulais...

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

(gile), que dire... Génial, je comprend maintenant le débogueur... :)

 

Tu peur le "clouer" dans "Débuter en LISP", je suis sur que ça servira à d'autres...

 

Et j'ai trouvé les erreurs, comme dans ton exemple... Et ma routine fonctionne super...

 

Encore un super grand merci à toi... ;)

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é