Отчет
Для вывода информации на печать предусмотрено создание отчетов. Отчет
формируется на базе стандартного подхода работы с принтером в 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)