Source code for pyleecan.GUI.Dialog.DMachineSetup.SMagnet.SMagnet

# -*- coding: utf-8 -*-

from numpy import pi
from PySide2.QtCore import Signal
from PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QDialog, QMessageBox

from .....Classes.Magnet import Magnet
from .....Classes.MagnetType13 import MagnetType13
from .....Classes.Slot import Slot
from .....GUI.Dialog.DMachineSetup.SMagnet.PMagnet10.PMagnet10 import PMagnet10
from .....GUI.Dialog.DMachineSetup.SMagnet.PMagnet11.PMagnet11 import PMagnet11
from .....GUI.Dialog.DMachineSetup.SMagnet.PMagnet12.PMagnet12 import PMagnet12
from .....GUI.Dialog.DMachineSetup.SMagnet.PMagnet13.PMagnet13 import PMagnet13
from .....GUI.Dialog.DMachineSetup.SMagnet.PMagnet14.PMagnet14 import PMagnet14
from .....GUI.Dialog.DMachineSetup.SMagnet.Ui_SMagnet import Ui_SMagnet


[docs]class SMagnet(Ui_SMagnet, QDialog): """Step to set the magnet (and slot) for SPMSM/SIPMSM""" # Signal to DMachineSetup to know that the save popup is needed saveNeeded = Signal() # Information for DMachineType nav step_name = "Magnet" def __init__(self, machine, matlib, is_stator=False): """Initialize the widget according to machine Parameters ---------- self : SMagnet A SMagnet widget machine : Machine current machine to edit matlib : MatLib Material Library is_stator : bool To adapt the GUI to set either the stator or the rotor """ # Build the interface according to the .ui file QDialog.__init__(self) self.setupUi(self) # Saving arguments self.machine = machine self.matlib = matlib self.is_stator = is_stator # Get the correct available widgets according to the machine if self.machine.rotor.is_internal: self.wid_list = [PMagnet10, PMagnet11, PMagnet12, PMagnet13, PMagnet14] elif self.machine.type_machine == 6: # For SPMSM only polar magnet for external rotor self.wid_list = [PMagnet11] else: # Magnet 14 not available for SIPMSM self.wid_list = [PMagnet10, PMagnet11, PMagnet12, PMagnet13] self.mag_type_index = [wid.mag_type for wid in self.wid_list] self.slot_type_index = [wid.slot_type for wid in self.wid_list] self.mag_name_index = [wid.mag_name for wid in self.wid_list] # Help URL self.b_help.url = "https://eomys.com/produits/manatee/howtos/article/" self.b_help.url += "how-to-set-up-inset-magnet" # Fill the combobox with the available magnet self.c_type.clear() for mag in self.mag_name_index: self.c_type.addItem(mag) # Avoid erase all the parameters when navigating though the magnets self.previous_mag = dict() for mag_type in self.mag_type_index: self.previous_mag[mag_type] = None # Set the GUI with the current values if provided if ( type(self.machine.rotor.slot) is Slot or self.machine.rotor.slot.magnet is None or type(self.machine.rotor.slot.magnet[0]) is Magnet ): # Magnet or slot not set # Type 11 is default self.set_type(1) self.c_type.setCurrentIndex(1) else: # The Magnet is set => load the parameter # Set the type index = self.mag_type_index.index(type(self.machine.rotor.slot.magnet[0])) self.set_type_gui(index) self.c_type.setCurrentIndex(index) # Only one magnet in the GUI (for now) self.machine.rotor.slot.W3 = 0 # Set magnetization if self.machine.rotor.slot.magnet[0].type_magnetization is None: self.machine.rotor.slot.magnet[0].type_magnetization = 0 self.c_type_magnetization.setCurrentIndex( self.machine.rotor.slot.magnet[0].type_magnetization ) self.set_slot_pitch() # Set material self.w_mat.setText(self.tr("mat_mag:")) self.w_mat.def_mat = "Magnet1" self.w_mat.update(self.machine.rotor.slot.magnet[0], "mat_type", self.matlib) # Connect signals self.c_type.currentIndexChanged.connect(self.set_type) self.c_type_magnetization.currentIndexChanged.connect( self.s_set_type_magnetization ) self.b_plot.clicked.connect(self.s_plot) self.w_mat.saveNeeded.connect(self.emit_save)
[docs] def set_slot_pitch(self): """Update the slot pitch text Parameters ---------- self : SMagnet A SMagnet object """ Nmag_txt = self.tr("Number of magnets = 2p = ") if self.machine.rotor.slot.Zs is not None: Zs = self.machine.rotor.slot.Zs out = Nmag_txt + str(Zs) + " => " Slot_pitch = 360.0 / Zs Slot_pitch_rad = Slot_pitch * pi / 180 pitch_txt = self.tr("Slot pitch = ") out += ( pitch_txt + "%.4g" % (Slot_pitch) + u" ° (" + "%.4g" % (Slot_pitch_rad) + " rad)" ) self.out_Nmag.setText(out) else: self.out_Nmag.setText(Nmag_txt + "?")
[docs] def emit_save(self): """Emit the saveNeeded signal for the DMachineSetup""" self.saveNeeded.emit()
[docs] def set_type_gui(self, index): """Change the GUI to the correct Magnet widget Parameters ---------- self : SMagnet A SMagnet object index : int Index of the Magnet type to use """ # Regenerate the pages with the new values self.w_mag.setParent(None) self.w_mag = self.wid_list[index](self.machine) self.w_mag.saveNeeded.connect(self.emit_save) # Refresh the GUI self.main_layout.removeWidget(self.w_mag) self.main_layout.insertWidget(2, self.w_mag)
[docs] def set_type_obj(self, index): """Set the type of magnet (update only the object) Parameters ---------- self : SMagnet A SMagnet object index : int Index of the Magnet type to use """ # Save the mag slot = self.machine.rotor.slot if slot.magnet is not None: self.previous_mag[type(slot.magnet[0])] = slot if self.previous_mag[self.mag_type_index[index]] is None: # Set the slot Zs = self.machine.rotor.slot.Zs self.machine.rotor.slot = self.slot_type_index[index]() self.machine.rotor.slot._set_None() self.machine.rotor.slot.Zs = Zs self.machine.rotor.slot.W3 = 0 # Set the magnet self.machine.rotor.slot.magnet = list() mag = self.mag_type_index[index]() self.machine.rotor.slot.magnet.append(mag) self.machine.rotor.slot.magnet[0]._set_None() else: self.machine.rotor.slot = self.previous_mag[self.mag_type_index[index]]
[docs] def set_type(self, index): """Signal to set the type of magnet (update both the object and the gui) Parameters ---------- self : SMagnet A SMagnet object index : int Index of the Magnet type to use """ self.set_type_obj(index) self.set_type_gui(index) # Notify the machine GUI that the machine has changed self.saveNeeded.emit()
[docs] def s_plot(self): """Plot the current machine Parameters ---------- self : SMagnet A SMagnet object """ # We have to make sure the slot is right before truing to plot it error = self.check(self.machine.rotor) if error: # Error => Display it QMessageBox().critical(self, self.tr("Error"), error) else: # No error => Plot the machine self.machine.plot()
[docs] @staticmethod def check(lamination): """Check that the current machine have all the needed field set Parameters ---------- lamination : Lamination Lamination to check Returns ------- error: str Error message (return None if no error) """ try: # Check that everything is set if lamination.slot.magnet[0].Wmag is None: return "You must set Wmag !" if lamination.slot.magnet[0].Hmag is None: return "You must set Hmag !" if ( hasattr(lamination.slot.magnet[0], "Rtop") and lamination.slot.magnet[0].Rtop is None ): return "You must set Rtopm !" if lamination.slot.H0 is None: return "You must set H0 !" except Exception as e: return str(e) # Check that everything is set right try: mec_gap = lamination.parent.comp_width_airgap_mec() except: return "Unable to draw the magnet, " "please check your geometry !" if mec_gap <= 0: return "You must have gap_min > 0 (reduce Hmag) !" if hasattr(lamination.slot.magnet[0], "Rtop"): if ( type(lamination.slot.magnet[0]) is MagnetType13 and lamination.slot.magnet[0].Rtop < lamination.slot.magnet[0].Wmag / 2.0 ): return "You must have Rtopm >= Wmag/2 !"
[docs] def s_set_type_magnetization(self, index): """Signal to update the value of type_magnetization according to the combobox Parameters ---------- self : SMagnet A SMagnet object index : int Current index of the combobox """ self.machine.rotor.slot.magnet[0].type_magnetization = index # Notify the machine GUI that the machine has changed self.saveNeeded.emit()