source/geometry_viewer.py
Pedro Jose Romero Gombau 93c9e7b91b Init
2025-01-16 16:28:45 +01:00

72 lines
2.4 KiB
Python

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()