# draw

### Funkce

Zobrazení vektorové kresby složené ze základních geometrických prvků (přímek, elips, obdélníků apod.). Rozměry jednotlivých prvků mohou být svázány s výrazy a mohou se tedy s časem měnit. Přístroj draw dokáže animovat zobrazení, která není možno realizovat standardními přístroji.

### Syntax

      draw draw_name
        rem = string;
        bubble = string;
        timer = timer_name;
        owner = owner_name;
        position = integer, integer, integer, integer;
        win_disable = [ identifier, . . . ];
        win_title = string;
        color = color;
        transparent;
        zoomable;
        draw_size = integer, integer;
        drawing
          DRAWING_BLOCK;
        end_drawing;
      end_draw;

####

DRAWING_BLOCK

Je složen z definic nastavení barev a dalších parametrů zobrazení PARAM_BLOCK a grafických objektů DRAW_BLOCK. Barevné nastavení platí vždy pro všechny objekty uvedené v pořadí za ním.

####

      PARAM_BLOCK -> e
      | ink COLOR_REF;
      | solid_paper COLOR_REF;
      | pattern_paper COLOR_REF : COLOR_REF : fill_identifier;
      | textcolor COLOR_REF;
      | shade COLOR_REF : COLOR_REF;
      | fill FILL_REF;
      | pen_width integer;
      | pen_style pen_line_style;

      COLOR_REF -> color CHANGE_BLOCK
      CHANGE_BLOCK -> e | change_color COLOR_LIST end
      COLOR_LIST -> e | CHANGE_COLOR COLOR_LIST
      CHANGE_COLOR -> boolean_expression , color;

####

      DRAW_BLOCK
        text {name} - řetězec znaků
        line {name} - úsečka
        polyline {name} - několik spojených úseček
        polygon {name} - mnohoúhelník
        box {name} - obdélník
        frame {name} - stínovaný obdélník
        roundbox {name} - zakulacený obdélník
        ellipse {name} - elipsa
        ring {name} - eliptický prstenec
        arc {name} - oblouk
        pie {name} - oblouk s výplní

### Specifické parametry přístroje

- color
  Barva pozadí přístroje draw.
- transparent
  Pokud je uvedeno toto klíčové slovo, přístroj bude průhledný.
- zoomable
  Pokud je uvedeno toto klíčové slovo, přístroj přizpůsobuje velikosti objektů v poměru zobrazení a skutečné velikosti.
- draw_size
  Udává skutečné rozměry kresby.
- drawing
  Klíčové slovo uvozující popis zobrazované scény přístroje.

####

- PARAM_BLOCK
  Každému grafickému objektu lze defivat parametry, které se uplatní při jeho vykreslení.

####

- ink
  Obsahuje barvu, která bude použita ke kreslení obrysů objektů (inkoust).

####

- solid_paper
  Obsahuje barvu, která bode použita k vyplnění plošných útvarů. Pokud grafický adaptér nedokáže zvolenou barvu zobrazit jako čistou (např. adaptéry se 16 nebo 256 současně zobrazitelnými barvami), použije směs základních barev.

####

- pattern_paper
  Definuje dvoubarevný výplňový vzor, který bode použit k vyplnění plošných útvarů. Ten musí mít zadány názvy obou barev (popředí vzoru a pozadí vzoru — tyto barvy budou vždy použity jako čisté a nebudou míchány) a definici výplňového vzoru (fill_identifier).

fill_identifier

- empty — prázdný
- full — plný
- dot6, dot12, dot19, dot25, dot31, dot38, dot44, dot50, dot56, dot62, dot69, dot75, dot81, dot88, dot94 — výplň 6 % až 94 %
- hline — vodorovné šrafy
- vline — svislé šrafy
- slash — šrafy 45°
- bkslash — šrafy -45°
- cross — kříže
- xcross — kříže 45°
- Vzor lze definovat pomocí osmi čísel v rozsahu 0..255. Toto je interpretováno jako bitová maska čtverce 8×8 pixelů, definujícího vzor.

####

- fill
  Definuje přechodovou výplň jako seznam barev.

####

- textcolor
  Obsahuje barvu použitou pro zobrazování textu.

####

- shade
  Definuje barvu horního a dolního stínu objektu frame.

####

- pen_width Nastavuje tloušťku pera pro vykreslení obrysů.

####

- pen_style Nastavuje styl čáry obrysu.

- full — plná čára
- dot — krátké čárky
- dash — dlouhé čárky
- dashdot — čerchovaná
- dashdotdot — delší čárka a dvě krátké

Upozornění: V systémech Windows může být ignorováno nastavení stylu u čar, jejichž tloušťka je větší jak 1.

Všechny nastavované parametry vyjma stylu čáry obrysu mohou být za běhu aplikace podle zadaných podmínek proměnné. Definice proměnné barvy se provádí v sekci change_color za každou zvolenou barvou. Seznam barev je vyhodnocován v uvedeném pořadí a platná je ta barva, jejíž podmínka je první vyhodnocena jako true. V případě, že pravdivá není žádná z podmínek, je platná barva základní.

Poznámka: Zápis barev a jejich přehled je identický se zápisem barev v systému Control Web. Použití solid_paper, pattern_paper a fill je vzájemně výlučné.

####

- DRAW_BLOCK
  Jednotlivé útvary se od sebe navzájem liší charakterem zobrazení. Všechny lze rozdělit do tří skupin: zobrazení textu, jednorozměrné útvary a plošné útvary. Každá skupina respektuje vždy omezenou skupinu parametrů definovaných blokem PARAM_BLOCK.

Nepovinný parametr name za definičním jménem útvaru slouží k pojmenování objektu. Toto jméno je možné použít pro identifikaci objektu při volání nativních metod přístroje za běhu aplikace.

Plošné objekty mohou být vykreslovány třemi různými způsoby, které se při definici připojí ke klíčovému slovu rozlišujícímu objekty. <object_id> je klíčové slovo, identifikující objekt.

- object_id — zobrazen bude jen obrys
- object_id_fill — zobrazena bude jen plocha
- object_id_border — obrazec s výplní i obrysem

####

- text
  Libovolný řetězec znaků, kterému lze zvolit barvu, font, polohu a numerické výrazy pro definování jeho měnící se polohy.

Podporované podoby přístroje

  text — respektuje textcolor
  text_fill — respektuje fill

Syntax:

    text integer [: real_expression], integer [: real_expression];
      string;
      font = font_identifier, integer, style_identifier;

####

- line
  Úsečka, jejíž poloha a velikost je určena podle pozice koncových bodů.

Podporované podoby přístroje

  line — respektuje ink, pen_width, pen_style

Syntax:

    line name integer [: real_expression], integer [: real_expression],
              integer [: real_expression], integer [: real_expression];

####

- polyline
  Zobrazí několik úseček, které na sebe navazují tak, že vždy následující po sobě mají společný krajní bod. Popis souřadnic je obdobná jako při definici line, je však uvozen číslem udávajícím celkový počet bodů, tedy počet úseček - 1.

Podporované podoby přístroje

  polyline — respektuje ink, pen_width, pen_style

Syntax:

    polyline name num_points,
                  integer [: real_expression], integer [: real_expression],
                  ...,
                  integer [: real_expression], integer [: real_expression];

####

- polygon
  Mnohoúhelník. Jde o uzavřený útvar, který může mít definovánu výplň, barvu obrysu a polohu všech svých vrcholů. Před uvedením souřadnic vrcholů musí předcházet číslo udávající počet vrcholů/stran mnohoúhelníku.

Podporované podoby přístroje

  polygon — respektuje ink, pen_width, pen_style
  polygon_fill — respektuje solid_paper, pattern_paper, fill
  polygon_border — respektuje všechny parametry uvedené v předchozích bodech

Syntax:

    polygon name num_points,
                 integer [: real_expression], integer [: real_expression],
                 ...,
                 integer [: real_expression], integer [: real_expression];

####

- box
  Obdélník. Musí mít zadánu pozici levého horního rohu, svou šířku a výšku, případně výrazy modifikující předepsané souřadnice a velikosti.

Podporované podoby přístroje

  box — respektuje ink, pen_width, pen_style
  box_fill — respektuje solid_paper, pattern_paper, fill
  box_border — respektuje všechny parametry uvedené v předchozích bodech

Syntax:

    box name integer [: real_expression], integer [: real_expression],  (* x, y *)
             integer [: real_expression], integer [: real_expression];  (* w, d *)

####

- frame
  Odbélník se stínovanými okraji. Parametry uvedené za jeho klíčovým slovem jsou: pozice levého horního rohu, šířka a výška celého tlačítka a výška okraje.

Podporované podoby přístroje

  frame — respektuje shade
  frame_fill — respektuje shade, solid_paper, pattern_paper, fill
  frame_border — respektuje všechny parametry uvedené v předchozích bodech

Syntax:

    frame integer [: real_expression], integer [: real_expression], (* x, y *)
          integer [: real_expression], integer [: real_expression], (* w, d *)
          integer [: real_expression];                              (* frame *)

####

- roundbox
  Obdélník se zakulacenými rohy. U oblouku zakulacujícího jeho hrany je volitelný poloměr. Parametry jsou pozice levého horního rohu, šířka a výška.

Podporované podoby přístroje

  roundbox — respektuje ink, pen_width, pen_style
  roundbox_fill — respektuje solid_paper, pattern_paper, fill
  roundbox_border — respektuje všechny parametry uvedené v předchozích bodech

Syntax:

    roundbox name integer [: real_expression], integer [: real_expression],  (* x, y *)
                  integer [: real_expression], integer [: real_expression],  (* w, d *)
                  integer [: real_expression];                               (* radius *)

####

- ellipse
  Elipsa. Parametry jsou pozice středu a poloosy. Elipsa se shodnými poloosami je kružnice.

Podporované podoby přístroje

  ellipse — respektuje ink, pen_width, pen_style
  ellipse_fill — respektuje solid_paper, pattern_paper, fill
  ellipse_border — respektuje všechny parametry uvedené v předchozích bodech

Syntax:

    ellipse name integer [: real_expression], integer [: real_expression],  (* x, y *)
                 integer [: real_expression], integer [: real_expression];  (* rx, ry *)

####

- ring
  Eliptický prstenec. Parametry jsou střed a poloosy vnitřní a vnější elipsy.

Podporované podoby přístroje

  ring — respektuje ink, pen_width, pen_style
  ring_fill — respektuje solid_paper, pattern_paper, fill
  ring_border — respektuje všechny parametry uvedené v předchozích bodech

Syntax:

    ring name integer [: real_expression], integer [: real_expression],  (* x, y *)
              integer [: real_expression], integer [: real_expression],  (* inner rx, ry *)
              integer [: real_expression], integer [: real_expression],  (* outer rx, ry *)

####

- arc
  Část eliptického oblouku. Má pouze obrys, kterému lze měnit barvu, pozici středu a poloosy, a nakonec souřadnice počátečního a koncového bodu.

Podporované podoby přístroje

  arc — respektuje ink, pen_width, pen_style

Syntax:

    arc name integer [: real_expression], integer [: real_expression],  (* x, y *)
             integer [: real_expression], integer [: real_expression],  (* rx, ry *)
             integer [: real_expression], integer [: real_expression],  (* vx1, vy1 *)
             integer [: real_expression], integer [: real_expression],  (* vx2, vy2 *)

####

- pie
  Eliptická výseč, které lze zadat výplň, barvu obrysu, pozici středu, poloosy, a nakonec souřadnice vektorů s počátkem ve středu obrysové elipsy, které udávají počáteční a koncový bod.

Podporované podoby přístroje

  pie — respektuje ink, pen_width, pen_style
  pie_fill — respektuje solid_paper, pattern_paper, fill
  pie_border — respektuje všechny parametry uvedené v předchozích bodech

Syntax:

    pie name integer [: real_expression], integer [: real_expression],  (* x, y *)
             integer [: real_expression], integer [: real_expression],  (* rx, ry *)
             integer [: real_expression], integer [: real_expression],  (* vx1, vy1 *)
             integer [: real_expression], integer [: real_expression],  (* vx2, vy2 *)

Poznámka: Jednotlivé souřadnice jsou vždy určeny iniciální číselnou hodnotou. Nepovinně za touto hodnotou může být za dvojtečkou uveden výraz. Pokud je výraz uveden, může se hodnota souřadnice měnit v časovém kroku přístroje v závislosti na zadaném výraze.

### Nativní procedury přístroje

`Action()`

Provede aktualizaci obrázku podle aktuálních vstupních hodnot.

Následující netivní procedury pracují s objekty obrázku označenými jménem. Pojmenování objektu lze provést v inspektoru přístroje v dialogovém okně parametrů objektu, které spustíte klikem pravým tlačítkem nad objektem, nebo přímo uvedením jména za klíčové slovo objektu.

Více objektů může mít shodné jméno. Potom změna související s použitou nativní procedurou bude provedena u všech těchto objektů.

`SetInk( Name : string; Color : real )
SetInk( Name : string; R, G, B : real )`

Nastaví všem objektům uvedeného jména barvu obrysu (inkoustu). Barva je zadávána jako číslo 0 až 15 odpovídající základní paletě 16 barevného adaptéru IBM PC nebo jako trojice čísel udávající jednotlivé složky složky barvy v modelu RGB. Nastavení barvy má vyšší prioritu než barva uvedená v definici kresby, včetně proměnné barvy.

`SetSolidPaper( Name : string; Color : real )
SetSolidPaper( Name : string; R, G, B : real )`

Nastaví barvu nevzorované výplně všem objektům uvedeného jména. Barva je zadávána jako u metody SetInk. Nastavení barvy má vyšší prioritu než barva uvedená v definici kresby, včetně proměnné barvy.

`SetPatternPaper( Name : string; CF, CB, P1, P2, P3, P4, P5, P6, P7, P8 : real )
SetPatternPaper( Name : string; CF, CB : real; P : string )`

Nastaví barvu vzorované výplně všem objektům uvedeného jména. Pomocí parametrů CF a CB je zadávána barva popředí a pozadí. Typ výplně lze zadat buď jako osmici charakteristických čísel nebo názvem typu výplně (viz nastavení vzorované výplně u kresby v přístroji draw). Nastavení barvy má vyšší prioritu než barva uvedená v definici kresby, včetně proměnné barvy.

`ClearSet( Name : string )`

Zruší nastavení barev pomocí nativních procedur SetInk, SetSolidPaper a SetPatternPaper a objekty budou akceptovat barvu zadanou v definici kresby, případně získanou ohodnocením výrazů pro změnu barvy.

`CalculateObject( Name : string )`

Provede aktualizaci rozměrů a barev zadaných objektů podle vstupních hodnot.

`PaintObject( Name : string )`

Vykreslí zadané objekty.

`MarkObject( Name : string )
PaintMarked()`

MarkObject označí zadané objekty pro následující vykreslení metodou PaintMarked. Slouží pro současné vykreslení skupiny objektů různých jmen.

### Událostní procedury přístroje

Přístroj může volat standardní událostní procedury:

`OnActivate()
OnShow()
OnHide()
OnMouseDown( MouseX, MouseY : integer; LeftButton, MiddleButton, RightButton : boolean )
OnMouseDoubleClick( MouseX, MouseY : integer; LeftButton, MiddleButton, RightButton : boolean )
OnMouseUp( MouseX, MouseY : integer; LeftButton, MiddleButton, RightButton : boolean )
OnMouseMove( MouseX, MouseY : integer; LeftButton, MiddleButton, RightButton : boolean )
OnWindowMinimize()
OnWindowMaximize()
OnWindowRestore( WasMinimized, WasMaximized : boolean )
OnWindowClose()`

Podrobnější informace k těmto procedurám lze nalézt v kapitole Programování a procedury.