VisualHMI-Zeichnung: on _ draw / redraw / drawing API und hierarchisches Zeichnen

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

LUA Zeichnung API vollständige Reihe: Gerade Linie, Rechteck, Halbdurchlässig Rechteck, Kreis, Ellipse, Text, Bilder, Bildschirm / externe Bilder (SD / U-Laufwerk), Screenshots. Der Kernmechanismus ist einon_draw(screen, control)Self-draw - Rückruf auf Steuerebene - alle draw_xxx - Befehle müssen in on _ draw aufgerufen werden, um wirksam zu werden. Gilt für die HMI & M-Serie und die Dx-Serie.

1. Zeichnung API-Zusammenfassung

FunktionParameterBeschreibung
set_pen_color(color)RGB565 - FarbeFestlegen der Pinselfarbe für den Vordergrund, Wirkung auf Linien / Rahmen / Konturen / Textstriche
draw_line(x0,y0,x1,y1,width)Breite 1 - 10Zeichnen Sie eine Linie, die Farbe nimmt den aktuellen Pinsel
draw_rect(x0,y0,x1,y1,fill)fill 1 = Füllung / 0 = RahmenRechteck, x0, y0 links oben, x1, y1 rechts unten
draw_rect_alpha(x0,y0,x1,y1,alpha)Alpha 0 - 255durchsichtige feste Rechteck, 0 = durchsichtige / 255 = undurchsichtige,
draw_circle(x,y,r,fill)fill 0 = solide / Nicht0 = hohl (Linienbreite)Zeichnen Sie einen Kreis, x, y Zentrum, r Radius
draw_ellipse(x0,y0,x1,y1,fill)Beide Ecken des Rechtecks, fillZeichnen Sie eine Ellipse, die in das Rechteck tangentiert ist
draw_image(image_id,frame_id,dstx,dsty,w,h,srcx,srcy)image_id Suche build/image.xml; frame_id AnimationsrahmenZeichnen Sie die Bildressourcen des Projekts, unterstützen Skalierung und Zuschneiden
draw_text(text,x,y,w,h,font_id,size,color,align,charcode)align 0 links / 1 Mitte / 2 rechts; charcode 0 = UTF - 8 / 1 = GBKInnenbereich Zeichnen
load_surface(filename)JPEG / PNG-PfadExterne Bilder laden Rückgabe-Handle (ohne image.bin)
draw_surface(surface,dstx,dsty,w,h,srcx,srcy)Surface-HandleZeichnet geladenes externe Bild, unterstützt Zuschnitt-Skalierung,muss in on_draw eingestellt werden
destroy_surface(surface)HandleFreisetzt einzelne Ebenenressourcen
destroy_all_surface()-Freisetzt alle geladenen Ebenen in Massen
get_surface_size(surface)HandleErhält die ursprüngliche Pixelbreite der Ebenen
clear_image_buffer()-Freigegeben interner Bildressourcen-Cache
screen_shoot(filepath)Vollständiger Pfad mit ErweiterungAktuelles Bild als JPEG

2.

on_draw (screen_id, control_id) ist ein- Systemruf, der nicht direktaufrufen kann. control _ id muss ≠ 0 sein, sonst ist die Funktion unwirksam. Triggerbedingung:

  • Bildschirm mit Animation, Video, RTC und anderen dynamischen Elementen aktualisiert
  • Benutzer Berührung / Manipulation Bildschirmsteuerelemente
  • Skript set_xxx Aktualisierung der Steuereigenschaften
  • Serial Port / LUA Registrierung verursacht eine Änderung des Steuereigensstatus
  • Aktive Aufrufe redraw ()

Multilayer Mechanismus: HMI verwendet die Z-Achse - Reihenfolge der Steuerelemente (Steuerelemente im Editor) als Schichtenverwaltung. on _ draw wird unabhängig von jedem neu zeichnbaren Steuerelement ausgelöst und drückt auf control _ id, um zu bestimmen, auf welche Ebene zeichnet. Beispiel: Das blaue Rechteck ID = 10 zeichnet „Frucht" in der unteren Ebene, das gelbe Rechteck ID = 11 zeichnet „Insel" in der oberen Ebene, wobei das Gelb den blauen Teil bedeckt.

function on_draw(screen_id, control_id)
  if screen_id == 0 and control_id == 1 then
    draw_surface(surface[1], 293, 88, 222, 353, 0, 0)  -- 裁剪显示
  elseif screen_id == 0 and control_id == 2 then
    draw_surface(surface[2], 314, 158, 180, 250, 0, 0)
  end
end

3. Farbe: RGB565

Alle Farbparameter sind 16 - Bit RGB565: hohe 5 - Bit Rot (0 ~ 31), mittlere 6 - Bit Grün (0 ~ 63) und niedrige 5 - Bit Blau (0 ~ 31), Bereich 0x0000 ~ 0xFFFF.

FarbenRGB (888)RGB565Lua-Konstante empfohlen
红(255,0,0)0xF800COLOR_RED = 0xF800
绿(0,255,0)0x07E0COLOR_GREEN = 0x07E0
蓝(0,0,255)0x001FCOLOR_BLUE = 0x001F
白(255,255,255)0xFFFFCOLOR_WHITE = 0xFFFF
黑(0,0,0)0x000000COLOR_BLACK = 0x0000

4 Anwendungsbeispiele: 15 Arten von Zeichnungsschalter

4.1 Engineering Konfiguration

15 Wörter Einstellung Taste voll assoziiert LW6101, Konstante Werte 1 ~ 15 in der Folge entsprechen: Linie / Rechteck / halbe Rechteck / Kreis / Ellipse / BildID / Text / Bildschirm-Bild / Zerstörung Bilder / Zerstörung aller Bilder / Erhalten Bildgröße / Video-Fenster Screenshot / Screenshot / Zeichnen SD-Disk / Zeichnen USB-Bild. 15 - Bit-Status - Anzeige zugeordnet LW6100 Schnitt-Pinsel - Farbe.

4.2 Framework: Mode-Tabelle + Switch-Distribution

penColor = {0xF800, 0x001F}      -- 红、蓝
CUR_COLOR = 0xF800                -- 初始颜色
draw_type = 0                     -- 当前绘制类型

mode = {                          -- 绘制类型表
  line = 1, rect = 2, rect_alpha = 3, circle = 4, ellipse = 5,
  imageId = 6, text = 7, surface_path3 = 8, destroyOne = 9,
  destroyAll = 10, getSurface = 11, videoShoot = 12,
  screenShoot = 13, surface_pathsd = 14, surface_pathusb = 15
}

function on_update(slave, vtype, addr)
  if addr == 0x6100 then
    CUR_COLOR = penColor[get_uint16(VT_LW, addr) + 1]  -- 切画笔
  elseif addr == 0x6101 then
    draw_type = get_uint16(VT_LW, addr)                -- 切绘制类型
  end
  redraw()                                              -- 触发重绘
end

function on_draw(screen_id, control_id)
  set_pen_color(CUR_COLOR)
  local switch = {
    [mode.line] = function(control)                    -- 键值1
      draw_line(225, 253, 405, 253)                    -- 默认宽度1
      draw_line(508, 128, 508, 378, 5)                 -- 宽度5
    end,
    [mode.rect] = function(control)                    -- 键值2
      draw_rect(225, 128, 225+180, 128+250, 0)         -- 不填充
      draw_rect(418, 163, 418+180, 128+180, 1)         -- 填充
    end,
    [mode.rect_alpha] = function(control)              -- 键值3
      draw_rect_alpha(225, 128, 225+180, 128+250, 200) -- 透明度200
      draw_rect_alpha(418, 163, 418+180, 128+180, 230) -- 透明度230
    end,
    [mode.circle] = function(control)                  -- 键值4
      draw_circle(300, 253, 100, 0)                    -- 实心
      draw_circle(450, 253, 150, 1)                    -- 空心(线宽1)
    end,
    [mode.ellipse] = function(control)                 -- 键值5
      draw_ellipse(225, 128, 225+180, 128+250, 0)      -- 实心
      draw_ellipse(418, 163, 418+180, 128+180, 1)      -- 空心
    end,
    [mode.text] = function(control)                    -- 键值7
      draw_text("VisualHMI", 100, 300, 200, 40,
                0, 24, CUR_COLOR, 1, 0)               -- 居中 UTF-8
    end,
  }
  if switch[draw_type] then
    switch[draw_type](control)
  end
end

Externe Bilder (SD / USB-Laufwerk) und Screenshots

-- 加载 SD 卡图片(load_surface 支持 JPEG/PNG)
if draw_type == mode.surface_pathsd then
  surface[1] = load_surface("1:/pic.png")
  redraw()
end

-- on_draw 里绘制
if draw_type == mode.surface_pathsd then
  if surface[1] then
    draw_surface(surface[1], 225, 128, 180, 250, 0, 0)
  end
end

-- 截图到 SD 卡
if draw_type == mode.screenShoot then
  screen_shoot("1:/shot.jpg")
end

Externe Bilder mit load _ surface geladen, die mit load_surface geladen werden, werden nicht in das Projekt image.binEs ist die Laufzeit, aus dem Dateisystem gelesen. Destroy _ surface muss freigegeben werden, sonst wird der Speicher leck; große Bilder oder PNGs mit transparenten Kanälen essen speziell den Speicher.

Fünf Gruben:1draw_xxx muss in einem on_draw-Repage aufgerufen werden, um wirksam zu werdenin on_update reagiert nichts;2 Steuerelement ID ≠ 0Steuerelement 0 löst nicht aus, um sich selbst zu zeichnen;3Draw_circle/draw_ellipse ist im Gegenteil von draw_rect- Kreise und Ellipse 0 = feste, nicht 0 = hohl, Rechteck 1 = Füllung / 0 = Rahmen, nicht verwechseln;4Draw_image ist in build/image.xml, nicht in Dateien;5 Destroy_surfaceExterne Bilder werden ausgeschöpft, HMI-Speicher ist klein, Lecks sind mehr direkt abstürzen.

Aus dem VisualHMI-Entwicklungsdokument von Guangzhou Dacai Technology (hmi-doc.gz-dc.com) LUA-Tutorial "Zeichnen", das Urheberrecht liegt bei Dacai Technology.

Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.