PDA

View Full Version : API-Zugriff auf Function-Filter



stefan.maus
15th October 2012, 12:32
Guten Tag,

ich würde gerne über die API Filter einer Bildumschalt-Funktion ( 'Screen switch' ) konfigurieren.
Die Funktion ist bereits angelegt und die Filter vorkonfiguriert.

http://imageshack.us/a/img811/2070/function1.jpg (http://imageshack.us/photo/my-images/811/function1.jpg/)

Aus C# will ich neue Data-Sets anlegen, editieren und löschen.

http://imageshack.us/a/img545/7660/filterwu.jpg (http://imageshack.us/photo/my-images/545/filterwu.jpg/)

Leider ist mir nicht klar, wie ich über die RtFunction mittels DynProperty an diese Eigenschaften komme! Ich möchte auf jeden Fall den Umweg über XML-Export der Function -> XML-Manipulation -> XML-Import der Function vermeiden!

markclemens
16th October 2012, 05:16
Hallo Stefan,

Das Prinzip wie das funktioniert in der API ist eigentlich überall gleich. Mittels "CreateDynproperty" lässt sich ein neuer Dataset erstellen. Nachdem der Dataset erzeugt ist, kann sie konfiguriert werden.

Die Reihenfolge in der die DynProperties gesetzt werden ist dabei oft relevant. So muss unter umstände zuerst der Typ definiert werden, und danach können weitere Properties definiert werden. Properties die in der GUI ausgegraut sind wenn eine weitere Option in der GUI nicht aktiv ist, können auch über die API nicht gesetzt werden wenn dieses Dynproperty nicht zuerst gesetzt wird.

XML Export hilft auf jeden Fall weiter zu verstehen wie die Datasets konfiguriert sind, und welche DynProperties über die API verwendet werden können und mit welche Werte sie zu befüllen sind.

Die online hilfe "object model" bietet im Kapitel "RtFunction.CreateDynProperty" ein Beispiel wie das mit der Bildumschaltung auf das erweiterte Trend Modul Bild funktioniert.

Hier ein kleines Beispiel in VBA, das Prinzip in C# ist fast gleich.

Sub add_dataset()
'create a new dataset at the function
MyWorkspace.ActiveDocument.RtFunctions.Item("Function_Screen_CF_Reporting").CreateDynProperty ("PictFilter[0].DataSet")
'check the number of datasets
Debug.Print MyWorkspace.ActiveDocument.RtFunctions.Item("Function_Screen_CF_Reporting").DynProperties("PictFilter[0].DataSet[-1]")
'access a specific data set property
Debug.Print MyWorkspace.ActiveDocument.RtFunctions.Item("Function_Screen_CF_Reporting").DynProperties("PictFilter[0].DataSet[0].TimeFilterIdx")
Debug.Print MyWorkspace.ActiveDocument.RtFunctions.Item("Function_Screen_CF_Reporting").DynProperties("PictFilter[0].DataSet[1].DatSetType")
End Sub

stefan.maus
16th October 2012, 08:36
Danke! :)

Müsste man dann nicht eigentlich so Variablen aus einem Archiv dem DataSet zuordnen können.


currentFunction.CreateDynProperty("PictFilter[0].DataSet[" + dataSetIndex + "].Filter");
....
currentFunction.CreateDynProperty("PictFilter[0].DataSet[" + dataSetIndex + "].Filter[" + filterIndex + "].VarInfo");

currentFunction.DynProperties["PictFilter[0].DataSet[" + dataSetIndex + "].Filter[" + filterIndex + "].VarInfo[0].Variable"] = "CM";
currentFunction.DynProperties["PictFilter[0].DataSet[" + dataSetIndex + "].Filter[" + filterIndex + "].VarInfo[0].VarName"] = "CF_foo";
currentFunction.DynProperties["PictFilter[0].DataSet[" + dataSetIndex + "].Filter[" + filterIndex + "].VarInfo[0].Variable"] = "CF_foo";

markclemens
16th October 2012, 08:48
Im Prinzip sollte man bei Elemente die in der GUI neu erzeugt werden in ein Dialog (datasets), oder hinzugefügt werden in ein Dialog (Variablen), "CreateDynProperty" aufrufen, und entsprechend die Dynproperties für die neu erzeugte Elemente setzen.

Ohne das jetzt explizit ausprobiert zu haben, hätte ich gesagt, das müsste auch so funktionieren mit Variablen für das Dataset für das Archiv.

Übrigens gibt es keine "DeleteDynProperty" in der API. Man kann nur neue erstellen und bestehende modifizieren.

Mfg
Mark

stefan.maus
16th October 2012, 09:10
Hi Mark,

habe folgendes ausprobiert:


....
bool a = currentFunction.CreateDynProperty("PictFilter[0].DataSet[" + dataSetIndex + "].Filter");
....
bool b = currentFunction.CreateDynProperty("PictFilter[0].DataSet[" + dataSetIndex + "].Filter[" + filterIndex + "].VarInfo");
currentFunction.DynProperties["PictFilter[0].DataSet[" + dataSetIndex + "].Filter[" + filterIndex + "].VarInfo[0].Variable"] = "CM";
currentFunction.DynProperties["PictFilter[0].DataSet[" + dataSetIndex + "].Filter[" + filterIndex + "].VarInfo[0].VarName"] = "CF_foo";
currentFunction.DynProperties["PictFilter[0].DataSet[" + dataSetIndex + "].Filter[" + filterIndex + "].VarInfo[0].Variable"] = "CF_foo";


a = true;
b = false;

Leider werden keine Variablen dem DataSet hinzugefügt!

herberto
16th October 2012, 09:50
Handbuch -> Programmierschnittstellen -> Object Model -> RtFunctions

stefan.maus
16th October 2012, 10:00
Danke. Löst mein Problem aber leider nicht.

herberto
16th October 2012, 10:05
Das Prinzip ist ja das gleiche...
Was beim einer Bildumschaltfunktion auf das ETM funktioniert, kann auch bei allen anderen Funktionen herangezogen werden...
Vorgehensweise ist immer die gleiche...

Einfach im Editor "F1" drücken und dann den obigen Pfad folgen....
Wie die einzelnen zu modifzierenden Properties heißen, kann ab besten durch das *.xml exportieren der Funktion herausgefunden werden...

stefan.maus
16th October 2012, 11:30
Doku und XML habe ich mir selbstverständlich angeschaut.


//Filter
_currentFunction = CurrentProject.RtFunctions().Item(functionName);
_currentFunction.CreateDynProperty("PictFilter[0].DataSet");
_currentFunction.DynProperties["PictFilter[0].DataSet[0].Name"] = "DataSet_Foo_1";
_currentFunction.DynProperties["PictFilter[0].DataSet[0].DatSetType"] = 3;

_currentFunction.CreateDynProperty("PictFilter[0].DataSet[0].Filter");
_currentFunction.CreateDynProperty("PictFilter[0].DataSet[0].Filter[0].VarInfo"); _currentFunction.DynProperties["PictFilter[0].DataSet[0].Filter.VarInfo[0].Archive"] = "CM";
_currentFunction.DynProperties["PictFilter[0].DataSet[0].Filter.VarInfo[0].VarName"] = "CF_Foo";
_currentFunction.DynProperties["PictFilter[0].DataSet[0].Filter.VarInfo[0].Variable"] = "CF_Foo";


DataSet wird angelegt und bekommt den Namen. Das Hinzufügen von Variablen funktioniert auf diese Weise nicht.

markclemens
17th October 2012, 03:49
Hallo Stefan,

Eventuell liegt das an der Reihenfolge vom Setzen der DynProperties (wie schon mal erwähnt), zugegeben, das ist hier vielleicht nicht so offensichtlich.

Mit DynPropertiesEnum gibt es übrigens eine weitere Möglichkeit zu prüfen welche DynProperties es gibt, und welchen Datentyp diese erwarten. Einfach im Debugger in VBA durchsteppen und im locals Fenster den Inhalt der "DynProps" variablen ansehen.

Mit diesem Beispiel hat es bei mir funktioniert:

Sub ScrSwRepViewer()
Dim aP As Project
Dim mFnc As RtFunction
Dim mVar As Variable
Dim mArv As ArchiveED
Dim mArvVar As ArchiveVarED
Dim dynProps1, dynProps2, dynProps3, dynProps4, dynProps5

Set aP = MyWorkspace.ActiveDocument
Set mFnc = aP.RtFunctions.Item("b")
Set mVar = aP.Variables.Item("var")
Set mArv = aP.ArchivesED.Item("01")
Set mArvVar = mArv.Item("var")

mFnc.CreateDynProperty ("PictFilter[0].DataSet[0].Filter[0].VarInfo")
mFnc.DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].Archive") = "01"
mFnc.DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].Variable") = "var"
mFnc.DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].VarName") = "var"
mFnc.DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].VarMinValue") = -1000
mFnc.DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].VarMaxValue") = 1000


dynProps1 = mFnc.DynPropertiesEnum("")
dynProps2 = mFnc.DynPropertiesEnum("PictFilter[0]")
dynProps3 = mFnc.DynPropertiesEnum("PictFilter[0].DataSet[0]")
dynProps4 = mFnc.DynPropertiesEnum("PictFilter[0].DataSet[0].Filter[0]")
dynProps5 = mFnc.DynPropertiesEnum("PictFilter[0].DataSet[0].Filter[0].VarInfo[0]")




End Sub

Mfg
Mark

stefan.maus
17th October 2012, 11:31
Danke Marc! Es funktioniert und ich habs verstanden :-)


_currentFunction.CreateDynProperty("PictFilter[0].DataSet");
_currentFunction.set_DynProperties("PictFilter[0].DataSet[0].Name", "DataSet_Foo_1");
_currentFunction.set_DynProperties("PictFilter[0].DataSet[0].DatSetType", 3);

_currentFunction.CreateDynProperty("PictFilter[0].DataSet[0].Filter[0].VarInfo");
_currentFunction.set_DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].Archive", "CM");
_currentFunction.set_DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].Variable", "name");
_currentFunction.set_DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].VarName", "name");
_currentFunction.set_DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].VarMinValue", -1000);
_currentFunction.set_DynProperties("PictFilter[0].DataSet[0].Filter[0].VarInfo[0].VarMaxValue", 1000);


Ticket kann geschlossen werden!

Gruß

Stefan