Aller au contenu

Remplacement de texte


Invité tjrsNRV

Messages recommandés

Posté(e)

bonjour,

 

Pour le nettoyeur.dvb, je cherches à remplacer :

 

{\fArial|b0|i0|c204|p34;EC Terminaux\PAi:\fArial|b0|i0|c0|p34;2.90\fArial|b0|i0|c204|p34;/11\fArial|b0|i0|c0|p34;2.90\fArial|b0|i0|c204|p34;\P0.020 m³/h AC DN\fArial|b0|i0|c161|p34;15}

 

 

par

 

EC Terminaux\PAi:2.90/112.90\P0.020 m³/h AC DN15

 

 

 

ça permettrait d'enlever le forçage des textes multilignes.

 

J'ai commencé avec ça mais j'arrive pas à définir l'algorithme, c'est pas forcément un problème de code, mais comment faire car les fArial peuvent être autre chose que du Arial, les autres valeurs aussi peuvent changer, et la longueur du texte aussi.

 

 

Set objMTexte = ent
strTexte = objMTexte.FieldCode
strTexte = VBA.Replace(strTexte, "{\f", "")
strTexte = VBA.Replace(strTexte, "}", "")
objMTexte.TextString = strTexte

 

 

sechanbask

Posté(e)

Salut,

 

Question difficile.

Il faut aller chercher les points virgules suivants les accolades ouvrantes et supprimer tout ça (moins les \P si tu veux les conserver) plus l'accolade fermante correspondante.

Mais ça n'est pas aussi simple, les chaînes utilisant des accolades, des anti-slashes, etc. demandent des traitements spéciaux.

 

Une autre solution, peut-être plus simple consiste à utiliser VBScript.RegExp avec la méthode Replace.

 

Je ne suis pas sûr de la syntaxe VBA (je ne pratique pas ce langage) mais ça devrait être quelque chose du genre :

 

Dim str as String = "{\fArial|b0|i0|c204|p34;EC Terminaux\PAi:\fArial|b0|i0|c0|p34;2.90\fArial|b0|i0|c204|p34;/11\fArial|b0|i0|c0|p34;2.90\fArial|b0|i0|c204|p34;\\P0.020 m³/h AC DN\fArial|b0|i0|c161|p34;15}"
Dim regEx as RegExpl = new RegExp

regEx.IgnoreCase = false
regEx.Global = true
regEx.Multiline = true

regEx.Pattern = "\\\\"
str = regEx.Replace str "Ð"

regEx.Pattern = "\\(\\[ACcFfHLlOopQTW])|\\[ACcFfHLlOopQTW][^\\;]*;|\\[ACcFfHLlOopQTW]"
str = regEx.Replace str "$1"

regEx.Pattern = "([^\\])\\S([^;]*)[/#\^]([^;]*);"
str = regEx.Replace str "$1$2/$3"

regEx.Pattern = "\\(\\S)|[\\](})|}"
str = regEx.Replace str "$1$2"

regEx.Pattern = "[\]({)|{"
str = regEx.Replace str "$1"

regEx.Pattern = "(\\[ACcFfHLlOopQSTW])|({)|(})"
str = regEx.Replace str "\$1$2$3"

regEx.Pattern = "Ð"
str = regEx.Replace str "\\"

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

Posté(e)

Mais VBA est en train de disparaître, il est temps de passer à .NET.

 

.NET fournit des méthodes qui rendent ce type de choses plus aisées.

 

Exemple, la méthode 'GetStrippedMtextContents' définie ci dessous retourne un chaîne qui correspond au contenu du Mtext débarrassé de tous ses formatages.

 

C#

using System.Text;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;

namespace StripMtextSample
{
   public class StripMtext
   {
       private StringBuilder m_sb = null;

       public string GetStrippedMtextContents(MText mt)
       {
           m_sb = new StringBuilder();
           mt.ExplodeFragments(new MTextFragmentCallback(FragmentCallback));
           return m_sb.ToString();
       }

       private MTextFragmentCallbackStatus FragmentCallback(MTextFragment fragment, object obj)
       {
           m_sb.Append(fragment.Text);
           return MTextFragmentCallbackStatus.Continue;
       }
   }
}

 

VB

Imports System.Text
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.DatabaseServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Runtime

Namespace StripMtextSample
Public Class StripMtext
	Private m_sb As StringBuilder = Nothing

	Public Function GetStrippedMtextContents(mt As MText) As String
		m_sb = New StringBuilder()
		mt.ExplodeFragments(New MTextFragmentCallback(AddressOf FragmentCallback))
		Return m_sb.ToString()
	End Function

	Private Function FragmentCallback(fragment As MTextFragment, obj As Object) As MTextFragmentCallbackStatus
		m_sb.Append(fragment.Text)
		Return MTextFragmentCallbackStatus.[Continue]
	End Function
End Class
End Namespace

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

Posté(e)

C'est bien le .net mais nous n'avons que VBA dans le 2007.

Au pire, tu n'aurais pas la même chose en lisp ?

Posté(e)

C'est bien le .net mais nous n'avons que VBA dans le 2007.

 

Non, 2007 supporte très bien .NET.

 

J'avais fait un truc en LISP ici. et tu trouveras le LISP de Lee Mac dont je me suis inspiré pour le code VBA que j'ai tenté d'écrire (je pense qu'en VBA c'est cette piste la bonne).

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

Invité tjrsNRV
Posté(e)

merci pour ton lisp,

 

je ne me rappelais même plus que je l'avais déjà utilisé !!

 

sechanbask

 

 

MERCI encore !

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é