diff --git a/requirements.txt b/requirements.txt index 1f0a31942f0f27f41b0c3f1602751ecc13196341..a439384228ffb7c508423e1e552d94a02182d4eb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,3 +11,4 @@ pyinstaller>=5.11.0 shapely>=2.0.1 lxml>=4.9.3 platformdirs>=4.2.0 +pyshp>=2.3.1 diff --git a/src/Model/Geometry/Reach.py b/src/Model/Geometry/Reach.py index 448bc6220f8c761b67bffb339a21b098eda3234a..1b7748fe7d06aea9677e16110ded24f7fb1e0f9c 100644 --- a/src/Model/Geometry/Reach.py +++ b/src/Model/Geometry/Reach.py @@ -16,7 +16,9 @@ # -*- coding: utf-8 -*- +import os import logging +import shapefile import numpy as np from time import time @@ -533,8 +535,58 @@ class Reach(SQLSubModel): # Import/Export - @timer def import_geometry(self, file_path_name: str): + if file_path_name.endswith(".st"): + return self.import_geometry_st(file_path_name) + elif file_path_name.endswith(".shp"): + return self.import_geometry_shp(file_path_name) + else: + return [] + + @timer + def import_geometry_shp(self, file_path_name: str): + sf = shapefile.Reader( + os.path.abspath(file_path_name) + ) + + if sf.shapeType != shapefile.POLYLINEZ: + raise FileFormatError( + file_path_name, + "Shapefile is not a POLYLINEZ" + ) + + profiles = [] + + for i in range(len(sf)): + s_profile = sf.shape(i) + z = s_profile.z + + ind = 0 + points = [] + for point in s_profile.points: + points.append([ + point[0], + point[1], + z[ind] + ]) + + ind += 1 + + prof = ProfileXYZ( + kp=round(points[0][0]), + reach=self, status=self._status + ) + prof.import_points(points) + + profiles.append(prof) + + self.profiles = profiles + self.profiles + self._update_profile_numbers() + + return profiles + + @timer + def import_geometry_st(self, file_path_name: str): """Import a geometry from file (.ST or .st) Args: diff --git a/src/View/Geometry/Translate.py b/src/View/Geometry/Translate.py index 7b607d83c537adb783a9242fef6ae383131b0b9b..23034fd51475dd711e868528cc381cc8963ecb90 100644 --- a/src/View/Geometry/Translate.py +++ b/src/View/Geometry/Translate.py @@ -36,6 +36,8 @@ class GeometryTranslate(MainTranslate): "Geometry", "File mage geometry (*.ST *.st)") self._dict["file_m"] = _translate( "Geometry", "File mage meshed geometry (*.M *.m)") + self._dict["file_shp"] = _translate( + "Geometry", "Shapefile (*.SHP *.shp)") self._dict["file_all"] = _translate("Geometry", "All file (*)") self._dict["cross_section"] = _translate("Geometry", "cross-section") diff --git a/src/View/Geometry/Window.py b/src/View/Geometry/Window.py index d8bcc06b47c8e913659c5b26ccb13637197f40c0..3631ff1003cd7dbc2541993ac2b92ce48e43376f 100644 --- a/src/View/Geometry/Window.py +++ b/src/View/Geometry/Window.py @@ -241,6 +241,7 @@ class GeometryWindow(PamhyrWindow): file_types = [ self._trad["file_st"], self._trad["file_m"], + self._trad["file_shp"], self._trad["file_all"], ]