# Отчет

Для вывода информации на печать предусмотрено создание отчетов `axipy.Report`. Отчет формируется на базе стандартного подхода работы с принтером в Qt `PySide2.QtPrintSupport.QPrinter`. Создадим макет отчета, в который поместим геометрический объект и карту. Вывод сделаем в файл формата PDF. Для этого предварительно создадим объект принтера и установим необходимые свойства

    from PySide2.QtPrintSupport import QPrinter

    printer = QPrinter()
    printer.setOutputFormat(QPrinter.PdfFormat)
    printer.setOutputFileName('../path/to/outdir/report.pdf')

Далее, создадим сам отчет и в конструктор передадим созданный ранее принтер.

    from axipy import Report

    report = Report(printer)

Создадим геометрический элемент и добавим его в отчет. Координаты в единицах измерения листа принтера.

    geometryReportItem = GeometryReportItem()
    geometryReportItem.geometry = Polygon((10, 10), (10, 100), (100, 100), (10, 10))
    geometryReportItem.style = PolygonStyle(45, Qt.red)
    report.items.add(geometryReportItem)

Аналогично добавим карту.

    table = provider_manager.openfile('world.tab')
    world = Layer.create(table)
    map = Map([world])
    mapReportItem = MapReportItem(Rect(10, 110, 200, 210), map)
    mapReportItem.scale = 200000000
    report.items.add(mapReportItem)

Контекст для печати по подобию рассмотренному контексту для карты.

    from PySide2.QtGui import QPainter

    painterReport = QPainter(printer)
    context = Context(painterReport)

Производим печать.

    report.draw(context)

В результате в файловой системе мы получим файл report.pdf, который содержит геометрический элемент и карту.

## Окно редактирования отчета

Если необходимости в визуальном редактировании отчета `axipy.Report` нет, а требуется только программно создать макет отчета и распечатать его на принтере или сохранить как PDF, то достаточно создать `axipy.Report` и работать с ним. В противном случае отчет, по аналогии с картой для визуального редактирования его так же помещают в окно редактирования `axipy.ReportView`. В качестве примера создадим окно отчета и поместим в него геометрию и карту. Стоит заметить, что карту так-же можно использовать у уже открытого окна карты `axipy.MapView.map()`. Координаты элементов задаются в единицах измерения отчета `axipy.Report.unit`. В нашем случае это миллиметры.

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

    from PySide2.QtCore import Qt
    rv = view_manager.create_reportview()

    # Добавим полигон
    geomItem = GeometryReportItem()
    geomItem.geometry = Polygon((10, 10), (10, 100), (100, 100), (10, 10))
    geomItem.style = PolygonStyle(45, Qt.red)
    rv.report.items.add(geomItem)

    # Добавим направляющую
    rv.x_guidelines.append(20)

    # Текущий масштаб просмотра
    rv.view_scale = 33

    # Включение режима привязки координат
    rv.snap_mode = True

    # Размер ячейки сетки
    rv.mesh_size = 20

    # Откроем и добавим карту
    table = provider_manager.openfile(filepath)
    world = Layer.create(table)
    map = Map([world])
    mapItem = MapReportItem(Rect(10, 100, 200, 200), map)
    mapItem.scale = 200000000
    rv.report.items.add(mapItem)

    # Поменяем стиль у первого объекта
    rv.report.items[0].style = PolygonStyle(45, Qt.blue)