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])
예제 #2
0
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])
예제 #3
0
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
예제 #5
0
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