Aller au contenu

recherche et remplace texte


jacobs33

Messages recommandés

Bonjour,

je viens d'écrire ce bout de code qui recherche et remplace du texte dans un jeux de sélection.

 

question 1: pourquoi le message suivant quand je charge le code.

" erreur: parenthèse fermante supplémentaire en entrée

 

question 2:pourquoi le message suivant a la fin de l'exécution du code

" erreur: type d'argument incorrect: lentityp nil"

 

question 3: la fonction "Subst" ne supporte pas bien les caractères génériques.

exemple:

(vl-string-subst "" "??.00 m2" Asso1))

(vl-string-subst "" "?.00 m2" Asso1))

 

existe t'il une autre fonction?

 

(defun c:crtxt (/ sel1 ent Asso0 Asso1 NewAsso1)
 (setq sel1 (ssget "X" '((0 . "*TEXT"))))
 (setq n 0)
 (while (setq ent (entget (ssname sel1 n)))
   (setq Asso0 (cdr (assoc 0 ent)))
   (setq Asso1 (cdr (assoc 1 ent)))
   (if	(wcmatch Asso0 "*TEXT")
     (if (wcmatch Asso1 "*?.00 m2*,*??.00 m2*")
(progn
  (setq NewAsso1 (vl-string-subst "" "18.00 m2" Asso1))
  (setq ent (subst (cons 1 NewAsso1) (assoc 1 ent) ent))
  (ENTMOD ent)
)
     )
   )
   (setq n (1+ n))
 )
)

 

Merci d'avance pour votre participation et vos réponses. :) :)

Lien vers le commentaire
Partager sur d’autres sites

pourquoi le message suivant quand je charge le code.

" erreur: parenthèse fermante supplémentaire en entrée

Je ne sais pas. Pas de problème chez moi, l'appariement des parenthèses est bon.

 

question 2:pourquoi le message suivant a la fin de l'exécution du code

" erreur: type d'argument incorrect: lentityp nil"

Aucune idée. J'ai testé un peu, ca fonctionne.

 

question 3: la fonction "Subst" ne supporte pas bien les caractères génériques.

exemple:

(vl-string-subst "" "??.00 m2" Asso1))

 

Subst ou vl-string-subst ?

 

Chez moi ca fonctionne :

recherche des textes

Si le texte comprend .00m2 [les ? ou ?? ne changent pas grand chose] alors le texte "18.00 m2" est testé. S'il est présent, il est effacé (remplacé par "").

 

Etrange programme....

 

Remarque 1 : si tu lisais ici tu verrais, qu'encore une fois (parce que tu n'es pas le seul), un message a été posté sans prendre en compte ce que suggère la subdivision des forums.

On ne peut pas juger de ton niveau si tu cherches à résoudre un problème dans le mauvais sous-forum. Peut-être devrais-tu préciser dans le forum "débuter en lisp" ce que tu veux faire avec des caractères génériques.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

question 2:pourquoi le message suivant a la fin de l'exécution du code

" erreur: type d'argument incorrect: lentityp nil"

 

Cela vient de là: (while (setq ent (entget (ssname sel1 n)))

 

Tu fais un test de boucle sur un entget, alors qu'il faudrait le faire sur ssname

La boucle s'arrête quand il n'y a plus d'entité dans le jeux de sélection.

 

(while (setq entname (ssname sel1 n))

(setq ent (entget entname)).......

 

 

Autrement vu que tu fais une sélection filtrée sur des TEXTE, la condition (if (wcmatch Asso0 "*TEXT") est inutile.

 

 

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

Merci pour vos réponses Super

Effectivement je me suis tromper de forum ne suis pas un PRO, (plutôt vieux débutant) mais un petit gars qui écris quelque lignes de temps en temps pour me simplifier la vie.

-comment faire pour changer le sujet de forum?

l'idée de ce code et de supprimer les Textes de la forme 00.00 m2 et 0.00 m2 dans le dessin.

Je viens d'essayer avec le fonction "subst" ça me fonctionne pas.

 

(defun c:crtxt (/ sel1 ent Asso0 Asso1 NewAsso1)
 (setq sel1 (ssget "X" '((0 . "*TEXT"))))
 (setq n 0)
 (while (setq entname (ssname sel1 n))
   (setq ent (entget entname))
   (setq Asso0 (cdr (assoc 0 ent)))
   (setq Asso1 (cdr (assoc 1 ent)))
   (if	(wcmatch Asso1 "*?.00 m2*,*??.00 m2*")
     (progn
(setq NewAsso1 (vl-string-subst ""  [surligneur]"*??.00 m2*"[/surligneur]  Asso1))
(setq ent (subst (cons 1 NewAsso1) (assoc 1 ent) ent))
(ENTMOD ent)
     )
   )
   (setq n (1+ n))
 )
)

Lien vers le commentaire
Partager sur d’autres sites

l'idée de ce code et de supprimer les Textes de la forme 00.00 m2 et 0.00 m2 dans le dessin.

 

maintenant que tu es plus précis, ce code devrait pouvoir suffire.

Autrement teste et continu à faire tes propositions.

 

(defun c:crtxt (/ sel1 n ent Asso1 pos)
 (setq sel1 (ssget "X" '((0 . "*TEXT"))))
 (cond
   (sel1
     (setq n 0)
     (while (setq entname (ssname sel1 n))
       (setq
         ent (entget entname)
         Asso1 (cdr (assoc 1 ent))
       )
       (cond
         ((setq pos (vl-string-search "00.00 m2" asso1))
           (entmod (subst (cons 1 (substr asso1 1 pos)) (assoc 1 ent) ent))
         )
         ((setq pos (vl-string-search "0.00 m2" asso1))
           (entmod (subst (cons 1 (substr asso1 1 pos)) (assoc 1 ent) ent))
         )
       )
       (setq n (1+ n))
     )
   )
 )
 (prin1)
)

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,

 

Je voulais Faire un truc dans le genre mais le problème c'est que la "case" n'est pas respectée ça devient compliqué exemples :

 

sdfsf

1.00m2

sdfdsf

 

sdfsf

12.00m2

sdfdsf

 

sdfsf

12.00 m2

sdfdsf

 

sdfsf

13.0 m2

 

ci quelqu'un a une solution plus simple je prend. sinon je vais utiliser la commande _find....

 

 

(defun c:crtxt (/ sel1 n ent Asso1 pos)
 (setq sel1 (ssget "X" '((0 . "*TEXT"))))
 (cond
   (sel1
    (setq n 0)
    (while (setq entname (ssname sel1 n))
      (setq
 ent	   (entget entname)
 Asso1	   (cdr (assoc 1 ent))
 Longasso1 (strlen Asso1)
 pos	   (vl-string-search "m2" asso1)
      )
      (setq ApresPos (substr asso1 (+ 5 pos)))
      (setq AvantPos (substr asso1 1 (- pos 5)))
      (setq nouvelChaine (STRCAt AvantPos ApresPos))
      (entmod
 (subst (cons 1 nouvelChaine) (assoc 1 ent) ent)
      )
      (setq n (1+ n))
    )
   )
 )
 (prin1)
)

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é