# Guía de Distinción de Componentes "Core" Este documento tiene como objetivo aclarar la distinción entre los diferentes componentes denominados "Core" dentro del proyecto **SecInterp**, para evitar confusiones tanto por parte de desarrolladores humanos como de agentes de IA. ## ⚠️ La Distinción Fundamental Existen dos entidades "Core" que coexisten en este entorno de desarrollo: 1. **SecInterp Core** (El Núcleo del Proyecto): * **Ubicación**: Directorio `/core` dentro de la raíz del proyecto. * **Propósito**: Contiene la lógica de negocio pura, algoritmos geológicos, servicios de procesamiento y modelos de datos (DTOs) específicos de SecInterp. * **Estado Actual**: **Desacoplado**. A partir de la versión 2.8.0, este módulo ha sido saneado para no tener dependencias directas de las clases vivas de QGIS durante el procesamiento pesado (Thread-Safe). 2. **QGIS Core** (La API de QGIS): * **Referencia**: Paquete de Python `qgis.core`. * **Propósito**: Proporciona la infraestructura geoespacial subyacente (geometrías, capas, proyectos, CRS). * **Interacción**: SecInterp utiliza `qgis.core` para extraer datos en el hilo principal, pero el **SecInterp Core** procesa estos datos usando tipos agnósticos (WKT, diccionarios, primitivos). --- ## 🧭 Reglas para Desarrolladores e IA Para mantener la integridad arquitectónica, siga estas directrices: ### 1. No asuma que "Core" siempre es QGIS Si se le pide "revisar el core", se refiere casi exclusivamente al directorio `/core` de este plugin. No intente buscar o modificar archivos internos del motor de QGIS. ### 2. Límites de Datos (Decoupling) * **En `/core`**: Se deben usar tipos de dominio agnósticos. Evite instanciar `QgsVectorLayer` o acceder a `QgsProject.instance()` dentro de los servicios del núcleo. Use `DomainGeometry` (WKT) y diccionarios de atributos. * **En `/gui`**: Es el lugar donde se realiza la traducción entre la API real de QGIS (`qgis.core`) y el **SecInterp Core**. Aquí es donde se extraen las geometrías y se preparan los DTOs. ### 3. Nomenclatura de Archivos e Importaciones * **Archivos Locales**: Los archivos en `core/` (ej. `core/services/geology_service.py`) son el **Cerebro de SecInterp**. * **API Externa**: Las importaciones que empiezan con `qgis.core`, `qgis.gui` o `qgis.utils` son **Dependencias Externas**. * **Regla de Nomenclatura**: En discusiones o comentarios de código, use "Internal Core" para referirse a `/core` y "PyQGIS API" para la del software. ### 4. El Patrón "Extract-then-Compute" (Extraer y Calcular) Para evitar complicaciones futuras, el flujo de datos **DEBE** seguir este patrón: 1. **Capa GUI/Task Interface**: Recibe objetos de QGIS (`QgsVectorLayer`, `QgsFeature`). Extrae lo necesario (geometría en WKT, diccionarios de atributos). 2. **Capa Core**: Recibe únicamente los datos extraídos (strings, dicts, floats). Realiza los cálculos geométricos pesados. 3. **Resultado**: El Core devuelve DTOs (Data Transfer Objects) definidos en `core/types.py`. La capa GUI se encarga de convertir esto de nuevo a capas de QGIS si es necesario. ### 5. Reglas de Oro de Hilo-Seguridad (Thread-Safety) * **Prohibido**: Importar `qgis.gui` dentro de `core/`. Los hilos de fondo morirán si intentan tocar cualquier widget o ventana. * **Restricción**: Minimizar el uso de `qgis.core` dentro de `core/`. Aunque algunas clases como `QgsGeometry` son seguras, es preferible operar sobre WKT para garantizar total independencia. * **Contexto de Aplicación**: Nunca use `iface` o `QgsProject.instance()` dentro de `core/`. Si necesita datos del proyecto, páselos como argumentos pre-extraídos. --- ## 🧪 Estrategia de Testing Diferenciada * **Tests del Core (`tests/core/`)**: Deben poder ejecutarse sin instalar QGIS completo. Usan mocks ligeros. Son el termómetro de la lógica geológica. * **Tests de Integración (`tests/integration/`)**: Requieren QGIS real. Prueban que nuestro "Core" se entiende correctamente con la "API de QGIS". --- ## 🛠️ Resumen de Desacoplamiento (Enero 2026) Se ha completado un esfuerzo mayor para asegurar que: * `GeologyService` no use capas vivas de QGIS en su método de procesamiento. * `DrillholeService` use diccionarios en lugar de objetos `QgsFeature` durante el cálculo de trazas. * La lógica de proyección 3D acepta tuplas y tipos primitivos. **En resumen: Mantenga nuestro Core "puro". Trate a QGIS como un proveedor de servicios externo. No permita que las raíces de uno entren en la lógica del otro.**