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