Source code for sec_interp.gui.preview_reporter

from __future__ import annotations

"""Preview reporting and message formatting for SecInterp.

This module provides the PreviewReporter class to handle the formatting of
preview generation results and performance metrics into human-readable messages.
"""

from qgis.PyQt.QtCore import QCoreApplication

from sec_interp.core.performance_metrics import MetricsCollector, format_duration
from sec_interp.core.types import (
    GeologyData,
    PreviewResult,
    StructureData,
)

from .main_dialog_config import DialogConfig


[docs] class PreviewReporter: """Formatter for preview generation results and status messages."""
[docs] @staticmethod def format_results_message(result: PreviewResult, metrics: MetricsCollector) -> str: """Format results message for display using core result objects. Args: result: The preview result object containing data and metadata. metrics: Performance metrics collector. Returns: A formatted string ready for display in the UI. """ lines = [ QCoreApplication.translate("PreviewReporter", "✓ Preview generated!"), "", QCoreApplication.translate("PreviewReporter", "Topography: {} points").format( len(result.topo) if result.topo else 0 ), ] # Add components lines.append(PreviewReporter.format_geology_summary(result.geol)) lines.append(PreviewReporter.format_structure_summary(result.struct, result.buffer_dist)) lines.append(PreviewReporter.format_drillhole_summary(result.drillhole)) # Add ranges lines.extend(PreviewReporter.format_result_metrics(result)) # Add performance metrics if enabled if DialogConfig.ENABLE_PERFORMANCE_METRICS and DialogConfig.SHOW_METRICS_IN_RESULTS: lines.extend(PreviewReporter.format_performance_metrics(metrics, result)) lines.extend( [ "", QCoreApplication.translate( "PreviewReporter", "Adjust 'Vert. Exag.' and click Preview to update.", ), ] ) return "\n".join(lines)
[docs] @staticmethod def format_geology_summary(geol_data: GeologyData | None) -> str: """Format a summary line for geology data.""" if not geol_data: return QCoreApplication.translate("PreviewReporter", "Geology: No data") return QCoreApplication.translate("PreviewReporter", "Geology: {} segments").format( len(geol_data) )
[docs] @staticmethod def format_structure_summary(struct_data: StructureData | None, buffer_dist: float) -> str: """Format a summary line for structural data.""" if not struct_data: return QCoreApplication.translate("PreviewReporter", "Structures: No data") return QCoreApplication.translate( "PreviewReporter", "Structures: {} measurements (buffer: {}m)" ).format(len(struct_data), buffer_dist)
[docs] @staticmethod def format_drillhole_summary(drillhole_data: Any | None) -> str: """Format a summary line for drillhole data.""" if not drillhole_data: return QCoreApplication.translate("PreviewReporter", "Drillholes: No data") return QCoreApplication.translate("PreviewReporter", "Drillholes: {} holes found").format( len(drillhole_data) )
[docs] @staticmethod def format_result_metrics(result: PreviewResult) -> list[str]: """Format elevation metrics for the results message.""" min_elev, max_elev = result.get_elevation_range() min_dist, max_dist = result.get_distance_range() return [ "", QCoreApplication.translate("PreviewReporter", "Geometry Range:"), QCoreApplication.translate("PreviewReporter", " Elevation: {} to {} m").format( round(min_elev, 1), round(max_elev, 1) ), QCoreApplication.translate("PreviewReporter", " Distance: {} to {} m").format( round(min_dist, 1), round(max_dist, 1) ), ]
[docs] @staticmethod def format_performance_metrics(metrics: MetricsCollector, result: PreviewResult) -> list[str]: """Format performance metrics into a list of strings.""" timings = metrics.timings if not timings: return [] lines = ["", QCoreApplication.translate("PreviewReporter", "Performance:")] mapping = { "Topography Generation": " Topo: {}", "Geology Generation": " Geol: {}", "Structure Generation": " Struct: {}", "Rendering": " Render: {}", "Total Preview Generation": " Total: {}", } for key, template in mapping.items(): if key in timings: # Special skip for geol if result says no geol (though usually timing exists if it ran) if key == "Geology Generation" and not result.geol: continue if key == "Structure Generation" and not result.struct: continue lines.append( QCoreApplication.translate("PreviewReporter", template).format( format_duration(timings[key]) ) ) return lines