def mapDataSetToCellData( mesh_from, type_of_support, mesh_to, farray_names, type_of_mapping="PointsWithinRadius", radius_is_relative=True, radius=0.5, n_closest_points=3, threshold_dist=None, threshold_val_min=None, threshold_val_max=None, verbose=0): myVTK.myPrint(verbose, "*** mapDataSetToCellData ***") if (type_of_support == "point"): datapoints = mesh_from.GetPoints() dataset = mesh_from.GetPointData() point_locator = myVTK.getPointLocator( mesh_from, verbose=verbose-1) elif (type_of_support == "cell"): datapoints = myVTK.getCellCenters( mesh=mesh_from, verbose=verbose-1) dataset = mesh_from.GetCellData() point_locator = myVTK.getPointLocator( datapoints, verbose=verbose-1) else: assert (0) pdata_cell_centers_to = myVTK.getCellCenters(mesh_to) n_cells = mesh_to.GetNumberOfCells() farrays_avg = {} farrays_std = {} for farray_name in farray_names: assert (dataset.HasArray(farray_name)), "mesh has no array named "+farray_name+". Aborting." farray_type = dataset.GetArray(farray_name).GetDataTypeAsString() farray_n_components = dataset.GetArray(farray_name).GetNumberOfComponents() farrays_avg[farray_name] = myVTK.createArray(farray_name+"_avg", farray_n_components, n_cells, farray_type) farrays_std[farray_name] = myVTK.createArray(farray_name+"_std", farray_n_components, n_cells, farray_type) points_within_radius = vtk.vtkIdList() for k_cell in xrange(n_cells): if (type_of_mapping == "ClosestPoints"): point_locator.FindClosestNPoints( n_closest_points, pdata_cell_centers_to.GetPoint(k_cell), points_within_radius) elif (type_of_mapping == "PointsWithinRadius"): if (radius_is_relative): l = (mesh_to.GetCell(k_cell).GetLength2())**(0.5) actual_radius = l*radius else: actual_radius = radius point_locator.FindPointsWithinRadius( actual_radius, pdata_cell_centers_to.GetPoint(k_cell), points_within_radius) else: assert (0) #points_within_radius = myVTK.findPointsInCell(mesh_from.GetPoints(), mesh_to.GetCell(k_cell)) for farray_name in farray_names: if (points_within_radius.GetNumberOfIds()): values = [numpy.array(dataset.GetArray(farray_name).GetTuple(points_within_radius.GetId(k_id))) for k_id in xrange(points_within_radius.GetNumberOfIds()) if (threshold_dist is None) or (numpy.linalg.norm(numpy.array(datapoints.GetPoint(points_within_radius.GetId(k_id)))-numpy.array(pdata_cell_centers_to.GetPoint(k_cell))) < threshold_dist)] #print "values = "+str(values) if (threshold_val_min != None): values = [value for value in values if (numpy.linalg.norm(value) > threshold_val_min)] if (threshold_val_max != None): values = [value for value in values if (numpy.linalg.norm(value) < threshold_val_max)] #print "values = "+str(values) if (len(values)): avg = numpy.mean(values, 0) std = numpy.std(values, 0) else: avg = [0]*farray_n_components std = [0]*farray_n_components else: avg = [0]*farray_n_components std = [0]*farray_n_components farrays_avg[farray_name].SetTuple(k_cell, avg) farrays_std[farray_name].SetTuple(k_cell, std) for farray_name in farray_names: mesh_to.GetCellData().AddArray(farrays_avg[farray_name]) mesh_to.GetCellData().AddArray(farrays_std[farray_name])
def mapDataSetToCellData(mesh_from, type_of_support, mesh_to, farray_names, type_of_mapping="PointsWithinRadius", radius_is_relative=True, radius=0.5, n_closest_points=3, threshold_dist=None, threshold_val_min=None, threshold_val_max=None, verbose=0): myVTK.myPrint(verbose, "*** mapDataSetToCellData ***") if (type_of_support == "point"): datapoints = mesh_from.GetPoints() dataset = mesh_from.GetPointData() point_locator = myVTK.getPointLocator(mesh_from, verbose=verbose - 1) elif (type_of_support == "cell"): datapoints = myVTK.getCellCenters(mesh=mesh_from, verbose=verbose - 1) dataset = mesh_from.GetCellData() point_locator = myVTK.getPointLocator(datapoints, verbose=verbose - 1) else: assert (0) pdata_cell_centers_to = myVTK.getCellCenters(mesh_to) n_cells = mesh_to.GetNumberOfCells() farrays_avg = {} farrays_std = {} for farray_name in farray_names: assert (dataset.HasArray(farray_name) ), "mesh has no array named " + farray_name + ". Aborting." farray_type = dataset.GetArray(farray_name).GetDataTypeAsString() farray_n_components = dataset.GetArray( farray_name).GetNumberOfComponents() farrays_avg[farray_name] = myVTK.createArray(farray_name + "_avg", farray_n_components, n_cells, farray_type) farrays_std[farray_name] = myVTK.createArray(farray_name + "_std", farray_n_components, n_cells, farray_type) points_within_radius = vtk.vtkIdList() for k_cell in xrange(n_cells): if (type_of_mapping == "ClosestPoints"): point_locator.FindClosestNPoints( n_closest_points, pdata_cell_centers_to.GetPoint(k_cell), points_within_radius) elif (type_of_mapping == "PointsWithinRadius"): if (radius_is_relative): l = (mesh_to.GetCell(k_cell).GetLength2())**(0.5) actual_radius = l * radius else: actual_radius = radius point_locator.FindPointsWithinRadius( actual_radius, pdata_cell_centers_to.GetPoint(k_cell), points_within_radius) else: assert (0) #points_within_radius = myVTK.findPointsInCell(mesh_from.GetPoints(), mesh_to.GetCell(k_cell)) for farray_name in farray_names: if (points_within_radius.GetNumberOfIds()): values = [ numpy.array( dataset.GetArray(farray_name).GetTuple( points_within_radius.GetId(k_id))) for k_id in xrange(points_within_radius.GetNumberOfIds()) if (threshold_dist is None) or (numpy.linalg.norm( numpy.array( datapoints.GetPoint( points_within_radius.GetId(k_id))) - numpy.array(pdata_cell_centers_to.GetPoint(k_cell))) < threshold_dist) ] #print "values = "+str(values) if (threshold_val_min != None): values = [ value for value in values if (numpy.linalg.norm(value) > threshold_val_min) ] if (threshold_val_max != None): values = [ value for value in values if (numpy.linalg.norm(value) < threshold_val_max) ] #print "values = "+str(values) if (len(values)): avg = numpy.mean(values, 0) std = numpy.std(values, 0) else: avg = [0] * farray_n_components std = [0] * farray_n_components else: avg = [0] * farray_n_components std = [0] * farray_n_components farrays_avg[farray_name].SetTuple(k_cell, avg) farrays_std[farray_name].SetTuple(k_cell, std) for farray_name in farray_names: mesh_to.GetCellData().AddArray(farrays_avg[farray_name]) mesh_to.GetCellData().AddArray(farrays_std[farray_name])
def addMappingToPointData(mesh_from, type_of_support, mesh_to, farray_names, radius=1., threshold_min=None, threshold_max=None, verbose=0): mypy.my_print(verbose, "*** addMappingToPointData ***") if (type_of_support == "point"): dataset = mesh_from.GetPointData() point_locator = myvtk.getPointLocator(mesh_from) elif (type_of_support == "cell"): dataset = mesh_from.GetPointData() pdata_cell_centers_fr = myvtk.getCellCenters(mesh=mesh_from, verbose=verbose - 1) point_locator = myvtk.getPointLocator(pdata_cell_centers_fr) n_points = mesh_to.GetNumberOfPoints() farrays_avg = {} farrays_std = {} farrays_rat = {} for farray_name in farray_names: assert (dataset.HasArray(farray_name) ), "mesh has no array named " + farray_name + ". Aborting." farray_type = dataset.GetArray(farray_name).GetDataTypeAsString() farray_n_components = dataset.GetArray( farray_name).GetNumberOfComponents() farrays_avg[farray_name] = createArray(farray_name + "_avg", farray_n_components, n_points, farray_type) farrays_std[farray_name] = createArray(farray_name + "_std", farray_n_components, n_points, farray_type) farrays_rat[farray_name] = createArray(farray_name + "_rat", farray_n_components, n_points, farray_type) points_within_radius = vtk.vtkIdList() for k_point in xrange(n_points): #point_locator.FindClosestNPoints( #3, #mesh_to.GetPoints().GetPoint(k_point), #points_within_radius) point_locator.FindPointsWithinRadius( radius, mesh_to.GetPoints().GetPoint(k_point), points_within_radius) for farray_name in farray_names: if (points_within_radius.GetNumberOfIds() > 0): values = [ numpy.array( dataset.GetArray(farray_name).GetTuple( points_within_radius.GetId(k_id))) for k_id in xrange(points_within_radius.GetNumberOfIds()) ] #print "values = "+str(values) if (threshold_min != None): values = [ value for value in values if (numpy.linalg.norm(value) > threshold_min) ] if (threshold_max != None): values = [ value for value in values if (numpy.linalg.norm(value) < threshold_max) ] #print "values = "+str(values) if (len(values) > 0): avg = numpy.mean(values, 0) std = numpy.std(values, 0) rat = std / avg else: avg = [0] * n_components std = [0] * n_components rat = [0] * n_components else: avg = [0] * n_components std = [0] * n_components rat = [0] * n_components farrays_avg[farray_name].SetTuple(k_point, avg) farrays_std[farray_name].SetTuple(k_point, std) farrays_rat[farray_name].SetTuple(k_point, rat) for farray_name in farray_names: mesh_to.GetPointData().AddArray(farrays_avg[farray_name]) mesh_to.GetPointData().AddArray(farrays_std[farray_name]) mesh_to.GetPointData().AddArray(farrays_rat[farray_name])
def addVoxels( ugrid, verbose=1): myVTK.myPrint(verbose, "*** addVoxels ***") n_points = ugrid.GetPoints().GetNumberOfPoints() seed_point = int(n_points/2) point_locator = myVTK.getPointLocator(ugrid) n_closest_points = 100 closest_points = vtk.vtkIdList() point_locator.FindClosestNPoints( n_closest_points, ugrid.GetPoint(seed_point), closest_points) P0 = numpy.array(ugrid.GetPoint(closest_points.GetId(0))) #print "P0 = " + str(P0) P1 = numpy.array(ugrid.GetPoint(closest_points.GetId(1))) #print "P1 = " + str(P1) X = P1-P0 dX = numpy.linalg.norm(X) X /= dX #print "X = " + str(X) #print "dX = " + str(dX) for k_point in xrange(2, n_closest_points): #print "k_point = " + str(k_point) P2 = numpy.array(ugrid.GetPoint(closest_points.GetId(k_point))) Y = P2-P0 dY = numpy.linalg.norm(Y) Y /= dY #print "P2 = " + str(P2) #print "Y = " + str(Y) #print "dY = " + str(dY) #print "numpy.dot(Y, X) = " + str(numpy.dot(Y, X)) if (abs(numpy.dot(Y, X)) < 0.001): Y = P2-P0 dY = numpy.linalg.norm(Y) Y /= dY break #print "Y = " + str(Y) #print "dY = " + str(dY) Z = numpy.cross(X, Y) dZ_list = [] for k_point in xrange(2, n_closest_points): #print "k_point = " + str(k_point) P3 = numpy.array(ugrid.GetPoint(closest_points.GetId(k_point))) ZZ = P3-P0 dZ = numpy.linalg.norm(ZZ) ZZ /= dZ #print "P3 = " + str(P3) #print "ZZ = " + str(ZZ) #print "dZ = " + str(dZ) #print "numpy.dot(ZZ, Z) = " + str(numpy.dot(ZZ, Z)) if (abs(numpy.dot(ZZ, Z)) > 0.999): dZ_list.append(dZ) dZ = min(dZ_list) #print "Z = " + str(Z) #print "dZ = " + str(dZ) #print "numpy.dot(Y, X) = " + str(numpy.dot(Y, X)) #print "numpy.dot(Z, X) = " + str(numpy.dot(Z, X)) #print "numpy.dot(Z, Y) = " + str(numpy.dot(Z, Y)) points = vtk.vtkPoints() point_locator = vtk.vtkPointLocator() point_locator.InitPointInsertion(points, ugrid.GetBounds()) radius = min(dX, dY, dZ)/2 cell = vtk.vtkHexahedron() cell_array = vtk.vtkCellArray() for k_point in xrange(n_points): P = numpy.array(ugrid.GetPoint(k_point)) point_ids = [] for pm_Z in [-1,+1]: for pm_Y in [-1,+1]: if (pm_Y == -1): pm_X_list = [-1,+1] elif (pm_Y == +1): pm_X_list = [+1,-1] for pm_X in pm_X_list: PP = P + pm_Z * (dZ/2) * Z + pm_Y * (dY/2) * Y + pm_X * (dX/2) * X if (points.GetNumberOfPoints() == 0): point_id = point_locator.InsertNextPoint(PP) else: point_id = point_locator.FindClosestInsertedPoint(PP) dist = numpy.linalg.norm(points.GetPoint(point_id)-PP) if (dist > radius): point_id = point_locator.InsertNextPoint(PP) #point_id = point_locator.IsInsertedPoint(PP) #if (point_id == -1): #point_id = point_locator.InsertNextPoint(PP) point_ids.append(point_id) for i in xrange(8): cell.GetPointIds().SetId(i, point_ids[i]) cell_array.InsertNextCell(cell) new_ugrid = vtk.vtkUnstructuredGrid() new_ugrid.SetPoints(points) new_ugrid.SetCells(vtk.VTK_HEXAHEDRON, cell_array) n_arrays = ugrid.GetPointData().GetNumberOfArrays() for k_array in xrange(n_arrays): new_ugrid.GetCellData().AddArray(ugrid.GetPointData().GetArray(k_array)) return new_ugrid
def getVoxels(ugrid, verbose=0): mypy.my_print(verbose, "*** getVoxels ***") n_points = ugrid.GetPoints().GetNumberOfPoints() seed_point = int(n_points / 2) point_locator = myvtk.getPointLocator(ugrid) n_closest_points = 100 closest_points = vtk.vtkIdList() point_locator.FindClosestNPoints(n_closest_points, ugrid.GetPoint(seed_point), closest_points) P0 = numpy.empty(3) P1 = numpy.empty(3) P2 = numpy.empty(3) P3 = numpy.empty(3) ugrid.GetPoint(closest_points.GetId(0), P0) #print "P0 = "+str(P0) ugrid.GetPoint(closest_points.GetId(1), P1) #print "P1 = "+str(P1) X = P1 - P0 dX = numpy.linalg.norm(X) X /= dX #print "X = "+str(X) #print "dX = "+str(dX) for k_point in xrange(2, n_closest_points): #print "k_point = "+str(k_point) ugrid.GetPoint(closest_points.GetId(k_point), P2) Y = P2 - P0 dY = numpy.linalg.norm(Y) Y /= dY #print "P2 = "+str(P2) #print "Y = "+str(Y) #print "dY = "+str(dY) #print "numpy.dot(Y, X) = "+str(numpy.dot(Y, X)) if (abs(numpy.dot(Y, X)) < 0.001): Y = P2 - P0 dY = numpy.linalg.norm(Y) Y /= dY break #print "Y = "+str(Y) #print "dY = "+str(dY) Z = numpy.cross(X, Y) dZ_list = [] for k_point in xrange(2, n_closest_points): #print "k_point = "+str(k_point) ugrid.GetPoint(closest_points.GetId(k_point), P3) ZZ = P3 - P0 dZ = numpy.linalg.norm(ZZ) ZZ /= dZ #print "P3 = "+str(P3) #print "ZZ = "+str(ZZ) #print "dZ = "+str(dZ) #print "numpy.dot(ZZ, Z) = "+str(numpy.dot(ZZ, Z)) if (abs(numpy.dot(ZZ, Z)) > 0.999): dZ_list.append(dZ) dZ = min(dZ_list) #print "Z = "+str(Z) #print "dZ = "+str(dZ) #print "numpy.dot(Y, X) = "+str(numpy.dot(Y, X)) #print "numpy.dot(Z, X) = "+str(numpy.dot(Z, X)) #print "numpy.dot(Z, Y) = "+str(numpy.dot(Z, Y)) points = vtk.vtkPoints() point_locator = vtk.vtkPointLocator() point_locator.InitPointInsertion(points, ugrid.GetBounds()) radius = min(dX, dY, dZ) / 2 cell = vtk.vtkHexahedron() cell_array = vtk.vtkCellArray() P = numpy.empty(3) PPP = numpy.empty(3) for k_point in xrange(n_points): ugrid.GetPoint(k_point, P) point_ids = [] for pm_Z in [-1, +1]: for pm_Y in [-1, +1]: if (pm_Y == -1): pm_X_list = [-1, +1] elif (pm_Y == +1): pm_X_list = [+1, -1] for pm_X in pm_X_list: PP = P + pm_Z * (dZ / 2) * Z + pm_Y * ( dY / 2) * Y + pm_X * (dX / 2) * X if (points.GetNumberOfPoints() == 0): point_id = point_locator.InsertNextPoint(PP) else: point_id = point_locator.FindClosestInsertedPoint(PP) points.GetPoint(point_id, PPP) dist = numpy.linalg.norm(PPP - PP) if (dist > radius): point_id = point_locator.InsertNextPoint(PP) #point_id = point_locator.IsInsertedPoint(PP) #if (point_id == -1): #point_id = point_locator.InsertNextPoint(PP) point_ids.append(point_id) for i in xrange(8): cell.GetPointIds().SetId(i, point_ids[i]) cell_array.InsertNextCell(cell) new_ugrid = vtk.vtkUnstructuredGrid() new_ugrid.SetPoints(points) new_ugrid.SetCells(vtk.VTK_HEXAHEDRON, cell_array) n_arrays = ugrid.GetPointData().GetNumberOfArrays() for k_array in xrange(n_arrays): new_ugrid.GetCellData().AddArray( ugrid.GetPointData().GetArray(k_array)) return new_ugrid