wolfhece 2.2.27__py3-none-any.whl → 2.2.28__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -19,106 +19,12 @@ from wolfgpu.simple_simulation import InfiltrationChronology, SimulationDuration
19
19
  from wolfgpu.simple_simulation import boundary_condition_2D, BoundaryConditionsTypes
20
20
 
21
21
  from .pdf import PDFViewer
22
+ from .common import cm2pts, A4_rect, rect_cm, cm2inches, list_to_html, list_to_html_aligned, get_rect_from_text
22
23
  from ..wolf_array import WolfArray, header_wolf
23
24
  from ..PyTranslate import _
24
25
  from .. import __version__ as wolfhece_version
25
26
  from wolfgpu.version import __version__ as wolfgpu_version
26
27
 
27
- def cm2pts(cm):
28
- """ Convert centimeters to points for PyMuPDF.
29
-
30
- One point equals 1/72 inches.
31
- """
32
- return cm * 28.346456692913385 # 1 cm = 28.346456692913385 points = 72/2.54
33
-
34
- def A4_rect():
35
- """ Return the A4 rectangle in PyMuPDF units.
36
-
37
- (0, 0) is the top-left corner in PyMuPDF coordinates.
38
- """
39
- return pdf.Rect(0, 0, cm2pts(21), cm2pts(29.7)) # A4 size in points (PDF units)
40
-
41
- def rect_cm(x, y, width, height):
42
- """ Create a rectangle in PyMuPDF units from centimeters.
43
-
44
- (0, 0) is the top-left corner in PyMuPDF coordinates.
45
- """
46
- return pdf.Rect(cm2pts(x), cm2pts(y), cm2pts(x) + cm2pts(width), cm2pts(y) + cm2pts(height))
47
-
48
- def get_rect_from_text(text, width, fontsize=10, padding=5):
49
- """ Get a rectangle that fits the text in PyMuPDF units.
50
-
51
- :param text: The text to fit in the rectangle.
52
- :param width: The width of the rectangle in centimeters.
53
- :param fontsize: The font size in points.
54
- :param padding: Padding around the text in points.
55
- :return: A PyMuPDF rectangle that fits the text.
56
- """
57
- # Create a temporary PDF document to measure the text size
58
- with NamedTemporaryFile(delete=True, suffix='.pdf') as temp_pdf:
59
- doc = pdf.Document()
60
- page = doc.new_page(A4_rect())
61
- text_rect = page.insert_text((0, 0), text, fontsize=fontsize, width=cm2pts(width))
62
- doc.save(temp_pdf.name)
63
-
64
- # Get the size of the text rectangle
65
- text_width = text_rect.width + padding * 2
66
- text_height = text_rect.height + padding * 2
67
- # Create a rectangle with the specified width and height
68
- rect = pdf.Rect(0, 0, cm2pts(width), text_height)
69
- # Adjust the rectangle to fit the text
70
- rect.x0 -= padding
71
- rect.y0 -= padding
72
- rect.x1 += padding
73
- rect.y1 += padding
74
- return rect
75
-
76
-
77
- def list_to_html(list_items, font_size="10pt", font_family="Helvetica"):
78
- # Génère le CSS
79
- css = f"""
80
- ul.custom-list {{
81
- font-size: {font_size};
82
- font-family: {font_family};
83
- color: #2C3E50;
84
- padding-left: 20px;
85
- }}
86
- li {{
87
- margin-bottom: 5px;
88
- }}
89
- """
90
-
91
- # Génère le HTML
92
- html = "<ul class='custom-list'>\n"
93
- for item in list_items:
94
- html += f" <li>{item}</li>\n"
95
- html += "</ul>"
96
-
97
- return html, css
98
-
99
-
100
- def list_to_html_aligned(list_items, font_size="10pt", font_family="Helvetica"):
101
- # Génère le CSS
102
- css = f"""
103
- ul.custom-list {{
104
- font-size: {font_size};
105
- font-family: {font_family};
106
- color: #2C3E50;
107
- padding-left: 20px;
108
- }}
109
- li {{
110
- margin-bottom: 5px;
111
- }}
112
- """
113
-
114
- # Génère le HTML
115
- html = "<div class='custom-list'>\n"
116
- html = " - ".join(list_items) # Join the items with a hyphen
117
- html += "</div>"
118
-
119
- return html, css
120
-
121
-
122
28
  class SimpleSimGPU_Report():
123
29
 
124
30
  def __init__(self, sim:SimpleSimulation | Path | str, **kwargs):
wolfhece/report/tools.py CHANGED
@@ -376,34 +376,57 @@ class Analysis_Scenarios():
376
376
 
377
377
  def __init__(self, base_directory: Path | str, storage_directory: Path | str = None, name:str = ''):
378
378
 
379
+ # Default figure size for plots
380
+ self._fig_size = (20, 10)
381
+
382
+ # Name of the analysis scenarios instance
379
383
  self.name = name.strip() if name else 'Analysis_Scenarios'
384
+
385
+ # Base directory for the analysis scenarios
386
+ # Must contains the directories 'projets', 'rapports', 'vecteurs', 'nuages_de_points', 'images' and 'cache'
380
387
  self.base_directory = Path(base_directory)
388
+
389
+ # Storage directory for the analysis scenarios - Default is the base directory
381
390
  self.storage_directory = storage_directory if storage_directory is not None else self.base_directory
382
391
 
392
+ # Check if the base directory exists and contains the necessary directories
383
393
  self.check_directories()
394
+ # Fill the directories attribute with the paths of the analysis directories
384
395
  self.directories = get_directories_as_dict(self.base_directory)
385
396
 
397
+ # Initialize the scenarios directories
386
398
  self.scenarios_directories:dict[str:Path]
387
399
  self.scenarios_directories = {}
400
+ # List of scenario names
388
401
  self.scenarios = []
389
402
 
390
403
  self.current_scenario = None
391
- self.report = None
404
+ self._return_periods = []
405
+
406
+ # RapidReport associated with the analysis scenarios
407
+ self.report:RapidReport = None
392
408
  self._report_name = 'analysis_report.docx'
393
409
  self._report_saved_once = False
394
- self.mapviewer = None
395
- self._background_images = None
396
410
 
397
- self._polygons = {}
411
+ # Map viewer for the analysis scenarios
412
+ self.mapviewer:WolfMapViewer = None
398
413
 
399
- self._return_periods = []
414
+ # Name of the WMS service
415
+ self._background_images:str = None
416
+
417
+ # Polygons associated with the analysis scenarios
418
+ self._polygons:dict[str, Polygons_Analyze] = {}
400
419
 
420
+ self._reference_polygon:Polygons_Analyze = None
421
+
422
+ # Modifications associated with the analysis scenarios
401
423
  self._modifications = {}
402
424
 
425
+ # MultiProjects associated with the analysis scenarios.
426
+ # One project contains multiple suimulations.
403
427
  self._multiprojects = None
404
- self._cached_date = False
405
428
 
406
- self._reference_polygon:Polygons_Analyze = None
429
+ # Landmarks and measures associated with the analysis
407
430
  self._landmarks:Zones = None
408
431
  self._landmarks_s_label = []
409
432
 
@@ -414,10 +437,32 @@ class Analysis_Scenarios():
414
437
  self._cloud:list[tuple[float, float, str]] = [] # List of tuples (s, z, label) for point clouds
415
438
 
416
439
  self._images = {}
417
- self._zoom = {}
440
+
441
+ # Zoom (smin, smax, zmin, zmax) for the analysis
442
+ self._zoom:dict[str, tuple[float,float,float,float]] = {}
418
443
 
419
444
  logging.info(f"Analysis directories initialized: {self.directories}")
420
445
 
446
+ @property
447
+ def fig_size(self) -> tuple[float]:
448
+ """ Return the default figure size for plots.
449
+
450
+ :return: A tuple (width, height) representing the default figure size.
451
+ """
452
+ return self._fig_size
453
+
454
+ @fig_size.setter
455
+ def fig_size(self, size:tuple[float]) -> None:
456
+ """ Set the default figure size for plots.
457
+
458
+ :param size: A tuple (width, height) representing the default figure size.
459
+ """
460
+ if not isinstance(size, tuple) or len(size) != 2:
461
+ logging.error("Default figure size must be a tuple of (width, height).")
462
+ raise ValueError("Default figure size must be a tuple of (width, height).")
463
+ self._fig_size = size
464
+ logging.info(f"Default figure size set to {self._fig_size}.")
465
+
421
466
  def add_zoom(self, label:str, bounds:tuple[float]) -> None:
422
467
  """ Add a zoom level to the analysis.
423
468
 
@@ -669,7 +714,13 @@ class Analysis_Scenarios():
669
714
  logging.info(f"Landmark '{label}' added at coordinates ({x}, {y}).")
670
715
 
671
716
  def update_landmark(self, label: str, s_xy:float |tuple[float] = None, z: float = None) -> None:
672
- """ Update a landmark in the analysis. """
717
+ """ Update a landmark in the analysis.
718
+
719
+ :param label: The label of the landmark to update.
720
+ :param s_xy: The s-coordinate or a tuple (s, xy) to update the landmark's position.
721
+ :param z: The z-coordinate to update the landmark's elevation (optional).
722
+ """
723
+
673
724
  if self._landmarks is None:
674
725
  logging.error("No landmarks have been added to the analysis.")
675
726
  raise ValueError("No landmarks have been added to the analysis.")
@@ -701,7 +752,12 @@ class Analysis_Scenarios():
701
752
  self._landmarks_s_label[i] = (s_xy, z, label)
702
753
 
703
754
  def plot_cloud(self, ax: plt.Axes, bounds:tuple[float]) -> plt.Axes:
755
+ """ Trace the cloud of points on an axis Matplotlib
704
756
 
757
+ :param ax: axe Matplotlib
758
+ :param bounds: tuple (xmin, xmax, ymin, ymax) for the plot limits
759
+ :return: The Matplotlib Axes object with the cloud plotted.
760
+ """
705
761
  xmin, xmax, ymin, ymax = bounds
706
762
 
707
763
  used_cloud = [(s, z, label) for s, z, label in self._cloud if s >= xmin and s <= xmax]
@@ -713,7 +769,16 @@ class Analysis_Scenarios():
713
769
  return ax
714
770
 
715
771
  def plot_measures(self, ax:plt.Axes, bounds:tuple[float], style:dict = None) -> plt.Axes:
772
+ """ Trace les mesures sur un axe Matplotlib
773
+
774
+ :param ax: axe Matplotlib
775
+ :param bounds: tuple (xmin, xmax, ymin, ymax) for the plot limits
776
+ :param style: Optional style dictionary for the measures. Available properties:
777
+ - 'color': The color of the line.
778
+ - 'linestyle': The style of the line (e.g., '-', '--', '-.', ':').
716
779
 
780
+ :return: The Matplotlib Axes object with the measures plotted.
781
+ """
717
782
  xmin, xmax, ymin, ymax = bounds
718
783
  i=0
719
784
  for key, measure in self._projected_measures.items():
@@ -777,13 +842,17 @@ class Analysis_Scenarios():
777
842
  bounds:tuple[float] | str,
778
843
  operator:operators = operators.MEDIAN,
779
844
  plot_annex:bool = True,
780
- save:bool = False) -> tuple[plt.Figure, plt.Axes]:
845
+ save:bool = False,
846
+ figsize:tuple[float] = None) -> tuple[plt.Figure, plt.Axes]:
781
847
  """ Plot the waterlines for a specific scenario.
782
848
 
783
849
  :param scenario: The name of the scenario to plot waterlines for or a list of scenarios for comparison.
784
850
  :param bounds: A tuple (xmin, xmax, ymin, ymax) representing the zoom bounds or a string label for a zoom level.
785
851
  :param operator: The operator to apply on the waterlines.
786
852
  :param save: If True, save the plot as an image file.
853
+ :param figsize: A tuple (width, height) representing the size of the figure. If None, uses the default figure size.
854
+ :param plot_annex: If True, plot the cloud of points, measures, and landmarks.
855
+ :return: A tuple (fig, ax) where fig is the matplotlib Figure and ax is the matplotlib Axes object.
787
856
  """
788
857
 
789
858
  if isinstance(bounds, str):
@@ -850,7 +919,14 @@ class Analysis_Scenarios():
850
919
 
851
920
  filename = self.directories[Directory_Analysis.IMAGES] / f"{self.name}_{ref}_{str(xmin)}_{str(xmax)}_waterlines_comparison.png"
852
921
 
853
- fig.set_size_inches(20,10)#15
922
+ if figsize is not None:
923
+ if not isinstance(figsize, tuple) or len(figsize) != 2:
924
+ logging.error("Figure size must be a tuple of (width, height).")
925
+ raise ValueError("Figure size must be a tuple of (width, height).")
926
+ fig.set_size_inches(figsize)
927
+ else:
928
+ fig.set_size_inches(self.fig_size[0], self.fig_size[1]) # Use the default figure size
929
+
854
930
  ax.legend()
855
931
  #zoomA
856
932
  ax.set_xlim(xmin, xmax)
@@ -879,7 +955,8 @@ class Analysis_Scenarios():
879
955
  bounds:tuple[float] | str,
880
956
  operator:operators = operators.MEDIAN,
881
957
  plot_annex:bool = True,
882
- save:bool = False) -> tuple[plt.Figure, plt.Axes]:
958
+ save:bool = False,
959
+ figsize:tuple[float] = None) -> tuple[plt.Figure, plt.Axes]:
883
960
  """ Plot the heads for a specific scenario.
884
961
 
885
962
  :param scenario: The name of the scenario to plot heads for or a list of scenarios for comparison.
@@ -887,6 +964,8 @@ class Analysis_Scenarios():
887
964
  :param operator: The operator to apply on the heads.
888
965
  :param plot_annex: If True, plot the cloud of points, measures, and landmarks.
889
966
  :param save: If True, save the plot as an image file.
967
+ :param figsize: A tuple (width, height) representing the figure size. If None, use the default figure size.
968
+ :return: A tuple (fig, ax) representing the figure and axes of the plot
890
969
  """
891
970
  if isinstance(bounds, str):
892
971
  # If bounds is a string, assume it's a label for a zoom level
@@ -922,7 +1001,14 @@ class Analysis_Scenarios():
922
1001
  ax.plot(s, z, label=f"{scen_name} - {sim_name}", linestyle='--', linewidth=1.5)
923
1002
  filename = self.directories[Directory_Analysis.IMAGES] / f"{self.name}_{ref}_{str(xmin)}_{str(xmax)}_heads_comparison.png"
924
1003
 
925
- fig.set_size_inches(20, 10)
1004
+ if figsize is not None:
1005
+ if not isinstance(figsize, tuple) or len(figsize) != 2:
1006
+ logging.error("Figure size must be a tuple of (width, height).")
1007
+ raise ValueError("Figure size must be a tuple of (width, height).")
1008
+ fig.set_size_inches(figsize)
1009
+ else:
1010
+ fig.set_size_inches(self.fig_size[0], self.fig_size[1]) # Use the default figure size
1011
+
926
1012
  ax.legend()
927
1013
  #zoomA
928
1014
  ax.set_xlim(xmin, xmax)
@@ -948,13 +1034,17 @@ class Analysis_Scenarios():
948
1034
  bounds:tuple[float] | str,
949
1035
  operator:operators = operators.MEDIAN,
950
1036
  plot_annex:bool = True,
951
- save:bool = False) -> tuple[plt.Figure, plt.Axes]:
1037
+ save:bool = False,
1038
+ figsize:tuple[float] = None) -> tuple[plt.Figure, plt.Axes]:
952
1039
  """ Plot the Froude for a specific scenario.
953
1040
 
954
1041
  :param scenario: The name of the scenario to plot waterlines for or a list of scenarios for comparison.
955
1042
  :param bounds: A tuple (xmin, xmax, ymin, ymax) representing the zoom bounds or a string label for a zoom level.
956
1043
  :param operator: The operator to apply on the waterlines.
957
1044
  :param save: If True, save the plot as an image file.
1045
+ :param figsize: A tuple (width, height) representing the figure size. If None, use the default figure size.
1046
+ :param plot_annex: If True, plot the cloud of points, measures, and landmarks.
1047
+ :return: A tuple (fig, ax) representing the figure and axes of the plot
958
1048
  """
959
1049
 
960
1050
  if isinstance(bounds, str):
@@ -1015,7 +1105,14 @@ class Analysis_Scenarios():
1015
1105
 
1016
1106
  filename = self.directories[Directory_Analysis.IMAGES] / f"{self.name}_{ref}_{str(xmin)}_{str(xmax)}_Froude_comparison.png"
1017
1107
 
1018
- fig.set_size_inches(20,10)#15
1108
+ if figsize is not None:
1109
+ if not isinstance(figsize, tuple) or len(figsize) != 2:
1110
+ logging.error("Figure size must be a tuple of (width, height).")
1111
+ raise ValueError("Figure size must be a tuple of (width, height).")
1112
+ fig.set_size_inches(figsize)
1113
+ else:
1114
+ fig.set_size_inches(self.fig_size[0], self.fig_size[1]) # Use the default figure size
1115
+
1019
1116
  ax.legend()
1020
1117
  #zoomA
1021
1118
  ax.set_xlim(xmin, xmax)
@@ -1739,6 +1836,8 @@ class Analysis_Scenarios():
1739
1836
 
1740
1837
  :param scenario_name: The name of the scenario to set as current.
1741
1838
  """
1839
+
1840
+ scenario_name = _sanitize_scenario_name(scenario_name)
1742
1841
  if scenario_name not in self.scenarios_directories:
1743
1842
  logging.error(f"Scenario '{scenario_name}' not found in the analysis.")
1744
1843
  raise ValueError(f"Scenario '{scenario_name}' not found in the analysis.")
@@ -1752,6 +1851,8 @@ class Analysis_Scenarios():
1752
1851
  :param scenario_name: The name of the scenario to get.
1753
1852
  :return: The path to the scenario directory.
1754
1853
  """
1854
+
1855
+ scenario_name = _sanitize_scenario_name(scenario_name)
1755
1856
  if scenario_name not in self.scenarios_directories:
1756
1857
  logging.error(f"Scenario '{scenario_name}' not found in the analysis.")
1757
1858
  raise KeyError(f"Scenario '{scenario_name}' not found in the analysis.")
@@ -1863,7 +1964,11 @@ L'attention est toutefois attirée sur le fait que cette approche pourrait ne pa
1863
1964
  return fig, ax
1864
1965
 
1865
1966
  def load_modifications(self, ad2viewer:bool = True):
1866
- """ Load modifications for scenarios from vecz files."""
1967
+ """ Load modifications for scenarios from vecz files.
1968
+
1969
+ :param ad2viewer: If True, add the modifications to the map viewer.
1970
+ :raises ValueError: If the MapViewer is not initialized.
1971
+ """
1867
1972
 
1868
1973
  MODIF = 'bath_assembly.vecz'
1869
1974
 
@@ -671,7 +671,13 @@ class Config_Manager_2D_GPU:
671
671
  ok &= (GPU_2D_file.PARAMETERS.value.name+GPU_2D_file.PARAMETERS.value.extension).lower() in [cur.name.lower() for cur in curdict[GPU_2D_file_extensions.JSON.value]]
672
672
 
673
673
  if ok:
674
- json_data = json.load(open(curdict['path'] / (GPU_2D_file.PARAMETERS.value.name+GPU_2D_file.PARAMETERS.value.extension), 'r'))
674
+ try:
675
+ json_data = json.load(open(curdict['path'] / (GPU_2D_file.PARAMETERS.value.name+GPU_2D_file.PARAMETERS.value.extension), 'r'))
676
+ except json.JSONDecodeError as e:
677
+ logging.error(_('Error decoding JSON file: {}').format(e))
678
+ curdict['missing'].append(GPU_2D_file_extensions.JSON.value)
679
+ ok = False
680
+ return
675
681
 
676
682
  else:
677
683
  curdict['missing'].append(GPU_2D_file_extensions.JSON.value)
@@ -1382,6 +1388,7 @@ class Config_Manager_2D_GPU:
1382
1388
  logging.error(_('Infiltration .tif must be a full integer array ! -- The array will be ignored !'))
1383
1389
  infiltration = WolfArray(srcheader=bat.get_header(), whichtype= WOLF_ARRAY_FULL_INTEGER)
1384
1390
  infiltration.array.data[:,:] = 0
1391
+
1385
1392
  else:
1386
1393
  infiltration = WolfArray(srcheader=bat.get_header(), whichtype= WOLF_ARRAY_FULL_INTEGER)
1387
1394
  infiltration.array.data[:,:] = 0
@@ -1494,6 +1501,20 @@ class Config_Manager_2D_GPU:
1494
1501
  else:
1495
1502
  cursim.qy = np.zeros((self._header.nbx, self._header.nby), dtype=np.float32)
1496
1503
 
1504
+
1505
+ # check if infiltration array is strictly inside nap
1506
+ if not np.all(cursim.nap[infiltration.array.data[infiltration.array.data > 0]] == 1):
1507
+ logging.warning(_('Infiltration zones must be strictly inside the NAP !'))
1508
+ logging.warning(_('Infiltration zones outside NAP will be set to 0 !'))
1509
+
1510
+ #count number of infiltration zones outside NAP
1511
+ nb_outside = np.sum(infiltration.array.data[(infiltration.array.data > 0) & (cursim.nap == 0)])
1512
+ logging.warning(_('Number of infiltration zones outside NAP: {}').format(nb_outside))
1513
+ # index infiltration zones outside NAP
1514
+ indices = list(set(infiltration.array.data[(infiltration.array.data > 0) & (cursim.nap == 0)]))
1515
+ logging.warning(_('Indices of infiltration zones outside NAP: {}').format(indices))
1516
+ infiltration.array.data[(infiltration.array.data > 0) & (cursim.nap == 0)] = 0
1517
+
1497
1518
  cursim.infiltration_zones = np.asarray(infiltration.array.data, dtype=np.int32)
1498
1519
 
1499
1520
  if roof.nbnotnull == 0:
wolfhece/wolf_array.py CHANGED
@@ -987,7 +987,7 @@ class header_wolf():
987
987
  if "base_coord_y" in params['parameters'].keys() :
988
988
  self.origy = float(params['parameters']["base_coord_y"])
989
989
 
990
- self.nullvalue = 99999.
990
+ self.nullvalue = 0 if 'nap.npy' in filename.lower() else 99999.
991
991
  else:
992
992
 
993
993
  self.dx = 1.
@@ -10459,7 +10459,9 @@ class WolfArray(Element_To_Draw, header_wolf):
10459
10459
  Walonmap:bool=False,
10460
10460
  cat:str='IMAGERIE/ORTHO_2022_ETE',
10461
10461
  first_mask_data:bool=True,
10462
- with_legend:bool=False):
10462
+ with_legend:bool=False,
10463
+ IGN:bool=False,
10464
+ Cartoweb:bool=False):
10463
10465
  """
10464
10466
  Plot the array - Matplotlib version
10465
10467
 
@@ -10555,6 +10557,51 @@ class WolfArray(Element_To_Draw, header_wolf):
10555
10557
  except Exception as e:
10556
10558
  logging.error(_('Error while fetching the map image from WalOnMap'))
10557
10559
  logging.error(e)
10560
+ elif IGN:
10561
+ from .PyWMS import getNGI
10562
+ from PIL import Image
10563
+ try:
10564
+ bounds = self.get_bounds()
10565
+ scale_xovery = (bounds[0][1] - bounds[0][0]) / (bounds[1][1] - bounds[1][0])
10566
+ if scale_xovery > 1.:
10567
+ # x is larger than y
10568
+ w = 2000
10569
+ h = int(2000 / scale_xovery)
10570
+ else:
10571
+ # y is larger than x
10572
+ h = 2000
10573
+ w = int(2000 * scale_xovery)
10574
+ IO_image = getNGI(cat, bounds[0][0], bounds[1][0],
10575
+ bounds[0][1], bounds[1][1],
10576
+ w=w, h=h, tofile=False) # w=self.nbx, h=self.nby
10577
+ image = Image.open(IO_image)
10578
+ ax.imshow(image.transpose(Image.Transpose.FLIP_TOP_BOTTOM), extent=(bounds[0][0], bounds[0][1], bounds[1][0], bounds[1][1]), alpha=1, origin='lower')
10579
+ except Exception as e:
10580
+ logging.error(_('Error while fetching the map image from IGN'))
10581
+ logging.error(e)
10582
+
10583
+ elif Cartoweb:
10584
+ from .PyWMS import getCartoweb
10585
+ from PIL import Image
10586
+ try:
10587
+ bounds = self.get_bounds()
10588
+ scale_xovery = (bounds[0][1] - bounds[0][0]) / (bounds[1][1] - bounds[1][0])
10589
+ if scale_xovery > 1.:
10590
+ # x is larger than y
10591
+ w = 2000
10592
+ h = int(2000 / scale_xovery)
10593
+ else:
10594
+ # y is larger than x
10595
+ h = 2000
10596
+ w = int(2000 * scale_xovery)
10597
+ IO_image = getCartoweb(cat, bounds[0][0], bounds[1][0],
10598
+ bounds[0][1], bounds[1][1],
10599
+ w=w, h=h, tofile=False) # w=self.nbx, h=self.nby
10600
+ image = Image.open(IO_image)
10601
+ ax.imshow(image.transpose(Image.Transpose.FLIP_TOP_BOTTOM), extent=(bounds[0][0], bounds[0][1], bounds[1][0], bounds[1][1]), alpha=1, origin='lower')
10602
+ except Exception as e:
10603
+ logging.error(_('Error while fetching the map image from Cartoweb'))
10604
+ logging.error(e)
10558
10605
 
10559
10606
  if vmin is None and vmax is not None:
10560
10607
  vmin = self.mypal.values[0]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wolfhece
3
- Version: 2.2.27
3
+ Version: 2.2.28
4
4
  Author-email: Pierre Archambeau <pierre.archambeau@uliege.be>
5
5
  Project-URL: Homepage, https://uee.uliege.be/hece
6
6
  Project-URL: Issues, https://uee.uliege.be/hece
@@ -8,16 +8,16 @@ wolfhece/Model1D.py,sha256=snEmu8Uj2YGcp1ybPnly-4A389XRnuOujGduqInNcgw,477001
8
8
  wolfhece/PandasGrid.py,sha256=YIleVkUkoP2MjtQBZ9Xgwk61zbgMj4Pmjj-clVTfPRs,2353
9
9
  wolfhece/PyConfig.py,sha256=Y0wtSIFpAMYa7IByh7hbW-WEOVjNsQEduq7vhIYdZQw,16716
10
10
  wolfhece/PyCrosssections.py,sha256=igU_ELrg5VrHU6RNbF5tHxPyVImpR3xdpfopJYc7haw,114711
11
- wolfhece/PyDraw.py,sha256=3ZKNrXhdHYNjuFKV47l7vHFMcqWElQUxDuM8XX1R5zk,662179
11
+ wolfhece/PyDraw.py,sha256=zK2k-KC1VpqYTTJIfO_CPEjHWBoQh1h2xXMafE4ECGY,662673
12
12
  wolfhece/PyGui.py,sha256=DqMTDsC9GthnMdYOXvkMKfl5pNciExVzxG4ogptWf6g,146010
13
13
  wolfhece/PyGuiHydrology.py,sha256=sKafpOopBg50L5llZCI_fZtbebVTDtxvoRI6-osUwhg,14745
14
14
  wolfhece/PyHydrographs.py,sha256=1P5XAURNqCvtSsMQXhOn1ihjTpr725sRsZdlCEhhk6M,3730
15
- wolfhece/PyPalette.py,sha256=k9b_95GYD0USQ8DS5zGXeZ577712U6772kmhEbJtlXw,35406
15
+ wolfhece/PyPalette.py,sha256=SiRngKml2EXsq1jwQvqh5pBZiV1yS0CY7QrRJGSZD1s,36281
16
16
  wolfhece/PyParams.py,sha256=BgTAwxxq831rYEq_KLcFBX_upjiSUpVtfoQnCxCNWUI,100443
17
17
  wolfhece/PyPictures.py,sha256=m1kY0saW6Y9Q0bDCo47lW6XxDkBrbQG-Fd8uVn8G5ic,2514
18
18
  wolfhece/PyTranslate.py,sha256=4appkmNeHHZLFmUtaA_k5_5QL-5ymxnbVN4R2OblmtE,622
19
19
  wolfhece/PyVertex.py,sha256=a56oY1NB45QnwARg96Tbnq-z-mhZKFkYOkFOO1lNtlk,51056
20
- wolfhece/PyVertexvectors.py,sha256=V4YQDIN69yj1SZvYWxXXa3sUomyAeJq74c2xrHCkrhc,337191
20
+ wolfhece/PyVertexvectors.py,sha256=57-4vU-C8KIIf3iPjDzmNNqSKsIM3SRhSbT4V_md5TM,336874
21
21
  wolfhece/PyWMS.py,sha256=-wU-oWS5il1z702gYd90xHx5O7PvGNr9nb693oue_cI,31412
22
22
  wolfhece/RatingCurve.py,sha256=bUjIrQjvIjkD4V-z8bZmA6pe1ILtYNM0-3fT6YUY1RU,22498
23
23
  wolfhece/RatingCurveData.py,sha256=5UvnIm89BwqjnEbLCcY3CA8WoFd_xHJbooNy62fX5iY,57660
@@ -60,7 +60,7 @@ wolfhece/rain_SPWMI.py,sha256=qCfcmF7LajloOaCwnTrrSMzyME03YyilmRUOqrPrv3U,13846
60
60
  wolfhece/textpillow.py,sha256=map7HsGYML_o5NHRdFg2s_TVQed_lDnpYNDv27MM0Vw,14130
61
61
  wolfhece/tools2d_dll.py,sha256=TfvvmyZUqEZIH0uHwUCJf0bdmCks_AiidDt23Unsp5w,13550
62
62
  wolfhece/tools_mpl.py,sha256=gQ3Jg1iuZiecmMqa5Eli2ZLSkttu68VXL8YmMDBaEYU,564
63
- wolfhece/wolf_array.py,sha256=zPyJhWFkbwYpPndfIDiul0rX2tdOjVhv3ZU1Nf77_X8,519285
63
+ wolfhece/wolf_array.py,sha256=nkU6-pSin-OF5BvgDsdSg6aywsdCQdeNVXtFblriXsw,521716
64
64
  wolfhece/wolf_hist.py,sha256=fTEb60Q4TEwobdZsRU4CFXAId1eOKdWAqF8lnF1xEWc,3590
65
65
  wolfhece/wolf_texture.py,sha256=8BcVSezLEogTHYmtA4yfSPzaw6UpAeYYySVaAowIKtQ,20858
66
66
  wolfhece/wolf_tiles.py,sha256=v-HohqaWuMYdn75XLnA22dlloAG90iwnIqrgnB0ASQ4,10488
@@ -88,7 +88,7 @@ wolfhece/apps/curvedigitizer.py,sha256=lEJJwgAfulrrWQc-U6ij6sj59hWN3SZl4Yu1kQxVz
88
88
  wolfhece/apps/hydrometry.py,sha256=lhhJsFeb4zGL4bNQTs0co85OQ_6ssL1Oy0OUJCzhfYE,656
89
89
  wolfhece/apps/isocurrent.py,sha256=dagmGR8ja9QQ1gwz_8fU-N052hIw-W0mWGVkzLu6C7I,4247
90
90
  wolfhece/apps/splashscreen.py,sha256=EdGDN9NhudIiP7c3gVqj7dp4MWFB8ySizM_tpMnsgpE,3091
91
- wolfhece/apps/version.py,sha256=p-KAUzXKL4OgZzyJi_QLtP77sITe_SMcFQwa7KciYFU,388
91
+ wolfhece/apps/version.py,sha256=pK3K0wU-fe8-W4tB4CsiRNctriME-0MPLh4L7BAsJEY,388
92
92
  wolfhece/apps/wolf.py,sha256=mRnjYsUu4KIsRuamdQWAINFMuwN4eJgMo9erG-hkZ70,729
93
93
  wolfhece/apps/wolf2D.py,sha256=4z_OPQ3IgaLtjexjMKX9ppvqEYyjFLt1hcfFABy3-jU,703
94
94
  wolfhece/apps/wolf_logo.bmp,sha256=ruJ4MA51CpGO_AYUp_dB4SWKHelvhOvd7Q8NrVOjDJk,3126
@@ -265,14 +265,16 @@ wolfhece/rem/REMMaker.py,sha256=zkiAo36MmusPhgv1qJmpDgtoTWbh_eJ6qJqtCfeC1M8,3148
265
265
  wolfhece/rem/RasterViz.py,sha256=fnyMfAJZDoS-rjagsNRGLndS-UYNUzMY4DgenjD3Y_4,29068
266
266
  wolfhece/rem/__init__.py,sha256=S2-J5uEGK_VaMFjRUYFIdSScJjZyuXH4RmMmnG3OG7I,19
267
267
  wolfhece/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
268
+ wolfhece/report/common.py,sha256=7a6zQ-wLZ0ElUVodWCO08TyRBXrI7lnTrosJGcV5_tM,17619
269
+ wolfhece/report/compare_arrays.py,sha256=JuaSfRV0VXVirLfdCJzP2XSLtfRi0R73-vhtTI6fneg,33232
268
270
  wolfhece/report/pdf.py,sha256=zrSSY1JPk59FxK9pFWQfhVKIQAoc_wjeTrXO3tSiEHo,1959
269
271
  wolfhece/report/reporting.py,sha256=JUEXovx_S4jpYkJEBU0AC-1Qw2OkkWyV3VAp6iOfSHc,19494
270
- wolfhece/report/simplesimgpu.py,sha256=kx9IMCr9afPwv9B3G5ADQfaIuHXuqTkgSjg-5bXVuqo,60738
271
- wolfhece/report/tools.py,sha256=hX57JKcdMgjg-jNDpCRGC82x7ZKpYaqSng7oR3rkDrs,91412
272
+ wolfhece/report/simplesimgpu.py,sha256=qwf8EZnSu_DEmxFNAxYLElvCgjEKcCm3_-tvX8wUvdk,57932
273
+ wolfhece/report/tools.py,sha256=ZA4PfHQXgvDtTnrSZh-oSwhQT_cQtb49LuZB8VI7nyI,96852
272
274
  wolfhece/report/wolf_report.png,sha256=NoSV58LSwb-oxCcZScRiJno-kxDwRdm_bK-fiMsKJdA,592485
273
275
  wolfhece/scenario/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
274
276
  wolfhece/scenario/check_scenario.py,sha256=d-LWa_FxmPxTSc_H1lDHwqLB6TCqj1IUrRJhatfPMMA,5623
275
- wolfhece/scenario/config_manager.py,sha256=6ZYyCdhjcQ9H-CCCm072vYzMHFifeIFo_R3Ht3dJaiU,114288
277
+ wolfhece/scenario/config_manager.py,sha256=00xo6e-mLxZEK1atiHKfr2MSuJ_n6QgO3fQsHDYf3mI,115588
276
278
  wolfhece/scenario/imposebc_void.py,sha256=PqA_99hKcaqK5zsK6IRIc5Exgg3WVpgWU8xpwNL49zQ,5571
277
279
  wolfhece/scenario/update_void.py,sha256=Yb7TMIUx9Gzm9_6qRMJnF39Uqi17dIkMmscSXo2WaTs,10033
278
280
  wolfhece/shaders/fragment_shader_texture.glsl,sha256=w6h8d5mJqFaGbao0LGmjRcFFdcEQ3ICIl9JpuT71K5k,177
@@ -301,8 +303,8 @@ wolfhece/ui/wolf_multiselection_collapsiblepane.py,sha256=8PlMYrb_8jI8h9F0_EagpM
301
303
  wolfhece/ui/wolf_times_selection_comparison_models.py,sha256=ORy7fz4dcp691qKzaOZHrRLZ0uXNhL-LIHxmpDGL6BI,5007
302
304
  wolfhece/wintab/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
303
305
  wolfhece/wintab/wintab.py,sha256=8A-JNONV6ujgsgG3lM5Uw-pVgglPATwKs86oBzzljoc,7179
304
- wolfhece-2.2.27.dist-info/METADATA,sha256=LyxRqMNvHVs9MaJn8wSaG5KQTVQ6Ixr_dJe237NPjbg,2729
305
- wolfhece-2.2.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
306
- wolfhece-2.2.27.dist-info/entry_points.txt,sha256=Jr187pyvA3EeJiQLjZK9yo6mJX7IAn6ygZU9T8qF_gQ,658
307
- wolfhece-2.2.27.dist-info/top_level.txt,sha256=EfqZXMVCn7eILUzx9xsEu2oBbSo9liWPFWjIHik0iCI,9
308
- wolfhece-2.2.27.dist-info/RECORD,,
306
+ wolfhece-2.2.28.dist-info/METADATA,sha256=9fInjN6bCfzKHTXS3cFPY_au-O9JrPLujBu3zYKLADE,2729
307
+ wolfhece-2.2.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
308
+ wolfhece-2.2.28.dist-info/entry_points.txt,sha256=Jr187pyvA3EeJiQLjZK9yo6mJX7IAn6ygZU9T8qF_gQ,658
309
+ wolfhece-2.2.28.dist-info/top_level.txt,sha256=EfqZXMVCn7eILUzx9xsEu2oBbSo9liWPFWjIHik0iCI,9
310
+ wolfhece-2.2.28.dist-info/RECORD,,