{"id":665,"date":"2016-01-21T21:28:43","date_gmt":"2016-01-21T20:28:43","guid":{"rendered":"http:\/\/ipsview.brownson.at\/?p=665"},"modified":"2019-07-18T22:19:49","modified_gmt":"2019-07-18T21:19:49","slug":"kopieren-einer-view-mit-aenderung-der-aufloesung","status":"publish","type":"post","link":"https:\/\/ipsview.brownson.at\/?p=665","title":{"rendered":"Kopieren einer View mit \u00c4nderung der Aufl\u00f6sung"},"content":{"rendered":"<p><span style=\"color: #ff0000;\">ACHTUNG: Mittlerweile ist die Funktionalit\u00e4t direkt im IPSStudio integriert.<\/span><\/p>\n<p><span style=\"color: #ff0000;\">ACHTUNG: Alternativ ist dieses Skript auch als Modul verf\u00fcgbar<\/span> &#8211; siehe\u00a0<a href=\"http:\/\/ipsview.brownson.at\/?p=726\">Modul &#8211; Synchronisieren von Views<\/a><\/p>\n<p>Ich m\u00f6chte hier mal ein Skript vorstellen, mit dem man eine View kopieren kann und dabei gleichzeitig die Aufl\u00f6sung \u00e4ndern kann.<\/p>\n<p>So ist es zum Beispiel m\u00f6glich die View eines iPad auf eine Android View mit h\u00f6herer Aufl\u00f6sung zu kopieren.<\/p>\n<p>F\u00fcr die X und Y Achse kann ein beliebiger Faktor angegeben werden, Ziel View wird mit der Source View \u00fcberschrieben (vorher unbedingt Backup machen).<\/p>\n<p>In manchen F\u00e4llen muss man die generierte View noch etwas nacharbeiten.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-title=\"Resize View\">&lt;? \r\n    \/**\r\n     * @file          IPSView_ResizeView.php\r\n     * @author        brownson\r\n     * @version\r\n     *   Version 1.0, 2015-08-10 brownson: Initiale Version&lt;br\/&gt;\r\n     *   Version 1.1, 2016-01-27 brownson: Reduced Memory Usage&lt;br\/&gt;\r\n     *\r\n     * IPSView Skript um eine View auf eine andere View zu kopieren inklusive\r\n     * Umrechung der Skalierung von X und Y Achse.\r\n     *\r\n     * Konfiguration Einstellungen:\r\n     *   * $masterViewID     - ID der View von der kopiert werden soll\r\n     *   * $childViewID      - ID der View auf die kopiert werden soll\r\n     *   * $childViewFactorX - Umrechnungsfaktor f\u00fcr die X Achse\r\n     *   * $childViewFactorY - Umrechnungsfaktor f\u00fcr die Y Achse\r\n     *\r\n     *\/\r\n\r\n    \/\/ Konfiguration\r\n    $masterViewID        = 12345;\r\n    $childViewID         = 67890;\r\n    $childViewFactorX    = 2.5;\r\n    $childViewFactorY    = 2.13;\r\n\r\n    \/\/ -------------------------------------------------------------------------\r\n\r\n    \/\/ Konfiguration \u00fcberpr\u00fcfen\r\n    if ($masterViewID == &#039;&#039;) {\r\n        die(&#039;Bitte geben Sie eine MasterViewID in der Konfiguration an.&#039;);\r\n    }\r\n\r\n    \/\/ Konfiguration \u00fcberpr\u00fcfen\r\n    if ($childViewID == &#039;&#039;) {\r\n        die(&#039;Bitte geben Sie eine ChildViewID in der Konfiguration an.&#039;);\r\n    }\r\n\r\n    echo &quot;Convert View with FactorX=$childViewFactorX and FactorY=$childViewFactorY&quot;.PHP_EOL;\r\n    echo &quot;Available Memory: &quot;.ini_get(&#039;memory_limit&#039;).&#039; &#039;;\r\necho &quot;&quot;.PHP_EOL;\r\n\r\n   showMemoryUsage(&#039;Startup: &#039;);\r\n\r\n    $viewProperties = getViewProperties ($childViewID);\r\n    $masterObj      = getViewObject($masterViewID);\r\n\r\n    \/\/ Build Result Object\r\n    $resultObj                   = resizeView ($masterObj, $childViewFactorX, $childViewFactorY);\r\n    $resultObj[&#039;ViewRatio12&#039;]    = $viewProperties[&#039;ViewRatio12&#039;];\r\n    $resultObj[&#039;Name&#039;]           = $viewProperties[&#039;Name&#039;];\r\n    $resultObj[&#039;ID&#039;]             = $childViewID;\r\n    $resultObj[&#039;Width&#039;]          = $viewProperties[&#039;Width&#039;];\r\n    $resultObj[&#039;Height&#039;]         = $viewProperties[&#039;Height&#039;];\r\n    $resultObj[&#039;Client&#039;]         = $viewProperties[&#039;Client&#039;];\r\n    $resultObj[&#039;Hardware&#039;]       = $viewProperties[&#039;Hardware&#039;];\r\n\r\n   showMemoryUsage(&#039;Build Result:&#039;);\r\n   $masterObj = null;\r\n   \r\n    \/\/ Write Data to View\r\n    writeViewContent ($childViewID, $resultObj);\r\n    $resultObj = null;\r\n   showMemoryUsage(&#039;finished:&#039;);\r\n\r\n    echo &#039; &#039;.PHP_EOL;\r\n    echo &#039;=============================================================&#039;.PHP_EOL;\r\n    echo &#039;Successfully finished synchronization                        &#039;.PHP_EOL;\r\n    echo &#039;=============================================================&#039;.PHP_EOL;\r\n\r\n    \/\/ ----------------------------------------------------------------------------------------------------\r\n    function writeViewContent ($ID, $viewObj) {\r\n       $name    = IPS_GetName($ID);\r\n        \/\/ Write Data to View\r\n\r\n        $data        = json_encode($viewObj);\r\n       showMemoryUsage(&quot;json_encode &#039;$name&#039;&quot;);\r\n        $viewObj = null;\r\n\r\n        $content     = base64_encode($data);\r\n       showMemoryUsage(&quot;base64_encode &#039;$name&#039;&quot;);\r\n        $data = null;\r\n\r\n        IPS_SetMediaContent($ID, $content);\r\n       showMemoryUsage(&quot;IPS_SetMediaContent &#039;$name&#039;&quot;);\r\n        $resultContent = null;\r\n    }\r\n\r\n    \/\/ ----------------------------------------------------------------------------------------------------\r\n    function getViewProperties ($ID) {\r\n       $viewObj = getViewObject($ID);\r\n       $name    = IPS_GetName($ID);\r\n\r\n        $result                   = array();\r\n        $result[&#039;ViewRatio12&#039;]    = $viewObj[&#039;ViewRatio12&#039;];\r\n        $result[&#039;Name&#039;]           = $viewObj[&#039;Name&#039;];\r\n        $result[&#039;ID&#039;]             = $viewObj[&#039;ID&#039;];\r\n        $result[&#039;Width&#039;]          = $viewObj[&#039;Width&#039;];\r\n        $result[&#039;Height&#039;]         = $viewObj[&#039;Height&#039;];\r\n        $result[&#039;Client&#039;]         = $viewObj[&#039;Client&#039;];\r\n        $result[&#039;Hardware&#039;]       = $viewObj[&#039;Hardware&#039;];\r\n       showMemoryUsage(&quot;getViewProperties &#039;$name&#039;&quot;);\r\n\r\n       return $result;\r\n    }\r\n\r\n    \/\/ ----------------------------------------------------------------------------------------------------\r\n    function getViewObject($ID) {\r\n       $name = IPS_GetName($ID);\r\n    \r\n        \/\/ Read Content of View\r\n        $content     = IPS_GetMediaContent($ID);\r\n       showMemoryUsage(&quot;IPS_GetMediaContent &#039;$name&#039;&quot;);\r\n        if ($content===false) {\r\n            die(&quot;Media Objekt von Master konnte NICHT gefunden werden&quot;);\r\n        }\r\n\r\n        $data         = base64_decode($content);\r\n       showMemoryUsage(&quot;base64_decode &#039;$name&#039;&quot;);\r\n        $content      = null;\r\n\r\n        $obj          = json_decode($data, true);\r\n       showMemoryUsage(&quot;json_decode &#039;$name&#039;&quot;);\r\n        $data         = null;\r\n         if ($obj===false) {\r\n            die(&quot;JSON Objekt von View &#039;$name&#039; konnte NICHT dekodiert werden&quot;);\r\n        }\r\n        return $obj;\r\n    }\r\n\r\n    \/\/ ----------------------------------------------------------------------------------------------------\r\n    function resizeView ($jsonObj, $factorX, $factorY) {\r\n        $factor = $factorX &gt; $factorY ? $factorY : $factorX;\r\n        $pages  = array();\r\n        foreach ($jsonObj[&#039;Pages&#039;] as $page) {\r\n           \/\/echo &quot;Process Page=&quot;.$page[&#039;DisplayName&#039;].PHP_EOL;\r\n            $controls = array();\r\n            foreach ($page[&#039;Controls&#039;] as $control) {\r\n                $control[&#039;Width&#039;]     = round($control[&#039;Width&#039;] * $factorX);\r\n                $control[&#039;Height&#039;]    = round($control[&#039;Height&#039;] * $factorY);\r\n                $control[&#039;LocationX&#039;] = round($control[&#039;LocationX&#039;] * $factorX);\r\n                $control[&#039;LocationY&#039;] = round($control[&#039;LocationY&#039;] * $factorY);\r\n                if (array_key_exists(&#039;Font&#039;, $control) &amp;&amp; array_key_exists(&#039;Size&#039;, $control[&#039;Font&#039;])) {\r\n                   $control[&#039;Font&#039;][&#039;Size&#039;] = round($control[&#039;Font&#039;][&#039;Size&#039;] * $factor);\r\n                }\r\n                if (array_key_exists(&#039;CR1&#039;, $control)) $control[&#039;CR1&#039;] = round($control[&#039;CR1&#039;] * $factor);\r\n                if (array_key_exists(&#039;CR2&#039;, $control)) $control[&#039;CR2&#039;] = round($control[&#039;CR2&#039;] * $factor);\r\n                if (array_key_exists(&#039;CR3&#039;, $control)) $control[&#039;CR3&#039;] = round($control[&#039;CR3&#039;] * $factor);\r\n                if (array_key_exists(&#039;CR4&#039;, $control)) $control[&#039;CR4&#039;] = round($control[&#039;CR4&#039;] * $factor);\r\n                $controls[] = $control;\r\n            }\r\n            $page[&#039;Controls&#039;]    = $controls;\r\n            $page[&#039;PopupWidth&#039;]  = round($page[&#039;PopupWidth&#039;] * $factorX);\r\n            $page[&#039;PopupHeight&#039;] = round($page[&#039;PopupHeight&#039;] * $factorY);\r\n            $pages[] = $page;\r\n        }\r\n        $jsonObj[&#039;Pages&#039;] = $pages;\r\n\r\n        return $jsonObj;\r\n    }\r\n\r\n    \/\/ ----------------------------------------------------------------------------------------------------\r\n    function showMemoryUsage($statusMessage) {\r\n        $statusMessage = substr($statusMessage.&#039;                                                            &#039;, 0, 60);\r\n        $memory = round(memory_get_usage() \/ 1024 \/ 1024, 2);\r\n       echo $statusMessage . &#039; UsedMemory=&#039;.$memory. &quot; MB&quot;.PHP_EOL;\r\n    }\r\n\r\n?&gt;<\/pre>\n<p>Wer diesen Vorgang auch noch komplett automatisieren m\u00f6chte, kann das mit folgendem Skript realisieren:<\/p>\n<p>Beim Aufruf des Skriptes wird der komplette Inhalt der Masterview auf die spezifizierte Targetview kopiert und dabei alle Seiten und Steuerelemente entsprechend den eingestellten Faktoren in X und Y Richtung neu skaliert.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"php\" data-enlighter-title=\"Sync Views\">&lt;?\r\n\t\/**\r\n\t * @file          IPSView_SyncAndroidTestview.php\r\n\t * @author        brownson\r\n\t * @version\r\n\t *   Version 1.0, 2015-06-09 brownson: Initiale Version&lt;br\/&gt;\r\n\t *\r\n\t * IPSView Skript um eine 2 Views zu synchronisieren\r\n\t *\r\n\t * Konfiguration Einstellungen:\r\n\t *   * $masterViewID    - ID der Master View\r\n\t *   * $androidViewID   - ID der View die synchronisiert werden soll\r\n\t *   * $resizeScriptID  - ID des Scriptes das zum Resize aufgerufen\r\n\t *                        werden soll\r\n\t *\r\n\t *\/\r\n\r\n\t\/\/ Konfiguration\r\n\t$masterViewID     = 12586 \/*[TestView_v2.2.ipsView]*\/;\r\n\t$androidViewID    = 23327 \/*[TestView_v2.2A.ipsView]*\/;\r\n\t$resizeScriptID   = 15584 \/*[TestView_v2.2A.ipsView]*\/;\r\n\r\n\t\/\/ -------------------------------------------------------------------------\r\n\r\n\t\/\/ Konfiguration \u00fcberpr\u00fcfen\r\n\tif ($masterViewID == &#039;&#039;) {\r\n\t\techo &#039;Bitte geben Sie eine ViewID in der Konfiguration an.&#039;.PHP_EOL;\r\n\t\treturn;\r\n\t}\r\n\r\n\t$masterMedia       = IPS_GetMedia($masterViewID);\r\n\t$masterTimestamp   = array_key_exists(&#039;MediaUpdated&#039;, $masterMedia)\r\n\t                        ? $masterMedia[&#039;MediaUpdated&#039;] \/*v4.x*\/\r\n\t\t\t\t: $masterMedia[&#039;LastUpdate&#039;] \/*v3.x*\/;\r\n\t$androidMedia      = IPS_GetMedia($androidViewID);\r\n\t$androidTimestamp  = array_key_exists(&#039;MediaUpdated&#039;, $androidMedia)\r\n\t                        ? $androidMedia[&#039;MediaUpdated&#039;] \/*v4.x*\/\r\n\t\t\t\t: $androidMedia[&#039;LastUpdate&#039;] \/*v3.x*\/;\r\n\r\n\tif ($masterTimestamp &gt;  $androidTimestamp \/*Masterview has changed*\/) {\r\n\t\techo &quot;MasterView has changed ...&quot;.PHP_EOL;\r\n\r\n\t\tIPS_RunScriptWait($resizeScriptID);\r\n\t}\r\n?&gt;\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p>Das Script \u00fcberpr\u00fcft die Timestamp der beiden Views und ruft bei einer \u00c4nderung der Masterview\u00a0das Resize Skript auf.\u00a0Den n\u00f6tigen Timer f\u00fcr einen zyklischen Aufruf des Skriptes \u00a0(zb alle 10 Sekunden) muss noch manuell dazu angelegt werden.<\/p>\n<p>[Update 2016-06-20]<\/p>\n<p>Modifizierung des Skriptes um den Speicherverbrauch in PHP zu optimieren.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ACHTUNG: Mittlerweile ist die Funktionalit\u00e4t direkt im IPSStudio integriert. ACHTUNG:  [&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,6],"tags":[54,4],"class_list":["post-665","post","type-post","status-publish","format-standard","hentry","category-howto","category-skripte","tag-synchronisieren","tag-view"],"_links":{"self":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/665","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=665"}],"version-history":[{"count":13,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/665\/revisions"}],"predecessor-version":[{"id":1837,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=\/wp\/v2\/posts\/665\/revisions\/1837"}],"wp:attachment":[{"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=665"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=665"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ipsview.brownson.at\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=665"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}