Ensemble: Create ensemble scenario from current scenario.

This commit is contained in:
parouby committed 2026-09-17 10:02:01 +02:00
1 parent 933c6c1952
commit 7356e5dd30
5 files changed
+43 -19

No files matched your search

+7 -3
View File
@@ -679,6 +679,7 @@ class Study(SQLModel):
self.status.scenario.y + 100) self.status.scenario.y + 100)
new.name = self.status.scenario.name + " (copy)" new.name = self.status.scenario.name + " (copy)"
new.is_ensemble = self.status.scenario.is_ensemble
self.status.scenario = new self.status.scenario = new
self.river._data_traversal( self.river._data_traversal(
@@ -690,15 +691,18 @@ class Study(SQLModel):
self.status.set_as_editable() self.status.set_as_editable()
return new return new
def create_ensemble_scenario(self, switch=True): def create_ensemble_scenario(self, pos=None, switch=True):
new = self.scenarios.new( new = self.scenarios.new(
self.status.scenario, self.status.scenario,
is_ensemble=True is_ensemble=True
) )
new.name = self.status.scenario.name + " (ensemble)" new.name = self.status.scenario.name + " (ensemble)"
new.set_pos(self.status.scenario.x + 100, if pos is not None:
self.status.scenario.y) new.set_pos(pos.x(), pos.y())
else:
new.set_pos(self.status.scenario.x + 100,
self.status.scenario.y)
if switch: if switch:
self.status.scenario = new self.status.scenario = new
+12 -13
View File
@@ -47,11 +47,19 @@ class AbstractMenu(object):
class DefaultMenu(AbstractMenu): class DefaultMenu(AbstractMenu):
def run(self): def run(self):
current_scenario = self._graph.status.scenario
if current_scenario.is_ensemble():
return
add_node = self._menu.addAction(self._trad["menu_add_scenario"]) add_node = self._menu.addAction(self._trad["menu_add_scenario"])
ensemble = self._menu.addAction(self._trad["menu_ens_scenario"])
action = self._exec() action = self._exec()
if action == add_node: if action == add_node:
self._parent.new_scenario(self._pos) self._parent.new_scenario(self._pos)
if action == ensemble:
self._parent.create_new_ensemble_scenario(self._pos)
class ScenarioMenu(AbstractMenu): class ScenarioMenu(AbstractMenu):
@@ -59,17 +67,16 @@ class ScenarioMenu(AbstractMenu):
item = self._items[0] item = self._items[0]
scenarios = item.graph._study.scenarios scenarios = item.graph._study.scenarios
if len(scenarios) == 1:
return
current_scenario = item.graph._study.status.scenario.id current_scenario = item.graph._study.status.scenario.id
select = self._menu.addAction(self._trad["menu_select_scenario"]) select = None
duplicate = None duplicate = None
delete = None delete = None
ensemble = None
edit_ens = None edit_ens = None
if len(scenarios) > 1:
select = self._menu.addAction(self._trad["menu_select_scenario"])
if item.scenario.id != 0: if item.scenario.id != 0:
if scenarios.is_leaf(item.scenario): if scenarios.is_leaf(item.scenario):
delete = self._menu.addAction(self._trad["menu_del_scenario"]) delete = self._menu.addAction(self._trad["menu_del_scenario"])
@@ -79,12 +86,6 @@ class ScenarioMenu(AbstractMenu):
self._trad["menu_dup_scenario"] self._trad["menu_dup_scenario"]
) )
if not item.scenario.is_ensemble():
if item.scenario.id == current_scenario:
ensemble = self._menu.addAction(
self._trad["menu_ens_scenario"]
)
if item.scenario.is_ensemble(): if item.scenario.is_ensemble():
edit_ens = self._menu.addAction( edit_ens = self._menu.addAction(
self._trad["menu_edit_ens_scenario"] self._trad["menu_edit_ens_scenario"]
@@ -99,7 +100,5 @@ class ScenarioMenu(AbstractMenu):
self._parent.delete_scenario(item) self._parent.delete_scenario(item)
elif action == duplicate: elif action == duplicate:
self._parent.duplicate_scenario(item) self._parent.duplicate_scenario(item)
elif action == ensemble:
self._parent.create_ensemble_scenario(item)
elif action == edit_ens: elif action == edit_ens:
self._parent.edit_ensemble_scenario(item) self._parent.edit_ensemble_scenario(item)
+20
View File
@@ -550,6 +550,26 @@ class GraphWidget(QGraphicsView):
self.exec_with_waiting_window(fn, "create_ensemble_scenario") self.exec_with_waiting_window(fn, "create_ensemble_scenario")
self.changeScenario.emit(self.sender()) self.changeScenario.emit(self.sender())
def create_new_ensemble_scenario(self, pos):
must_save = self.dialog_save()
if must_save == "Cancel":
return
def fn():
self._close_other_window()
if must_save == "Save":
self._study.save()
self._undo.push(
CreateEnsembleScenarioCommand(
self._study, pos=pos,
)
)
self.exec_with_waiting_window(fn, "create_ensemble_scenario")
self.changeScenario.emit(self.sender())
def edit_ensemble_scenario(self, item): def edit_ensemble_scenario(self, item):
self.parent\ self.parent\
.parent\ .parent\
+3 -2
View File
@@ -99,11 +99,12 @@ class DuplicateScenariosCommand(QUndoCommand):
class CreateEnsembleScenarioCommand(QUndoCommand): class CreateEnsembleScenarioCommand(QUndoCommand):
def __init__(self, study): def __init__(self, study, pos=None):
QUndoCommand.__init__(self) QUndoCommand.__init__(self)
self._study = study self._study = study
self._new = None self._new = None
self._pos = pos
def undo(self): def undo(self):
self._study.scenarios.delete(self._new.id) self._study.scenarios.delete(self._new.id)
@@ -111,7 +112,7 @@ class CreateEnsembleScenarioCommand(QUndoCommand):
def redo(self): def redo(self):
if self._new is None: if self._new is None:
self._new = self._study.create_ensemble_scenario() self._new = self._study.create_ensemble_scenario(self._pos)
else: else:
self._new.set_as_not_deleted() self._new.set_as_not_deleted()
self._study.reload_from_scenario(self._new) self._study.reload_from_scenario(self._new)
+1 -1
View File
@@ -44,7 +44,7 @@ class ScenariosTranslate(MainTranslate):
"Scenarios", "Duplicate this scenario" "Scenarios", "Duplicate this scenario"
) )
self._dict["menu_ens_scenario"] = _translate( self._dict["menu_ens_scenario"] = _translate(
"Scenarios", "Create ensemble scenario from this scenario" "Scenarios", "Create ensemble scenario from current scenario"
) )
self._dict["menu_edit_ens_scenario"] = _translate( self._dict["menu_edit_ens_scenario"] = _translate(
"Scenarios", "Edit this ensemble scenario" "Scenarios", "Edit this ensemble scenario"