LL27: svg und Versionshinweis

Hallo,

ich habe gerade frisch LL27 installiert, um das SVG Feature anzuschauen.

Dazu zwei Anmerkungen:

  1. Was ist am SVG Code falsch? In SVG Editoren wird es korrekt dargestellt
  2. In früheren LL Versionen kann immer die Warnung: “… wurde mit älterer Version erstellt. Nach dem Speicher kann es nicht mehr mit der alten Version geöffnet werden…” Ist das bewusst weg?
    a) Ich habe mit STRG+Umschalt+F12 die Version überprüft, es ist Version : 27.0.2021.29216 (21-10-13 16:44)F

MfG

Nikolaus Kern

Sehr geehrter Herr Kern,

wenn Sie Ihre SVG Dateien, mit der Funktion Drawing('<SVGCode>') innerhalb einer Spalte vom Typ Bild hinzufügen, sollten die SVG Dateien, ohne Probleme angezeigt werden können. Sollte dies nicht funktionieren, würden wir Sie bitten, uns Ihr Projekt bereitzustellen.

Die Warnmeldung erscheint nur dann, wenn wir am Dateiformat gravierende Änderungen vornehmen müssen, welche die Kompatibilität mit alten Versionen bricht. Dazu wird intern die Dateiversion hochgezählt. Sofern dies nicht der Fall ist, erfolgt keine Warnmeldung.

Mit freundlichen Grüßen aus Konstanz

Guten Morgen,

mit Projekt meinen Sie das *.lst File oder etwas anderes? Den Typ “Bild” habe ich nicht explizit ausgewählt, er wurde automatisch gesetzt.

Den untenstehenden SVG Code kann ich mit mehreren Tools z.B. https://editor.method.ac/ problemlos zeichnen.

L

MfG

Nikolaus Kern

Guten Morgen Herr Kern,

mit dem Projekt war die .lst Datei gemeint, richtig.

Kann es möglicherweise sein, dass Sie das Verhalten mit der Beta Version getestet haben? Wir würden Sie bitten dies einmal zu überprüfen, da wir mit der Release Version Ihren SVG Code, ohne Probleme darstellen können. Zur besseren Veranschaulichung haben wir Ihnen auch unser Sample bereitgestellt, welches Sie mit der mitgelieferten Beispielanwendung öffnen können:

Artikelliste mit Bildern und SVG Beispiel.lst (73.0 KB)

Mit freundlichen Grüßen aus Konstanz

Hallo,

die Beta Version LL27 hatte ich gar nicht installiert. lst im Anhang.

MfG

Nikolaus Kern

R22.lst (48.8 KB)

Hallo Herr Kern,

danke für das Anhängen der .LST Datei. Wir haben Ihnen in unserer vorherigen Nachricht ein Beispiel angehängt. Wird denn dort das SVG, ordnungsgemäß wiedergegeben?

Dann würde das bedeuten, dass kein genereller Fehler vorliegt und vermutlich der Wert in Ihrer Datenquelle nicht Ordnungesgemäß hinterlegt ist oder dieser wird als falscher Datentyp, an List & Label übergeben.

Dies können Sie auch mit unserem Debugger Tool “Debwin4” prüfen.

Gerne können Sie in unserem Supportportal unter https://www.combit.net/supportportal/ sonst auch einen Support-Case eröffnen und uns Ihre Datenquelle zukommen lassen. Bitte kopieren Sie dabei die relevanten Informationen aus diesem Thread in die Beschreibung.

Mit freundlichen Grüßen

Hallo,

der konstante String funktioniert. Die von mir erzeugen string funktionieren auch als statischer Text.

Wenn ich den vorbereiteten String aus dem Programm übergebe, habe ich die Anführungszeichen wie unten escaped:

const string svg = @“'<svg xmlns=”“SVG namespace”“><circle cx=”“40"” cy=““40"” r=”“40"” fill=“”#{0}“”/><text x=““40"” y=”“40"” fill=““Black”” font-size=““20px”” text-anchor=““middle”” alignment-baseline=““central”” dy=““0.5em”” font-family=““Arial””>{1}'";

var kürzel = “TE”;
var hex = ColorHelper.FromRGB2Hex(farbe.R, farbe.G, farbe.B);
var kugerl = string.Format(svg, hex, kürzel);

Die Variable kugerl wird in ein string Property geschrieben und kommt auch im LL Report an.

Liegt das Problem beim Escapen?

MfG

Nikolaus Kern

Nachtrag:

Diese Meldung kommt pro SVG string: WRN: cannot read/interpret ‘’ - file exists? Es wirkt so, als ob Drawing() nach einem File sucht.

Debwin4::CSV::V1;TypeCode;Timestamp;Level;Logger;Thread;Properties;Message
:black_small_square:;1000;26.10.2021 14:54:06.107;3;LL.Generic;5784;100:2=CXLL27​:diamonds:101:1=3; WRN: cannot read/interpret ‘’ - file exists? 1 (attr: 00000016): Der Vorgang wurde erfolgreich beendet. (00000000)
:black_small_square:;1000;26.10.2021 14:54:06.107;1;LL.ObjectStates;5784;100:2=CXLL27​:diamonds:101:1=3; <OBJSTATE(BODY:Drawing(KategorieLegende.SVGKugerl)): FINISHED (API: unfinished=0, has_data_to_print=0)
:black_small_square:;1000;26.10.2021 14:54:06.107;1;LL.DataProvider;5784;100:2=CXLL27​:diamonds:101:1=3; >DataProvider((KategorieLegende [000001641FEFA920]))::NextRecord()
:black_small_square:;1000;26.10.2021 14:54:06.107;1;LL.DataProvider;5784;100:2=CXLL27​:diamonds:101:1=3; >DataProvider((KategorieLegende [000001641FEFA920]))::Skip()
:black_small_square:;1000;26.10.2021 14:54:06.107;1;LL.DataProvider;5784;100:2=CXLL27​:diamonds:101:1=3; <DataProvider((KategorieLegende [000001641FEFA920]))::Skip() → OK
:black_small_square:;1000;26.10.2021 14:54:06.108;1;LL.DataProvider;5784;100:2=CXLL27​:diamonds:101:1=3; >DataProvider((KategorieLegende [000001641FEFA920]))::DefineRow() [master=0]
:black_small_square:;1000;26.10.2021 14:54:06.108;1;LL.Generic;5784;100:2=CXLL27​:diamonds:101:1=3; FIELD LIST: ‘KategorieLegende.Kategorie’
:black_small_square:;1000;26.10.2021 14:54:06.108;1;LL.DataProvider;5784;100:2=CXLL27​:diamonds:101:1=3; DATAPROVIDER: QUERY_COLUMNS:
:black_small_square:;1000;26.10.2021 14:54:06.108;1;LL.DataProvider;5784;100:2=CXLL27​:diamonds:101:1=3; table: KategorieLegende, mode ROWMODE_ALL_COLUMNS, ROWMODE_DATA_PRINT_REALDATA, ROWMODE_FIELD
:black_small_square:;1000;26.10.2021 14:54:06.108;2;LL.API;5784;100:2=CXLL27​:diamonds:101:1=3; >LlDefineFieldExt(3,‘KategorieLegende.Kategorie’,‘Messtechnik’,0x10000000,0000000000000000)
:black_small_square:;1000;26.10.2021 14:54:06.108;2;LL.API;5784;100:2=CXLL27​:diamonds:101:1=3; <LlDefineFieldExt() → 0 (0x00000000)
:black_small_square:;1000;26.10.2021 14:54:06.108;2;LL.API;5784;100:2=CXLL27​:diamonds:101:1=3; >LlDefineFieldExt(3,‘KategorieLegende.SVGKugerl’,’‘M’’,0x10000000,0000000000000000)
:black_small_square:;1000;26.10.2021 14:54:06.108;2;LL.API;5784;100:2=CXLL27​:diamonds:101:1=3; <LlDefineFieldExt() → 0 (0x00000000)

Guten Abend Herr Kern,

wir haben versucht, das Verhalten nachzustellen. Wie Sie bereits richtig vermutet haben, ist das Problem, dass Sie einzelne Anführungszeichen in Ihrem C# Quellcode nicht richtig “escaped” haben.

Dadurch wurden in List & Label teilweise Anführungszeichen doppelt oder teilweise auch gar nicht übergeben. Alle möglichen Escape Sequenzen finden Sie auf der Website von Microsoft:

Teilweise waren auch Leerzeichen in den einzelnen SVG Attributen vorhanden. Diese Eigenschaften konnten dann nicht richtig geparst werden.

Wir haben Ihren Beispielcode korrigiert und auch in Form eines C# Projekts angehängt.

Eine korrekte Initisialisíerung einer SVG Variable, zur Verwendung in List & Label würde zum Beispiel wie folgt aussehen:

string svg = @"<svg xmlns=""http://www.w3.org/2000/svg""><circle cx=""40"" cy=""40"" r=""40"" fill=""#FFFF00""/><text x=""40"" y=""40"" fill=""Black"" font-size=""20px"" text-anchor=""middle"" alignment-baseline=""central"" dy=""0.5em"" font-family=""Arial"">BLA</text></svg>";

svgsample.ll (578.2 KB) (Bitte Dateiendung in .zip umbenennen)

Mit freundlichen Grüßen

Sehr geehrter Herr Litkin,

jetzt sind wir durch - es passt.

Zwei Anmerkungen dazu:

  1. Die Leerzeichen habe ich nicht wahrgenommen, als Fehlerquelle kenne ich sie jetzt. Die von mir verwendeten Escape Sequenzen haben meiner Ansicht nach schon gepasst. Das einfache Hochkomma am Anfang und am Schluss war falsch
  2. Dazu die LL Doku zum LL27 Update:
    Die Designer-Funktion Drawing() unterstützt jetzt direkten SVG-Input (z.B. Dra- wing('<svg height="100" width="100"><circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" /></svg>') ).
    → Hier sind die einfachen Anführungszeichen enthalten. Ich habe sie übernommen in der Vermutung, dass damit SVG und Files auseinandergehalten werden.

Auf jeden Fall danke für den Support!

MfG

Nikolaus Kern

1 Like

Hallo,

noch eine Frage zur Qualität bzw. Auflösung: Bei mir schaut das jetzt so aus:

Das ist der SVG string: string svg = @"<circle cx="“25"” cy="“25"” r="“25"” fill=""#{0}""/><text x="“25"” y="“25"” fill=""{1}"" font-size="“20px”" text-anchor="“middle”" alignment-baseline="“central”" dy="“0.25em”" font-family="“Arial”">{2}";

So wird er dann konkret ausgefüllt:
var farbe = ColorHelper.FromInt32RedGreenBlue(kat.Red, kat.Green, kat.Blue);
string schriftfarbe = (ColorHelper.GetFontColor(farbe) == Brushes.White) ? “White” : “Black”;
this._kategorien.Add(new KategorieLegende(kat.ConfigKey, string.Format(svg, ColorHelper.FromRGB2Hex(kat.Red, kat.Green, kat.Blue), schriftfarbe, kat.ConfigString)));

In einem anderen Posting war von Width und Height im SVG die Rede. Muss/Soll ich die Größe des Kreises nicht absolut festlegen?

MfG

Nikolaus Kern

Guten Morgen Herr Kern,

wenn Sie die Auflösung erhöhen möchten, müssen Sie lediglich die Auflösung in Ihrem Code anpassen. Wenn Sie die Auflösung beispielsweise auf 2500px herraufsetzen, so wird das generierte SVG auch entsprechend scharf gerendert.

string svg = @"<svg xmlns=""http://www.w3.org/2000/svg""><circle cx=""2500"" cy=""2500"" r=""2500"" fill=""#FFFF00""/><text x=""2500"" y=""2500"" fill=""black""   font-size=""2500px"" text-anchor=""middle"" alignment-baseline=""central"" dy=""0.25em"" font-family=""Arial"">M</text></svg>";

Mit freundlichen Grüßen aus Konstanz

Sg. Herr Litikin,

danke für Ihre Rückmeldung, die mich allerdings in meinem bisherigen Verständnis von SVG als Vektorformat stark verunsichert hat. Auflösung und Vektorformat bringe ich gedanklich nicht unter einen Hut.

Wenn ich den oben angeführten svg string mit 2500 etc. verwenden, dauert das Laden und Anzeigen ca. 5-10 so lange.

Ich habe dann mit der Größe experimentiert. Möglicherweise war die Größe 25 zum Dividieren und Skalieren von mir unglücklich gewählt. Ich habe es jetzt auf 100 umgestellt und es passt.

>FT

MfG

Nikolaus Kern