Aller au contenu

Supprimer une chaine de caractère dans un attribut


Messages recommandés

Posté(e)

(Re) salut à tous,

 

Voici la suite de la série: "Quand Bono05 supplie de l'aide!"

 

Maintenant il faudrait que je puisse supprimer (dans mon cas) 4 caractères au milieu de mon attribut.

 

Ex: (pour de vrai cette fois! hein gile :P )

07D.07D.206-208

Doit devenir

7D.07D.208

 

Donc ici "206-" doit disparaître de mon attribut.

Comme dans mon précédent post ce sont des attributs isolés (1300 fois quand même) que je dois pouvoir moi même selectionner.

 

Et comme vous êtes des magiciens (disparaitre-magiciens compris non? bon je zappe...)! :rolleyes:

 

MERCi!!

Posté(e)

Alors il faudrait en savoir un peu plus sur la structure de ta chaîne.

 

La position est variable ou fixe?

 

Les 3 caractères sont toujours placé avant le "-"?

 

Le début de chaîne est toujours identique?

 

On peut être magicien mais pas devin! :(rires forts):

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

Posté(e)

Alors il faudrait en savoir un peu plus sur la structure de ta chaîne.

 

La position est variable ou fixe?

 

Les 3 caractères sont toujours placé avant le "-"?

 

Le début de chaîne est toujours identique?

 

On peut être magicien mais pas devin! <img src='http://cadxp.com/public/style_emoticons/<#EMO_DIR#>/laugh.gif' class='bbc_emoticon' alt=':(rires forts):' />

 

Je comprend... B)

 

Position - variable

3 caractères sont toujours comme l'exemple, donc devant le "-"

Début de chaine - 5 zones --> 07A-07A, 07B-07B, ....., 07E-07E.

 

Si tu as d'autres questions je n'hésiterai pas à te répondre. ;)

Posté(e)

Alors typiquement pour ce formatage, essayes ceci (testé succinctement)

 

(vl-load-com)
(defun c:text_replace ( / AcDoc Space ename string pos)
(defun sel_onlyText (msg / js)
	(princ msg)
	(while
		(not
			(setq js
				(ssget "_+.:E:S:N" 
					(list
						(cons 0 "*TEXT,MULTILEADER,ATTRIB")
						(cons 67 (if (eq (getvar "CVPORT") 2) 0 1))
						(cons 410 (if (eq (getvar "CVPORT") 2) "Model" (getvar "CTAB")))
					)
				)
			)
		)
	)
	(vlax-ename->vla-object (cadar (ssnamex js 0)))
)
(setq
	AcDoc (vla-get-ActiveDocument (vlax-get-acad-object))
	Space
	(if (eq (getvar "CVPORT") 1)
		(vla-get-PaperSpace AcDoc)
		(vla-get-ModelSpace AcDoc)
	)
)
(setq ename (sel_onlyText "\nSélectionner le texte: "))
(setq string (if (vlax-property-available-p ename 'TextString) (vlax-get ename 'TextString)))
(if string
	(if (wcmatch string "*-*")
		(progn
			(setq pos (vl-string-position (ascii "-") string))
			(vlax-put ename 'TextString (strcat (substr string 2 (- pos 4)) (substr string (+ pos 2))))
		)
	)
)
(prin1)
)

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

Posté(e)

Me revoila...bonjour à tous et à Bonuscad,

 

Après un test je constate les choses suivantes:

 

1)Cela ne fonctonne pas avec un attribut texte...mais bien avec un texte.

2)Le résultats final est le suivant 07D.07D.226-228 (attribut d'origine) devient 7D.07D.228

Il a donc bien supprimer les 4 caractères du milieu...mais également le "0" en première position.

 

Voilà pour les tests.

Maintenant j'espère que cela ne sera pas trop compliqué pour modifier ces petits détails. ;)

Posté(e)

Salut

 

Pas besoin de lisp, tu peux utiliser la fonction rechercher/remplacer.

 

Sinon, une routine plus polyvalente, dans le même esprit sur rechercher/remplacer

(defun c:atx(/ blo doc ent tx1 tx2 txt)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and	(ssget (list (cons 0 "insert") (cons 66 1)))
(setq tx1 (getstring T "\nTexte à rechercher : "))
(setq tx2 (getstring T "\nTexte remplacant : "))
   (progn
     (vlax-for blo (setq sel (vla-get-activeselectionset doc))
(foreach ent (vlax-invoke blo 'getattributes)
  (and (wcmatch (setq txt (vla-get-textstring ent)) (strcat "*" tx1 "*"))
    (cond
      ((wcmatch txt (strcat tx1 "*"))
	(setq txt (strcat tx2 (substr txt (1+ (strlen tx1)))))
      )
      ((wcmatch txt (strcat "*" tx1))
	(setq txt (strcat (substr txt 1 (- (strlen txt) (strlen tx1))) tx2))
      )
      (T
	(setq txt (strcat (substr txt 1 (vl-string-search tx1 txt))
			  tx2
			  (substr txt (+ (vl-string-search tx1 txt) (strlen tx1) 1))
		  )
	)
      )
    )
    (vla-put-textstring ent txt)
  )
)
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

Par exemple, tu recherches "226-" que tu remplaces par "" (autrement dit rien)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Salut Patrick,

 

Comme cité plus haut, "-226" est un exemple qui fait partie d'une série de plus de 1300 combinaisons différentes.

Comme la partie de texte à supprimer se trouve toujours au même endroit, c'est la raison pour laquelle je ne vois qu'un lisp pour me dépanner.

 

Donc pour exemple:

 

07D.07D.xxx-ooo

 

Les "x" et le "-" doivent être supprimés (xxx étant chaque fois un autre numéro).

Les "o" doivent restés.

Posté(e)

En modifiant le lisp de base

 

(defun c:atx(/ blo doc ent tx1 tx2 txt)
 (setq doc (vla-get-activedocument (vlax-get-acad-object)))
 (vla-startundomark doc)
 (and	(ssget (list (cons 0 "insert") (cons 66 1)))
   (progn
     (setq tx2 "")
     (vlax-for blo (setq sel (vla-get-activeselectionset doc))
(foreach ent (vlax-invoke blo 'getattributes)
  (setq txt (vla-get-textstring ent))
  (and (vl-string-search "-" txt)
       (> (vl-string-search "-" txt) 2)
       (setq tx1 (substr txt (- (vl-string-search "-" txt) 2) 4))
    (cond
      ((wcmatch txt (strcat tx1 "*"))
	(setq txt (strcat tx2 (substr txt (1+ (strlen tx1)))))
      )
      ((wcmatch txt (strcat "*" tx1))
	(setq txt (strcat (substr txt 1 (- (strlen txt) (strlen tx1))) tx2))
      )
      (T
	(setq txt (strcat (substr txt 1 (vl-string-search tx1 txt))
			  tx2
			  (substr txt (+ (vl-string-search tx1 txt) (strlen tx1) 1))
		  )
	)
      )
    )
    (vla-put-textstring ent txt)
  )
)
     )
     (vla-delete sel)
   )
 )
 (vla-endundomark doc)
 (princ)
)

 

Le lisp permet une selection.

Pour l'éviter, il suffit d'ajouter "X" au ssget

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Patrick,

 

Test 100% réussi! GRAND merci pour ton aide.

 

Est-il possible de voir le résultat lors du clic sur l'attribut...et non après la selection multiple?

 

Maintenant peux-tu donner un petit mot d'explication concernant ce lisp?

 

Pour commencer les choses les plus simple pour vous développeur sont pour nous très compliqué.

Pour l'éviter, il suffit d'ajouter "X" au ssget
:unsure:

 

Ensuite puis-je réutiliser facilement :o ce lisp pour une autre circonstance où les caractères à supprimer se trouveraient à un autre endroit dans le texte?

Posté(e)

Pour commencer les choses les plus simple pour vous développeur sont pour nous très compliqué.

:unsure:

J'ai justement évité de donner la solution pour t'inciter au lisp.

Avec une recherche, tu trouveras très rapidement

 

Ensuite puis-je réutiliser facilement :o ce lisp pour une autre circonstance où les caractères à supprimer se trouveraient à un autre endroit dans le texte?

Le lisp ne s'occupe pas de la position du - dans les attributs.

Il suffit de trois caractères au minimum devant le moins pour qu'il fonctionne.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)
J'ai justement évité de donner la solution pour t'inciter au lisp.

Avec une recherche, tu trouveras très rapidement

 

Très bonne démarche....interdiction de rire!! j'avait déjà essayé comme ceci...

(and (ssgetX (list (cons 0 "insert") (cons 66 1)))

 

Et comme ceci:

(and (ssget X (list (cons 0 "insert") (cons 66 1)))

 

Sans doute trop simple car fonctionne pas.

 

mais je continuerai ma recherche!! <img src='http://cadxp.com/public/style_emoticons/<#EMO_DIR#>/laugh.gif' class='bbc_emoticon' alt=':(rires forts):' />

 

Et pour ceci Patrick?

Est-il possible de voir instantanément le résultat lors du clic sur l'attribut...et non après la selection multiple?
Posté(e)

Très bonne démarche....interdiction de rire!! j'avait déjà essayé comme ceci...

(and (ssgetX (list (cons 0 "insert") (cons 66 1)))

 

Et comme ceci:

(and (ssget X (list (cons 0 "insert") (cons 66 1)))

 

Sans doute trop simple car fonctionne pas.

 

mais je continuerai ma recherche!! <img src='http://cadxp.com/public/style_emoticons/<#EMO_DIR#>/laugh.gif' class='bbc_emoticon' alt=':(rires forts):' />

Pense aux guillemets ;)

 

Et pour ceci Patrick?

Oui, mais dans ce cas, tu seras obligé de sélectionner les attributs un par un, et pas moyen de globaliser la sélection (nentsel)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Oui, mais dans ce cas, tu seras obligé de sélectionner les attributs un par un, et pas moyen de globaliser la sélection (nentsel)

Là tu as raison c'est beaucoup moins pratique...

 

Pour le "X" je cherche encore...mais ça viendra.

 

Bien voilà une nouvelle demande réussie à 100%!!

 

Encore un tout GRAND merci ton aide et a Bonuscad pour sa participation! :D

Posté(e)

Super le lien alala....merci!

 

Si je décide d'apprendre le lisp, quel chemin me conseilleriez-vous?

Des cours, des livres, des lien sur le net...

 

je parle pour un nul bien sur! :P

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é