Создание новых фигур
Для создания новой фигуры следует выполнить следующие действия
Создать новый модуль в пакете
frame_stamp.shapeСоздать класс, наследованный от
frame_stamp.shape.base_shape.BaseShapeОпределить имя новой фигуры в атрибуте
shape_nameОпределить метод
draw_shape()для описания процесса рендера фигуры.
Метод draw_shape() принимает такие аргументы:
- shape_canvas
Подготовленный объект PIL.Image на котором можно рендерить. Размер будет равен размеру фигуры плюс офсеты с учетом возможного поворота фигуры.
- canvas_size
Размер подготовленного канваса.
- center
Объект Point с координатами центра.
- zero_point
Смещение нуля от текущего нуля координат в реальное начало координат без учёта добавленного запаса канваса. Просто добавляйте эти координаты перед рендером элементов.
Во время рисования ненужно заботиться о повороте фигуры, это происходит отдельно перед наложением её на основную картинку. Также отдельно происходит рисование градиента.
Результат может быть передан в основной рендер двумя способами:
Ничего не возвращать, результат рендера будет взят из исходного канваса.
Вернуть новое изображение. Например оно было пересоздано по каким-либо причинам.
5. Если фигура достаточно сложная или составная то можно переопределить метод render()
Этот метод в качестве аргумента получает размер канваса и должен через yield возвращать
нужное количество новых фигур вместе с координатами вставки
def render(self, size, **kwargs):
...
for i in some:
yield shape, (x, y)
...
Примечание
Движок использует библиотеку Pillow для рисования фигур.
Добавить импорт вашего класса в файле
frame_stamp/shapes/__init__.py
Пример
Ниже приведён пример создания новой фигуры. Эта фигура рисует круги.
from .base_shape import BaseShape
from PIL import ImageDraw
class CircleShape(BaseShape):
shape_name = 'circle'
@property
def radius(self):
return self._eval_parameter('radius', default=0)
def draw_shape(self, shape_canvas, canvas_size, center, zero_point, **kwargs):
canvas = self._get_canvas(size)
img = ImageDraw.Draw(shape_canvas)
img.ellipse((self.x-(self.radius/2),
self.y-(self.radius/2),
self.x+(self.radius/2),
self.y+(self.radius/2),), fill=self.color)
Теперь в шаблонах можно использовать новый тип фигуры circle с параметром radius.