Base Shapes
-----------

Базовые и вспомогательные фигуры.

AbstractShape
=============

Базовый абстрактный класс для фигуры. Содержит общие для всех данные.


Параметры
*********

id
    Уникальное имя фигуры. Нельзя в одном шаблоне создавать две фигуры с одинаковым именем.
    Это имя используется для ссылки на конкретную фигуру и её параметры.

parent
    Ссылка на родительский объект. Если `parent` не указан то им является исходная картинка.
    При парентинге начало координат объекта находятся в верхнем левом углу парента, поэтому объект изменит своё расположение
    и будет следовать за родительским объектом.

Нет парентинга

.. image:: ../images/parenting-no.gif
   :alt: No Parenting

Есть парентинг

.. image:: ../images/parenting-yes.gif
   :alt: With Parenting

z_index
    Параметр отвечает за порядок отрисовки элементов. Например, родительский объект должен быть создан в шаблоне
    ДО указания его в качестве родителя. В таком случае все дочерние объекты будут отрисованы поверх родительского.
    Изменение индекса позволит управлять этой очерёдностью.


.. image:: ../images/z-index.gif
   :alt: With Parenting

enabled
    Параметр, определяющий рендерится ли фигура. Если `enabled=false` то элемент будет отсутствовать, но при этом ячейка
    сетки всё равно будет занята и эта фигура может быть парентом для других фигур.

skip
    Пропуск элемента в сетке. В отличие от `enabled` ячейка сетки не будет занята, произойдет его полное
    удаление со смещением следующего элемента.
    Лучше всего подходит для вариативных элементов. То есть в двух соседних элементах в параметр `skip` можно записать
    противоположные условия и будет виден либо один либо другой.

.. code-block:: json

   "variables": {
       "show_alt": true
   },
   "shapes": [
       {"type": "label", "text": "Main Text", "skip": "$show_alt"},
       {"type": "label", "text": "Alt Text",  "skip": "=not $show_alt"}
   ]

BaseShape
=========

    `inherited (AbstractShape)`

Базовая фигура представляет объект, участвующий в рендере. Он либо видим на рендере, либо используется как
невидимый родительский объект.

local_resource_paths
    Пути для поиска файлов ресурсов.

get_resource_func
    Функция для поиска файла ресурса.

Параметры
*********

x
    Координата X относительно родительского объекта

y
    Координата Y относительно родительского объекта

width
    Ширина фигуры

height
    Высота фигуры

align_v
    Выравнивание по вертикали относительно родителя

align_h
    Выравнивание по горизонтали относительно родителя

color
    Основной цвет. Можно указать в следующих форматах:

- **RGB (0-255):** ``[100, 100, 0]``

- **RGBA (0-255):** ``[255, 0, 0, 100]``

- **HEX:** ``#fff444``

- **COLOR NAME:** ``"red"``

Список имён цветов можно посмотреть в исходниках Pillow, например `здесь <https://github.com/python-pillow/Pillow/blob/master/src/PIL/ImageColor.py#L148>`_

rotate
    Угол поворота в градусах

rotation_pivot
    Центр поворота. **Этот параметр всегда должен быть списком из двух элементов**.
    Если не указать центр поворота то по умолчанию центром будет являться геометрический центр объекта.

rotation_offset
    Смещение фигуры относительно края парента при включенном выравнивании по горизонтали или вертикали.

gradient (EXPERIMENTAL)
    Заливка градиентом. Поддерживается линейный и радиальный градиенты

debug
    Отображение рамок объектов. Должен быть словарём.

Доступные параметры для ``debug``

debug.enabled
    Включить или выключить обводку

debug.color
    Цвет обводки

debug.width
    Толщина обводки

debug.offset
    Смещение обводки от основной фигуры

debug.rotation_pivot
     Отобразить пивот вращения

debug.rotation_pivot_color
    Цвет пивота вращения

debug.rotation_pivot_size
    Размер пивота вращения

debug.parent
    Отобразить обводку родительского объекта

debug.parent_color
    Цвет обводки родительского объекта

debug.parent_width
    Толщина обводки родительского объекта

debug.parent_offset
    Смещение обводки от основной фигуры для родительского объекта

debug.canvas
    Отобразить границы исходного канваса текущего объекта

debug.canvas_color
    Цвет обводки границ канваса

debug.canvas_width
    Толщина обводки границ канваса

Пример:

.. code-block:: json

  {
    "type": "label", "text": "example",
    "parent": "rect1",
    "align_h": "center",  "align_v": "center",
    "debug": {
      "enabled": true,
      "color": "red",
      "width": 3,
      "parent_width": 2,
      "parent_color": "orange",
      "parent_offset": 0,
      "parent": true,
      "canvas": true,
      "canvas_color": "yellow",
      "canvas_width": 3,
      "rotation_pivot": true,
      "rotation_pivot_size": "5p",
      "rotation_pivot_color": "blue"
    }
  }

.. image:: ../images/debug.png
   :alt: With Parenting

Поля
****

top
    Верхняя граница в глобальных координатах

bottom
    Нижняя граница в глобальных координатах

left
    Левая граница в глобальных координатах

right
    Правая граница в глобальных координатах

EmptyShape
==========

    `inherited (BaseShape)`

Пустая фигура, используется как заглушка для пустого места или как невидимый парент.


RootParent
==========

    `inherited (BaseShape)`

Обёртка для исходной картинки, чтобы она работала как родительский объект.


Глобальный контекст
===================

В процессе ресолва экспрешенов доступны все built-in функции python, а также несколько объектов импортированных из библиотек.


random
  Функция `random.random`

uniform
  Функция `random.uniform`

randint
  Функция `random.randint`

random_seed
  Функция `random.seed`

math
  Модуль `math`

Пример

.. code-block:: json

  {
    "type": "label", "text": "`=math.sin($frame)`"
  }