Source code for pyleecan.Methods.Machine.Lamination.build_yoke_side_line
from ....Functions.labels import (
BOUNDARY_PROP_LAB,
YS_LAB,
YSR_LAB,
YSL_LAB,
)
from numpy import exp, pi, angle as np_angle
DELTA = 1e-6
from ....Classes.Segment import Segment
[docs]def build_yoke_side_line(
self, sym, vent_surf_list, ZBR=None, ZTR=None, ZBL=None, ZTL=None
):
"""Define the Yoke Side lines of a Lamination by taking into account sym and vent
Parameters
----------
self: Lamination
a Lamination object
sym : int
Symmetry factor (1= full machine, 2= half of the machine...)
vent_surf_list :
List of the ventilation surfaces
ZBR : Complex
Yoke Side Limit point Bottom Right
ZTR : Complex
Yoke Side Limit point Top Right
ZBL : Complex
Yoke Side Limit point Bottom Left
ZTL : Complex
Yoke Side Limit point Top Left
Returns
-------
right_list, left_list: ([Line], [Line])
List of the lines to draw the left and right side of the yoke
"""
# Find the ventilation lines that collide with the Yoke Side
inter_line_list_R, inter_line_list_L = list(), list()
for surf in vent_surf_list:
for line in surf.get_lines():
if (
line.prop_dict is not None
and BOUNDARY_PROP_LAB in line.prop_dict
and YS_LAB in line.prop_dict[BOUNDARY_PROP_LAB]
):
# Find if the line collide on right or left
if abs(np_angle(line.get_middle())) < DELTA:
inter_line_list_R.append(line)
else:
inter_line_list_L.append(line)
# Yoke Limit point
if ZBR is None:
alpha = 2 * pi / sym
ZBR = self.Rint
ZTR = self.Rext
ZBL = ZBR * exp(1j * alpha)
ZTL = ZTR * exp(1j * alpha)
lam_lab = self.get_label()
if self.is_internal:
right_list = merge_line_list(
ZBR, ZTR, lam_lab + "_" + YSR_LAB, inter_line_list_R
)
left_list = merge_line_list(
ZTL, ZBL, lam_lab + "_" + YSL_LAB, inter_line_list_L
)
else:
left_list = merge_line_list(
ZBL, ZTL, lam_lab + "_" + YSL_LAB, inter_line_list_L
)
right_list = merge_line_list(
ZTR, ZBR, lam_lab + "_" + YSR_LAB, inter_line_list_R
)
return right_list, left_list
[docs]def merge_line_list(Z1, Z2, label, inter_list):
"""Merge the ventilation lines and the yoke side line"""
is_int_to_ext = abs(Z1) < abs(Z2)
# Always number the lines from int to out (to match both sides)
if not is_int_to_ext:
Z1, Z2 = Z2, Z1
# Sort the inter_list by begin (assume that the vents doesn't collide)
inter_list.sort(key=lambda x: abs(x.get_begin()), reverse=False)
# Make sure that all the lines are int to ext
for line in inter_list:
if abs(line.get_end()) < abs(line.get_begin()):
line.reverse()
line_list = list()
Zb = Z1 # Current Begin
ii = 0 # Line index
for line in inter_list:
line_list.append(
Segment(
Zb,
line.get_begin(),
prop_dict={BOUNDARY_PROP_LAB: label + "-" + str(ii)},
)
)
ii += 1
line.prop_dict[BOUNDARY_PROP_LAB] = label + "-" + str(ii)
ii += 1
Zb = line.get_end()
# Add last line (or Z1 to Z2 if no intersection)
line_list.append(
Segment(Zb, Z2, prop_dict={BOUNDARY_PROP_LAB: label + "-" + str(ii)})
)
# reverse the lines if needed
if not is_int_to_ext:
line_list = line_list[::-1]
for line in line_list:
line.reverse()
return line_list