Test: 02_RSS mit alignments

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

Vorheriges Thema - Nächstes Thema

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!