ParamManagerScripts/backend/script_groups/XML Parser to SCL/processors/duplicate_uid_handler.py

66 lines
2.6 KiB
Python

# processors/duplicate_uid_handler.py
"""
Manejador de UIDs duplicados en el JSON
"""
def detect_and_resolve_duplicate_uids(data):
"""
Detecta y resuelve UIDs duplicados en el JSON de datos.
Estrategia: Renombrar UIDs duplicados añadiendo sufijo _dup1, _dup2, etc.
"""
uid_counts = {}
modifications_made = 0
print("INFO: Detectando UIDs duplicados...")
# Primera pasada: contar UIDs
for network in data.get("networks", []):
network_id = network.get("id", "Unknown")
for instruction in network.get("logic", []):
uid = instruction.get("instruction_uid")
if uid:
if uid not in uid_counts:
uid_counts[uid] = []
uid_counts[uid].append((network_id, instruction))
# Segunda pasada: renombrar duplicados
for uid, instances in uid_counts.items():
if len(instances) > 1:
print(f"INFO: UID duplicado encontrado: {uid} ({len(instances)} instancias)")
# Mantener la primera instancia, renombrar las demás
for i, (network_id, instruction) in enumerate(instances[1:], 1):
old_uid = instruction["instruction_uid"]
new_uid = f"{old_uid}_dup{i}"
instruction["instruction_uid"] = new_uid
modifications_made += 1
print(f" - Red {network_id}: UID {old_uid}{new_uid}")
# También actualizar referencias en otras instrucciones
update_uid_references(data, old_uid, new_uid, network_id)
if modifications_made > 0:
print(f"INFO: Se resolvieron {modifications_made} UIDs duplicados")
else:
print("INFO: No se encontraron UIDs duplicados")
return modifications_made > 0
def update_uid_references(data, old_uid, new_uid, target_network_id):
"""
Actualiza las referencias al UID antiguo en conexiones de otras instrucciones
dentro de la misma red.
"""
for network in data.get("networks", []):
if network.get("id") != target_network_id:
continue
for instruction in network.get("logic", []):
# Buscar en inputs que tengan source_instruction_uid
for pin_name, pin_info in instruction.get("inputs", {}).items():
if isinstance(pin_info, dict):
if pin_info.get("source_instruction_uid") == old_uid:
pin_info["source_instruction_uid"] = new_uid
print(f" - Actualizada referencia en instrucción {instruction.get('instruction_uid')} pin {pin_name}")