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_join=False, prop_dict_join=None): """Cut the Segment according to a line defined by two complex "Above" is in the coordinate system with Z1 in 0 and Z2 on the X>0 axis Parameters ---------- self : Segment An Segment object Z1 : complex First point of the cutting Line Z2 : complex Second point of the cutting Line is_join : bool True to join the split_list with Segment if there is more that one remaining parts prop_dict_join : dict Property dict to set on the join line Returns ------- top_split_list, bot_split_list : ([Segment], [Segment]) Both part of the Segment (1 or 2 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 if Zb.imag >= 0 and Ze.imag >= 0: # Begin and end on top return [self.copy()], [] elif Zb.imag <= 0 and Ze.imag <= 0: # Begin and end on bot return [], [self.copy()] else: raise Exception("Split Segment error (case 0 int)") # return [self.copy()], [] elif len(Z_int) == 1: # One intersection => Three possible lines # Begin => Intersection line1 = self.copy() line1.end = Z_int[0] # Intersection => End line2 = self.copy() line2.begin = Z_int[0] # begin or end on cutting line line3 = self.copy() # Return the correct line according to the points position if Zb.imag > DELTA and abs(Ze.imag) > DELTA: # begin on top, end != Int return [line1], [line2] elif Zb.imag > DELTA: return [line3], [] elif Zb.imag < -DELTA and abs(Ze.imag) > DELTA: # begin on bot, end != Int return [line2], [line1] elif Zb.imag < -DELTA: return [], [line3] # Zb.imag == 0 => begin on cutting line elif Ze.imag > DELTA: # End on top return [line3], [] elif Ze.imag < -DELTA: # End on bot return [], [line3] else: raise Exception("Split Segment error (case 1 int)") elif len(Z_int) == 2: # The segment is on the line => Copy the line twice return [self.copy()], [self.copy()]