Source code for pyleecan.Functions.Geometry.create_surface
from ...Classes.SurfLine import SurfLine
from ...Classes.Segment import Segment
from ...Classes.Arc import Arc
from ...Classes.Arc2 import Arc2
[docs]class SurfaceError(Exception):
pass
[docs]def create_surface(line_list):
"""Create a surface from a list of Line
Parameters
----------
line_list: list
list of line forming the surface
Returns
-------
surface: SurfLine
"""
ordered_list = [line_list.pop(0)]
first_element = ordered_list[0]
if isinstance(first_element, (Arc, Segment)):
end = first_element.get_end()
else:
raise NotImplementedError(
"The function create_surface only handles Arc and Segment lines."
)
surface_points = []
for _ in range(len(line_list)):
surface_points.append(end)
found = False
for line in line_list[:]:
if abs(end - line.get_begin()) < 1e-09:
new_line = line.copy()
new_line.begin = end
ordered_list.append(new_line)
end = new_line.get_end()
found = True
line_list.remove(line)
break
elif abs(end - line.get_end()) < 1e-09:
if isinstance(line, Segment):
new_line = Segment(begin=end, end=(line.begin))
elif isinstance(line, Arc):
new_line = Arc2(
begin=end, center=(line.get_center()), angle=(-line.get_angle())
)
else:
raise NotImplementedError(
"The function create_surface only handles Arc and Segment lines."
)
ordered_list.append(new_line)
end = new_line.get_end()
line_list.remove(line)
found = True
break
assert found, SurfaceError("Cannot find the next line of the surface")
ordered_list[0].begin = ordered_list[(-1)].get_end()
return SurfLine(
line_list=ordered_list, point_ref=(sum(surface_points) / len(surface_points))
)