Source code for pyleecan.GUI.Dialog.DMachineSetup.SWindPat.SWindPat
# -*- coding: utf-8 -*-
from PySide2.QtCore import Qt, Signal
from PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QMessageBox, QWidget
from .....Classes.Winding import Winding
from .....Classes.WindingCW1L import WindingCW1L
from .....Classes.WindingCW2LR import WindingCW2LR
from .....Classes.WindingCW2LT import WindingCW2LT
from .....Classes.WindingDW1L import WindingDW1L
from .....Classes.WindingDW2L import WindingDW2L
from .....Functions.Winding.comp_wind_periodicity import comp_wind_periodicity
from .....GUI.Dialog.DMachineSetup.SWindPat.Gen_SWindPat import Gen_SWindPat
from .....Methods.Machine.Winding import WindingError
# For the Pattern combobox
TYPE_INDEX = [WindingCW2LT, WindingCW1L, WindingDW2L, WindingDW1L, WindingCW2LR]
[docs]class SWindPat(Gen_SWindPat, QWidget):
"""Step to define the winding pattern"""
# Signal to DMachineSetup to know that the save popup is needed
saveNeeded = Signal()
# Information for DMachineSetup nav
step_name = "Winding (1)"
def __init__(self, machine, matlib, is_stator=False):
"""Initialize the GUI according to machine
Parameters
----------
self : SWindPat
A SWindPat 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
QWidget.__init__(self)
self.setupUi(self)
# Set Help URL
self.b_help.url = "https://pyleecan.org/winding.convention.html"
# Saving arguments
self.machine = machine
self.matlib = matlib
self.is_stator = is_stator
# Fill the fields with the machine values (if they're filled)
if self.is_stator:
self.obj = machine.stator
else:
self.obj = machine.rotor
if machine.type_machine == 9 and not self.is_stator:
# Enforce tooth winding for WRSM rotor
self.obj.winding = WindingCW2LT(init_dict=self.obj.winding.as_dict())
self.obj.winding.qs = 1
self.b_preview.setEnabled(False)
self.si_qs.setEnabled(False)
self.c_wind_type.setEnabled(False)
self.c_wind_type.setCurrentIndex(0)
self.c_wind_type.setItemText(0, "DC wound winding for salient pole")
else:
self.b_preview.setEnabled(True)
self.si_qs.setEnabled(True)
self.c_wind_type.setEnabled(True)
self.c_wind_type.setItemText(0, "Double Layer Concentrated Orthoradial")
# Set the current Winding pattern
if self.obj.winding is None or type(self.obj.winding) is Winding:
# The default type_winding is WindingCW2LT
if type(self.obj.winding) is Winding:
self.obj.winding = WindingCW2LT(init_dict=self.obj.winding.as_dict())
else:
self.obj.winding = WindingCW2LT()
self.c_wind_type.setCurrentIndex(0)
else:
self.c_wind_type.setCurrentIndex(TYPE_INDEX.index(type(self.obj.winding)))
self.update_graph()
if type(self.obj.winding) is WindingDW2L:
if self.obj.winding.coil_pitch is None:
self.obj.winding.coil_pitch = 0
self.si_coil_pitch.setValue(self.obj.winding.coil_pitch)
if self.obj.winding.Nslot_shift_wind is None:
self.obj.winding.Nslot_shift_wind = 0
self.si_Nslot.setValue(self.obj.winding.Nslot_shift_wind)
if self.obj.winding.qs is None: # default value
self.obj.winding.qs = 3
self.si_qs.setValue(self.obj.winding.qs)
if self.obj.winding.Ntcoil is None:
self.obj.winding.Ntcoil = 1 # Default value for preview
if self.obj.winding.is_reverse_wind is None:
self.obj.winding.is_reverse_wind = False
if self.obj.winding.is_reverse_wind:
self.is_reverse.setCheckState(Qt.Checked)
else:
self.is_reverse.setCheckState(Qt.Unchecked)
# Display shape of wind_mat
self.set_output()
self.hide_coil_pitch()
# Connect the signal/slot
self.c_wind_type.currentIndexChanged.connect(self.set_type)
self.si_qs.editingFinished.connect(self.set_qs)
self.si_coil_pitch.editingFinished.connect(self.set_coil_pitch)
self.si_Nslot.valueChanged.connect(self.set_Nslot)
self.is_reverse.stateChanged.connect(self.set_is_reverse_wind)
self.b_preview.clicked.connect(self.s_plot)
[docs] def set_type(self, index):
"""Signal to update the winding type
Parameters
----------
self : SWindPat
A SWindPat object
index : int
Index of selected type
"""
w_dict = Winding.as_dict(self.obj.winding)
self.obj.winding = TYPE_INDEX[index](init_dict=w_dict)
# Update out_shape
self.set_output()
self.hide_coil_pitch()
# Update image
self.update_graph()
# Notify the machine GUI that the machine has changed
self.saveNeeded.emit()
[docs] def set_qs(self):
"""Signal to update the value of qs according to the spinbox
Parameters
----------
self : SWindPat
A SWindPat object
"""
self.obj.winding.qs = self.si_qs.value()
self.set_output()
self.update_graph()
# Notify the machine GUI that the machine has changed
self.saveNeeded.emit()
[docs] def set_coil_pitch(self):
"""Signal to update the value of coil_pitch according to the spinbox
Parameters
----------
self : SWindPat
A SWindPat object
"""
self.obj.winding.coil_pitch = self.si_coil_pitch.value()
self.set_output()
self.update_graph()
# Notify the machine GUI that the machine has changed
self.saveNeeded.emit()
[docs] def set_Nslot(self):
"""Signal to update the value of Nslot_shift_wind according to the
spinbox
Parameters
----------
self : SWindPat
A SWindPat object
"""
self.obj.winding.Nslot_shift_wind = self.si_Nslot.value()
self.update_graph()
# Notify the machine GUI that the machine has changed
self.saveNeeded.emit()
[docs] def set_is_reverse_wind(self, value):
"""Signal to update the value of is_reverse_wind according to the
widget
Parameters
----------
self : SWindPat
A SWindPat object
value :
New value of is_reverse_wind
"""
value = self.is_reverse.isChecked()
self.update_graph()
self.obj.winding.is_reverse_wind = value
# Notify the machine GUI that the machine has changed
self.saveNeeded.emit()
[docs] def hide_coil_pitch(self):
"""Show coil_pitch only if type(winding) is WindingDW2L
Parameters
----------
self : SWindPat
A SWindPat object
"""
self.si_coil_pitch.blockSignals(True)
if type(self.obj.winding) is WindingDW2L:
self.si_coil_pitch.show()
self.in_coil_pitch.show()
else:
self.si_coil_pitch.hide()
self.in_coil_pitch.hide()
self.si_coil_pitch.blockSignals(False)
[docs] def set_output(self):
"""Update the shape and period Label to match the current winding setup
Parameters
----------
self : SWindPat
a SWindPat object
"""
wind = self.obj.winding # For readability
# Wind_matrix is a matrix of dimension [Nlay_rad, Nlay_tan, Zs, qs]
# Nlay_rad and Nlay_tan depend of the winding type
(Nrad, Ntan) = wind.get_dim_wind()
Nlay = str(Nrad) + ", " + str(Ntan) + ", "
# Zs should be set, but to be sure:
if self.obj.slot.Zs is None:
Zs = "?, "
else:
Zs = str(self.obj.slot.Zs) + ", "
if wind.qs is None:
qs = "?]"
else:
qs = str(wind.qs) + "]"
self.out_shape.setText(self.tr("Matrix shape [") + Nlay + Zs + qs)
try:
ms = str(self.obj.slot.Zs / (wind.p * wind.qs * 2.0))
except TypeError: # One of the value is None
ms = "?"
if self.obj.is_stator:
self.out_ms.setText(self.tr("ms = Zs / (2*p*qs) = ") + ms)
else:
self.out_ms.setText(self.tr("ms = Zr / (2*p*qr) = ") + ms)
try:
wind_mat = wind.comp_connection_mat(self.obj.slot.Zs)
Nperw = str(comp_wind_periodicity(wind_mat)[0])
except Exception: # Unable to compution the connection matrix
Nperw = "?"
self.out_Nperw.setText(self.tr("Nperw: ") + Nperw)
[docs] def update_graph(self):
"""Plot the lamination with/without the winding"""
# Plot the lamination in the viewer fig
try:
self.obj.plot(fig=self.w_viewer.fig, is_show_fig=False)
except:
pass
# Update the Graph
self.w_viewer.axes.set_axis_off()
self.w_viewer.axes.axis("equal")
if self.w_viewer.axes.get_legend() is not None:
self.w_viewer.axes.get_legend().remove()
self.w_viewer.draw()
[docs] def s_plot(self):
"""Plot a preview of the winding in a popup
Parameters
----------
self : SWindPat
A SWindPat object
"""
try:
self.obj.plot_winding()
except (AssertionError, WindingError) as e:
QMessageBox().critical(self, self.tr("Error"), str(e))
[docs] @staticmethod
def check(lamination):
"""Check that the lamination 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.winding.qs is None:
return "You must set qs !"
if lamination.winding.Nslot_shift_wind is None:
lamination.winding.Nslot_shift_wind = 0
if lamination.winding.is_reverse_wind is None:
lamination.winding.is_reverse_wind = False
except Exception as e:
return str(e)