# Source code for pyleecan.Methods.Geometry.Segment.split_line

from numpy import exp, angle, abs as np_abs

DELTA = 1e-9  # To remove computing noise

[docs]def split_line(self, Z1, Z2, is_top=True, is_join=False, label_join=""):
"""Cut the Segment according to a line defined by two complex

Parameters
----------
self : Segment
An Segment object
Z1 : complex
First point of the cutting Line
Z2 : complex
Second point of the cutting Line
is_top : bool
True to keep the part above the cutting line.
"Above" is in the coordinate system with Z1 in 0 and Z2 on the X>0 axis
is_join : bool
True to join the split_list with Segment if there is more that one remaining parts
label_join : str
Label of the join line

Returns
-------
split_list : list(Segment)
The selected part of the Segment (0 or 1 segment depending on cutting point)
"""

Z_int = self.intersect_line(Z1, Z2)
# Begin and end point in the line coordonate system
Zb = (self.begin - Z1) * exp(-1j * angle(Z2 - Z1))
Ze = (self.end - Z1) * exp(-1j * angle(Z2 - Z1))

if len(Z_int) == 0:
# No intersection copy the line
line = type(self)(init_dict=self.as_dict())
if Zb.imag >= 0 and Ze.imag >= 0 and is_top:
return [line]
if Zb.imag >= 0 and Ze.imag >= 0 and not is_top:
return []
if Zb.imag <= 0 and Ze.imag <= 0 and is_top:
return []
return [line]
if len(Z_int) == 1:
# One intersection => Three possible lines
# Begin => Intersection
if np_abs(Z_int - self.begin) > DELTA:
line_list_1 = [type(self)(init_dict=self.as_dict())]
line_list_1.end = Z_int
else:  # Begin == Intersection
line_list_1 = []
# Intersection => End
if np_abs(Z_int - self.end) > DELTA:
line_list_2 = [type(self)(init_dict=self.as_dict())]
line_list_2.begin = Z_int
else:  # Intersection == End
line_list_2 = []
# Copy of the complete line (begin or end on cutting line)
line_list_3 = [type(self)(init_dict=self.as_dict())]

# Return the correct line according to the points position
if Zb.imag > DELTA and is_top:
return line_list_1
if Zb.imag > DELTA and not is_top:
return line_list_2
if Zb.imag < -DELTA and is_top:
return line_list_2
if Zb.imag < -DELTA and not is_top:
return line_list_1
# Zb.imag == 0 => begin on cutting line
if Ze.imag > DELTA and is_top:
return line_list_3
if Ze.imag > DELTA and not is_top:
return []
if Ze.imag < -DELTA and is_top:
return []
if Ze.imag < -DELTA and not is_top:
return line_list_3
if len(Z_int) == 2:
# The segment is on the line => Copy the line
return [type(self)(init_dict=self.as_dict())]