Source code for vtk_openCARP_methods_ibt.vtk_methods.helper_methods

import numpy as np
import vtk

from .converters import vtk_to_numpy, numpy_to_vtk
from ..vtk_methods.filters import get_vtk_geom_filter_port, clean_polydata, get_cells_with_ids


[docs] def get_maximum_distance_of_points(points, point_center): """ Returns the maximum distance to the point_center. :param points: Has to be a vtk object on which GetPoints() can be executed :param point_center: :return: the maximum distance between the point_center and the points """ valve_pts = vtk_to_numpy(points.GetPoints().GetData()) max_dist = 0 for l in range(len(valve_pts)): if np.sqrt(np.sum((point_center - valve_pts[l]) ** 2, axis=0)) > max_dist: max_dist = np.sqrt(np.sum((point_center - valve_pts[l]) ** 2, axis=0)) return max_dist
[docs] def cut_mesh_with_radius(mesh, valve_center, max_cutting_radius): el_to_del_tot = find_elements_within_radius(mesh, valve_center, max_cutting_radius) return cut_elements_from_mesh(mesh, el_to_del_tot)
[docs] def cut_elements_from_mesh(mesh, elem_to_delete): cell_id_all = list(range(mesh.GetNumberOfCells())) el_diff = list(set(cell_id_all).difference(elem_to_delete)) geo_filter_port, geo_filter = get_vtk_geom_filter_port(get_cells_with_ids(mesh, el_diff)) return clean_polydata(geo_filter_port, input_is_connection=True)
[docs] def find_elements_within_radius(mesh, points_data, radius): mesh_id_list = find_points_within_radius(mesh, points_data, radius) mesh_cell_id_list = vtk.vtkIdList() mesh_cell_temp_id_list = vtk.vtkIdList() for i in range(mesh_id_list.GetNumberOfIds()): mesh.GetPointCells(mesh_id_list.GetId(i), mesh_cell_temp_id_list) for j in range(mesh_cell_temp_id_list.GetNumberOfIds()): mesh_cell_id_list.InsertNextId(mesh_cell_temp_id_list.GetId(j)) id_set = set() for i in range(mesh_cell_id_list.GetNumberOfIds()): id_set.add(mesh_cell_id_list.GetId(i)) return id_set
[docs] def find_points_within_radius(mesh, center_point, radius): """ Gets points within a radius around the center_point. :param mesh: Has to be a vtk mesh :param center_point: point in coordinates (x,y,z) :param radius: Radius in units of the mesh :return: """ locator = vtk.vtkStaticPointLocator() locator.SetDataSet(mesh) locator.BuildLocator() mesh_id_list = vtk.vtkIdList() locator.FindPointsWithinRadius(radius, center_point, mesh_id_list) return mesh_id_list
[docs] def add_vectors_to_vtk(mesh, vectors, name, is_cell_array=True): """ Adds a set of vectors to a vtk object as a cell array with a given name. :param mesh: A vtk object. :param vectors: A numpy based array of vectors. :param name: The name of the resulting cell array :param is_cell_array: If True, the resulting array is added to cell data otherwise to point data. :return: """ vtk_array = numpy_to_vtk(vectors, deep=True) vtk_array.SetName(name) if is_cell_array: mesh.GetCellData().AddArray(vtk_array) else: mesh.GetPointData().AddArray(vtk_array)