def __init__(self, xscale=1.0, yscale=1.0, zscale=1.0, show=True, app=None, continuous_update=False, **kwargs): if not scooby.in_ipython() or not IPY_AVAILABLE: logging.warning('Interactive plotting tools require IPython and the ``ipywidgets`` package.') BackgroundPlotter.__init__(self, show=show, app=app, **kwargs) # Now set up the IPython scaling widgets self.continuous_update = bool(continuous_update) self.xslider = widgets.FloatSlider(min=0, max=xscale*2, value=xscale, continuous_update=self.continuous_update) self.yslider = widgets.FloatSlider(min=0, max=yscale*2, value=yscale, continuous_update=self.continuous_update) self.zslider = widgets.FloatSlider(min=0, max=zscale*2, value=zscale, continuous_update=self.continuous_update) def update(xscale, yscale, zscale): """Update the scales""" # Update max range if needed if xscale >= self.xslider.max: self.xslider.max *= 2 if yscale >= self.yslider.max: self.yslider.max *= 2 if zscale >= self.zslider.max: self.zslider.max *= 2 # reset max range if needed if xscale < self.xslider.max * 0.10 and xscale > 1.0: self.xslider.max /= 2 if yscale < self.yslider.max * 0.10 and yscale > 1.0: self.yslider.max /= 2 if zscale < self.zslider.max * 0.10 and zscale > 1.0: self.zslider.max /= 2 self.set_scale(xscale, yscale, zscale) # Create/display the widgets interact(update, xscale=self.xslider, yscale=self.yslider, zscale=self.zslider, **kwargs)
def __init__(self, dataset, plotter=None, scalars=None, preference='cell', show_bounds=False, reset_camera=True, outline=None, display_params=None, default_params=None, continuous_update=False, clean=True, **kwargs): if not scooby.in_ipython() or not IPY_AVAILABLE: logging.warning('Interactive plotting tools require IPython and the ``ipywidgets`` package.') # Check the input dataset to make sure its compatible if not is_pyvista_obj(dataset): dataset = wrap(dataset) if not is_pyvista_obj(dataset): raise RuntimeError('Object not supported for plotting in pyvista.') # Make the input/output of this tool available self.input_dataset = dataset self.output_dataset = None self.continuous_update = continuous_update if plotter is None: plotter = BackgroundPlotter(**kwargs) plotter.setWindowTitle(type(self).__name__) self._plotter = plotter self._loc = plotter.index_to_loc(plotter._active_renderer_index) # This is the actor that will be removed and re-added to the plotter self._data_to_update = None self._last_scalars = None # Intialize plotting parameters self.valid_range = self.input_dataset.get_data_range(arr=scalars, preference=preference) if display_params is None: display_params = {} if default_params is None: default_params = {} display_params.setdefault('rng', self.valid_range) display_params.setdefault('scalars', scalars) display_params.setdefault('preference', preference) display_params.setdefault('show_edges', False) # Make sure to remove the reset_camera parameter if present display_params.pop('reset_camera', None) # Make a name display_params.setdefault('name', '{}({})'.format(type(self).__name__, str(hex(id(self))))) self.display_params = display_params self.clean = clean # Set the tool status self._need_to_update = True # Add some intital plotting stuff to the scene self._initialize(show_bounds, reset_camera, outline) # Run the tool self.tool(default_params=default_params, **kwargs)
def _setup_ipython(ipython: Any = None) -> Any: # ipython magic if scooby.in_ipython(): # pragma: no cover # pylint: disable=import-outside-toplevel from IPython import get_ipython ipython = get_ipython() ipython.magic("gui qt") # pylint: disable=redefined-outer-name # pylint: disable=import-outside-toplevel from IPython.external.qt_for_kernel import QtGui QtGui.QApplication.instance() return ipython
from pyvista import global_theme # pylint: disable=ungrouped-imports except ImportError: # workaround for older PyVista from pyvista import rcParams # pylint: disable=ungrouped-imports class _GlobalTheme: """Wrap global_theme too rcParams.""" def __setattr__(self, k: str, v: Any) -> None: # noqa: D105 rcParams[k] = v def __getattr__(self, k: str) -> None: # noqa: D105 return rcParams[k] if k != "__wrapped__" else None global_theme = _GlobalTheme() # pylint: disable=invalid-name if scooby.in_ipython(): # pragma: no cover # pylint: disable=unused-import from IPython.external.qt_for_kernel import QtGui else: from qtpy import QtGui # pylint: disable=ungrouped-imports LOG = logging.getLogger("pyvistaqt") LOG.setLevel(logging.CRITICAL) LOG.addHandler(logging.StreamHandler()) # for display bugs due to older intel integrated GPUs, setting # vtkmodules.qt.QVTKRWIBase = 'QGLWidget' could help. However, its use # is discouraged and does not work well on VTK9+, so let's not bother # changing it from the default 'QWidget'. # See https://github.com/pyvista/pyvista/pull/693
def __init__(self, show=True, app=None, window_size=None, off_screen=None, **kwargs): """Initialize the qt plotter.""" if not has_pyqt: raise AssertionError('Requires PyQt5') self.active = True self.counters = [] if window_size is None: window_size = rcParams['window_size'] # Remove notebook argument in case user passed it kwargs.pop('notebook', None) # ipython magic if scooby.in_ipython(): # pragma: no cover from IPython import get_ipython ipython = get_ipython() ipython.magic('gui qt') from IPython.external.qt_for_kernel import QtGui QtGui.QApplication.instance() else: ipython = None # run within python if app is None: from PyQt5.QtWidgets import QApplication app = QApplication.instance() if not app: # pragma: no cover app = QApplication(['']) self.app = app self.app_window = MainWindow() self.app_window.setWindowTitle(kwargs.get('title', rcParams['title'])) self.frame = QFrame() self.frame.setFrameStyle(QFrame.NoFrame) super(BackgroundPlotter, self).__init__(parent=self.frame, off_screen=off_screen, **kwargs) self.app_window.signal_close.connect(self._close) self.add_toolbars(self.app_window) # build main menu self.main_menu = QMenuBar(parent=self.app_window) self.app_window.setMenuBar(self.main_menu) self.app_window.signal_close.connect(self.main_menu.clear) file_menu = self.main_menu.addMenu('File') file_menu.addAction('Take Screenshot', self._qt_screenshot) file_menu.addAction('Export as VTKjs', self._qt_export_vtkjs) file_menu.addSeparator() file_menu.addAction('Exit', self.app_window.close) view_menu = self.main_menu.addMenu('View') view_menu.addAction('Toggle Eye Dome Lighting', self._toggle_edl) view_menu.addAction('Scale Axes', self.scale_axes_dialog) view_menu.addAction('Clear All', self.clear) tool_menu = self.main_menu.addMenu('Tools') tool_menu.addAction('Enable Cell Picking (through)', self.enable_cell_picking) tool_menu.addAction('Enable Cell Picking (visible)', lambda: self.enable_cell_picking(through=False)) cam_menu = view_menu.addMenu('Camera') cam_menu.addAction('Toggle Parallel Projection', self._toggle_parallel_projection) view_menu.addSeparator() # Orientation marker orien_menu = view_menu.addMenu('Orientation Marker') orien_menu.addAction('Show All', self.show_axes_all) orien_menu.addAction('Hide All', self.hide_axes_all) # Bounds axes axes_menu = view_menu.addMenu('Bounds Axes') axes_menu.addAction('Add Bounds Axes (front)', self.show_bounds) axes_menu.addAction('Add Bounds Grid (back)', self.show_grid) axes_menu.addAction('Add Bounding Box', self.add_bounding_box) axes_menu.addSeparator() axes_menu.addAction('Remove Bounding Box', self.remove_bounding_box) axes_menu.addAction('Remove Bounds', self.remove_bounds_axes) # A final separator to separate OS options view_menu.addSeparator() vlayout = QVBoxLayout() vlayout.addWidget(self.interactor) self.frame.setLayout(vlayout) self.app_window.setCentralWidget(self.frame) if off_screen is None: off_screen = pyvista.OFF_SCREEN if show and not off_screen: # pragma: no cover self.app_window.show() self.show() self._spawn_background_rendering() self.window_size = window_size self._last_update_time = time.time( ) - BackgroundPlotter.ICON_TIME_STEP / 2 self._last_window_size = self.window_size self._last_camera_pos = self.camera_position self.add_callback(self.update_app_icon) # Keypress events self.add_key_event("S", self._qt_screenshot) # shift + s
def __init__(self, show: bool = True, app: QApplication = None, window_size: Optional[Tuple[int, int]] = None, off_screen: bool = None, allow_quit_keypress: bool = True, toolbar: bool = True, menu_bar: bool = True, editor: bool = True, update_app_icon: bool = False, **kwargs: Any) -> None: # pylint: disable=too-many-branches """Initialize the qt plotter.""" LOG.debug("BackgroundPlotter init start") if not isinstance(menu_bar, bool): raise TypeError("Expected type for ``menu_bar`` is bool" " but {} was given.".format(type(menu_bar))) if not isinstance(toolbar, bool): raise TypeError("Expected type for ``toolbar`` is bool" " but {} was given.".format(type(toolbar))) self.active = True self.counters: List[Counter] = [] self.allow_quit_keypress = allow_quit_keypress if window_size is None: window_size = rcParams["window_size"] # Remove notebook argument in case user passed it kwargs.pop("notebook", None) # ipython magic if scooby.in_ipython(): # pragma: no cover # pylint: disable=import-outside-toplevel from IPython import get_ipython ipython = get_ipython() ipython.magic("gui qt") # pylint: disable=redefined-outer-name # pylint: disable=import-outside-toplevel from IPython.external.qt_for_kernel import QtGui QtGui.QApplication.instance() else: ipython = None # run within python if app is None: app = QApplication.instance() if not app: # pragma: no cover app = QApplication(["PyVista"]) self.app = app self.app_window = MainWindow() self.app_window.setWindowTitle(kwargs.get("title", rcParams["title"])) self.frame = QFrame(parent=self.app_window) self.frame.setFrameStyle(QFrame.NoFrame) self.app_window.setCentralWidget(self.frame) vlayout = QVBoxLayout() self.frame.setLayout(vlayout) super(BackgroundPlotter, self).__init__(parent=self.frame, off_screen=off_screen, **kwargs) vlayout.addWidget(self) self.app_window.grabGesture(QtCore.Qt.PinchGesture) self.app_window.signal_gesture.connect(self.gesture_event) self.app_window.signal_close.connect(self._close) self.main_menu = None self._menu_close_action = None if menu_bar: self.add_menu_bar() self.editor = None if editor and menu_bar: self.add_editor() # member variable for testing only self._view_action = None self.default_camera_tool_bar = None self.saved_camera_positions = None self.saved_cameras_tool_bar = None if toolbar: self.add_toolbars() if off_screen is None: off_screen = pyvista.OFF_SCREEN if show and not off_screen: # pragma: no cover self.app_window.show() self.show() self.window_size = window_size self._last_update_time = -np.inf self._last_window_size = self.window_size self._last_camera_pos = self.camera_position if update_app_icon: self.add_callback(self.update_app_icon) else: self.set_icon( os.path.join(os.path.dirname(__file__), "data", "pyvista_logo_square.png")) # Keypress events self.add_key_event("S", self._qt_screenshot) # shift + s LOG.debug("BackgroundPlotter init stop")
def __init__(self, show=True, app=None, shape=(1, 1), window_size=None, **kwargs): if not has_pyqt: raise AssertionError('Requires PyQt5') self.active = True self.saved_camera_positions = [] if window_size is None: window_size = rcParams['window_size'] # Remove notebook argument in case user passed it kwargs.pop('notebook', None) # ipython magic if scooby.in_ipython(): # pragma: no cover from IPython import get_ipython ipython = get_ipython() ipython.magic('gui qt') from IPython.external.qt_for_kernel import QtGui QtGui.QApplication.instance() # run within python if app is None: from PyQt5.QtWidgets import QApplication app = QApplication.instance() if not app: # pragma: no cover app = QApplication(['']) self.app = app self.app_window = QMainWindow() self.frame = QFrame() self.frame.setFrameStyle(QFrame.NoFrame) QtInteractor.__init__(self, parent=self.frame, shape=shape, **kwargs) self.signal_close.connect(self.app_window.close) # build main menu main_menu = self.app_window.menuBar() file_menu = main_menu.addMenu('File') file_menu.addAction('Take Screenshot', self._qt_screenshot) file_menu.addAction('Export as VTKjs', self._qt_export_vtkjs) file_menu.addSeparator() file_menu.addAction('Exit', self.quit) view_menu = main_menu.addMenu('View') view_menu.addAction('Toggle Eye Dome Lighting', self._toggle_edl) view_menu.addAction('Scale Axes', self.scale_axes_dialog) view_menu.addAction('Clear All', self.clear) tool_menu = main_menu.addMenu('Tools') tool_menu.addAction('Enable Cell Picking (r-key)', self.enable_cell_picking) cam_menu = view_menu.addMenu('Camera') cam_menu.addAction('Reset Camera', self.reset_camera) cam_menu.addAction('Isometric View', self.view_isometric) cam_menu.addAction('View XY Plane', self.view_xy) cam_menu.addAction('View XZ Plane', self.view_xz) cam_menu.addAction('View YZ Plane', self.view_yz) cam_menu.addSeparator() cam_menu.addAction('Save Current Camera Position', self.save_camera_position) cam_menu.addAction('Clear Saved Positions', self.clear_camera_positions) view_menu.addSeparator() # Orientation marker orien_menu = view_menu.addMenu('Orientation Marker') orien_menu.addAction('Show', self.show_axes) orien_menu.addAction('Hide', self.hide_axes) # Bounds axes axes_menu = view_menu.addMenu('Bounds Axes') axes_menu.addAction('Add Bounds Axes (front)', self.show_bounds) axes_menu.addAction('Add Bounds Grid (back)', self.show_grid) axes_menu.addAction('Add Bounding Box', self.add_bounding_box) axes_menu.addSeparator() axes_menu.addAction('Remove Bounding Box', self.remove_bounding_box) axes_menu.addAction('Remove Bounds', self.remove_bounds_axes) # A final separator to seperate OS options view_menu.addSeparator() self.saved_camera_menu = main_menu.addMenu('Camera Positions') vlayout = QVBoxLayout() vlayout.addWidget(self) self.frame.setLayout(vlayout) self.app_window.setCentralWidget(self.frame) if show: # pragma: no cover self.app_window.show() self.show() self._spawn_background_rendering() self.window_size = window_size self._last_update_time = time.time( ) - BackgroundPlotter.ICON_TIME_STEP / 2 self._last_window_size = self.window_size self._last_camera_pos = self.camera_position
def __init__(self, show=True, app=None, window_size=None, off_screen=None, allow_quit_keypress=True, toolbar=True, menu_bar=True, **kwargs): """Initialize the qt plotter.""" if not has_pyqt: raise AssertionError('Requires PyQt5') if not isinstance(menu_bar, bool): raise TypeError("Expected type for ``menu_bar`` is bool" " but {} was given.".format(type(menu_bar))) if not isinstance(toolbar, bool): raise TypeError("Expected type for ``toolbar`` is bool" " but {} was given.".format(type(toolbar))) self.active = True self.counters = [] self.allow_quit_keypress = allow_quit_keypress if window_size is None: window_size = rcParams['window_size'] # Remove notebook argument in case user passed it kwargs.pop('notebook', None) # ipython magic if scooby.in_ipython(): # pragma: no cover from IPython import get_ipython ipython = get_ipython() ipython.magic('gui qt') from IPython.external.qt_for_kernel import QtGui QtGui.QApplication.instance() else: ipython = None # run within python if app is None: from PyQt5.QtWidgets import QApplication app = QApplication.instance() if not app: # pragma: no cover app = QApplication(['']) self.app = app self.app_window = MainWindow() self.app_window.setWindowTitle(kwargs.get('title', rcParams['title'])) self.frame = QFrame() self.frame.setFrameStyle(QFrame.NoFrame) super(BackgroundPlotter, self).__init__(parent=self.frame, off_screen=off_screen, **kwargs) self.app_window.signal_close.connect(self._close) self.main_menu = None self._menu_close_action = None if menu_bar: self.add_menu_bar() self.default_camera_tool_bar = None self.saved_camera_positions = None self.saved_cameras_tool_bar = None if toolbar: self.add_toolbars() vlayout = QVBoxLayout() vlayout.addWidget(self.interactor) self.frame.setLayout(vlayout) self.app_window.setCentralWidget(self.frame) if off_screen is None: off_screen = pyvista.OFF_SCREEN if show and not off_screen: # pragma: no cover self.app_window.show() self.show() self.window_size = window_size self._last_update_time = time.time( ) - BackgroundPlotter.ICON_TIME_STEP / 2 self._last_window_size = self.window_size self._last_camera_pos = self.camera_position self.add_callback(self.update_app_icon) # Keypress events self.add_key_event("S", self._qt_screenshot) # shift + s