Source code for pyleecan.GUI.Dialog.DMachineSetup.SWPole.SWPole
# -*- coding: utf-8 -*-
from numpy import pi
from PySide2.QtCore import Signal
from PySide2.QtWidgets import QMessageBox, QWidget
from .....Classes.LamSlotWind import LamSlotWind
from .....Classes.Slot import Slot
from .....Classes.SlotW60 import SlotW60
from .....Classes.SlotW61 import SlotW61
from .....Classes.Slot import Slot
from .....GUI.Dialog.DMachineSetup.SWPole.PWSlot60.PWSlot60 import PWSlot60
from .....GUI.Dialog.DMachineSetup.SWPole.PWSlot61.PWSlot61 import PWSlot61
from .....GUI.Dialog.DMachineSetup.SWPole.Ui_SWPole import Ui_SWPole
from .....Functions.Plot.set_plot_gui_icon import set_plot_gui_icon
# List to convert index of combobox to slot type
INIT_INDEX = [SlotW60, SlotW61]
NAME_INDEX = [slot.__name__ for slot in INIT_INDEX]
WIDGET_LIST = [PWSlot60, PWSlot61]
[docs]class SWPole(Ui_SWPole, QWidget):
"""Step to set the lamination pole (for WRSM)"""
# Signal to DMachineSetup to know that the save popup is needed
saveNeeded = Signal()
# Information for DMachineSetup
step_name = "Pole"
def __init__(self, machine, material_dict, is_stator=False):
"""Initialize the GUI according to machine
Parameters
----------
self : SWPole
A SWPole widget
machine : Machine
current machine to edit
material_dict: dict
Materials dictionary (library + machine)
is_stator : bool
To adapt the GUI to set either the stator or the rotor
"""
# Build the interface according to the .ui file
QWidget.__init__(self)
self.setupUi(self)
# Saving arguments
self.machine = machine
self.material_dict = material_dict
self.is_stator = is_stator
self.test_err_msg = None # To check the error messages in test
self.b_help.hide()
# Avoid erase all the parameters when navigating though the slots
self.previous_slot = {SlotW60: None, SlotW61: None}
if self.is_stator:
self.obj = machine.stator
else:
self.obj = machine.rotor
# If the Slot is not set, initialize it with a SlotW60
if self.obj.slot is None or type(self.obj.slot) not in INIT_INDEX:
self.obj.slot = SlotW60()
self.obj.slot._set_None()
# Avoid error when loading WRSM with wrong rotor slot
if type(self.obj.slot) not in INIT_INDEX:
self.obj.slot = SlotW60()
self.obj.slot._set_None()
self.obj.slot.Zs = self.obj.winding.p * 2
self.update_slot_text(self.obj.slot.Zs)
# Set the correct index for the type checkbox
index = NAME_INDEX.index(type(self.obj.slot).__name__)
self.c_slot_type.setCurrentIndex(index)
# Update the slot widget
self.s_update_slot()
# Connect the slot/signal
self.c_slot_type.currentIndexChanged.connect(self.s_change_slot)
self.b_plot.clicked.connect(self.s_plot)
[docs] def emit_save(self):
"""Send a saveNeeded signal to the DMachineSetup"""
self.saveNeeded.emit()
[docs] def set_slot_type(self, index):
"""Initialize self.obj with the slot corresponding to index
Parameters
----------
self : SWPole
A SWPole object
index : int
Index of the selected slot type in the list
"""
# Save the slot
self.previous_slot[type(self.obj.slot)] = self.obj.slot
# Call the corresponding constructor
Zs = self.obj.slot.Zs
if self.previous_slot[INIT_INDEX[index]] is None:
# No previous slot of this type
self.obj.slot = INIT_INDEX[index]()
self.obj.slot._set_None() # No default value
self.obj.slot.Zs = Zs
else: # Load the previous slot of this type
self.obj.slot = self.previous_slot[INIT_INDEX[index]]
# Notify the machine GUI that the machine has changed
self.saveNeeded.emit()
[docs] def update_slot_text(self, Zs):
"""Update in_Zs and out_slot_pitch with the correct value
Parameters
----------
self : SWPole
A SWPole object
Zs : int
The current value of Zs
"""
sp_txt = self.tr("Slot pitch: 360 / Zs = ")
self.in_Zs.setText("Zs: 2*p = " + str(Zs))
if Zs in [None, 0]:
self.out_Slot_pitch.setText(sp_txt + "?")
else:
Slot_pitch = 360.0 / Zs
Slot_pitch_rad = Slot_pitch * pi / 180
self.out_Slot_pitch.setText(
sp_txt
+ "%.4g" % (Slot_pitch)
+ " [°] ("
+ "%.4g" % (Slot_pitch_rad)
+ " [rad])"
)
[docs] def s_update_slot(self):
"""Update the slot widget
Parameters
----------
self : SWPole
a SWPole object
"""
# Regenerate the pages with the new values
self.w_slot.setParent(None)
self.w_slot = WIDGET_LIST[self.c_slot_type.currentIndex()](self.obj)
self.w_slot.saveNeeded.connect(self.emit_save)
# Refresh the GUI
self.main_layout.removeWidget(self.w_slot)
self.main_layout.insertWidget(1, self.w_slot)
[docs] def s_change_slot(self, index):
"""Signal to update the interface and show a specific page
Parameters
----------
self : SWPole
a SWPole object
index : int
Index of w_page_stack to show
"""
# Current slot is removed and replaced by the new one
self.set_slot_type(index)
self.s_update_slot()
[docs] def s_plot(self):
"""Try to plot the lamination
Parameters
----------
self : SWPole
A SWPole object
"""
# We have to make sure the slot is right before trying to plot it
error = self.check(self.obj)
if error: # Error => Display it
self.test_err_msg = error
QMessageBox().critical(self, self.tr("Error"), self.test_err_msg)
else: # No error => Plot the lamination
self.obj.plot()
set_plot_gui_icon()
[docs] @staticmethod
def check(lam):
"""Check that the current machine have all the needed field set
Parameters
----------
lam : Lamination
Lamination to check
Returns
-------
error: str
Error message (return None if no error)
"""
# Call the check method of the slot (every slot type have a
# different check method)
try:
index = INIT_INDEX.index(type(lam.slot))
return WIDGET_LIST[index].check(lam)
except Exception as e:
return str(e)