Source code for pyomo.contrib.viewer.pyomo_viewer

#  ___________________________________________________________________________
#
#  Pyomo: Python Optimization Modeling Objects
#  Copyright (c) 2008-2024
#  National Technology and Engineering Solutions of Sandia, LLC
#  Under the terms of Contract DE-NA0003525 with National Technology and
#  Engineering Solutions of Sandia, LLC, the U.S. Government retains certain
#  rights in this software.
#  ___________________________________________________________________________
#
#  This module was originally developed as part of the IDAES PSE Framework
#
#  Institute for the Design of Advanced Energy Systems Process Systems
#  Engineering Framework (IDAES PSE Framework) Copyright (c) 2018-2019, by the
#  software owners: The Regents of the University of California, through
#  Lawrence Berkeley National Laboratory,  National Technology & Engineering
#  Solutions of Sandia, LLC, Carnegie Mellon University, West Virginia
#  University Research Corporation, et al. All rights reserved.
#
#  This software is distributed under the 3-clause BSD License.
#  ___________________________________________________________________________

import os

from pyomo.common.dependencies import attempt_import, UnavailableClass
from pyomo.scripting.pyomo_parser import add_subparser
import pyomo.contrib.viewer.qt as myqt

qtconsole_app, qtconsole_available = attempt_import("qtconsole.qtconsoleapp")


[docs] class QtApp( qtconsole_app.JupyterQtConsoleApp if qtconsole_available else UnavailableClass(qtconsole_app) ): _kernel_cmd_show_ui = """try: ui.show() except NameError: try: model except NameError: model=None ui = get_mainwindow(model=model, ask_close=False) ui.setWindowTitle('Pyomo Model Viewer -- {}')""" _kernel_cmd_hide_ui = """try: ui.hide() except NameError: pass""" _kernel_cmd_import_qt_magic = r"%gui qt" _kernel_cmd_import_ui = "from pyomo.contrib.viewer.ui import get_mainwindow" _kernel_cmd_import_pyomo_env = "import pyomo.environ as pyo" def active_widget_name(self): current_widget = self.window.tab_widget.currentWidget() current_widget_index = self.window.tab_widget.indexOf(current_widget) return self.window.tab_widget.tabText(current_widget_index) def show_ui(self): kc = self.window.active_frontend.kernel_client kc.execute( self._kernel_cmd_show_ui.format(self.active_widget_name()), silent=True ) def hide_ui(self): kc = self.window.active_frontend.kernel_client kc.execute(self._kernel_cmd_hide_ui, silent=True)
[docs] def run_script(self, checked=False, filename=None): """Run a python script in the current kernel.""" if filename is None: # Show a dialog box for user to select working directory filename = myqt.QtWidgets.QFileDialog.getOpenFileName( self.window, "Run Script", os.getcwd(), "py (*.py);;text (*.txt);;all (*)", ) if filename[0]: # returns a tuple of file and filter or ("","") filename = filename[0] else: filename = None # Run script if one was selected if filename is not None: kc = self.window.active_frontend.kernel_client kc.execute("%run {}".format(filename))
def kernel_pyomo_init(self, kc): kc.execute(self._kernel_cmd_import_qt_magic, silent=True) kc.execute(self._kernel_cmd_import_ui, silent=True) kc.execute(self._kernel_cmd_import_pyomo_env, silent=False) def init_qt_elements(self): super().init_qt_elements() self.kernel_pyomo_init(self.widget.kernel_client) self.run_script_act = myqt.QAction("&Run Script...", self.window) self.show_ui_act = myqt.QAction("&Show Pyomo Model Viewer", self.window) self.hide_ui_act = myqt.QAction("&Hide Pyomo Model Viewer", self.window) self.window.file_menu.addSeparator() self.window.file_menu.addAction(self.run_script_act) self.window.view_menu.addSeparator() self.window.view_menu.addAction(self.show_ui_act) self.window.view_menu.addAction(self.hide_ui_act) self.window.view_menu.addSeparator() self.run_script_act.triggered.connect(self.run_script) self.show_ui_act.triggered.connect(self.show_ui) self.hide_ui_act.triggered.connect(self.hide_ui) def new_frontend_master(self): widget = super().new_frontend_master() self.kernel_pyomo_init(widget.kernel_client) return widget
[docs] def main(*args): if not myqt.available or not qtconsole_available: errors = list(myqt.import_errors) if not qtconsole_available: errors.append(qtconsole_app._moduleunavailable_message()) print("qt not available\n " + "\n ".join(errors)) return QtApp.launch_instance()
# Add a subparser for the model-viewer command add_subparser( "model-viewer", func=main, help="Run the Pyomo model viewer", add_help=False, description="This runs the Pyomo model viewer", )