Manu_CAD Posté(e) le 9 janvier Posté(e) le 9 janvier 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 🙂
didier Posté(e) le 9 janvier Posté(e) le 9 janvier 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
Manu_CAD Posté(e) le 9 janvier Auteur Posté(e) le 9 janvier Bonjour @didier Je souhaite faire un lisp car après, je dois faire pour d'autres champs et sur des centaines de plans. Voici un example de plan, j'ai fait un nuage autour du symbole. Merci Folio_020.dwg
didier Posté(e) le 9 janvier Posté(e) le 9 janvier 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
Manu_CAD Posté(e) le 9 janvier Auteur Posté(e) le 9 janvier Bonjour @didier C'est tout a fait ça 🙂 Merci
didier Posté(e) le 9 janvier Posté(e) le 9 janvier Bonjour @Manu_CAD Je suis heureux d'être content alors ! Amicalement Éternel débutant… Mon site perso : Programmer dans AutoCAD
Manu_CAD Posté(e) le 9 janvier Auteur Posté(e) le 9 janvier 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
JPhil Posté(e) le 10 janvier Posté(e) le 10 janvier 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 <<<
didier Posté(e) le 10 janvier Posté(e) le 10 janvier 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
Manu_CAD Posté(e) le 10 janvier Auteur Posté(e) le 10 janvier Bonjour @didier Merci, c'est vrai. Je vais appliquer votre conseil. Merci 😉
Manu_CAD Posté(e) le 13 janvier Auteur Posté(e) le 13 janvier 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
didier Posté(e) le 13 janvier Posté(e) le 13 janvier 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
Manu_CAD Posté(e) le 13 janvier Auteur Posté(e) le 13 janvier Bonjour @didier Je suis désolé, je pensais qu'avec le nom du bloc et le champ à modifier, j'étais complet. Je vais regarder pour faire un message complet. Amicalement Folio_020.dwg
didier Posté(e) le 13 janvier Posté(e) le 13 janvier 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 : Souhaitez-vous redéfinir le bloc en texte simple ? et donc le souci est résolu. Souhaitez-vous garder cette "qualité" dans le bloc ? et je me remets au travail. Amicalement Éternel débutant… Mon site perso : Programmer dans AutoCAD
Manu_CAD Posté(e) le 13 janvier Auteur Posté(e) le 13 janvier Bonjoue @didier Je dois garder ce bloc, il est imposé par le client. Merci pour ton aide
didier Posté(e) le 13 janvier Posté(e) le 13 janvier 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
Manu_CAD Posté(e) le 13 janvier Auteur Posté(e) le 13 janvier 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 😉
didier Posté(e) le 13 janvier Posté(e) le 13 janvier 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. Par 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
Manu_CAD Posté(e) le 13 janvier Auteur Posté(e) le 13 janvier 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
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant