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):

  1. Ingesta (Main Thread): El método prepare_task_input extrae datos de objetos QgsVectorLayer hacia tipos primitivos de Python y strings WKT.

  2. Cálculo (Background): El método process_task_data recibe el TaskInput y 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 QgsFeature durante cálculo

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.