Se añadió la funcionalidad para convertir un archivo Excel de IO desde un esquema eléctrico a formato Markdown en el script `x3_excel_to_md.py`. Se implementó una nueva función `convert_io_excel_to_markdown()` que utiliza la configuración `io_excel_file_from_ediagram` para obtener la ruta del archivo. Además, se actualizó la documentación en `MemoriaDeEvolucion.md` para reflejar estos cambios y se mejoró el manejo de errores durante la conversión. También se unificó la ejecución de ambas conversiones en una función principal `main()` para una mejor organización del flujo de trabajo.

This commit is contained in:
Miguel 2025-07-14 16:54:55 +02:00
parent c37e485fd3
commit 4d1de71990
5 changed files with 177 additions and 22 deletions

View File

@ -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. - 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. - 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.

View File

@ -10,6 +10,7 @@
"level3": { "level3": {
"ObsideanDir": "C:\\Users\\migue\\OneDrive\\Miguel\\Obsidean\\Trabajo\\VM", "ObsideanDir": "C:\\Users\\migue\\OneDrive\\Miguel\\Obsidean\\Trabajo\\VM",
"ObsideanProjectsBase": "\\04-SIDEL", "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_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", "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" "tags_exp_directory": "C:\\Trabajo\\SIDEL\\13 - E5.007560 - Modifica O&U - SAE235\\Reporte\\IOTags"

View File

@ -1,6 +1,7 @@
""" """
convert Excel Tags to md : This script converts Excel files containing tags into Markdown tables. 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. 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 # Standard library imports
@ -116,6 +117,116 @@ def load_path_config():
return None 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(): def convert_excel_to_markdown_tables():
""" """
Busca un archivo Excel en el directorio configurado, lo procesa y genera 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.") 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() 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()

View File

@ -1,5 +1,18 @@
{ {
"history": [ "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", "id": "8f721c30",
"group_id": "2", "group_id": "2",

View File

@ -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... [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...
[18:10:38] Generador de prompt para adaptación de IO [16:52:52] === Conversión de archivos Excel a Markdown ===
[18:10:38] ========================================= [16:52:52] 1. Convirtiendo Excel de tags de TIA Portal...
[18:10:38] Usando directorio de trabajo: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens [16:52:52] 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 [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
[18:10:38] Usando carpeta de equivalencias en Obsidian: C:\Users\migue\OneDrive\Miguel\Obsidean\Trabajo\VM\04-SIDEL\00 - MASTER\MIXER\IO [16:52:52] Buscando archivos Excel en: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\IOTags
[18:10:38] ¡Prompt generado y copiado al portapapeles con éxito! [16:52:52] Archivo Excel encontrado automáticamente: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\IOTags\All_PLCTags.xlsx
[18:10:38] Prompt guardado en: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens\IO_Adaptation_Prompt.txt [16:52:52] Procesando archivo Excel: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\IOTags\All_PLCTags.xlsx...
[18:11:10] Ejecución de x4_prompt_generator.py finalizada (success). Duración: 0:00:31.385093. [16:52:52] Paths configurados para procesar: ['Inputs', 'Outputs', 'OutputsFesto', 'IO Not in Hardware\\InputsMaster', 'IO Not in Hardware\\OutputsMaster']
[18:11:10] Log completo guardado en: D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\IO_adaptation\.log\log_x4_prompt_generator.txt [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
[10:11:20] Ejecutando script GUI: main.py [16:52:53] ==================================================
[10:11:20] Entorno Python: tia_scripting [16:52:53] 2. Convirtiendo Excel de IO desde esquema eléctrico...
[10:11:20] Ejecutable: pythonw.exe (sin logging) [16:52:53] Usando directorio de trabajo: C:\Trabajo\SIDEL\13 - E5.007560 - Modifica O&U - SAE235\Reporte\Analisis\Siemens
[10:11:20] Comando: C:\Users\migue\miniconda3\envs\tia_scripting\pythonw.exe D:/Proyectos/Scripts/RS485/MaselliSimulatorApp\main.py [16:52:53] Procesando archivo Excel de IO: C:/Trabajo/SIDEL/13 - E5.007560 - Modifica O&U - SAE235/Reporte/IO.xlsx...
[10:11:20] Directorio: D:/Proyectos/Scripts/RS485/MaselliSimulatorApp [16:52:53] Columnas encontradas en el Excel: ['Unnamed: 0', 'Unnamed: 1', 'Unnamed: 2', 'Unnamed: 3', 'Unnamed: 4', 'Unnamed: 5']
[10:11:20] Encoding: UTF-8 (PYTHONUTF8=1, PYTHONIOENCODING=utf-8) [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
[10:11:20] ================================================== [16:52:53] === Proceso completado ===
[10:11:20] Script GUI ejecutado sin logging (pythonw.exe) [16:52:53] Ejecución de x3_excel_to_md.py finalizada (success). Duración: 0:00:01.794236.
[10:11:20] PID: 22396 [16:52:53] Log completo guardado en: D:\Proyectos\Scripts\ParamManagerScripts\backend\script_groups\IO_adaptation\.log\log_x3_excel_to_md.txt
[10:11:20] ==================================================
[10:11:20] ID de ejecución: 8f721c30