Generador de G-Code para corte en CNC Popular
====================================================

Autor: Rodrigo-CNC Popular
Versión: 0.1.0.0
Compatibilidad: Blender 4.2+

Descripción:
------------
Este addon permite exportar trayectorias CNC en formato G-code para firmware Marlin, respetando coordenadas reales, compensación de herramienta, pestañas de sujeción, y optimización de movimientos en Z.

Características:
---------------
- Compensación de herramienta: Centro, Interior, Exterior
- Separación de contornos desde curvas
- Cola de trabajos con parámetros independientes
- Pestañas automáticas con longitud, espesor y cantidad
- Encabezado técnico en el G-code con medidas y resumen
- Visualización de medidas del contorno y coordenadas
- Exportación con Z optimizado (solo cuando cambia)
- Movimientos de Z seguro con velocidad F600


Uso:

Contacto:
---------
Rodrigo - CNC Popular

👉 En la arquitectura del addon:  
- **`utils.py`** = motor geométrico y generador de G-code.  
- **`operator.py`** = controladores de acciones (operadores).  
- **`panel.py`** = interfaz visual para el usuario.  





---
panel.py
## 📌 Propósito general
El archivo `panel.py` se encarga de construir el **Panel de usuario en la vista 3D** de Blender, donde se configuran parámetros globales, se gestionan Jobs, se visualizan medidas de contornos y se exporta el G-code.  
Es la **capa de interacción visual** entre el usuario y las funciones definidas en `operator` y `utils`.

---

## 🛠️ Clases principales

### 1. **`CNC_UL_jobs` (UIList)**
- Lista que muestra los trabajos (Jobs) en la cola.  
- Dibuja cada ítem con:
  - Nombre del Job.  
  - Objetos asociados.  
- Soporta vista compacta y grid.

### 2. **`VIEW3D_PT_CNCPanel` (Panel)**
- Panel principal en la **barra lateral de la vista 3D** (`N` → pestaña *Corte GCode*).  
- Organiza la interfaz en secciones:

---

## 📑 Secciones del Panel

### 🔹 Parámetros globales
- Diámetro de fresa, Z seguro, pasos de muestreo.  
- Opción para limpiar colecciones antes de visualizar.  
- Botón para crear contornos compensados (`cnc.visualize_selected_compensation`).  

### 🔹 Medidas del contorno seleccionado
- Usa `utils.compute_selected_contour_size`.  
- Muestra ancho, alto, centro, esquina mínima.  
- Opcional: perímetro, número de polilíneas y vértices.  
- Control para elegir qué coordenadas mostrar (`contour_coord_mode`).

### 🔹 Gestión de Jobs
- Botones: **Añadir**, **Quitar**, **Limpiar cola**.  
- Lista de Jobs (`CNC_UL_jobs`).  

### 🔹 Job seleccionado
- Botón para visualizar Job (`cnc.visualize_selected_job`).  
- Controles para mover Job arriba/abajo en la cola.  
- Edición de parámetros del Job:
  - Nombre, objetos asociados.  
  - Profundidad por pasada y final.  
  - Feed, plunge, dirección de corte.  
  - Configuración de pestañas:
    - Activar/desactivar.  
    - Modo AUTO (con `tab_count`) o MANUAL (lista de pestañas seleccionadas).  
    - Longitud y espesor de pestañas.  
    - Botones: visualizar pestañas, añadir pestaña manual, reiniciar pestañas.  

### 🔹 Exportación
- Campo para definir archivo de salida (`file_path`).  
- Botón para seleccionar ruta (`cnc.select_output_path`).  
- Botón para exportar G-code (`cnc.export_jobs`).  

---

## 🎯 En resumen
El archivo `panel.py` es la **interfaz gráfica del addon CNC**:
- Permite configurar parámetros globales y específicos de cada Job.  
- Muestra medidas del contorno seleccionado.  
- Facilita la gestión de Jobs y pestañas.  
- Centraliza la exportación del G-code.  


---



---
operators.py
---

## 📌 Propósito general
El archivo define **operadores de Blender** (`bpy.types.Operator`) que gestionan el flujo de trabajo CNC dentro del addon: selección de rutas de salida, creación y administración de trabajos (Jobs), visualización de compensaciones y pestañas, y exportación de G-code.

---

## 🛠️ Operadores principales

### 1. **Gestión de archivos**
- **`OT_SelectOutputPath`**  
  Permite elegir la ruta de salida para el archivo G-code. Usa el file selector de Blender.

### 2. **Creación y administración de Jobs**
- **`OT_AddJob`**  
  Crea un nuevo Job a partir de las curvas seleccionadas, guardando parámetros como profundidad, feed, diámetro, compensación, etc.
- **`OT_RemoveJob`**  
  Elimina el Job actualmente seleccionado.
- **`OT_ClearJobs`**  
  Limpia toda la cola de Jobs.
- **`OT_MoveJobUp` / `OT_MoveJobDown`**  
  Cambian el orden de los Jobs en la lista y actualizan la visualización del orden.

### 3. **Visualización de geometría compensada**
- **`OT_VisualizeSelectedCompensation`**  
  Genera curvas compensadas (Interior, Exterior, Center) de las seleccionadas y les asigna materiales de color según el tipo.
- **`OT_VisualizeSelectedJob`**  
  Visualiza las curvas compensadas de un Job específico en una colección dedicada.
- **`OT_VisualizeJobsOrder`**  
  Muestra números al costado de los objetos para indicar el orden de ejecución de los Jobs.

### 4. **Gestión y visualización de pestañas (tabs)**
- **`OT_VisualizeTabs`**  
  Crea objetos visuales que representan pestañas en las curvas seleccionadas, en modo **AUTO** o **MANUAL**.
- **`OT_AddCustomTab`**  
  Añade pestañas manuales en puntos seleccionados de una curva en modo edición.
- **`OT_ResetCustomTabs`**  
  Elimina todas las pestañas manuales de un Job.

### 5. **Exportación de G-code**
- **`OT_ExportJobs`**  
  Genera el archivo G-code a partir de los Jobs definidos, aplicando compensaciones y pestañas, y escribe el resultado en la ruta seleccionada.

---

## 🔑 Funciones auxiliares
- **`create_offset_curve_object`**  
  Crea un objeto curva a partir de una lista de puntos compensados, alineándolo con un objeto de referencia si se indica.
- **`_create_tab_visual`** (método interno de `OT_VisualizeTabs`)  
  Construye la geometría y texto que representan cada pestaña visualizada.

---

## 🎯 En resumen
Este operador centraliza:
- **Selección de salida** (archivo G-code).  
- **Gestión de Jobs** (crear, eliminar, mover, limpiar).  
- **Visualización** (compensaciones, pestañas, orden de Jobs).  
- **Exportación final** (generación de G-code).  

👉 Es el **núcleo operativo del addon CNC**, conectando la geometría de Blender con la lógica de compensación y exportación para máquinas CNC.

---


---


utils.py
---

## 📌 Propósito general
El archivo `utils.py` provee:
- **PropertyGroups** para almacenar parámetros de Jobs y pestañas.  
- **Funciones geométricas** para limpiar, simplificar y compensar polilíneas.  
- **Funciones de creación** de curvas y pestañas en Blender.  
- **Rutinas de generación de G-code** robusto con soporte de pestañas.

---

## 🛠️ Clases de propiedades

### 1. **CNCTabItem**
- Representa una pestaña manual en la curva.  
- Guarda coordenadas `x, y`.

### 2. **CNCJobItem**
- Define un **Job CNC** con parámetros:  
  - Geometría: `object_names`, `diameter`, `comp`.  
  - Profundidad: `depth_final`, `depth_per_pass`.  
  - Velocidades: `feed`, `plunge`.  
  - Seguridad: `z_safe`.  
  - Muestreo: `sample_steps`.  
  - Pestañas: `tabs_enable`, `tab_length`, `tab_thickness`, `tab_count`, `tab_mode`, `custom_tabs`.  
  - Dirección de corte: `CLOCKWISE` o `COUNTERCLOCKWISE`.

### 3. **CNCProperties**
- Propiedades globales de la escena:  
  - Parámetros de herramienta (`diameter`, `depth_final`, etc.).  
  - Tipo de compensación (`comp`, `contour_generation_mode`).  
  - Muestreo (`sample_steps`).  
  - Ruta de archivo (`file_path`).  
  - Opciones de visualización (`auto_clear_paths`, `show_additional_info`, `contour_coord_mode`).  
  - Lista de Jobs (`jobs`, `jobs_index`).

---

## 🔑 Funciones geométricas y de compensación

- **`clean_polyline`**: elimina duplicados y asegura cierre correcto.  
- **`is_clockwise`**: determina orientación CW/CCW usando área con signo.  
- **`normalize_poly_orientation`**: fuerza orientación CCW.  
- **`apply_cut_direction`**: ajusta polilínea según dirección de corte.  
- **`simplificar_polilinea`**: reduce puntos muy cercanos.  
- **`offset_polyline`**: aplica offset robusto (usa Shapely si disponible).  
- **`offset_polyline_fallback`**: algoritmo propio de offset si Shapely falla.  
- **`get_offset_for_compensation`**: calcula offset según compensación (Interior = negativo, Exterior = positivo).  
- **`compensated_poly`**: pipeline completo de compensación (orientación, offset, dirección).

---

## 🎨 Funciones de creación y análisis

- **`sample_curve_object_to_xy_list`**: convierte curvas Blender en listas de polilíneas XY.  
- **`create_offset_curve_object`**: crea un objeto CURVE en Blender a partir de puntos compensados.  
- **`compute_tab_ranges_on_poly`**: calcula rangos de pestañas distribuidos en el perímetro.  
- **`point_distance_along_poly`**: devuelve distancias acumuladas a lo largo de la polilínea.  
- **`path_length`**: calcula longitud total de una polilínea.  
- **`compute_selected_contour_size`**: obtiene tamaño, perímetro, centro y bounding box del primer contorno seleccionado.

---

## ⚙️ Generación de G-code

- **`generate_gcode_for_poly`**  
  - Aplica compensación robusta.  
  - Genera pasadas en profundidad (`depth_per_pass` hasta `depth_final`).  
  - Inserta pestañas en la última pasada si están habilitadas.  
  - Produce líneas G-code con movimientos seguros (`Z safe`), feed y plunge correctos.  
  - Maneja entrada/salida de pestañas con elevación temporal de la herramienta.

---

## 🎯 En resumen
Este archivo es el **núcleo matemático y lógico** del addon CNC:
- Define cómo se guardan los parámetros de Jobs y pestañas.  
- Implementa algoritmos de **compensación geométrica** y **offset**.  
- Traduce curvas Blender en polilíneas listas para CNC.  
- Genera el **G-code final**, integrando pestañas y pasadas.


---

## 📌 Resumen general del addon
Este addon es un **toolkit CNC para Blender** que permite:
1. Seleccionar curvas y convertirlas en trayectorias.  
2. Configurar parámetros globales y por trabajo (profundidad, compensación, pestañas).  
3. Visualizar compensaciones y trayectorias dentro de Blender.  
4. Exportar las trayectorias como **G-code listo para CNC**, con pestañas optimizadas y múltiples pasadas.

---


