Report
======

.. currentmodule:: axioma.render

.. class:: Report

	План отчета для последующей печати.

		.. py:method:: Report(parent=None)

			Конструктор

			:param parent: Владелец элемента легенды. При удалении владельца так же удаляется и сам элемент
			:type parent: :class:`~PyQt5.QtCore.QObject`

		.. py:method:: setOptions(printer)

			Инициализация размеров страницы по переданному объекту принтера.

			:param printer: Объект принтера, по параметрам которого производится инициализация
			:type printer: :class:`~PyQt5.QtPrintSupport.QPrinter`

		.. py:method:: count()

			Количество элементов отчета в текущем отчете на данный момент

			:return: Количество
			:rtype: :class:`int`

		.. py:method:: addItem(item)

			Вставка нового элемента в отчет

			:param item: Вставляемый элемент
			:type item: :class:`ReportItem`

		.. py:method:: removeItem(index)

			Удаление элемента по его индексу. Если индекс корректен, элемент будет удален.

			:param index: Индекс удаляемого элемента
			:type index: :class:`int`

		.. py:method:: moveItem(item, index)

			Перемещение существующего элемента на новую позицию, если элемент и позиция указаны корректно

			:param item: Перемещаемый элемент
			:type item: :class:`ReportItem`
			:param index: Индекс, указывающий позицию, куда необходимо переместить элемент
			:type index: :class:`int`

		.. py:method:: removeItem(item)

			Удаление элемента из отчета

			:param item: Удаляемый элемент
			:type item: :class:`ReportItem`

		.. py:method:: insertItem(item, index)

			Вставка нового элемента в отчет на конкретную позицию.

			:param item: Вставляемый элемент отчета
			:type item: :class:`ReportItem`
			:param index: Индекс
			:type index: :class:`int`

		.. py:method:: index(item)

			Получение индекса элемента по значению

			:param item: Искомый элемент
			:type item: :class:`ReportItem`
			:return: Индекс искомого элемента, или же -1, если элемент не найден
			:rtype: :class:`int`

		.. py:method:: items()

			Получение текущего списка элементов отчета

			:return: Список с элементами отчета
			:rtype: :class:`list` [:class:`ReportItem`]

		.. py:method:: at(index)

			Получение элемента отчета по его индексу. 

			:param index: Индекс
			:type index: :class:`int`
			:return: Элемент отчета. Возвращает None в случае, если не найдено
			:rtype: :class:`bool`

		.. py:method:: frontItem()

			Первый элемент отчета

			:return: Элемент отчета. Возвращает None в случае, если не найдено (отчет не содержит ни одного элемента)
			:rtype: :class:`ReportItem`

		.. py:method:: backItem()

			Последний элемент отчета

			:return: Элемент отчета. Возвращает None в случае, если не найдено (отчет не содержит ни одного элемента)
			:rtype: :class:`ReportItem`

		.. py:method:: rectContents()

			Ограничивающий прямоугольник по существующим в рамках отчета элементам отчета

			:return: Ограничивающий прямоугольник
			:rtype: :class:`~PyQt5.QtCore.QRectF`

		.. py:method:: rect()

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

			:return: Ограничивающий прямоугольник
			:rtype: :class:`~PyQt5.QtCore.QRectF`

		.. py:method:: render(context, excludes=[], pages=[])

			Отрисовка отчета в заданном контексте

			:param context: Контекст, в котором будет отрисован отчет
			:type context: :class:`~axioma.render.Context`
			:param excludes: Элементы отчета, которые не будут отрисованы
			:type excludes: :class:`list` [:class:`ReportItem`]
			:param pages: Страницы, которые не будут отрисованы
			:type pages: :class:`list` [:class:`int`]

		.. py:method::hidden: render(const ReportItemWithContextList &items)

		.. py:method:: horisontalPagesCount()

			Количество страниц отчета по горизонтали

			:return: Количество страниц
			:rtype: :class:`int`

		.. py:method:: setHorisontalPagesCount(v)

				Установка количества страниц по горизонтали

				:param v: Новое количество страниц
				:type v: :class:`int`

		.. py:method:: verticalPageCount()

			Количество страниц отчета по вертикали

			:return: Количество страниц
			:rtype: :class:`int`

		.. py:method:: setVerticalPageCount(v)

			Установка количества страниц по вертикали

			:param v: Новое количество страниц
			:type v: :class:`int`

		.. py:method:: unit()

			Единицы измерения отчета, в которых хранятся элементы ReportItem

			:return: Единицы измерения отчета
			:rtype: :class:`Unit`

		.. py:method:: sizePage()

			Размеры одной страницы отчета

			:return: Размеры страницы
			:rtype: :class:`~PyQt5.QtCore.QSizeF`

		.. py:method:: name()

			Наименование отчета

			:return: Наименование
			:rtype: :class:`str`

		.. py:method:: setName(name)

			Задание нового значения наименования отчета

			:param name: Новое наименование отчета
			:type name: :class:`str`

		.. py:method:: fillOnPages()

			Максимально заполняет страницу(ы) отчета существующими элементами

			:return: False, если если ничего не делалось и контент не изменился. В противном случае True
			:rtype: :class:`bool`

		.. py:method:: coordSystem()

			Координатная система отчета

			:return: Координатная система отчета
			:rtype: :class:`~axioma.cs.CoordSystem`

		.. py:method:: dpiPrinter()

			Разрешение принтера. Инициализируется при передаче объекта принтера в метод setOptions

			:return: Разрешение принтера
			:rtype: :class:`int`

		.. method:: progress(value, total)

			[signal] Сигнал, возникающий при изменении прогресса выполнения

			:param value: Текущее значение
			:type value: :class:`int`
			:param total: Общее количество
			:type total: :class:`int`

		.. method:: needRedrawItem(rect)

			[signal] Сигнал, возникающий при необходимости перерисовки части отчета

			:param rect: Прямоугольник для обновления
			:type rect: :class:`~PyQt5.QtCore.QRectF`

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

  .. code-block:: python
  
      # Создание элемента отчета типа геометрический объект
      # Текст рассматиривается как геометрия. Пример создания см. style.py
      def createGeometryItem(report):
          print('Геометрия...')
          poly = QPolygonF();
          poly << QPointF(20,20) << QPointF(80,50) << QPointF(120,20) << QPointF(320,320) << QPointF(120,180) << QPointF(20,20)
          geom = Polygon(cs_ne, poly) # Задание геометрии
          style = MapBasicStyle().styleFromString("Pen (1, 5, 16711935) Brush (8, 255, 16777215)") # Задание стиля оформления
          geomItem = GeometryReportItem(report) # Элемент отчета
          geomItem.setGeometry(geom) # Геометрия элемента в координатах отчета
          geomItem.setStyle(style) # Стиль оформления геометрии
          report.addItem(geomItem) # Добавляем в отчет
      
      # Создание контекста
      def createContext(painter):
          deviceRect = sceneRect = QRectF(0,0,100,100)
          viewport = Viewport (deviceRect,sceneRect)
          return Context(painter, viewport)

      def dumpReport(printer):
          try:
              report = Report(axioma.app.mainWindow)
              report.setHorisontalPagesCount(2)
              report.setVerticalPageCount(2)
              printer.setPaperSize(QPrinter.A4)
              report.setOptions(printer)
              printer.setOutputFormat(QPrinter.PdfFormat) # Pdf как выходной файл
              filename = QDir.temp().filePath('layout_out.pdf') # Имя выходного файла
              printer.setOutputFileName(filename)
              painter = QPainter(printer)
              context = createContext(painter)
              createGeometryItem(report) # Создание элемента отчета
              report.render(context)  # Отрисовка
              print(QObject().tr("Элементов отчета:"), report.count())
              print('Сохранено в файле ', filename)
          except Exception as ex:
              print(ex)
              

        #printer = QPrinter(QPrinter.HighResolution) # Создание принтера с высоким разрешением (1200dpi для Pdf или зависит от принтера)
        printer = QPrinter() #Создание принтера с обычным разрешением
        dumpReport(printer)
