Moulinette pour décaler les adresses externes

Partie du forum pour tout ce qui concerne les interfaces homme machine ou IHM. Forum, conseil, astuce et entraide sur les interface homme machine ou IHM tels que les magelis, KEP, proface, XBT, .
Répondre
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7806
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Moulinette pour décaler les adresses externes

Message par itasoft »

Slts,
Moulinette en VBScript pour décaler toutes les adresses des variables externes dans une application Vijeo-Designer (ou autre).
Les moulinettes c’est comme les coquilles St Jacques, une fois bien lavés ça peut resservir surtout si le besoin s’en fait sentir, lol
Procédure :
Copier les lignes du script ci dessous et les coller dans le Bloc-notes, enregistrer sous MoveVijeo.vbs
Avec l’explorateur de fichiers de Windows double-clic sur MoveVijeo.vbs pour exécuter le script.
Avant, dans le script mettre les valeur des décalages désirés en +/- à la place de ceux mis par défaut ou 0 si pas de décalages:

'------- VALEUR DU DECALAGE POUR LES BITS %M -------------------
MOFS=+100 ou ( MOFS=-100 pour un décalage négatif)

'------- VALEUR DU DECALAGE POUR LES MOTS %MW,%MD,%MF ----------
WOFS=+1000 ou ( WOFS=-1000 pour un décalage négatif)
'---------------------------------------------------------------
Dans Vijeo-designer (ou autre) ,
Exporter les variables dans un fichier ASCII et ouvrir ce fichier avec la moulinette puis importer le fichier résultant _RESULT_
dans le Vijeo (ou autre) avec écrasement.

(Ps : ça cherche les termes : %Mx , %MWx , %MWx:X , %MDx , %MFx, en fait, ça décale les adresses dans tout fichiers ASCII ou l'on retrouve ces termes.
modifier pour chercher d’autres termes que ceux là)


Code : Tout sélectionner

'Script Version V1.00
Option explicit
Dim TXT,fileNameSource,fileNameCible,sOBJ,sVAL, iVAL,sL
Dim mySize,XMin,XMax,XX,MOFS,WOFS
Dim FSO,Rtxt,Wtxt
Dim oRegExp, oMatches, oMatch
'Objet Régular-expressions
Set oRegExp = CreateObject("VBScript.RegExp")
oRegExp.Global = True
oRegExp.IgnoreCase = True
fileNameSource=GetFileNameDlg()
if InStr(fileNameSource,".")=0 then
MsgBox("Fichier avec Extension obligatoire ex: *.txt")
WScript.Quit 0
end if
'Fichier résultat
fileNameCible = Replace(fileNameSource, ".", "_RESULT_.")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set Rtxt = FSO.OpenTextFile(fileNameSource)
TXT=Rtxt.ReadAll
Rtxt.close
Set Wtxt = FSO.createTextFile(fileNameCible,true)
'------- VALEUR DU DECALAGE POUR LES BITS %M -------------------
MOFS=+110
'------- VALEUR DU DECALAGE POUR LES MOTS %MW,%MW:X %MD,%MF ----------
WOFS=+1000
'---------------------------------------------------------------
'%M0
XMin=32000:XMax=0
oRegExp.Pattern = "%M[0-9]+"
Set oMatches = oRegExp.Execute(TXT)
For Each oMatch In oMatches
sOBJ=oMatch.Value
iVAL=CInt(Replace(sOBJ, "%M", ""))
if iVAL<XMin then XMin=iVAL
if iVAL>XMax then XMax=iVAL
Next
For XX = XMax to XMin Step -1
sOBJ="%M" & CStr(XX)
sVAL="%§" & CStr(XX+MOFS)
TXT=Replace(TXT, sOBJ,sVAL)
Next
'%MW0
XMin=32000:XMax=0
oRegExp.Pattern = "%MW[0-9]+"
Set oMatches = oRegExp.Execute(TXT)
For Each oMatch In oMatches
sOBJ=oMatch.Value
iVAL=CInt(Replace(sOBJ, "%MW", ""))
if iVAL<XMin then XMin=iVAL
if iVAL>XMax then XMax=iVAL
Next
For XX = XMax to XMin Step -1
sOBJ="%MW" & CStr(XX)
sVAL="%§W" & CStr(XX+WOFS)
TXT=Replace(TXT, sOBJ,sVAL)
Next
'%MD0
XMin=32000:XMax=0
oRegExp.Pattern = "%MD[0-9]+"
Set oMatches = oRegExp.Execute(TXT)
For Each oMatch In oMatches
sOBJ=oMatch.Value
iVAL=CInt(Replace(sOBJ, "%MD", ""))
if iVAL<XMin then XMin=iVAL
if iVAL>XMax then XMax=iVAL
Next
For XX = XMax to XMin Step -1
sOBJ="%MD" & CStr(XX)
sVAL="%§D" & CStr(XX+WOFS)
TXT=Replace(TXT, sOBJ,sVAL)
Next
'%MF0
XMin=32000:XMax=0
oRegExp.Pattern = "%MF[0-9]+"
Set oMatches = oRegExp.Execute(TXT)
For Each oMatch In oMatches
sOBJ=oMatch.Value
iVAL=CInt(Replace(sOBJ, "%MF", ""))
if iVAL<XMin then XMin=iVAL
if iVAL>XMax then XMax=iVAL
Next
For XX = XMax to XMin Step -1
sOBJ="%MF" & CStr(XX)
sVAL="%§F" & CStr(XX+WOFS)
TXT=Replace(TXT, sOBJ,sVAL)
Next
TXT = Replace(TXT, "%§", "%M")
Wtxt.write (TXT)
Wtxt.close
Set oRegExp = Nothing
Set oMatches =Nothing
Set oMatch =Nothing
MsgBox "Fin des opérations" , vbInformation, fileNameCible
Function GetFileNameDlg()
GetFileNameDlg=CreateObject("WScript.Shell").Exec("mshta.exe ""about:<input type=file id=f><script language=""VBScript"">f.click():CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(f.value):close()</script>""").StdOut.ReadAll
End Function
Modifié en dernier par itasoft le 01 févr. 2016, 01:17, modifié 1 fois.
Automaticien privé (de tout)
itasoft@free.fr
steph68
Codeur fou
Codeur fou
Messages : 275
Enregistré le : 21 oct. 2015, 08:23

Re: Moulinette pour décaler les adresses externes

Message par steph68 »

salut itasoft,

quelques commentaires (dans un but "constructif" et pas "critique" ;) ) :

tu peux te servir des expressions régulières pour une recherche et un remplacement dans la foulée (avec un callback = appel de fonction)

lien source (entre autres, premier trouvé sur google) : http://cwestblog.com/2011/07/18/vbscrip ... -function/

Code : Tout sélectionner

Function fnUp1(objMatch)
fnUp1 = UCase(m.Submatches(0)) & m.Submatches(1)
End Function

Dim re: Set re = New RegExp
re.Pattern = "(.)(.)"
re.Global = True

Dim str: str = "where in the world is carmen sandiego?";
Dim strWeird: strWeird = RegExpReplace(re, str, GetRef("fnUp1"))
MsgBox strWeird ' WhErE In tHe wOrLd iS CaRmEn sAnDiEgO?
en utilisant cette fonction :

Code : Tout sélectionner

Function RegExpReplace(re, str, replacement)
' If replacement is a string, use the native RegExp.Replace function.
If TypeName(replacement) = "String" Then
RegExpReplace = re.Replace(str, replacement)
' Since replacement is not a string, call replacement with every match
' object and replace the match with the return value.
Else
Dim mc, m, ret, offset
offset = 0
Set mc = re.Execute(str)
For Each m In mc
ret = replacement(m)
str = Left(str, m.FirstIndex - offset) & ret _
& Mid(str, m.FirstIndex + m.Length - offset + 1)
offset = offset + m.Length - Len(ret)
Next
RegExpReplace = str
End If
End Function
Ton pattern serait quelque chose comme ça (un seul pattern pour tous les types) : "%M(B|W|D|F)?([0-9]+)"

les parenthèses correspondent à une capture (comme dans l'exemple ci-dessus) --> Submatches(0) = rien ou B ou W ou D ou F ; Submatches(1) = indice de la variable

le script actuel ne fonctionne pas pour des offsets négatifs et le remplacement est un peu "bourrin" (oui c'est l'ordi qui bosse pas l'opérateur ... mais je suis pour la sauvegarde écologique :mrgreen: )

sinon c'est cool que tu partages tes moulinettes (smiley avec le pouce vers le haut)

@+
Avatar du membre
itasoft
Mi homme - Mi automate
Mi homme - Mi automate
Messages : 7806
Enregistré le : 20 oct. 2015, 10:15
Localisation : Lyon
Contact :

Re: Moulinette pour décaler les adresses externes

Message par itasoft »

slts,
le script actuel ne fonctionne pas pour des offsets négatifs

pourquoi le décalage négatif ne marcherait pas ? tu l'as testé ?
Automaticien privé (de tout)
itasoft@free.fr
steph68
Codeur fou
Codeur fou
Messages : 275
Enregistré le : 21 oct. 2015, 08:23

Re: Moulinette pour décaler les adresses externes

Message par steph68 »

non pas testé, mais je n'avais pas vu ta subtilité avec "%§"

donc c'est parfaitement fonctionnel

@+
Répondre