From 23d7d3251394a68ea674529c3cb26f6ea61e6767 Mon Sep 17 00:00:00 2001 From: afernand Date: Fri, 19 Apr 2024 12:00:41 +0200 Subject: [PATCH 1/8] fix: Trame issues --- src/ansys/geometry/core/plotting/trame_gui.py | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/src/ansys/geometry/core/plotting/trame_gui.py b/src/ansys/geometry/core/plotting/trame_gui.py index 3b89f10d30..d555cbdc3f 100644 --- a/src/ansys/geometry/core/plotting/trame_gui.py +++ b/src/ansys/geometry/core/plotting/trame_gui.py @@ -20,10 +20,12 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. """Module for using `trame `_ for visualization.""" +from ansys.geometry.core import LOG as logger + try: from pyvista.trame.ui import plotter_ui from trame.app import get_server - from trame.ui.vuetify import SinglePageLayout + from trame.ui import vuetify, vuetify3 _HAS_TRAME = True @@ -32,16 +34,28 @@ class TrameVisualizer: - """Defines the trame layout view.""" + """ + Defines the trame layout view. + + Parameters + ---------- + client_type : str, optional + Client type to use for the trame server. Options are 'vue2' and 'vue3'. + Default is 'vue3'. + """ - def __init__(self) -> None: + def __init__(self, client_type: str = "vue3") -> None: """Initialize the trame server and server-related variables.""" if not _HAS_TRAME: # pragma: no cover raise ModuleNotFoundError( "The package 'pyvista[trame]' is required to use this function." ) + self._client_type = client_type + if client_type not in ["vue2", "vue3"]: + self._client_type = "vue3" + logger.warning("Invalid client type {}. Defaulting to 'vue3'.", client_type) - self.server = get_server() + self.server = get_server(client_type=client_type) self.state, self.ctrl = self.server.state, self.server.controller def set_scene(self, plotter): @@ -54,8 +68,12 @@ def set_scene(self, plotter): PyVista plotter with the rendered mesh. """ self.state.trame__title = "PyAnsys Geometry Viewer" + if self._client_type == "vue3": + page_layout = vuetify3.SinglePageLayout(self.server) + else: + page_layout = vuetify.SinglePageLayout(self.server) - with SinglePageLayout(self.server) as layout: + with page_layout as layout: layout.icon.click = self.ctrl.view_reset_camera layout.title.set_text("PyAnsys Geometry") From 646781859ff9639d0cf16d92c5b3f7897ef09871 Mon Sep 17 00:00:00 2001 From: afernand Date: Fri, 19 Apr 2024 12:34:32 +0200 Subject: [PATCH 2/8] fix: Support plotter helper --- src/ansys/geometry/core/plotting/trame_gui.py | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/ansys/geometry/core/plotting/trame_gui.py b/src/ansys/geometry/core/plotting/trame_gui.py index d555cbdc3f..ea7b389524 100644 --- a/src/ansys/geometry/core/plotting/trame_gui.py +++ b/src/ansys/geometry/core/plotting/trame_gui.py @@ -20,7 +20,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. """Module for using `trame `_ for visualization.""" +from beartype.typing import TYPE_CHECKING, Union + from ansys.geometry.core import LOG as logger +from ansys.geometry.core.plotting.plotter import Plotter +from ansys.geometry.core.plotting.plotter_helper import PlotterHelper + +if TYPE_CHECKING: + import pyvista as pv try: from pyvista.trame.ui import plotter_ui @@ -58,15 +65,21 @@ def __init__(self, client_type: str = "vue3") -> None: self.server = get_server(client_type=client_type) self.state, self.ctrl = self.server.state, self.server.controller - def set_scene(self, plotter): + def set_scene(self, plotter: Union["pv.Plotter", Plotter, PlotterHelper]): """ Set the trame layout view and the mesh to show through the PyVista plotter. Parameters ---------- - plotter : ~pyvista.Plotter - PyVista plotter with the rendered mesh. + plotter : ~pyvista.Plotter | ~Plotter | ~PlotterHelper + PyVista plotter or PyAnsys plotter to render. """ + if isinstance(plotter, Plotter): + plotter = plotter.scene + + if isinstance(plotter, PlotterHelper): + plotter = plotter._pl.scene + self.state.trame__title = "PyAnsys Geometry Viewer" if self._client_type == "vue3": page_layout = vuetify3.SinglePageLayout(self.server) @@ -79,7 +92,7 @@ def set_scene(self, plotter): with layout.content: # Use PyVista UI template for Plotters - view = plotter_ui(plotter.scene) + view = plotter_ui(plotter) self.ctrl.view_update = view.update # hide footer with trame watermark From 265718c06b6660fa84a0115ac5576f5824e7ed0b Mon Sep 17 00:00:00 2001 From: afernand Date: Fri, 19 Apr 2024 13:33:33 +0200 Subject: [PATCH 3/8] fix: Add `add_list` to plotter_helper --- src/ansys/geometry/core/plotting/plotter_helper.py | 11 +++++++++++ src/ansys/geometry/core/plotting/trame_gui.py | 7 +++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ansys/geometry/core/plotting/plotter_helper.py b/src/ansys/geometry/core/plotting/plotter_helper.py index b14a5cfca0..9f102e7899 100644 --- a/src/ansys/geometry/core/plotting/plotter_helper.py +++ b/src/ansys/geometry/core/plotting/plotter_helper.py @@ -263,6 +263,17 @@ def add(self, object: Any, **plotting_options): """ self._pl.add(object=object, **plotting_options) + def add_list(self, object_list: List[Any], **plotting_options): + """ + Add a ``pyansys-geometry`` or ``PyVista`` object list to the plotter. + + Parameters + ---------- + object_list: Any + Object list you want to show. + """ + self._pl.add_list(plotting_list=object_list, **plotting_options) + def plot( self, object: Any = None, diff --git a/src/ansys/geometry/core/plotting/trame_gui.py b/src/ansys/geometry/core/plotting/trame_gui.py index ea7b389524..e9c44ca21e 100644 --- a/src/ansys/geometry/core/plotting/trame_gui.py +++ b/src/ansys/geometry/core/plotting/trame_gui.py @@ -24,11 +24,12 @@ from ansys.geometry.core import LOG as logger from ansys.geometry.core.plotting.plotter import Plotter -from ansys.geometry.core.plotting.plotter_helper import PlotterHelper if TYPE_CHECKING: import pyvista as pv + from ansys.geometry.core.plotting.plotter_helper import PlotterHelper + try: from pyvista.trame.ui import plotter_ui from trame.app import get_server @@ -65,7 +66,7 @@ def __init__(self, client_type: str = "vue3") -> None: self.server = get_server(client_type=client_type) self.state, self.ctrl = self.server.state, self.server.controller - def set_scene(self, plotter: Union["pv.Plotter", Plotter, PlotterHelper]): + def set_scene(self, plotter: Union["pv.Plotter", Plotter, "PlotterHelper"]): """ Set the trame layout view and the mesh to show through the PyVista plotter. @@ -77,6 +78,8 @@ def set_scene(self, plotter: Union["pv.Plotter", Plotter, PlotterHelper]): if isinstance(plotter, Plotter): plotter = plotter.scene + from ansys.geometry.core.plotting.plotter_helper import PlotterHelper + if isinstance(plotter, PlotterHelper): plotter = plotter._pl.scene From 20dcf2c7291095b836355ef653f6e9cde37c3717 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot Date: Fri, 19 Apr 2024 11:37:39 +0000 Subject: [PATCH 4/8] Adding changelog entry: 1148.fixed.md --- doc/changelog.d/1148.fixed.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/1148.fixed.md diff --git a/doc/changelog.d/1148.fixed.md b/doc/changelog.d/1148.fixed.md new file mode 100644 index 0000000000..44f856fcc4 --- /dev/null +++ b/doc/changelog.d/1148.fixed.md @@ -0,0 +1 @@ +fix: Trame issues \ No newline at end of file From 4b23eb685bbf30a09ee6ee98cf6fb03e0100834a Mon Sep 17 00:00:00 2001 From: Alex Fernandez <21alex295@gmail.com> Date: Fri, 19 Apr 2024 14:39:21 +0200 Subject: [PATCH 5/8] Update src/ansys/geometry/core/plotting/trame_gui.py Co-authored-by: Roberto Pastor Muela <37798125+RobPasMue@users.noreply.github.com> --- src/ansys/geometry/core/plotting/trame_gui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/geometry/core/plotting/trame_gui.py b/src/ansys/geometry/core/plotting/trame_gui.py index e9c44ca21e..bf32817632 100644 --- a/src/ansys/geometry/core/plotting/trame_gui.py +++ b/src/ansys/geometry/core/plotting/trame_gui.py @@ -72,7 +72,7 @@ def set_scene(self, plotter: Union["pv.Plotter", Plotter, "PlotterHelper"]): Parameters ---------- - plotter : ~pyvista.Plotter | ~Plotter | ~PlotterHelper + plotter : Union[~pyvista.Plotter, ~Plotter, ~PlotterHelper] PyVista plotter or PyAnsys plotter to render. """ if isinstance(plotter, Plotter): From 55ffbf9968583a9d59c8bffb7a5247fd3b17ed83 Mon Sep 17 00:00:00 2001 From: afernand Date: Fri, 19 Apr 2024 14:48:50 +0200 Subject: [PATCH 6/8] feat: Rework add_list --- .../geometry/core/plotting/plotter_helper.py | 52 ++++++++++++------- src/ansys/geometry/core/plotting/trame_gui.py | 8 ++- 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/ansys/geometry/core/plotting/plotter_helper.py b/src/ansys/geometry/core/plotting/plotter_helper.py index 9f102e7899..01658f2f3f 100644 --- a/src/ansys/geometry/core/plotting/plotter_helper.py +++ b/src/ansys/geometry/core/plotting/plotter_helper.py @@ -252,27 +252,38 @@ def disable_picking(self): """Disable picking capabilities in the plotter.""" self._pl.scene.disable_picking() - def add(self, object: Any, **plotting_options): + def add( + self, + object: Any, + merge_bodies: bool = False, + merge_component: bool = False, + filter: str = None, + **plotting_options, + ): """ Add a ``pyansys-geometry`` or ``PyVista`` object to the plotter. Parameters ---------- object : Any - Object you want to show. - """ - self._pl.add(object=object, **plotting_options) - - def add_list(self, object_list: List[Any], **plotting_options): - """ - Add a ``pyansys-geometry`` or ``PyVista`` object list to the plotter. - - Parameters - ---------- - object_list: Any - Object list you want to show. + Object or list of objects you want to show. + merge_bodies : bool, default: False + Whether to merge each body into a single dataset. When ``True``, + all the faces of each individual body are effectively combined + into a single dataset without separating faces. + merge_component : bool, default: False + Whether to merge this component into a single dataset. When ``True``, + all the individual bodies are effectively combined into a single + dataset without any hierarchy. + **plotting_options : dict, default: None + Keyword arguments. For allowable keyword arguments, see the + :meth:`Plotter.add_mesh ` method. """ - self._pl.add_list(plotting_list=object_list, **plotting_options) + if isinstance(object, List) and not isinstance(object[0], pv.PolyData): + logger.debug("Plotting objects in list...") + self._pl.add_list(object, merge_bodies, merge_component, filter, **plotting_options) + else: + self._pl.add(object, merge_bodies, merge_component, filter, **plotting_options) def plot( self, @@ -317,11 +328,14 @@ def plot( List[Any] List with the picked bodies in the picked order. """ - if isinstance(object, List) and not isinstance(object[0], pv.PolyData): - logger.debug("Plotting objects in list...") - self._pl.add_list(object, merge_bodies, merge_component, filter, **plotting_options) - else: - self._pl.add(object, merge_bodies, merge_component, filter, **plotting_options) + self.add( + object=object, + merge_bodies=merge_bodies, + merge_component=merge_component, + filter=filter, + **plotting_options, + ) + if self._pl.geom_object_actors_map: self._geom_object_actors_map = self._pl.geom_object_actors_map else: diff --git a/src/ansys/geometry/core/plotting/trame_gui.py b/src/ansys/geometry/core/plotting/trame_gui.py index e9c44ca21e..2142665146 100644 --- a/src/ansys/geometry/core/plotting/trame_gui.py +++ b/src/ansys/geometry/core/plotting/trame_gui.py @@ -81,7 +81,11 @@ def set_scene(self, plotter: Union["pv.Plotter", Plotter, "PlotterHelper"]): from ansys.geometry.core.plotting.plotter_helper import PlotterHelper if isinstance(plotter, PlotterHelper): - plotter = plotter._pl.scene + pv_plotter = plotter._pl.scene + elif isinstance(plotter, Plotter): + pv_plotter = plotter.scene + else: + pv_plotter = plotter self.state.trame__title = "PyAnsys Geometry Viewer" if self._client_type == "vue3": @@ -95,7 +99,7 @@ def set_scene(self, plotter: Union["pv.Plotter", Plotter, "PlotterHelper"]): with layout.content: # Use PyVista UI template for Plotters - view = plotter_ui(plotter) + view = plotter_ui(pv_plotter) self.ctrl.view_update = view.update # hide footer with trame watermark From fde0ca86d5196adbe52f8cefb0e8f4dfe2a0b5b5 Mon Sep 17 00:00:00 2001 From: afernand Date: Fri, 19 Apr 2024 15:16:40 +0200 Subject: [PATCH 7/8] fix: Add pyvista plotter checker --- src/ansys/geometry/core/plotting/trame_gui.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/ansys/geometry/core/plotting/trame_gui.py b/src/ansys/geometry/core/plotting/trame_gui.py index 76b832056f..b26374b5ec 100644 --- a/src/ansys/geometry/core/plotting/trame_gui.py +++ b/src/ansys/geometry/core/plotting/trame_gui.py @@ -21,13 +21,12 @@ # SOFTWARE. """Module for using `trame `_ for visualization.""" from beartype.typing import TYPE_CHECKING, Union +import pyvista as pv from ansys.geometry.core import LOG as logger from ansys.geometry.core.plotting.plotter import Plotter if TYPE_CHECKING: - import pyvista as pv - from ansys.geometry.core.plotting.plotter_helper import PlotterHelper try: @@ -84,8 +83,10 @@ def set_scene(self, plotter: Union["pv.Plotter", Plotter, "PlotterHelper"]): pv_plotter = plotter._pl.scene elif isinstance(plotter, Plotter): pv_plotter = plotter.scene - else: + elif isinstance(plotter, pv.Plotter): pv_plotter = plotter + else: + logger.warning("Invalid plotter type. Expected PyVista plotter or PyAnsys plotter.") self.state.trame__title = "PyAnsys Geometry Viewer" if self._client_type == "vue3": From b4cb66bc0bcbb2d3cc5fbe52d00bef3d69cd3505 Mon Sep 17 00:00:00 2001 From: afernand Date: Fri, 19 Apr 2024 15:20:44 +0200 Subject: [PATCH 8/8] fix: uneeded if --- src/ansys/geometry/core/plotting/trame_gui.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/ansys/geometry/core/plotting/trame_gui.py b/src/ansys/geometry/core/plotting/trame_gui.py index b26374b5ec..51aed2519a 100644 --- a/src/ansys/geometry/core/plotting/trame_gui.py +++ b/src/ansys/geometry/core/plotting/trame_gui.py @@ -74,9 +74,6 @@ def set_scene(self, plotter: Union["pv.Plotter", Plotter, "PlotterHelper"]): plotter : Union[~pyvista.Plotter, ~Plotter, ~PlotterHelper] PyVista plotter or PyAnsys plotter to render. """ - if isinstance(plotter, Plotter): - plotter = plotter.scene - from ansys.geometry.core.plotting.plotter_helper import PlotterHelper if isinstance(plotter, PlotterHelper):