ParamManagerScripts/backend/script_groups/XML Parser to SCL/x8_manual_gui.py

147 lines
4.4 KiB
Python

"""
x8_manual_gui.py - Wrapper Simple para XML→SCL
Este script es un wrapper simple que:
1. Abre un cuadro de diálogo para seleccionar archivo XML
2. Abre un cuadro de diálogo para seleccionar directorio de destino
3. Ejecuta automáticamente x0_main.py en modo simple
No requiere GUI compleja, solo usa los cuadros de diálogo nativos de Windows.
"""
import tkinter as tk
from tkinter import filedialog, messagebox
import os
import sys
import subprocess
def main():
"""Función principal - Solo cuadros de diálogo y ejecución"""
# Configurar el directorio de script
script_dir = os.path.dirname(os.path.abspath(__file__))
x0_main_path = os.path.join(script_dir, "x0_main.py")
# Verificar que x0_main.py existe
if not os.path.exists(x0_main_path):
print(f"Error: No se encontró x0_main.py en: {x0_main_path}", file=sys.stderr)
sys.exit(1)
print("=== XML -> SCL Converter ===")
print("Selecciona el archivo XML y directorio de destino...")
print()
# Crear ventana oculta para los cuadros de diálogo
root = tk.Tk()
root.withdraw() # Ocultar la ventana principal
try:
# 1. Seleccionar archivo XML
print("1. Seleccionando archivo XML...")
source_xml = filedialog.askopenfilename(
title="Seleccionar archivo XML de Siemens TIA Portal",
filetypes=[("Archivos XML", "*.xml"), ("Todos los archivos", "*.*")],
initialdir=script_dir,
)
if not source_xml:
print("Operación cancelada por el usuario.")
sys.exit(0)
print(f" Archivo seleccionado: {os.path.basename(source_xml)}")
# 2. Seleccionar directorio de destino
print("2. Seleccionando directorio de destino...")
dest_dir = filedialog.askdirectory(
title="Seleccionar directorio de destino", initialdir=script_dir
)
if not dest_dir:
print("Operación cancelada por el usuario.")
sys.exit(0)
print(f" Directorio seleccionado: {dest_dir}")
# 3. Generar nombre de archivo de salida
base_name = os.path.splitext(os.path.basename(source_xml))[0]
dest_filename = f"{base_name}.scl"
dest_scl = os.path.join(dest_dir, dest_filename)
print(f"3. Archivo de salida: {dest_filename}")
print()
# 4. Confirmar operación
confirm = messagebox.askyesno(
"Confirmar Conversión",
f"¿Convertir el archivo?\n\n"
f"Origen: {os.path.basename(source_xml)}\n"
f"Destino: {dest_scl}\n\n"
f"¿Continuar?",
)
if not confirm:
print("Operación cancelada por el usuario.")
sys.exit(0)
# 5. Ejecutar conversión
print("4. Ejecutando conversión...")
print("=" * 50)
cmd = [
sys.executable,
x0_main_path,
"--source-xml",
source_xml,
"--dest-scl",
dest_scl,
]
# Ejecutar proceso
result = subprocess.run(
cmd,
cwd=script_dir,
capture_output=False, # Mostrar salida en tiempo real
text=True,
)
# 6. Verificar resultado
print("=" * 50)
if result.returncode == 0 and os.path.exists(dest_scl):
print("✅ CONVERSIÓN COMPLETADA EXITOSAMENTE")
print(f"📁 Archivo generado: {dest_scl}")
# Preguntar si abrir el directorio
open_dir = messagebox.askyesno(
"Conversión Exitosa",
f"La conversión se completó exitosamente.\n\n"
f"Archivo generado:\n{dest_scl}\n\n"
f"¿Deseas abrir el directorio de destino?",
)
if open_dir:
os.startfile(dest_dir)
else:
print("❌ ERROR EN LA CONVERSIÓN")
print("Revisa los mensajes de error arriba.")
messagebox.showerror(
"Error en Conversión",
"La conversión falló. Revisa los mensajes de error en la consola.",
)
except Exception as e:
print(f"❌ ERROR INESPERADO: {e}")
messagebox.showerror(
"Error Inesperado", f"Error inesperado durante la conversión:\n{e}"
)
sys.exit(1)
finally:
# Cerrar la ventana oculta
root.destroy()
if __name__ == "__main__":
main()