From 656c26ef2cc8089e1e2b6a811337db449759604c Mon Sep 17 00:00:00 2001 From: Pedro Jose Romero Gombau Date: Tue, 21 Jan 2025 17:18:51 +0100 Subject: [PATCH] v1.1 upload --- .gitignore | 8 +- README.md | 88 ++++++--- README_APP.md | 46 +++++ VERSION | 2 +- buildImage.bat | 1 - dockyard.bat | 85 --------- geometry_viewer.py | 71 ------- launcher.bat | 1 - main.py | 32 ---- requirements.txt | 3 +- src/__init__.py | 0 src/main.py | 52 ++++++ src/static/icon.ico | Bin 0 -> 139363 bytes src/tabs/__init__.py | 0 src/tabs/geometry_viewer.py | 175 ++++++++++++++++++ src/tabs/tab_coil.py | 123 ++++++++++++ tab_drag.py => src/tabs/tab_drag.py | 0 src/tabs/tab_electrical.py | 155 ++++++++++++++++ tab_search.py => src/tabs/tab_search.py | 0 tab_simulator.py => src/tabs/tab_simulator.py | 7 + 20 files changed, 633 insertions(+), 216 deletions(-) create mode 100644 README_APP.md delete mode 100644 buildImage.bat delete mode 100644 dockyard.bat delete mode 100644 geometry_viewer.py delete mode 100644 launcher.bat delete mode 100644 main.py create mode 100644 src/__init__.py create mode 100644 src/main.py create mode 100644 src/static/icon.ico create mode 100644 src/tabs/__init__.py create mode 100644 src/tabs/geometry_viewer.py create mode 100644 src/tabs/tab_coil.py rename tab_drag.py => src/tabs/tab_drag.py (100%) create mode 100644 src/tabs/tab_electrical.py rename tab_search.py => src/tabs/tab_search.py (100%) rename tab_simulator.py => src/tabs/tab_simulator.py (99%) diff --git a/.gitignore b/.gitignore index db35bac..880a3d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,7 @@ -SECRETS \ No newline at end of file +SECRETS +venv/ +__pycache__/ +*.spec +build/ +dist/ +*.log \ No newline at end of file diff --git a/README.md b/README.md index 5045934..9e5f388 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,77 @@ -# Bienvenido a LaunchSim +## Bienvenido a LaunchSim ### Simulador de trayectorias para lanzaderas -## Descripción. +--- -El objetivo de este programa es a partir de unos parámetros de entrada, conseguir una estimación mecánica y energética de las necesidades de la lanzadera para cumplir los objetivos de entrada. La aplicación cuenta con tres pestañas: +### Descripción -- **Simulación**: Pestaña en la que se introducen los datos y se visualiza la trayectoria en tiempo real. -- **Coef. Rozamiento**: Si se quiere tener en cuenta el efecto del rozamiento del aire, se podrá elegir en esta pantalla una geometría para el proyectil y calculará automáticamente el coeficiente de rozamiento. -- **Optimización**: Una vez generada una primera simulación, se puede optimizar para conseguir la el ángulo de lanzamiento que requiere la menor velocidad, minimizando así la energía. La optimización solo se puede realizar si el modo de simulación es *Alcance*. +LaunchSim es una aplicación diseñada para calcular trayectorias de proyectiles en función de parámetros físicos y mecánicos, proporcionando estimaciones energéticas y visualización interactiva. Además, incluye herramientas de optimización para minimizar la velocidad inicial necesaria. -## Instrucciones de instalación +### Estructura de la aplicación -Para poner en marcha la aplicación, hay dos opciones: +1. **Simulador:** + - Introduce los parámetros iniciales como ángulo, velocidad, alcance y altura inicial. + - Visualiza la trayectoria y calcula energías mecánicas y dinámicas en tiempo real. -- Directamente desde la consola de tu equipo - 1. Tener *python* instalado. - 2. Ejecutar `pip install -r requirements.txt` - 3. Ejecutar `python main.py` desde el directorio del proyecto +2. **Coef. Rozamiento:** + - Selecciona una geometría (prisma, cilindro o esfera) para calcular el coeficiente de rozamiento (*b*) en función de la resistencia al aire. -- Desde docker: - 1. Tener *Docker Desktop* instalado. - 2. Ejecutar el archivo *buildimage.bat* - 3. Ejecutar el archivo *launcher.bat* +3. **Optimización:** + - Calcula el ángulo óptimo para minimizar la velocidad inicial necesaria y optimiza el consumo energético. -## Para desarrolladores del programa +4. **Simulación Geométrica de Bobinas:** + - Diseña la geometría de una bobina seleccionando parámetros como el radio, el número de vueltas y la altura. + - Calcula automáticamente la sección transversal resultante de la bobina, utilizada para evaluar la resistencia eléctrica. -Una vez descargado el código desde el repositorio, es necesario crear un archivo *SECRETS* para subir nuevas versiones al registro, con el siguiente formato: -``` -REG_USER=usuario -REG_PASSWORD=contraseña -``` +5. **Simulación Eléctrica:** + - Utiliza los datos generados en la pestaña de bobinas para calcular parámetros eléctricos como resistencia, voltaje y corriente requeridos para alimentar el sistema. + - Proporciona una visualización de los valores eléctricos en tiempo real. + +--- + +### Instalación + +1. **Clonar el repositorio:** + ```bash + git clone https://github.com/spark-ops/LaunchSim.git + cd LaunchSim + ``` + +2. **Crear un entorno virtual:** + ```bash + python -m venv venv + source venv/bin/activate # En Windows: venv\Scripts\activate + ``` + +3. **Instalar dependencias:** + ```bash + pip install -r requirements.txt + ``` + +4. **Ejecutar la aplicación:** + ```bash + python src/main.py + ``` + +5. **Compilar como ejecutable (opcional):** + Si deseas distribuir la aplicación como un ejecutable independiente: + ```bash + pyinstaller --onefile --noconsole --icon=src/static/icon.ico src/main.py + ``` + El archivo resultante estará en la carpeta `dist/`. + +--- + +### Estructura del Proyecto + +- **src/**: Contiene los archivos principales del código fuente. +- **static/**: Almacena los recursos estáticos como el icono de la aplicación. +- **VERSION:** Archivo que contiene la versión actual del software. +- **SECRETS:** Archivo para credenciales usadas en integración con Docker. +- **Dockerfile:** Archivo para crear una imagen Docker del proyecto. + +--- + +### Contacto -## Contacto E-mail: pedrojrg@spark-ops.com \ No newline at end of file diff --git a/README_APP.md b/README_APP.md new file mode 100644 index 0000000..55437e5 --- /dev/null +++ b/README_APP.md @@ -0,0 +1,46 @@ +## Bienvenido a LaunchSim +### Simulador de trayectorias para lanzaderas + +--- + +### Descripción + +LaunchSim es una aplicación que permite calcular trayectorias de proyectiles y realizar estimaciones energéticas basadas en los parámetros de entrada. Además, incluye herramientas de optimización para encontrar el ángulo de lanzamiento más eficiente. + +--- + +### Funcionalidades + +1. **Simulación:** + - Introduce datos como ángulo, velocidad, masa y alcance. + - Visualiza la trayectoria en tiempo real y observa cálculos de energía. + +2. **Cálculo del Coef. de Rozamiento:** + - Selecciona una geometría y calcula el coeficiente de rozamiento para proyectiles en movimiento. + +3. **Optimización:** + - Encuentra el ángulo que minimiza la velocidad inicial y optimiza el consumo energético. + +4. **Simulación Geométrica de Bobinas:** + - Permite diseñar una bobina eligiendo parámetros geométricos como radio, altura y número de vueltas. + - Calcula la sección transversal de la bobina, esencial para evaluar su resistencia eléctrica. + +5. **Simulación Eléctrica:** + - Utiliza los datos de la geometría de la bobina para calcular resistencia, voltaje y corriente necesarios. + - Proporciona una simulación interactiva de los valores eléctricos. + +--- + +### Requisitos del Sistema + +- Sistema operativo: Windows 10 o superior. +- No requiere instalación previa de Python. +- Tamaño del archivo: ~50 MB. + +--- + +### Contacto + +Si tienes preguntas o necesitas soporte técnico, puedes ponerte en contacto con nosotros: + +E-mail: pedrojrg@spark-ops.com \ No newline at end of file diff --git a/VERSION b/VERSION index 9f8e9b6..b123147 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.0 \ No newline at end of file +1.1 \ No newline at end of file diff --git a/buildImage.bat b/buildImage.bat deleted file mode 100644 index b93b9c0..0000000 --- a/buildImage.bat +++ /dev/null @@ -1 +0,0 @@ -docker build -t launchsim . \ No newline at end of file diff --git a/dockyard.bat b/dockyard.bat deleted file mode 100644 index 9b80d11..0000000 --- a/dockyard.bat +++ /dev/null @@ -1,85 +0,0 @@ -REM @echo off -setlocal enabledelayedexpansion - -REM Leer usuario y contraseña del archivo SECRETS -REM (deben ser líneas con formato REG_USER=xxx y REG_PASSWORD=xxx, sin espacios) -for /f "usebackq tokens=1,2 delims==" %%A in ("SECRETS") do ( - if /I "%%A"=="REG_USER" set "REG_USER=%%B" - if /I "%%A"=="REG_PASSWORD" set "REG_PASSWORD=%%B" -) - -REM Leer la versión del archivo VERSION -REM (asumimos que la primera línea tiene la versión, p.ej. 1.0) -for /f "usebackq tokens=* delims=" %%V in ("VERSION") do ( - set "VERSION=%%V" - goto :GotVersion -) - -:GotVersion - -REM Verificar que los valores estén cargados -if not defined REG_USER ( - echo Error: REG_USER no encontrado en SECRETS. - exit /b 1 -) - -if not defined REG_PASSWORD ( - echo Error: REG_PASSWORD no encontrado en SECRETS. - exit /b 1 -) - -if not defined VERSION ( - echo Error: VERSION no encontrado o vacío en VERSION. - exit /b 1 -) - -REM Login en el registro Docker -echo Realizando login en dockyard.spark-ops.com... -echo !REG_PASSWORD! | docker login dockyard.spark-ops.com --username !REG_USER! --password-stdin -if %ERRORLEVEL% neq 0 ( - echo Error: Falló el login en el registro Docker. - exit /b 1 -) - -REM Construir la imagen Docker -echo Construyendo la imagen Docker launchsim:!VERSION!... -docker build -t launchsim:!VERSION! . -if %ERRORLEVEL% neq 0 ( - echo Error: Falló la construcción de la imagen Docker. - exit /b 1 -) - -REM Etiquetar la imagen con la versión -echo Etiquetando la imagen para el registro... -docker tag launchsim:!VERSION! dockyard.spark-ops.com/launchsim/launchsim:!VERSION! -if %ERRORLEVEL% neq 0 ( - echo Error: Falló al etiquetar la imagen Docker. - exit /b 1 -) - -REM Etiquetar la imagen como latest -echo Etiquetando la imagen como latest... -docker tag launchsim:!VERSION! dockyard.spark-ops.com/launchsim/launchsim:latest -if %ERRORLEVEL% neq 0 ( - echo Error: Falló al etiquetar la imagen como latest. - exit /b 1 -) - -REM Subir la imagen con la versión -echo Subiendo la imagen al registro con la versión !VERSION!... -docker push dockyard.spark-ops.com/launchsim/launchsim:!VERSION! -if %ERRORLEVEL% neq 0 ( - echo Error: Falló al subir la imagen con la versión. - exit /b 1 -) - -REM Subir la imagen como latest -echo Subiendo la imagen como latest al registro... -docker push dockyard.spark-ops.com/launchsim/launchsim:latest -if %ERRORLEVEL% neq 0 ( - echo Error: Falló al subir la imagen como latest. - exit /b 1 -) - -echo Proceso completado exitosamente. -endlocal diff --git a/geometry_viewer.py b/geometry_viewer.py deleted file mode 100644 index 336ddfb..0000000 --- a/geometry_viewer.py +++ /dev/null @@ -1,71 +0,0 @@ -import matplotlib -matplotlib.use("TkAgg") # Para asegurarnos de usar Tkinter como backend -import matplotlib.pyplot as plt -from mpl_toolkits.mplot3d import Axes3D # necesario para 3D -from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg -import numpy as np - -def plot_geometry_in_frame(parent_frame, geom, p1, p2): - """ - Dibuja la geometría (Prisma/Cilindro/Esfera) en un Axes3D dentro - de 'parent_frame' (un Frame de Tkinter). No abre ventana nueva. - (Ejemplo de integración en tu TabDrag) - """ - - fig = plt.Figure(figsize=(4, 3), dpi=100) - ax = fig.add_subplot(111, projection='3d') - ax.set_title(f"{geom}", fontsize=10) - - if geom == "Prisma cuadrado": - lado = p1 - largo = p2 - Xs = [0, lado, lado, 0, 0, lado, lado, 0] - Ys = [0, 0, lado, lado, 0, 0, lado, lado] - Zs = [0, 0, 0, 0, largo, largo, largo, largo] - edges = [(0,1),(1,2),(2,3),(3,0), - (4,5),(5,6),(6,7),(7,4), - (0,4),(1,5),(2,6),(3,7)] - for (i,j) in edges: - ax.plot([Xs[i],Xs[j]], [Ys[i],Ys[j]], [Zs[i],Zs[j]], color='g') - ax.set_xlim(0, max(lado,1)) - ax.set_ylim(0, max(lado,1)) - ax.set_zlim(0, max(largo,1)) - - elif geom == "Cilindro": - r = p1 - h = p2 - theta = np.linspace(0, 2*np.pi, 30) - z = np.linspace(0, h, 30) - theta_grid, z_grid = np.meshgrid(theta, z) - X = r * np.cos(theta_grid) - Y = r * np.sin(theta_grid) - Z = z_grid - ax.plot_surface(X, Y, Z, color='cyan', alpha=0.5) - ax.set_xlim(-r, r) - ax.set_ylim(-r, r) - ax.set_zlim(0, h) - - elif geom == "Esfera": - r = p1 - phi = np.linspace(0, np.pi, 30) - theta = np.linspace(0, 2*np.pi, 30) - phi_grid, theta_grid = np.meshgrid(phi, theta) - X = r*np.sin(phi_grid)*np.cos(theta_grid) - Y = r*np.sin(phi_grid)*np.sin(theta_grid) - Z = r*np.cos(phi_grid) - ax.plot_surface(X, Y, Z, color='yellow', alpha=0.6) - ax.set_xlim(-r, r) - ax.set_ylim(-r, r) - ax.set_zlim(-r, r) - - else: - ax.text2D(0.2, 0.5, "Geometría desconocida", transform=ax.transAxes) - - # Borramos lo anterior en parent_frame y embebemos el nuevo canvas - for child in parent_frame.winfo_children(): - child.destroy() - - canvas = FigureCanvasTkAgg(fig, master=parent_frame) - canvas_widget = canvas.get_tk_widget() - canvas_widget.pack(fill="both", expand=True) - canvas.draw() diff --git a/launcher.bat b/launcher.bat deleted file mode 100644 index 7c85d2b..0000000 --- a/launcher.bat +++ /dev/null @@ -1 +0,0 @@ -docker run -it --rm -e DISPLAY=host.docker.internal:0 launchsim \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 241ab4a..0000000 --- a/main.py +++ /dev/null @@ -1,32 +0,0 @@ -import tkinter as tk -from tkinter import ttk - -from tab_simulator import TabSimulator -from tab_drag import TabDrag -from tab_search import TabSearch - -class MainApp: - def __init__(self, master): - self.master = master - self.master.title("Obtención de trayectoria y energía") - - self.notebook = ttk.Notebook(master) - self.notebook.pack(fill="both", expand=True) - - # Pestaña 1: Simulador Trayectoria - self.tab_sim = TabSimulator(self.notebook) - self.notebook.add(self.tab_sim.frame, text="Simulador") - - # Pestaña 2: Cálculo Coef. Rozamiento - self.tab_drag = TabDrag(self.notebook, self.tab_sim) - self.notebook.add(self.tab_drag.frame, text="Rozamiento") - - # Pestaña 3: Búsqueda (ángulo que minimiza la velocidad) - self.tab_search = TabSearch(self.notebook, self.tab_sim) - self.notebook.add(self.tab_search.frame, text="Optimización") - - -if __name__ == "__main__": - root = tk.Tk() - app = MainApp(root) - root.mainloop() diff --git a/requirements.txt b/requirements.txt index 8248f97..f134a34 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ matplotlib -numpy \ No newline at end of file +numpy +pyinstaller \ No newline at end of file diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..f52369f --- /dev/null +++ b/src/main.py @@ -0,0 +1,52 @@ +# main.py + +import os +import tkinter as tk +from tkinter import ttk + +# Importamos las distintas pestañas +from src.tabs.tab_simulator import TabSimulator +from src.tabs.tab_search import TabSearch +from src.tabs.tab_drag import TabDrag +from src.tabs.tab_coil import TabCoil +from src.tabs.tab_electrical import TabElectrical + +class MainApp: + def __init__(self, master): + self.master = master + self.master.title("LaunchSim") + + # Intento de cargar icono (opcional) + icon_path = os.path.join(os.path.dirname(__file__), "static", "icon.ico") + if os.path.exists(icon_path): + self.master.iconbitmap(icon_path) + else: + print(f"Advertencia: Icono no encontrado en {icon_path}") + + self.notebook = ttk.Notebook(master) + self.notebook.pack(fill="both", expand=True) + + # Pestaña 1: Simulador + self.tab_sim = TabSimulator(self.notebook) + self.notebook.add(self.tab_sim.frame, text="Simulador Trayectoria") + + # Pestaña 2: Rozamiento + self.tab_drag = TabDrag(self.notebook, self.tab_sim) + self.notebook.add(self.tab_drag.frame, text="Rozamiento") + + # Pestaña 3: Optimización + self.tab_search = TabSearch(self.notebook, self.tab_sim) + self.notebook.add(self.tab_search.frame, text="Optimización") + + # Pestaña 4: Bobinas + self.tab_coil = TabCoil(self.notebook, self.tab_sim) + self.notebook.add(self.tab_coil.frame, text="Bobinas") + + # Pestaña 5: Eléctrico + self.tab_elec = TabElectrical(self.notebook, self.tab_sim, self.tab_coil) + self.notebook.add(self.tab_elec.frame, text="Eléctrico") + +if __name__ == "__main__": + root = tk.Tk() + app = MainApp(root) + root.mainloop() diff --git a/src/static/icon.ico b/src/static/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..705ac163b73a1c32df891542c155c1974662f703 GIT binary patch literal 139363 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ÐRH&&#kNKFTDW;t!4pUD`tm|c|Ei-! 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 HBiH_a@w-^n literal 0 HcmV?d00001 diff --git a/src/tabs/__init__.py b/src/tabs/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/tabs/geometry_viewer.py b/src/tabs/geometry_viewer.py new file mode 100644 index 0000000..3a4dd18 --- /dev/null +++ b/src/tabs/geometry_viewer.py @@ -0,0 +1,175 @@ +# src/geometry_viewer.py + +import matplotlib +matplotlib.use("TkAgg") # Para usar Tkinter como backend +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D # necesario para 3D +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg +import numpy as np + +def plot_geometry_in_frame(parent_frame, geom, p1, p2): + """ + Dibuja la geometría (Prisma/Cilindro/Esfera) en un Axes3D dentro + de 'parent_frame' (un Frame de Tkinter). No abre ventana nueva. + (Ejemplo de integración en tu TabDrag) + """ + + fig = plt.Figure(figsize=(4, 3), dpi=100) + ax = fig.add_subplot(111, projection='3d') + ax.set_title(f"{geom}", fontsize=10) + + if geom == "Prisma cuadrado": + lado = p1 + largo = p2 + Xs = [0, lado, lado, 0, 0, lado, lado, 0] + Ys = [0, 0, lado, lado, 0, 0, lado, lado] + Zs = [0, 0, 0, 0, largo, largo, largo, largo] + edges = [(0,1),(1,2),(2,3),(3,0), + (4,5),(5,6),(6,7),(7,4), + (0,4),(1,5),(2,6),(3,7)] + for (i,j) in edges: + ax.plot([Xs[i], Xs[j]], [Ys[i], Ys[j]], [Zs[i], Zs[j]], color='g') + ax.set_xlim(0, max(lado,1)) + ax.set_ylim(0, max(lado,1)) + ax.set_zlim(0, max(largo,1)) + + elif geom == "Cilindro": + r = p1 + h = p2 + theta = np.linspace(0, 2*np.pi, 30) + z = np.linspace(0, h, 30) + theta_grid, z_grid = np.meshgrid(theta, z) + X = r * np.cos(theta_grid) + Y = r * np.sin(theta_grid) + Z = z_grid + ax.plot_surface(X, Y, Z, color='cyan', alpha=0.5) + ax.set_xlim(-r, r) + ax.set_ylim(-r, r) + ax.set_zlim(0, h) + + elif geom == "Esfera": + r = p1 + phi = np.linspace(0, np.pi, 30) + theta = np.linspace(0, 2*np.pi, 30) + phi_grid, theta_grid = np.meshgrid(phi, theta) + X = r*np.sin(phi_grid)*np.cos(theta_grid) + Y = r*np.sin(phi_grid)*np.sin(theta_grid) + Z = r*np.cos(phi_grid) + ax.plot_surface(X, Y, Z, color='yellow', alpha=0.6) + ax.set_xlim(-r, r) + ax.set_ylim(-r, r) + ax.set_zlim(-r, r) + + else: + # Geometría no reconocida + ax.text2D(0.2, 0.5, "Geometría desconocida", transform=ax.transAxes) + + # Borramos lo anterior en parent_frame y embebemos el nuevo canvas + for child in parent_frame.winfo_children(): + child.destroy() + + canvas = FigureCanvasTkAgg(fig, master=parent_frame) + canvas_widget = canvas.get_tk_widget() + canvas_widget.pack(fill="both", expand=True) + canvas.draw() + + +def plot_coil_in_frame(parent_frame, + N=10, + e_pvc=1.0, + r_int=5.0, + r_ext=8.0, + h_c=10.0, + d_cu=0.5): + """ + Dibuja un esquema 2D aproximado de la bobina en un Frame de Tkinter, + basado en los parámetros: + N : número total de vueltas + e_pvc : espesor del PVC + r_int : radio interior de la bobina + r_ext : radio exterior total de la bobina + h_c : altura total de la bobina + d_cu : diámetro del conductor + + Se calcula: + r_capas = r_ext - (r_int + e_pvc) + Luego se distribuyen N vueltas en 'num_capas' radiales, etc. + """ + + # 1) Cálculo de la anchura de bobinado + r_capas = r_ext - (r_int + e_pvc) + if r_capas < 0: + # Si ocurre un valor absurdo, forzamos a 0 + r_capas = 0.0 + + # 2) Creamos la figura y eje 2D + fig = plt.Figure(figsize=(4, 3), dpi=100) + ax = fig.add_subplot(111) + ax.set_aspect("equal", adjustable="box") + ax.set_title("Bobina (vista 2D)", fontsize=10) + + # 3) Dibujar PVC como dos rectángulos "verticales" + # Eje Y: 0 -> h_c + # Izquierda: x ~ -(r_int + e_pvc) hasta -r_int + # Derecha : x ~ (r_int) hasta (r_int + e_pvc) + ax.fill_between( + x=[-(r_int + e_pvc), -r_int], + y1=0, + y2=h_c, + color="black", + alpha=0.3 + ) + ax.fill_between( + x=[r_int, r_int + e_pvc], + y1=0, + y2=h_c, + color="black", + alpha=0.3 + ) + + # 4) Cálculo de capas radiales y vueltas por capa + num_capas = int(np.floor(r_capas / d_cu)) + if num_capas < 1: + num_capas = 1 + + vueltas_por_capa = int(np.ceil(N / num_capas)) + + # 5) Distancia vertical entre vueltas en cada capa + delta_h = h_c / (vueltas_por_capa + 1) + + # Función auxiliar para dibujar un conductor (círculo) + def dibuja_conductor(xc, yc, radio): + circle = plt.Circle((xc, yc), radio, color="orange", fill=True) + ax.add_patch(circle) + + # 6) Bucle para colocar cada capa (izq/dcha) + for i in range(num_capas): + # X de la capa i, en lado izquierdo + x_left = -(r_int + e_pvc + (2*i + 1) * (d_cu / 2)) + # ... y lado derecho + x_right = +(r_int + e_pvc + (2*i + 1) * (d_cu / 2)) + + # Añadimos vueltas en altura + for j in range(vueltas_por_capa): + y = (j + 1) * delta_h + if y > h_c: + break # no dibujamos si excede la altura + dibuja_conductor(x_left, y, d_cu/2) + dibuja_conductor(x_right, y, d_cu/2) + + # 7) Ajustar los límites del dibujo en X e Y + ax.set_xlim(-r_ext - d_cu, r_ext + d_cu) + ax.set_ylim(0, h_c + d_cu) + + ax.set_xlabel("Radio (X)") + ax.set_ylabel("Altura (Y)") + ax.grid(True) + + # 8) Borramos lo anterior en parent_frame y embebemos esta figura + for child in parent_frame.winfo_children(): + child.destroy() + + canvas = FigureCanvasTkAgg(fig, master=parent_frame) + canvas_widget = canvas.get_tk_widget() + canvas_widget.pack(fill="both", expand=True) + canvas.draw() diff --git a/src/tabs/tab_coil.py b/src/tabs/tab_coil.py new file mode 100644 index 0000000..286e848 --- /dev/null +++ b/src/tabs/tab_coil.py @@ -0,0 +1,123 @@ +# src/tab_coil.py + +import tkinter as tk +from tkinter import ttk + +import matplotlib +matplotlib.use("TkAgg") +import matplotlib.pyplot as plt +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg + +import numpy as np + +# Importamos la función para dibujar la bobina 2D +from src.tabs.geometry_viewer import plot_coil_in_frame + +class TabCoil: + def __init__(self, notebook, tab_simulator): + """ + Pestaña para representar la bobina en 2D y ajustar sus parámetros. + Recibe: + - notebook: el ttk.Notebook donde se añadirá + - tab_simulator: referencia a TabSimulator, si se necesita comunicar + """ + self.notebook = notebook + self.tab_simulator = tab_simulator + + # Frame principal dentro del notebook + self.frame = tk.Frame(notebook) + self.frame.pack(fill="both", expand=True) + + # (Este add lo hace habitualmente main.py, pero se podría hacer aquí) + # notebook.add(self.frame, text="Bobinas") + + # Layout principal: lado izq (parámetros) y lado der (dibujo) + frame_left = tk.Frame(self.frame) + frame_left.pack(side="left", fill="y", padx=5, pady=5) + + frame_right = tk.Frame(self.frame, bd=2, relief="groove") + frame_right.pack(side="right", fill="both", expand=True, padx=5, pady=5) + + # Este frame contendrá el canvas/figura para la bobina en 2D + self.frame_2d = tk.Frame(frame_right) + self.frame_2d.pack(fill="both", expand=True) + + # + # Sección Izquierda: parámetros de la bobina + # + tk.Label(frame_left, text="Parámetros de la Bobina:").pack(anchor="w") + + # Variables + self.var_N = tk.IntVar(value=500) + self.var_e_pvc = tk.DoubleVar(value=4.04) + self.var_r_int = tk.DoubleVar(value=12.07) + self.var_r_ext = tk.DoubleVar(value=21.27) + self.var_h_c = tk.DoubleVar(value=53.12) + self.var_d_cu = tk.DoubleVar(value=0.8) + + # Frame para agrupar los Entries + self.frame_params = tk.Frame(frame_left, bd=1, relief="sunken") + self.frame_params.pack(fill="x", pady=5) + + # Función auxiliar para añadir filas (etiqueta + entry) + def add_param_row(label_text, var, row, width=8): + lbl = tk.Label(self.frame_params, text=label_text) + lbl.grid(row=row, column=0, sticky="w", padx=5, pady=2) + ent = tk.Entry(self.frame_params, textvariable=var, width=width) + ent.grid(row=row, column=1, padx=5, pady=2) + + # Creamos las filas + rowcount = 0 + add_param_row("N (vueltas):", self.var_N, rowcount); rowcount += 1 + add_param_row("e_pvc (mm):", self.var_e_pvc, rowcount); rowcount += 1 + add_param_row("r_int (mm):", self.var_r_int, rowcount); rowcount += 1 + add_param_row("r_ext (mm):", self.var_r_ext, rowcount); rowcount += 1 + add_param_row("h_c (mm):", self.var_h_c, rowcount); rowcount += 1 + add_param_row("d_cu (mm):", self.var_d_cu, rowcount); rowcount += 1 + + # Botón para actualizar la vista 2D + btn_refrescar = tk.Button( + frame_left, text="Refrescar Vista 2D", + command=self.refrescar_2d + ) + btn_refrescar.pack(pady=10) + + # + # Creamos la figura y canvas para la bobina en 2D (opcional, + # pues 'plot_coil_in_frame' creará su propia Figure). + # + self.fig = plt.Figure(figsize=(4,3), dpi=100) + self.ax = self.fig.add_subplot(111) + self.canvas_2d = FigureCanvasTkAgg(self.fig, master=self.frame_2d) + self.canvas_2d_widget = self.canvas_2d.get_tk_widget() + self.canvas_2d_widget.pack(fill="both", expand=True) + + # Dibujamos la bobina inicial + self.refrescar_2d() + + def refrescar_2d(self): + """ + Lee los valores de la bobina y llama a 'plot_coil_in_frame' + para actualizar el dibujo en 2D. + """ + # Obtenemos valores + N_val = self.var_N.get() + e_pvc_val = self.var_e_pvc.get() + r_int_val = self.var_r_int.get() + r_ext_val = self.var_r_ext.get() + h_c_val = self.var_h_c.get() + d_cu_val = self.var_d_cu.get() + + # Limpiamos el Axes actual (si lo usáramos) + self.ax.clear() + + # Llamada a la función que inserta la figura en self.frame_2d + plot_coil_in_frame( + parent_frame=self.frame_2d, + N=N_val, + e_pvc=e_pvc_val, + r_int=r_int_val, + r_ext=r_ext_val, + h_c=h_c_val, + d_cu=d_cu_val + ) diff --git a/tab_drag.py b/src/tabs/tab_drag.py similarity index 100% rename from tab_drag.py rename to src/tabs/tab_drag.py diff --git a/src/tabs/tab_electrical.py b/src/tabs/tab_electrical.py new file mode 100644 index 0000000..f30cee0 --- /dev/null +++ b/src/tabs/tab_electrical.py @@ -0,0 +1,155 @@ +import tkinter as tk +from tkinter import ttk +import math + +import matplotlib +matplotlib.use("TkAgg") +import matplotlib.pyplot as plt +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg + +import numpy as np + +class TabElectrical: + def __init__(self, notebook, tab_simulator, tab_coil): + """ + Pestaña para estimar la potencia y corriente necesarias + para suministrar la energía 'E_mec' en diferentes tiempos, + con un voltaje fijo V. + - 'tab_simulator': donde se calcula la energía mecánica requerida. + - 'tab_coil': por si quieres leer datos de la bobina (en este ejemplo, + no lo usamos ya, pero lo mantenemos para coherencia). + """ + self.notebook = notebook + self.tab_sim = tab_simulator + self.tab_coil = tab_coil + + # Creamos el frame principal de la pestaña + self.frame = tk.Frame(notebook) + self.frame.pack(fill="both", expand=True) + # Nota: si en main.py ya se hace 'notebook.add(self.frame, text="Eléctrico")', + # no repitas esa línea aquí. + + # Layout principal (izquierda: controles, derecha: gráfica) + frame_left = tk.Frame(self.frame) + frame_left.pack(side="left", fill="y", padx=5, pady=5) + + frame_right = tk.Frame(self.frame, bd=2, relief="groove") + frame_right.pack(side="right", fill="both", expand=True, padx=5, pady=5) + + # + # Sección Izquierda + # + tk.Label(frame_left, text="Simulación Eléctrica (Potencia & Corriente)").pack(anchor="w", pady=3) + + btn_import = tk.Button( + frame_left, text="Importar Config", + command=self.import_config + ) + btn_import.pack(pady=5, anchor="w") + + # Variables + self.var_emech = tk.DoubleVar(value=0.0) # Energía mecánica importada + self.var_V = tk.DoubleVar(value=12.0) # Voltaje (valor por defecto 12 V) + self.var_tmax = tk.DoubleVar(value=2.0) # Tiempo máximo de estudio (s) + + # Muestra la energía mecánica importada + tk.Label(frame_left, text="E_mec (J):").pack(anchor="w") + self.lbl_emech = tk.Label(frame_left, text="N/A") + self.lbl_emech.pack(anchor="w", pady=2) + + # Frame para pedir V y T_max + param_frame = tk.Frame(frame_left, bd=1, relief="sunken") + param_frame.pack(fill="x", pady=10) + + tk.Label(param_frame, text="Voltaje (V):").grid(row=0, column=0, sticky="w", padx=4, pady=2) + self.entry_V = tk.Entry(param_frame, width=8, textvariable=self.var_V) + self.entry_V.grid(row=0, column=1, padx=5, pady=2) + + tk.Label(param_frame, text="T_max (s):").grid(row=1, column=0, sticky="w", padx=4, pady=2) + self.entry_Tmax = tk.Entry(param_frame, width=8, textvariable=self.var_tmax) + self.entry_Tmax.grid(row=1, column=1, padx=5, pady=2) + + # Botón de simulación + btn_simular = tk.Button(param_frame, text="Simular", command=self.simular) + btn_simular.grid(row=2, column=0, columnspan=2, pady=5) + + # + # Sección Derecha: gráficas + # + self.fig = plt.Figure(figsize=(5, 3), dpi=100) + + # Subplot 1: Potencia vs tiempo + self.ax_p = self.fig.add_subplot(211) + # Subplot 2: Corriente vs tiempo + self.ax_i = self.fig.add_subplot(212) + + self.canvas = FigureCanvasTkAgg(self.fig, master=frame_right) + self.canvas_widget = self.canvas.get_tk_widget() + self.canvas_widget.pack(fill="both", expand=True) + + def import_config(self): + """ + Importa la energía mecánica desde la pestaña de simulación. + Ajusta la variable self.var_emech. + """ + # Supongamos que TabSimulator tiene un método 'get_energy_required()' + # que devuelve la energía calculada. + try: + E_mech_val = self.tab_sim.get_energy_required() + except: + E_mech_val = 0.0 + + self.var_emech.set(E_mech_val) + self.lbl_emech.config(text=f"{E_mech_val:.3f} J") + + def simular(self): + """ + Barrido de tiempos (0..T_max): + P(t) = E / t + I(t) = P(t) / V + Se grafican P(t) e I(t). + """ + E = self.var_emech.get() # Joules + V = self.var_V.get() # Voltios + T_max = self.var_tmax.get() # s + + # Evitar tiempos <= 0 + if T_max <= 0.0: + T_max = 2.0 + self.var_tmax.set(T_max) + + # Creamos un vector de tiempos discretos, evitando t=0 + # por ejemplo de 0.01 a T_max en 50 pasos + t_vals = np.linspace(0.01, T_max, 50) + p_vals = [] # Potencia en cada t + i_vals = [] # Corriente en cada t + + for t in t_vals: + # P(t) = E / t + P_t = 0.0 + I_t = 0.0 + if t > 0: + P_t = E / t + # I(t) = P(t)/V = E/(V*t) + if V > 1e-12: + I_t = P_t / V + + p_vals.append(P_t) + i_vals.append(I_t) + + # Graficamos + self.ax_p.clear() + self.ax_p.plot(t_vals, p_vals, label="P(t) = E / t", color="blue") + self.ax_p.set_xlabel("Tiempo (s)") + self.ax_p.set_ylabel("Potencia (W)") + self.ax_p.grid(True) + self.ax_p.legend() + + self.ax_i.clear() + self.ax_i.plot(t_vals, i_vals, label="I(t) = P(t)/V", color="red") + self.ax_i.set_xlabel("Tiempo (s)") + self.ax_i.set_ylabel("Corriente (A)") + self.ax_i.grid(True) + self.ax_i.legend() + + self.canvas.draw() diff --git a/tab_search.py b/src/tabs/tab_search.py similarity index 100% rename from tab_search.py rename to src/tabs/tab_search.py diff --git a/tab_simulator.py b/src/tabs/tab_simulator.py similarity index 99% rename from tab_simulator.py rename to src/tabs/tab_simulator.py index 0002cbd..25dc3c6 100644 --- a/tab_simulator.py +++ b/src/tabs/tab_simulator.py @@ -125,6 +125,8 @@ class TabSimulator: self.label_Esobredim = tk.Label(self.frame_energy, text="E_total x1.15: 0.0 J") self.label_Esobredim.pack(anchor="w", padx=5) + + self.energy_required = 0.0 # Logger self.text_log = tk.Text(self.frame_log, height=2, state="normal") @@ -463,9 +465,14 @@ class TabSimulator: if y_>0: Ep=self.m*9.8*y_ E_tot=Ec+Ep + self.energy_required = E_tot E_sobredim=1.15*E_tot self.label_Ec.config(text=f"Ec: {Ec:.2f} J") self.label_Ep.config(text=f"Ep: {Ep:.2f} J") self.label_Etot.config(text=f"E_total: {E_tot:.2f} J") self.label_Esobredim.config(text=f"E_total x1.15: {E_sobredim:.2f} J") + + def get_energy_required(self): + return self.energy_required +