Análisis Técnico Avanzado: SecInterp v2.9.0
La versión 2.9.0 representa un hito de madurez arquitectónica para el plugin, transformando componentes monolíticos en una infraestructura desacoplada, testable y orientada al dominio.
🏛️ Innovaciones Arquitectónicas
1. Descomposición de Servicios (Patrón Facade + Procesadores)
El mayor cambio reside en la atomización del DrillholeService. Lo que antes era un archivo de >600 líneas con múltiples responsabilidades, ahora es una Fachada que orquesta cuatro procesadores especializados:
CollarProcessor: Especializado en la proyección geodésica de collares sobre la línea de sección.
SurveyProcessor: Gestiona la matemática de trayectorias (desurveying) y validación de profundidades.
IntervalProcessor: Encargado de la interpolación de intervalos litológicos 3D en segmentos 2D.
ProjectionEngine: Contiene la lógica matemática pura de transformación de coordenadas $X,Y,Z \rightarrow Dist, Elev$.
[!TIP] Impacto: La complejidad ciclomática de los métodos de procesamiento bajó de un promedio de 22 a 8, facilitando enormemente el mantenimiento y la depuración.
2. Capa de Dominio Semántica (core/domain)
Se ha migrado del genérico core/types a un paquete de dominio estructurado. Esta distinción no es solo nominal; define la jerarquía de la Arquitectura Limpia:
Entities: Objetos con identidad de negocio (
GeologySegment,StructureMeasurement).TaskInputs: DTOs inmutables diseñados específicamente para el flujo de datos asíncrono.
Enums: Definiciones contractuales que eliminan el uso de “Magic Strings” en validaciones.
🚀 Patrón “Domain-Pure Logic” (Desacoplamiento QGIS)
SecInterp v2.9.0 implementa un flujo de datos en dos etapas que garantiza la seguridad de hilos (thread-safety):
Ingesta (Main Thread): El método
prepare_task_inputextrae datos de objetosQgsVectorLayerhacia tipos primitivos de Python y strings WKT.Cálculo (Background): El método
process_task_datarecibe elTaskInputy computa las intersecciones sin tocar la API de QGIS que no sea thread-safe.
Característica |
Antes (v2.7.x) |
Ahora (v2.9.0) |
|---|---|---|
Acceso a Datos |
Directo a |
Vía DTOs desacoplados (WKT/Attr Dicts) |
Seguridad de Hilos |
Riesgosa (crashes aleatorios) |
Garantizada por diseño |
Testabilidad |
Requiere QGIS completo |
Posible con Mocks mínimos o Python puro |
🧪 Estabilidad y Calidad de Código
Corrección de Geometría: Se eliminó el uso de
.clone()(causante de inestabilidad en versiones específicas de PyQt5) por constructores de copia explícitos.Standardization: Adopción de
from sec_interp.core...para todas las importaciones internas, evitando colisiones de nombres.Infraestructura: Suite de 199 pruebas ejecutadas exitosamente en contenedores Docker, asegurando paridad entre entornos de desarrollo y producción.
📈 Conclusión
La versión 2.9.0 sienta las bases para el Objetivo 2: Soporte para secciones poligonales (bent sections). Gracias a que la lógica de proyección está ahora aislada en el ProjectionEngine, implementar polilíneas será una extensión del motor actual en lugar de una reescritura masiva.