From 1350fae215856f4180e7333db398ea795a6f41c3 Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Wed, 7 Dec 2022 12:58:54 +0530 Subject: [PATCH 1/7] Moved some post objects from viz. to core repo. --- .../post_processing_exhaust_manifold.py | 3 +- .../visualization/matplotlib/__init__.py | 3 +- .../matplotlib/matplot_objects.py | 71 +- .../matplotlib/matplot_windows_manager.py | 10 +- .../visualization/post_data_extractor.py | 6 +- src/ansys/fluent/visualization/post_helper.py | 149 ----- .../fluent/visualization/post_object_defns.py | 632 ------------------ .../visualization/post_windows_manager.py | 5 +- .../fluent/visualization/pyvista/__init__.py | 3 +- .../visualization/pyvista/pyvista_objects.py | 103 +-- .../pyvista/pyvista_windows_manager.py | 2 +- tests/test_post.py | 6 +- 12 files changed, 31 insertions(+), 962 deletions(-) delete mode 100644 src/ansys/fluent/visualization/post_helper.py delete mode 100644 src/ansys/fluent/visualization/post_object_defns.py diff --git a/examples/00-postprocessing/post_processing_exhaust_manifold.py b/examples/00-postprocessing/post_processing_exhaust_manifold.py index 616b70a2..54efae7d 100644 --- a/examples/00-postprocessing/post_processing_exhaust_manifold.py +++ b/examples/00-postprocessing/post_processing_exhaust_manifold.py @@ -16,10 +16,9 @@ import ansys.fluent.core as pyfluent from ansys.fluent.core import examples +from ansys.fluent.core.post_objects.post_objects import Graphics, Plots from ansys.fluent.visualization import set_config -from ansys.fluent.visualization.matplotlib import Plots -from ansys.fluent.visualization.pyvista import Graphics set_config(blocking=True, set_view_on_display="isometric") diff --git a/src/ansys/fluent/visualization/matplotlib/__init__.py b/src/ansys/fluent/visualization/matplotlib/__init__.py index 49e3f46e..31e7ab72 100644 --- a/src/ansys/fluent/visualization/matplotlib/__init__.py +++ b/src/ansys/fluent/visualization/matplotlib/__init__.py @@ -1,6 +1,7 @@ """A package that provides interfacing Fluent with Matplotlib.""" -from ansys.fluent.visualization.matplotlib.matplot_objects import Plots # noqa: F401 +from ansys.fluent.core.post_objects.post_objects import Plots # noqa: F401 + from ansys.fluent.visualization.matplotlib.matplot_windows_manager import ( # noqa: F401 matplot_windows_manager, ) diff --git a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py index 17268b39..b768af3a 100644 --- a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py +++ b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py @@ -1,75 +1,14 @@ """Module providing visualization objects for Matplotlib.""" -import inspect -import sys from typing import Optional -from ansys.fluent.core.meta import PyLocalContainer +from ansys.fluent.core.post_objects.post_object_definitions import ( + MonitorDefn, + XYPlotDefn, +) from ansys.fluent.visualization.matplotlib.matplot_windows_manager import ( matplot_windows_manager, ) -from ansys.fluent.visualization.post_object_defns import MonitorDefn, XYPlotDefn - - -class Plots: - """Provides the Matplotlib ``Plots`` objects manager. - - This class provides access to ``Plots`` object containers for a given - session so that plots can be created. - - Parameters - ---------- - session : obj - Session object. - local_surfaces_provider : object, optional - Object providing local surfaces so that you can access surfaces - created in other modules, such as PyVista. The default is ``None``. - - Attributes - ---------- - XYPlots : dict - Container for XY plot objects. - MonitorPlots : dict - Container for monitor plot objects. - """ - - _sessions_state = {} - - def __init__(self, session, local_surfaces_provider=None): - """Instantiate Plots, container of plot objects. - - Parameters - ---------- - session : - Session object. - local_surfaces_provider : object, optional - Object providing local surfaces. - """ - session_state = Plots._sessions_state.get(session.id if session else 1) - if not session_state: - session_state = self.__dict__ - Plots._sessions_state[session.id if session else 1] = session_state - self.session = session - self._init_module(self, sys.modules[__name__]) - else: - self.__dict__ = session_state - self._local_surfaces_provider = lambda: local_surfaces_provider or getattr( - self, "Surfaces", [] - ) - - def _init_module(self, obj, mod): - from ansys.fluent.visualization.post_helper import PostAPIHelper - - for name, cls in mod.__dict__.items(): - - if cls.__class__.__name__ in ( - "PyLocalNamedObjectMetaAbstract", - ) and not inspect.isabstract(cls): - setattr( - obj, - cls.PLURAL, - PyLocalContainer(self, cls, PostAPIHelper), - ) class XYPlot(XYPlotDefn): @@ -121,7 +60,7 @@ class MonitorPlot(MonitorDefn): .. code-block:: python - from ansys.fluent.visualization.matplotlib import Plots + from ansys.fluent.core.post_objects.post_objects import Plots matplotlib_plots = Plots(session) plot1 = matplotlib_plots.Monitors["plot-1"] diff --git a/src/ansys/fluent/visualization/matplotlib/matplot_windows_manager.py b/src/ansys/fluent/visualization/matplotlib/matplot_windows_manager.py index 79813c5b..115de398 100644 --- a/src/ansys/fluent/visualization/matplotlib/matplot_windows_manager.py +++ b/src/ansys/fluent/visualization/matplotlib/matplot_windows_manager.py @@ -4,16 +4,16 @@ from typing import Dict, List, Optional, Union from ansys.fluent.core.fluent_connection import _FluentConnection +from ansys.fluent.core.post_objects.post_object_definitions import ( + MonitorDefn, + PlotDefn, + XYPlotDefn, +) from ansys.fluent.core.utils.generic import AbstractSingletonMeta, in_notebook from ansys.fluent.visualization import get_config from ansys.fluent.visualization.matplotlib.plotter_defns import Plotter, ProcessPlotter from ansys.fluent.visualization.post_data_extractor import XYPlotDataExtractor -from ansys.fluent.visualization.post_object_defns import ( - MonitorDefn, - PlotDefn, - XYPlotDefn, -) from ansys.fluent.visualization.post_windows_manager import ( PostWindow, PostWindowsManager, diff --git a/src/ansys/fluent/visualization/post_data_extractor.py b/src/ansys/fluent/visualization/post_data_extractor.py index 8af963d4..3bab28ec 100644 --- a/src/ansys/fluent/visualization/post_data_extractor.py +++ b/src/ansys/fluent/visualization/post_data_extractor.py @@ -4,14 +4,16 @@ from typing import Dict from ansys.api.fluent.v0.field_data_pb2 import DataLocation, PayloadTag +from ansys.fluent.core.post_objects.post_object_definitions import ( + GraphicsDefn, + PlotDefn, +) from ansys.fluent.core.services.field_data import ( _FieldDataConstants, merge_pathlines_data, ) import numpy as np -from ansys.fluent.visualization.post_object_defns import GraphicsDefn, PlotDefn - class FieldDataExtractor: """FieldData DataExtractor.""" diff --git a/src/ansys/fluent/visualization/post_helper.py b/src/ansys/fluent/visualization/post_helper.py deleted file mode 100644 index 0dd2e631..00000000 --- a/src/ansys/fluent/visualization/post_helper.py +++ /dev/null @@ -1,149 +0,0 @@ -import re - - -class PostAPIHelper: - """Class providing helper API for post objects.""" - - class _SurfaceAPI: - """Class providing APIs for surface operations.""" - - def __init__(self, obj): - self.obj = obj - self._surface_name_on_server = self.surface_name_in_server(obj._name) - - @staticmethod - def surface_name_in_server(local_surface_name): - return "_dummy_surface_for_pyfluent:" + local_surface_name.lower() - - def _get_api_handle(self): - return self.obj._get_top_most_parent().session.tui.surface - - def _delete_if_exist_on_server(self): - field_info = self.obj._api_helper.field_info() - surfaces_list = list(field_info.get_surfaces_info().keys()) - if self._surface_name_on_server in surfaces_list: - self.delete_surface_on_server() - - def create_surface_on_server(self): - if self.obj.definition.type() == "iso-surface": - iso_surface = self.obj.definition.iso_surface - field = iso_surface.field() - iso_value = iso_surface.iso_value() - if not field: - raise RuntimeError("Iso surface definition is incomplete.") - self._delete_if_exist_on_server() - phases = self.obj._api_helper._get_phases() - unit_quantity = self.obj._api_helper._field_unit_quantity(field) - unit_info = self.obj._api_helper._fluent_unit_info(unit_quantity) - if phases: - phases = list(filter(field.startswith, phases)) - if phases: - domain, field = ( - field[0 : len(phases[0])], - field[len(phases[0]) + 1 :], - ) - else: - domain = "mixture" - self._get_api_handle().iso_surface( - domain, - field, - self._surface_name_on_server, - (), - (), - (iso_value / unit_info[1]) - unit_info[2], - (), - ) - else: - self._get_api_handle().iso_surface( - field, - self._surface_name_on_server, - (), - (), - (iso_value / unit_info[1]) - unit_info[2], - (), - ) - elif self.obj.definition.type() == "plane-surface": - plane_surface = self.obj.definition.plane_surface - xy_plane = plane_surface.xy_plane - yz_plane = plane_surface.yz_plane - zx_plane = plane_surface.zx_plane - self._delete_if_exist_on_server() - unit_info = self.obj._api_helper._fluent_unit_info("length") - self._get_api_handle().plane_surface( - self._surface_name_on_server, - "xy-plane" if xy_plane else "yz-plane" if yz_plane else "zx-plane", - (xy_plane.z() / unit_info[1]) - unit_info[2] - if xy_plane - else (yz_plane.x() / unit_info[1]) - unit_info[2] - if yz_plane - else (zx_plane.y() / unit_info[1]) - unit_info[2], - ) - field_info = self.obj._api_helper.field_info() - surfaces_list = list(field_info.get_surfaces_info().keys()) - if self._surface_name_on_server not in surfaces_list: - raise RuntimeError("Surface creation failed.") - - def delete_surface_on_server(self): - self._get_api_handle().delete_surface(self._surface_name_on_server) - - def __init__(self, obj): - self.obj = obj - self.field_info = lambda: obj._get_top_most_parent().session.field_info - self.field_data = lambda: obj._get_top_most_parent().session.field_data - self.monitors_manager = ( - lambda: obj._get_top_most_parent().session.monitors_manager - ) - self.id = lambda: obj._get_top_most_parent().session.id - if obj.__class__.__name__ == "Surface": - self.surface_api = PostAPIHelper._SurfaceAPI(obj) - - def remote_surface_name(self, local_surface_name): - local_surfaces_provider = ( - self.obj._get_top_most_parent()._local_surfaces_provider() - ) - if local_surface_name in list(local_surfaces_provider): - return PostAPIHelper._SurfaceAPI.surface_name_in_server(local_surface_name) - else: - return local_surface_name - - # Following functions will be deprecated in future. - def get_vector_fields(self): - scheme_eval_str = "(map car (apply append (map client-inquire-cell-vector-functions (inquire-domain-for-cell-functions))))" # noqa: E501 - return self._scheme_str_to_py_list(scheme_eval_str) - - def get_field_unit(self, field): - quantity = self._field_unit_quantity(field) - if quantity == "*null*": - return "" - scheme_eval_str = f"(units/get-pretty-wb-units-from-dimension (units/inquire-dimension '{quantity}))" # noqa: E501 - return " ".join(self._scheme_str_to_py_list(scheme_eval_str)) - - def _get_phases(self): - scheme_eval_str = "(map domain-name (get-phase-domains))" - return self._scheme_str_to_py_list(scheme_eval_str) - - def _field_unit_quantity(self, field): - scheme_eval_str = f"(cdr (assq 'units (%fill-render-info '{field})))" - return self._scheme_str_to_py_list(scheme_eval_str)[0] - - def _fluent_unit_info(self, unit_quantity): - def to_float(number): - try: - return float(number) - except ValueError: - return number - - scheme_eval_str = ( - f"(units/inquire-label-scale-offset-for-quantity '{unit_quantity})" - ) - unit_info = [ - to_float(data) for data in self._scheme_str_to_py_list(scheme_eval_str) - ] - if len(unit_info) == 2: - unit_info.insert(0, "") - return unit_info - - def _scheme_str_to_py_list(self, scheme_eval_str): - session = self.obj._get_top_most_parent().session - str = session.scheme_eval.string_eval(scheme_eval_str) - return list(filter(None, re.split(r'[\s()"\']', str))) diff --git a/src/ansys/fluent/visualization/post_object_defns.py b/src/ansys/fluent/visualization/post_object_defns.py deleted file mode 100644 index 07fa46a5..00000000 --- a/src/ansys/fluent/visualization/post_object_defns.py +++ /dev/null @@ -1,632 +0,0 @@ -"""Module providing visualization objects definition.""" -from abc import abstractmethod -from typing import List, NamedTuple, Optional -import warnings - -from ansys.fluent.core.meta import ( - Attribute, - PyLocalNamedObjectMetaAbstract, - PyLocalObjectMeta, - PyLocalPropertyMeta, -) - - -class BasePostObjectDefn: - """Base class for visualization objects.""" - - def _pre_display(self): - local_surfaces_provider = self._get_top_most_parent()._local_surfaces_provider() - for surf_name in self.surfaces_list(): - if surf_name in list(local_surfaces_provider): - surf_obj = local_surfaces_provider[surf_name] - surf_api = surf_obj._api_helper.surface_api - surf_api.create_surface_on_server() - - def _post_display(self): - local_surfaces_provider = self._get_top_most_parent()._local_surfaces_provider() - for surf_name in self.surfaces_list(): - if surf_name in list(local_surfaces_provider): - surf_obj = local_surfaces_provider[surf_name] - surf_api = surf_obj._api_helper.surface_api - surf_api.delete_surface_on_server() - - -class GraphicsDefn(BasePostObjectDefn, metaclass=PyLocalNamedObjectMetaAbstract): - """Abstract base class for graphics objects.""" - - @abstractmethod - def display(self, plotter_id: Optional[str] = None): - """Display graphics. - - Parameters - ---------- - window_id : str, optional - Window id. If not specified unique id is used. - """ - pass - - -class PlotDefn(BasePostObjectDefn, metaclass=PyLocalNamedObjectMetaAbstract): - """Abstract base class for plot objects.""" - - @abstractmethod - def plot(self, plotter_id: Optional[str] = None): - """Draw plot. - - Parameters - ---------- - window_id : str, optional - Window id. If not specified unique id is used. - """ - pass - - -class Vector(NamedTuple): - """Class for vector definition.""" - - x: float - y: float - z: float - - -class MonitorDefn(PlotDefn): - """Monitor Definition.""" - - PLURAL = "Monitors" - - class monitor_set_name(metaclass=PyLocalPropertyMeta): - """Monitor set name.""" - - value: str - - @Attribute - def allowed_values(self): - """Monitor set allowed values.""" - return self._api_helper.monitors_manager().get_monitor_set_names() - - -class XYPlotDefn(PlotDefn): - """XYPlot Definition.""" - - PLURAL = "XYPlots" - - class node_values(metaclass=PyLocalPropertyMeta): - """Plot nodal values.""" - - value: bool = True - - class boundary_values(metaclass=PyLocalPropertyMeta): - """Plot Boundary values.""" - - value: bool = True - - class direction_vector(metaclass=PyLocalPropertyMeta): - """Direction Vector.""" - - value: Vector = [1, 0, 0] - - class y_axis_function(metaclass=PyLocalPropertyMeta): - """Y Axis Function.""" - - value: str - - @Attribute - def allowed_values(self): - """Y axis function allowed values.""" - return list(self._api_helper.field_info().get_fields_info()) - - class x_axis_function(metaclass=PyLocalPropertyMeta): - """X Axis Function.""" - - value: str = "direction-vector" - - @Attribute - def allowed_values(self): - """X axis function allowed values.""" - return ["direction-vector"] - - class surfaces_list(metaclass=PyLocalPropertyMeta): - """List of surfaces for plotting.""" - - value: List[str] - - @Attribute - def allowed_values(self): - """Surface list allowed values.""" - return list( - self._api_helper.field_info().get_surfaces_info().keys() - ) + list(self._get_top_most_parent()._local_surfaces_provider()) - - -class MeshDefn(GraphicsDefn): - """Mesh graphics definition.""" - - PLURAL = "Meshes" - - class surfaces_list(metaclass=PyLocalPropertyMeta): - """List of surfaces for mesh graphics.""" - - value: List[str] - - @Attribute - def allowed_values(self): - """Surface list allowed values.""" - return list( - (self._api_helper.field_info().get_surfaces_info().keys()) - ) + list(self._get_top_most_parent()._local_surfaces_provider()) - - class show_edges(metaclass=PyLocalPropertyMeta): - """Show edges for mesh.""" - - value: bool = False - - -class PathlinesDefn(GraphicsDefn): - """Pathlines definition.""" - - PLURAL = "Pathlines" - - class field(metaclass=PyLocalPropertyMeta): - """Pathlines field.""" - - value: str - - @Attribute - def allowed_values(self): - """Field allowed values.""" - return list(self._api_helper.field_info().get_fields_info()) - - class surfaces_list(metaclass=PyLocalPropertyMeta): - """List of surfaces for pathlines.""" - - value: List[str] - - @Attribute - def allowed_values(self): - """Surface list allowed values.""" - return list( - (self._api_helper.field_info().get_surfaces_info().keys()) - ) + list(self._get_top_most_parent()._local_surfaces_provider()) - - -class SurfaceDefn(GraphicsDefn): - """Surface graphics definition.""" - - PLURAL = "Surfaces" - - class show_edges(metaclass=PyLocalPropertyMeta): - """Show edges for surface.""" - - value: bool = True - - class definition(metaclass=PyLocalObjectMeta): - """Specify surface definition type.""" - - def _availability(self, name): - if name == "plane_surface": - return self.type() == "plane-surface" - if name == "iso_surface": - return self.type() == "iso-surface" - return True - - class type(metaclass=PyLocalPropertyMeta): - """Surface type.""" - - value: str = "iso-surface" - - @Attribute - def allowed_values(self): - """Surface type allowed values.""" - return ["plane-surface", "iso-surface"] - - class plane_surface(metaclass=PyLocalObjectMeta): - """Plane surface definition.""" - - def _availability(self, name): - if name == "xy_plane": - return self.creation_method() == "xy-plane" - if name == "yz_plane": - return self.creation_method() == "yz-plane" - if name == "zx_plane": - return self.creation_method() == "zx-plane" - return True - - class creation_method(metaclass=PyLocalPropertyMeta): - """Creation Method.""" - - value: str = "xy-plane" - - @Attribute - def allowed_values(self): - """Surface type allowed values.""" - return ["xy-plane", "yz-plane", "zx-plane"] - - class xy_plane(metaclass=PyLocalObjectMeta): - """XY Plane definition.""" - - class z(metaclass=PyLocalPropertyMeta): - """Z value.""" - - value: float = 0 - - @Attribute - def range(self): - """Z value range.""" - return self._api_helper.field_info().get_range( - "z-coordinate", True - ) - - class yz_plane(metaclass=PyLocalObjectMeta): - """YZ Plane definition.""" - - class x(metaclass=PyLocalPropertyMeta): - """X value.""" - - value: float = 0 - - @Attribute - def range(self): - """X value range.""" - return self._api_helper.field_info().get_range( - "x-coordinate", True - ) - - class zx_plane(metaclass=PyLocalObjectMeta): - """ZX Plane definition.""" - - class y(metaclass=PyLocalPropertyMeta): - """Y value.""" - - value: float = 0 - - @Attribute - def range(self): - """Y value range.""" - return self._api_helper.field_info().get_range( - "y-coordinate", True - ) - - class iso_surface(metaclass=PyLocalObjectMeta): - """Iso surface definition.""" - - class field(metaclass=PyLocalPropertyMeta): - """Iso surface field.""" - - value: str - - @Attribute - def allowed_values(self): - """Field allowed values.""" - return list(self._api_helper.field_info().get_fields_info()) - - class rendering(metaclass=PyLocalPropertyMeta): - """Iso surface rendering.""" - - value: str = "mesh" - - @Attribute - def allowed_values(self): - """Surface rendering allowed values.""" - return ["mesh", "contour"] - - class iso_value(metaclass=PyLocalPropertyMeta): - """Iso value for field.""" - - _value: float - - def _reset_on_change(self): - return [self._parent.field] - - @property - def value(self): - """Iso value property setter.""" - if getattr(self, "_value", None) is None: - range = self.range - self._value = (range[0] + range[1]) / 2.0 if range else None - return self._value - - @value.setter - def value(self, value): - self._value = value - - @Attribute - def range(self): - """Iso value range.""" - field = self._parent.field() - if field: - return self._api_helper.field_info().get_range(field, True) - - -class ContourDefn(GraphicsDefn): - """Contour graphics definition.""" - - PLURAL = "Contours" - - class field(metaclass=PyLocalPropertyMeta): - """Contour field.""" - - value: str - - @Attribute - def allowed_values(self): - """Field allowed values.""" - return list(self._api_helper.field_info().get_fields_info()) - - class surfaces_list(metaclass=PyLocalPropertyMeta): - """Contour surfaces.""" - - value: List[str] - - @Attribute - def allowed_values(self): - """Surfaces list allowed values.""" - return list( - self._api_helper.field_info().get_surfaces_info().keys() - ) + list(self._get_top_most_parent()._local_surfaces_provider()) - - class filled(metaclass=PyLocalPropertyMeta): - """Draw filled contour.""" - - value: bool = True - - class node_values(metaclass=PyLocalPropertyMeta): - """Draw nodal data.""" - - _value: bool = True - - @property - def value(self): - """Node value property setter.""" - filled = self._get_parent_by_type(ContourDefn).filled() - auto_range_off = self._get_parent_by_type(ContourDefn).range.auto_range_off - if not filled or (auto_range_off and auto_range_off.clip_to_range()): - warnings.warn( - "For unfilled and clipped contours node values are diaplyed." - ) - self._value = True - return self._value - - @value.setter - def value(self, value): - self._value = value - - class boundary_values(metaclass=PyLocalPropertyMeta): - """Draw boundary values.""" - - value: bool = False - - class contour_lines(metaclass=PyLocalPropertyMeta): - """Draw contour lines.""" - - value: bool = False - - class show_edges(metaclass=PyLocalPropertyMeta): - """Show edges.""" - - value: bool = False - - class range(metaclass=PyLocalObjectMeta): - """Range definition.""" - - def _availability(self, name): - if name == "auto_range_on": - return self.option() == "auto-range-on" - if name == "auto_range_off": - return self.option() == "auto-range-off" - return True - - class option(metaclass=PyLocalPropertyMeta): - """Range option.""" - - value: str = "auto-range-on" - - @Attribute - def allowed_values(self): - """Range option allowed values.""" - return ["auto-range-on", "auto-range-off"] - - class auto_range_on(metaclass=PyLocalObjectMeta): - """Auto range on definition.""" - - class global_range(metaclass=PyLocalPropertyMeta): - """Show global range.""" - - value: bool = False - - class auto_range_off(metaclass=PyLocalObjectMeta): - """Auto range off definition.""" - - class clip_to_range(metaclass=PyLocalPropertyMeta): - """Clip contour within range.""" - - value: bool = False - - class minimum(metaclass=PyLocalPropertyMeta): - """Range minimum.""" - - _value: float - - def _reset_on_change(self): - return [ - self._get_parent_by_type(ContourDefn).field, - self._get_parent_by_type(ContourDefn).node_values, - ] - - @property - def value(self): - """Range minimum property setter.""" - if getattr(self, "_value", None) is None: - field = self._get_parent_by_type(ContourDefn).field() - if field: - field_info = self._api_helper.field_info() - field_range = field_info.get_range( - field, - self._get_parent_by_type(ContourDefn).node_values(), - ) - self._value = field_range[0] - return self._value - - @value.setter - def value(self, value): - self._value = value - - class maximum(metaclass=PyLocalPropertyMeta): - """Range maximum.""" - - _value: float - - def _reset_on_change(self): - return [ - self._get_parent_by_type(ContourDefn).field, - self._get_parent_by_type(ContourDefn).node_values, - ] - - @property - def value(self): - """Range maximum property setter.""" - if getattr(self, "_value", None) is None: - field = self._get_parent_by_type(ContourDefn).field() - if field: - field_info = self._api_helper.field_info() - field_range = field_info.get_range( - field, - self._get_parent_by_type(ContourDefn).node_values(), - ) - self._value = field_range[1] - - return self._value - - @value.setter - def value(self, value): - self._value = value - - -class VectorDefn(GraphicsDefn): - """Vector graphics definition.""" - - PLURAL = "Vectors" - - class vectors_of(metaclass=PyLocalPropertyMeta): - """Vector type.""" - - value: str = "velocity" - - @Attribute - def allowed_values(self): - """Vectors of allowed values.""" - return list(self._api_helper.get_vector_fields()) - - class field(metaclass=PyLocalPropertyMeta): - """Vector color field.""" - - value: str - - @Attribute - def allowed_values(self): - """Field allowed values.""" - return list(self._api_helper.field_info().get_fields_info()) - - class surfaces_list(metaclass=PyLocalPropertyMeta): - """List of surfaces for vector graphics.""" - - value: List[str] - - @Attribute - def allowed_values(self): - """Surface list allowed values.""" - return list( - self._api_helper.field_info().get_surfaces_info().keys() - ) + list(self._get_top_most_parent()._local_surfaces_provider()) - - class scale(metaclass=PyLocalPropertyMeta): - """Vector scale.""" - - value: float = 1.0 - - class skip(metaclass=PyLocalPropertyMeta): - """Vector skip.""" - - value: int = 0 - - class show_edges(metaclass=PyLocalPropertyMeta): - """Show edges.""" - - value: bool = False - - class range(metaclass=PyLocalObjectMeta): - """Range definition.""" - - def _availability(self, name): - if name == "auto_range_on": - return self.option() == "auto-range-on" - if name == "auto_range_off": - return self.option() == "auto-range-off" - return True - - class option(metaclass=PyLocalPropertyMeta): - """Range option.""" - - value: str = "auto-range-on" - - @Attribute - def allowed_values(self): - """Range option allowed values.""" - return ["auto-range-on", "auto-range-off"] - - class auto_range_on(metaclass=PyLocalObjectMeta): - """Auto range on definition.""" - - class global_range(metaclass=PyLocalPropertyMeta): - """Show global range.""" - - value: bool = False - - class auto_range_off(metaclass=PyLocalObjectMeta): - """Auto range off definition.""" - - class clip_to_range(metaclass=PyLocalPropertyMeta): - """Clip vector within range.""" - - value: bool = False - - class minimum(metaclass=PyLocalPropertyMeta): - """Range minimum.""" - - _value: float - - @property - def value(self): - """Range minimum property setter.""" - if getattr(self, "_value", None) is None: - field_info = self._api_helper.field_info() - field_range = field_info.get_range( - "velocity-magnitude", - False, - ) - self._value = field_range[0] - return self._value - - @value.setter - def value(self, value): - self._value = value - - class maximum(metaclass=PyLocalPropertyMeta): - """Range maximum.""" - - _value: float - - @property - def value(self): - """Range maximum property setter.""" - if getattr(self, "_value", None) is None: - field_info = self._api_helper.field_info() - field_range = field_info.get_range( - "velocity-magnitude", - False, - ) - self._value = field_range[1] - return self._value - - @value.setter - def value(self, value): - self._value = value diff --git a/src/ansys/fluent/visualization/post_windows_manager.py b/src/ansys/fluent/visualization/post_windows_manager.py index b361bb0a..f7d39f1e 100644 --- a/src/ansys/fluent/visualization/post_windows_manager.py +++ b/src/ansys/fluent/visualization/post_windows_manager.py @@ -5,7 +5,10 @@ from abc import ABCMeta, abstractmethod from typing import List, Optional, Union -from ansys.fluent.visualization.post_object_defns import GraphicsDefn, PlotDefn +from ansys.fluent.core.post_objects.post_object_definitions import ( + GraphicsDefn, + PlotDefn, +) class PostWindow: diff --git a/src/ansys/fluent/visualization/pyvista/__init__.py b/src/ansys/fluent/visualization/pyvista/__init__.py index 25d907dd..b9f9060c 100644 --- a/src/ansys/fluent/visualization/pyvista/__init__.py +++ b/src/ansys/fluent/visualization/pyvista/__init__.py @@ -1,6 +1,7 @@ """A package that provides interfacing Fluent with PyVista.""" -from ansys.fluent.visualization.pyvista.pyvista_objects import Graphics # noqa: F401 +from ansys.fluent.core.post_objects.post_objects import Graphics # noqa: F401 + from ansys.fluent.visualization.pyvista.pyvista_windows_manager import ( # noqa: F401 pyvista_windows_manager, ) diff --git a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py index 905ed228..b0311573 100644 --- a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py +++ b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py @@ -1,113 +1,20 @@ """Module providing visualization objects for PyVista.""" -import inspect -import sys from typing import Optional -from ansys.fluent.core.meta import PyLocalContainer - -from ansys.fluent.visualization.post_object_defns import ( +from ansys.fluent.core.post_objects.post_object_definitions import ( ContourDefn, MeshDefn, PathlinesDefn, SurfaceDefn, VectorDefn, ) + from ansys.fluent.visualization.pyvista.pyvista_windows_manager import ( pyvista_windows_manager, ) -class Graphics: - """Provides the PyVista ``Graphics`` objects manager. - - This class provides access to ``Graphics`` object containers for a given - session so that graphics objects can be created. - - Parameters - ---------- - session : obj - Session object. - local_surfaces_provider : object, optional - Object providing local surfaces so that you can access surfaces - created in other modules, such as PyVista. The default is ``None``. - - Attributes - ---------- - Meshes : dict - Container for mesh objects. - Surfaces : dict - Container for surface objects. - Contours : dict - Container for contour objects. - Vectors : dict - Container for vector objects. - """ - - _sessions_state = {} - - def __init__(self, session, local_surfaces_provider=None): - """Instantiate the ``Graphics`` object container. - - Parameters - ---------- - session : obj - Session object. - local_surfaces_provider : object, optional - Object providing local surfaces so that you can access surfaces - created in other modules, such as PyVista. The default is ``None``. - """ - session_state = Graphics._sessions_state.get(session.id if session else 1) - if not session_state: - session_state = self.__dict__ - Graphics._sessions_state[session.id if session else 1] = session_state - self.session = session - self._init_module(self, sys.modules[__name__]) - else: - self.__dict__ = session_state - self._local_surfaces_provider = lambda: local_surfaces_provider or getattr( - self, "Surfaces", [] - ) - - def _init_module(self, obj, mod): - from ansys.fluent.visualization.post_helper import PostAPIHelper - - for name, cls in mod.__dict__.items(): - - if cls.__class__.__name__ in ( - "PyLocalNamedObjectMetaAbstract", - ) and not inspect.isabstract(cls): - setattr( - obj, - cls.PLURAL, - PyLocalContainer(self, cls, PostAPIHelper), - ) - - def add_outline_mesh(self): - """Add a mesh outline. - - Parameters - ---------- - None - - Returns - ------- - None - """ - meshes = getattr(self, "Meshes", None) - if meshes is not None: - outline_mesh_id = "Mesh-outline" - outline_mesh = meshes[outline_mesh_id] - outline_mesh.surfaces_list = [ - k - for k, v in outline_mesh._api_helper.field_info() - .get_surfaces_info() - .items() - if v["type"] == "zone-surf" and v["zone_type"] != "interior" - ] - return outline_mesh - - class Mesh(MeshDefn): """Provides for displaying mesh graphics. @@ -122,7 +29,7 @@ class Mesh(MeshDefn): .. code-block:: python - from ansys.fluent.visualization.pyvista import Graphics + from ansys.fluent.core.post_objects.post_objects import Graphics graphics_session = Graphics(session) mesh1 = graphics_session.Meshes["mesh-1"] @@ -220,7 +127,7 @@ class Contour(ContourDefn): .. code-block:: python - from ansys.fluent.visualization.pyvista import Graphics + from ansys.fluent.core.post_objects.post_objects import Graphics graphics_session = Graphics(session) contour1 = graphics_session.Contours["contour-1"] @@ -255,7 +162,7 @@ class Vector(VectorDefn): .. code-block:: python - from ansys.fluent.visualization.pyvista import Graphics + from ansys.fluent.core.post_objects.post_objects import Graphics graphics_session = Graphics(session) vector1 = graphics_session.Vectors["vector-1"] diff --git a/src/ansys/fluent/visualization/pyvista/pyvista_windows_manager.py b/src/ansys/fluent/visualization/pyvista/pyvista_windows_manager.py index a47735e4..1278323e 100644 --- a/src/ansys/fluent/visualization/pyvista/pyvista_windows_manager.py +++ b/src/ansys/fluent/visualization/pyvista/pyvista_windows_manager.py @@ -4,6 +4,7 @@ from typing import List, Optional, Union from ansys.fluent.core.fluent_connection import _FluentConnection +from ansys.fluent.core.post_objects.post_object_definitions import GraphicsDefn from ansys.fluent.core.utils.generic import AbstractSingletonMeta, in_notebook import numpy as np import pyvista as pv @@ -11,7 +12,6 @@ from ansys.fluent.visualization import get_config from ansys.fluent.visualization.post_data_extractor import FieldDataExtractor -from ansys.fluent.visualization.post_object_defns import GraphicsDefn from ansys.fluent.visualization.post_windows_manager import ( PostWindow, PostWindowsManager, diff --git a/tests/test_post.py b/tests/test_post.py index af9e5832..6bb902fd 100644 --- a/tests/test_post.py +++ b/tests/test_post.py @@ -2,18 +2,16 @@ import pickle from typing import Dict, List, Optional, Union +from ansys.fluent.core.post_objects.post_objects import Graphics, Plots from ansys.fluent.core.services.field_data import SurfaceDataType import numpy as np import pytest -from ansys.fluent.visualization.matplotlib import Plots -from ansys.fluent.visualization.pyvista import Graphics - @pytest.fixture(autouse=True) def patch_mock_api_helper(mocker) -> None: mocker.patch( - "ansys.fluent.visualization.post_helper.PostAPIHelper", + "ansys.fluent.core.post_objects.post_helper.PostAPIHelper", MockAPIHelper, ) From a9070c2d43af64fb283d2749b0dc0e05dc77141e Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Wed, 7 Dec 2022 13:43:43 +0530 Subject: [PATCH 2/7] Fix import issues. --- src/ansys/fluent/visualization/matplotlib/__init__.py | 3 +-- .../fluent/visualization/matplotlib/matplot_objects.py | 7 +++++++ src/ansys/fluent/visualization/pyvista/__init__.py | 3 +-- src/ansys/fluent/visualization/pyvista/pyvista_objects.py | 7 +++++++ 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/ansys/fluent/visualization/matplotlib/__init__.py b/src/ansys/fluent/visualization/matplotlib/__init__.py index 31e7ab72..49e3f46e 100644 --- a/src/ansys/fluent/visualization/matplotlib/__init__.py +++ b/src/ansys/fluent/visualization/matplotlib/__init__.py @@ -1,7 +1,6 @@ """A package that provides interfacing Fluent with Matplotlib.""" -from ansys.fluent.core.post_objects.post_objects import Plots # noqa: F401 - +from ansys.fluent.visualization.matplotlib.matplot_objects import Plots # noqa: F401 from ansys.fluent.visualization.matplotlib.matplot_windows_manager import ( # noqa: F401 matplot_windows_manager, ) diff --git a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py index b768af3a..81ea07d8 100644 --- a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py +++ b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py @@ -1,16 +1,23 @@ """Module providing visualization objects for Matplotlib.""" +import sys from typing import Optional from ansys.fluent.core.post_objects.post_object_definitions import ( MonitorDefn, XYPlotDefn, ) +from ansys.fluent.core.post_objects.post_objects import Plots as PlotsBase from ansys.fluent.visualization.matplotlib.matplot_windows_manager import ( matplot_windows_manager, ) +class Plots(PlotsBase): + def __init__(self, session, local_surfaces_provider=None): + super().__init__(session, sys.modules[__name__], local_surfaces_provider) + + class XYPlot(XYPlotDefn): """Provides for displaying XY plots. diff --git a/src/ansys/fluent/visualization/pyvista/__init__.py b/src/ansys/fluent/visualization/pyvista/__init__.py index b9f9060c..25d907dd 100644 --- a/src/ansys/fluent/visualization/pyvista/__init__.py +++ b/src/ansys/fluent/visualization/pyvista/__init__.py @@ -1,7 +1,6 @@ """A package that provides interfacing Fluent with PyVista.""" -from ansys.fluent.core.post_objects.post_objects import Graphics # noqa: F401 - +from ansys.fluent.visualization.pyvista.pyvista_objects import Graphics # noqa: F401 from ansys.fluent.visualization.pyvista.pyvista_windows_manager import ( # noqa: F401 pyvista_windows_manager, ) diff --git a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py index b0311573..2fb4c4b8 100644 --- a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py +++ b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py @@ -1,5 +1,6 @@ """Module providing visualization objects for PyVista.""" +import sys from typing import Optional from ansys.fluent.core.post_objects.post_object_definitions import ( @@ -9,12 +10,18 @@ SurfaceDefn, VectorDefn, ) +from ansys.fluent.core.post_objects.post_objects import Graphics as GraphicsBase from ansys.fluent.visualization.pyvista.pyvista_windows_manager import ( pyvista_windows_manager, ) +class Graphics(GraphicsBase): + def __init__(self, session, local_surfaces_provider=None): + super().__init__(session, sys.modules[__name__], local_surfaces_provider) + + class Mesh(MeshDefn): """Provides for displaying mesh graphics. From 3466e8074362f6c4b94010f563df5d95e8ec5bed Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Wed, 7 Dec 2022 13:50:16 +0530 Subject: [PATCH 3/7] Sorted imports --- .../00-postprocessing/post_processing_exhaust_manifold.py | 3 ++- src/ansys/fluent/visualization/pyvista/pyvista_objects.py | 6 +++--- tests/test_post.py | 6 ++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/examples/00-postprocessing/post_processing_exhaust_manifold.py b/examples/00-postprocessing/post_processing_exhaust_manifold.py index 54efae7d..616b70a2 100644 --- a/examples/00-postprocessing/post_processing_exhaust_manifold.py +++ b/examples/00-postprocessing/post_processing_exhaust_manifold.py @@ -16,9 +16,10 @@ import ansys.fluent.core as pyfluent from ansys.fluent.core import examples -from ansys.fluent.core.post_objects.post_objects import Graphics, Plots from ansys.fluent.visualization import set_config +from ansys.fluent.visualization.matplotlib import Plots +from ansys.fluent.visualization.pyvista import Graphics set_config(blocking=True, set_view_on_display="isometric") diff --git a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py index 2fb4c4b8..491d1eda 100644 --- a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py +++ b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py @@ -36,7 +36,7 @@ class Mesh(MeshDefn): .. code-block:: python - from ansys.fluent.core.post_objects.post_objects import Graphics + from ansys.fluent.visualization.pyvista import Graphics graphics_session = Graphics(session) mesh1 = graphics_session.Meshes["mesh-1"] @@ -134,7 +134,7 @@ class Contour(ContourDefn): .. code-block:: python - from ansys.fluent.core.post_objects.post_objects import Graphics + from ansys.fluent.visualization.pyvista import Graphics graphics_session = Graphics(session) contour1 = graphics_session.Contours["contour-1"] @@ -169,7 +169,7 @@ class Vector(VectorDefn): .. code-block:: python - from ansys.fluent.core.post_objects.post_objects import Graphics + from ansys.fluent.visualization.pyvista import Graphics graphics_session = Graphics(session) vector1 = graphics_session.Vectors["vector-1"] diff --git a/tests/test_post.py b/tests/test_post.py index 6bb902fd..af9e5832 100644 --- a/tests/test_post.py +++ b/tests/test_post.py @@ -2,16 +2,18 @@ import pickle from typing import Dict, List, Optional, Union -from ansys.fluent.core.post_objects.post_objects import Graphics, Plots from ansys.fluent.core.services.field_data import SurfaceDataType import numpy as np import pytest +from ansys.fluent.visualization.matplotlib import Plots +from ansys.fluent.visualization.pyvista import Graphics + @pytest.fixture(autouse=True) def patch_mock_api_helper(mocker) -> None: mocker.patch( - "ansys.fluent.core.post_objects.post_helper.PostAPIHelper", + "ansys.fluent.visualization.post_helper.PostAPIHelper", MockAPIHelper, ) From ab6e4579dc985de66cfd2999acaee93765c40083 Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Wed, 7 Dec 2022 17:25:11 +0530 Subject: [PATCH 4/7] Update dependencies name --- src/ansys/fluent/visualization/matplotlib/matplot_objects.py | 4 ++-- src/ansys/fluent/visualization/pyvista/pyvista_objects.py | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py index 81ea07d8..63647a7f 100644 --- a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py +++ b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py @@ -6,7 +6,7 @@ MonitorDefn, XYPlotDefn, ) -from ansys.fluent.core.post_objects.post_objects import Plots as PlotsBase +from ansys.fluent.core.post_objects.post_objects_container import Plots as PlotsBase from ansys.fluent.visualization.matplotlib.matplot_windows_manager import ( matplot_windows_manager, @@ -67,7 +67,7 @@ class MonitorPlot(MonitorDefn): .. code-block:: python - from ansys.fluent.core.post_objects.post_objects import Plots + from ansys.fluent.visualization.matplotlib import Plots matplotlib_plots = Plots(session) plot1 = matplotlib_plots.Monitors["plot-1"] diff --git a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py index 491d1eda..3041cdb9 100644 --- a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py +++ b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py @@ -10,7 +10,9 @@ SurfaceDefn, VectorDefn, ) -from ansys.fluent.core.post_objects.post_objects import Graphics as GraphicsBase +from ansys.fluent.core.post_objects.post_objects_container import ( + Graphics as GraphicsBase, +) from ansys.fluent.visualization.pyvista.pyvista_windows_manager import ( pyvista_windows_manager, From ad17df5b17bee0e2b7dc0e3d33ff1b37743b3b08 Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Thu, 8 Dec 2022 10:59:17 +0530 Subject: [PATCH 5/7] Base -> Container --- .../fluent/visualization/matplotlib/matplot_objects.py | 6 ++++-- src/ansys/fluent/visualization/pyvista/pyvista_objects.py | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py index 63647a7f..b21f5768 100644 --- a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py +++ b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py @@ -6,14 +6,16 @@ MonitorDefn, XYPlotDefn, ) -from ansys.fluent.core.post_objects.post_objects_container import Plots as PlotsBase +from ansys.fluent.core.post_objects.post_objects_container import ( + Plots as PlotsContainer, +) from ansys.fluent.visualization.matplotlib.matplot_windows_manager import ( matplot_windows_manager, ) -class Plots(PlotsBase): +class Plots(PlotsContainer): def __init__(self, session, local_surfaces_provider=None): super().__init__(session, sys.modules[__name__], local_surfaces_provider) diff --git a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py index 3041cdb9..7e4fdb3f 100644 --- a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py +++ b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py @@ -11,7 +11,7 @@ VectorDefn, ) from ansys.fluent.core.post_objects.post_objects_container import ( - Graphics as GraphicsBase, + Graphics as GraphicsContainer, ) from ansys.fluent.visualization.pyvista.pyvista_windows_manager import ( @@ -19,7 +19,7 @@ ) -class Graphics(GraphicsBase): +class Graphics(GraphicsContainer): def __init__(self, session, local_surfaces_provider=None): super().__init__(session, sys.modules[__name__], local_surfaces_provider) From e0f9e428402bae4d43a72cc8dbff863d93b2da7a Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Thu, 8 Dec 2022 11:03:59 +0530 Subject: [PATCH 6/7] Import post_helper from core --- tests/test_post.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_post.py b/tests/test_post.py index af9e5832..4a23fc82 100644 --- a/tests/test_post.py +++ b/tests/test_post.py @@ -13,7 +13,7 @@ @pytest.fixture(autouse=True) def patch_mock_api_helper(mocker) -> None: mocker.patch( - "ansys.fluent.visualization.post_helper.PostAPIHelper", + "ansys.fluent.core.post_objects.post_helper.PostAPIHelper", MockAPIHelper, ) From 7f0e93281cdb0ebedb05183d5942f67e765c6dcc Mon Sep 17 00:00:00 2001 From: Prithwish Mukherjee Date: Thu, 8 Dec 2022 11:53:50 +0530 Subject: [PATCH 7/7] Added docstrings --- src/ansys/fluent/visualization/matplotlib/matplot_objects.py | 5 +++++ src/ansys/fluent/visualization/pyvista/pyvista_objects.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py index b21f5768..cd27130e 100644 --- a/src/ansys/fluent/visualization/matplotlib/matplot_objects.py +++ b/src/ansys/fluent/visualization/matplotlib/matplot_objects.py @@ -16,6 +16,11 @@ class Plots(PlotsContainer): + """ + This class provides access to ``Plots`` object containers for a given + session so that plots can be created. + """ + def __init__(self, session, local_surfaces_provider=None): super().__init__(session, sys.modules[__name__], local_surfaces_provider) diff --git a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py index 7e4fdb3f..c7037c50 100644 --- a/src/ansys/fluent/visualization/pyvista/pyvista_objects.py +++ b/src/ansys/fluent/visualization/pyvista/pyvista_objects.py @@ -20,6 +20,11 @@ class Graphics(GraphicsContainer): + """ + This class provides access to ``Graphics`` object containers for a given + session so that graphics objects can be created. + """ + def __init__(self, session, local_surfaces_provider=None): super().__init__(session, sys.modules[__name__], local_surfaces_provider)