Boutons de projection de l'axe 3D
This commit is contained in:
@@ -12,7 +12,6 @@ PI = np.pi
|
|||||||
|
|
||||||
N_PTS = 400
|
N_PTS = 400
|
||||||
|
|
||||||
|
|
||||||
class TriPlot_TimeAxe(Axes):
|
class TriPlot_TimeAxe(Axes):
|
||||||
"""Classe d'axe temporel"""
|
"""Classe d'axe temporel"""
|
||||||
|
|
||||||
@@ -308,8 +307,17 @@ class TriPlot_3DAxe(Axes3D):
|
|||||||
self.theta
|
self.theta
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def projX(self, event=None):
|
||||||
|
self.view_init(89.99, -90.01, 'y')
|
||||||
|
self.get_figure().canvas.draw()
|
||||||
|
|
||||||
|
def projY(self, event=None):
|
||||||
|
self.view_init(0, -90.01, 'y')
|
||||||
|
self.get_figure().canvas.draw()
|
||||||
|
|
||||||
|
def projZ(self, event=None):
|
||||||
|
self.view_init(0, 0, 'y')
|
||||||
|
self.get_figure().canvas.draw()
|
||||||
return
|
return
|
||||||
|
|
||||||
class TriPlot:
|
class TriPlot:
|
||||||
@@ -334,7 +342,8 @@ class TriPlot:
|
|||||||
self.fig, [0.5, 0.1, 0.4, 0.4])
|
self.fig, [0.5, 0.1, 0.4, 0.4])
|
||||||
self.axe3D = TriPlot_3DAxe(self.v_max, self.phi,
|
self.axe3D = TriPlot_3DAxe(self.v_max, self.phi,
|
||||||
self.fig, [0.5, 0.6, 0.4, 0.4])
|
self.fig, [0.5, 0.6, 0.4, 0.4])
|
||||||
self.axes = [self.vectaxe, self.timeaxe, self.axe3D]
|
|
||||||
|
# -- Curseurs de réglage
|
||||||
self.amp_slider = Slider(
|
self.amp_slider = Slider(
|
||||||
ax=plt.axes([0.01, 0.1, 0.03, 0.8]),
|
ax=plt.axes([0.01, 0.1, 0.03, 0.8]),
|
||||||
label="Tension\nefficace",
|
label="Tension\nefficace",
|
||||||
@@ -351,16 +360,35 @@ class TriPlot:
|
|||||||
valinit=self.phi,
|
valinit=self.phi,
|
||||||
orientation="horizontal"
|
orientation="horizontal"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# -- Bouton de remise à zéro
|
||||||
self.reset_button = Button(
|
self.reset_button = Button(
|
||||||
ax=plt.axes([0.95, 0.01, 0.03, 0.03]),
|
ax=plt.axes([0.95, 0.01, 0.03, 0.03]),
|
||||||
label='Reset',
|
label='Reset'
|
||||||
hovercolor='0.975'
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# -- Cases de cocher pour les parametres de visibilité
|
||||||
self.parameters_check = CheckButtons(
|
self.parameters_check = CheckButtons(
|
||||||
ax=plt.axes([0.9, 0.8, 0.1, 0.2]),
|
ax=plt.axes([0.9, 0.8, 0.1, 0.2]),
|
||||||
labels=["Projection", "Valeur efficace"]
|
labels=["Projection", "Valeur efficace"]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# -- Boutons de projection de l'axe 3D
|
||||||
|
self.projX_button = Button(
|
||||||
|
ax=plt.axes([0.9, 0.67, 0.1, 0.03]),
|
||||||
|
label='Axe réel'
|
||||||
|
)
|
||||||
|
self.projY_button = Button(
|
||||||
|
ax=plt.axes([0.9, 0.635, 0.1, 0.03]),
|
||||||
|
label='Axe imaginaire'
|
||||||
|
)
|
||||||
|
self.projZ_button = Button(
|
||||||
|
ax=plt.axes([0.9, 0.60, 0.1, 0.03]),
|
||||||
|
label='Plan complexe'
|
||||||
|
)
|
||||||
|
|
||||||
|
# Listes et dictionaires
|
||||||
|
self.axes = [self.vectaxe, self.timeaxe, self.axe3D]
|
||||||
self.sliders = [self.amp_slider, self.phi_slider]
|
self.sliders = [self.amp_slider, self.phi_slider]
|
||||||
self.parameters = {}
|
self.parameters = {}
|
||||||
|
|
||||||
@@ -371,54 +399,77 @@ class TriPlot:
|
|||||||
return
|
return
|
||||||
|
|
||||||
def setup(self):
|
def setup(self):
|
||||||
|
# Appels aux fonctions de configuration initiale de chaque axe
|
||||||
for axe in self.axes:
|
for axe in self.axes:
|
||||||
axe.setup()
|
axe.setup()
|
||||||
|
# Configuration des widgets pour lancer un rafraichissement en cas de modification
|
||||||
for slider in self.sliders:
|
for slider in self.sliders:
|
||||||
slider.on_changed(self.refresh)
|
slider.on_changed(self.refresh)
|
||||||
self.reset_button.on_clicked(self.reset)
|
|
||||||
self.parameters_check.on_clicked(self.refresh)
|
self.parameters_check.on_clicked(self.refresh)
|
||||||
|
self.reset_button.on_clicked(self.reset)
|
||||||
|
self.projX_button.on_clicked(self.axe3D.projX)
|
||||||
|
self.projY_button.on_clicked(self.axe3D.projY)
|
||||||
|
self.projZ_button.on_clicked(self.axe3D.projZ)
|
||||||
|
|
||||||
|
# Affichage du Copyright
|
||||||
self.fig.text(0.01, 0.98, "Gaël Pongnot, CC-BY-NC", size=8)
|
self.fig.text(0.01, 0.98, "Gaël Pongnot, CC-BY-NC", size=8)
|
||||||
|
|
||||||
|
# Configuration de la fenêtre (Qt)
|
||||||
win = self.fig.canvas.window()
|
win = self.fig.canvas.window()
|
||||||
win.setMinimumSize(1200, 800)
|
win.setMinimumSize(1200, 800)
|
||||||
win.showMaximized()
|
win.showMaximized()
|
||||||
return
|
return
|
||||||
|
|
||||||
def refresh(self, val=None):
|
def refresh(self, val=None):
|
||||||
|
# Lecture des nouvelles valeurs
|
||||||
self.set_veff(self.amp_slider.val)
|
self.set_veff(self.amp_slider.val)
|
||||||
self.set_phi(self.phi_slider.val)
|
self.set_phi(self.phi_slider.val)
|
||||||
self.set_parameters(self.parameters_check.get_status())
|
self.set_parameters(self.parameters_check.get_status())
|
||||||
|
|
||||||
|
# Rafraichissement des axes
|
||||||
for axe in self.axes:
|
for axe in self.axes:
|
||||||
axe.refresh()
|
axe.refresh()
|
||||||
|
|
||||||
|
# Actualisation de l'affichage
|
||||||
self.fig.canvas.draw()
|
self.fig.canvas.draw()
|
||||||
return
|
return
|
||||||
|
|
||||||
def reset(self, event=None):
|
def reset(self, event=None):
|
||||||
|
# Remise à zéro des sliders -> déclenche un rafraichissement
|
||||||
for slider in self.sliders:
|
for slider in self.sliders:
|
||||||
slider.reset()
|
slider.reset()
|
||||||
return
|
return
|
||||||
|
|
||||||
def set_vmax(self, v_max):
|
def set_vmax(self, v_max):
|
||||||
|
# Modification des attributs liés à v_max
|
||||||
self.v_max = v_max
|
self.v_max = v_max
|
||||||
self.v_eff = v_max/np.sqrt(2)
|
self.v_eff = v_max/np.sqrt(2)
|
||||||
self.v_ref = self.v_max*np.cos(self.phasor)
|
self.v_ref = self.v_max*np.cos(self.phasor)
|
||||||
|
|
||||||
|
# Application du changement aux axes
|
||||||
for axe in self.axes:
|
for axe in self.axes:
|
||||||
axe.set_vmax(self.v_max)
|
axe.set_vmax(self.v_max)
|
||||||
return
|
return
|
||||||
|
|
||||||
def set_veff(self, v_eff):
|
def set_veff(self, v_eff):
|
||||||
|
# Transfert de la modification à set_vmax
|
||||||
self.set_vmax(np.sqrt(2)*v_eff)
|
self.set_vmax(np.sqrt(2)*v_eff)
|
||||||
return
|
return
|
||||||
|
|
||||||
def set_phi(self, phi):
|
def set_phi(self, phi):
|
||||||
|
# Modification des attributs liés à phi
|
||||||
self.phi = phi
|
self.phi = phi
|
||||||
|
|
||||||
|
# Application du changement aux axes
|
||||||
for axe in self.axes:
|
for axe in self.axes:
|
||||||
axe.set_phi(self.phi)
|
axe.set_phi(self.phi)
|
||||||
return
|
return
|
||||||
|
|
||||||
def set_parameters(self, p):
|
def set_parameters(self, p):
|
||||||
|
# Modification des attributs liés à p
|
||||||
self.parameters["projection"] = p[0]
|
self.parameters["projection"] = p[0]
|
||||||
self.parameters["v_eff"] = p[1]
|
self.parameters["v_eff"] = p[1]
|
||||||
|
# Application du changement aux axes
|
||||||
for axe in self.axes:
|
for axe in self.axes:
|
||||||
axe.set_parameters(self.parameters)
|
axe.set_parameters(self.parameters)
|
||||||
return
|
return
|
||||||
|
|||||||
Reference in New Issue
Block a user