diff --git a/src/Solver/ASolver.py b/src/Solver/ASolver.py index c4fa286ae9c1bd8ddd938d145b52ad51caef78f1..5ff5f6dcee3e36ecb892b56a7eb89ef6836ff2e2 100644 --- a/src/Solver/ASolver.py +++ b/src/Solver/ASolver.py @@ -121,6 +121,9 @@ class AbstractSolver(object): def is_stoped(self): return self._status == STATUS.STOPED + def has_results_loaded(self): + self._status = STATUS.NOT_LAUNCHED + @name.setter def name(self, name): self._name = name diff --git a/src/View/RunSolver/Window.py b/src/View/RunSolver/Window.py index 96ada16e0053d08a4bc0cd72621dc3f7c3432504..3cf453c20656e0004f382a89dac3e1d765d1dd87 100644 --- a/src/View/RunSolver/Window.py +++ b/src/View/RunSolver/Window.py @@ -124,40 +124,11 @@ class SolverLogWindow(PamhyrWindow): self.setup_action() self.setup_alarm() self.setup_connections() + self.setup_workdir() + self.setup_process() - self._workdir = "" - if self._study.filename == "": - self._workdir = tempfile.TemporaryDirectory() - else: - self._workdir = os.path.join( - os.path.dirname(self._study.filename), - "_PAMHYR_", - self._study.name.replace(" ", "_"), - self._solver.name.replace(" ", "_"), - ) - os.makedirs(self._workdir, exist_ok=True) - - self._alarm.start(500) - self._output = Queue() - self._process = self.new_process(parent) - - self._log(f" *** Export study {self._solver.name}", color="blue") - self._solver.export(self._study, self._workdir, qlog=self._output) - - self.update() - - self._log(f" *** Run solver {self._solver.name}", color="blue") - self._solver.run( - study, - process=self._process, - output_queue=self._output - ) - - def new_process(self, parent): - new = QProcess(parent) - new.setWorkingDirectory(self._workdir) - new.setProcessChannelMode(QProcess.MergedChannels) - return new + self.export() + self.run() def setup_action(self): self.find(QAction, "action_start").setEnabled(False) @@ -182,30 +153,74 @@ class SolverLogWindow(PamhyrWindow): self._alarm.timeout.connect(self.update) + def setup_workdir(self): + self._workdir = "" + if self._study.filename == "": + self._workdir = tempfile.TemporaryDirectory() + else: + self._workdir = os.path.join( + os.path.dirname(self._study.filename), + "_PAMHYR_", + self._study.name.replace(" ", "_"), + self._solver.name.replace(" ", "_"), + ) + os.makedirs(self._workdir, exist_ok=True) + + def setup_process(self): + self._alarm.start(500) + self._output = Queue() + self._process = self.new_process(self._parent) + + def new_process(self, parent): + new = QProcess(parent) + new.setWorkingDirectory(self._workdir) + new.setProcessChannelMode(QProcess.MergedChannels) + return new + + def export(self): + self._log(f" *** Export study {self._solver.name}", color="blue") + self._solver.export(self._study, self._workdir, qlog=self._output) + self.update() + + ####### + # LOG # + ####### + def _log(self, msg, color=None): if type(msg) is str: - logger.info(f"solver: {msg}") + self._log_str(msg, color) + elif type(msg) is int: + self._log_int(msg, color) - msg = msg.rsplit('\n')[0] + def _log_str(self, msg, color=None): + logger.info(f"solver: {msg}") + msg = msg.rsplit('\n')[0] - if color is not None: - msg = f"<font color=\"{color}\">" + msg + "</font>" + if color is not None: + msg = f"<font color=\"{color}\">" + msg + "</font>" - self.find(QTextEdit, "textEdit").append(msg) - elif type(msg) is int: - logger.info(f"solver: Returns {msg}") + self.find(QTextEdit, "textEdit").append(msg) - color = "blue" if msg == 0 else "red" - self.find(QTextEdit, "textEdit")\ - .append(f"<font color=\"{color}\">" + - f" *** Finished with code {msg}" + - "</font>") + def _log_int(self, int_code, color=None): + logger.info(f"solver: Returns {int_code}") + color = "blue" if int_code == 0 else "red" - self.statusbar.showMessage( - "Done" if msg == 0 else "Failed", - 3000 + self.find(QTextEdit, "textEdit")\ + .append( + f"<font color=\"{color}\">" + + f" *** Finished with code {int_code}" + + "</font>" ) + self.statusbar.showMessage( + "Done" if int_code == 0 else "Failed", + 3000 + ) + + ########## + # UPDATE # + ########## + def update(self): if self._solver.is_stoped(): self.find(QAction, "action_start").setEnabled(True) @@ -235,6 +250,18 @@ class SolverLogWindow(PamhyrWindow): else: self._log(s) + #################### + # Process controle # + #################### + + def run(self): + self._log(f" *** Run solver {self._solver.name}", color="blue") + self._solver.run( + self._study, + process=self._process, + output_queue=self._output + ) + def start(self): if self._solver.is_stoped(): self._log(f" *** Export study {self._solver.name}", color="blue") @@ -276,6 +303,10 @@ class SolverLogWindow(PamhyrWindow): if self._solver.log_file() != "": self.find(QAction, "action_log_file").setEnabled(True) + ########### + # Results # + ########### + def results(self): if self._results is None: self._results = self._solver.results( @@ -284,6 +315,8 @@ class SolverLogWindow(PamhyrWindow): self._parent.set_results(self._solver, self._results) self._parent.open_solver_results(self._solver, self._results) + self._solver.has_results_loaded() + def log_file(self): file_name = os.path.join(self._workdir, self._solver.log_file()) log = SolverLogFileWindow(