Solidworks VBA speech

Bonjour;

Avez-vous essayé en remplaçant les msgBox par « sendmsgtoUser2 » ?

https://help.solidworks.com/2022/English/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.ISldWorks~SendMsgToUser2.html?verRedirect=1

cordialement.

… entre temps j’ai trouvé ceci:

et ceci:

si cela peu aider…

Bonjour,
je ne veux pas de msgbox ou sendmsgtoUser2 qui est la même chose

je viens d’essayer la macro suivante, qui ne fonctionne pas en asynchrone bizarrement

Function RobotSpeaking(sText As String) As Boolean
    On Error Resume Next
    Err.Clear
    With CreateObject("SAPI.SpVoice")
        .SVSFlagsAsync
        .Volume = 100
        .Speak sText
    End With
    RobotSpeaking = (Err.Number = 0)
End Function

Et cela fonctionne sans la partie asynchrone ou pas?

.SVSFlagsAsync

avec ou sans .SVSFlagsAsync c’est la même chose dans Solidworks le texte est lu de manière synchrone

De ce que je comprends il est bien lu, mais pas de manière asynchrone et peu importe si .SVSFlagsAsync est présent ou non.
C’est bien ça?

oui c’est ca et quand je met cette macro, le message est lu dans VBE uniquement (touche F8) mais pas avec le bouton de macro

Function RobotSpeaking(sText As String) As Boolean
    On Error Resume Next
    Err.Clear
    With CreateObject("SAPI.SpVoice")
        '.SVSFlagsAsync
        .Volume = 100
        .Speak sText, 1 'ou SVSFlagsAsync
    End With
    RobotSpeaking = (Err.Number = 0)
End Function

j’essai aussi
.Speak sText, SVSFlagsAsync = True, ou false et c’est lu de maniéré synchrone dans les 2 cas

J’ai l’impression que c’est le fonctionnement normal, si je remplace:

  .Speak sText, 1 

par:

  .Speak sText, 0

Le texte est bien lu.
Avec le 1 pas de lecture car on dirait que dès qu’il passe à la ligne de code suivant le texte est interrompue (avant d’avoir commencé)

Cette macro sous SW ou excel à le même fonctionnement sous les 2 logiciels donc pour moi cela ne vient pas de SW


Sub speech()

Set swApp = Application.SldWorks 'Ligne à mettre ne commentaire sous excel

 
RobotSpeaking "Ceci est un essai, de texte lu par windows 10, si vous entendez le message tout en affichant le msgbox, c'est que cela fonctione"
MsgBox "Fonctionne si le message s'affiche avant la fin du texte lu"
  
End Sub

Function RobotSpeaking(sText As String) As Boolean
    On Error Resume Next
    Err.Clear
    With CreateObject("SAPI.SpVoice")
        .SVSFlagsAsync
        .Volume = 100
        .Speak sText, 1 'ou SVSFlagsAsync
    End With
    RobotSpeaking = (Err.Number = 0)
End Function

pourtant dans l’editeur VBE avec la touche F8 le texte est lu de maniere asynchrone avec ,1 ou SVSFlagsAsync

Oui mais si tu apui rapidement sur F8 dès que tu arrive sur msgbox il coupe le texte.
Sous excel ces 2 codes fonctionne. L’un de manière asynchrone et l’autre pas.

Sub TalkToMe3()
Application.Speech.Speak "Excel me parle tout en affichant le message", SpeakAsync:=True
MsgBox "test"
End Sub
Sub TalkToMe4()
Application.Speech.Speak "Excel me parle puis affichele message" ', SpeakAsync:=True
MsgBox "test"
End Sub

Donc j’imagine que cela vient de la fonction utilisé.
Il va falloir touver une méthode équivalente sous SW.

Si quelqu’un a une idée de code

En ne créant pas de fonction (code de la fonction directement dans le sub) cela lit bien le texte, tout en affichant le msgbox :

Dim swApp As Object
Sub speech()
Dim sText As String
sText = "Ceci est un essai, de texte lu par windows 10, si vous entendez le message tout en affichant le msgbox, c'est que cela fonctione"

Set swApp = Application.SldWorks
With CreateObject("SAPI.SpVoice")
        '.SVSFlagsAsync
        .Volume = 100
        .speak sText, 1 ', 1 ', 0 'ou SVSFlagsAsync
    End With
 
MsgBox "Fonctionne si le message s'affiche avant la fin du texte lu"
  
End Sub

Je viens de me rendre compte d’un truc

Le code de lecture asynchrone fonctionne bien mais est coupé automatiquement car la macro se ferme avec end sub

Donc pour résumer ma macro devrait dans l’idéal lire le texte et me laisser travailler sur solidworks

Dans les faits la macro n’a pas le temps de lire le texte qu’elle se ferme puisque je n’ai pas d’autres actions après

Donc il faudrait que la lecture se poursuive tout en me laissant manipuler solidworks et je ne sais pas si c’est possible d’exporter la commande vocale hors de vba (batch…)

Je pense qu’il faut lui demander d’attendre avec WaitUntilDone

Le pb c’est que ça revient au même que si c’est synchrone ce que je ne souhaite pas

j’ai pas l’impression que ce soit possible.

  • Soit asynchrone et en fin de sub que le texte soit fini ou pas cela coupe. (même en incluant les texte dans une fonction ou un autre sub appelé par call ou autre procédure)

  • Soit pas asynchrone et on attends la fin du texte pour passer à l’instruction suivante.

Je ne sais pas dans quel cadre et pourquoi exactement tu veux mettre du texte vocal, mais personnellement j’en suis pas fan du tout, et je préfère amplement le msgbox ou zone de texte qui permet de continuer les instructions tout en affichant le texte.
Sur des macros que l’on lance très souvent cela me prendrais très vite la tête.
Et pour un BE partagé par 20 collègues comme nous je t’en parle même pas, le son est coupé d’ailleurs sur l’ensemble des postes.

1 « J'aime »

En programmation asynchrone, sur du .NET par exemple, on est obligés de donner une instruction Await. Sinon on n’attend pas qu’une instruction asynchrone se termine et c’est ce qui donne tout son sens à ce type de programmation.

Donc tu dois appeler ta méthode SpVoice, puis exécuter un ensemble de tâches si tu le souhaites et ensuite appeler WaitUntilDone

Merci pour vos réponses
pour le moment je ne vois pas de solution, je laisse en stand by

Pour résumer tu as deux solutions :
Soit tu mets WaitUntilDone avant EndSub
Soit tu lances ta fonction sur un autre thread

@Konti dans un autre thread, cela ne fonctionne pas non plus car il interrompt le texte dès la fin de la fonction ou du sub appelé.
Et si tu lances non asynchrone il attends la fins de la fonction ou du sub pour continuer.

j’ai finis par trouver

Function Msg_sonore(sText As String) As Boolean
'Permet de lire le message de manière asynchrone en passant par .vbs
Dim swApp As Object
Dim fso, Dossier, Fichier, f
Dim oWsh As Variant
Set swApp = Application.SldWorks
Set oWsh = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.FileSystemObject")

Dossier = Left(swApp.GetCurrentMacroPathName, InStrRev(swApp.GetCurrentMacroPathName, "\"))
Fichier = "PART_MEP_suppr contraintes.vbs"
If Dir(Dossier & Fichier) <> "" Then fso.DeleteFile Dossier & Fichier

Set f = fso.CreateTextFile(Dossier & Fichier, True)
f.WriteLine "'Fichier temporaire, pour lecture message sonore asynchrone"
f.WriteLine "Dim speech"
f.WriteLine "Set speech = CreateObject(""SAPI.SpVoice"")"
f.WriteLine "speech.Speak """ & sText & """"
f.Close

oWsh.ShellExecute Dossier & Fichier
Set oWsh = Nothing

End Function
1 « J'aime »