Solidworks VBA-spraak

Hallo;

Heb je geprobeerd msgBoxes te vervangen door " sendmsgtoUser2 "?

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

Vriendelijke groeten.

… In de tussentijd vond ik dit:

En dit:

Als het kan helpen...

Hallo
Ik wil geen msgbox of sendmsgtoUser2, wat hetzelfde is

Ik heb net de volgende macro geprobeerd, die niet asynchroon vreemd werkt

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

En werkt het zonder het asynchrone deel of niet?

.SVSFlagsAsync

met of zonder . SVSFlagsAsync is hetzelfde in Solidworks, de tekst wordt synchroon gelezen

Van wat ik begrijp is het goed gelezen, maar niet asynchroon en het maakt niet uit of . SVSFlagsAsync is aanwezig of niet.
Klopt dat?

Ja, dat is het en als ik deze macro zet, wordt het bericht alleen in VBE gelezen (F8-toets), maar niet met de macroknop

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

Ik probeer het ook
. Spreek sText uit, SVSFlagsAsync = Waar of onwaar en het wordt in beide gevallen synchroon gelezen

Ik heb de indruk dat dit de normale werking is, als ik vervang:

  .Speak sText, 1 

bij:

  .Speak sText, 0

De tekst is goed gelezen.
Met de 1 geen lezing omdat het lijkt alsof zodra het naar de volgende regel code gaat, de tekst wordt onderbroken (voordat deze is begonnen)

Deze macro onder SW of Excel heeft dezelfde werking onder de 2 software, dus voor mij komt het niet uit 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

maar in de VBE-editor met de F8-toets wordt de tekst asynchroon gelezen met ,1 of SVSFlagsAsync

Ja, maar als je snel op F8 klikt zodra je op msgbox aankomt, wordt de tekst geknipt.
In excel werken deze 2 codes. De een asynchroon en de ander niet.

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

Dus ik denk dat het komt van de gebruikte functie.
We zullen een equivalente methode moeten vinden onder SW.

Als iemand een code-idee heeft

Door geen functie aan te maken (code van de functie direct in de sub) leest het de tekst goed, terwijl de msgbox wordt weergegeven:

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

Ik realiseerde me net iets

De asynchrone leescode werkt prima, maar wordt automatisch afgebroken omdat de macro sluit met end sub

Dus om mijn macro samen te vatten, zou ik idealiter de tekst moeten lezen en me aan solidworks moeten laten werken

In feite heeft de macro geen tijd om de tekst te lezen voordat deze sluit, omdat ik daarna geen andere acties heb

Dus het afspelen zou moeten doorgaan terwijl ik solidworks kan manipuleren en ik weet niet of het mogelijk is om de spraakopdracht uit vba (batch...) te exporteren

Ik denk dat we hem moeten vragen om te wachten met WaitUntilDone

Het probleem is dat het op hetzelfde neerkomt alsof het synchroon is, wat ik niet wil

Ik heb niet de indruk dat het mogelijk is.

  • Ofwel asynchroon en aan het einde van de sub, of de tekst nu af is of niet, hij snijdt. (zelfs het opnemen van de tekst in een functie of andere sub die door aanroep of een andere procedure wordt aangeroepen)

  • Ofwel niet asynchroon en we wachten tot het einde van de tekst doorgaat naar de volgende instructie.

Ik weet niet in welk kader en waarom je precies spraaktekst wilt plaatsen, maar persoonlijk ben ik er helemaal geen fan van, en ik geef de voorkeur aan de msgbox of tekstvak waarmee je de instructies kunt voortzetten terwijl je de tekst weergeeft.
Op macro's die we heel vaak lanceren, zou het heel snel mijn hoofd nemen.
En voor een ontwerpbureau dat wordt gedeeld door 20 collega's zoals wij, heb ik het er niet eens over, het geluid wordt op alle werkstations uitgeschakeld.

1 like

Bij asynchroon programmeren, bijvoorbeeld op .NET, zijn we verplicht om een Await statement te geven. Anders wacht je niet tot een asynchrone instructie klaar is, en dat is wat dit soort programmeren zo zinvol maakt.

U moet dus uw SpVoice-methode aanroepen, vervolgens een reeks taken uitvoeren als u dat wilt en vervolgens WaitUntilDone aanroepen

Dank u voor uw antwoorden
Voorlopig zie ik geen oplossing, ik laat hem op stand-by staan

Samenvattend heb je twee oplossingen:
Of je zet WaitUntilDone voor EndSub
Of u start uw functie op een andere thread

@Konti in een andere thread werkt het ook niet omdat het de tekst breekt zodra de functie of sub aangeroepen.
En als u niet-asynchroon uitvoert, wacht het tot het einde van de functie of sub doorgaat.

Ik heb eindelijk gevonden

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 like