wolfhece 2.1.12__py3-none-any.whl → 2.1.14__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.
- wolfhece/PyDraw.py +111 -75
- wolfhece/PyGui.py +27 -4
- wolfhece/PyParams.py +1 -1
- wolfhece/PyVertexvectors.py +14 -0
- wolfhece/Results2DGPU.py +20 -12
- wolfhece/apps/version.py +1 -1
- wolfhece/fonts/arial.ttf +0 -0
- wolfhece/hydrology/Catchment.py +92 -8
- wolfhece/hydrology/Comparison.py +46 -7
- wolfhece/hydrology/Optimisation.py +63 -4
- wolfhece/hydrology/PyWatershed.py +563 -17
- wolfhece/hydrology/RetentionBasin.py +246 -41
- wolfhece/hydrology/SubBasin.py +42 -9
- wolfhece/hydrology/plot_hydrology.py +58 -0
- wolfhece/libs/WolfDll.dll +0 -0
- wolfhece/picc.py +35 -4
- wolfhece/wolf_array.py +152 -30
- wolfhece/wolfresults_2D.py +18 -4
- {wolfhece-2.1.12.dist-info → wolfhece-2.1.14.dist-info}/METADATA +1 -1
- {wolfhece-2.1.12.dist-info → wolfhece-2.1.14.dist-info}/RECORD +23 -23
- {wolfhece-2.1.12.dist-info → wolfhece-2.1.14.dist-info}/WHEEL +1 -1
- {wolfhece-2.1.12.dist-info → wolfhece-2.1.14.dist-info}/entry_points.txt +0 -0
- {wolfhece-2.1.12.dist-info → wolfhece-2.1.14.dist-info}/top_level.txt +0 -0
    
        wolfhece/PyDraw.py
    CHANGED
    
    | @@ -191,7 +191,7 @@ class DragdropFileTarget(wx.FileDropTarget): | |
| 191 191 | 
             
                                id = id + '_1'
         | 
| 192 192 |  | 
| 193 193 | 
             
                            try:
         | 
| 194 | 
            -
                                newobj = Zones(filename=name)
         | 
| 194 | 
            +
                                newobj = Zones(filename=name, parent=self.window)
         | 
| 195 195 | 
             
                                self.window.add_object('vector', newobj = newobj, id  = id)
         | 
| 196 196 | 
             
                            except:
         | 
| 197 197 | 
             
                                logging.error(_('Error while loading vector : ') + name)
         | 
| @@ -203,7 +203,7 @@ class DragdropFileTarget(wx.FileDropTarget): | |
| 203 203 | 
             
                                id = id + '_1'
         | 
| 204 204 |  | 
| 205 205 | 
             
                            try:
         | 
| 206 | 
            -
                                newobj = cloud_vertices(fname=name)
         | 
| 206 | 
            +
                                newobj = cloud_vertices(fname=name, mapviewer=self.window)
         | 
| 207 207 | 
             
                                self.window.add_object('cloud', newobj = newobj, id  = id)
         | 
| 208 208 | 
             
                            except:
         | 
| 209 209 | 
             
                                logging.error(_('Error while loading cloud : ') + name)
         | 
| @@ -380,6 +380,12 @@ class WolfMapViewer(wx.Frame): | |
| 380 380 |  | 
| 381 381 | 
             
                    self.filemenu.AppendSeparator()
         | 
| 382 382 |  | 
| 383 | 
            +
                    # SIMULATION Hydrologique
         | 
| 384 | 
            +
             | 
| 385 | 
            +
                    hydrol = self.filemenu.Append(wx.ID_ANY, _('Open hydrological model'), _('Hydrological simulation'))
         | 
| 386 | 
            +
             | 
| 387 | 
            +
                    self.filemenu.AppendSeparator()
         | 
| 388 | 
            +
             | 
| 383 389 | 
             
                    # MULTIVIEWER
         | 
| 384 390 |  | 
| 385 391 | 
             
                    compareitem = self.filemenu.Append(wx.ID_ANY, _('Set comparison'), _('Set comparison'))
         | 
| @@ -665,6 +671,13 @@ class WolfMapViewer(wx.Frame): | |
| 665 671 | 
             
                    self._wxlogging = value
         | 
| 666 672 |  | 
| 667 673 |  | 
| 674 | 
            +
                def open_hydrological_model(self):
         | 
| 675 | 
            +
                    """ Open a hydrological model """
         | 
| 676 | 
            +
             | 
| 677 | 
            +
                    from .PyGui import HydrologyModel
         | 
| 678 | 
            +
             | 
| 679 | 
            +
                    newview = HydrologyModel(splash = False)
         | 
| 680 | 
            +
             | 
| 668 681 | 
             
                def create_2D_MB_model(self):
         | 
| 669 682 | 
             
                    """ Create a 2D model """
         | 
| 670 683 |  | 
| @@ -1168,6 +1181,76 @@ class WolfMapViewer(wx.Frame): | |
| 1168 1181 | 
             
                    elif itemlabel ==_("Create video..."):
         | 
| 1169 1182 | 
             
                        if self.active_res2d is not None:
         | 
| 1170 1183 | 
             
                            self.create_video()
         | 
| 1184 | 
            +
                            
         | 
| 1185 | 
            +
                    elif itemlabel == _("Setup cache..."):
         | 
| 1186 | 
            +
             | 
| 1187 | 
            +
                        if self.active_res2d is None:
         | 
| 1188 | 
            +
                            logging.warning(_('No active 2D result !'))
         | 
| 1189 | 
            +
                            return
         | 
| 1190 | 
            +
             | 
| 1191 | 
            +
                        dlg = wx.MessageDialog(None, _('Cache only water depth results ?'), style=wx.YES_NO)
         | 
| 1192 | 
            +
                        ret = dlg.ShowModal()
         | 
| 1193 | 
            +
                        if ret == wx.ID_NO:
         | 
| 1194 | 
            +
                            only_h = False
         | 
| 1195 | 
            +
                        else:
         | 
| 1196 | 
            +
                            only_h = True
         | 
| 1197 | 
            +
                        dlg.Destroy()
         | 
| 1198 | 
            +
             | 
| 1199 | 
            +
                        dlg = wx.MessageDialog(None, _('Cache all results ?'), style=wx.YES_NO)
         | 
| 1200 | 
            +
                        ret = dlg.ShowModal()
         | 
| 1201 | 
            +
                        if ret == wx.ID_NO:
         | 
| 1202 | 
            +
             | 
| 1203 | 
            +
                            dlg_start = wx.SingleChoiceDialog(None, _('Choosing the start index'),
         | 
| 1204 | 
            +
                                                              _('Choices'),
         | 
| 1205 | 
            +
                                                              [str(cur) for cur in range(1,self.active_res2d.get_nbresults()+1)])
         | 
| 1206 | 
            +
                            ret = dlg_start.ShowModal()
         | 
| 1207 | 
            +
                            if ret == wx.ID_CANCEL:
         | 
| 1208 | 
            +
                                dlg_start.Destroy()
         | 
| 1209 | 
            +
                                return
         | 
| 1210 | 
            +
             | 
| 1211 | 
            +
                            start_idx = int(dlg_start.GetStringSelection())
         | 
| 1212 | 
            +
                            dlg_start.Destroy()
         | 
| 1213 | 
            +
             | 
| 1214 | 
            +
                            dlg_end   = wx.SingleChoiceDialog(None, _('Choosing the end index'),
         | 
| 1215 | 
            +
                                                              _('Choices'),
         | 
| 1216 | 
            +
                                                              [str(cur) for cur in range(start_idx + 1,self.active_res2d.get_nbresults()+1)])
         | 
| 1217 | 
            +
             | 
| 1218 | 
            +
                            ret = dlg_end.ShowModal()
         | 
| 1219 | 
            +
                            if ret == wx.ID_CANCEL:
         | 
| 1220 | 
            +
                                dlg_end.Destroy()
         | 
| 1221 | 
            +
                                return
         | 
| 1222 | 
            +
             | 
| 1223 | 
            +
                            dlg_end.Destroy()
         | 
| 1224 | 
            +
             | 
| 1225 | 
            +
                            end_idx = int(dlg_end.GetStringSelection())
         | 
| 1226 | 
            +
             | 
| 1227 | 
            +
                            logging.info(_('Caching from {} to {} - Be patient !').format(start_idx, end_idx))
         | 
| 1228 | 
            +
                            self.active_res2d.setup_cache(start_idx = start_idx-1, end_idx = end_idx-1, only_h=only_h)
         | 
| 1229 | 
            +
                            logging.info(_('Caching done !'))
         | 
| 1230 | 
            +
                        else:
         | 
| 1231 | 
            +
                            logging.info(_('Caching all results - Be patient !'))
         | 
| 1232 | 
            +
                            self.active_res2d.setup_cache(only_h=only_h)
         | 
| 1233 | 
            +
                            logging.info(_('Caching done !'))
         | 
| 1234 | 
            +
             | 
| 1235 | 
            +
                        dlg.Destroy()
         | 
| 1236 | 
            +
             | 
| 1237 | 
            +
                    elif itemlabel == _("Clear cache..."):
         | 
| 1238 | 
            +
             | 
| 1239 | 
            +
                        if self.active_res2d is None:
         | 
| 1240 | 
            +
                            logging.warning(_('No active 2D result !'))
         | 
| 1241 | 
            +
                            return
         | 
| 1242 | 
            +
             | 
| 1243 | 
            +
                        self.active_res2d.clear_cache()
         | 
| 1244 | 
            +
                        logging.info(_('Cache cleared !'))
         | 
| 1245 | 
            +
             | 
| 1246 | 
            +
                    elif itemlabel == _("Show tiles..."):
         | 
| 1247 | 
            +
             | 
| 1248 | 
            +
                        if self.active_res2d is None:
         | 
| 1249 | 
            +
                            logging.warning(_('No active 2D result !'))
         | 
| 1250 | 
            +
                            return
         | 
| 1251 | 
            +
             | 
| 1252 | 
            +
                        self.active_res2d.show_tiles()
         | 
| 1253 | 
            +
             | 
| 1171 1254 |  | 
| 1172 1255 | 
             
                def menu_2dgpu(self):
         | 
| 1173 1256 |  | 
| @@ -2094,8 +2177,8 @@ class WolfMapViewer(wx.Frame): | |
| 2094 2177 | 
             
                        return
         | 
| 2095 2178 |  | 
| 2096 2179 | 
             
                    if fn=='':
         | 
| 2097 | 
            -
                        dlg = wx.FileDialog( | 
| 2098 | 
            -
                                             | 
| 2180 | 
            +
                        dlg = wx.FileDialog(parent   = None,
         | 
| 2181 | 
            +
                                            message  = _('Choose file name'),
         | 
| 2099 2182 | 
             
                                            wildcard = 'AVI video file (*.avi)|*.avi',
         | 
| 2100 2183 | 
             
                                            style    = wx.FD_SAVE)
         | 
| 2101 2184 | 
             
                        ret = dlg.ShowModal()
         | 
| @@ -2175,6 +2258,12 @@ class WolfMapViewer(wx.Frame): | |
| 2175 2258 | 
             
                        interval = int(dlg.GetValue())
         | 
| 2176 2259 | 
             
                        dlg.Destroy()
         | 
| 2177 2260 |  | 
| 2261 | 
            +
                    self.read_one_result(start_step)
         | 
| 2262 | 
            +
             | 
| 2263 | 
            +
                    for curmodel in self.iterator_over_objects(draw_type.RES2D):
         | 
| 2264 | 
            +
                        curmodel: Wolfresults_2D
         | 
| 2265 | 
            +
                        curmodel.step_interval_results = interval
         | 
| 2266 | 
            +
             | 
| 2178 2267 | 
             
                    for idx in tqdm(range(start_step, end_step, interval)):
         | 
| 2179 2268 |  | 
| 2180 2269 | 
             
                        image = Image.frombytes('RGB', fig.canvas.get_width_height(),fig.canvas.tostring_rgb())
         | 
| @@ -2189,6 +2278,11 @@ class WolfMapViewer(wx.Frame): | |
| 2189 2278 | 
             
                                               ax=ax[0],
         | 
| 2190 2279 | 
             
                                               title=_('Current time {:0>8} s'.format(el_time)))
         | 
| 2191 2280 |  | 
| 2281 | 
            +
                    for curmodel in self.iterator_over_objects(draw_type.RES2D):
         | 
| 2282 | 
            +
                        curmodel: Wolfresults_2D
         | 
| 2283 | 
            +
                        curmodel.step_interval_results = 1
         | 
| 2284 | 
            +
             | 
| 2285 | 
            +
             | 
| 2192 2286 | 
             
                def get_canvas_as_image(self) -> Image.Image:
         | 
| 2193 2287 | 
             
                    """
         | 
| 2194 2288 | 
             
                    Récupère la fenêtre OpenGL sous forme d'image
         | 
| @@ -4008,8 +4102,15 @@ class WolfMapViewer(wx.Frame): | |
| 4008 4102 | 
             
                        elif unknown == _('Head'):
         | 
| 4009 4103 | 
             
                            unknown = 'head'
         | 
| 4010 4104 |  | 
| 4011 | 
            -
                         | 
| 4012 | 
            -
             | 
| 4105 | 
            +
                        figax = None
         | 
| 4106 | 
            +
                        for curblock in self.active_res2d.myblocks.values():
         | 
| 4107 | 
            +
                            if curblock.SelectionData.nb > 0:
         | 
| 4108 | 
            +
             | 
| 4109 | 
            +
                                figax = self.active_res2d.plot_h(curblock.SelectionData.myselection,
         | 
| 4110 | 
            +
                                                               unknown, toshow=False, figax=figax)
         | 
| 4111 | 
            +
                        if figax is not None:   
         | 
| 4112 | 
            +
                            fig, ax = figax
         | 
| 4113 | 
            +
                            fig.show()
         | 
| 4013 4114 |  | 
| 4014 4115 | 
             
                    elif itemlabel == _("Plot stats unknown (inside active vector)..."):
         | 
| 4015 4116 |  | 
| @@ -4379,75 +4480,6 @@ class WolfMapViewer(wx.Frame): | |
| 4379 4480 | 
             
                    #     if self.active_res2d is not None:
         | 
| 4380 4481 | 
             
                    #         self.create_video()
         | 
| 4381 4482 |  | 
| 4382 | 
            -
                    elif itemlabel == _("Setup cache..."):
         | 
| 4383 | 
            -
             | 
| 4384 | 
            -
                        if self.active_res2d is None:
         | 
| 4385 | 
            -
                            logging.warning(_('No active 2D result !'))
         | 
| 4386 | 
            -
                            return
         | 
| 4387 | 
            -
             | 
| 4388 | 
            -
                        dlg = wx.MessageDialog(None, _('Cache only water depth results ?'), style=wx.YES_NO)
         | 
| 4389 | 
            -
                        ret = dlg.ShowModal()
         | 
| 4390 | 
            -
                        if ret == wx.ID_NO:
         | 
| 4391 | 
            -
                            only_h = False
         | 
| 4392 | 
            -
                        else:
         | 
| 4393 | 
            -
                            only_h = True
         | 
| 4394 | 
            -
                        dlg.Destroy()
         | 
| 4395 | 
            -
             | 
| 4396 | 
            -
                        dlg = wx.MessageDialog(None, _('Cache all results ?'), style=wx.YES_NO)
         | 
| 4397 | 
            -
                        ret = dlg.ShowModal()
         | 
| 4398 | 
            -
                        if ret == wx.ID_NO:
         | 
| 4399 | 
            -
             | 
| 4400 | 
            -
                            dlg_start = wx.SingleChoiceDialog(None, _('Choosing the start index'),
         | 
| 4401 | 
            -
                                                              _('Choices'),
         | 
| 4402 | 
            -
                                                              [str(cur) for cur in range(1,self.active_res2d.get_nbresults()+1)])
         | 
| 4403 | 
            -
                            ret = dlg_start.ShowModal()
         | 
| 4404 | 
            -
                            if ret == wx.ID_CANCEL:
         | 
| 4405 | 
            -
                                dlg_start.Destroy()
         | 
| 4406 | 
            -
                                return
         | 
| 4407 | 
            -
             | 
| 4408 | 
            -
                            start_idx = int(dlg_start.GetStringSelection())
         | 
| 4409 | 
            -
                            dlg_start.Destroy()
         | 
| 4410 | 
            -
             | 
| 4411 | 
            -
                            dlg_end   = wx.SingleChoiceDialog(None, _('Choosing the end index'),
         | 
| 4412 | 
            -
                                                              _('Choices'),
         | 
| 4413 | 
            -
                                                              [str(cur) for cur in range(start_idx + 1,self.active_res2d.get_nbresults()+1)])
         | 
| 4414 | 
            -
             | 
| 4415 | 
            -
                            ret = dlg_end.ShowModal()
         | 
| 4416 | 
            -
                            if ret == wx.ID_CANCEL:
         | 
| 4417 | 
            -
                                dlg_end.Destroy()
         | 
| 4418 | 
            -
                                return
         | 
| 4419 | 
            -
             | 
| 4420 | 
            -
                            dlg_end.Destroy()
         | 
| 4421 | 
            -
             | 
| 4422 | 
            -
                            end_idx = int(dlg_end.GetStringSelection())
         | 
| 4423 | 
            -
             | 
| 4424 | 
            -
                            logging.info(_('Caching from {} to {} - Be patient !').format(start_idx, end_idx))
         | 
| 4425 | 
            -
                            self.active_res2d.setup_cache(start_idx = start_idx-1, end_idx = end_idx-1, only_h=only_h)
         | 
| 4426 | 
            -
                            logging.info(_('Caching done !'))
         | 
| 4427 | 
            -
                        else:
         | 
| 4428 | 
            -
                            logging.info(_('Caching all results - Be patient !'))
         | 
| 4429 | 
            -
                            self.active_res2d.setup_cache(only_h=only_h)
         | 
| 4430 | 
            -
                            logging.info(_('Caching done !'))
         | 
| 4431 | 
            -
             | 
| 4432 | 
            -
                        dlg.Destroy()
         | 
| 4433 | 
            -
             | 
| 4434 | 
            -
                    elif itemlabel == _("Clear cache..."):
         | 
| 4435 | 
            -
             | 
| 4436 | 
            -
                        if self.active_res2d is None:
         | 
| 4437 | 
            -
                            logging.warning(_('No active 2D result !'))
         | 
| 4438 | 
            -
                            return
         | 
| 4439 | 
            -
             | 
| 4440 | 
            -
                        self.active_res2d.clear_cache()
         | 
| 4441 | 
            -
                        logging.info(_('Cache cleared !'))
         | 
| 4442 | 
            -
             | 
| 4443 | 
            -
                    elif itemlabel == _("Show tiles..."):
         | 
| 4444 | 
            -
             | 
| 4445 | 
            -
                        if self.active_res2d is None:
         | 
| 4446 | 
            -
                            logging.warning(_('No active 2D result !'))
         | 
| 4447 | 
            -
                            return
         | 
| 4448 | 
            -
             | 
| 4449 | 
            -
                        self.active_res2d.show_tiles()
         | 
| 4450 | 
            -
             | 
| 4451 4483 | 
             
                    elif itemlabel == _("Manage banks..."):
         | 
| 4452 4484 | 
             
                        if self.active_vector is None:
         | 
| 4453 4485 | 
             
                            msg = _('Active vector is None\nPlease activate the one desired')
         | 
| @@ -4712,6 +4744,10 @@ class WolfMapViewer(wx.Frame): | |
| 4712 4744 |  | 
| 4713 4745 | 
             
                        self.create_2D_MB_model()
         | 
| 4714 4746 |  | 
| 4747 | 
            +
                    elif itemlabel == _('Open hydrological model'):
         | 
| 4748 | 
            +
             | 
| 4749 | 
            +
                        self.open_hydrological_model()
         | 
| 4750 | 
            +
             | 
| 4715 4751 | 
             
                    elif itemlabel == _('Check headers'):
         | 
| 4716 4752 |  | 
| 4717 4753 | 
             
                        self.check_2D_MB_headers()
         | 
    
        wolfhece/PyGui.py
    CHANGED
    
    | @@ -276,19 +276,32 @@ class HydrologyModel(GenMapManager): | |
| 276 276 | 
             
                            ('_encode.sub','Coded index SubB [-]')]}
         | 
| 277 277 |  | 
| 278 278 |  | 
| 279 | 
            -
                        self.files_hydrology_vectors={' | 
| 279 | 
            +
                        self.files_hydrology_vectors={'Characteristic_vectors':[('.delimit.vec','Watershed')],
         | 
| 280 280 | 
             
                                                    'Whole_basin':[('Rain_basin_geom.vec','Rain geom'),
         | 
| 281 281 | 
             
                                                                    ('Evap_basin_geom.vec','Evapotranspiration geom')]}
         | 
| 282 282 |  | 
| 283 283 | 
             
                        for curfile in self.files_hydrology_array['Characteristic_maps']:
         | 
| 284 284 | 
             
                            curext=curfile[0]
         | 
| 285 | 
            -
                            curidx=curfile[1]
         | 
| 285 | 
            +
                            curidx=curfile[1]                
         | 
| 286 286 | 
             
                            self.mapviewer.add_object(which='array',filename=self.mydircharact+curext,id=curidx,ToCheck=False)
         | 
| 287 287 |  | 
| 288 | 
            -
             | 
| 288 | 
            +
             | 
| 289 | 
            +
                        for curfile in self.files_hydrology_vectors['Characteristic_vectors']:
         | 
| 289 290 | 
             
                            curext=curfile[0]
         | 
| 290 291 | 
             
                            curidx=curfile[1]
         | 
| 291 | 
            -
             | 
| 292 | 
            +
             | 
| 293 | 
            +
                            delimit = Zones(filename=self.mydircharact+curext, mapviewer=self.mapviewer, parent = self.mapviewer)
         | 
| 294 | 
            +
             | 
| 295 | 
            +
                            for idx, cur_zone in enumerate(delimit.myzones):
         | 
| 296 | 
            +
                                cur_sub = self.mycatchment.get_subBasin(idx+1)
         | 
| 297 | 
            +
                                cur_zone.myname = cur_sub.name
         | 
| 298 | 
            +
                                cur_vect = cur_zone.myvectors[0]
         | 
| 299 | 
            +
                                cur_vect.set_legend_to_centroid(cur_sub.name + ' - ' + str(cur_sub.iDSorted), visible=True)
         | 
| 300 | 
            +
                                cur_vect.myprop.legendfontsize = 12
         | 
| 301 | 
            +
                            
         | 
| 302 | 
            +
                            delimit.reset_listogl()
         | 
| 303 | 
            +
             | 
| 304 | 
            +
                            self.mapviewer.add_object(which='vector',newobj = delimit, id=curidx, ToCheck=True)
         | 
| 292 305 |  | 
| 293 306 | 
             
                        for curfile in self.files_hydrology_vectors['Whole_basin']:
         | 
| 294 307 | 
             
                            curext=curfile[0]
         | 
| @@ -297,7 +310,17 @@ class HydrologyModel(GenMapManager): | |
| 297 310 | 
             
                                self.mapviewer.add_object(which='vector',filename=self.mydirwhole+curext,id=curidx,ToCheck=False)
         | 
| 298 311 |  | 
| 299 312 | 
             
                        self.mapviewer.add_object(which='vector',newobj=self.myexchanges.mysegs,id='Forced exchanges',ToCheck=False)
         | 
| 313 | 
            +
             | 
| 314 | 
            +
                        zones_RT = self.mycatchment.get_retentionbasin_zones()
         | 
| 315 | 
            +
                        zones_RT.parent = self
         | 
| 316 | 
            +
                        self.mapviewer.add_object(which='vector',newobj=zones_RT,id='Anthropic links',ToCheck=False)
         | 
| 317 | 
            +
             | 
| 300 318 | 
             
                        self.mapviewer.add_object(which='cloud',newobj=self.mycatchment.subBasinCloud,id='Local outlets',ToCheck=False)
         | 
| 319 | 
            +
                        self.mapviewer.add_object(which='cloud',newobj=self.mycatchment.retentionBasinCloud,id='Anthropic inlets/outlets',ToCheck=False)
         | 
| 320 | 
            +
             | 
| 321 | 
            +
                        self.mycatchment.subBasinCloud.set_mapviewer(self.mapviewer)
         | 
| 322 | 
            +
                        self.mycatchment.retentionBasinCloud.set_mapviewer(self.mapviewer)
         | 
| 323 | 
            +
             | 
| 301 324 | 
             
                        self.mapviewer.add_object(which='cloud',newobj=self.myexchanges.mycloudup,id='Up nodes',ToCheck=False)
         | 
| 302 325 | 
             
                        self.mapviewer.add_object(which='cloud',newobj=self.myexchanges.myclouddown,id='Down nodes',ToCheck=False)
         | 
| 303 326 |  | 
    
        wolfhece/PyParams.py
    CHANGED
    
    | @@ -1064,7 +1064,7 @@ class Wolf_Param(wx.Frame): | |
| 1064 1064 | 
             
                                    logging.debug("String type will be conserved! -- {}".format(value_param))
         | 
| 1065 1065 |  | 
| 1066 1066 | 
             
                            if type(value_param) != int:
         | 
| 1067 | 
            -
                                logging.warning("Parameters -- EnumProperty -- Value {} is not an integer".format(value_param))
         | 
| 1067 | 
            +
                                logging.warning("Parameters -- EnumProperty -- Value {} is not an integer in file : {}".format(value_param, self.filename))
         | 
| 1068 1068 | 
             
                                logging.debug("EnumProperty value must be an integer")
         | 
| 1069 1069 |  | 
| 1070 1070 | 
             
                            page.Append(pg.EnumProperty(label= param_name, name= locname, labels= list_keys, values= list_values, value= int(value_param)))
         | 
    
        wolfhece/PyVertexvectors.py
    CHANGED
    
    | @@ -2523,7 +2523,12 @@ class zone: | |
| 2523 2523 |  | 
| 2524 2524 | 
             
                    :param prep: True = préparation des listes OpenGL ; False = affichage direct
         | 
| 2525 2525 | 
             
                    """
         | 
| 2526 | 
            +
             | 
| 2526 2527 | 
             
                    if prep:
         | 
| 2528 | 
            +
                        if len(self.myvectors) == 0:
         | 
| 2529 | 
            +
                            logging.warning(_('No vector in zone -- {}').format(self.myname))
         | 
| 2530 | 
            +
                            return
         | 
| 2531 | 
            +
                        
         | 
| 2527 2532 | 
             
                        try:
         | 
| 2528 2533 | 
             
                            if self.idgllist==-99999:
         | 
| 2529 2534 | 
             
                                self.idgllist = glGenLists(1)
         | 
| @@ -2540,6 +2545,10 @@ class zone: | |
| 2540 2545 | 
             
                        except:
         | 
| 2541 2546 | 
             
                            logging.error(_('OpenGL error in zone.plot'))
         | 
| 2542 2547 | 
             
                    else:
         | 
| 2548 | 
            +
                        if len(self.myvectors) == 0:
         | 
| 2549 | 
            +
                            logging.warning(_('No vector in zone -- {}').format(self.myname))
         | 
| 2550 | 
            +
                            return
         | 
| 2551 | 
            +
             | 
| 2543 2552 | 
             
                        if self.idgllist!=-99999:
         | 
| 2544 2553 | 
             
                            glCallList(self.idgllist)
         | 
| 2545 2554 | 
             
                        else:
         | 
| @@ -4811,6 +4820,10 @@ class Zones(wx.Frame, Element_To_Draw): | |
| 4811 4820 | 
             
                        return expended_items
         | 
| 4812 4821 |  | 
| 4813 4822 | 
             
                    def restore_tree_state(tree:TreeListCtrl, expended_items):
         | 
| 4823 | 
            +
                        
         | 
| 4824 | 
            +
                        if len(expanded)==0:
         | 
| 4825 | 
            +
                            # Nothing to do
         | 
| 4826 | 
            +
                            return
         | 
| 4814 4827 |  | 
| 4815 4828 | 
             
                        root = tree.GetRootItem()
         | 
| 4816 4829 |  | 
| @@ -5837,6 +5850,7 @@ class Zones(wx.Frame, Element_To_Draw): | |
| 5837 5850 |  | 
| 5838 5851 | 
             
                    Pousse la même information dans l'objet parent s'il existe
         | 
| 5839 5852 | 
             
                    """
         | 
| 5853 | 
            +
                    
         | 
| 5840 5854 | 
             
                    if self.wx_exists:
         | 
| 5841 5855 | 
             
                        self.active_zone = object
         | 
| 5842 5856 |  | 
    
        wolfhece/Results2DGPU.py
    CHANGED
    
    | @@ -237,6 +237,10 @@ class wolfres2DGPU(Wolfresults_2D): | |
| 237 237 | 
             
                                try:
         | 
| 238 238 | 
             
                                    curblock.top.dx = params["parameters"]["dx"]
         | 
| 239 239 | 
             
                                    curblock.top.dy = params["parameters"]["dy"]
         | 
| 240 | 
            +
             | 
| 241 | 
            +
                                    curblock.dx = curblock.top.dx
         | 
| 242 | 
            +
                                    curblock.dy = curblock.top.dy
         | 
| 243 | 
            +
             | 
| 240 244 | 
             
                                except:
         | 
| 241 245 | 
             
                                    logging.error(_('No spatial resolution (dx,dy) in parameters.json -- Results will not be shown in viewer'))
         | 
| 242 246 | 
             
                                    return -1
         | 
| @@ -244,6 +248,10 @@ class wolfres2DGPU(Wolfresults_2D): | |
| 244 248 | 
             
                                try:
         | 
| 245 249 | 
             
                                    curblock.top.origx = params["parameters"]["base_coord_x"]
         | 
| 246 250 | 
             
                                    curblock.top.origy = params["parameters"]["base_coord_y"]
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                                    curblock.origx = curblock.top.origx
         | 
| 253 | 
            +
                                    curblock.origy = curblock.top.origy
         | 
| 254 | 
            +
                                    
         | 
| 247 255 | 
             
                                except:
         | 
| 248 256 | 
             
                                    logging.error(_('No spatial position (base_coord_x,base_coord_y) in parameters.json -- Results will not be spatially based'))
         | 
| 249 257 | 
             
                                    return -2
         | 
| @@ -406,12 +414,12 @@ class wolfres2DGPU(Wolfresults_2D): | |
| 406 414 | 
             
                    self.current_result = self._sanitize_result_step(self.current_result)
         | 
| 407 415 | 
             
                    self.read_oneresult(self.current_result)
         | 
| 408 416 |  | 
| 409 | 
            -
                def read_next(self):
         | 
| 410 | 
            -
             | 
| 411 | 
            -
             | 
| 412 | 
            -
             | 
| 413 | 
            -
             | 
| 414 | 
            -
             | 
| 417 | 
            +
                # def read_next(self):
         | 
| 418 | 
            +
                #     """
         | 
| 419 | 
            +
                #     Lecture du pas suivant
         | 
| 420 | 
            +
                #     """
         | 
| 421 | 
            +
                #     self.current_result+= self._step_interval
         | 
| 422 | 
            +
                #     self._update_result_view()
         | 
| 415 423 |  | 
| 416 424 | 
             
                def get_times_steps(self, nb:int = None):
         | 
| 417 425 | 
             
                    """
         | 
| @@ -441,12 +449,12 @@ class wolfres2DGPU(Wolfresults_2D): | |
| 441 449 | 
             
                        else:
         | 
| 442 450 | 
             
                            return self.times, self.timesteps
         | 
| 443 451 |  | 
| 444 | 
            -
                def read_previous(self):
         | 
| 445 | 
            -
             | 
| 446 | 
            -
             | 
| 447 | 
            -
             | 
| 448 | 
            -
             | 
| 449 | 
            -
             | 
| 452 | 
            +
                # def read_previous(self):
         | 
| 453 | 
            +
                #     """
         | 
| 454 | 
            +
                #     Lecture du pas suivant
         | 
| 455 | 
            +
                #     """
         | 
| 456 | 
            +
                #     self.current_result -= self._step_interval
         | 
| 457 | 
            +
                #     self._update_result_view()
         | 
| 450 458 |  | 
| 451 459 | 
             
                def get_cached_h(self, idx):
         | 
| 452 460 | 
             
                    """ Return cached water depth according to WOLF convention """
         | 
    
        wolfhece/apps/version.py
    CHANGED
    
    
    
        wolfhece/fonts/arial.ttf
    CHANGED
    
    | Binary file | 
    
        wolfhece/hydrology/Catchment.py
    CHANGED
    
    | @@ -53,10 +53,9 @@ class Catchment: | |
| 53 53 | 
             
                _version:float                                                          # version of the wolfHydro python code. Useful for identifying the file versions to read and how to interpret them
         | 
| 54 54 | 
             
                charact_watrshd:Watershed                                               # Watershed object containing the most useful properties of the arrays in Characteristics maps
         | 
| 55 55 | 
             
                subBasinCloud:cloud_vertices                                            # cloud of points containing the true coordinates (used in simulation) of all subbasin outlets
         | 
| 56 | 
            +
                retentionBasinCloud:cloud_vertices                                      # cloud of points containing the true coordinates (used in simulation) of all retention basins
         | 
| 56 57 | 
             
                iP_Cloud:cloud_vertices                                                 # cloud of points containing the given coordinates (given in param files) of all subbasin outlets
         | 
| 57 58 |  | 
| 58 | 
            -
                subBasinDict:dict[int:SubBasin]
         | 
| 59 | 
            -
             | 
| 60 59 | 
             
                catchmentDict:dict[Union[str, int], Union[SubBasin, RetentionBasin]]    # dictionnary containing all the elements of the catchment
         | 
| 61 60 | 
             
                subBasinDict:dict[int, SubBasin]                                        # dictionnary containing all the subbasins
         | 
| 62 61 |  | 
| @@ -85,6 +84,10 @@ class Catchment: | |
| 85 84 | 
             
                    self.subBasinCloud.myprop.color=getIfromRGB((255,131,250))
         | 
| 86 85 | 
             
                    self.subBasinCloud.myprop.filled=True
         | 
| 87 86 |  | 
| 87 | 
            +
                    self.retentionBasinCloud=cloud_vertices()
         | 
| 88 | 
            +
                    self.retentionBasinCloud.myprop.color=getIfromRGB((0,131,255))
         | 
| 89 | 
            +
                    self.retentionBasinCloud.myprop.filled=True
         | 
| 90 | 
            +
             | 
| 88 91 | 
             
                    self.iP_Cloud=cloud_vertices()
         | 
| 89 92 | 
             
                    self.iP_Cloud.myprop.color=getIfromRGB((255,131,250))
         | 
| 90 93 | 
             
                    self.iP_Cloud.myprop.filled=True
         | 
| @@ -194,7 +197,7 @@ class Catchment: | |
| 194 197 | 
             
                    # self.topo_wolf_array = WolfArray(self.workingDir + "Characteristic_maps/Drainage_basin.b")
         | 
| 195 198 | 
             
                    # self.topo_wolf_array = WolfArray(self.workingDir + "Characteristic_maps/Drainage_basin.b2")
         | 
| 196 199 | 
             
                    self.time_wolf_array = WolfArray(os.path.join(self.workingDir,"Characteristic_maps/Drainage_basin.time"))
         | 
| 197 | 
            -
                    self.charact_watrshd = Watershed(self.workingDir)
         | 
| 200 | 
            +
                    self.charact_watrshd = Watershed(self.workingDir, dir_mnt_subpixels=self.paramsInput[('Sub-pixeling', 'Directory')])
         | 
| 198 201 | 
             
                    self.set_eff_outlet_coord()
         | 
| 199 202 |  | 
| 200 203 | 
             
                    # time array:
         | 
| @@ -221,6 +224,8 @@ class Catchment: | |
| 221 224 | 
             
                    # Iterate through the Input params dictionnary
         | 
| 222 225 | 
             
                    self.create_ObjectsInCatchment()
         | 
| 223 226 |  | 
| 227 | 
            +
                    self.charact_watrshd.set_names_subbasins([(cur.iDSorted, cur.name) for cur in self.subBasinDict.values()])
         | 
| 228 | 
            +
             | 
| 224 229 | 
             
                    # self.add_hyetoToDict()
         | 
| 225 230 |  | 
| 226 231 |  | 
| @@ -323,8 +328,27 @@ class Catchment: | |
| 323 328 | 
             
                    if(self.plotAllSub):
         | 
| 324 329 | 
             
                        self.plot_allSub()
         | 
| 325 330 |  | 
| 331 | 
            +
                    # self.charact_watrshd.impose_sorted_index_subbasins([cur.iDSorted for cur in self.subBasinDict.values()])
         | 
| 326 332 |  | 
| 333 | 
            +
                    self._fill_cloud_retentionbasin()
         | 
| 334 | 
            +
             | 
| 335 | 
            +
                def get_subBasin(self, id_sorted_or_name:int | str) -> SubBasin:
         | 
| 336 | 
            +
                    """ 
         | 
| 337 | 
            +
                    This method returns the subbasin object associated with the sorted id or name given in argument.
         | 
| 338 | 
            +
             | 
| 339 | 
            +
                    The sorted id is the one given by the Fortran code.
         | 
| 340 | 
            +
                    """
         | 
| 327 341 |  | 
| 342 | 
            +
                    if isinstance(id_sorted_or_name, str):
         | 
| 343 | 
            +
                        for cursub in self.subBasinDict.values():
         | 
| 344 | 
            +
                            if(cursub.name.lower() == id_sorted_or_name.lower()):
         | 
| 345 | 
            +
                                return cursub
         | 
| 346 | 
            +
             | 
| 347 | 
            +
                    elif isinstance(id_sorted_or_name, int):
         | 
| 348 | 
            +
                        for cursub in self.subBasinDict.values():
         | 
| 349 | 
            +
                            if(cursub.iDSorted == id_sorted_or_name):
         | 
| 350 | 
            +
                                return cursub
         | 
| 351 | 
            +
                    return None
         | 
| 328 352 |  | 
| 329 353 |  | 
| 330 354 | 
             
                def get_time(self):
         | 
| @@ -565,6 +589,7 @@ class Catchment: | |
| 565 589 | 
             
                                self.junctionNamesDict[self.paramsTopology.myparams[element]["outlet "+str(iOutlet+1)][key_Param.VALUE]] = element
         | 
| 566 590 |  | 
| 567 591 | 
             
                            self.retentionBasinDict[element] = RetentionBasin(self.dateBegin, self.dateEnd, self.deltaT, self.time, idBasin, nameBasin, typeOfRB, self.paramsRB.myparams, _tz=self.tz, _outletNames=myOutletsNames, _workingDir=self.workingDir)
         | 
| 592 | 
            +
             | 
| 568 593 | 
             
                            # Save the RB in the RB dictionnary into the global Catchment dictionnary
         | 
| 569 594 | 
             
                            self.catchmentDict[element] = self.retentionBasinDict[element]
         | 
| 570 595 |  | 
| @@ -573,6 +598,25 @@ class Catchment: | |
| 573 598 | 
             
                            print("ERROR: This type of junction is unknown. Please check the topo postprocess file")
         | 
| 574 599 | 
             
                            sys.exit()
         | 
| 575 600 |  | 
| 601 | 
            +
                def _fill_cloud_retentionbasin(self):
         | 
| 602 | 
            +
                    """ This procedure fills the cloud of the retention basin with the vertices of the retention basin and its inlets. """
         | 
| 603 | 
            +
             | 
| 604 | 
            +
                    for curRT in self.retentionBasinDict.values():
         | 
| 605 | 
            +
                        curRT:RetentionBasin
         | 
| 606 | 
            +
                        self.retentionBasinCloud.add_vertex(wolfvertex(curRT.x,curRT.y))
         | 
| 607 | 
            +
                        inlet_coords = curRT.get_inletCoords()
         | 
| 608 | 
            +
                        for cur_inlet in inlet_coords:
         | 
| 609 | 
            +
                            self.retentionBasinCloud.add_vertex(wolfvertex(cur_inlet[0],cur_inlet[1]))
         | 
| 610 | 
            +
             | 
| 611 | 
            +
                def get_retentionbasin_zones(self)-> Zones:
         | 
| 612 | 
            +
                    """ This method returns a Zones instance of the retention basins. """
         | 
| 613 | 
            +
                    
         | 
| 614 | 
            +
                    zones = Zones()
         | 
| 615 | 
            +
                    for curRB in self.retentionBasinDict.values():
         | 
| 616 | 
            +
                        curRB:RetentionBasin
         | 
| 617 | 
            +
                        zones.add_zone(curRB.get_zone(), forceparent=True)
         | 
| 618 | 
            +
             | 
| 619 | 
            +
                    return zones
         | 
| 576 620 |  | 
| 577 621 |  | 
| 578 622 | 
             
                def link_objects(self):
         | 
| @@ -1367,7 +1411,7 @@ class Catchment: | |
| 1367 1411 | 
             
                            excelData[0].append(self.topologyDict[level][curBasin].x)
         | 
| 1368 1412 | 
             
                            excelData[1].append(self.topologyDict[level][curBasin].y)
         | 
| 1369 1413 | 
             
                            for curChar in self.topologyDict[level][curBasin].mainCharactDict:
         | 
| 1370 | 
            -
                                excelData[iChar].append(self.topologyDict[level][curBasin].mainCharactDict[curChar][ | 
| 1414 | 
            +
                                excelData[iChar].append(self.topologyDict[level][curBasin].mainCharactDict[curChar]["value"])
         | 
| 1371 1415 | 
             
                                iChar += 1
         | 
| 1372 1416 | 
             
                            iBasin += 1
         | 
| 1373 1417 |  | 
| @@ -1416,10 +1460,10 @@ class Catchment: | |
| 1416 1460 | 
             
                        endFileName = "rain.hyeto"
         | 
| 1417 1461 | 
             
                        for element in self.hyetoDict['Ordered To Nb']:
         | 
| 1418 1462 | 
             
                            nbToRead = self.hyetoDict['Ordered To Nb'][element]
         | 
| 1419 | 
            -
                            fileName = os.path.join(beginFileName, nbToRead | 
| 1463 | 
            +
                            fileName = os.path.join(beginFileName, nbToRead+ endFileName)
         | 
| 1420 1464 | 
             
                            isOk, fileName = check_path(fileName, applyCWD=True)
         | 
| 1421 1465 | 
             
                            if isOk<0:
         | 
| 1422 | 
            -
                                print("WARNING: could not find any dbf file! ")
         | 
| 1466 | 
            +
                                # print("WARNING: could not find any dbf file! ")
         | 
| 1423 1467 | 
             
                                time_mod.sleep(.5)
         | 
| 1424 1468 | 
             
                                return
         | 
| 1425 1469 | 
             
                            [time, rain] = self.get_hyeto(fileName)
         | 
| @@ -1803,6 +1847,46 @@ class Catchment: | |
| 1803 1847 | 
             
                            # paramsInput.ApplytoMemory(None)
         | 
| 1804 1848 | 
             
                            paramsInput.SavetoFile(None)
         | 
| 1805 1849 |  | 
| 1850 | 
            +
                
         | 
| 1851 | 
            +
                def _correct_Umax_from_old_model(self, adapt_with_rain:bool=True):
         | 
| 1852 | 
            +
                    fileName = "simul_soil.param"
         | 
| 1853 | 
            +
                    which="Umax"
         | 
| 1854 | 
            +
             | 
| 1855 | 
            +
                    for iBasin in range(1,len(self.subBasinDict)+1):
         | 
| 1856 | 
            +
                        myBasin = self.subBasinDict[iBasin]
         | 
| 1857 | 
            +
                        dirID = myBasin.iDSorted
         | 
| 1858 | 
            +
             | 
| 1859 | 
            +
                        fileToModif = os.path.join(self.workingDir, "Subbasin_" + str(dirID), fileName)
         | 
| 1860 | 
            +
             | 
| 1861 | 
            +
                        paramsInput = Wolf_Param(to_read=False,toShow=False)
         | 
| 1862 | 
            +
                        paramsInput.ReadFile(fileToModif)
         | 
| 1863 | 
            +
                        
         | 
| 1864 | 
            +
                        if adapt_with_rain:
         | 
| 1865 | 
            +
                            myInterval = paramsInput.get_param("Distributed production model parameters", "Time span soil", default_value=0.0)
         | 
| 1866 | 
            +
                            if myInterval==0.0:
         | 
| 1867 | 
            +
                                nbIntervals = len(myBasin.myRain)-1
         | 
| 1868 | 
            +
                            else:
         | 
| 1869 | 
            +
                                nbIntervals = math.floor(myInterval/myBasin.deltaT)
         | 
| 1870 | 
            +
                            kernel = np.ones(nbIntervals)
         | 
| 1871 | 
            +
                            volRain = np.convolve(myBasin.myRain, kernel)*myBasin.deltaT/3600.0
         | 
| 1872 | 
            +
                            maxRain = np.max(volRain)
         | 
| 1873 | 
            +
                        else:
         | 
| 1874 | 
            +
                            maxRain = paramsInput.get_param("Distributed production model parameters", "Umax")
         | 
| 1875 | 
            +
                            if maxRain==0.0:
         | 
| 1876 | 
            +
                                logging.warning("The Umax is not adapted with the rain and its value is 0.0. It might be better to put 'adapt_with_rain' to True.")
         | 
| 1877 | 
            +
             | 
| 1878 | 
            +
                        k = paramsInput.get_param("Horton parameters", "k", default_value=0.0)
         | 
| 1879 | 
            +
                        if k==0.0:
         | 
| 1880 | 
            +
                            continue
         | 
| 1881 | 
            +
                        
         | 
| 1882 | 
            +
                        U_max = maxRain/k
         | 
| 1883 | 
            +
             | 
| 1884 | 
            +
                        paramsInput.change_param("Distributed production model parameters", which, U_max)
         | 
| 1885 | 
            +
                        paramsInput.change_param("Horton parameters", "k", 0.0)
         | 
| 1886 | 
            +
             | 
| 1887 | 
            +
                        # paramsInput.ApplytoMemory(None)
         | 
| 1888 | 
            +
                        paramsInput.SavetoFile(None)
         | 
| 1889 | 
            +
             | 
| 1806 1890 |  | 
| 1807 1891 |  | 
| 1808 1892 | 
             
                def plot_all_diff_cumulRain_with_lagtime(self, interval, lagTime, selection_by_iD=[], graph_title="", show=True, writeDir="", lawNetRain=0, netRainParams={}):
         | 
| @@ -1856,7 +1940,7 @@ class Catchment: | |
| 1856 1940 | 
             
                        directory = self.paramsInput.get_param("Measuring stations SPW", "Directory")
         | 
| 1857 1941 | 
             
                        isOk, directory = check_path(directory, self.workingDir)
         | 
| 1858 1942 | 
             
                        if isOk<0:
         | 
| 1859 | 
            -
                             | 
| 1943 | 
            +
                            logging.error(_("ERROR : measuring station data path not present! "))
         | 
| 1860 1944 | 
             
                        fileName = os.path.join(directory, self.paramsInput.get_param("Measuring stations SPW", "Filename")) 
         | 
| 1861 1945 |  | 
| 1862 1946 |  | 
| @@ -1869,7 +1953,7 @@ class Catchment: | |
| 1869 1953 | 
             
                            for raw in data_reader:
         | 
| 1870 1954 | 
             
                                list_data.append(raw)
         | 
| 1871 1955 | 
             
                    else:
         | 
| 1872 | 
            -
                         | 
| 1956 | 
            +
                        logging.error(_("ERROR : measuring station data file not present! "))
         | 
| 1873 1957 | 
             
                        return
         | 
| 1874 1958 |  | 
| 1875 1959 | 
             
                    # Building dictionnary
         |