Implementación de un método para generar contenido LaTeX completo en el panel, mejorando la representación de resultados y asignaciones. Se optimiza el manejo de expresiones y se añaden mejoras en el parseo de ecuaciones. Se actualiza el historial de cálculos eliminando contenido obsoleto.
This commit is contained in:
parent
68bed8937a
commit
4010de2c12
|
@ -69,7 +69,7 @@ class Class_LaTeX(SympyClassBase):
|
||||||
Class_LaTeX: Nueva instancia con la expresión parseada
|
Class_LaTeX: Nueva instancia con la expresión parseada
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
LaTeX.parse_latex(r"$$Brix_{Bev} = \frac{Brix_{syr} + Brix_{H_2O} \cdot R_M}{R_M + 1}$$")
|
LaTeX.parse_latex(r"$$Brix_{Bev} = \\frac{Brix_{syr} + Brix_{H_2O} \\cdot R_M}{R_M + 1}$$")
|
||||||
"""
|
"""
|
||||||
# Primero intentar conversión manual mejorada (más confiable para subíndices)
|
# Primero intentar conversión manual mejorada (más confiable para subíndices)
|
||||||
try:
|
try:
|
||||||
|
@ -234,6 +234,7 @@ class Class_LaTeX(SympyClassBase):
|
||||||
(r'\\cdot', '*'), # multiplicación
|
(r'\\cdot', '*'), # multiplicación
|
||||||
(r'\\times', '*'), # multiplicación
|
(r'\\times', '*'), # multiplicación
|
||||||
(r'\\div', '/'), # división
|
(r'\\div', '/'), # división
|
||||||
|
(r'\\([a-zA-Z]+)', r'\1'), # convertir \delta a delta, \alpha a alpha, etc.
|
||||||
(r'\{([^}]*)\}', r'\1'), # eliminar llaves restantes
|
(r'\{([^}]*)\}', r'\1'), # eliminar llaves restantes
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -276,19 +277,26 @@ class Class_LaTeX(SympyClassBase):
|
||||||
symbols_dict[name] = sympy.Symbol(name)
|
symbols_dict[name] = sympy.Symbol(name)
|
||||||
|
|
||||||
if symbols_dict:
|
if symbols_dict:
|
||||||
# Si es una ecuación, intentar crearla manualmente
|
# Si es una ecuación, intentar parsearlo lado por lado
|
||||||
if is_equation and '=' in result:
|
if is_equation and '=' in result:
|
||||||
left, right = result.split('=', 1)
|
left, right = result.split('=', 1)
|
||||||
# Crear una ecuación simple usando el primer símbolo encontrado
|
try:
|
||||||
first_symbol = list(symbols_dict.values())[0]
|
# Intentar parsear cada lado individualmente
|
||||||
return sympy.Eq(first_symbol, sum(list(symbols_dict.values())[1:], 0))
|
left_expr = sympy.sympify(left.strip(), locals=symbols_dict)
|
||||||
|
right_expr = sympy.sympify(right.strip(), locals=symbols_dict)
|
||||||
|
return sympy.Eq(left_expr, right_expr)
|
||||||
|
except Exception as e2:
|
||||||
|
print(f"Debug: Error parseando lados de ecuación: {e2}")
|
||||||
|
# Como último recurso, devolver un símbolo con la expresión completa
|
||||||
|
return sympy.Symbol(f"LaTeX_parse_error_{len(symbols_dict)}_symbols")
|
||||||
else:
|
else:
|
||||||
# Para expresiones, devolver el primer símbolo o una suma
|
# Para expresiones, intentar parsear con el contexto de símbolos
|
||||||
symbols_list = list(symbols_dict.values())
|
try:
|
||||||
if len(symbols_list) == 1:
|
return sympy.sympify(result, locals=symbols_dict)
|
||||||
return symbols_list[0]
|
except Exception as e2:
|
||||||
else:
|
print(f"Debug: Error parseando expresión: {e2}")
|
||||||
return sum(symbols_list[1:], symbols_list[0])
|
# Si todo falla, devolver el primer símbolo
|
||||||
|
return list(symbols_dict.values())[0] if symbols_dict else sympy.Symbol('LaTeX_parse_error')
|
||||||
else:
|
else:
|
||||||
return sympy.Symbol('LaTeX_parse_error')
|
return sympy.Symbol('LaTeX_parse_error')
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,4 @@
|
||||||
|
|
||||||
x=t**2+5/m
|
|
||||||
m=3
|
|
||||||
x=4
|
|
||||||
t=?
|
|
||||||
solve(t)
|
|
||||||
form=solve(t)
|
|
||||||
|
|
||||||
|
|
||||||
ip=IP4(10.1.1.1,20)
|
|
||||||
ip.BroadcastAddress()
|
|
||||||
|
|
||||||
# Test LATEX
|
|
||||||
$$Brix = \frac{Brix_{syrup} \cdot \delta_{syrup} + (Brix_{water} \cdot \delta_{water} \cdot Rateo)}{\delta_{syrup} + \delta_{water} \cdot Rateo}$$
|
$$Brix = \frac{Brix_{syrup} \cdot \delta_{syrup} + (Brix_{water} \cdot \delta_{water} \cdot Rateo)}{\delta_{syrup} + \delta_{water} \cdot Rateo}$$
|
||||||
$$Brix = \frac{Solid_Weight}{Total_Weight}$$
|
|
||||||
$$\delta = \frac{W}{V} \Rightarrow W = \delta \cdot V$$
|
|
||||||
$$Brix_{Bev} = \frac{Brix_{syr} + Brix_{H_2O} \cdot R_M}{R_M + 1}$$
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1133,21 +1133,98 @@ class HybridCalculatorPySide6(QMainWindow):
|
||||||
equation_type = "symbolic"
|
equation_type = "symbolic"
|
||||||
|
|
||||||
if should_add_to_latex:
|
if should_add_to_latex:
|
||||||
latex_content = ""
|
# Generar contenido LaTeX que incluya toda la información del output
|
||||||
|
latex_content = self._generate_complete_latex_content(result)
|
||||||
if result.actual_result_object is not None:
|
|
||||||
try:
|
|
||||||
latex_content = sympy.latex(result.actual_result_object)
|
|
||||||
except:
|
|
||||||
latex_content = result.output if result.output else str(result.actual_result_object)
|
|
||||||
else:
|
|
||||||
latex_content = result.output if result.output else ""
|
|
||||||
|
|
||||||
self._add_to_latex_panel(equation_type, latex_content)
|
self._add_to_latex_panel(equation_type, latex_content)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.error(f"Error procesando para panel LaTeX: {e}")
|
self.logger.error(f"Error procesando para panel LaTeX: {e}")
|
||||||
|
|
||||||
|
def _generate_complete_latex_content(self, result: EvaluationResult) -> str:
|
||||||
|
"""Genera contenido LaTeX completo incluyendo toda la información del output"""
|
||||||
|
try:
|
||||||
|
# Para comentarios, usar el texto directamente
|
||||||
|
if result.result_type == "comment":
|
||||||
|
return result.output or ""
|
||||||
|
|
||||||
|
latex_parts = []
|
||||||
|
|
||||||
|
# PARTE 1: Contenido principal (con LaTeX de SymPy si es posible)
|
||||||
|
main_content = ""
|
||||||
|
if result.actual_result_object is not None:
|
||||||
|
try:
|
||||||
|
# Intentar generar LaTeX de SymPy para el objeto matemático
|
||||||
|
import sympy
|
||||||
|
main_content = sympy.latex(result.actual_result_object)
|
||||||
|
|
||||||
|
# Para asignaciones, necesitamos agregar el lado izquierdo
|
||||||
|
if result.is_assignment and result.input_line:
|
||||||
|
# Extraer la variable del lado izquierdo
|
||||||
|
if '=' in result.input_line:
|
||||||
|
left_side = result.input_line.split('=')[0].strip()
|
||||||
|
# Limpiar posibles símbolos LaTeX del lado izquierdo
|
||||||
|
left_side = left_side.replace('$$', '').strip()
|
||||||
|
main_content = f"{left_side} = {main_content}"
|
||||||
|
|
||||||
|
except Exception:
|
||||||
|
# Si falla el LaTeX de SymPy, usar el output textual
|
||||||
|
main_content = result.output or ""
|
||||||
|
else:
|
||||||
|
main_content = result.output or ""
|
||||||
|
|
||||||
|
latex_parts.append(main_content)
|
||||||
|
|
||||||
|
# PARTE 2: Aproximación numérica (si está disponible en el output)
|
||||||
|
if result.output and "≈" in result.output:
|
||||||
|
approx_parts = result.output.split("≈", 1)
|
||||||
|
if len(approx_parts) == 2:
|
||||||
|
approx_value = approx_parts[1].strip()
|
||||||
|
# Extraer solo la parte numérica antes del indicador de tipo
|
||||||
|
if ";" in approx_value:
|
||||||
|
approx_value = approx_value.split(";")[0].strip()
|
||||||
|
|
||||||
|
# Intentar convertir la aproximación a LaTeX si es una ecuación
|
||||||
|
try:
|
||||||
|
import sympy
|
||||||
|
if "Eq(" in approx_value:
|
||||||
|
# Es una ecuación, intentar parserarla para LaTeX
|
||||||
|
approx_obj = eval(approx_value, {'Eq': sympy.Eq, 'sqrt': sympy.sqrt})
|
||||||
|
approx_latex = sympy.latex(approx_obj)
|
||||||
|
latex_parts.append(f"\\approx {approx_latex}")
|
||||||
|
else:
|
||||||
|
# Es un valor numérico simple
|
||||||
|
latex_parts.append(f"\\approx {approx_value}")
|
||||||
|
except:
|
||||||
|
# Si falla, usar la aproximación como texto
|
||||||
|
latex_parts.append(f"\\approx {approx_value}")
|
||||||
|
|
||||||
|
# PARTE 3: Indicador de tipo (si está en el output)
|
||||||
|
if result.output and "[" in result.output and "]" in result.output:
|
||||||
|
# Extraer el indicador de tipo (ej: [=], [Equality], etc.)
|
||||||
|
parts = result.output.split("[")
|
||||||
|
if len(parts) >= 2:
|
||||||
|
type_part = "[" + parts[-1] # Tomar el último indicador
|
||||||
|
if "]" in type_part:
|
||||||
|
type_indicator = type_part.split("]")[0] + "]"
|
||||||
|
latex_parts.append(f"\\quad \\text{{{type_indicator}}}")
|
||||||
|
|
||||||
|
# Combinar todas las partes
|
||||||
|
complete_latex = " ".join(latex_parts)
|
||||||
|
|
||||||
|
# Limpiar caracteres problemáticos para MathJax
|
||||||
|
complete_latex = complete_latex.replace("__", "_{").replace("**", "^")
|
||||||
|
|
||||||
|
# Agregar llaves de cierre para subíndices
|
||||||
|
import re
|
||||||
|
complete_latex = re.sub(r'_\{(\w+)', r'_{\1}', complete_latex)
|
||||||
|
|
||||||
|
return complete_latex
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.error(f"Error generando LaTeX completo: {e}")
|
||||||
|
# Fallback al output original
|
||||||
|
return result.output or ""
|
||||||
|
|
||||||
def _add_to_latex_panel(self, equation_type: str, latex_content: str):
|
def _add_to_latex_panel(self, equation_type: str, latex_content: str):
|
||||||
"""Añade una ecuación al panel LaTeX"""
|
"""Añade una ecuación al panel LaTeX"""
|
||||||
if not hasattr(self, '_latex_equations'):
|
if not hasattr(self, '_latex_equations'):
|
||||||
|
|
Loading…
Reference in New Issue