# Стиль

Стиль представляет собой описательную структуру, которая в свою очередь используется при оформлении геометрического объекта `Geometry` при его отрисовке. Стиль представлен базовым классом `axipy.Style`, а так-же его наследниками.

При работе с табличными данными стиль, при наличии в ней геометрического атрибута, может определяться тремя разными способами:

- Содержаться в специальной колонке таблицы в виде атрибута. В данном случае для геометрии каждой записи таблицы назначается соответствующий ей стиль.

- Определяется для колонки на уровне таблицы. В данном случае геометрия всех записей будет иметь одинаковое оформление.

- В таблице присутствует только геометрия. В данном случае стиль при отрисовке слоя будет браться как значение по умолчанию.

Рассмотрим в дальнейшем первый вариант. Для выполнения последующих примеров создадим таблицу в памяти и зарегистрируем ее в системе:

    definition = {
        'src': '',
        'schema': Schema(
            Attribute.string('id', 60),
            coordsystem='prj:1, 104'
        )
    }
    table = provider_manager.create(definition)

Далее попробуем различными методами добавить геометрию в эту таблицу. На примере точечного объекта. Создадим точечный объект, и, если стиль оформления не имеет значения, назначим ему наиболее подходящий для данного типа (в нашем случае точки) объекта, просто передав туда нашу геометрию:

    point = Point(10, 8)
    pstyle = Style.for_geometry(point)
    print(pstyle.to_mapinfo())
    '''
      >>> Symbol (36, 255, 12, "Map Symbols", 0,0)
    '''

Для иллюстрации результата сформируем на базе созданных объектов геометрии и стиля запись и добавим его в ранее созданную таблицу. Итог покажем на карте:

    fpoint = Feature(
        geometry=point,
        style=pstyle
    )
    table.insert([fpoint])
    m = Map([table])
    view = view_manager.create_mapview(m)

В результате получим точку на карте:

Так же доступно создание из строки формата MapBasic. Для этого используется метод `axipy.Style.from_mapinfo()`. Если же для существующего стиля необходимо получить строку MapBasic, то используется метод `axipy.Style.to_mapinfo()`. Создадим для нашей точки стиль на базе представления MapBasic. Строка формирования стиля точки будет выглядеть так:

    pstyle = Style.from_mapinfo('Symbol (35, 255, 20)')

Пример добавления точки, но с использованием стиля, на основании растрового символа:

    pstyle = PointStyle.create_mi_picture("GLOB1-32.bmp")
    print(pstyle)
    fpoint = Feature(
        geometry=point,
        style=pstyle
    )
    '''
    >>> Symbol ("GLOB1-32.bmp", 0, 12, 0)
    '''

Далее вставим в таблицу по аналогии, рассмотренной выше. Результат:

Теперь рассмотрим объект типа полигон.

    from PySide2.QtCore import Qt

    polygon = Polygon((1, 1), (2, 7), (8, 7), (7, 3))
    polygon.holes.append((2, 4), (3, 6), (4, 5))
    polystyle = PolygonStyle()
    polystyle.set_pen(pattern=48, color=Qt.blue)
    polystyle.set_brush(pattern=8, color=Qt.red)
    print(polystyle)
    fpolygon = Feature(
        geometry=polygon,
        style=polystyle
    )
    table.insert([fpolygon])
    '''
    >>> Pen (1, 48, 255)  Brush (8, 16711680, 0)
    '''

Для сложных разнородных объектов применяются стили, которые внутри себя содержат другие стили для каждого типа используемых объектов. Для этого используется класс `axipy.CollectionStyle`. Из ранее созданных полигона и точки сделаем коллекцию посредством объединения. И, одновременно с этим, на базе ранее созданных стилей сделаем сложный стиль:

    collstyle = CollectionStyle()
    collstyle.for_point(pstyle)
    collstyle.for_polygon(polystyle)
    print(collstyle)
    collection = polygon.union(point)
    fcollection = Feature(
        geometry=collection,
        style=collstyle
    )
    table.insert([fcollection])
    '''
    >>>  Symbol ("GLOB1-32.bmp", 0, 12, 0) Pen (1, 48, 255)  Brush (8, 16711680, 0)
    '''

В результате получим следующий объект: