diff --git a/doc/changelog.d/358.miscellaneous.md b/doc/changelog.d/358.miscellaneous.md new file mode 100644 index 00000000..6d6bc633 --- /dev/null +++ b/doc/changelog.d/358.miscellaneous.md @@ -0,0 +1 @@ +Fix: Avoid importing VTK on startup diff --git a/src/ansys/tools/visualization_interface/backends/pyvista/pyvista.py b/src/ansys/tools/visualization_interface/backends/pyvista/pyvista.py index 1c0cbe5d..7780e3a9 100644 --- a/src/ansys/tools/visualization_interface/backends/pyvista/pyvista.py +++ b/src/ansys/tools/visualization_interface/backends/pyvista/pyvista.py @@ -26,9 +26,6 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union import pyvista as pv -from vtkmodules.vtkCommonCore import vtkCommand -from vtkmodules.vtkInteractionWidgets import vtkHoverWidget -from vtkmodules.vtkRenderingCore import vtkPointPicker import ansys.tools.visualization_interface from ansys.tools.visualization_interface.backends._base import BaseBackend @@ -111,6 +108,9 @@ def __init__( **plotter_kwargs, ) -> None: """Initialize the ``use_trame`` parameter and save the current ``pv.OFF_SCREEN`` value.""" + from vtkmodules.vtkInteractionWidgets import vtkHoverWidget + from vtkmodules.vtkRenderingCore import vtkPointPicker + # Check if the use of trame was requested if use_trame is None: use_trame = ansys.tools.visualization_interface.USE_TRAME @@ -419,6 +419,9 @@ def enable_set_focus_center(self): def enable_hover(self): """Enable hover capabilities in the plotter.""" + from vtkmodules.vtkCommonCore import vtkCommand + from vtkmodules.vtkInteractionWidgets import vtkHoverWidget + self._hover_widget = vtkHoverWidget() self._hover_widget.SetInteractor(self._pl.scene.iren.interactor) self._hover_widget.SetTimerDuration(100) # Time (ms) required to trigger a hover event diff --git a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/button.py b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/button.py index 462861a2..9309f1ec 100644 --- a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/button.py +++ b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/button.py @@ -25,7 +25,6 @@ from pathlib import Path from pyvista import Plotter -from vtk import vtkButtonWidget, vtkPNGReader from ansys.tools.visualization_interface.backends.pyvista.widgets.widget import PlotterWidget @@ -49,6 +48,8 @@ class Button(PlotterWidget): def __init__(self, plotter: Plotter, button_config: tuple, dark_mode: bool = False) -> None: """Initialize the ``Button`` class.""" + from vtk import vtkButtonWidget + super().__init__(plotter) self._dark_mode = dark_mode self._button: vtkButtonWidget = self.plotter.add_checkbox_button_widget( @@ -70,6 +71,8 @@ def callback(self, state: bool) -> None: def update(self) -> None: """Assign the image that represents the button.""" + from vtk import vtkPNGReader + if self._dark_mode: is_inv = "_inv" else: diff --git a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/hide_buttons.py b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/hide_buttons.py index 360f9a9c..514d3e30 100644 --- a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/hide_buttons.py +++ b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/hide_buttons.py @@ -23,8 +23,6 @@ from pathlib import Path from typing import TYPE_CHECKING -from vtk import vtkActor, vtkButtonWidget, vtkPNGReader - from ansys.tools.visualization_interface.backends.pyvista.widgets.widget import PlotterWidget if TYPE_CHECKING: @@ -45,6 +43,9 @@ class HideButton(PlotterWidget): def __init__(self, plotter: "Plotter", dark_mode: bool = False) -> None: """Initialize the ``HideButton`` class.""" + from vtk import vtkActor, vtkButtonWidget + + # Call PlotterWidget ctor super().__init__(plotter._pl.scene) self._dark_mode = dark_mode @@ -77,6 +78,8 @@ def callback(self, state: bool) -> None: def update(self) -> None: """Define the hide widget button parameters.""" + from vtk import vtkPNGReader + if self._dark_mode: is_inv = "_inv" else: diff --git a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/measure.py b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/measure.py index 89b359ae..b2f40871 100644 --- a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/measure.py +++ b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/measure.py @@ -23,8 +23,6 @@ from pathlib import Path from typing import TYPE_CHECKING -from vtk import vtkActor, vtkButtonWidget, vtkPNGReader - from ansys.tools.visualization_interface.backends.pyvista.widgets.widget import PlotterWidget if TYPE_CHECKING: @@ -45,6 +43,8 @@ class MeasureWidget(PlotterWidget): def __init__(self, plotter_helper: "Plotter", dark_mode: bool = False) -> None: """Initialize the ``MeasureWidget`` class.""" + from vtk import vtkActor, vtkButtonWidget + # Call PlotterWidget ctor super().__init__(plotter_helper._pl.scene) self._dark_mode = dark_mode @@ -89,6 +89,8 @@ def callback(self, state: bool) -> None: def update(self) -> None: """Define the measurement widget button parameters.""" + from vtk import vtkPNGReader + if self._dark_mode: is_inv = "_inv" else: diff --git a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/mesh_slider.py b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/mesh_slider.py index 393a163b..ba652eaa 100644 --- a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/mesh_slider.py +++ b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/mesh_slider.py @@ -24,7 +24,6 @@ from typing import TYPE_CHECKING import pyvista as pv -from vtk import vtkActor, vtkButtonWidget, vtkPNGReader from ansys.tools.visualization_interface.backends.pyvista.widgets.widget import PlotterWidget @@ -45,6 +44,8 @@ class MeshSliderWidget(PlotterWidget): def __init__(self, plotter_helper: "Plotter", dark_mode: bool = False) -> None: """Initialize the ``MeshSliderWidget`` class.""" + from vtk import vtkActor, vtkButtonWidget + # Call PlotterWidget ctor super().__init__(plotter_helper._pl.scene) self._dark_mode = dark_mode @@ -103,6 +104,8 @@ def callback(self, state: bool) -> None: def update(self) -> None: """Define the mesh slider widget button parameters.""" + from vtk import vtkPNGReader + if self._dark_mode: is_inv = "_inv" else: diff --git a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/pick_rotation_center.py b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/pick_rotation_center.py index 44bee51d..d3909337 100644 --- a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/pick_rotation_center.py +++ b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/pick_rotation_center.py @@ -23,8 +23,6 @@ from pathlib import Path from typing import TYPE_CHECKING -from vtk import vtkActor, vtkButtonWidget, vtkPNGReader - from ansys.tools.visualization_interface.backends.pyvista.widgets.widget import PlotterWidget if TYPE_CHECKING: @@ -45,6 +43,7 @@ class PickRotCenterButton(PlotterWidget): def __init__(self, plotter_helper: "Plotter", dark_mode: bool = False) -> None: """Initialize the ``PickRotCenterWidget`` class.""" + from vtk import vtkActor, vtkButtonWidget # Call PlotterWidget ctor super().__init__(plotter_helper._pl.scene) self._dark_mode = dark_mode @@ -94,6 +93,7 @@ def callback(self, state: bool) -> None: def update(self) -> None: """Define the measurement widget button parameters.""" + from vtk import vtkPNGReader if self._dark_mode: is_inv = "_inv" else: diff --git a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/ruler.py b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/ruler.py index 81d6b47d..d05c8e1c 100644 --- a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/ruler.py +++ b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/ruler.py @@ -24,7 +24,6 @@ from pathlib import Path from pyvista import Plotter -from vtk import vtkActor, vtkButtonWidget, vtkPNGReader from ansys.tools.visualization_interface.backends.pyvista.widgets.widget import PlotterWidget @@ -43,6 +42,7 @@ class Ruler(PlotterWidget): def __init__(self, plotter: Plotter, dark_mode: bool = False) -> None: """Initialize the ``Ruler`` class.""" + from vtk import vtkActor, vtkButtonWidget # Call PlotterWidget ctor super().__init__(plotter) self._dark_mode = dark_mode @@ -85,6 +85,7 @@ def callback(self, state: bool) -> None: def update(self) -> None: """Define the configuration and representation of the ruler widget button.""" + from vtk import vtkPNGReader if self._dark_mode: is_inv = "_inv" else: diff --git a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/screenshot.py b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/screenshot.py index 830ddfbc..19b5cb92 100644 --- a/src/ansys/tools/visualization_interface/backends/pyvista/widgets/screenshot.py +++ b/src/ansys/tools/visualization_interface/backends/pyvista/widgets/screenshot.py @@ -24,7 +24,6 @@ from pathlib import Path from pyvista import Plotter -from vtk import vtkActor, vtkButtonWidget, vtkPNGReader from ansys.tools.visualization_interface.backends.pyvista.widgets.widget import PlotterWidget @@ -43,6 +42,7 @@ class ScreenshotButton(PlotterWidget): def __init__(self, plotter: Plotter, dark_mode: bool = False) -> None: """Initialize the ``ScreenshotButton`` class.""" + from vtk import vtkActor, vtkButtonWidget # Call PlotterWidget ctor super().__init__(plotter) self._dark_mode = dark_mode @@ -77,6 +77,7 @@ def callback(self, state: bool) -> None: def update(self) -> None: """Define the configuration and representation of the screenshot widget button.""" + from vtk import vtkPNGReader if self._dark_mode: is_inv = "_inv" else: