Solidworks VBA-Sprache

Hallo ihr alle

Hier ist mein Makro, die Schwierigkeit hier besteht darin, die Nachricht anstelle einer msgbox laut vorzulesen, aber asynchron (nicht-modal für msgbox)

Diese 2 Codes funktionieren im VBE-Editor mit der Taste F8 Ausführen, aber nicht direkt mit einer Aktionsschaltfläche in Solidworks, falls jemand eine Idee hat

sp. Sprechen Sie " Skizze auswählen ", 1
oder
sp. Sprechen, SVSFlagsAsync  

"Wählen Sie eine Skizze aus, ohne darauf einzugehen
"wo
"Eingeben einer Skizze

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

Ich habe diesen Link gefunden (zum Testen):

Hallo
Für mich hat es nichts mit einem asynchron gelesenen Text zu tun

Hallo;

Haben Sie versucht, msgBoxen durch " sendmsgtoUser2 " zu ersetzen?

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

Herzliche Grüße.

… In der Zwischenzeit habe ich das gefunden:

und das:

Wenn es helfen kann...

Hallo
Ich möchte weder msgbox noch sendmsgtoUser2, was dasselbe ist

Ich habe gerade das folgende Makro ausprobiert, das nicht asynchron seltsam funktioniert

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

Und funktioniert es ohne den asynchronen Teil oder nicht?

.SVSFlagsAsync

mit oder ohne . SVSFlagsAsync ist in Solidworks dasselbe, der Text wird synchron gelesen

Soweit ich weiß, ist es gut gelesen, aber nicht asynchron und es spielt keine Rolle, ob . SVSFlagsAsync ist vorhanden oder nicht.
Stimmt das?

Ja, das war's und wenn ich dieses Makro einfüge, wird die Nachricht nur in VBE (F8-Taste) gelesen, aber nicht mit der Makrotaste

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

Ich versuche es auch
. Speak sText, SVSFlagsAsync = True oder false und es wird in beiden Fällen synchron gelesen

Ich habe den Eindruck, dass dies der normale Vorgang ist, wenn ich ersetze:

  .Speak sText, 1 

bis:

  .Speak sText, 0

Der Text ist gut gelesen.
Mit der 1 kein Lesen, da es scheint, dass der Text unterbrochen wird, sobald er zur nächsten Codezeile wechselt (bevor er begonnen hat)

Dieses Makro unter SW oder Excel hat die gleiche Operation unter der 2-Software, also kommt es für mich nicht aus 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

im VBE-Editor mit der Taste F8 wird der Text jedoch asynchron mit ,1 oder SVSFlagsAsync gelesen

Ja, aber wenn Sie schnell auf F8 klicken, sobald Sie auf msgbox ankommen, wird der Text abgeschnitten.
In Excel funktionieren diese 2 Codes. Das eine asynchron und das andere nicht.

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

Ich vermute, es kommt von der verwendeten Funktion.
Wir werden eine äquivalente Methode unter SW finden müssen.

Wenn jemand eine Code-Idee hat

Dadurch, dass keine Funktion erstellt wird (Code der Funktion direkt im Sub), liest es den Text gut, während es die msgbox anzeigt:

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

Ich habe gerade etwas gemerkt

Der asynchrone Lesecode funktioniert einwandfrei, wird aber automatisch abgeschnitten, da das Makro mit end sub geschlossen wird

Zusammenfassend sollte mein Makro also idealerweise den Text lesen und mich an SolidWorks arbeiten lassen

Tatsächlich hat das Makro keine Zeit, den Text zu lesen, bevor er geschlossen wird, da ich danach keine anderen Aktionen habe

Die Wiedergabe müsste also fortgesetzt werden, während ich SOLIDWORKS manipulieren kann, und ich weiß nicht, ob es möglich ist, den Sprachbefehl aus VBA zu exportieren (Batch...)

Ich denke, wir sollten ihn bitten, mit WaitUntilDone zu warten

Das Problem ist, dass es auf das Gleiche hinausläuft, als ob es synchron wäre, was ich nicht möchte

Ich habe nicht den Eindruck, dass das möglich ist.

  • Entweder asynchron und am Ende des Untertitels, unabhängig davon, ob der Text fertig ist oder nicht, wird abgeschnitten. (sogar das Einfügen des Textes in eine Funktion oder ein anderes Sub, das durch einen Aufruf oder eine andere Prozedur aufgerufen wird)

  • Entweder nicht asynchron und wir warten auf das Ende des Textes, um mit der nächsten Anweisung fortzufahren.

Ich weiß nicht, in welchem Rahmen und warum genau Sie Sprachtext einfügen möchten, aber ich persönlich bin überhaupt kein Fan davon und bevorzuge die msgbox oder Textbox, mit der Sie die Anweisungen fortsetzen können, während der Text angezeigt wird.
Bei Makros, die wir sehr oft starten, würde es mir sehr schnell den Kopf zerbrechen.
Und für ein Designbüro, das sich 20 Kollegen wie wir teilen, davon spreche ich noch gar nicht, ist der Ton an allen Arbeitsplätzen abgeschaltet.

1 „Gefällt mir“

Bei der asynchronen Programmierung, z. B. unter .NET, sind wir verpflichtet, eine Await-Anweisung zu geben. Andernfalls warten Sie nicht, bis eine asynchrone Anweisung beendet ist, und das ist es, was diese Art der Programmierung so sinnvoll macht.

Sie müssen also die SpVoice-Methode aufrufen, dann eine Reihe von Aufgaben ausführen, wenn Sie möchten, und dann WaitUntilDone aufrufen

Vielen Dank für Ihre Antworten
Im Moment sehe ich keine Lösung, ich lasse es in Bereitschaft