from __future__ import annotations
"""SVG exporter module for vector graphics."""
from pathlib import Path
from qgis.core import QgsMapRendererCustomPainterJob
from qgis.PyQt.QtCore import QRectF, QSize
from qgis.PyQt.QtGui import QPainter
from qgis.PyQt.QtSvg import QSvgGenerator
from sec_interp.logger_config import get_logger
from .base_exporter import BaseExporter
logger = get_logger(__name__)
[docs]
class SVGExporter(BaseExporter):
"""Exporter for SVG vector format."""
[docs]
def get_supported_extensions(self) -> list[str]:
"""Get supported SVG extension."""
return [".svg"]
[docs]
def export(self, output_path: Path, map_settings) -> bool:
"""Export map to SVG.
Args:
output_path: Output file path
map_settings: QgsMapSettings instance configured for rendering
Returns:
True if export successful, False otherwise
"""
try:
width = self.get_setting("width", 800)
height = self.get_setting("height", 600)
title = self.get_setting("title", "Section Interpretation Preview")
description = self.get_setting("description", "Generated by SecInterp QGIS Plugin")
# Setup SVG generator
generator = QSvgGenerator()
generator.setFileName(str(output_path))
generator.setSize(QSize(width, height))
generator.setViewBox(QRectF(0, 0, width, height))
generator.setTitle(title)
generator.setDescription(description)
# Setup painter
painter = QPainter()
if not painter.begin(generator):
return False
try:
painter.setRenderHint(QPainter.Antialiasing)
# Render map
job = QgsMapRendererCustomPainterJob(map_settings, painter)
job.start()
job.waitForFinished()
# Draw legend if available
show_legend = self.get_setting("show_legend", True)
legend_renderer = self.get_setting("legend_renderer")
if legend_renderer and show_legend:
legend_renderer.draw_legend(painter, QRectF(0, 0, width, height))
return True
finally:
painter.end()
except Exception:
logger.exception(f"SVG export failed for {output_path}")
return False