Test: 02_RSS mit alignments

Begonnen von betateilchen, 12 November 2013, 13:29:56

Vorheriges Thema - Nächstes Thema

betateilchen

Ziel: Bilder an einem bestimmten Punkt im RSS-jpg ausrichten, im Beispiel genau in der Mitte (x=0.5,y=0.5)

Layout: (default)


#halign "left" ## default
#valign "top"  ## default
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451335nf.jpg)


Layout:


halign "left"
valign "center"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451336rx.jpg)


Layout:


halign "left"
valign "bottom"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:
(http://up.picr.de/16451342yt.jpg)


Layout:


halign "center"
valign "bottom"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451345ga.jpg)


Layout:


halign "right"
valign "bottom"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451337so.jpg)


Layout:


halign "right"
valign "center"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451346fk.jpg)


Layout:


halign "right"
valign "top"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451352aa.jpg)


Layout:


halign "center"
valign "top"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451353kb.jpg)


Layout:


halign "center"
valign "center"
img .5 .5 1 jpeg file "250jpg.jpg"


Ergebnis:

(http://up.picr.de/16451354hb.jpg)



Weitere Infos folgen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Das Ganze funktioniert genauso auch mit allen Textelementen (text, date, time...) innerhalb eines RSS:

Layout:


line 0 100 1 100
line 0 200 1 200
line 0 300 1 300
line 0 400 1 400
line 0 500 1 500

font /usr/share/fonts/truetype/msttcorefonts/arial.ttf
pt 30
text 100 100 { "this is default alignment" }

valign "top"
text 100 200 { "this is alignment with valign = top" }

valign "center"
text 100 300 { "this is alignment with valign = center" }

valign "base"
text 100 400 { "this is alignment with valign = base" }

valign "bottom"
text 100 500 { "this is alignment with valign = bottom" }


Ergebnis:

(http://up.picr.de/16453198ax.jpg)



Voraussetzungen für die Nutzung von valign und halign mit Textelementen:

Das Perl Modul GD::Text::Align muss nachinstalliert werden!

Auf einem RaspberryPi, einem BeagleBoneBlack oder anderen Debian Installationen am einfachsten mit [/li][/list]
apt-get install libgd-text-perl


  • Auf die Darstellung der halign Möglichkeiten "left","center","right" habe ich hier verzichtet, da eigentlich selbsterklärend
  • 02_RSS prüft, ob das Modul zur Verfügung steht. Fehlt das Modul, kann man die neuen Tags zwar alle im Layout verwenden, aber sie werden bei der Textausgabe einfach ignoriert. Eine Fehlermeldung oder ein Abbruch erfolgt nicht.
  • Die valign Definition "base" kann auch bei img-Einbettungen verwendet werden, dann wird das img quasi auf der Baseline eines danebenstehenden Textes ausgerichtet. Technisch betrachtet gibt es bei img keinen Unterschied zwischen "base" und "bottom"
  • ungültige Angaben bei valign und halign werden ignoriert, die bis zu diesem Punkt definierten Parameter bleiben unverändert (es wird NICHT der Defaultwert verwendet!)


Weitere Informationen folgen...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Und wenn man mal im RSS entscheiden möchte, ob man einen Inhalt überhaupt darstellen will?

Kein Problem, machen wir das Ganze eben conditional:

Layout:


font /usr/share/fonts/truetype/msttcorefonts/arial.ttf
pt 20

condition { ( 1 == 1 ) }
text 100 100 { "Ich werde angezeigt, weil condition WAHR ergibt" }

condition { ( 1 == 2 ) }
text 100 200 { "ich werde NICHT angezeigt, weil condition FALSCH ergibt" }


Ergebnis:

(http://up.picr.de/16453462sg.jpg)

Wie man sieht, wird die zweite Textzeile nicht ausgegeben, weil 1 ungleich 2 ist.

Wichtig:
Alles was in der Layout-Definition nach so einer condition kommt, wird entweder dargestellt oder eben nicht - solange, bis eine neue condition definiert wird! Man sollte also nicht vergessen, eine condition auch wieder zurückzusetzen  8)

Wozu das Ganze?

Anwendungsbeispiel aus einer meiner eigenen RSS-Definition:

vorher:


rgb "FFFFFF"
halign "center"
text .25 410 {if(ReadingsVal("gds","a_valid","")){utf8ToLatin1("gültig von: ".ts2text(ReadingsVal("gds","a_onset","?")))}}
text .75 410 {if(ReadingsVal("gds","a_valid","")){utf8ToLatin1("gültig bis: ".ts2text(ReadingsVal("gds","a_expires","?")))}}
text .50 430 {if(ReadingsVal("gds","a_valid","")){utf8ToLatin1(ReadingsVal("gds","a_headline",""))}}


nachher:


condition { ReadingsVal("gds","a_valid","") }
rgb "FFFFFF"
halign "center"
text .25 410 { utf8ToLatin1("gültig von: ".ts2text(ReadingsVal("gds","a_onset","?")) }
text .75 410 { utf8ToLatin1("gültig bis: ".ts2text(ReadingsVal("gds","a_expires","?")) }
text .50 430 { utf8ToLatin1(ReadingsVal("gds","a_headline","")) }


Ich muss also die if-Abfrage nicht in jedes Element schreiben, sondern nur einmal vor den Block.
Das macht komplexe Layout-Definitionen einfach sehr viel übersichtlicher.



Fortsetzung folgt.... (vielleicht)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Das geänderte Modul geht jetzt erstmal zu Boris zur Prüfung :)

Und die Doku für die commandref fehlt auch noch...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

was mir jetzt eigentlich noch fehlt, ist die Möglichkeit, innerhalb der Layoutdefinition einen Zähler zu führen.

Anwendungsbeispiel:
Ich habe 5 Zeilen mit Statusmeldungen untereinander, alle haben einen Pixelabstand von 20px.
Nun werden die Zeilen 2 und 4 wegen condition = false nicht ausgegeben, dann sollen die Zeilen 3 und 5 nachrücken. Also Zeile 3 an y-Positon(2) und Zeile 5 an y-Position(3)

Muss ich mal intensiv drüber nachdenken...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Hallo,

das Modul ist im SVN und steht morgen zum Update bereit!

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

#6
Die jetzt eingecheckte Version der Änderungen gefällt mir nicht wirklich, aber das muss an anderer Stelle diskutiert werden.




Nächstes Thema...

Zitat von: betateilchen am 14 November 2013, 11:26:32
was mir jetzt eigentlich noch fehlt, ist die Möglichkeit, innerhalb der Layoutdefinition einen Zähler zu führen.

Anwendungsbeispiel:
Ich habe 5 Zeilen mit Statusmeldungen untereinander, alle haben einen Pixelabstand von 20px.
...

Grundsätzlich habe ich das jetzt auch gelöst.


rgb "2E64FE"
text 220 70 { "LR: ".ts2text(ReadingsTimestamp("out_Regen_Sensor", "lastRain","n/a"))}

rgb "FF0000"
condition { ReadingsVal("gds", "a_valid", "") }
ypos +20
text 220  ypos { ">>> DWD Warnung!" }

condition { ( Value("freezeWarning") eq "ja" ) }
ypos +20
text 220  ypos { ">>> Frostgefahr!" }

condition { ( Value("RM_Status") ne "ok" ) }
ypos +20
text 220 ypos { ">>> Rauchmelder!" }

condition { ( Value("batteryWarning") ne "ok" ) }
ypos +20
text 220 ypos { ">>> Batterien!" }


Ich habe aktuell nur noch das Problem, dass ich irgendwie zwei Instanzvariablen (beispielsweise $hash->{helper}{xpos} und $hash->{helper}{ypos}) unterbringen muss und mir das im Modul noch nicht zuverlässig gelungen ist...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 15 November 2013, 22:10:06
Die jetzt eingecheckte Version der Änderungen gefällt mir nicht wirklich, aber das muss an anderer Stelle diskutiert werden.

Ich habe jetzt eine neue Version eingecheckt, bei der es zusätzlich gesonderte Layoutbefehle thalign, ihalign, tvalign, ivalign gibt, die sich nur auf Text bzw. Bild auswirken. halign und valign wirken sich weiterhin auf beides aus und stellen hoffentlich den von Dir gewünschten Zustand her. Kannst Du Dir das bitte mal ansehen?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

ja, schau ich mir an. Obwohl man es überhaupt nicht so kompliziert (mit zusätzlichen Parametern) hätte machen müssen.

Ich habe in meiner Version hier vor Ort einfach noch die Werte "default" für valign und halign zugelassen, damit lassen sich innerhalb des Layouts wieder die "geordneten" Verhältnisse herstellen, ohne dass man weitere Definitionen braucht. Vielleicht wäre das die einfachere Lösung anstatt mit weiteren Parametern arbeiten zu müssen. Durch zu viele weitere Parameter wird doch die ganze Layout-Gestaltung wieder unübersichtlich, ausserdem muss man dann dauernd an vier Parameter denken anstatt nur an zwei.


Übrigens:

Zitatvalign "top"|"center"|"base"|"bottom"
Sets the vertical text and image alignment. Defaults to top-aligned. You can use { <perl special> } instead of the literal alignment control word.

Dieser Ausschnitt aus der commandref stimmt so nicht ganz. Default für Texte ist nicht top-aligned, sondern base-aligned. top-aligned ist nur bei Images der default-Wert. Genau DAS ist ja das Problem, warum ich base auch für Images zulassen wollte.

Und in der commandref fehlt m.E. im Moment auch noch ein Hinweis auf GD:Text:Align - oder ich habe es übersehen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#9
Zitat von: Dr. Boris Neubert am 16 November 2013, 12:32:21Ich habe jetzt eine neue Version eingecheckt, bei der es zusätzlich gesonderte Layoutbefehle thalign, ihalign, tvalign, ivalign gibt, die sich nur auf Text bzw. Bild auswirken. halign und valign wirken sich weiterhin auf beides aus und stellen hoffentlich den von Dir gewünschten Zustand her.

Funktioniert überhaupt nicht!

Weder funktionieren meine bestehenden Layouts mit halign und valign, noch funktionieren neu angelegte Layouts mit ihalign/ivalign/...

Gute Nacht.


font /usr/share/fonts/truetype/msttcorefonts/arial.ttf

#--------------------
# Linien zeichnen
#

rgb { return "7F7F7F"; } # grau
line 0  50 1  50
line 0 220 1 220
line 0 388 1 388

line 200 50 200 220
line 400 50 400 220
line 600 50 600 220

#--------------------
# Kopfzeile
#

pt 24
tvalign "center"
thalign "center"
rgb "FF0000"
text .375 25 { tendenz(Value("out_balkon_alt"), Value("out_balkon_neu")).ReadingsVal("out_Balkon","temperature","n/a "). "°C"  }

thalign "right"
rgb "2E64FE" # blau
text .57 25 { tendenz(Value("out_balkonH_alt"), Value("out_balkonH_neu")).int(ReadingsVal("out_Balkon","humidity","0")). "%"  }

thalign "right"
rgb "00FF00" # grün
text .80 25 { tendenz(Value("pressure_alt"), Value("pressure_neu")).int(ReadingsVal("BMP180","pressure-nn","0")). " hPa"  }

rgb ffffff # weiss
thalign "center"
date 0.125 25
time 0.875 25

condition { ReadingsVal("gds", "a_valid", "") || Value("freezeWarning") eq "ja" || Value("freezeWarning") eq "ja" || Value("RM_Status") ne "ok" || Value("batteryWarning") ne "ok"  }
ihalign "center"
ivalign "center"
img 775 25 1 jpeg file { "/home/udo/alert48.jpg" }


(http://up.picr.de/16490533qm.jpg)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#10
Nachtrag: images scheinen jetzt zu funktionieren, aber Texte stehen immer noch kreuz und quer.



EDIT:
Lösung:
1. Ein einfaches reload 02_RSS in Kombination mit einem anschließenden rereadcfg reicht nicht.
2. nach einem shutdown restart scheinen jetzt auch die Texte korrekt positioniert zu werden.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Problem:


2013.11.16 23:34:02 1: DUALRSS: Illegal command condition in layout definition.
2013.11.16 23:34:02 1: DUALRSS: Illegal command condition in layout definition.
2013.11.16 23:34:03 1: DUALRSS: Illegal command condition in layout definition.


Lösung:


Index: 02_RSS.pm
===================================================================
--- 02_RSS.pm (revision 4232)
+++ 02_RSS.pm (working copy)
@@ -443,6 +443,7 @@
             ($x,$y,$scale,$imgtype,$srctype,$arg)= split("[ \t]+", $def,6);
             my $arg= AnalyzePerlCommand(undef, $arg);
             RSS_itemImg($S,$x,$y,$scale,$imgtype,$srctype,$arg,%params);
+          } elsif($cmd eq 'condition') {
           } else {
             Log3 $name, 1, "$name: Illegal command $cmd in layout definition.";
           }

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Hier noch ein kompletter ad-hoc-Patch, der die zwei neuen Befehle xpos und ypos (siehe weiter oben erklärt) implementiert und diese auch noch per <perl-special> auflösen kann, falls man das irgendwo braucht.

Die Sache mit den beiden Postionsvariablen muss noch anders gelöst werden - aber mir ist noch keine "einfache" Idee eingefallen.
$hash und $name sind momentan überall da, wo ich sie bräuchte, nicht in den betroffenen Funktionen verfügbar.


Index: 02_RSS.pm
===================================================================
--- 02_RSS.pm (revision 4232)
+++ 02_RSS.pm (working copy)
@@ -21,6 +21,8 @@
my @valid_valign = qw(top center base bottom);
my @valid_halign = qw(left center right);

+my ($xpos,$ypos);
+
# we can
# use vars qw(%FW_types);  # device types,
# use vars qw($FW_RET);    # Returned data (html)
@@ -213,8 +215,20 @@
sub
RSS_xy($$$) {
   my ($S,$x,$y)= @_;

+  $x = $xpos if($x eq 'xpos');
+  $y = $ypos if($y eq 'ypos');

+  $x = AnalyzePerlCommand(undef, $x);
+  $y = AnalyzePerlCommand(undef, $y);

   if($x<=1) { $x*= $S->width; }
   if($y<=1) { $y*= $S->height; }

+  $xpos = $x;
+  $ypos = $y;

+  #Debug "xpos: $x - ypos: $y";
   return($x,$y);
}

@@ -405,6 +419,10 @@
             $params{font}= $def;
           } elsif($cmd eq "pt") {
             $params{pt}= $def;
+          } elsif($cmd eq "xpos") {
+            $xpos += $def;
+          } elsif($cmd eq "ypos") {
+            $ypos += $def;
           } elsif($cmd ~~ @cmd_halign) {
                 my $d = AnalyzePerlCommand(undef, $def);
                 if($d ~~ @valid_halign) {
@@ -443,6 +461,7 @@
             ($x,$y,$scale,$imgtype,$srctype,$arg)= split("[ \t]+", $def,6);
             my $arg= AnalyzePerlCommand(undef, $arg);
             RSS_itemImg($S,$x,$y,$scale,$imgtype,$srctype,$arg,%params);
+          } elsif($cmd eq 'condition') {
           } else {
             Log3 $name, 1, "$name: Illegal command $cmd in layout definition.";
           }
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Hallo,

ich habe eine erweiterte Version eingecheckt.

Diese enthält die von Dir vorgeschlagene Möglichkeit zur relativen Positionierung. Die Befehle heißen moveto und moveby (statt xpos,ypos). Erinnert mich an Turtle Graphics. Wo Koordinaten verlangt sind, kann mit literalen x und y auf die zuletzt verwendete Position zugegriffen werden. Zwischengespeichert wird das in %params, da die Informationen ja nur beim Durcharbeiten des Layouts benötigt werden und nicht permanent am Device oder Modul.

Außerdem werden nur Werte zwischen -1 und +1 exklusive als relative Positionierungen erkannt. Damit ist es auch möglich, auf x=1 oder y=1 zu positionieren.

condition liefert kein Gemecker mehr im Log.

Doku ist fit.

Ich hoffe, daß bei Dir damit auch alles läuft.

Mit dem $defs{"theNameOfTheRSSDevice"}{fhem}{counter} im Perl-Special für condition und ein wenig Modulo-Arithmetik kann man bestimmte Elemente übrigens nur jedes x-te Mal anzeigen lassen.

Viele Grüße
Boris

Und
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

Danke, ich schau mir die erweiterte Version heute an.
Muss ich wohl alle meine Layout nochmal ändern und die Befehle umschreiben.

Ist das der gleiche counter, über dessen Sinn im Modul ich mich schon seit Monaten wundere?  8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#15
Zitat von: Dr. Boris Neubert am 17 November 2013, 14:43:09Außerdem werden nur Werte zwischen -1 und +1 exklusive als relative Positionierungen erkannt.
...
Ich hoffe, daß bei Dir damit auch alles läuft.

Durch die Änderung mit der 1 kann man nicht mehr einfach mit 0 und 1 als Positonsangabe eine Linie über die gesamte Höhe/Breite eines Layouts zeichnen. Diese Vereinfachung wurde ja vor kurzem erst eingebaut - schade, dass die nun wieder nicht mehr zur Verfügung steht.




Folgendes funktioniert nicht:


text  30 70 { "Wohnen:" }
text 100 70 { ReadingsVal("wz_FHT","measured-temp", "") }
text 130 70 { "°C  /" }
text 160 70 { nullprozent(ReadingsVal("wz_FHT", "actuator", "")) }

condition { ReadingsVal("ez_S300TH","temperature","") }
moveby 0 20
text  30  y { "Essen:" }
text 100  y { ReadingsVal("ez_S300TH","temperature","") }
text 130  y { "°C" }

condition { ReadingsVal("az_FHT_ClimRT_tr","measured-temp","") }
moveby 0 20
text  30 y { "Arbeiten:" }
text 100 y { ReadingsVal("az_FHT_ClimRT_tr","measured-temp","") }
text 130 y { "°C  /" }
text 160 y { nullprozent(ReadingsVal("az_FHT_ClimRT_tr","ValvePosition","")) }


Nach der Ausgabe des ersten Wertes an der absoluten Positon y=70 steht die gespeicherte Position immer noch auf 0.
Nach dem Ausführen des ersten moveby 0 20 steht die y-Position auf 20 anstatt auf 90.

Meiner Meinung nach sollten nach der Angabe einer absoluten Positionsangabe in einem Item diese Positionsdaten gespeichert werden, um danach einfach mit moveby arbeiten zu können.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 17 November 2013, 16:14:30
Ist das der gleiche counter, über dessen Sinn im Modul ich mich schon seit Monaten wundere?  8)

Der zählt die Aufrufe durch. War ursprünglich zu Debugging-Zwecken gedacht. Habe ich dann dringelassen, falls er mal gebraucht würde  ;)

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Zitat von: betateilchen am 17 November 2013, 16:27:15
Durch die Änderung mit der 1 kann man nicht mehr einfach mit 0 und 1 als Positonsangabe eine Linie über die gesamte Höhe/Breite eines Layouts zeichnen. Diese Vereinfachung wurde ja vor kurzem erst eingebaut - schade, dass die nun wieder nicht mehr zur Verfügung steht.

Ah, verstehe.

Ich hätte von Anfang an syntaktisch zwischen prozentualen und absoluten Koordinaten unterscheiden sollen, z.B. durch text 30% 40% "foo"

Was passiert, wenn Du statt 1 die Zahl 0.9999 nimmst?

Zitat
Folgendes funktioniert nicht:

Nach der Ausgabe des ersten Wertes an der absoluten Positon y=70 steht die gespeicherte Position immer noch auf 0.
Nach dem Ausführen des ersten moveby 0 20 steht die y-Position auf 20 anstatt auf 90.

Meiner Meinung nach sollten nach der Angabe einer absoluten Positionsangabe in einem Item diese Positionsdaten gespeichert werden, um danach einfach mit moveby arbeiten zu können.

Ich hatte das getestet und bei mir hat es funktioniert. Die Position wird in RSS_xy immer gespeichert. Warum funktioniert es bei Dir nicht?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

#18
Zitat von: Dr. Boris Neubert am 17 November 2013, 17:24:17Ich hätte von Anfang an syntaktisch zwischen prozentualen und absoluten Koordinaten unterscheiden sollen, z.B. durch text 30% 40% "foo"

ja, das wäre absolut die beste Lösung.

Zitat von: Dr. Boris Neubert am 17 November 2013, 17:24:17Was passiert, wenn Du statt 1 die Zahl 0.9999 nimmst?

Weiss ich nicht. Ich habe das Linienzeichnen jetzt auf absolute Koordinaten umgestellt, da ICH die Breite des Layouts ja kenne, aber die Layoutdefinition eben nicht.

Zitat von: Dr. Boris Neubert am 17 November 2013, 17:24:17Warum funktioniert es bei Dir nicht?

Kann ich Dir nicht sagen. Das oben angeführte Beispiel aus dem Layout ist original und hat eben nicht funktioniert. Die Zeile mit der absoluten Angabe hat funktioniert, alle anderen wurden vom oberen Bildrand an im Abstand von 20px geschrieben.

Ich habe jetzt in jeder Ausgabegruppe ein einleitendes "moveto" eingefügt, dann funktioniert die Positionierung. Ist zwar umständlich, aber es hilft.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#19
Hallo Boris,

hier ist ein Minimal-Layout, mit dem Du das Verhalten nachstellen kannst.


rgb "FFFFFF"
font arial.ttf
pt 12
text 100 100 { "Text at 100/100 abs" }
moveby 0 20
text x y { "Text at x/y+20 rel" }


erzeugt die falsche Ausgabe:

(http://up.picr.de/16506013co.jpg)



2013.11.18 10:13:03 1: DEBUG>RSS_xy on enter: (x,y)= (100,100)
2013.11.18 10:13:03 1: DEBUG>RSS_xy on exit: (x,y)= (100,100)
2013.11.18 10:13:03 1: DEBUG>RSS_xy on enter: (x,y)= (0,20)
2013.11.18 10:13:03 1: DEBUG>RSS_xy on exit: (x,y)= (0,20)
2013.11.18 10:13:03 1: DEBUG>RSS_xy on enter: (x,y)= (x,y)
2013.11.18 10:13:03 1: DEBUG>RSS_xy on exit: (x,y)= (0,20)



Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

beim zweiten moveby funktioniert dann - ausgehend von den dann falschen "Altkoordinaten" scheinbar alles korrekt:


rgb "FFFFFF"
font arial.ttf
pt 12
text 100 100 { "Text1 at 100/100 abs" }
moveby 0 20
text x y { "Text2 at x/y+20 rel" }
moveby 0 20
text x y { "Text3 at x/y+20 rel" }



2013.11.18 10:16:05 1: DEBUG>RSS_xy on enter: (x,y)= (100,100)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on exit: (x,y)= (100,100)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on enter: (x,y)= (0,20)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on exit: (x,y)= (0,20)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on enter: (x,y)= (x,y)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on exit: (x,y)= (0,20)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on enter: (x,y)= (0,20)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on exit: (x,y)= (0,20)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on enter: (x,y)= (x,y)
2013.11.18 10:16:05 1: DEBUG>RSS_xy on exit: (x,y)= (0,40)


(http://up.picr.de/16506071wf.jpg)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Dr. Boris Neubert am 17 November 2013, 14:43:09Zwischengespeichert wird das in %params,

Verständnisfrage:

sub RSS_xy {
  my ($S,$x,$y,%params)= @_;


wird in moveby aufgerufen mit


            my ($x,$y)= RSS_xy($S, $byx,$byy);


woher nimmt RSS_xy dann eigentlich die %params?


Zitat von: Dr. Boris Neubert am 17 November 2013, 14:43:09condition liefert kein Gemecker mehr im Log.

Dann kannst Du ja diese Zeile

          } elsif($cmd eq 'condition') {

wieder rausnehmen :)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Hallo Boris,

da musst Du wohl nochmal mächtig Hand anlegen :)



Das Speichern der Werte in %params muss zwangsläufig fehlschlagen, da die Werte in %params zwar in verschiedenen Unterprogrammen geändert, aber nicht von allen Unterprogrammen auch wieder als Return Wert an den Aufrufer zurückgegeben werden.

Beispiel für Text:

1. RSS_evalLayout ruft RSS_itemText($S,$x,$y,$txt,%params);

2. RSS_itemText übernimmt %params und ruft ($x,$y)= RSS_xy($S,$x,$y,%params);

3. RSS_xy versucht, Werte in %params zu ändern - gibt aber die neuen Werte nicht an RSS_itemText zürück


Ich habe nun folgendes getestet:

1. Änderung in RSS_itemText


sub
RSS_itemText {
  my ($S,$x,$y,$text,%params)= @_;
  return unless(defined($text));

($x,$y)= RSS_xy($S,$x,$y,%params);
$params{x} = $x;
$params{y} = $y;

if($params{useTextAlign}) {
my $align = GD::Text::Align->new($S,
color  => RSS_color($S, $params{rgb}),
valign => $params{tvalign},
halign => $params{thalign},
);
$align->set_font($params{font}, $params{pt});
$align->set_text($text);
$align->draw($x, $y, 0);
} else {
$S->stringFT(RSS_color($S,$params{rgb}),$params{font},$params{pt},0,$x,$y,$text);
}
return %params;
}


Das Abspeichern der neuen Koordinaten erfolgt nun nach der Berechnung durch RSS_xy, denn danach habe ich immer absolute Koordinaten.


2. Änderung in RSS_evalLayout


          } elsif($cmd eq "text") {
            ($x,$y,$text)= split("[ \t]+", $def, 3);
            my $txt= AnalyzePerlCommand(undef, $text);
            #Debug "$name: ($x,$y) $txt";
            %params = RSS_itemText($S,$x,$y,$txt,%params);


Die neuen Werte in %params werden als Rückgabewert von RSS_itemText übernommen.

Damit bekomme ich nun - ZUMINDEST FÜR TEXTE - die korrekte Ausgabe im RSS:

(http://up.picr.de/16517587ms.jpg)


Die einfachste Lösung wäre meines Erachtens, %params instanzweit verfügbar zu machen, dann kann man sich jede Über- und Rückgabe komplett sparen.


Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Mit den Textutils, die man für das Align braucht, werden auch Tools für das Text-Wrapping innerhalb von GD Objekten mitgeliefert. Also warum die nicht nutzen? Fügen wir der Layout-Evaluierung doch einfach das neue Kommando textbox hinzu, dann können auch längere Texte innerhalb eines RSS vernünftig formatiert dargestellt werden.

Draufgekommen bin ich, weil es heute sehr viele Wetterwarnungen mit viel Text gibt und ich diese Texte irgendwie auf meinem Kontrolldisplay (7" Tablet) in einem eigenen RSS lesbar präsentieren wollte.


          } elsif($cmd eq "textbox") {
            ($x,$y,$text)= split("[ \t]+", $def, 3);
            my $txt= AnalyzePerlCommand(undef, $text);
            #Debug "$name: ($x,$y) $txt";
            RSS_itemTextBox($S,$x,$y,$txt,%params);

sub RSS_itemTextBox {
my ($S,$x,$y,$text,%params)= @_;
return unless(defined($text));

($x,$y)= RSS_xy($S,$x,$y,%params);
my $wrapbox = GD::Text::Wrap->new($S,
color  => RSS_color($S, $params{rgb}),
line_space => 4,
text => $text,
);
$wrapbox->set_font($params{font}, $params{pt});
$wrapbox->set(valign => 'base', halign => 'justify', width => 780);
$wrapbox->draw($x, $y);
}

-----

in der Layoutdefinition:

condition 1
thalign "left"
tvalign "base"
pt 14

text 10  70 {utf8ToLatin1("Wetterwarnug für die Region: ".ReadingsVal('gds','a_areaDesc',''))}
text 10  90 {utf8ToLatin1("gültig von: ".ts2text(ReadingsVal('gds','a_onset',''))." bis: ".ts2text(ReadingsVal('gds','a_expires','')))}
text 10 0.9 {utf8ToLatin1(ReadingsVal('gds','_dataSource','').", ausgegeben am ".ts2text(ReadingsVal('gds','a_sent','')))}

textbox 10 150 {utf8ToLatin1(ReadingsVal('gds','a_description',''))}
textbox 10 250 {utf8ToLatin1(ReadingsVal('gds','a_instruction',''))}


Als Ergebnis erhält man in etwa sowas:

(http://up.picr.de/16663048pd.jpg)

Das Ganze ist derzeit noch sehr simpel implementiert. Aber solange die Sache mit den Positonsberechnungen noch nicht endgültig gelöst ist (ich habe ja die Hoffnung noch nicht aufgegeben, dass Boris das noch auf seiner ToDo-Liste hat...) lohnt sich der Aufwand kaum, das jetzt vollständig einzubauen, weil einiges noch nicht funktionieren würde (z.B. automatische Positionierung mehrere Absätze untereinander).
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 19 November 2013, 15:36:38
Die einfachste Lösung wäre meines Erachtens, %params instanzweit verfügbar zu machen, dann kann man sich jede Über- und Rückgabe komplett sparen.

Die m.E. beste Lösung ist es, Referenzen auf %params zu übergeben. Ich habe es aber lieber stupide gelöst, siehe bitte unten.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Hallo,

ich habe neue Kommandos
textbox x y width text 
linespace sp


eingebaut (Achtung, andere Syntax als obenstehend!). Die Textboxen schieben den Cursor in y-Richtung bis hinter die Textbox weiter.

Anbei die neue Fassung. Wenn sie funktioniert, checke ich sie morgen abend ein.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

#26
Zitat von: Dr. Boris Neubert am 07 Dezember 2013, 22:23:24
Die m.E. beste Lösung ist es, Referenzen auf %params zu übergeben. Ich habe es aber lieber stupide gelöst, siehe bitte unten.

was soll ich bitte wo unten sehen?

Zitattextbox x y width text 
linespace sp

Hätte man das linespace nicht einfach mit in die textbox Zeile aufnehmen können, um nicht immer zwei Zeilen in das Layout schreiben zu müssen? Die width wird doch auch direkt beim Aufruf mit übergeben.

textbox x y width sp text 
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

achso... jetzt weiss ich, was Du mit "unten" meintest *gröhl* Mit "unten" und "oben" sollte man als Bezugsangaben für Beiträge vorsichtig sein, denn nicht jeder Benutzer hat die Anzeige der Beiträge chronologisch von oben nach unten. Bei mir stehen immer die neuesten Beiträge in einem Thread oben, damit ich nicht immer ewig auf dem Laptop scrollen muss. Dein "unten" ist bei mir also eigentlich ein "oben".

Deine Testversion werde ich morgen ausprobieren.

Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Erste Testergebnisse:

1. das Text-align innerhalb der textbox sollte aus thalign übernommen werden, die möglichen Werte sollten um "justified" ergänzt werden.

2. die Alignments halign und valign funktionieren für Images nicht mehr korrekt. Images werden rechtsbündig eingebunden, obwohl "center" vorgegeben ist.

(http://up.picr.de/16686519ei.jpg)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Hallo Boris,

kannst Du bitte prüfen, ob es für img nicht so aussehen müsste:


          }  elsif($cmd eq "img") {
            ($x,$y,$scale,$imgtype,$srctype,$arg)= split("[ \t]+", $def,6);
++           ($x,$y)= RSS_xy($S, $x,$y,%params);
++           $params{x} = $x;
++           $params{y} = $y;
            my $arg= AnalyzePerlCommand(undef, $arg);
            RSS_itemImg($S,$x,$y,$scale,$imgtype,$srctype,$arg,%params);


Nachdem nun meine eingebundenen Images wieder funktionieren, werde ich als nächstes die neue textbox-Funktionalität testen.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Hallo Boris,

ich habe die textbox jetzt getestet und folgende Vorschläge (wie schon weiter oben erwähnt)

1. das text-align wird aus $params{thalign} übernommen (man kann ja auch irgendwann anders als im Blocksatz darstellen wollen!)

2. das linespacing wird aus der textbox-Definition übernommen und nicht aus einem eigenen $params{}. Da dieser Parameter nur innerhalb der textbox vorkommt, sollte er auch direkt dort mit angegeben werden (die $boxwidth ist ja auch kein eigenes Kommando)

Der Aufruf einer textbox würde damit so aussehen:

thalign "justified"
textbox 10 150 380 4 { "bla bla bla" }


Das funktioniert bei mir im Moment alles problemlos.

Ob die genaue Positionierung aller Elemente nach Deiner diesbezüglichen Änderungen funktioniert, habe ich noch nicht vollständig getestet. Aber soweit ich das jetzt getestet habe, sieht es ganz gut aus.


my @valid_halign = qw(left center right justified);

...

sub
RSS_itemTextBox {
#        my ($S,$x,$y,$boxwidth,$text,%params)= @_;
        my ($S,$x,$y,$boxwidth,$sp,$text,%params)= @_;
        return unless(defined($text));
       
        if($params{useTextWrap}) {
              if((0 < $boxwidth) && ($boxwidth < 1)) { $boxwidth*= $S->width; }
              my $wrapbox = GD::Text::Wrap->new($S,
                      color  => RSS_color($S, $params{rgb}),
#                      line_space => $params{linespace},
                      line_space => $sp,
                      text => $text,
                      );
              $wrapbox->set_font($params{font}, $params{pt});
#              $wrapbox->set(align => 'justified', width => $boxwidth);
              $wrapbox->set(align => $params{thalign}, width => $boxwidth);
              my ($left, $top, $right, $bottom) = $wrapbox->draw($x, $y);
              return $bottom;
        } else {
              RSS_itemText($S,$x,$y,$text,%params);
              return $y;
        }
}

...

          } elsif($cmd eq "textbox") {
            ($x,$y,$boxwidth,$sp,$text)= split("[ \t]+", $def, 5);
            ($x,$y)= RSS_xy($S, $x,$y,%params);
            my $txt= AnalyzePerlCommand(undef, $text);
            #Debug "$name: ($x,$y) $txt";
            $y= RSS_itemTextBox($S,$x,$y,$boxwidth,$sp,$txt,%params);
            $params{x} = $x;
            $params{y} = $y;



Viele Grüße
Udo
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 09 Dezember 2013, 21:29:51


          }  elsif($cmd eq "img") {
            ($x,$y,$scale,$imgtype,$srctype,$arg)= split("[ \t]+", $def,6);
++           ($x,$y)= RSS_xy($S, $x,$y,%params);
++           $params{x} = $x;
++           $params{y} = $y;
            my $arg= AnalyzePerlCommand(undef, $arg);
            RSS_itemImg($S,$x,$y,$scale,$imgtype,$srctype,$arg,%params);


Ich hatte das Vorschieben des Cursors bei Bildern absichtlich ausgelassen.

Nachdem ich nun nochmal darüber nachgedacht habe, werde ich es einbauen.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Hallo Udo,

ich kümmere mich am Wochenende darum. Jetzt bin ich erstmal weg.

Das linespacing hat default 0 (wie es mir gefällt). Ob es ins textbox-Kommando kommt oder ein extra Kommando, ist m.E. im Moment noch Geschmacksache. Und dann tendiere ich eher dazu, es so zu belassen, wie es implementiert und dokumentiert ist.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

#33
Zitat von: Dr. Boris Neubert am 09 Dezember 2013, 23:00:50Das linespacing hat default 0 (wie es mir gefällt). Ob es ins textbox-Kommando kommt oder ein extra Kommando, ist m.E. im Moment noch Geschmacksache. Und dann tendiere ich eher dazu, es so zu belassen, wie es implementiert und dokumentiert ist.

Meine Tendenz ist eher umgekehrt. Ich fände es sehr viel logischer, das linespacing in der textbox Definition anzugeben. Wie schon gesagt: Es ist ein Parameter, der ausschließlich in der textbox relevant ist (im Gegensatz zu rgb oder pt, wo es durchaus Sinn macht, den Parameter abzuspeichern, da er von mehreren Elementen benutzt wird) Eine 0 kann man ja immer noch in der textbox Anweisung mitgeben, wenn man die unbedingt haben möchte.

Zitat von: Dr. Boris Neubert am 09 Dezember 2013, 22:57:30
Ich hatte das Vorschieben des Cursors bei Bildern absichtlich ausgelassen.

Nachdem ich nun nochmal darüber nachgedacht habe, werde ich es einbauen.

Es geht nicht um das Vorschieben des Cursors und auch nicht um Nachdenken *g* sondern einfach darum, dass es ohne die aufgezeigte Änderung (zumindest ohne die erste der drei Zeilen) schlichtweg nicht mehr funktioniert!

Wenn Du nämlich ein "halign center" vorgibst und dann ein "img 0.5 300 ..." definierst, wird die halbe Bildbreite von 0.5 abgezogen und dann z.B. bei einem Plot mit (x=-399.5 y=300) anstatt (x=400 y=300)gearbeitet, weil das Auflösen der 0.5 in eine absolute Position komplett fehlte. Das sah bei meinen ersten Tests optisch zwar aus wie rechtsbündig, war es aber nicht, wie das Debuggen letztendlich zeigte.

Ob man die zweite und dritte Zeile braucht, kann man diskutieren. Aber die erste Zeile muss auf jeden Fall rein.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#34
Zitat von: Dr. Boris Neubert am 09 Dezember 2013, 23:00:50Das linespacing hat default 0 (wie es mir gefällt). Ob es ins textbox-Kommando kommt oder ein extra Kommando, ist m.E. im Moment noch Geschmacksache.

Nur mal noch so der Hinweis, wenn es um "default" geht: Wenn ich in einen RSS ein img einbinde, das ich NICHT skalieren möchte, muss ich den Skalierungsfaktor 1 trotzdem mit angeben. Genau die gleiche "Geschmacksfrage" - Du scheinst irgendwie einen sehr schwankenden Geschmack zu haben... :)

Ich persönlich bevorzuge lieber Einheitlichkeit, um nicht bei jedem tag in der Layoutdatei überlegen zu müssen, wo ich nun welchen Wert angeben muss. Ein Grund mehr, der für mich dafür spricht, das linespacing in die textbox-Angabe zu packen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Zitat von: betateilchen am 09 Dezember 2013, 21:29:51

          }  elsif($cmd eq "img") {
            ($x,$y,$scale,$imgtype,$srctype,$arg)= split("[ \t]+", $def,6);
++           ($x,$y)= RSS_xy($S, $x,$y,%params);
++           $params{x} = $x;
++           $params{y} = $y;
            my $arg= AnalyzePerlCommand(undef, $arg);
            RSS_itemImg($S,$x,$y,$scale,$imgtype,$srctype,$arg,%params);


Eingecheckt.
bn
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Zitat von: betateilchen am 09 Dezember 2013, 22:00:39
1. das text-align wird aus $params{thalign} übernommen (man kann ja auch irgendwann anders als im Blocksatz darstellen wollen!)

Eingecheckt!
bn
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

betateilchen

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!