removed remove_last parameter

This commit is contained in:
Pilar 2021-03-08 12:56:19 -05:00
parent dbd32e4d20
commit a9abb59835
3 changed files with 45 additions and 53 deletions

View File

@ -16,17 +16,17 @@ class Surface:
"""
Surface class
"""
def __init__(self, coordinates, holes_coordinates=None, surface_type=None, name=None, swr='0.2', remove_last=True):
def __init__(self, coordinates, holes_coordinates=None, surface_type=None, name=None, swr='0.2'):
self._coordinates = coordinates
self._holes_coordinates = holes_coordinates
self._type = surface_type
self._name = name
self._swr = swr
self._remove_last = remove_last
self._points = None
self._points_list = None
self._holes_points = None
self._holes_points_list = None
self._perimeter_points = None
self._azimuth = None
self._inclination = None
self._area_above_ground = None
@ -40,7 +40,6 @@ class Surface:
self._perimeter_surface = None
self._hole_surfaces = None
self._solid_surface = None
self._perimeter_vertices = None
def parent(self, parent, surface_id):
"""
@ -82,32 +81,32 @@ class Surface:
@property
def points(self) -> np.ndarray:
"""
Surface point coordinates list [x, y, z, x, y, z,...]
Solid surface point matrix [[x, y, z],[x, y, z],...]
:return: np.ndarray
"""
if self._points is None:
self._points = np.fromstring(self._coordinates, dtype=float, sep=' ')
self._points = gh.to_points_matrix(self._points, self._remove_last)
self._points = gh.to_points_matrix(self._points)
return self._points
@property
def holes_points(self) -> [np.ndarray]:
"""
Surface point coordinates list [x, y, z, x, y, z,...]
Holes surfaces point matrices [[[x, y, z],[x, y, z],...]]
:return: np.ndarray
"""
if self._holes_coordinates is not None:
self._holes_points = []
for hole_coordinates in self._holes_coordinates:
hole_points = np.fromstring(hole_coordinates, dtype=float, sep=' ')
hole_points = gh.to_points_matrix(hole_points, self._remove_last)
hole_points = gh.to_points_matrix(hole_points)
self._holes_points.append(hole_points)
return self._holes_points
@property
def points_list(self) -> np.ndarray:
"""
Surface point matrix [[x, y, z],[x, y, z],...]
Solid surface point coordinates list [x, y, z, x, y, z,...]
:return: np.ndarray
"""
if self._points_list is None:
@ -118,7 +117,7 @@ class Surface:
@property
def holes_points_list(self) -> np.ndarray:
"""
Surface point matrix [[x, y, z],[x, y, z],...]
Holes surfaces point coordinates list [x, y, z, x, y, z,...]
:return: np.ndarray
"""
if self._holes_coordinates is not None:
@ -274,7 +273,7 @@ class Surface:
:return: Polygon
"""
if self._perimeter_surface is None:
self._perimeter_surface = Polygon(self.perimeter_vertices)
self._perimeter_surface = Polygon(self.perimeter_points)
return self._perimeter_surface
@property
@ -301,43 +300,37 @@ class Surface:
self._hole_surfaces = None
else:
self._hole_surfaces = []
for hole_vertices in self.holes_points:
self._hole_surfaces.append(Polygon(hole_vertices))
for hole_points in self.holes_points:
self._hole_surfaces.append(Polygon(hole_points))
return self._hole_surfaces
@property
def perimeter_vertices(self) -> np.ndarray:
def perimeter_points(self) -> np.ndarray:
"""
vertices of the perimeter organized in the same order as in coordinates
:return:
Matrix of points of the perimeter in the same order as in coordinates [[x, y, z],[x, y, z],...]
:return: np.ndarray
"""
if self._perimeter_vertices is None:
if self._perimeter_points is None:
if self.holes_points is None:
self._perimeter_vertices = self.points
self._perimeter_points = self.points
else:
first_point = True
for point in self.points:
point_of_hole = False
for hole_points in self.holes_points:
for hole_point in hole_points:
if gh().almost_equal(0.0, point, hole_point):
point_of_hole = True
if not point_of_hole:
if first_point:
self._perimeter_vertices = np.array([point])
first_point = False
else:
self._perimeter_vertices = np.append(self._perimeter_vertices, [point], axis=0)
_perimeter_coordinates = self._coordinates
for hole_points in self.holes_points:
_hole = np.append(hole_points, hole_points[0])
_closed_hole = ' '.join(str(e) for e in [*_hole[:]])
# add a mark 'M' to ensure that the recombination of points does not provoke errors in finding holes
_perimeter_coordinates = _perimeter_coordinates.replace(_closed_hole, 'M')
_perimeter_coordinates = _perimeter_coordinates.replace('M', '')
self._perimeter_points = np.fromstring(_perimeter_coordinates, dtype=float, sep=' ')
self._perimeter_points = gh.to_points_matrix(self._perimeter_points)
# remove duplicated points
pv = np.array([self._perimeter_vertices[0]])
for point in self._perimeter_vertices:
pv = np.array([self._perimeter_points[0]])
for point in self._perimeter_points:
duplicated_point = False
for p in pv:
if gh().almost_equal(0.0, p, point):
duplicated_point = True
if not duplicated_point:
pv = np.append(pv, [point], axis=0)
self._perimeter_vertices = pv
if not self._remove_last:
self._perimeter_vertices = np.append(self._perimeter_vertices, [self._perimeter_vertices[0]], axis=0)
return self._perimeter_vertices
self._perimeter_points = pv
return self._perimeter_points

View File

@ -2,7 +2,7 @@
Geometry helper
SPDX - License - Identifier: LGPL - 3.0 - or -later
Copyright © 2020 Project Author Guille Gutierrez guillermo.gutierrezmorote@concordia.ca
Contributors Pilar Monsalvete pilar_monsalvete@yahoo.es
Contributors Pilar Monsalvete Álvarez de Uribarri pilar.monsalvete@concordia.ca
"""
import sys
import math
@ -99,17 +99,14 @@ class GeometryHelper:
return True
@staticmethod
def to_points_matrix(points, remove_last=False):
def to_points_matrix(points):
"""
Transform a point vector into a point matrix
:param points: [x, y, z, x, y, z ...]
:param remove_last: Boolean
:return: [[x,y,z],[x,y,z]...]
"""
rows = points.size // 3
points = points.reshape(rows, 3)
if remove_last:
points = np.delete(points, rows - 1, 0)
return points
@staticmethod

View File

@ -249,16 +249,18 @@ class TestGeometryFactory(TestCase):
def test_surface(self):
coordinates = '0.0 0.0 0.0 0.0 4.0 0.0 4.0 4.0 0.0 4.0 0.0 0.0 0.0 0.0 0.0 ' \
'1.0 1.0 0.0 2.0 1.0 0.0 2.0 2.0 0.0 1.0 2.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 ' \
'2.0 2.0 0.0 3.0 2.0 0.0 3.0 3.0 0.0 2.0 3.0 0.0 2.0 2.0 0.0 0.0 0.0 0.0'
holes_coordinates = ['1.0 1.0 0.0 2.0 1.0 0.0 2.0 2.0 0.0 1.0 2.0 0.0 1.0 1.0 0.0',
'2.0 2.0 0.0 3.0 2.0 0.0 3.0 3.0 0.0 2.0 3.0 0.0 2.0 2.0 0.0']
surface = Surface(coordinates, holes_coordinates=holes_coordinates, remove_last=True)
print(surface.points)
'2.0 2.0 0.0 3.0 2.0 0.0 3.0 3.0 0.0 2.0 3.0 0.0 2.0 2.0 0.0'
holes_coordinates = ['1.0 1.0 0.0 2.0 1.0 0.0 2.0 2.0 0.0 1.0 2.0 0.0',
'2.0 2.0 0.0 3.0 2.0 0.0 3.0 3.0 0.0 2.0 3.0 0.0']
surface = Surface(coordinates, holes_coordinates=holes_coordinates)
print('solid:', surface.points)
print(surface.holes_points)
print(surface.perimeter_vertices)
print(surface.hole_surfaces[1].area)
print(surface.perimeter_surface.area)
print(surface.solid_surface.area)
print(surface.hole_surfaces[1].normal)
print(surface.perimeter_surface.normal)
print(surface.solid_surface.normal)
print('perimeter:', surface.perimeter_points)
for i in range(0, len(holes_coordinates)):
print(surface.hole_surfaces[i].area)
print('perimeter:', surface.perimeter_surface.area)
print('solid:', surface.solid_surface.area)
for i in range(0, len(holes_coordinates)):
print(surface.hole_surfaces[i].normal)
print('perimeter:', surface.perimeter_surface.normal)
print('solid:', surface.solid_surface.normal)