Aller au contenu

Remplacer une chaine de caractère par une autre


Messages recommandés

Posté(e)

Bonjour à toutes et tous,

Mes meilleurs voeux pour cette nouvelle année.

Je débute en lisp et je suis bloqué.

J'ai des blocs avec comme nom "DREF_INC_DOWN" et avec un attribut "REF_0A".

Je voudrai quand il trouve ce bloc, qu'il lise le champ "REF_01" et si il trouve dans la chaine de caractère de cet attribut "SF6" il doit remplacer par "GAS"

Voici le début de ma routine:

(setvar "cmdecho"    1)        ;;; voir le défilement des commandes
;(setvar "cmdecho"    0)        ;;; supprimer le défilement des commandes
(setvar "SECURELOAD"    0)        ;;; voir le défilement des commandes
;;; -----------------------------------------
;;; Fonction principale
;;; 

(defun  C:SF6()

      (graphscr)                        ;;; bascule sur l'éditeur GRAPHIQUE...

      (lire_attrib)
    
    
    
    
    
    
    
    
    (princ)
);defun  C:SF6

    (graphscr)                    ;;; bascule sur l'éditeur graphique
    
;;; -----------------------------------------
;;; Fonction secondaire
;;;
(princ)
;;; ----------------------------------
;;;  lire les données du cartouche
;;;
(defun  lire_attrib()
    
    ;;; nom bloc cartouche =   DREF_INC_DOWN / DREF_INC_UP / DREF_INC_RIGHT / DREF_INC_LEFT
    ;;;(setq    ENTALL        (ssget "X"    '( (0 . "INSERT") (and (2 . "DREF_INC_DOWN" ) (2 . "DREF_INC_UP" ) (2 . "DREF_INC_RIGHT" ) (2 . "DREF_INC_LEFT" ) ) ) )
     (setq    ENTALL        (ssget "X"    '( (0 . "INSERT") (2 . "DREF_INC_DOWN" ) ) )
        NOMBLOC     (ssname    ENTALL    0)
        NUM        0
    );setq

      ;;; ---------------------------------------
      ;;; récupère le NOM du bloc DYNAMIQUE

    (setq    NOMBLDYN    (vla-get-EffectiveName    (vlax-ename->vla-object NOMBLOC)    )     );setq
      
      (while    NOMBLOC
          ;;; ---------------------------------------
          ;;; récupère le N° ENTITE (bloc)
          (setq    NOMBLOC    (entnext    NOMBLOC) )

          ;;; ---------------------------------------
          ;;; récupère le TYPE D'ENTITE
          (if    NOMBLOC
            (setq    VERIFATT    (cdr    (assoc 0 (entget NOMBLOC ) ) )     );setq
        );if

        ;;; ---------------------------------------
          ;;; TESTE si arrive à la fin des ATTRIBUTS)
          (if    (=    VERIFATT    "SEQEND")
            (setq    NOMBLOC    nil)
        );if
      
          ;;; -------------------------------------------
          ;;; Affiche la liste des étiquettes d'ATTRIBUTS

          (if    NOMBLOC
            (setq    ETIQUETTE    (cdr    (assoc 2 (entget NOMBLOC ) ) )
                VALATT        (cdr    (assoc 1 (entget NOMBLOC ) ) )
            );setq
        );if

        (if    (=    ETIQUETTE    "REF_01")
              (setq    RENV    VALATT)
              ;;;;(atoi    RENV)
              ;;;;(if    (=    RENV    (WCMATCH    "RENV"    "*SF6*"))
              (subst "GAZ" "SF6" RENV)
              ;;;;);if
        );if

           (setq    NUM    (+    NUM    1) )
      
    );while
  
(princ)
);defun lire_attrib

 

Merci pour vos retours 🙂

Posté(e)

Bonjour @Manu_CAD

Merci d'utiliser le formatage du code dans les messages pour faciliter la lecture.

Votre routine présente quelques erreurs de syntaxe, mais avant de chercher à corriger, je me permets de vous signaler qu'il existe une commande native pour faire ce que vous demandez.

C'est la commande RECHERCHER, vous lui donnez la chaine à modifier et ce qui doit remplacer et elle vous guidera pour faire le job.

Si, toutefois, vous êtes demandeur d'un LSP explicitement, donnez-nous un exemple du bloc dans lequel il faut faire la modif.
Il y a peut-être des particularités qu'on ignore si on vous écrit un code générique.

Amicalement

 

Éternel débutant…
Mon site perso : Programmer dans AutoCAD

 

 

Posté(e)

Bonjour @Manu_CAD

Je ne me suis pas servi du LSP fourni dans le premier message, j'ai préféré partir d'une feuille blanche.
La valeur à remplacer est dans la variable t1, le remplacement est dans la variable t2.
Merci de me dire si c'est satisfaisant ou s'il faut prévoir des améliorations.

Le nom de la commande est SF6.

Amicalement

Manu_Cad-01.lsp

Éternel débutant…
Mon site perso : Programmer dans AutoCAD

 

 

Posté(e)

Bonjour @didier

Je peux encore abuser un peu?

Est-il possible d'avoir des commentaires pour essayer de comprendre le code ?

Je n'avais pas encore vu cette commande en lsp : vl-string-search

Merci

Posté(e)
Il y a 17 heures, Manu_CAD a dit :

Est-il possible d'avoir des commentaires pour essayer de comprendre le code ?
Je n'avais pas encore vu cette commande en lsp : vl-string-search

Plus d'info sur cette commande >>> ici <<<

Posté(e)

Bonjour @Manu_CAD

Bien sûr que je peux expliquer !
Mais si vous êtes dans une phase d'apprentissage, je me permets de vous conseiller de faire personnellement des recherches.
En écrivant et vous proposant le code, je vous ouvre des pistes de recherches.
En allant chercher par vous-même, vous vous mettez en mode "je veux comprendre" et ce sera mémorisé,
Si je vous explique, vous êtes en mode "j'entends" et ça n'aura pas plus d'impact qu'une vidéo plicploc.

Cherchez, faites des tests, des essais, des erreurs et vous apprendrez efficacement.
Si vous bloquez dans la compréhension, je serai là pour vous débloquer.

Amicalement

PS : Merci à @JPhil de citer mon site, au moins je n'ai pas l'impression de faire tout ça pour personne !

 

Éternel débutant…
Mon site perso : Programmer dans AutoCAD

 

 

Posté(e)

Bonjour @didier

Je regarde pour comprendre le lisp que tu m'as fait.

J'ai mis des commentaires et j'essaie de l'adapter pour le bloc "S_IO_BI16" qui se trouve dans le même dwg.

Je pensais juste adapter ton lisp en changeant le nom du bloc et de l'attribut, mais il bloque.

Je pense que la cause est dû au fait que le champ I/O_DESCR_FR du bloc S_IO_BI16 est en multitexte ?

 

Manu_Cad-01_ajout BI_BO.lsp

 

Merci pour ton aide

Posté(e)

Bonjour @Manu_CAD

Comme d'habitude, la question est incomplète ! un jour, c'est certain, j'arrêterai de répondre à cause de cet état de fait !

Comment je peux vérifier quelque chose qui ne fonctionne pas si je n'ai pas la définition du bloc en question ?

Merci de me donner la possibilité d'apporter de l'aide en fournissant les données complètes du problème, en l'occurrence un dessin avec le bloc concerné.

Amicalement

Éternel débutant…
Mon site perso : Programmer dans AutoCAD

 

 

Posté(e)

Bonjour @Manu_CAD

OK, merci pour le bloc.

Oui, il semble bien que la "qualité" texte multiple soit la cause du souci.

Deux possibilités :

  1. Souhaitez-vous redéfinir le bloc en texte simple ? et donc le souci est résolu.
  2. Souhaitez-vous garder cette "qualité" dans le bloc ? et je me remets au travail.

Amicalement

Éternel débutant…
Mon site perso : Programmer dans AutoCAD

 

 

Posté(e)

Bonjour @Manu_CAD

OK donc voici une version améliorée.

Par contre, vous faites une bêtise en redéfinissant la commande dans le LSP sans changer le nom de la commande.
Quand vous tapez SF6, vous n'avez pas moyen de savoir quel bloc sera pris en compte.

Si vous devez changer la partie de texte "SF6" par "GAS" dans tous les blocs du dessin qui contiennent cette partie de chaine, dites-le-moi et je vous ferai une troisième version qui en tient compte.

Autre chose, j'ai mis des commentaires, mais si vous êtes réellement en phase d'apprentissage LSP, vous ne choisissez pas la bonne méthode de commencer par travailler les attributs.
Je le dis à chaque fois que je rencontre un apprenant, mais je sais pertinemment que personne n'en tient compte jusqu'au moment où ils se plantent.

Amicalement

Manu_Cad-02.lsp

Éternel débutant…
Mon site perso : Programmer dans AutoCAD

 

 

Posté(e)

Bonjour @didier

Je me doute, mais je suis embêté de demander et qu'on me fasse le lisp 😞

Vous m'avez fait une bonne base et je pensais pouvoir partir de là.

En fait le travail est bien plus compliqué car, la première partie est bonne et après il faudrait faire pour tous les blocs qui commencent par S_IO_BO et S_IO_BI qui ont l'attribut I/O_DESCR_FR remplacer SF6 par GAZ et et I/O_DESCR_NL SF6 par GAS.

Et une troisième étape pour des textes et multitextes s’il est dans le layer INFO_FR SF6 par GAZ et s’il est dans le layer INFO_NL SF6 par GAS.

Mais je vois que travailler les blocs est vraiment un haut niveau 😉

Posté(e)

Bonjour @Manu_CAD

J'ai bien compris pour la première partie avec les noms de blocs avec préfixe S_IO_B*, je vais le faire.
P
ar contre, je n'ai pas compris ce que vous appelez la troisième étape, c'est le nom du calque qu'il faut changer ?

Dernière chose, je dois m'absenter quelques jours, je ne sais pas quand j'aurai du temps pour ce faire, mais je le ferai.

Amicalement

Éternel débutant…
Mon site perso : Programmer dans AutoCAD

 

 

Posté(e)

Non il y a des textes et des multitextes.

Si le texte ou multitexte se trouve dans le layer INFO_FR, on doit remplacer SF6 par GAZ et s'il se trouve dans le layer INFO_NL, on doit SF6 par GAS. C'est enfonction de la langue d'utilisation.

Oui, pas de problème

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é