Mowa Solidworks VBA

Cze wszystkim

Oto moje makro, trudność polega na tym, aby przeczytać wiadomość na głos zamiast msgbox, ale asynchronicznie (niemodalne dla msgbox)

te 2 kody działają w edytorze VBE z wykonywania F8, ale nie bezpośrednio z przyciskiem akcji w Solidworks, jeśli ktoś ma pomysł

Sp. Powiedz " Wybierz szkic ", 1
lub
Sp. Mów, SVSFlagsAsync  

"Wybierz szkic bez wchodzenia w niego
"gdzie:
"Wprowadzanie szkicu

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

Znalazłem ten link (do przetestowania):

Witam
Dla mnie nie ma to nic wspólnego z tekstem czytanym asynchronicznie

Witam;

Czy próbowałeś zamienić msgBoxes na " sendmsgtoUser2 "?

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

Pozdrowienia.

… W międzyczasie znalazłem to:

A to:

Jeśli to może pomóc...

Witam
Nie chcę msgbox ani sendmsgtoUser2, które są tym samym.

Właśnie wypróbowałem następujące makro, które nie działa asynchronicznie dziwnie

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

I czy działa bez części asynchronicznej, czy nie?

.SVSFlagsAsync

z lub bez . SVSFlagsAsync jest taki sam w Solidworks, tekst jest odczytywany synchronicznie

Z tego co rozumiem jest dobrze czytany, ale nie asynchronicznie i nie ma znaczenia, czy . SVSFlagsAsync jest obecny lub nie.
Czy słusznie?

tak to wszystko i jak wstawię to makro to komunikat jest odczytywany tylko w VBE (F8) ale nie przyciskiem makra

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

Ja też próbuję
. Speak sText, SVSFlagsAsync = True lub false i jest odczytywany synchronicznie w obu przypadkach

Mam wrażenie, że jest to normalne działanie, jeśli wymienię:

  .Speak sText, 1 

przez:

  .Speak sText, 0

Tekst jest dobrze czytany.
Z 1 bez czytania, ponieważ wydaje się, że gdy tylko przejdzie do następnego wiersza kodu, tekst jest przerywany (zanim się zaczął)

To makro pod SW lub excel ma taką samą operację pod oprogramowaniem 2 więc dla mnie nie pochodzi z 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

jednak w edytorze VBE z F8 tekst jest odczytywany asynchronicznie za pomocą ,1 lub SVSFlagsAsync

Tak, ale jeśli szybko klikniesz F8, gdy tylko dotrzesz do msgbox, tekst zostanie wycięty.
W Excelu działają te 2 kody. Jeden asynchronicznie, a drugi nie.

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

Domyślam się więc, że wynika to z zastosowanej funkcji.
Będziemy musieli znaleźć równoważną metodę w SW.

Jeśli ktoś ma pomysł na kod

Nie tworząc funkcji (kodu funkcji bezpośrednio w subie) dobrze odczytuje tekst, jednocześnie wyświetlając 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

Właśnie zdałem sobie z czegoś sprawę

Asynchroniczny kod odczytu działa poprawnie, ale jest automatycznie odcinany, ponieważ makro zamyka się z sub end

Tak więc, aby podsumować moje makro, najlepiej przeczytaj tekst i pozwól mi pracować nad solidworks

W rzeczywistości makro nie ma czasu na przeczytanie tekstu przed zamknięciem, ponieważ nie mam później żadnych innych działań

Tak więc odtwarzanie musiałoby być kontynuowane, pozwalając mi manipulować solidworks i nie wiem, czy możliwe jest wyeksportowanie polecenia głosowego z vba (wsadowo...)

Myślę, że powinniśmy go poprosić, aby poczekał z WaitUntilDone

Problem polega na tym, że sprowadza się to do tego samego, co gdyby było synchroniczne, czego nie chcę

Nie mam wrażenia, że to możliwe.

  • Albo asynchronicznie, a na końcu suba, niezależnie od tego, czy tekst jest skończony, czy nie, jest tnieny. (nawet w tym tekst w funkcji lub innej funkcji wywoływanej przez wywołanie lub inną procedurę)

  • Albo nie asynchronicznie i czekamy na koniec tekstu, aby przejść do kolejnej instrukcji.

Nie wiem, w jakiej ramce i dlaczego dokładnie chcesz umieścić tekst głosowy, ale osobiście w ogóle nie jestem jego fanem i zdecydowanie wolę msgbox lub pole tekstowe, które pozwala kontynuować instrukcje podczas wyświetlania tekstu.
Na makrach, które uruchamiamy bardzo często, bardzo szybko zajęłoby mi to głowę.
A w przypadku biura projektowego, w którym pracuje 20 kolegów i koleżanek takich jak my, nawet o tym nie mówię, dźwięk jest ucięty na wszystkich stacjach roboczych.

1 polubienie

W programowaniu asynchronicznym, na przykład na .NET, jesteśmy zobowiązani do podania instrukcji Await. W przeciwnym razie nie czekasz na zakończenie asynchronicznej instrukcji i to właśnie sprawia, że ten rodzaj programowania jest tak znaczący.

Musisz więc wywołać metodę SpVoice, a następnie uruchomić zestaw zadań, jeśli chcesz, a następnie wywołać WaitUntilDone

Dziękuję za odpowiedzi
Na razie nie widzę rozwiązania, zostawiam go w trybie czuwania