digitalwerk community: hiddenhttps://support.digitalwerk.net/https://support.digitalwerk.net/themes/digitalwerk_theme/favicon/dw.ico?16823609612020-06-06T16:03:44Zdigitalwerk community
Redmine Public Support - Support Request #11155: Using dynamic properties in ADTF 3.xhttps://support.digitalwerk.net/issues/11155#change-478992020-06-06T16:03:44Zhidden
<p>Hi Martin,</p>
<p>das geht natürlich auch - danke!</p>
<p>Beste Grüße,<br />Patrick</p> Public Support - Support Request #11155: Using dynamic properties in ADTF 3.xhttps://support.digitalwerk.net/issues/11155#change-477642020-06-01T21:35:51Zhidden
<p>Hallo Florian,</p>
<blockquote>
<p>Hidden Dynamic Properties machen für mich keinen Sinn, weil du ja den Anwender dazu bewegst, Properties anzulegen/zu bedaten und dann verstecken ? Das spiest sich irgendwie, ggf. ist dann auch ein Property der falsche Weg oder ich verstehe den Use Case nicht.</p>
</blockquote>
<p>Mein konkreter Usecase ist ein Sensor, der mit einer Streaming Source implementiert wird. Für die Konfiguration werden dynamische Properties benötigt, da gewisse Unterstrukturen der Gesamt-Konfiguration mehrmals hinzugefügt werden können/müssen. Somit ist der einzige Weg über den QML Editor selbst. Hier werden diese Properties angelegt und später bei der Initalisierung der Streaming Source abgegriffen und der Sensor konfiguriert. Bei der QML GUI kann bereits ein Validierung der konfigurierten Werte/Datentypen erfolgen. Später können diese Werte im Konfigurations-Editor ohne der QML GUI jedoch wieder zu invaliden Daten verändert werden. Somit wäre es für meinen Usecase von Vorteil, wenn es Read-Only oder eben Hidden Properties geben würde. So wird der Verwender der Streaming Source quasi gezwungen die Konfiguration immer über die QML GUI vorzunehmen. Es funktioniert natürlich trotzdem ohne diesem "Feature", aber vielleicht hilft euch dieses Feedback.</p>
<blockquote>
<p>Das ist ein Bug im QML/CE bzw. dem Script... das tritt aktuell bei uns auch auf und liegt nicht an deinem Doing.<br />Deshalb bitte ignorieren, das muss noch debugged und gefixt werden (ACORE-10536).</p>
</blockquote>
<p>Alles klar, dann werde ich diese Meldung zur Zeit ignorieren.<br />Danke für die Hilfe!</p>
<p>Patrick</p> Public Support - Support Request #11155: Using dynamic properties in ADTF 3.xhttps://support.digitalwerk.net/issues/11155#change-475222020-05-22T08:46:47Zhidden
<p>Hallo nochmal,</p>
<p>außerdem werde ich nicht schlau daraus, wieso beim Aufruf von createProperty(...) über die QML-API immer eine MessageBox mit der Info "Argument contains a null pointer" erscheint.<br />Das Property wird dennoch mit dem richtigen Typ, Namen und Wert beim korrekten Filter hinzugefügt. targetModel kann somit auch kein nullpointer sein.</p>
<p>Patrick</p> Public Support - Support Request #11155: Using dynamic properties in ADTF 3.xhttps://support.digitalwerk.net/issues/11155#change-474482020-05-19T08:58:03Zhidden
<p>Hallo Martin,</p>
<p>danke für den zusätzlichen Hinweis!<br />In der Zwischenzeit hat sich bei mir eine neue Frage aufgetan. :)</p>
<p>Können dynamische Properties, die über die QML-API mit <pre><code class="c syntaxhl"><span class="n">createProperty</span><span class="p">(...)</span></code></pre> erzeugt wurden, auch hidden oder read-only sein?<br />Somit könnte man schon eine erste Validierung des Inputs innerhalb der QML GUI durchführen, da anschließend diese im ADTF Config Editor unter Properties nicht mehr verändert werden können. Für meine Anwendung wäre es von Vorteil, wenn der User <strong>immer</strong> die Konfiguration über den QML Filter Editor vornimmt. Nach dem Speichern sind diese schreibgeschützt im ADTF Config Editor unter Properties sichtbar. Ist das derzeit möglich ?</p>
<p>Patrick</p> Public Support - Support Request #11155: Using dynamic properties in ADTF 3.xhttps://support.digitalwerk.net/issues/11155#change-470872020-05-07T18:30:34Zhidden
<p>Hallo Florian,</p>
<p>mit der Version 3.7.0 funktioniert nun alles und dein Snippet hilft mir sehr bei meiner Implementierung.</p>
<p>Besten Dank!<br />Patrick</p> Public Support - Support Request #11155: Using dynamic properties in ADTF 3.xhttps://support.digitalwerk.net/issues/11155#change-470222020-05-06T20:20:17Zhidden
<p>Hallo Florian,</p>
<p>danke erstmal.<br />Das <a href="https://support.digitalwerk.net/adtf/v3/adtf_html/classadtf_1_1filter_1_1flash_1_1c_graph_object.html#a19b2d6514c8ff9922a434dd21ad9d55b" class="external">SetEditor</a> -Beispiel mit einem in der Filter-Klasse vorhandenen, registrierten Property, welches dann über die QML GUI verändert werden kann, hat super funktioniert.</p>
<p>Jedoch habe ich immer noch Probleme mit dem Erstellen von neuen Properties. Das <a href="https://support.digitalwerk.net/adtf/v3/adtf_html/page_filter_editor.html" class="external">createProperty</a> -Beispiel hat nicht funktioniert. Verstehe ich es richtig, dass nach Eingabe von validen Daten und nach einem Klick auf den QML-Button, das Property im <strong>Editor</strong> rechts unter <strong>Properties</strong> erscheinen sollte? Und wie kann ich danach innerhalb meines Filters diese Properties zum Beispiel bei der überschriebenen Init-Methode verwenden, wenn ich keine private Membervariable für das Property habe?</p>
<p>Danke für die Hilfe.<br />Patrick</p> Public Support - Support Request #11155 (Closed): Using dynamic properties in ADTF 3.xhttps://support.digitalwerk.net/issues/111552020-05-05T12:48:23Zhidden
<p><strong>Supportanfrage</strong></p>
<p>ich würde gerne bei einem Streaming Source Filter dynamische Properties hinzufügen.</p>
<p>Im Detail: Man setzt im Configuration Editor z.B.: ein existierendes Property "Anzahl Felder" auf den Wert 3.<br />Danach sollten die Properties Feld0, Feld1, Feld2 dynamisch erzeugt werden, in Editor unter Properties angezeigt werden und Werte zugewiesen werden können.<br />Das Ganze sollte noch vor der eigentlichen Initalisierungsphase des Filters passieren.</p>
<p>Gibt es dazu eine Möglichkeit?</p>
<p><strong>Lösung</strong></p>
<p>Das wird ab ADTF 3.7.0 unterstützt</p>
<p>Um dynamische Elemente wie Pins und Properties zu erzeugen, wird in ADTF 3.x ein QML Filter Editor verwendet.<br />D.h. du musst in deinen Filter Code im Konstruktor ein Qml File relativ zur Plugindescription referenzieren (siehe <a href="https://support.digitalwerk.net/adtf/v3/adtf_html/classadtf_1_1filter_1_1flash_1_1c_graph_object.html#a19b2d6514c8ff9922a434dd21ad9d55b" class="external">SetEditor</a>).</p>
<p>Dann bekommt dein Filter ein Kontextmenu Eintrag und ein Qml Code wird ausgeführt.<br />Hierzu gibt es eine API und Bsp, siehe <a class="external" href="https://support.digitalwerk.net/adtf/v3/adtf_html/page_filter_editor.html">https://support.digitalwerk.net/adtf/v3/adtf_html/page_filter_editor.html</a><br />Der Player nutzt z.b. diesen Mechanismus um Pins für die Streams aus dem adtfdat file anzulegen, das qml file findest du ebenso im delivery.</p>
<p>Eine Property Variable bietet dir quasi eine Referenz auf eine statische Variable an.<br />Das klappt natürlich bei dynamischen Properties nicht.<br />Du kannst direkt auf der Property arbeiten, wenn es keine statische ist.</p>
<p>Im folgenden Snippet hast du z.B. eine Property myFilename vom Typ cFilename erstellt:</p>
<pre><code class="cpp syntaxhl"><span class="c1">// get all properties</span>
<span class="n">object_ptr</span><span class="o"><</span><span class="k">const</span> <span class="n">IProperties</span><span class="o">></span> <span class="n">pProperties</span><span class="p">;</span>
<span class="n">RETURN_IF_FAILED</span><span class="p">(</span><span class="k">this</span><span class="o">-></span><span class="n">GetProperties</span><span class="p">(</span><span class="n">pProperties</span><span class="p">));</span>
<span class="c1">// get the specific property</span>
<span class="n">adtf</span><span class="o">::</span><span class="n">base</span><span class="o">::</span><span class="n">ant</span><span class="o">::</span><span class="n">property</span><span class="o"><</span><span class="n">cFilename</span><span class="o">></span> <span class="n">oProp</span><span class="p">;</span>
<span class="n">RETURN_IF_FAILED</span><span class="p">(</span><span class="n">pProperties</span><span class="o">-></span><span class="n">GetProperty</span><span class="p">(</span><span class="s">"myFilename"</span><span class="p">,</span> <span class="n">oProp</span><span class="p">));</span>
<span class="c1">// do something, e.g. print</span>
<span class="n">cString</span> <span class="n">strValue</span><span class="p">;</span>
<span class="n">oProp</span><span class="p">.</span><span class="n">GetValue</span><span class="p">()</span><span class="o">-></span><span class="n">ToString</span><span class="p">(</span><span class="n">adtf_string_intf</span><span class="p">(</span><span class="n">strValue</span><span class="p">));</span>
<span class="n">LOG_INFO</span><span class="p">(</span><span class="n">strValue</span><span class="p">.</span><span class="n">GetPtr</span><span class="p">());</span>
</code></pre>
<p>Alternativ kannst auch ausschließlich statt dem Snippet die elegantere template Funktion verwendet werden:</p>
<pre><code class="cpp syntaxhl"><span class="k">auto</span> <span class="n">strFilename</span> <span class="o">=</span> <span class="n">adtf</span><span class="o">::</span><span class="n">base</span><span class="o">::</span><span class="n">get_property</span><span class="o"><</span><span class="n">cFilename</span><span class="o">></span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">,</span> <span class="s">"myFilename"</span><span class="p">);</span>
</code></pre>
<p>Um Auch Sub-Properties auszulesen nimmt man am besten</p>
<pre><code class="cpp syntaxhl"><span class="k">auto</span> <span class="n">strFilename</span> <span class="o">=</span> <span class="n">adtf</span><span class="o">::</span><span class="n">base</span><span class="o">::</span><span class="n">get_property_by_path</span><span class="o"><</span><span class="n">cFilename</span><span class="o">></span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">,</span> <span class="s">"parent/child/myFilename"</span><span class="p">);</span>
</code></pre>
<p>Zur Vollständig:</p>
<p>Man kann property_variable<> auch für "dynamische" Properties verwenden, müssen dann aber an anderer Stelle registriert werden um nicht in der Plugin Description zu landen:</p>
<pre><code class="cpp syntaxhl"><span class="c1">// zur Aufbewahrung ein Member</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">property_variable</span><span class="o"><</span><span class="n">tInt32</span><span class="o">>>></span> <span class="n">m_oProperties</span><span class="p">;</span>
<span class="c1">// dann in der Init oder sonst wo</span>
<span class="k">for</span> <span class="p">(</span><span class="n">tSize</span> <span class="n">nPropertyIndex</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">nPropertyIndex</span> <span class="o"><</span> <span class="mi">10</span><span class="p">;</span> <span class="o">++</span><span class="n">nPropertyIndex</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">m_oProperties</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o"><</span><span class="n">property_variable</span><span class="o"><</span><span class="n">tInt32</span><span class="o">>></span><span class="p">());</span>
<span class="n">RegisterPropertyVariable</span><span class="p">((</span><span class="s">"value"</span> <span class="o">+</span> <span class="n">std</span><span class="o">::</span><span class="n">to_string</span><span class="p">(</span><span class="n">nPropertyIndex</span><span class="p">)).</span><span class="n">c_str</span><span class="p">(),</span> <span class="o">*</span><span class="n">m_oProperties</span><span class="p">.</span><span class="n">back</span><span class="p">());</span>
<span class="p">}</span>
</code></pre>
<p>Ich empfehle aber den vereinfachten template Weg zum Einlesen und einen QML Filter Editor zum Anlegen im CE.</p>