Commit 1b5f8273 authored by Felipe Bordeu's avatar Felipe Bordeu Committed by Felipe Bordeu
Browse files

(vtkBridge.py) source reformatting

parent 36d799d9
Loading
Loading
Loading
Loading
+244 −215
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ try:
except:
    try:
        # faster import only needed classes
        from vtkmodules.vtkCommonCore import vtkPoints, vtkIdList#, vtkUnsignedCharArray, , vtkIdTypeArray
        from vtkmodules.vtkCommonCore import vtkPoints, vtkIdList
        from vtkmodules.vtkCommonDataModel import vtkPolyData, vtkUnstructuredGrid, vtkImageData, vtkCellArray
        from vtkmodules.util import numpy_support
    except:
@@ -129,12 +129,14 @@ elementNameByVtkNumber[11] = ElementNames.Hexaedron_8 #voxel
# converted to a tag. the first type is used to encode tags in vtk
tagsTypes = [np.int8, np.uint8, int]


def VtkFieldToNumpyField(support: UnstructuredMesh, vtkField) -> np.ndarray:
    if support.IsConstantRectilinear():
        return VtkFieldToNumpyFieldWithDims(vtkField, dimensions=support.GetDimensions())
    else:
        return VtkFieldToNumpyFieldWithDims(vtkField)


def VtkFieldToNumpyFieldWithDims(vtkField, dimensions=None):
    from vtkmodules.util import numpy_support
    from vtkmodules.vtkCommonCore import vtkStringArray
@@ -158,12 +160,14 @@ def VtkFieldToNumpyFieldWithDims(vtkField,dimensions=None):

    return (name, data)


def NumpyFieldToVtkField(support: UnstructuredMesh, fieldData: ArrayLike, fieldName: str):
    if support.IsConstantRectilinear():
        return NumpyFieldToVtkFieldWithDims(fieldData, fieldName, support.GetDimensions())
    else:
        return NumpyFieldToVtkFieldWithDims(fieldData, fieldName)


def NumpyFieldToVtkFieldWithDims(fieldData: ArrayLike, fieldName: str, dimensions=None):
    from vtkmodules.util import numpy_support
    from vtkmodules.vtkCommonCore import vtkStringArray
@@ -192,7 +196,8 @@ def NumpyFieldToVtkFieldWithDims(fieldData: ArrayLike, fieldName: str, dimension
                dims = newshape
            dims.append(fieldData.shape[1])
            dataView.shape = tuple(dims)
          VTK_data = numpy_support.numpy_to_vtk(num_array=np.swapaxes(dataView,0,2).ravel(), deep=True, array_type=outputtype)
            VTK_data = numpy_support.numpy_to_vtk(num_array=np.swapaxes(
                dataView, 0, 2).ravel(), deep=True, array_type=outputtype)
        else:
            VTK_data = numpy_support.numpy_to_vtk(num_array=fieldData, deep=True, array_type=outputtype)
        VTK_data.SetNumberOfComponents(fieldData.shape[1])
@@ -208,17 +213,20 @@ def NumpyFieldToVtkFieldWithDims(fieldData: ArrayLike, fieldName: str, dimension
                # elemfield
                newshape = tuple([(x-1 if x-1 > 0 else 1) for x in dimensions])
                dataView.shape = newshape
          VTK_data = numpy_support.numpy_to_vtk(num_array=np.swapaxes(dataView,0,2).ravel(), deep=True, array_type=outputtype)
            VTK_data = numpy_support.numpy_to_vtk(num_array=np.swapaxes(
                dataView, 0, 2).ravel(), deep=True, array_type=outputtype)
        else:
            VTK_data = numpy_support.numpy_to_vtk(num_array=fieldData, deep=True, array_type=outputtype)
    VTK_data.SetName(fieldName)
    return VTK_data


def ApplyVtkPipeline(mesh: UnstructuredMesh, op: Callable) -> UnstructuredMesh:
    vtkMesh = MeshToVtk(mesh)
    vtkOutputMesh = op(vtkMesh)
    return VtkToMesh(vtkOutputMesh)


def PlotMesh(mesh):  # pragma: no cover
    from vtkmodules.vtkFiltersGeometry import vtkGeometryFilter
    from vtkmodules.vtkRenderingCore import vtkPolyDataMapper, vtkActor, vtkRenderer, vtkRenderWindow, vtkRenderWindowInteractor, vtkColorTransferFunction
@@ -230,7 +238,6 @@ def PlotMesh(mesh):# pragma: no cover
    import vtkmodules.vtkRenderingOpenGL2
    import vtkmodules.vtkRenderingFreeType


    from BasicTools.Containers.MeshBase import MeshBase

    if isinstance(mesh, MeshBase):
@@ -325,7 +332,7 @@ def PlotMesh(mesh):# pragma: no cover
    buttonWidget.AddObserver('StateChangedEvent', listener.processStateChangeEvent)

    buttonRepresentation = vtkTexturedButtonRepresentation2D()
    buttonRepresentation.SetNumberOfStates(1);
    buttonRepresentation.SetNumberOfStates(1)
    r = vtkPNGReader()

    fileName = GetTestDataPath()+"Next.png"
@@ -340,7 +347,7 @@ def PlotMesh(mesh):# pragma: no cover

    buttonWidget.SetRepresentation(buttonRepresentation)

    buttonWidget.On();
    buttonWidget.On()

    iren.Initialize()

@@ -359,8 +366,8 @@ def PlotMesh(mesh):# pragma: no cover
    iren.TerminateApp()
    del renWin, iren

def MeshToVtk(mesh, vtkobject=None, TagsAsFields=False):

def MeshToVtk(mesh, vtkobject=None, TagsAsFields=False):

    # From www.vtk;org/wp-content/updloads/2015/04/file-formats.pdf

@@ -398,7 +405,7 @@ def MeshToVtk(mesh, vtkobject=None, TagsAsFields=False):
            return output

        output.Allocate(mesh.GetNumberOfElements())
        ##copy points
        # copy points

        VTK_originalIDNodes = NumpyFieldToVtkField(mesh, mesh.originalIDNodes, "originalIds")
        output.GetPointData().AddArray(VTK_originalIDNodes)
@@ -426,7 +433,8 @@ def MeshToVtk(mesh, vtkobject=None, TagsAsFields=False):
                nbElement = elementContainer.GetNumberOfElements()

                cellTypes[cpt:cpt+nbElement] = vtkNumberByElementName[elementsName]
                offsets[cpt:cpt+nbElement] = offsetcpt + np.arange(nbElement)*elementContainer.GetNumberOfNodesPerElement()
                offsets[cpt:cpt+nbElement] = offsetcpt + \
                    np.arange(nbElement)*elementContainer.GetNumberOfNodesPerElement()

                offsetcpt += elementContainer.GetNumberOfNodesPerElement()*nbElement
                cpt += nbElement
@@ -441,7 +449,6 @@ def MeshToVtk(mesh, vtkobject=None, TagsAsFields=False):
                connectivity[offsetcpt:offsetcpt+nbObjects] = elementContainer.connectivity.flatten()
                offsetcpt += nbObjects


            offsets = numpy_support.numpy_to_vtkIdTypeArray(offsets, deep=True)
            connectivity = numpy_support.numpy_to_vtkIdTypeArray(connectivity, deep=True)

@@ -465,8 +472,10 @@ def MeshToVtk(mesh, vtkobject=None, TagsAsFields=False):
            if data is None:  # pragma: no cover
                continue
            if np.size(data)//mesh.GetNumberOfNodes() != np.size(data)/mesh.GetNumberOfNodes():
                print("field ("+str(name)+") is not consistent : it has " + str(np.size(data)) +" values and the mesh has " +str(mesh.GetNumberOfNodes())+ " nodes" )
                raise Exception("field ("+str(name)+") is not consistent : it has " + str(np.size(data)) +" values and the mesh has " +str(mesh.GetNumberOfNodes())+ " nodes" )
                print("field ("+str(name)+") is not consistent : it has " + str(np.size(data)) +
                      " values and the mesh has " + str(mesh.GetNumberOfNodes()) + " nodes")
                raise Exception("field ("+str(name)+") is not consistent : it has " + str(np.size(data)
                                                                                          ) + " values and the mesh has " + str(mesh.GetNumberOfNodes()) + " nodes")

            VTK_data = NumpyFieldToVtkField(mesh, data, name)
            output.GetPointData().AddArray(VTK_data)
@@ -491,7 +500,8 @@ def MeshToVtk(mesh, vtkobject=None, TagsAsFields=False):
                continue

            if np.size(data)/mesh.GetNumberOfElements() != np.size(data)//mesh.GetNumberOfElements():  # pragma: no cover
                print("field ("+str(name)+") is not consistent : it has " + str(np.size(data)) +" values and the mesh has " +str(mesh.GetNumberOfElements())+ " elements" )
                print("field ("+str(name)+") is not consistent : it has " + str(np.size(data)) +
                      " values and the mesh has " + str(mesh.GetNumberOfElements()) + " elements")
                continue

            VTK_data = NumpyFieldToVtkField(mesh, data, name)
@@ -510,6 +520,7 @@ def MeshToVtk(mesh, vtkobject=None, TagsAsFields=False):

    return output


def VtkToMeshOnlyMeta(vtkmesh, FieldsAsTags=False):
    from vtkmodules.util import numpy_support

@@ -576,8 +587,8 @@ def VtkToMeshOnlyMeta(vtkmesh, FieldsAsTags=False):
                res.nodeFields.append(name)
    return res

def AddCellsFromVtkCellArrayToMesh(cells, cellTypesArray:ArrayLike, out:UnstructuredMesh, originalIdsOffset=0):

def AddCellsFromVtkCellArrayToMesh(cells, cellTypesArray: ArrayLike, out: UnstructuredMesh, originalIdsOffset=0):
    """Function to migrate cells from a vtkCellArray to a BasicTools Unstructured Mesh

    Parameters
@@ -614,7 +625,8 @@ def AddCellsFromVtkCellArrayToMesh(cells, cellTypesArray:ArrayLike, out:Unstruct
        nbNewElements = len(index)
        cpt1 = cpt0+nbNewElements

        mask=np.arange(numberOfNodesPerElement, dtype=PBasicIndexType)*np.ones((len(index),numberOfNodesPerElement), dtype=PBasicIndexType)+offsets[index,None]
        mask = np.arange(numberOfNodesPerElement, dtype=PBasicIndexType) * \
            np.ones((len(index), numberOfNodesPerElement), dtype=PBasicIndexType)+offsets[index, None]
        localConnectivity = connectivity[mask]
        localConnectivity.shape = (nbNewElements, numberOfNodesPerElement)
        elements.connectivity[cpt0:cpt1, :] = localConnectivity
@@ -630,6 +642,7 @@ def AddCellsFromVtkCellArrayToMesh(cells, cellTypesArray:ArrayLike, out:Unstruct

    return nbNewElements


def VtkToMesh(vtkmesh, meshobject=None, FieldsAsTags=True):

    if meshobject is None:
@@ -674,7 +687,6 @@ def VtkToMesh(vtkmesh, meshobject=None, FieldsAsTags=True):
        out.originalIDNodes = None
        AddCellsFromVtkCellArrayToMesh(vtkmesh.GetCells(), vtkmesh.GetCellTypesArray(), out)


    if vtkmesh.GetPointData().GetNumberOfArrays():
        for f in range(vtkmesh.GetPointData().GetNumberOfArrays()):
            data = vtkmesh.GetPointData().GetArray(f)
@@ -720,6 +732,7 @@ def VtkToMesh(vtkmesh, meshobject=None, FieldsAsTags=True):

    return out


def GetInputVtk(request, inInfoVec, outInfoVec, port=0):
    from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid, vtkPolyData
    input0 = vtkUnstructuredGrid.GetData(inInfoVec[port])
@@ -727,10 +740,12 @@ def GetInputVtk(request, inInfoVec, outInfoVec, port=0):
        input0 = vtkPolyData.GetData(inInfoVec[port])
    return input0


def GetInputBasicTools(request, inInfoVec, outInfoVec, FieldsAsTags=False, port=0):
    vtkobj = GetInputVtk(request, inInfoVec, outInfoVec, port=port)
    return VtkToMesh(vtkobj, FieldsAsTags=FieldsAsTags)


def GetOutputVtk(request, inInfoVec, outInfoVec, copyAttr=True, outputNumber=0):
    from vtkmodules.vtkCommonDataModel import vtkUnstructuredGrid
    output = vtkUnstructuredGrid.GetData(outInfoVec, outputNumber)
@@ -739,10 +754,12 @@ def GetOutputVtk(request, inInfoVec, outInfoVec, copyAttr = True, outputNumber=
        output.CopyAttributes(input0)
    return output


def SetOutputBasicTools(request, inInfoVec, outInfoVec, outMesh, TagsAsFields=False):
    output = GetOutputVtk(request, inInfoVec, outInfoVec, False)
    MeshToVtk(outMesh, output, TagsAsFields=TagsAsFields)


def VtkToMeshMultiblock(vtkObject, OP=VtkToMesh):
    if input.IsA("vtkMultiBlockDataSet"):
        res = list()
@@ -753,6 +770,7 @@ def VtkToMeshMultiblock(vtkObject,OP=VtkToMesh):
    else:
        return OP(input)


def CellDataToPoint(mesh: UnstructuredMesh, cellfields: np.ndarray) -> np.ndarray:
    """Applies the CellDataToPointData from vtk.
    Supported only for the dimensionality of the mesh (no mix of elements of different
@@ -790,12 +808,14 @@ def CellDataToPoint(mesh:UnstructuredMesh, cellfields:np.ndarray) -> np.ndarray:

    return np.array(res)


def ReadMeshAndPopulateVtkObject(filename, vtkobject=None, TagsAsFields=False):  # pragma: no cover
    from BasicTools.IO.UniversalReader import ReadMesh as UReadMesh
    mesh = UReadMesh(filename)
    from BasicTools.Bridges.vtkBridge import MeshToVtk
    return MeshToVtk(mesh, vtkobject, TagsAsFields=TagsAsFields)


def CheckIntegrity_VtkToMesh(GUI=False):
    from BasicTools.Containers.UnstructuredMeshCreationTools import CreateMeshOf
    points = [[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]]
@@ -803,7 +823,8 @@ def CheckIntegrity_VtkToMesh(GUI=False):
    res = CreateMeshOf(points, tet, elemName=ElementNames.Tetrahedron_4)
    res.nodeFields = {"x": res.nodes[:, 0].flatten(), "Pos": res.nodes}
    res.nodesTags.CreateTag("FirstPoint").AddToTag(0)
    res.elemFields = {"SecondPoint": res.GetElementsOfType(ElementNames.Tetrahedron_4).connectivity[:,1].flatten().astype(float), "conn": res.GetElementsOfType(ElementNames.Tetrahedron_4).connectivity }
    res.elemFields = {"SecondPoint": res.GetElementsOfType(ElementNames.Tetrahedron_4).connectivity[:, 1].flatten().astype(
        float), "conn": res.GetElementsOfType(ElementNames.Tetrahedron_4).connectivity}
    res.GetElementsOfType(ElementNames.Tetrahedron_4).tags.CreateTag("FirstTetrahedron").AddToTag(0)
    sol = MeshToVtk(res, TagsAsFields=True)

@@ -820,12 +841,14 @@ def CheckIntegrity_VtkToMesh(GUI=False):
        raise (Exception("The meshes are not equal"))
    return 'ok'


def CheckIntegrity_VtkToMesh2D(GUI=False):
    res = CreateMeshOfTriangles([[0, 0], [1, 0], [1, 1], [1, 1]], [[0, 1, 2], [0, 2, 3]])

    res.nodeFields = {"x": res.nodes[:, 0].flatten(), "Pos": res.nodes}
    res.nodesTags.CreateTag("FirstPoint").AddToTag(0)
    res.elemFields = {"SecondPoint": res.GetElementsOfType(ElementNames.Triangle_3).connectivity[:,1].flatten().astype(float), "conn": res.GetElementsOfType(ElementNames.Triangle_3).connectivity }
    res.elemFields = {"SecondPoint": res.GetElementsOfType(ElementNames.Triangle_3).connectivity[:, 1].flatten().astype(
        float), "conn": res.GetElementsOfType(ElementNames.Triangle_3).connectivity}
    res.GetElementsOfType(ElementNames.Triangle_3).tags.CreateTag("FirstTriangle").AddToTag(0)
    sol = MeshToVtk(res, TagsAsFields=True)

@@ -847,7 +870,8 @@ def CheckIntegrity_MeshToVtk(GUI=False):
    res = CreateMeshOfTriangles([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]], [[0, 1, 2], [0, 2, 3]])
    res.nodeFields = {"x": res.nodes[:, 0].flatten(), "Pos": res.nodes}
    res.nodesTags.CreateTag("FirstPoint").AddToTag(0)
    res.elemFields = {"SecondPoint": res.GetElementsOfType(ElementNames.Triangle_3).connectivity[:,1].flatten(), "conn": res.GetElementsOfType(ElementNames.Triangle_3).connectivity, "FE Names":np.array(['c2d3','c2d3'],dtype=np.str_) }
    res.elemFields = {"SecondPoint": res.GetElementsOfType(ElementNames.Triangle_3).connectivity[:, 1].flatten(
    ), "conn": res.GetElementsOfType(ElementNames.Triangle_3).connectivity, "FE Names": np.array(['c2d3', 'c2d3'], dtype=np.str_)}
    res.GetElementsOfType(ElementNames.Triangle_3).tags.CreateTag("FirstTriangle").AddToTag(0)
    sol = MeshToVtk(res, TagsAsFields=True)
    print(sol)
@@ -856,7 +880,7 @@ def CheckIntegrity_MeshToVtk(GUI=False):
    if not IsClose(res, resII):  # pragma: no cover
        raise (Exception("The meshes are not equal"))

    ## test a 2D mesh
    # test a 2D mesh
    res = CreateMeshOfTriangles([[0, 0], [1, 0], [0, 1], [1, 1]], [[0, 1, 2], [2, 1, 3]])
    if GUI:  # pragma: no cover
        res.nodeFields["Field1"] = np.array([30, 20, 30, 1])
@@ -868,6 +892,7 @@ def CheckIntegrity_MeshToVtk(GUI=False):

    return "OK"


def CheckIntegrity_ConstantRectilinearMesh(GUI=False):
    print("*** CheckIntegrity_ConstantRectilinearMesh **** ")
    from BasicTools.Containers.ConstantRectilinearMeshTools import CreateMesh
@@ -888,8 +913,10 @@ def CheckIntegrity_ConstantRectilinearMesh(GUI=False):
    if not IsClose(crm, crmII):  # pragma: no cover
        raise (Exception("The meshes are not equal"))


def checkIntegrity_ApplyVtkPipeline(GUI):
    res = CreateMeshOfTriangles([[0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]], [[0, 1, 2], [0, 2, 3]])

    class op():
        def __call__(self, vtkinput):
            from vtkmodules.vtkFiltersModeling import vtkLinearExtrusionFilter
@@ -918,6 +945,7 @@ def CheckIntegrity_CellDataToPoint(GUI = False):
    CellDataToPoint(mesh, cellField)
    return "ok"


def CheckIntegrity(GUI=False):
    try:
        numpy_support
@@ -932,5 +960,6 @@ def CheckIntegrity(GUI=False):
    CheckIntegrity_CellDataToPoint(GUI)
    return 'ok'


if __name__ == '__main__':
    print(CheckIntegrity(True))  # pragma: no cover