sobald ich eine neue Vokabel bei DNS11 Pro hinzufüge möchte ich die erweiteren Eigenschaften ändern. Seht euch bitte als erstes die angehängte Grafik an.
Leider habe ich in den Grundeinstellungen des Programms nichts passendes gefunden, deswegen weiche Ich auf VisualBasic for Applications aus. Dort gibt es eine ActiveX-Komponente namens voctool.dll. (Vor Version 11 gab es anscheinend noch ein Programm namens Voctool.exe im Dragon-Verzeichnis, das auf ähnliche weise die Manipulation des Vokabulars erlaubte)
In VBA bin ich leider noch eine Laie, habe es aber schonmal soweit geschafft, dass meine neuen Vokabeln eingelesen werden. Jetzt benötige ich Eure Hilfe: (Achtung, damit der Code ausgeführt werden kann muss man natürlch die Voctools-Referenz mit einbinden. Das geschieht in dem man im Textfeld des Befehlteditors Alt+Enter drückt oder Rechtsklick>Referenzen... und dann Dragon NaturallySpeaking Vocabulary Tools (1.0) anhackelt. Außerdem müsst ihr Euch die Datei 'C:/myVocList.txt' anlegen )
'Dateianalyse- und Vokabelmanipulator-Objekte erstellen Set FileAnalyser = MyDragonVocabularyTool.TextAnalyzer Set VocabularyManipulator = MyDragonVocabularyTool.VocabularyBuilder
'Mit dem Dateianalyse-Objekt eine Vokableliste auslesen Set WordsFromFile = FileAnalyser.ProcessWordList("C:/myVocList.txt")
'HIER FEHLT DER ENTSCHEIDENDE TEIL!!! 'Es sollen die ausgelesenen Vokabeln in das aktive Vokabular eingebaut werden 'Außerdem sollten die Erweiterten Eigenschaften angepasst werden. Leider weiß ich an der Stelle noch nicht welche Funktion dafür zuständig sein soll 'VocabularyManipulator.AddWords(WordsFromFile) 'Endet leider in einem: "(10090) ActiveX Automation error" warum???
'###################### Testausgabe ############################## For Each Word In WordsFromFile i=i+1 Next MsgBox "Vokabeln in der Datei: " & CStr(i)& vbLf _ & "Erste Vokabel: " & WordsFromFile.Item(0).WrittenForm
'##################### PS ########################################## ' Übrigens an das aktuell geladene Vokabular kommt mann per ' Set WordsFromActiveVocabulary = VocabularyManipulator.GetWords
End Sub
Ps.: Um weitere Hintergrundinformationen zu dem Tehma und der eigentlichen Motivation zu erfahren, könnt ich Euch auch diesen Thread durchlesen, eventuell ergibt sich dadurch auch eine ganz andere Lösung: http://dragon-spracherkennung.forumprofi...-vokabular.html
Angefügte Bilder:
Aufgrund eingeschränkter Benutzerrechte werden nur die Namen der Dateianhänge angezeigt Jetzt anmelden! f12t512p3617n93.jpg
Meines Erachtens sind Sie kein Laie, und ich bin erstaunt, was Sie da vorbringen, aber der Code dürfte zunächst an der Zeile:
Set WordsFromFile = FileAnalyser.ProcessWordList("C:/myVocList.txt")
scheitern, weil "WordsFromFile" noch nicht definiert ist (als IDgnWords). Ihr spezielles Anliegen habe ich auf meiner Liste, und ich denke, es ist lizenztechnisch legitim, es so zu machen, komme aber nur abends dazu. Mal sehen, wie es weiter geht.
Gruß, R. Wilke
_______________________________________
Dragon Professional 16 auf Windows 10 Pro und Windows 11 SpeechMike Premium (LFH3500); Office 2019 Pro + Office 365 (monatliches Abo) HP ZBook Fury 17 G8 - i7-11800H - 24 MB SmartCache - 32 GB RAM - 1 TB SSD
Ok ich bin jetzt wieder ein Stück weiter, und versuch es jetzt mal genau andersherum: Jede Vokabel soll von Grund auf immer diese Sondereinstellung (keine Leerstelle danach, Neue Zeile danach) haben und nur die Ausnahmen bleiben auf der Standarteinstellung.
Das mit den Ausnahmen könnte man eventuell über Select/Case machen. Aber nun erstmal zum einstellen des gesammten Vokabulars auf die Sondereinstellung:
(Achtung: 1. Voctool.dll einbinden nicht vergessen 2.VORSICHT, aktives Vokabular wird auf Sondereinstellungen geändert)
'################## Variablen Deklarieren ################### Dim MyDragonVocabularyTool As New DgnVocTools.DgnVocTools Dim VocabularyManipulator As DgnVocTools.IDgnVocabularyBuilder Dim Word As DgnVocTools.IDgnWord Dim i As Integer
Set VocabularyManipulator = MyDragonVocabularyTool.VocabularyBuilder Set WordsFromActiveVocabulary = VocabularyManipulator.GetWords
For Each Word In WordsFromActiveVocabulary i=i+1 VocabularyManipulator.SetWordFormating(Word ,dgnwfmtNoSpaceAfter) 'Keine Leerstelle nach dem Wort VocabularyManipulator.SetWordFormating(Word ,dgnwfmtReturn ) 'Neue Zeile nach dem Wort Next
Exit Sub Error_Abfangen: MsgBox "Es ist ein Fehler bei der " & i & "-(s)ten Vokabel aufgetreten" End Sub
Das ganze funktioniert schon einigermaßen. Mein Vokab ca. 850 Wörter und bei ca 800 Wortern kommt es zu einem Fehler. Kann jemand mal die Funktion bei sich testen? Passiert da Ähnliches, oder läuft sie komplett durch???
Ach ja übrigens, wenn man im Vokabular alle Wörter markiert und dann auf Eigenschaften klickt, werden ebenfalls die Eigenschaften auf alle markierten Wörter angewendet.
'################## Variablen Deklarieren ################### Dim MyDragonVocabularyTool As New DgnVocTools.DgnVocTools Dim VocabularyManipulator As DgnVocTools.IDgnVocabularyBuilder Dim nIndex As Long
Set VocabularyManipulator = MyDragonVocabularyTool.VocabularyBuilder Set WordsFromActiveVocabulary = VocabularyManipulator.GetWords
geanderteVokabeln=0 ungeaenderteVokabeln=0
For i=0 To WordsFromActiveVocabulary.Count-1
nIndex = IsInArray(Ausnahmen(), WordsFromActiveVocabulary.Item(i).WrittenForm) If nIndex >= 0 Then ungeaenderteVokabeln = ungeaenderteVokabeln + 1 Else 'Erweiterte Einstellung andern VocabularyManipulator.SetWordFormating(WordsFromActiveVocabulary.Item(i) ,dgnwfmtNoSpaceAfter) 'Keine Leerstelle nach dem Wort VocabularyManipulator.SetWordFormating(WordsFromActiveVocabulary.Item(i) ,dgnwfmtReturn ) 'Neue Zeile nach dem Wort geanderteVokabeln=geanderteVokabeln+1 End If
Next i
MsgBox "Vokabular mit "& WordsFromActiveVocabulary.Count & " Woertern erfolgreich manipuliert!" & vbLf & vbLf & _ "Es wurden "& geanderteVokabeln &" Vokabeln geaendert" & vbLf & _ "Es wurden "& ungeaenderteVokabeln &" Vokabeln beibehalten"
Exit Sub Error_Abfangen: MsgBox "Es ist ein Fehler bei der " & i & "-(s)ten Vokabel aufgetreten" End Sub
Public Function IsInArray(ByRef sArray() As String, _ ByVal sItem As String, _ Optional ByVal nStart As Variant, _ Optional ByVal nEnd As Variant) As Long
' Prüfen, ob das Element "sItem" im Array "sArray" enthalten ist ' Rückgabewert: Index des Elements bzw. -1, wenn nicht vorhanden Dim i As Long Dim nIndex As Long Dim nLen As Long
On Error GoTo ErrHandler nIndex = -1
If IsMissing(nStart) Then nStart = LBound(sArray) If IsMissing(nEnd) Then nEnd = UBound(sArray)
nLen = Len(sItem) For i = nStart To nEnd If Len(sArray(i)) = nLen Then If sArray(i) = sItem Then nIndex = i: Exit For End If End If Next i On Error GoTo 0
ErrHandler: IsInArray = nIndex End Function
Geh zwar nicht mit jedem Vokabular, aber bei meinem, das nur aus Benutzerdefinierten Vokabeln besteht (mit rotem Plus vor dem Wort) geht es bestens!
Angefügte Bilder:
Aufgrund eingeschränkter Benutzerrechte werden nur die Namen der Dateianhänge angezeigt Jetzt anmelden! f12t512p3624n94.jpg
Alle Achtung vor dem, was Sie das geleistet haben, aber ohne es zu schmälern zu beabsichtigen habe ich meine derzeitige Auseinandersetzung mit dem Thema für heute Abend, na für den letzten Teil davon, mal ein wenig umgelenkt und die Idee aufgegriffen, die Sie weiter oben schon angesprochen haben, nämlich: wie kann ich eine Wortliste (neue Wörter) importieren und für die neu importierten Wörter zugleich die Worteigenschaften entsprechend einstellen.
Das Resultat in Form eines ausführbaren Programms sende ich Ihnen als Installationsroutine per E-Mail zu, zur freien Verwendung - das ist eh nicht vermarktungsfähig und bei Lichte betrachtet wenig produktiv.
Sorry for the English, ich arbeite "international". Für Sie ist da insbesondere der Button "Do specials" vorgesehen, wenn Sie darauf klicken, können Sie eine TXT-Datei mit Wörtern auswählen, deren Inhalt, sofern neu, ins Vokabular übernommen wird mit den betreffenden Einstellungen.
Hinweis: die Wörter sollten nur in einfacher Form, also nur mit geschriebener Form, vorliegen, auch wenn solche Wörter schon zuvor im Vokabular vorhanden waren und gelöscht worden sind, werden sie wieder eingefügt. Sind sie aber im Vokabular vorhanden, werden sie übersprungen. Auch das könnte man noch entsprechend zweigleisig behandeln - später vielleicht.
Happy further coding!
Rüdiger
_______________________________________
Dragon Professional 16 auf Windows 10 Pro und Windows 11 SpeechMike Premium (LFH3500); Office 2019 Pro + Office 365 (monatliches Abo) HP ZBook Fury 17 G8 - i7-11800H - 24 MB SmartCache - 32 GB RAM - 1 TB SSD