Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
    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")
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
    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