Solidworks VBA-spraak

Hoi allemaal

Hier is mijn macro, de moeilijkheid hier is om het bericht hardop voor te lezen in plaats van een msgbox, maar asynchroon (niet-modaal voor msgbox)

deze 2 codes werken in de VBE-editor met de F8 execute-toets maar niet direct met een actieknop in Solidworks, mocht iemand een idee hebben

Sp. Spreek " Selecteer een schets ", 1
of
Sp. Spreken, SVSFlagsAsync  

'Kies een schets zonder erop in te gaan
"Waar
'Een schets invoeren

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

Ik vond deze link (om te testen):

Hallo
Voor mij heeft het niets te maken met een tekst die asynchroon wordt gelezen

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