diff --git a/backend/script_groups/IO_adaptation/.doc/MemoriaDeEvolucion.md b/backend/script_groups/IO_adaptation/.doc/MemoriaDeEvolucion.md index ab80d1c..c3a4c8d 100644 --- a/backend/script_groups/IO_adaptation/.doc/MemoriaDeEvolucion.md +++ b/backend/script_groups/IO_adaptation/.doc/MemoriaDeEvolucion.md @@ -66,4 +66,15 @@ Después del paso 2, se puede usar : - La configuración de las rutas base de Obsidian (`ObsideanDir`, `ObsideanProjectsBase`) se ha movido al `level3` para una mejor organización de la configuración. - El prompt generado refleja automáticamente estas rutas configurables, asegurando que las herramientas de IA siempre utilicen las ubicaciones correctas de los archivos. +**Conversión dual de archivos Excel a Markdown (x3_excel_to_md.py):** +- **Nueva funcionalidad**: El script ahora realiza dos conversiones en una sola ejecución: + 1. Convierte el Excel de tags de TIA Portal a 'Master IO Tags.md' (funcionalidad existente) + 2. Convierte el Excel de IO desde esquema eléctrico a 'Hardware_ED.md' (nueva funcionalidad) +- **Configuración de archivo de IO**: Utiliza la configuración `io_excel_file_from_ediagram` del `level3` para obtener la ruta del archivo Excel de IO desde el esquema eléctrico. +- **Conversión directa**: La nueva función `convert_io_excel_to_markdown()` convierte directamente la tabla del Excel a formato Markdown sin filtros ni adaptaciones, manteniendo la estructura original de columnas. +- **Manejo de celdas vacías**: Las celdas vacías del Excel se convierten en un espacio ' ' en el archivo Markdown para mantener la estructura de la tabla. +- **Manejo de errores robusto**: Incluye validaciones para verificar la existencia del archivo Excel, que no esté vacío, y manejo de excepciones durante la lectura y escritura. +- **Escape de caracteres**: Implementa escape automático de caracteres especiales de Markdown (como `|`) para evitar errores de formato en las tablas. +- **Función principal unificada**: Se ha creado una función `main()` que ejecuta ambas conversiones secuencialmente, proporcionando una experiencia de usuario más fluida y organizada. + diff --git a/backend/script_groups/IO_adaptation/script_config.json b/backend/script_groups/IO_adaptation/script_config.json index 13aa7b9..d82d294 100644 --- a/backend/script_groups/IO_adaptation/script_config.json +++ b/backend/script_groups/IO_adaptation/script_config.json @@ -10,6 +10,7 @@ "level3": { "ObsideanDir": "C:\\Users\\migue\\OneDrive\\Miguel\\Obsidean\\Trabajo\\VM", "ObsideanProjectsBase": "\\04-SIDEL", + "io_excel_file_from_ediagram": "C:/Trabajo/SIDEL/13 - E5.007560 - Modifica O&U - SAE235/Reporte/IO.xlsx", "siemens_exp_directory": "C:\\Trabajo\\SIDEL\\13 - E5.007560 - Modifica O&U - SAE235\\Reporte\\ExportTia", "siemens_tia_project": "C:/Trabajo/SIDEL/13 - E5.007560 - Modifica O&U - SAE235/InLavoro/PLC/SSAE0235/_NEW/SAE235_v0.4", "tags_exp_directory": "C:\\Trabajo\\SIDEL\\13 - E5.007560 - Modifica O&U - SAE235\\Reporte\\IOTags" diff --git a/backend/script_groups/IO_adaptation/x3_excel_to_md.py b/backend/script_groups/IO_adaptation/x3_excel_to_md.py index e83d125..6c5d6d9 100644 --- a/backend/script_groups/IO_adaptation/x3_excel_to_md.py +++ b/backend/script_groups/IO_adaptation/x3_excel_to_md.py @@ -1,6 +1,7 @@ """ convert Excel Tags to md : This script converts Excel files containing tags into Markdown tables. Updated to work with a single Excel file and filter based on paths defined in a JSON config. +Also converts IO Excel file from electrical diagram to Markdown. """ # Standard library imports @@ -116,6 +117,116 @@ def load_path_config(): return None +def convert_io_excel_to_markdown(): + """ + Convierte el archivo Excel de IO desde el esquema eléctrico a Markdown. + Utiliza la configuración io_excel_file_from_ediagram para obtener la ruta del archivo. + """ + try: + configs = load_configuration() + working_directory = configs.get("working_directory") + level2_configs = configs.get("level2", {}) + level3_configs = configs.get("level3", {}) + io_excel_file = level3_configs.get("io_excel_file_from_ediagram") + resultados_exp_directory = level2_configs.get("resultados_exp_directory", ".") + + if not working_directory or not os.path.isdir(working_directory): + print( + f"Error: El directorio de trabajo '{working_directory}' no es válido." + ) + return False + except Exception as e: + print(f"Error al cargar la configuración: {e}") + return False + + working_directory_abs = os.path.abspath(working_directory) + print(f"Usando directorio de trabajo: {working_directory_abs}") + + # Construir la ruta del archivo Excel de IO + if io_excel_file: + excel_file_path = os.path.join(working_directory_abs, io_excel_file) + if not os.path.exists(excel_file_path): + print(f"Error: El archivo Excel de IO '{excel_file_path}' no existe.") + return False + else: + print("Error: 'io_excel_file_from_ediagram' no está configurado en level3.") + return False + + print(f"Procesando archivo Excel de IO: {excel_file_path}...") + + output_dir_abs = os.path.join(working_directory_abs, resultados_exp_directory) + os.makedirs(output_dir_abs, exist_ok=True) + output_md_filename = "Hardware_ED.md" + output_md_filepath_abs = os.path.join(output_dir_abs, output_md_filename) + + try: + # Leer el Excel de IO + excel_data = pd.read_excel(excel_file_path, sheet_name=0) + + # Verificar que el archivo no esté vacío + if excel_data.empty: + print(f"Error: El archivo Excel '{excel_file_path}' está vacío.") + return False + + # Obtener las columnas del Excel + columns = list(excel_data.columns) + print(f"Columnas encontradas en el Excel: {columns}") + + # Crear el contenido Markdown + markdown_content = [] + markdown_content.append("# IO desde Esquema Eléctrico\n") + + # Crear la tabla Markdown + if len(columns) > 0: + # Crear el encabezado de la tabla + header = "| " + " | ".join(columns) + " |" + markdown_content.append(header) + + # Crear el separador + separator = "| " + " | ".join(["---"] * len(columns)) + " |" + markdown_content.append(separator) + + # Agregar las filas de datos + for _, row in excel_data.iterrows(): + row_data = [] + for col in columns: + cell_value = str(row.get(col, "")).strip() + # Si la celda está vacía, usar un espacio + if not cell_value or cell_value == "nan": + cell_value = " " + # Escapar caracteres especiales de Markdown si es necesario + if "|" in cell_value: + cell_value = cell_value.replace("|", "\\|") + row_data.append(cell_value) + + row_line = "| " + " | ".join(row_data) + " |" + markdown_content.append(row_line) + + # Escribir el archivo Markdown + try: + with open(output_md_filepath_abs, "w", encoding="utf-8") as f: + f.write("\n".join(markdown_content)) + print( + f"¡Éxito! Archivo Markdown de IO generado en: {output_md_filepath_abs}" + ) + return True + except IOError as e: + print( + f"Error al escribir el archivo Markdown '{output_md_filepath_abs}': {e}" + ) + return False + + except FileNotFoundError: + print(f"Error: El archivo '{excel_file_path}' no se encontró.") + return False + except pd.errors.EmptyDataError: + print(f"Error: El archivo '{excel_file_path}' está vacío.") + return False + except Exception as e: + print(f"Error al procesar el archivo Excel de IO: {e}") + return False + + def convert_excel_to_markdown_tables(): """ Busca un archivo Excel en el directorio configurado, lo procesa y genera @@ -291,5 +402,26 @@ def convert_excel_to_markdown_tables(): print("No se generó contenido para el archivo Markdown.") -if __name__ == "__main__": +def main(): + """ + Función principal que ejecuta ambas conversiones: + 1. Convierte el Excel de tags de TIA Portal a 'Master IO Tags.md' + 2. Convierte el Excel de IO desde esquema eléctrico a 'IO Adapted.md' + """ + print("=== Conversión de archivos Excel a Markdown ===\n") + + # 1. Convertir Excel de tags de TIA Portal + print("1. Convirtiendo Excel de tags de TIA Portal...") convert_excel_to_markdown_tables() + + print("\n" + "=" * 50 + "\n") + + # 2. Convertir Excel de IO desde esquema eléctrico + print("2. Convirtiendo Excel de IO desde esquema eléctrico...") + convert_io_excel_to_markdown() + + print("\n=== Proceso completado ===") + + +if __name__ == "__main__": + main() diff --git a/data/launcher_history.json b/data/launcher_history.json index c9ee440..8fb6a25 100644 --- a/data/launcher_history.json +++ b/data/launcher_history.json @@ -1,5 +1,18 @@ { "history": [ + { + "id": "5115260f", + "group_id": "2", + "script_name": "main.py", + "executed_date": "2025-07-14T14:04:23.520003Z", + "arguments": [], + "working_directory": "D:/Proyectos/Scripts/RS485/MaselliSimulatorApp", + "python_env": "tia_scripting", + "executable_type": "pythonw.exe", + "status": "running", + "pid": 39460, + "execution_time": null + }, { "id": "8f721c30", "group_id": "2", diff --git a/data/log.txt b/data/log.txt index c15aaa7..a3eb0e5 100644 --- a/data/log.txt +++ b/data/log.txt @@ -1,21 +1,19 @@ -[18:10:38] Iniciando ejecución de x4_prompt_generator.py en C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens... -[18:10:38] Generador de prompt para adaptación de IO -[18:10:38] ========================================= -[18:10:38] Usando directorio de trabajo: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens -[18:10:38] Usando ruta de Obsidian desde configuración: C:\Users\migue\OneDrive\Miguel\Obsidean\Trabajo\VM\04-SIDEL\00 - MASTER\MIXER\IO -[18:10:38] Usando carpeta de equivalencias en Obsidian: C:\Users\migue\OneDrive\Miguel\Obsidean\Trabajo\VM\04-SIDEL\00 - MASTER\MIXER\IO -[18:10:38] ¡Prompt generado y copiado al portapapeles con éxito! -[18:10:38] Prompt guardado en: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens\IO_Adaptation_Prompt.txt -[18:11:10] Ejecución de x4_prompt_generator.py finalizada (success). Duración: 0:00:31.385093. -[18:11:10] Log completo guardado en: D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\IO_adaptation\.log\log_x4_prompt_generator.txt -[10:11:20] Ejecutando script GUI: main.py -[10:11:20] Entorno Python: tia_scripting -[10:11:20] Ejecutable: pythonw.exe (sin logging) -[10:11:20] Comando: C:\Users\migue\miniconda3\envs\tia_scripting\pythonw.exe D:/Proyectos/Scripts/RS485/MaselliSimulatorApp\main.py -[10:11:20] Directorio: D:/Proyectos/Scripts/RS485/MaselliSimulatorApp -[10:11:20] Encoding: UTF-8 (PYTHONUTF8=1, PYTHONIOENCODING=utf-8) -[10:11:20] ================================================== -[10:11:20] Script GUI ejecutado sin logging (pythonw.exe) -[10:11:20] PID: 22396 -[10:11:20] ================================================== -[10:11:20] ID de ejecución: 8f721c30 +[16:52:51] Iniciando ejecución de x3_excel_to_md.py en C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens... +[16:52:52] === Conversión de archivos Excel a Markdown === +[16:52:52] 1. Convirtiendo Excel de tags de TIA Portal... +[16:52:52] Usando directorio de trabajo: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens +[16:52:52] Configuración de paths cargada desde: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens\io_paths_config.json +[16:52:52] Buscando archivos Excel en: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\IOTags +[16:52:52] Archivo Excel encontrado automáticamente: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\IOTags\All_PLCTags.xlsx +[16:52:52] Procesando archivo Excel: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\IOTags\All_PLCTags.xlsx... +[16:52:52] Paths configurados para procesar: ['Inputs', 'Outputs', 'OutputsFesto', 'IO Not in Hardware\\InputsMaster', 'IO Not in Hardware\\OutputsMaster'] +[16:52:53] ¡Éxito! Archivo Markdown generado en: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens\Resultados\Master IO Tags.md +[16:52:53] ================================================== +[16:52:53] 2. Convirtiendo Excel de IO desde esquema eléctrico... +[16:52:53] Usando directorio de trabajo: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens +[16:52:53] Procesando archivo Excel de IO: C:/Trabajo/SIDEL/13 - E5.007560 - Modifica O&U - SAE235/Reporte/IO.xlsx... +[16:52:53] Columnas encontradas en el Excel: ['Unnamed: 0', 'Unnamed: 1', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4', 'Unnamed: 5'] +[16:52:53] ¡Éxito! Archivo Markdown de IO generado en: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens\Resultados\Hardware_ED.md +[16:52:53] === Proceso completado === +[16:52:53] Ejecución de x3_excel_to_md.py finalizada (success). Duración: 0:00:01.794236. +[16:52:53] Log completo guardado en: D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\IO_adaptation\.log\log_x3_excel_to_md.txt