Solidworks VBA speech

Bonjour à tous

voici ma macro, la difficulté est ici de lire à haute voix le message au lieu d’une msgbox mais de manière asynchrone (non modale pour msgbox)

ces 2 codes fonctionnent dans l’éditeur VBE avec la touche d’exécution F8 mais pas directement avec un bouton d’action dans Solidworks, si quelqu’un a une idée

sp.Speak « Sélectionner une esquisse », 1
ou
sp.Speak « Sélectionner une esquisse », SVSFlagsAsync

'Sélectionner une esquisse sans entrer dedans
'où
'Entrer dans une esquisse

Sub Piece_suppr_bancales()
Dim swApp     As SldWorks.SldWorks
Dim swDoc     As SldWorks.ModelDoc2
Dim swRelMgr  As SldWorks.SketchRelationManager
Dim swSketch  As SldWorks.Sketch
Dim vRels     As Variant
Dim swRel     As SldWorks.SketchRelation
Dim i         As Long
Dim sp        As Object

Set swApp = Application.SldWorks
Set swDoc = swApp.ActiveDoc
Set swSkMgr = swDoc.SketchManager
Set swSketch = swDoc.GetActiveSketch2
Set sp = CreateObject("SAPI.SpVoice")

If swDoc.SelectionManager.GetSelectedObjectType3(1, -1) = swSelSKETCHES Then
Set swSketch = swDoc.SelectionManager.GetSelectedObject6(1, -1).GetSpecificFeature
Else
sp.Speak "Sélectionner une esquisse"
'sp.Speak "Sélectionner une esquisse", 1 / sp.Speak "Sélectionner une esquisse", SVSFlagsAsync
'asynchrone pour effectuer d'autres tâches en même temps, ne fct que dans VBE pas avec bouton macro
Exit Sub
End If

Set swRelMgr = swSketch.RelationManager
If swRelMgr.GetRelationsCount(swDangling) > 0 Then
vRels = swRelMgr.GetRelations(swDangling)
    For i = 0 To UBound(vRels)
    Set swRel = vRels(i)
    swRelMgr.DeleteRelation swRel
    Next i
'MsgBox "Esquisse : " & swSketch.Name & Chr(10) & "Relations bancales supprimées : " & UBound(vRels) + 1
Else
sp.Speak "Esquisse : " & swSketch.Name & Chr(10) & "Pas de relation bancales trouvée"

End If
End Sub

J’ai trouvé ce lien (à tester):

bonjour,
pour moi ça n’a pas de rapport avec un texte lu de manière asynchrone

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