From 3a7d8be4d21359797f3e47753fdf4d9444da844f Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 26 Nov 2024 09:16:09 +0100 Subject: [PATCH 01/19] Add examples --- .../advanced/rcs_visualization.py | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 4fa04fbd338..24d82f3bb33 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -1622,6 +1622,54 @@ def add_waterfall( self.all_scene_actors["results"]["waterfall"][waterfall_name] = rcs_mesh + @pyaedt_function_handler() + def add_isar_2d( + self, + color_bar="jet", + ): + """Add the ISAR 2D.""" + data_isar_2d = self.rcs_data.waterfall + + ranges = np.unique(data_waterfall["Range"]) + phis = np.unique(data_waterfall["IWavePhi"]) + values = data_waterfall["Data"].to_numpy() + + phis = np.deg2rad(phis) + + ra, ph = np.meshgrid(ranges, phis) + + x = -ra.T * np.cos(ph.T) + y = -ra.T * np.sin(ph.T) + z = np.zeros_like(x) + + actor = pv.StructuredGrid(x, y, z) + actor.point_data["values"] = values + + all_results_actors = list(self.all_scene_actors["results"].keys()) + + if "waterfall" not in all_results_actors: + self.all_scene_actors["results"]["waterfall"] = {} + + index = 0 + while f"waterfall_{index}" in self.all_scene_actors["results"]["waterfall"]: + index += 1 + + waterfall_name = f"waterfall_{index}" + + waterfall_object = SceneMeshObject() + waterfall_object.name = waterfall_name + + scalar_dict = dict(color="#000000", title="Waterfall") + waterfall_object.scalar_dict = scalar_dict + + waterfall_object.cmap = color_bar + + waterfall_object.mesh = actor + + rcs_mesh = MeshObjectPlot(waterfall_object, waterfall_object.get_mesh()) + + self.all_scene_actors["results"]["waterfall"][waterfall_name] = rcs_mesh + @pyaedt_function_handler() def clear_scene(self, first_level=None, second_level=None, name=None): if not first_level: From 32f6569ce87ca61dc8c7b719b430a8bfc2b2b6d0 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 26 Nov 2024 09:54:37 +0100 Subject: [PATCH 02/19] Isar 2D Pyvista plot --- .../advanced/rcs_visualization.py | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 24d82f3bb33..ffd455c9e54 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -1628,47 +1628,47 @@ def add_isar_2d( color_bar="jet", ): """Add the ISAR 2D.""" - data_isar_2d = self.rcs_data.waterfall + data_isar_2d = self.rcs_data.isar_2d - ranges = np.unique(data_waterfall["Range"]) - phis = np.unique(data_waterfall["IWavePhi"]) - values = data_waterfall["Data"].to_numpy() + down_range = data_isar_2d["Down-range"].unique() + cross_range = data_isar_2d["Cross-range"].unique() - phis = np.deg2rad(phis) - - ra, ph = np.meshgrid(ranges, phis) + values_2d = data_isar_2d.pivot(index="Cross-range", columns="Down-range", values="Data").to_numpy() - x = -ra.T * np.cos(ph.T) - y = -ra.T * np.sin(ph.T) + x, y = np.meshgrid(down_range, cross_range) z = np.zeros_like(x) - actor = pv.StructuredGrid(x, y, z) - actor.point_data["values"] = values + actor = pv.StructuredGrid() + actor.points = np.c_[x.ravel(), y.ravel(), z.ravel()] + + actor.dimensions = (len(down_range), len(cross_range), 1) + + actor["values"] = values_2d.ravel() all_results_actors = list(self.all_scene_actors["results"].keys()) - if "waterfall" not in all_results_actors: - self.all_scene_actors["results"]["waterfall"] = {} + if "isar_2d" not in all_results_actors: + self.all_scene_actors["results"]["isar_2d"] = {} index = 0 - while f"waterfall_{index}" in self.all_scene_actors["results"]["waterfall"]: + while f"isar_2d_{index}" in self.all_scene_actors["results"]["isar_2d"]: index += 1 - waterfall_name = f"waterfall_{index}" + isar_name = f"isar_2d_{index}" - waterfall_object = SceneMeshObject() - waterfall_object.name = waterfall_name + isar_object = SceneMeshObject() + isar_object.name = isar_name - scalar_dict = dict(color="#000000", title="Waterfall") - waterfall_object.scalar_dict = scalar_dict + scalar_dict = dict(color="#000000", title="ISAR 2D") + isar_object.scalar_dict = scalar_dict - waterfall_object.cmap = color_bar + isar_object.cmap = color_bar - waterfall_object.mesh = actor + isar_object.mesh = actor - rcs_mesh = MeshObjectPlot(waterfall_object, waterfall_object.get_mesh()) + rcs_mesh = MeshObjectPlot(isar_object, isar_object.get_mesh()) - self.all_scene_actors["results"]["waterfall"][waterfall_name] = rcs_mesh + self.all_scene_actors["results"]["isar_2d"][isar_name] = rcs_mesh @pyaedt_function_handler() def clear_scene(self, first_level=None, second_level=None, name=None): From 5311a4606ad3ac7d0eeb3c297b66b9efe4a1d09a Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 26 Nov 2024 09:57:08 +0100 Subject: [PATCH 03/19] Add test --- tests/system/general/test_49_RCS_data_plotter.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/system/general/test_49_RCS_data_plotter.py b/tests/system/general/test_49_RCS_data_plotter.py index 11488f30117..4d9986864f9 100644 --- a/tests/system/general/test_49_RCS_data_plotter.py +++ b/tests/system/general/test_49_RCS_data_plotter.py @@ -259,3 +259,12 @@ def test_12_rcs_plotter_add_waterfall(self): plot = rcs_plotter.plot_scene(show=False) assert isinstance(plot, Plotter) assert rcs_plotter.clear_scene() + + def test_13_rcs_plotter_add_isar_2d(self): + rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) + + rcs_plotter.add_isar_2d() + plot = rcs_plotter.plot_scene(show=False) + assert isinstance(plot, Plotter) + assert rcs_plotter.clear_scene() From 99ef8fb8322cdff941c70fe58b6e869bfa1afd14 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 26 Nov 2024 12:35:36 +0100 Subject: [PATCH 04/19] Fix plot contour --- .../core/visualization/plot/matplotlib.py | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/ansys/aedt/core/visualization/plot/matplotlib.py b/src/ansys/aedt/core/visualization/plot/matplotlib.py index 9f3c66dc57e..5da6ca588ff 100644 --- a/src/ansys/aedt/core/visualization/plot/matplotlib.py +++ b/src/ansys/aedt/core/visualization/plot/matplotlib.py @@ -1311,14 +1311,7 @@ def _plot_limit_lines(self, convert_to_radians=False): @pyaedt_function_handler() def plot_contour( - self, - trace=0, - polar=False, - levels=64, - max_theta=180, - color_bar=None, - snapshot_path=None, - show=True, + self, trace=0, polar=False, levels=64, max_theta=180, color_bar=None, snapshot_path=None, show=True, figure=None ): """Create a Matplotlib figure contour based on a list of data. @@ -1343,6 +1336,9 @@ def plot_contour( The default value is ``None``. show : bool, optional Whether to show the plot or return the matplotlib object. Default is ``True``. + figure : :class:`matplotlib.pyplot.Figure`, optional + An existing Matplotlib `Figure` to which the plot is added. + If not provided, a new `Figure` and `Axes` object are created. Returns ------- @@ -1355,7 +1351,14 @@ def plot_contour( else: tr = tr[0] projection = "polar" if polar else "rectilinear" - self.fig, self.ax = plt.subplots(subplot_kw={"projection": projection}) + + if not figure: + self.fig, self.ax = plt.subplots(subplot_kw={"projection": projection}) + self.ax = plt.gca() + else: + self.fig = figure + self.ax = figure.add_subplot(111, polar=polar) + self.ax.set_xlabel(tr.x_label) if polar: self.ax.set_rticks(np.linspace(0, max_theta, 3)) @@ -1366,7 +1369,7 @@ def plot_contour( ph = tr._spherical_data[2] th = tr._spherical_data[1] data_to_plot = tr._spherical_data[0] - plt.contourf( + contour = self.ax.contourf( ph, th, data_to_plot, @@ -1374,10 +1377,9 @@ def plot_contour( cmap="jet", ) if color_bar: - cbar = plt.colorbar() + cbar = self.fig.colorbar(contour, ax=self.ax) cbar.set_label(color_bar, rotation=270, labelpad=20) - self.ax = plt.gca() self.ax.yaxis.set_label_coords(-0.1, 0.5) self._plot(snapshot_path, show) return self.fig From bd8eb9ec20a6d614cd3afad081525cc35a1ce12c Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Tue, 26 Nov 2024 12:36:26 +0100 Subject: [PATCH 05/19] Add external figure plot_waterfall --- .../core/visualization/advanced/rcs_visualization.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index ffd455c9e54..82f6c133b62 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -904,7 +904,9 @@ def plot_range_profile( return new @pyaedt_function_handler() - def plot_waterfall(self, title="Waterfall", output_file=None, show=True, is_polar=False, size=(1920, 1440)): + def plot_waterfall( + self, title="Waterfall", output_file=None, show=True, is_polar=False, size=(1920, 1440), figure=None + ): """Create a 2D contour plot of the waterfall. Parameters @@ -964,12 +966,7 @@ def plot_waterfall(self, title="Waterfall", output_file=None, show=True, is_pola } new.add_trace(plot_data, 2, props) - _ = new.plot_contour( - trace=0, - polar=is_polar, - snapshot_path=output_file, - show=show, - ) + _ = new.plot_contour(trace=0, polar=is_polar, snapshot_path=output_file, show=show, figure=figure) return new @pyaedt_function_handler() From da16bb05d7da2dfa00ff248db338052fa44d10e9 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Wed, 27 Nov 2024 19:48:35 +0100 Subject: [PATCH 06/19] ISAR 2D --- .../visualization/advanced/rcs_visualization.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 82f6c133b62..248f342dcff 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -922,6 +922,9 @@ def plot_waterfall( Whether to display in polar coordinates. The default is ``True``. size : tuple, optional Image size in pixel (width, height). + figure : :class:`matplotlib.pyplot.Figure`, optional + An existing Matplotlib `Figure` to which the plot is added. + If not provided, a new `Figure` and `Axes` object are created. Returns ------- @@ -970,7 +973,7 @@ def plot_waterfall( return new @pyaedt_function_handler() - def plot_isar_2d(self, title="ISAR", output_file=None, show=True, size=(1920, 1440)): + def plot_isar_2d(self, title="ISAR", output_file=None, show=True, size=(1920, 1440), figure=None): """Create a 2D contour plot of the ISAR. Parameters @@ -984,6 +987,9 @@ def plot_isar_2d(self, title="ISAR", output_file=None, show=True, size=(1920, 14 If ``False``, the Matplotlib instance of the plot is shown. size : tuple, optional Image size in pixel (width, height). + figure : :class:`matplotlib.pyplot.Figure`, optional + An existing Matplotlib `Figure` to which the plot is added. + If not provided, a new `Figure` and `Axes` object are created. Returns ------- @@ -1020,12 +1026,7 @@ def plot_isar_2d(self, title="ISAR", output_file=None, show=True, size=(1920, 14 } new.add_trace(plot_data, 2, props) - _ = new.plot_contour( - trace=0, - polar=False, - snapshot_path=output_file, - show=show, - ) + _ = new.plot_contour(trace=0, polar=False, snapshot_path=output_file, show=show, figure=figure) return new @pyaedt_function_handler() From fbfc29743e5e41323a7f62e6ebdddb233f275563 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Fri, 29 Nov 2024 16:06:21 +0100 Subject: [PATCH 07/19] Add relief --- .../visualization/advanced/rcs_visualization.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 248f342dcff..1a1dc25bbec 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -1623,9 +1623,20 @@ def add_waterfall( @pyaedt_function_handler() def add_isar_2d( self, + plot_type="Plane", color_bar="jet", ): - """Add the ISAR 2D.""" + """Add the ISAR 2D. + + Parameters + ---------- + plot_type : str, optional + The type of plot to create for the range profile. It can be ``"Plane"``, ``"Relief"``, and `"Projection"``. + The default is ``"Plane"``. + color_bar : str, optional + Color mapping to be applied to the RCS data. It can be a color (``"blue"``, + ``"green"``, ...) or a colormap (``"jet"``, ``"viridis"``, ...). The default is ``"jet"``. + """ data_isar_2d = self.rcs_data.isar_2d down_range = data_isar_2d["Down-range"].unique() @@ -1636,6 +1647,9 @@ def add_isar_2d( x, y = np.meshgrid(down_range, cross_range) z = np.zeros_like(x) + if plot_type.lower() == "relief": + z = values_2d + actor = pv.StructuredGrid() actor.points = np.c_[x.ravel(), y.ravel(), z.ravel()] From 8b7fe7a372c0933193ab63ca3dc5a4460c4c8fd3 Mon Sep 17 00:00:00 2001 From: tnegishi Date: Thu, 5 Dec 2024 15:55:59 -0600 Subject: [PATCH 08/19] normalize relief z axis --- .../aedt/core/visualization/advanced/rcs_visualization.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 1a1dc25bbec..e5de7e5f10f 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -25,6 +25,7 @@ import json from pathlib import Path import sys +from pyvistaqt import BackgroundPlotter current_python_version = sys.version_info[:2] if current_python_version < (3, 10): # pragma: no cover @@ -1637,6 +1638,9 @@ def add_isar_2d( Color mapping to be applied to the RCS data. It can be a color (``"blue"``, ``"green"``, ...) or a colormap (``"jet"``, ``"viridis"``, ...). The default is ``"jet"``. """ + if not self.modeler_window: + self.modeler_window = BackgroundPlotter(show=False) + data_isar_2d = self.rcs_data.isar_2d down_range = data_isar_2d["Down-range"].unique() @@ -1648,7 +1652,9 @@ def add_isar_2d( z = np.zeros_like(x) if plot_type.lower() == "relief": - z = values_2d + m = self.modeler_window.bounds[-1]-self.modeler_window.bounds[-2] + b = self.modeler_window.bounds[-2] + z = (values_2d-values_2d.min())/(values_2d.max()-values_2d.min())*m+b actor = pv.StructuredGrid() actor.points = np.c_[x.ravel(), y.ravel(), z.ravel()] From 38f8d07aa3864e3686724554dd3b9e111d40bfbb Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Sat, 7 Dec 2024 21:45:31 +0100 Subject: [PATCH 09/19] Add projection --- .../advanced/rcs_visualization.py | 45 ++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index e5de7e5f10f..5e5344d2cc8 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -25,7 +25,8 @@ import json from pathlib import Path import sys -from pyvistaqt import BackgroundPlotter + +# from pyvistaqt import BackgroundPlotter current_python_version = sys.version_info[:2] if current_python_version < (3, 10): # pragma: no cover @@ -1638,8 +1639,8 @@ def add_isar_2d( Color mapping to be applied to the RCS data. It can be a color (``"blue"``, ``"green"``, ...) or a colormap (``"jet"``, ``"viridis"``, ...). The default is ``"jet"``. """ - if not self.modeler_window: - self.modeler_window = BackgroundPlotter(show=False) + # if not self.modeler_window: + # self.modeler_window = BackgroundPlotter(show=False) data_isar_2d = self.rcs_data.isar_2d @@ -1652,16 +1653,40 @@ def add_isar_2d( z = np.zeros_like(x) if plot_type.lower() == "relief": - m = self.modeler_window.bounds[-1]-self.modeler_window.bounds[-2] - b = self.modeler_window.bounds[-2] - z = (values_2d-values_2d.min())/(values_2d.max()-values_2d.min())*m+b + # m = self.modeler_window.bounds[-1]-self.modeler_window.bounds[-2] + # b = self.modeler_window.bounds[-2] + m = 2.0 + b = -1.0 + z = (values_2d - values_2d.min()) / (values_2d.max() - values_2d.min()) * m + b + + if plot_type.lower() in ["relief", "plane"]: + actor = pv.StructuredGrid() + actor.points = np.c_[x.ravel(), y.ravel(), z.ravel()] + + actor.dimensions = (len(down_range), len(cross_range), 1) - actor = pv.StructuredGrid() - actor.points = np.c_[x.ravel(), y.ravel(), z.ravel()] + actor["values"] = values_2d.ravel() - actor.dimensions = (len(down_range), len(cross_range), 1) + else: + scene_actors = self.all_scene_actors["model"] + if scene_actors is None: + return None + actor = pv.PolyData() + for model_actor in scene_actors.values(): + mesh = model_actor.custom_object.get_mesh() + xypoints = mesh.points + cpos = values_2d.flatten() + xpos_ypos = np.column_stack((x.flatten(), y.flatten(), cpos)) + all_indices = self.__find_nearest_neighbors(xpos_ypos, xypoints) - actor["values"] = values_2d.ravel() + mag_for_color = np.ndarray.flatten(cpos[all_indices]) + if not mesh.__class__.__name__ == "PolyData": + mesh_triangulated = mesh.triangulate() + model_actor.custom_object.mesh = pv.PolyData(mesh_triangulated.points, mesh_triangulated.cells) + else: + model_actor.custom_object.mesh.clear_data() + model_actor.custom_object.mesh[self.rcs_data.data_conversion_function] = mag_for_color + actor += model_actor.custom_object.mesh all_results_actors = list(self.all_scene_actors["results"].keys()) From adace1bade269c58baa1a71bd996c19b9ad76b23 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Thu, 19 Dec 2024 18:18:28 +0100 Subject: [PATCH 10/19] Test isar 2D relief --- tests/system/general/test_49_RCS_data_plotter.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/system/general/test_49_RCS_data_plotter.py b/tests/system/general/test_49_RCS_data_plotter.py index 4d9986864f9..d48b924cef7 100644 --- a/tests/system/general/test_49_RCS_data_plotter.py +++ b/tests/system/general/test_49_RCS_data_plotter.py @@ -263,8 +263,14 @@ def test_12_rcs_plotter_add_waterfall(self): def test_13_rcs_plotter_add_isar_2d(self): rcs_data = MonostaticRCSData(input_file=self.metadata_file) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) + rcs_plotter.show_geometry = False rcs_plotter.add_isar_2d() plot = rcs_plotter.plot_scene(show=False) assert isinstance(plot, Plotter) assert rcs_plotter.clear_scene() + + rcs_plotter.add_isar_2d("Relief") + plot = rcs_plotter.plot_scene(show=False) + assert isinstance(plot, Plotter) + assert rcs_plotter.clear_scene() From 0e58424adda9fd99b08b3146fbc4c21f6762b86b Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Wed, 8 Jan 2025 12:31:00 +0100 Subject: [PATCH 11/19] Remove comment --- src/ansys/aedt/core/visualization/advanced/rcs_visualization.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index c46b9b935bd..299f2536bc6 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -26,8 +26,6 @@ from pathlib import Path import sys -# from pyvistaqt import BackgroundPlotter - current_python_version = sys.version_info[:2] if current_python_version < (3, 10): # pragma: no cover raise Exception("Python 3.10 or higher is required for Monostatic RCS post-processing.") From 0a248b2c999d985746278bde1f51d7ad1d8967f7 Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Wed, 8 Jan 2025 15:11:04 +0100 Subject: [PATCH 12/19] Add possibility to just load the geometry without data --- .../advanced/rcs_visualization.py | 16 +++++--- .../T49/rcs_metadata_no_data.json | 38 +++++++++++++++++++ .../general/test_49_RCS_data_plotter.py | 11 ++++++ 3 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 tests/system/general/example_models/T49/rcs_metadata_no_data.json diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 299f2536bc6..f687d08cf32 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -132,7 +132,9 @@ def __init__(self, input_file): self.__frequency_units = self.__metadata["frequency_units"] - self.__monostatic_file = self.output_dir / self.__metadata["monostatic_file"] + self.__monostatic_file = None + if self.__metadata["monostatic_file"]: + self.__monostatic_file = self.output_dir / self.__metadata["monostatic_file"] self.__data_conversion_function = "dB20" self.__window = "Flat" @@ -141,19 +143,23 @@ def __init__(self, input_file): self.__upsample_range = 512 self.__upsample_azimuth = 64 - if not self.__monostatic_file.is_file(): + if self.__monostatic_file and not self.__monostatic_file.is_file(): raise Exception("Monostatic file invalid.") self.rcs_column_names = ["data"] # Load farfield data - is_rcs_loaded = self.__init_rcs() + if self.__monostatic_file: + is_rcs_loaded = self.__init_rcs() + else: + is_rcs_loaded = True if not is_rcs_loaded: # pragma: no cover raise RuntimeError("RCS information can not be loaded.") - # Update active frequency if passed in the initialization - self.frequency = self.frequencies[0] + if self.__monostatic_file: + # Update active frequency if passed in the initialization + self.frequency = self.frequencies[0] @property def raw_data(self): diff --git a/tests/system/general/example_models/T49/rcs_metadata_no_data.json b/tests/system/general/example_models/T49/rcs_metadata_no_data.json new file mode 100644 index 00000000000..1f235b23b7e --- /dev/null +++ b/tests/system/general/example_models/T49/rcs_metadata_no_data.json @@ -0,0 +1,38 @@ +{ + "solution": "Trihedral_RCS", + "monostatic_file": null, + "model_units": "mm", + "frequency_units": null, + "model_info": { + "Polyline1": [ + "Polyline1.obj", + [ + 143, + 175, + 143 + ], + 1.0, + "mm" + ], + "Polyline1_1": [ + "Polyline1_1.obj", + [ + 143, + 175, + 143 + ], + 1.0, + "mm" + ], + "Polyline1_2": [ + "Polyline1_2.obj", + [ + 143, + 175, + 143 + ], + 1.0, + "mm" + ] + } +} \ No newline at end of file diff --git a/tests/system/general/test_49_RCS_data_plotter.py b/tests/system/general/test_49_RCS_data_plotter.py index 99d7251337e..3535fce0fd7 100644 --- a/tests/system/general/test_49_RCS_data_plotter.py +++ b/tests/system/general/test_49_RCS_data_plotter.py @@ -50,6 +50,7 @@ def setup_test_data(request, local_scratch): data_dir = os.path.join(local_scratch.path, "rcs_files") shutil.copytree(dir_original, data_dir) request.cls.metadata_file = os.path.join(data_dir, "rcs_metadata.json") + request.cls.metadata_file_no_data = os.path.join(data_dir, "rcs_metadata_no_data.json") request.cls.metadata_file_fake = os.path.join(data_dir, "rcs_metadata_fake.json") yield @@ -274,3 +275,13 @@ def test_13_rcs_plotter_add_isar_2d(self): plot = rcs_plotter.plot_scene(show=False) assert isinstance(plot, Plotter) assert rcs_plotter.clear_scene() + + def test_14_rcs_plotter_no_data(self): + rcs_data = MonostaticRCSData(input_file=self.metadata_file_no_data) + rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) + rcs_plotter.show_geometry = False + + rcs_plotter.add_range_profile_settings() + plot = rcs_plotter.plot_scene(show=False) + assert isinstance(plot, Plotter) + assert rcs_plotter.clear_scene() From 2c65708640b91999cd21e15a348d8e8cfe34889e Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Thu, 9 Jan 2025 08:53:27 +0100 Subject: [PATCH 13/19] Remove comments --- .../aedt/core/visualization/advanced/rcs_visualization.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index f687d08cf32..dee8bb6fad6 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -617,9 +617,6 @@ class MonostaticRCSPlotter(object): def __init__(self, rcs_data): - # Public - self.modeler_window = None - # Private self.__rcs_data = rcs_data self.__logger = logger @@ -1638,9 +1635,6 @@ def add_isar_2d( Color mapping to be applied to the RCS data. It can be a color (``"blue"``, ``"green"``, ...) or a colormap (``"jet"``, ``"viridis"``, ...). The default is ``"jet"``. """ - # if not self.modeler_window: - # self.modeler_window = BackgroundPlotter(show=False) - data_isar_2d = self.rcs_data.isar_2d down_range = data_isar_2d["Down-range"].unique() @@ -1652,8 +1646,6 @@ def add_isar_2d( z = np.zeros_like(x) if plot_type.lower() == "relief": - # m = self.modeler_window.bounds[-1]-self.modeler_window.bounds[-2] - # b = self.modeler_window.bounds[-2] m = 2.0 b = -1.0 z = (values_2d - values_2d.min()) / (values_2d.max() - values_2d.min()) * m + b From 1baf7af26a3fbb661c92db699a414f0204c62cbf Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Thu, 9 Jan 2025 08:53:38 +0100 Subject: [PATCH 14/19] Update src/ansys/aedt/core/visualization/advanced/rcs_visualization.py Co-authored-by: Maxime Rey <87315832+MaxJPRey@users.noreply.github.com> --- .../aedt/core/visualization/advanced/rcs_visualization.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index f687d08cf32..26e6bfc927d 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -992,7 +992,8 @@ def plot_isar_2d(self, title="ISAR", output_file=None, show=True, size=(1920, 14 Image size in pixel (width, height). figure : :class:`matplotlib.pyplot.Figure`, optional An existing Matplotlib `Figure` to which the plot is added. - If not provided, a new `Figure` and `Axes` object are created. + If not provided, a new `Figure` and `Axes` objects are created. + Default is ``None``. Returns ------- From 8df556bfcd849ab45adc6c606f36eccc4c5f254f Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Thu, 9 Jan 2025 08:53:44 +0100 Subject: [PATCH 15/19] Update src/ansys/aedt/core/visualization/advanced/rcs_visualization.py Co-authored-by: Maxime Rey <87315832+MaxJPRey@users.noreply.github.com> --- .../aedt/core/visualization/advanced/rcs_visualization.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 26e6bfc927d..8d5ebd25799 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -928,7 +928,8 @@ def plot_waterfall( Image size in pixel (width, height). figure : :class:`matplotlib.pyplot.Figure`, optional An existing Matplotlib `Figure` to which the plot is added. - If not provided, a new `Figure` and `Axes` object are created. + If not provided, a new `Figure` and `Axes` objects are created. + Default is ``None``. Returns ------- From 21ed619dac9ac1799c176490452366f8ecf1f224 Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:34:02 +0100 Subject: [PATCH 16/19] Update src/ansys/aedt/core/visualization/advanced/rcs_visualization.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Morais <146729917+SMoraisAnsys@users.noreply.github.com> --- src/ansys/aedt/core/visualization/advanced/rcs_visualization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index c3b545af074..1d1a68a58cb 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -1623,7 +1623,7 @@ def add_waterfall( @pyaedt_function_handler() def add_isar_2d( self, - plot_type="Plane", + plot_type="plane", color_bar="jet", ): """Add the ISAR 2D. From 5a93cf77b50c06b3f9b9086c0ceb9533a23f363f Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:34:12 +0100 Subject: [PATCH 17/19] Update src/ansys/aedt/core/visualization/advanced/rcs_visualization.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Morais <146729917+SMoraisAnsys@users.noreply.github.com> --- .../aedt/core/visualization/advanced/rcs_visualization.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 1d1a68a58cb..cf3bc68652e 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -1631,8 +1631,8 @@ def add_isar_2d( Parameters ---------- plot_type : str, optional - The type of plot to create for the range profile. It can be ``"Plane"``, ``"Relief"``, and `"Projection"``. - The default is ``"Plane"``. + The type of plot to create for the range profile. It can be ``"plane"``, ``"relief"``, and `"projection"``. + The default is ``"plane"``. color_bar : str, optional Color mapping to be applied to the RCS data. It can be a color (``"blue"``, ``"green"``, ...) or a colormap (``"jet"``, ``"viridis"``, ...). The default is ``"jet"``. From 5bbac0c98da7fdfce91b25c01feff0bdcf5edf37 Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Thu, 9 Jan 2025 10:34:25 +0100 Subject: [PATCH 18/19] Update src/ansys/aedt/core/visualization/advanced/rcs_visualization.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Morais <146729917+SMoraisAnsys@users.noreply.github.com> --- src/ansys/aedt/core/visualization/advanced/rcs_visualization.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index cf3bc68652e..34f3c1767e6 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -1673,7 +1673,7 @@ def add_isar_2d( all_indices = self.__find_nearest_neighbors(xpos_ypos, xypoints) mag_for_color = np.ndarray.flatten(cpos[all_indices]) - if not mesh.__class__.__name__ == "PolyData": + if mesh.__class__.__name__ != "PolyData": mesh_triangulated = mesh.triangulate() model_actor.custom_object.mesh = pv.PolyData(mesh_triangulated.points, mesh_triangulated.cells) else: From 3684fca4bac7e98a15882a899485e1a0e0490cce Mon Sep 17 00:00:00 2001 From: Samuelopez-ansys Date: Thu, 9 Jan 2025 12:13:55 +0100 Subject: [PATCH 19/19] Remove json files and create them on the fly --- .../advanced/rcs_visualization.py | 10 +-- .../example_models/T49/rcs_metadata.json | 38 -------- .../example_models/T49/rcs_metadata_fake.json | 38 -------- .../T49/rcs_metadata_no_data.json | 38 -------- .../general/test_49_RCS_data_plotter.py | 90 ++++++++++++++----- 5 files changed, 73 insertions(+), 141 deletions(-) delete mode 100644 tests/system/general/example_models/T49/rcs_metadata.json delete mode 100644 tests/system/general/example_models/T49/rcs_metadata_fake.json delete mode 100644 tests/system/general/example_models/T49/rcs_metadata_no_data.json diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 34f3c1767e6..5b6cae3aef6 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -719,7 +719,7 @@ def plot_rcs( """ curves = [] all_secondary_sweep_value = secondary_sweep_value - if primary_sweep.lower() == "freq" or primary_sweep.lower() == "frequency": + if primary_sweep.casefold() == "freq" or primary_sweep.casefold() == "frequency": x_key = "Freq" x = self.rcs_data.frequencies if secondary_sweep == "IWaveTheta": @@ -735,7 +735,7 @@ def plot_rcs( y_key = "IWavePhi" else: data = self.rcs_data.rcs_active_frequency - if primary_sweep.lower() == "iwavephi": + if primary_sweep.casefold() == "iwavephi": x_key = "IWavePhi" y_key = "IWaveTheta" x = self.rcs_data.available_incident_wave_phi @@ -1647,12 +1647,12 @@ def add_isar_2d( x, y = np.meshgrid(down_range, cross_range) z = np.zeros_like(x) - if plot_type.lower() == "relief": + if plot_type.casefold() == "relief": m = 2.0 b = -1.0 z = (values_2d - values_2d.min()) / (values_2d.max() - values_2d.min()) * m + b - if plot_type.lower() in ["relief", "plane"]: + if plot_type.casefold() in ["relief", "plane"]: actor = pv.StructuredGrid() actor.points = np.c_[x.ravel(), y.ravel(), z.ravel()] @@ -1740,7 +1740,7 @@ def __get_pyvista_range_profile_actor( if extents is None: extents = [0, 10, 0, 10, 0, 10] - plot_type_lower = plot_type.lower() + plot_type_lower = plot_type.casefold() actor = None if ( diff --git a/tests/system/general/example_models/T49/rcs_metadata.json b/tests/system/general/example_models/T49/rcs_metadata.json deleted file mode 100644 index 5fee8041a9c..00000000000 --- a/tests/system/general/example_models/T49/rcs_metadata.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "solution": "Trihedral_RCS", - "monostatic_file": "rcs_data.h5", - "model_units": "mm", - "frequency_units": "GHz", - "model_info": { - "Polyline1": [ - "Polyline1.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ], - "Polyline1_1": [ - "Polyline1_1.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ], - "Polyline1_2": [ - "Polyline1_2.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ] - } -} \ No newline at end of file diff --git a/tests/system/general/example_models/T49/rcs_metadata_fake.json b/tests/system/general/example_models/T49/rcs_metadata_fake.json deleted file mode 100644 index 9dfa9d6b079..00000000000 --- a/tests/system/general/example_models/T49/rcs_metadata_fake.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "solution": "Trihedral_RCS", - "monostatic_file": "invented.h5", - "model_units": "mm", - "frequency_units": "GHz", - "model_info": { - "Polyline1": [ - "Polyline1.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ], - "Polyline1_1": [ - "Polyline1_1.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ], - "Polyline1_2": [ - "Polyline1_2.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ] - } -} \ No newline at end of file diff --git a/tests/system/general/example_models/T49/rcs_metadata_no_data.json b/tests/system/general/example_models/T49/rcs_metadata_no_data.json deleted file mode 100644 index 1f235b23b7e..00000000000 --- a/tests/system/general/example_models/T49/rcs_metadata_no_data.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "solution": "Trihedral_RCS", - "monostatic_file": null, - "model_units": "mm", - "frequency_units": null, - "model_info": { - "Polyline1": [ - "Polyline1.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ], - "Polyline1_1": [ - "Polyline1_1.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ], - "Polyline1_2": [ - "Polyline1_2.obj", - [ - 143, - 175, - 143 - ], - 1.0, - "mm" - ] - } -} \ No newline at end of file diff --git a/tests/system/general/test_49_RCS_data_plotter.py b/tests/system/general/test_49_RCS_data_plotter.py index 3535fce0fd7..bd4a4a8c8b4 100644 --- a/tests/system/general/test_49_RCS_data_plotter.py +++ b/tests/system/general/test_49_RCS_data_plotter.py @@ -22,7 +22,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -import os +import json +from pathlib import Path import shutil from ansys.aedt.core.visualization.advanced.rcs_visualization import MonostaticRCSData @@ -46,12 +47,57 @@ def desktop(): @pytest.fixture(scope="class") def setup_test_data(request, local_scratch): """Fixture to set up the test data directory and file before running the test class.""" - dir_original = os.path.join(TESTS_GENERAL_PATH, "example_models", test_subfolder) - data_dir = os.path.join(local_scratch.path, "rcs_files") + dir_original = Path(TESTS_GENERAL_PATH) / "example_models" / test_subfolder + data_dir = Path(local_scratch.path) / "rcs_files" shutil.copytree(dir_original, data_dir) - request.cls.metadata_file = os.path.join(data_dir, "rcs_metadata.json") - request.cls.metadata_file_no_data = os.path.join(data_dir, "rcs_metadata_no_data.json") - request.cls.metadata_file_fake = os.path.join(data_dir, "rcs_metadata_fake.json") + + metadata = { + "solution": "Trihedral_RCS", + "monostatic_file": "rcs_data.h5", + "model_units": "mm", + "frequency_units": "GHz", + "model_info": { + "Polyline1": ["Polyline1.obj", [143, 175, 143], 1.0, "mm"], + "Polyline1_1": ["Polyline1_1.obj", [143, 175, 143], 1.0, "mm"], + "Polyline1_2": ["Polyline1_2.obj", [143, 175, 143], 1.0, "mm"], + }, + } + metadata_file = data_dir / "rcs_metadata.json" + with open(metadata_file, "w") as f: + json.dump(metadata, f) + request.cls.metadata_file = metadata_file + + metadata_fake = { + "solution": "Trihedral_RCS", + "monostatic_file": "invented.h5", + "model_units": "mm", + "frequency_units": "GHz", + "model_info": { + "Polyline1": ["Polyline1.obj", [143, 175, 143], 1.0, "mm"], + "Polyline1_1": ["Polyline1_1.obj", [143, 175, 143], 1.0, "mm"], + "Polyline1_2": ["Polyline1_2.obj", [143, 175, 143], 1.0, "mm"], + }, + } + metadata_file_fake = data_dir / "rcs_metadata_fake.json" + with open(metadata_file_fake, "w") as f: + json.dump(metadata_fake, f) + request.cls.metadata_file_fake = metadata_file_fake + + metadata_no_data = { + "solution": "Trihedral_RCS", + "monostatic_file": None, + "model_units": "mm", + "frequency_units": None, + "model_info": { + "Polyline1": ["Polyline1.obj", [143, 175, 143], 1.0, "mm"], + "Polyline1_1": ["Polyline1_1.obj", [143, 175, 143], 1.0, "mm"], + "Polyline1_2": ["Polyline1_2.obj", [143, 175, 143], 1.0, "mm"], + }, + } + metadata_file_no_data = data_dir / "rcs_metadata_no_data.json" + with open(metadata_file_no_data, "w") as f: + json.dump(metadata_no_data, f) + request.cls.metadata_file_no_data = metadata_file_no_data yield @@ -62,16 +108,16 @@ def test_01_rcs_data(self): MonostaticRCSData(input_file="invented") with pytest.raises(Exception, match="Monostatic file invalid."): - MonostaticRCSData(input_file=self.metadata_file_fake) + MonostaticRCSData(input_file=str(self.metadata_file_fake)) - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) assert isinstance(rcs_data.raw_data, pd.DataFrame) assert isinstance(rcs_data.metadata, dict) assert rcs_data.name == "HH" assert rcs_data.solution == "Trihedral_RCS" - assert os.path.isfile(rcs_data.input_file) + assert Path(rcs_data.input_file).is_file() assert rcs_data.frequency_units == "GHz" assert len(rcs_data.frequencies) == 3 @@ -141,7 +187,7 @@ def test_01_rcs_data(self): assert isinstance(rcs_data.isar_2d, pd.DataFrame) def test_02_rcs_plotter_properties(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) assert rcs_plotter.rcs_data @@ -154,7 +200,7 @@ def test_02_rcs_plotter_properties(self): assert isinstance(rcs_plotter.radius, float) def test_03_rcs_plotter_rcs(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter1 = rcs_plotter.plot_rcs( @@ -181,14 +227,14 @@ def test_03_rcs_plotter_rcs(self): assert isinstance(rcs_plotter7, ReportPlotter) def test_04_rcs_plotter_range_profile(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter = rcs_plotter.plot_range_profile(show=False) assert isinstance(rcs_plotter, ReportPlotter) def test_05_rcs_plotter_waterfall(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter1 = rcs_plotter.plot_waterfall(show=False) @@ -198,14 +244,14 @@ def test_05_rcs_plotter_waterfall(self): assert isinstance(rcs_plotter2, ReportPlotter) def test_06_rcs_plotter_2d_isar(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter1 = rcs_plotter.plot_isar_2d(show=False) assert isinstance(rcs_plotter1, ReportPlotter) def test_07_rcs_plotter_add_rcs(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter.add_rcs() @@ -217,7 +263,7 @@ def test_07_rcs_plotter_add_rcs(self): assert rcs_plotter.clear_scene() def test_08_rcs_plotter_add_profile_settings(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter.add_range_profile_settings() @@ -226,7 +272,7 @@ def test_08_rcs_plotter_add_profile_settings(self): assert rcs_plotter.clear_scene() def test_09_rcs_plotter_add_waterfall_settings(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter.add_waterfall_settings() @@ -235,7 +281,7 @@ def test_09_rcs_plotter_add_waterfall_settings(self): assert rcs_plotter.clear_scene() def test_10_rcs_plotter_add_isar_2d_settings(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter.add_isar_2d_settings() @@ -244,7 +290,7 @@ def test_10_rcs_plotter_add_isar_2d_settings(self): assert rcs_plotter.clear_scene() def test_11_rcs_plotter_add_range_profile(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter.add_range_profile() @@ -253,7 +299,7 @@ def test_11_rcs_plotter_add_range_profile(self): assert rcs_plotter.clear_scene() def test_12_rcs_plotter_add_waterfall(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter.add_waterfall() @@ -262,7 +308,7 @@ def test_12_rcs_plotter_add_waterfall(self): assert rcs_plotter.clear_scene() def test_13_rcs_plotter_add_isar_2d(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter.show_geometry = False @@ -277,7 +323,7 @@ def test_13_rcs_plotter_add_isar_2d(self): assert rcs_plotter.clear_scene() def test_14_rcs_plotter_no_data(self): - rcs_data = MonostaticRCSData(input_file=self.metadata_file_no_data) + rcs_data = MonostaticRCSData(input_file=str(self.metadata_file_no_data)) rcs_plotter = MonostaticRCSPlotter(rcs_data=rcs_data) rcs_plotter.show_geometry = False