PieSizeParam
=================

.. currentmodule:: axioma.render

.. class:: PieSizeParam

	Параметры масштабирования диаграммы. Содержит соответствие между масштабом карты, суммой значений по заданному выражению и диаметром диаграммы

		.. py:attribute:: mapScale

		Значение масштаба карты 

		:type: :class:`float`

		.. py:attribute:: sumValue

		Сумма значений, соответствующая масштабу карты и диаметру диаграммы

		:type: :class:`float`

		.. py:attribute:: diameter

		Диаметр диаграммы

		:type: :class:`~axioma.render.UnitValue`
		

PieThematicStyleProvider
=========================

.. currentmodule:: axioma.render

.. class:: PieThematicStyleProvider

	Класс провайдера стилей для тематического слоя :class:`PieThematicLayer` в виде круговой диаграммы.

	Унаследован от: :class:`ThematicStyleProvider`, :class:`AllocationThematic`

		.. py:method:: PieThematicStyleProvider(layer)

			Конструктор

			:param layer: Ссылка на тематический слой, к которому привязан данный провайдер стилей.
			:type layer: :class:`~axioma.render.ThematicLayer`

		.. py:method:: setExpressions(list)

			Задание списка выражений и соответствующих им стилей для каждого результирующего сегмента

			:param list: Список, содержащий параметры.
			:type list: :class:`list` [:class:`ThematicColorExpressionParam`]

		.. py:method:: setStartAngle(angle)

			Задание начального угла, от которого строится первый сегмент круговой диаграммы

			:param angle: Значение угла.
			:type angle: :class:`float`

		.. py:method:: startAngle()

			Начальный угол, от которого строится первый сегмент круговой диаграммы

			:return: Значение угла
			:rtype: :class:`float`

		.. py:method:: setSizeParam(v)

			Задание параметров масштабирования 

			:param v: Новое значение.
			:type v: :class:`PieSizeParam`

		.. py:method:: sizeParam()

			Текущие параметры масштабирования 

			:param v: Новое значение.
			:type v: :class:`PieSizeParam`
			:return: Установленные параметры масштабирования
			:rtype: :class:`PieSizeParam`

		.. py:method:: pixelDiameter(mapViewport, dpi)

			Расчет максимального диаметра в пикселях, исходя из переданного MapViewport и требуемого dpi устройства

			:param mapViewport: Значение MapViewport.
			:type mapViewport: :class:`MapViewport`
			:param dpi: dpi устройства.
			:type dpi: :class:`int`
			:return: Рассчитанное значение
			:rtype: :class:`float`

		.. py:method:: calculateMaxSum(table)

			Расчет максимального значения суммы результатов по заданным выражениям по всем записям таблицы

			:param table: Анализируемая таблица
			:type table: :class:`~axioma.core.dp.Table`
			:return: Рассчитанное значение
			:rtype: :class:`float`

		.. py:method:: isClockwise()

			Порядок отрисовки сегментов диаграммы

			:return: True, если по часовой стрелке, False если против
			:rtype: :class:`bool`

		.. py:method:: setIsClockwise(value)

		Установка порядка отрисовки сегментов диаграммы

			:param value: Если задано True, то сегменты будут отрисовываться в порядке по часовой стрелке. False - против
			:type value: :class:`bool`

		.. py:method:: thematicColorExpressionParams()

			Список параметров по анализируемым сегментам 

			:return: Список
			:rtype: :class:`list` [:class:`ThematicColorExpressionParam`]

		.. py:method:: setThematicStyleParam(ind, param)

			Задание нового значения ( замена существующего ) параметра по его индексу

			:param ind: Индекс параметра
			:type ind: :class:`int`
			:param param: Параметр
			:type param: :class:`~axioma.render.ThematicColorExpressionParam`

		.. py:method:: thematicStyleParam(index)

			Запрос параметров сегмента по его индексу

			:param index: Индекс
			:type index: :class:`int`
			:return: Полученный по индексу параметр
			:rtype: :class:`~axioma.render.ThematicColorExpressionParam`

		.. py:method:: isGraduired()

			Является ли диаграмма масштабируемой в зависимости от полученного значения выражения

			:return: True, если размеры всех диаграмм тематического слоя имеют одинаковый размер. False, если размер масштабируется по выражению
			:rtype: :class:`bool`

		.. py:method:: setIsGraduired(value)

			Установить признак необходимости масштабирования диаграммы

			:param value: True, если производить масштабирование не требуется. False в противном случае
			:type value: :class:`bool`
  
PieThematicLayer
=================

.. currentmodule:: axioma.render

.. class:: PieThematicLayer

	Тематический слой в виде круговой диаграммы

	Унаследован от: :class:`~axioma.render.ThematicLayer`

		.. py:method:: PieThematicLayer(parent)

			Конструктор

			:param parent: Ссылка на слой, на базе которого создается данный тематический слой.
			:type parent: :class:`FeatureLayer`

		.. py:method:: PieThematicLayer(other)

			Копирующий конструктор

			:param other: Исходный слой, на базе которого создается новый слой.
			:type other: :class:`PieThematicLayer`

		.. py:method:: styleProvider()

			Возвращает текущий провайдер стилей для слоя.

			:return: Копия провайдера стиля, установленного для слоя на данный момент
			:rtype: :class:`~axioma.render.PieThematicStyleProvider`

		.. py:method:: setStyleProvider(provider)

			Устанавливает новый провайдер стилей для слоя.

			:param provider: Новый провайдер стилей.
			:type provider: :class:`PieThematicStyleProvider`


Пример использования:

  .. code-block:: python
  
    # Импорт
    from axioma.render import *
    from axioma.core.sql import *
    from axioma.mapinfo import *

    # Создание переменной для обеспечения возможности вычисления выражений
    runtime = SqlRuntime()
    
    # Добавление слоя в конец списка
    def addLayer(layer, thematic):
       layer.appendLayer(thematic);

    # Создание выражения по полю
    def makeExpressionForWorld(layer, attr):
        evaluator = FeatureExpressionEvaluator(runtime, layer.tableSchema())
        if not evaluator.setExpression(axioma.app.mainWindow.tr(attr)):
            print(evaluator.errorString())
        return evaluator

    # Создание пар стиль - выражение
    def makeStylePair(layer, color, attr):
        style = polygonStyleForColor(color)
        expr = makeExpressionForWorld(layer, attr)
        return ThematicColorExpressionParam(style, expr)


    # Создание списка выражений по цветам
    def makeExpressionListForWorld(layer):
        list = []
        list.append(makeStylePair(layer, Qt.red, QObject().tr("Население")))
        list.append(makeStylePair(layer, Qt.blue, QObject().tr("Pop_Male")))
        list.append(makeStylePair(layer, Qt.green, QObject().tr("Pop_Fem")))
        return list

    # Круговая диаграмма. layer - базовый слой, на основе которого строится тематика
    def addPieThematic(layer):
        pieLayer = PieThematicLayer(layer)
        pieStyleProvider =  PieThematicStyleProvider(pieLayer)
        pieStyleProvider.setStartAngle(30)
        pieStyleProvider.setExpressions(makeExpressionListForWorld(layer)) # Установим выражения
        if len(pieStyleProvider.thematicColorExpressionParams()) > 1:
            sizeParam = pieStyleProvider.sizeParam() 
            sizeParam.sumValue = pieStyleProvider.calculateMaxSum(layer.table()) # максимальное значение
            sizeParam.mapScale = 160000000 # для масштаба
            sizeParam.diameter = UnitValue(Unit.cm(), 1.0) # размер в сантиметрах
            pieStyleProvider.setSizeParam(sizeParam)
            pieLayer.setStyleProvider(pieStyleProvider)  # Установка провайдера стиля
            addLayer(layer, pieLayer)
