Schritt-für-Schritt & Checkliste (GUI)
Schritt für Schritt
- Ziel festlegen: Welches System/Element, welche Werte, welche Kachelgrößen (504, 508, 1004, 1008, Vollansicht)?
- Datenquellen klären:
$.CTRLVAR.<var>(Element),$.CTRLROOTVAR.<pfad>,$.VAL.<alias>(vorher$.ISVAL) oder Items der eigenen Geräte-DDF. Nicht mehr:$.VARLOCAL/$.VARGLOBAL/$.VARMAIN. -
DDF-Gerüst anlegen:
*GENERAL ;DEVICE;<Widgetname> ;MANUFACTURER;myGEKKO ;TYPE;Graphical user interface ;PROTOCOL;SVG (DDF) ;VERSION_NR;1 ;MODEL_NR;1 ;ID;0x110000XX00010100 ;MIN_CONTROL_VERSION;V10384-11 *GROUP;ID;ALIAS;NAME ;0;MYWIDGET;Mein Widget *OBJECT;GROUP;ID;ALIAS;SVG;SVGANIMATE;SVGEVENT ;0;0;Widget;"<svg alias='Main' viewBox='0 0 200 100' width='200' height='100'>…</svg>";"…";"…" -
Vorlage(n) zeichnen im Koordinatensystem der
viewBox. Nur die unterstützten Elemente verwenden, einfache Hochkommas, Platzhalter$(KEY). - Zeichenformel schreiben: Eingänge lesen → Werte mit
PRINTformatieren →SWITCH $.GUI.WIDGETTYPE→GUI.setWindow→GUI.paintSVG('Main',x,y,w,h,0,'KEY',wert,…);. - Optional Ereignisse:
SVGEVENTmit$.MOUSE.*,$.MOUSE.HANDLEDsetzen, Werte per$.CTRLVAR.x := …;schreiben. - Optional Animation:
GUI.setTimer(0.5);am Ende der Zeichenformel. - Testen in allen Kachelgrößen sowie in hellem und dunklem Theme (
$.GUI.COLOR*).
Minimal-Widget (vollständig)
*GENERAL
;DEVICE;Mini Thermometer
;MANUFACTURER;myGEKKO
;TYPE;Graphical user interface
;PROTOCOL;SVG (DDF)
;VERSION_NR;1
;MODEL_NR;1
;ID;0x110000XX00020100
*GROUP;ID;ALIAS;NAME
;0;DEMO;Demo
*OBJECT;GROUP;ID;ALIAS;SVG;SVGANIMATE;SVGEVENT
;0;0;Thermo;"<svg alias='T' viewBox='0 0 200 100' width='200' height='100'>
<style>
.bg { fill: #0c1a32 }
.val { fill: #ffffff; font-weight: 600 }
</style>
<rect class='bg' x='0' y='0' width='200' height='100' rx='6' ry='6'/>
<rect x='10' y='70' width='180' height='8' rx='4' ry='4' fill='#1c2f4e'/>
<rect x='10' y='70' width='$(BAR)' height='8' rx='4' ry='4' fill='$(COL)'/>
<text class='val' x='100' y='55' font-size='28' text-anchor='middle'>$(TEMP) °C</text>
</svg>";"t := $.CTRLVAR.rgstate[0];
bar := (t+20)/60*180;
IF bar < 0 THEN
bar := 0;
ENDIF;
IF bar > 180 THEN
bar := 180;
ENDIF;
col := '#2DB42D';
IF t > 30 THEN
col := '#C00000';
ENDIF;
GUI.setWindow(0,0,200,100,1.0);
stemp := PRINT(FLOAT,'%.1f',t);
sbar := PRINT(FLOAT,'%.1f',bar);
GUI.paintSVG('T',0,0,200,100,0,'TEMP',stemp,'BAR',sbar,'COL',col);";"$.MOUSE.HANDLED:=0;"
Note
Das Beispiel ist aus der dokumentierten Syntax konstruiert. Die Datenquelle $.CTRLVAR.rgstate[0] setzt voraus, dass das Widget an einem Element mit dieser Variable hängt. Ob Funktionsaufrufe wie PRINT(…) direkt als Argument von GUI.paintSVG ausgewertet werden, ist nicht eindeutig belegt (zu klären). Deshalb werden die Werte hier vorher Variablen zugewiesen.
Checkliste
- [ ]
PROTOCOL=SVG (DDF)(bzw. Geräte-DDF mit*OBJECT) - [ ] jede Vorlage hat
alias=im<svg>-Tag und eineviewBox - [ ] nur unterstützte Elemente/Attribute, kein
transformaußerrotate(a cx cy) - [ ] keine doppelten Anführungszeichen im SVG (CSV-Feldgrenze)
- [ ] Platzhalter
$(KEY)↔ Paare inpaintSVGvollständig, Werte als String - [ ]
paintSVG/paintSvgLibmit mindestens 7 Parametern - [ ]
GUI.setWindowvor dem Zeichnen, passend zur Kachel - [ ] alle Kachelgrößen (
WIDGETTYPE) und die Vollansicht abgedeckt - [ ] Farben mit Alpha
0xFF…, wennfillSvgPathDverwendet wird - [ ]
SVGEVENTsetzt$.MOUSE.HANDLEDeindeutig - [ ] Theme-Farben aus
$.GUI.COLOR*statt fester Farben, wo sinnvoll