From f9796cb7bfcd340d8352ef437372401a64aa35dd Mon Sep 17 00:00:00 2001 From: Miguel Date: Tue, 8 Oct 2024 17:34:42 +0200 Subject: [PATCH] Inicial --- funciones_comunes/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 202 bytes .../funciones_base.cpython-310.pyc | Bin 0 -> 13023 bytes .../manejoArchivos.cpython-310.pyc | Bin 0 -> 1377 bytes funciones_comunes/funciones_base.py | 524 ++++++++++++++++++ funciones_comunes/manejoArchivos.py | 50 ++ 6 files changed, 576 insertions(+) create mode 100644 funciones_comunes/__init__.py create mode 100644 funciones_comunes/__pycache__/__init__.cpython-310.pyc create mode 100644 funciones_comunes/__pycache__/funciones_base.cpython-310.pyc create mode 100644 funciones_comunes/__pycache__/manejoArchivos.cpython-310.pyc create mode 100644 funciones_comunes/funciones_base.py create mode 100644 funciones_comunes/manejoArchivos.py diff --git a/funciones_comunes/__init__.py b/funciones_comunes/__init__.py new file mode 100644 index 0000000..33045fc --- /dev/null +++ b/funciones_comunes/__init__.py @@ -0,0 +1,2 @@ +from .funciones_base import * +from .manejoArchivos import * \ No newline at end of file diff --git a/funciones_comunes/__pycache__/__init__.cpython-310.pyc b/funciones_comunes/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7913ace053e48b79203fe23a877482eda146df64 GIT binary patch literal 202 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 XM^vm!>(NbkfKpa+)s%`8x+iun?+ks}4-njM& zP$hbVNAi^uufPGA@undH;mBiqW_HH@zL}^SHxdFPzW91XdxU($!{*>{cns4#2O)@{ z70IbzS9<^bN_jzC%3nGNUdz zDk~|+cP_%Xju(RAHsYJ)9iz=a>@P5FPR8% zcgc>J2w_GS?3^tbr0uouk`%_PM%E@RQp}xp$y2LRBP%(vpdX3D&Q{bS)zZ#2xZ9~* zc}US&o5D^&1)mP#1bJKAP7P_)eOGiJHw}9nXqdo~S2!GA-XLGinxYtHa^|GeThy zvkf8+VjA#--l5UYAkYI){XA4_*jRD`L@mh`J*R%pm-LG2TR<7@C_86$BtUz8 zvcXBX1Oi2P!Jw)lPg=e~8nWPNlV?q(wA5)~JvGPWds(OW{`=`fX$`Ng7U>iitjhY> z8%&C@rlu(-(p(d_j6zb!r4gle ziJ2b)-Vob3uIF{e^-TaF-$BQsDqAT$KduM31LVTf)QK%{bVKCWLw<05joY9%$mSp% z@NG8WL$2?@aRPHautqpck9!K6Rhy6{*=!TRE`Wz6_8)J@8<_sT5#U)^J$jM;w-f%j zAQmfBhwFA&n=`7hHnLD-N9za$R#sQx1E}ynu1xpAl5ejy9=E^Yy1A;+wbwoP$Y51= zh0193E8zMrC?GiklqD`|;3b7|tP!qfPs`d$-Q5UL)H^6{p};sEY9C-DH?pBUU-6@v Z67x## - Necessaria Manutenzione Filtro" -> +# "A[[digits]]/[[digits]]/[[digits]] Air - M - Necessaria Manutenzione Filtro" +# +# Este procesamiento se aplica a las celdas clave +def compactar_celda_clave_siemens(celda_original): + if pd.isnull(celda_original): + return celda_original + + def reemplazar(match): + if match.group(1): # Si hay contenido dentro de <> + return f"<{match.group(1)}>" + return "[[digits]]" + + # Reemplaza dígitos fuera de <> con [[digits]], y preserva el contenido dentro de <> + return re.sub(r"<(.*?)>|\d+", reemplazar, str(celda_original)) + + +# SIEMENS +def texto_requiere_traduccion_siemens(texto, logger): + palabras = re.findall(r"\b\w{4,}\b", texto) + campos_especiales = re.findall(r"<.*?>", texto) + requiere_traduccion = len(palabras) > 0 or len(campos_especiales) != len( + re.findall(r"<#>", texto) + ) + logger.debug( + f"Decisión de traducción para texto '{texto}': {'Sí' if requiere_traduccion else 'No'} (palabras > 3 letras: {len(palabras) > 0}, solo campos especiales: {len(campos_especiales) == len(re.findall(r'<#>', texto))})" + ) + return requiere_traduccion + +# SIEMENS +def texto_con_campos_especiales_siemens(texto): + campos_especiales = len(re.findall(r"<#>", texto) ) + return campos_especiales > 0 + + + +# SIEMENS +# +# Transforma: "A[[digits]]/[[digits]]/[[digits]] Air - M - Necessaria Manutenzione Filtro" -> +# "A<>/<>/<> Air - M<#>" /> - Necessaria Manutenzione Filtro" +# +# Este procesamiento se aplica a las celdas traducidas +def compactar_celda_traducida_siemens(celda_traducida): + if pd.isnull(celda_traducida): + return celda_traducida + celda_traducida = compactar_celda_clave_siemens(celda_traducida) + + def reemplazar(match): + if match.group(1): # Si hay contenido dentro de <> + return "<#>" + return "<>" + + # Reemplaza <...> con <#> y [[digits]] con <> + return re.sub(r"<(.*?)>|\[\[digits\]\]", reemplazar, str(celda_traducida)) + +# SIEMENS +# de "A271/47/6 Air - M - Necessaria Manutenzione Filtro" -> [271,47,6] +# Obtener la secuencias de dígitos por [[digits]] +def obtener_digitos_celda_original_siemens(celda_original): + if pd.isnull(celda_original): + return [] + + # Primero, reemplazamos temporalmente el contenido de los tags con un marcador + texto_sin_tags = re.sub(r'<[^>]*>', '<>', str(celda_original)) + + # Ahora buscamos los dígitos + digitos = re.findall(r'\d+', texto_sin_tags) + + return digitos + +# SIEMENS +# Original Traducida +# Transforma: "A271/47/6 Air - M - Necessaria Manutenzione Filtro" , "A<>/<>/<> Air - M<#> - Filter Maintenance Required" -> +# "A271/47/6 Air - M - Necessaria Manutenzione Filtro" +# +# Este procesamiento se aplica a las celdas traducidas para regresar al valor original +def decompactar_celda_traducida_siemens(celda_original, celda_traducida): + digitos = obtener_digitos_celda_original_siemens(celda_original) + celda_destino = celda_traducida + + # Replace <> with digits + for d in digitos: + celda_destino = celda_destino.replace("<>", d, 1) + + # Replace <#> with original content within <> + original_tags = re.findall(r"<.*?>", celda_original) + translated_tags = re.findall(r"<#>", celda_destino) + + for orig, trans in zip(original_tags, translated_tags): + celda_destino = celda_destino.replace(trans, orig, 1) + + return celda_destino + + +# +# SIEMENS +# +def verificar_celda_traducida_siemens(celda_clave, celda_traducida): + # Contar los placeholders de dígitos + digitos_clave = celda_clave.count("[[digits]]") + digitos_traducida = celda_traducida.count("<>") + + # Contar los placeholders de tags + tags_clave = sum(1 for tag in re.findall(r"<.*?>", celda_clave) if tag != "[[digits]]") + tags_traducida = celda_traducida.count("<#>") + + # Verificar si las cantidades coinciden + if digitos_clave == digitos_traducida and tags_clave == tags_traducida: + return True , "" + else: + text_error = f"Error de verificación:" + f" - Celda clave: {celda_clave}" + f" - Celda traducida: {celda_traducida}" + text_error += f" - Dígitos en clave: {digitos_clave}, Dígitos en traducida: {digitos_traducida}" + text_error += f" - Tags en clave: {tags_clave}, Tags en traducida: {tags_traducida}" + return False, text_error + + +# ALLEN BRADLEY +def texto_requiere_traduccion_ab(texto, logger): + palabras = re.findall(r"\b\w{4,}\b", texto) + campos_especiales = re.findall(r"/\*.*?\*/", texto) + total_palabras_largas = len(palabras) > 0 + total_campos_especiales = len(campos_especiales) + total_campos_marcados = len(re.findall(r"/\*#\*/", texto)) + solo_campos_especiales = total_campos_especiales == total_campos_marcados + requiere_traduccion = total_palabras_largas or not solo_campos_especiales + + logger.debug( + f"Decisión de traducción para texto '{texto}': {'Sí' if requiere_traduccion else 'No'} " + f"(palabras > 3 letras: {total_palabras_largas}, " + f"solo campos especiales: {solo_campos_especiales})" + ) + return requiere_traduccion + + + +# ALLEN BRADLEY +# Transforma: "A271/47/6 Air - M/*field ref="0" */ - Necessaria Manutenzione Filtro" -> +# "A[[digits]]/[[digits]]/[[digits]] Air - M/*field ref="[[digits]]" */ - Necessaria Manutenzione Filtro" +# +# Este procesamiento se aplica a las celdas clave +def compactar_celda_clave_ab(celda_original): + if pd.isnull(celda_original): + return celda_original + + def reemplazar(match): + if match.group(1): # Si hay contenido dentro de /*...*/ + return f"/*{match.group(1)}*/" + return "[[digits]]" + + # Reemplaza dígitos fuera de /*...*/ con [[digits]], y preserva el contenido dentro de /*...*/ + return re.sub(r"/\*(.*?)\*/|\d+", reemplazar, str(celda_original)) + + +# ALLEN BRADLEY +# Transforma: "A[[digits]]/[[digits]]/[[digits]] Air - M/*field ref="[[digits]]" */ - Necessaria Manutenzione Filtro" -> +# "A<>/<>/<> Air - M/*#*/ - Necessaria Manutenzione Filtro" +# +# Este procesamiento se aplica a las celdas traducidas +def compactar_celda_traducida_ab(celda_traducida): + if pd.isnull(celda_traducida): + return celda_traducida + celda_traducida = compactar_celda_clave_ab(celda_traducida) + + def reemplazar(match): + if match.group(1): # Si hay contenido dentro de /*...*/ + return "/*#*/" + return "<>" + + # Reemplaza /*...*/ con /*#*/ y [[digits]] con <> + return re.sub(r"/\*(.*?)\*/|\[\[digits\]\]", reemplazar, str(celda_traducida)) + + +# ALLEN BRADLEY +# De "A271/47/6 Air - M/*field ref="0" */ - Necessaria Manutenzione Filtro" -> [271,47,6] +# Obtener las secuencias de dígitos para [[digits]] +def obtener_digitos_celda_original_ab(celda_original): + if pd.isnull(celda_original): + return [] + + # Reemplazamos temporalmente el contenido de los comentarios con un marcador + texto_sin_tags = re.sub(r'/\*[^*]*\*/', '<>', str(celda_original)) + + # Ahora buscamos los dígitos + digitos = re.findall(r'\d+', texto_sin_tags) + + return digitos + + +# ALLEN BRADLEY +# Transformación para regresar al valor original +def decompactar_celda_traducida_ab(celda_original, celda_traducida): + digitos = obtener_digitos_celda_original_ab(celda_original) + celda_destino = celda_traducida + + # Reemplaza <> con dígitos + for d in digitos: + celda_destino = celda_destino.replace("<>", d, 1) + + # Reemplaza /*#*/ con el contenido original dentro de /*...*/ + original_tags = re.findall(r"/\*.*?\*/", celda_original) + translated_tags = re.findall(r"/\*#\*/", celda_destino) + + for orig, trans in zip(original_tags, translated_tags): + celda_destino = celda_destino.replace(trans, orig, 1) + + return celda_destino + + +# +# ALLEN BRADLEY +# +def verificar_celda_traducida_ab(celda_clave, celda_traducida): + # Contar los placeholders de dígitos + digitos_clave = celda_clave.count("[[digits]]") + digitos_traducida = celda_traducida.count("<>") + + # Contar los placeholders de comentarios + tags_clave = sum(1 for tag in re.findall(r"/\*.*?\*/", celda_clave) if tag != "[[digits]]") + tags_traducida = celda_traducida.count("/*#*/") + + # Verificar si las cantidades coinciden + if digitos_clave == digitos_traducida and tags_clave == tags_traducida: + return True, "" + else: + text_error = f"Error de verificación:" + f" - Celda clave: {celda_clave}" + f" - Celda traducida: {celda_traducida}" + text_error += f" - Dígitos en clave: {digitos_clave}, Dígitos en traducida: {digitos_traducida}" + text_error += f" - Comentarios en clave: {tags_clave}, Comentarios en traducida: {tags_traducida}" + return False, text_error + + +# +# ALLEN BRADLEY +# +def texto_con_campos_especiales_ab(texto): + campos_especiales = len(re.findall(r"/\*#\*/", texto)) + return campos_especiales > 0 + + +if __name__ == "__main__": + # SIEMENS + print("****************** SIEMENS ***************************") + celda_original = 'A271/47/6 Air - M - Necessaria Manutenzione Filtro' + celda_original = 'DB/DB/DB' + celda_original = 'Text' + + celda_clave = compactar_celda_clave_siemens(celda_original) + celda_tradc = compactar_celda_traducida_siemens(celda_original) + " TEXTO " + + print() + print("Celda Original : " +celda_original) + print("Celda Clave : " + celda_clave) + print("Celda Traducida: " + celda_tradc) + print("Digitos : " + ','.join(obtener_digitos_celda_original_siemens(celda_original))) + print("Celda : " + decompactar_celda_traducida_siemens(celda_original, celda_tradc)) + print("Celda Original : " + celda_original) + + print(verificar_celda_traducida_siemens(celda_clave=celda_clave, celda_traducida= celda_tradc)) + + # ALLEN BRADLEY + print("****************** ALLEN BRADLEY ***************************") + celda_original = 'A271/47/6 /*N:4 {#1.#4.VFix[1]} NOFILL DP:1*/ m/min SPEED' + celda_original = 'Formats_x000D_Comparing' + + celda_clave = compactar_celda_clave_ab(celda_original) + celda_tradc = compactar_celda_traducida_ab(celda_original) + " TEXTO " + celda_tradc = 'Formatos_x<>D_Comparación' + + print() + print("Celda Original : " +celda_original) + print("Celda Clave : " + celda_clave) + print("Celda Traducida: " + celda_tradc) + print("Digitos : " + ','.join(obtener_digitos_celda_original_ab(celda_original))) + print("Celda : " + decompactar_celda_traducida_ab(celda_original, celda_tradc)) + print("Celda Original : " + celda_original) + + print(verificar_celda_traducida_ab(celda_clave=celda_clave, celda_traducida= celda_tradc)) diff --git a/funciones_comunes/manejoArchivos.py b/funciones_comunes/manejoArchivos.py new file mode 100644 index 0000000..bc9fcca --- /dev/null +++ b/funciones_comunes/manejoArchivos.py @@ -0,0 +1,50 @@ +import pandas as pd +import tkinter as tk +from tkinter import filedialog +import os +import subprocess + +def select_file(extension = "txt"): + """ + Opens a file dialog to select a .db file and returns the selected file path. + """ + root = tk.Tk() + root.withdraw() # Use to hide the tkinter root window + + # Open file dialog and return the selected file path + file_path = filedialog.askopenfilename( + title=f"Select a .{extension} file", + filetypes=((f"{extension} files", f"*.{extension}"), ("All files", "*.*")) + ) + return file_path + +def open_file_explorer(path): + """ + Opens the file explorer at the given path, correctly handling paths with spaces. + """ + # Normalize the path to ensure it's in the correct format + normalized_path = os.path.normpath(path) + + # Check if the path is a directory or a file and format the command accordingly + if os.path.isdir(normalized_path): + # If it's a directory, use the 'explorer' command directly + command = f'explorer "{normalized_path}"' + else: + # If it's a file, use the 'explorer /select,' command to highlight the file in its folder + command = f'explorer /select,"{normalized_path}"' + + # Execute the command using subprocess.run, with shell=True to handle paths with spaces correctly + subprocess.run(command, shell=True) + +def select_directory(): + """ + Opens a file dialog to select a directory and returns the selected directory path. + """ + root = tk.Tk() + root.withdraw() # Use to hide the tkinter root window + + # Open directory dialog and return the selected directory path + directory_path = filedialog.askdirectory( + title="Select a directory" + ) + return directory_path \ No newline at end of file