mirror of
https://gitlab.com/pamhyr/pamhyr2.git
synced 2026-10-30 03:20:41 +01:00
175 lines
5.2 KiB
Python
175 lines
5.2 KiB
Python
# LateralContributionList.py -- Pamhyr
|
|
# Copyright (C) 2023-2026 INRAE
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from copy import copy
|
|
from tools import trace, timer
|
|
|
|
from Model.Tools.PamhyrListExt import PamhyrModelListWithTab
|
|
from Model.Except import NotImplementedMethodeError
|
|
|
|
from Model.LateralContribution.LateralContribution import LateralContribution
|
|
from Model.LateralContribution.LateralContributionTypes import (
|
|
NotDefined, LateralContrib, Rain, Evaporation,
|
|
)
|
|
|
|
|
|
class LateralContributionList(PamhyrModelListWithTab):
|
|
_tabs_list = ["liquid", "solid", "suspenssion"]
|
|
_sub_classes = [
|
|
LateralContribution,
|
|
]
|
|
|
|
@classmethod
|
|
def _db_load(cls, execute, data=None):
|
|
new = cls(status=data['status'])
|
|
|
|
if data is None:
|
|
data = {}
|
|
|
|
for tab in new._tabs:
|
|
data["tab"] = tab
|
|
new._tabs[tab] = LateralContribution._db_load(
|
|
execute, data
|
|
)
|
|
|
|
return new
|
|
|
|
def _db_save(self, execute, data=None):
|
|
execute(
|
|
"DELETE FROM lateral_contribution " +
|
|
f"WHERE scenario = {self._status.scenario_id}"
|
|
)
|
|
|
|
if data is None:
|
|
data = {}
|
|
|
|
for tab in self._tabs:
|
|
data["tab"] = tab
|
|
for lc in self._tabs[tab]:
|
|
lc._db_save(execute, data=data)
|
|
|
|
return True
|
|
|
|
def new(self, lst, index):
|
|
n = NotDefined(status=self._status)
|
|
self._tabs[lst].insert(index, n)
|
|
self._status.modified()
|
|
return n
|
|
|
|
def split_reach(self, reach, profile, reach1, reach2):
|
|
profiles = reach.reach.profiles
|
|
split_index = profiles.index(profile)
|
|
|
|
parts = [
|
|
(
|
|
reach1,
|
|
0,
|
|
split_index,
|
|
dict(zip(
|
|
profiles[:split_index + 1],
|
|
reach1.reach.profiles
|
|
))
|
|
),
|
|
(
|
|
reach2,
|
|
split_index,
|
|
len(profiles) - 1,
|
|
dict(zip(
|
|
profiles[split_index:],
|
|
reach2.reach.profiles
|
|
))
|
|
),
|
|
]
|
|
|
|
for tab in self._tabs:
|
|
contributions = [
|
|
contribution
|
|
for contribution in self.get_tab(tab)
|
|
if contribution.reach is reach
|
|
]
|
|
|
|
for contribution in contributions:
|
|
if (contribution.begin_section not in profiles or
|
|
contribution.end_section not in profiles):
|
|
continue
|
|
|
|
begin = profiles.index(contribution.begin_section)
|
|
end = profiles.index(contribution.end_section)
|
|
lower, upper = sorted((begin, end))
|
|
reverse = begin > end
|
|
clones = []
|
|
|
|
for new_reach, part_lower, part_upper, sections in parts:
|
|
clipped_lower = max(lower, part_lower)
|
|
clipped_upper = min(upper, part_upper)
|
|
if clipped_lower >= clipped_upper:
|
|
continue
|
|
|
|
begin_index = (
|
|
clipped_upper if reverse else clipped_lower
|
|
)
|
|
end_index = (
|
|
clipped_lower if reverse else clipped_upper
|
|
)
|
|
clones.append(contribution.cloned_for(
|
|
new_reach,
|
|
sections[profiles[begin_index]],
|
|
sections[profiles[end_index]]
|
|
))
|
|
|
|
if len(clones) == 0:
|
|
continue
|
|
|
|
self._tabs[tab].extend(clones)
|
|
|
|
self._status.modified()
|
|
|
|
def get_tab_for_enabled_reaches(self, tab):
|
|
return [
|
|
contribution
|
|
for contribution in self.get_tab(tab)
|
|
if (contribution.reach is None or
|
|
(not contribution.reach.is_deleted() and
|
|
contribution.reach.is_enable()))
|
|
]
|
|
|
|
def get_for_enabled_reaches(self, tab, index):
|
|
contributions = self.get_tab_for_enabled_reaches(tab)
|
|
if not 0 <= index < len(contributions):
|
|
return None
|
|
return contributions[index]
|
|
|
|
def __copy__(self):
|
|
new = LateralContributionList()
|
|
|
|
for lst in self._tabs:
|
|
new.tabs[lst] = self._tabs[lst].copy()
|
|
|
|
return new
|
|
|
|
def __deepcopy__(self):
|
|
new = LateralContributionList()
|
|
|
|
for lst in self._tabs:
|
|
new.tabs[lst] = self._tabs[lst].deepcopy()
|
|
|
|
return new
|
|
|
|
def copy(self):
|
|
return copy(self)
|