From 03f66ea1b0320f715e12c5d7431eb7e4ca0f67c9 Mon Sep 17 00:00:00 2001 From: rmanno91 Date: Fri, 6 Feb 2026 11:09:32 +0100 Subject: [PATCH 1/6] feat add reordering --- src/ansys/meshing/prime/graphics/plotter.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/ansys/meshing/prime/graphics/plotter.py b/src/ansys/meshing/prime/graphics/plotter.py index 49fc689c57..9069b5fa82 100644 --- a/src/ansys/meshing/prime/graphics/plotter.py +++ b/src/ansys/meshing/prime/graphics/plotter.py @@ -132,6 +132,19 @@ def get_scalar_colors(self, mesh_info: DisplayMeshInfo) -> np.ndarray: return color_matrix[mesh_info.part_id % num_colors].tolist() else: return color_matrix[mesh_info.zone_id % num_colors].tolist() + + def _process_connectivity(self, connectivity: np.ndarray, dimensions: np.ndarray) -> np.ndarray: + connectivity = np.asarray(connectivity) + starts = dimensions + np.arange(len(dimensions)) + starts = starts[:-1] + block_lengths = connectivity[starts] + 1 + group_id = np.repeat(np.arange(len(block_lengths)), block_lengths) + block_starts = np.repeat(np.cumsum(block_lengths) - block_lengths, block_lengths) + pos_in_block = np.arange(len(connectivity)) - block_starts + mask = pos_in_block != 0 + new_pos = mask * (block_lengths[group_id] - pos_in_block) + new_indices = block_starts + new_pos + return connectivity[new_indices] def add_model( self, model: Model, scope: prime.ScopeDefinition = None, update: bool = False @@ -149,6 +162,13 @@ def add_model( """ if scope is None: model_pd = model.as_polydata(update=update) + for part_polydata in model_pd.values(): + if "faces" not in part_polydata.keys(): + continue + for face_object, _ in part_polydata["faces"]: + mesh = face_object.mesh + faces = self._process_connectivity(mesh.faces, mesh._offset_array) + mesh.faces = faces self.add_model_pd(model_pd) else: self.add_scope(model, scope, update=update) From 04088f803a572a1741692aa4f960722e58f60ce3 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Fri, 6 Feb 2026 10:12:05 +0000 Subject: [PATCH 2/6] chore: adding changelog file 1222.miscellaneous.md [dependabot-skip] --- doc/changelog.d/1222.miscellaneous.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/1222.miscellaneous.md diff --git a/doc/changelog.d/1222.miscellaneous.md b/doc/changelog.d/1222.miscellaneous.md new file mode 100644 index 0000000000..9c117e4870 --- /dev/null +++ b/doc/changelog.d/1222.miscellaneous.md @@ -0,0 +1 @@ +Feat add reordering of face connectivity From 10433ce092c55ea4132ce67e1eaa12ce48628e42 Mon Sep 17 00:00:00 2001 From: rmanno91 Date: Fri, 6 Feb 2026 17:27:51 +0100 Subject: [PATCH 3/6] fixes --- src/ansys/meshing/prime/core/mesh.py | 30 ++++++++++++++++----- src/ansys/meshing/prime/graphics/plotter.py | 21 +-------------- 2 files changed, 25 insertions(+), 26 deletions(-) diff --git a/src/ansys/meshing/prime/core/mesh.py b/src/ansys/meshing/prime/core/mesh.py index af1169c173..a0f4e91401 100644 --- a/src/ansys/meshing/prime/core/mesh.py +++ b/src/ansys/meshing/prime/core/mesh.py @@ -65,6 +65,19 @@ class ColorByType(enum.IntEnum): ] ) +def _process_connectivity(connectivity: np.ndarray, dimensions: np.ndarray) -> np.ndarray: + connectivity = np.asarray(connectivity) + starts = dimensions + np.arange(len(dimensions)) + starts = starts[:-1] + block_lengths = connectivity[starts] + 1 + group_id = np.repeat(np.arange(len(block_lengths)), block_lengths) + block_starts = np.repeat(np.cumsum(block_lengths) - block_lengths, block_lengths) + pos_in_block = np.arange(len(connectivity)) - block_starts + mask = pos_in_block != 0 + new_pos = mask * (block_lengths[group_id] - pos_in_block) + new_indices = block_starts + new_pos + return connectivity[new_indices] + class DisplayMeshType(enum.IntEnum): """Contains the mesh types to display.""" @@ -515,14 +528,19 @@ def update_pd(self, part_ids) -> Dict[int, Dict[str, list[(pv.PolyData, Part)]]] part = self._model.get_part(part_id) splines = part.get_splines() part_polydata = {} - face_polydata_list = [ - self.get_face_polydata( - part_id, facet_result.face_connectivity_result_per_part[i], j - ) - for j in range( + + face_polydata_list = [] + for j in range( 0, len(facet_result.face_connectivity_result_per_part[i].face_zonelet_ids) + ): + face_polydata = self.get_face_polydata( + part_id, facet_result.face_connectivity_result_per_part[i], j ) - ] + + faces = _process_connectivity(face_polydata[0].mesh.faces, face_polydata[0].mesh._offset_array) + face_polydata[0].mesh.faces = faces + face_polydata[0].mesh.compute_normals(consistent_normals=True, auto_orient_normals=False, inplace=True) + face_polydata_list.append(face_polydata) edge_polydata_list = [ self.get_edge_polydata( diff --git a/src/ansys/meshing/prime/graphics/plotter.py b/src/ansys/meshing/prime/graphics/plotter.py index 9069b5fa82..5ef043dfff 100644 --- a/src/ansys/meshing/prime/graphics/plotter.py +++ b/src/ansys/meshing/prime/graphics/plotter.py @@ -132,19 +132,7 @@ def get_scalar_colors(self, mesh_info: DisplayMeshInfo) -> np.ndarray: return color_matrix[mesh_info.part_id % num_colors].tolist() else: return color_matrix[mesh_info.zone_id % num_colors].tolist() - - def _process_connectivity(self, connectivity: np.ndarray, dimensions: np.ndarray) -> np.ndarray: - connectivity = np.asarray(connectivity) - starts = dimensions + np.arange(len(dimensions)) - starts = starts[:-1] - block_lengths = connectivity[starts] + 1 - group_id = np.repeat(np.arange(len(block_lengths)), block_lengths) - block_starts = np.repeat(np.cumsum(block_lengths) - block_lengths, block_lengths) - pos_in_block = np.arange(len(connectivity)) - block_starts - mask = pos_in_block != 0 - new_pos = mask * (block_lengths[group_id] - pos_in_block) - new_indices = block_starts + new_pos - return connectivity[new_indices] + def add_model( self, model: Model, scope: prime.ScopeDefinition = None, update: bool = False @@ -162,13 +150,6 @@ def add_model( """ if scope is None: model_pd = model.as_polydata(update=update) - for part_polydata in model_pd.values(): - if "faces" not in part_polydata.keys(): - continue - for face_object, _ in part_polydata["faces"]: - mesh = face_object.mesh - faces = self._process_connectivity(mesh.faces, mesh._offset_array) - mesh.faces = faces self.add_model_pd(model_pd) else: self.add_scope(model, scope, update=update) From 975f06a3697e83732a368cb9cb0c81e134f783d9 Mon Sep 17 00:00:00 2001 From: rmanno91 Date: Fri, 6 Feb 2026 17:29:00 +0100 Subject: [PATCH 4/6] remove space --- examples/misc/trial.py | 41 +++++++++++++++++++++ src/ansys/meshing/prime/graphics/plotter.py | 1 - 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 examples/misc/trial.py diff --git a/examples/misc/trial.py b/examples/misc/trial.py new file mode 100644 index 0000000000..6fe0fa7d52 --- /dev/null +++ b/examples/misc/trial.py @@ -0,0 +1,41 @@ +import os +import tempfile +import numpy as np +import ansys.meshing.prime as prime +from ansys.meshing.prime.graphics.plotter import PrimePlotter +import pyvista as pv + +prime_client = prime.launch_prime() +model = prime_client.model +mesh_util = prime.lucid.Mesh(model=model) + +mesh_util.read(file_name=prime.examples.download_block_model_fmd()) + +print(model) + +mesh_util.surface_mesh(min_size=8.0) + +part = model.parts[0] + +mesh_util.volume_mesh(quadratic=True, volume_fill_type=prime.VolumeFillType.TET) + +prime.SurfaceUtilities(model).project_topo_faces_on_geometry( + part.get_topo_faces(), + prime.ProjectOnGeometryParams( + model, project_on_facets_if_cadnot_found=True, project_only_mid_nodes=False + ), +) + +model_pd = model.as_polydata() + +for part_id, part_polydata in model_pd.items(): + if "faces" in part_polydata.keys(): + for face_mesh_part, face_mesh_info in part_polydata["faces"]: + zone_name = face_mesh_info.zone_name + print(face_mesh_part.mesh) + +display = PrimePlotter() +display.plot(model, update=True) +display.show() + +prime_client.exit() \ No newline at end of file diff --git a/src/ansys/meshing/prime/graphics/plotter.py b/src/ansys/meshing/prime/graphics/plotter.py index 5ef043dfff..49fc689c57 100644 --- a/src/ansys/meshing/prime/graphics/plotter.py +++ b/src/ansys/meshing/prime/graphics/plotter.py @@ -132,7 +132,6 @@ def get_scalar_colors(self, mesh_info: DisplayMeshInfo) -> np.ndarray: return color_matrix[mesh_info.part_id % num_colors].tolist() else: return color_matrix[mesh_info.zone_id % num_colors].tolist() - def add_model( self, model: Model, scope: prime.ScopeDefinition = None, update: bool = False From 80b088a896553c9649e059292e5b3936fa7751fb Mon Sep 17 00:00:00 2001 From: rmanno91 Date: Fri, 6 Feb 2026 17:29:30 +0100 Subject: [PATCH 5/6] fix trial --- examples/misc/trial.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/examples/misc/trial.py b/examples/misc/trial.py index 6fe0fa7d52..356ac6a730 100644 --- a/examples/misc/trial.py +++ b/examples/misc/trial.py @@ -26,14 +26,6 @@ ), ) -model_pd = model.as_polydata() - -for part_id, part_polydata in model_pd.items(): - if "faces" in part_polydata.keys(): - for face_mesh_part, face_mesh_info in part_polydata["faces"]: - zone_name = face_mesh_info.zone_name - print(face_mesh_part.mesh) - display = PrimePlotter() display.plot(model, update=True) display.show() From 83e2cc7e90c699f20b9b6ddeaba09ea143244f84 Mon Sep 17 00:00:00 2001 From: rmanno91 Date: Fri, 6 Feb 2026 17:29:57 +0100 Subject: [PATCH 6/6] fixes --- examples/misc/{trial.py => trial_midside_nodes_projection.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/misc/{trial.py => trial_midside_nodes_projection.py} (100%) diff --git a/examples/misc/trial.py b/examples/misc/trial_midside_nodes_projection.py similarity index 100% rename from examples/misc/trial.py rename to examples/misc/trial_midside_nodes_projection.py