Source code for pyleecan.Methods.Machine.Lamination.get_yoke_desc

from numpy import exp, pi

from ....Classes.Arc1 import Arc1
from ....Classes.Arc3 import Arc3
from ....Functions.Geometry.merge_notch_list import merge_notch_list


[docs]def get_yoke_desc(self, sym=1, is_reversed=False, line_label=None): """This method returns an ordered description of the elements that defines the yoke radius of the lamination Parameters ---------- self : Lamination A Lamination object sym : int Symetry factor (2=half the lamination) is_reversed : bool True to return the line in clockwise oder line_label : str Label to apply on the lines Returns ------- yoke_desc : list list of dictionary with key: "begin_angle", "end_angle", "obj" yoke_lines : list List of Lines to draw the yoke """ Ryoke = self.get_Ryoke() if self.yoke_notch is None or len(self.yoke_notch) == 0: # No notches if sym == 1: yoke_desc = list() yoke_desc.append( { "obj": Arc3(begin=Ryoke, end=-Ryoke, is_trigo_direction=True), "begin_angle": 0, "end_angle": pi, } ) yoke_desc.append( { "obj": Arc3(begin=-Ryoke, end=Ryoke, is_trigo_direction=True), "begin_angle": 0, "end_angle": pi, } ) else: yoke_desc = [ { "obj": Arc1( begin=Ryoke, end=Ryoke * exp(1j * 2 * pi / sym), radius=Ryoke, is_trigo_direction=True, ), "begin_angle": 0, "end_angle": 2 * pi / sym, } ] else: # Get the notches notch_list = self.get_notch_list(sym=sym, is_yoke=True) # Add all the yoke lines yoke_desc = list() for ii, desc in enumerate(notch_list): yoke_desc.append(desc) if ii != len(notch_list) - 1: yoke_dict = dict() yoke_dict["begin_angle"] = notch_list[ii]["end_angle"] yoke_dict["end_angle"] = notch_list[ii + 1]["begin_angle"] yoke_dict["obj"] = Arc1( begin=Ryoke * exp(1j * yoke_dict["begin_angle"]), end=Ryoke * exp(1j * yoke_dict["end_angle"]), radius=Ryoke, is_trigo_direction=True, ) yoke_desc.append(yoke_dict) # Add last yoke line if sym == 1 and len(notch_list) > 0: yoke_dict = dict() yoke_dict["begin_angle"] = notch_list[-1]["end_angle"] yoke_dict["end_angle"] = notch_list[0]["begin_angle"] yoke_dict["obj"] = Arc1( begin=Ryoke * exp(1j * yoke_dict["begin_angle"]), end=Ryoke * exp(1j * yoke_dict["end_angle"]), radius=Ryoke, is_trigo_direction=True, ) if notch_list[0]["begin_angle"] < 0: # First element is an slot or notch yoke_desc.append(yoke_dict) else: # First element is a yoke line yoke_desc.insert(0, yoke_dict) elif sym != 1: # With symmetry # Add last yoke line yoke_dict = dict() yoke_dict["begin_angle"] = notch_list[-1]["end_angle"] yoke_dict["end_angle"] = 2 * pi / sym yoke_dict["obj"] = Arc1( begin=Ryoke * exp(1j * yoke_dict["begin_angle"]), end=Ryoke * exp(1j * yoke_dict["end_angle"]), radius=Ryoke, is_trigo_direction=True, ) yoke_desc.append(yoke_dict) # Add first yoke line yoke_dict = dict() yoke_dict["begin_angle"] = 0 yoke_dict["end_angle"] = notch_list[0]["begin_angle"] yoke_dict["obj"] = Arc1( begin=Ryoke * exp(1j * yoke_dict["begin_angle"]), end=Ryoke * exp(1j * yoke_dict["end_angle"]), radius=Ryoke, is_trigo_direction=True, ) yoke_desc.insert(0, yoke_dict) # Convert the description to lines yoke_lines = list() for yoke in yoke_desc: if isinstance(yoke["obj"], (Arc1, Arc3)): yoke_lines.append(yoke["obj"]) elif "lines" in yoke: # Duplicated slot for line in yoke["lines"]: yoke_lines.append(line.copy()) yoke_lines[-1].rotate((yoke["begin_angle"] + yoke["end_angle"]) / 2) else: # Notches self.is_internal = not self.is_internal # To draw slot on yoke lines = yoke["obj"].build_geometry() self.is_internal = not self.is_internal # To draw slot on yoke for line in lines: line.rotate((yoke["begin_angle"] + yoke["end_angle"]) / 2) yoke_lines.extend(lines) # Reverse the lines if is_reversed: yoke_lines = yoke_lines[::-1] for line in yoke_lines: line.reverse() # Set line label if line_label is not None: for line in yoke_lines: line.label = line_label return yoke_desc, yoke_lines