Source code for pyleecan.GUI.Dialog.DMachineSetup.SMHoleMag.PHoleMUD.PHoleMUD

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

from numpy import pi
from PySide2.QtCore import Signal
from PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QWidget, QDialog
from PySide2.QtWidgets import QMessageBox
from PySide2.QtCore import Qt
from ......Functions.load import load
from ......Functions.GUI.log_error import log_error
from ......Classes.HoleUD import HoleUD
from ......GUI import gui_option
from ......GUI.Dialog.DMachineSetup.SMHoleMag.PHoleMUD.Ui_PHoleMUD import Ui_PHoleMUD
from ......Methods.Slot.Slot import SlotCheckError
from ......GUI.Dxf.DXF_Hole import DXF_Hole
from ......GUI.Dialog.DMatLib.WMatSelect.WMatSelect import WMatSelect


[docs]class PHoleMUD(Ui_PHoleMUD, QWidget): """Page to set the Hole from DXF""" # Signal to DMachineSetup to know that the save popup is needed saveNeeded = Signal() # Information for WHoleMag hole_name = "Import from DXF" hole_type = HoleUD def __init__(self, hole=None, material_dict=None): """Initialize the widget according to hole Parameters ---------- self : PHoleMUD A PHoleMUD widget hole : HoleUD current hole to edit material_dict: dict Materials dictionary (library + machine) """ # Build the interface according to the .ui file QWidget.__init__(self) self.setupUi(self) # Set properties self.material_dict = material_dict self.hole = hole self.u = gui_option.unit self.w_mat_dict = dict() # For magnet materials # Setup void material self.w_mat_0.setText("mat_void") self.w_mat_0.def_mat = "Air" self.w_mat_0.is_hide_button = True # Setup Path selector for Json files self.w_path_json.obj = None self.w_path_json.param_name = None self.w_path_json.verbose_name = "Load from json" self.w_path_json.extension = "JSON file (*.json)" self.w_path_json.update() # Update the GUI according to the current hole self.update_mag_list() self.update_graph() self.comp_output() # Connect the signals self.b_dxf.clicked.connect(self.open_dxf_hole) self.w_path_json.pathChanged.connect(self.load_hole)
[docs] def update_mag_list(self): """Update the material selector list according to hole magnet""" # Set void material self.w_mat_0.update(self.hole, "mat_void", self.material_dict) # Remove previous widget: for wid in self.w_mat_dict.values(): self.g_mat_layout.removeWidget(wid) wid.setParent(None) self.w_mat_dict = dict() # Update Magnet materials magnet_dict = self.hole.magnet_dict for key, mag in magnet_dict.items(): index = key.split("_")[-1] # Add widget self.w_mat_dict[key] = WMatSelect(self.g_mat) self.w_mat_dict[key].setObjectName("w_mat_" + str(index)) self.g_mat_layout.insertWidget(int(index) + 1, self.w_mat_dict[key]) # Setup Widget self.w_mat_dict[key].setText("Magnet " + str(index) + "") self.w_mat_dict[key].def_mat = "MagnetPrius" self.w_mat_dict[key].is_hide_button = True self.w_mat_dict[key].update( self.hole.magnet_dict["magnet_" + str(index)], "mat_type", self.material_dict, )
[docs] def update_graph(self): """Plot the lamination with/without the hole""" # Use a copy to avoid changing the main object lam = self.hole.parent.copy() try: self.hole.check() lam.hole = [self.hole] except SlotCheckError: # Plot only the lamination lam.hole = list() # Plot the lamination in the viewer fig lam.plot(fig=self.w_viewer.fig, is_show_fig=False) # 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 load_hole(self): """Load the selected json file and display the hole""" # Check that the json file is correct try: hole = load(self.w_path_json.get_path()) except Exception as e: log_error( self, "Error when loading hole json file " + self.w_path_json.get_path() + ":\n" + str(e), ) return # Check that the json file contain a HoleUD if not isinstance(hole, HoleUD): QMessageBox().critical( self, self.tr("Error"), self.tr( "The choosen file is not a HoleUD file (" + str(type(hole)) + ")" ), ) return # Update the hole object Zh = self.hole.Zh parent = self.hole.parent self.hole.__init__(init_dict=hole.as_dict()) # keep pointer self.hole.Zh = Zh self.hole.parent = parent # Update the new GUI according to the slot self.update_graph() self.update_mag_list() self.comp_output() self.emit_save()
[docs] def open_dxf_hole(self): """Open the GUI to define the HoleUD""" # Init GUI with lamination parameters try: self.dxf_gui = DXF_Hole( Zh=self.hole.Zh, Lmag=self.hole.parent.L1, lam=self.hole.parent ) self.dxf_gui.setWindowFlags(Qt.Window) # To maximize the GUI self.dxf_gui.show() # Update the hole when saving self.dxf_gui.accepted.connect(self.set_dxf_path) except Exception as e: log_error(self, "Error opening DXF import GUI for Hole:\n" + str(e))
[docs] def set_dxf_path(self): """Update the hole according to the file defined by DXF_Hole""" # Get the saving path from DXF_Hole self.w_path_json.set_path_txt(self.dxf_gui.save_path) # Update hole and GUI self.load_hole() self.dxf_gui = None
[docs] def comp_output(self): """Compute and display the hole output Parameters ---------- self : PHoleMUD A PHoleMUD widget """ is_set = False if self.check() is None: try: # We compute the output only if the hole is correctly set # Compute all the needed output as string s_surf = format(self.u.get_m2(self.hole.comp_surface()), ".4g") m_surf = format(self.u.get_m2(self.hole.comp_surface_magnets()), ".4g") (Rmin, Rmax) = self.hole.comp_radius() Rmin_txt = format(self.u.get_m(Rmin), ".4g") Rmax_txt = format(self.u.get_m(Rmax), ".4g") # Update the GUI to display the Output self.out_slot_surface.setText( "Hole full surface : " + s_surf + " [" + self.u.get_m2_name() + "]" ) self.out_magnet_surface.setText( "Hole magnet surface : " + m_surf + " [" + self.u.get_m2_name() + "]" ) self.out_Rmin.setText( "Rmin : " + Rmin_txt + " [" + self.u.get_m_name() + "]" ) self.out_Rmax.setText( "Rmax : " + Rmax_txt + " [" + self.u.get_m_name() + "]" ) is_set = True except: pass if not is_set: # We can't compute the output => We erase the previous version # (that way the user know that something is wrong) self.out_slot_surface.setText("Hole full surface : ?") self.out_magnet_surface.setText("Hole magnet surface : ?") self.out_Rmin.setText("Rmin : ?") self.out_Rmax.setText("Rmax : ?")
[docs] def check(self): """Check that the current machine have all the needed field set Parameters ---------- self : PHoleMUD A PHoleMUD widget Returns ------- error : str Error message (return None if no error) """ # Constraints and None try: self.hole.check() except SlotCheckError as error: return str(error)
[docs] def emit_save(self): """Send a saveNeeded signal to the DMachineSetup""" self.saveNeeded.emit()