Source code for pyleecan.Methods.Machine.Machine.plot_anim_rotor
from numpy import pi
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.pyplot import subplots
from matplotlib.patches import Polygon
[docs]def plot_anim_rotor(self, Nframe, Tanim, Nrot=1, is_loop=True):
"""Plot the machine with an animation of the rotor
(Internal Rotor for now ?)
Parameters
----------
self : Machine
Machine object
Nframe: int
Number of frame for the animation
Tanim : float
Duration of the animation [ms]
Nrot : float
Number of rotation
is_loop : bool
True to activate the loop animation
"""
# Display
fig, axes = subplots()
axes.set_xlabel("(m)")
axes.set_ylabel("(m)")
axes.set_title("Machine")
# Axis Setup
axes.axis("equal")
# The Lamination is centered in the figure
Lim = (self.stator.Rext) * 1.5 # Axes limit for plot
Rsurf = self.rotor.build_geometry(sym=1, alpha=0, delta=0)
# Rotation angle between each frame
Dalpha = 2 * pi * Nrot / Nframe
def init():
"""Create the patches for the first image"""
Spatches = self.stator.plot(is_display=False)
Rpatches = self.rotor.plot(is_display=False)
for patch in Spatches:
axes.add_patch(patch)
for patch in Rpatches:
axes.add_patch(patch)
return []
def update_rotor(ii):
"""Rotate and update the rotor patches"""
for ii in range(len(Rsurf)):
Rsurf[ii].rotate(Dalpha)
patches = Rsurf[ii].get_patches()
for patch in patches:
if type(patch) is Polygon:
axes.patches[-len(Rsurf) + ii].xy = patch.xy
# elif type(patch) is Circle:
# pass
axes.set_xlim(-Lim, Lim)
axes.set_ylim(-Lim, Lim)
return []
# Animation definition
anim = animation.FuncAnimation(
fig,
update_rotor,
init_func=init,
frames=Nframe,
interval=Tanim / Nframe,
blit=True,
repeat=is_loop,
)
plt.show()