Pamhyr2/src/Model/Geometry/Profile.py

207 lines
4.4 KiB
Python

# -*- coding: utf-8 -*-
from tools import timer
from Model.Geometry.Point import Point
from Model.Except import NotImplementedMethodeError
class Profile(object):
def __init__(self, num: int = 0,
kp:float = 0.0, name:str = "",
code1: int = 0, code2: int = 0,
_type:str = "", reach = None):
super(Profile, self).__init__()
self._num = int(num)
self._code1 = int(code1)
self._code2 = int(code2)
self._kp = float(kp)
self._name = str(name)
self._reach = reach
self._points: List[Point] = []
self._profile_type = _type
@property
def number_points(self):
return len(self._points)
@property
def points(self):
return self._points.copy()
@property
def reach(self):
return self._reach
@property
def num(self):
"""
Returns:
Number of profile.
"""
return self._num
@num.setter
def num(self, value: int):
self._num = int(value)
@property
def code1(self):
"""
Returns:
Interpolation code 1.
"""
return self._code1
@code1.setter
def code1(self, value: int):
self._code1 = int(value)
@property
def code2(self):
"""
Returns:
Interpolation code 2.
"""
return self._code2
@code2.setter
def code2(self, value: int):
self._code2 = int(value)
@property
def nb_points(self):
return len(self._points)
@property
def kp(self):
"""
Returns:
Kilometer point.
"""
return self._kp
@kp.setter
def kp(self, value: float):
self._kp = float(value)
@property
def name(self):
"""
Returns:
Profile name.
"""
return self._name
@name.setter
def name(self, value: str):
self._name = value.strip()
@property
def profile_type(self):
"""
Returns:
Profile type.
"""
return self._profile_type
@profile_type.setter
def profile_type(self, value: str):
self._profile_type = value
def point(self, i:int):
if i < len(self._points):
return self._points[i]
return None
def named_points(self):
"""List of named point
Returns:
The list of named point
"""
return [point for point in self._points
if point.point_is_named()]
def insert_point(self, index: int, point:Point):
"""Insert point at index.
Args:
index: The index of new profile.
point: The point.
Returns:
Nothing.
"""
self._points.insert(index, point)
def delete(self, index: int):
"""Delete the point at index
Args:
index: Index of point.
Returns:
Nothing.
"""
try:
self._points.pop(index)
except IndexError:
raise IndexError(f"Invalid point index: {index}")
# Move
def move_up_point(self, index: int):
if index < len(self._points):
next = index - 1
p = self._points
p[index], p[next] = p[next], p[index]
def move_down_point(self, index: int):
if index >= 0:
prev = index + 1
p = self._points
p[index], p[prev] = p[prev], p[index]
# Sort
@timer
def sort(self, column, is_reversed: bool = False):
predicate = lambda p: p.x
if column == 'y':
predicate = lambda p: p.y
elif column == 'z':
predicate = lambda p: p.z
self._points = sorted(
self._points,
key=predicate,
reverse=is_reversed
)
@timer
def sort_with_indexes(self, indexes: list):
if len(self._points) != len(indexes):
print("TODO: CRITICAL ERROR!")
self._points = list(
map(
lambda x: x[1],
sorted(
enumerate(self.points),
key=lambda x: indexes[x[0]]
)
)
)
# Abstract method, must be implemented for in non abstract class
def get_station(self):
raise NotImplementedMethodeError(self, self.get_station)