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 diff --git a/examples/misc/trial_midside_nodes_projection.py b/examples/misc/trial_midside_nodes_projection.py new file mode 100644 index 0000000000..356ac6a730 --- /dev/null +++ b/examples/misc/trial_midside_nodes_projection.py @@ -0,0 +1,33 @@ +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 + ), +) + +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/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(