Esempio n. 1
0
def readMeshFile(filename, verbose=False):
    """Read mesh file.
    The input format is determined by file name extension. Degenerate data gets
    removed and polygons get split into triangles to support varios restrictive
    output formats."""

    informat = path.splitext(options.infilename)[1].strip('.')
    # set reader based on filename extension
    if informat == 'stl':
        reader = vtk.vtkSTLReader()
    elif informat == 'vtk':
        reader = vtk.vtkPolyDataReader()
    elif informat == 'obj':
        reader = vtk.vtkMNIObjectReader()
    #elif informat=='tag':
    #    reader = vtk.vtkMNITagPointReader()
    else:
        raise ValueError('cannot read input format' + informat)
    reader.SetFileName(filename)

    # merge duplicate points, and/or remove unused points and/or remove degenerate cells
    clean = vtk.vtkCleanPolyData()
    clean.SetInputConnection(reader.GetOutputPort())

    # convert input polygons and strips to triangles
    triangles = vtk.vtkTriangleFilter()
    triangles.SetInputConnection(clean.GetOutputPort())

    #triangles = reader.GetOutputPort()  # skipping above 'cleaning' doesn't work
    if verbose:
        print "read", filename

    return triangles
Esempio n. 2
0
def readMeshFile(filename, verbose=False):
    """Read mesh file.
    The input format is determined by file name extension. Degenerate data gets
    removed and polygons get split into triangles to support varios restrictive
    output formats."""

    informat = path.splitext(options.infilename)[1].strip('.')
    # set reader based on filename extension
    if informat=='stl':
        reader = vtk.vtkSTLReader()
    elif informat=='vtk':
        reader = vtk.vtkPolyDataReader()
    elif informat=='obj':
        reader = vtk.vtkMNIObjectReader()
    #elif informat=='tag':
    #    reader = vtk.vtkMNITagPointReader()
    else:
        raise ValueError('cannot read input format' + informat)
    reader.SetFileName(filename)

    # merge duplicate points, and/or remove unused points and/or remove degenerate cells
    clean = vtk.vtkCleanPolyData()
    clean.SetInputConnection(reader.GetOutputPort())

    # convert input polygons and strips to triangles
    triangles = vtk.vtkTriangleFilter()
    triangles.SetInputConnection(clean.GetOutputPort())

    #triangles = reader.GetOutputPort()  # skipping above 'cleaning' doesn't work
    if verbose:
        print "read", filename

    return triangles
Esempio n. 3
0
def load_polydata(file_name, is_mni_obj=False):
    """Load a vtk polydata to a supported format file.

    Supported file formats are OBJ, VTK, FIB, PLY, STL and XML

    Parameters
    ----------
    file_name : string
    is_mni_obj : bool

    Returns
    -------
    output : vtkPolyData

    """
    # get file extension (type) lower case
    file_extension = file_name.split(".")[-1].lower()

    if file_extension == "vtk":
        reader = vtk.vtkPolyDataReader()
    elif file_extension == "fib":
        reader = vtk.vtkPolyDataReader()
    elif file_extension == "ply":
        reader = vtk.vtkPLYReader()
    elif file_extension == "stl":
        reader = vtk.vtkSTLReader()
    elif file_extension == "xml":
        reader = vtk.vtkXMLPolyDataReader()
    elif file_extension == "obj" and is_mni_obj:
        reader = vtk.vtkMNIObjectReader()
    elif file_extension == "obj":
        try:  # try to read as a normal obj
            reader = vtk.vtkOBJReader()
        except Exception:  # than try load a MNI obj format
            reader = vtk.vtkMNIObjectReader()
    else:
        raise IOError("polydata " + file_extension + " is not suported")

    reader.SetFileName(file_name)
    reader.Update()
    return reader.GetOutput()
Esempio n. 4
0
def readPolydata(file_name):
    """ Load a vtk polydata to a supported format file

    Parameters
    ----------
        file_name : string

    Returns
    -------
        output : vtkPolyData
    """
    # get file extension (type) lower case
    file_extension = file_name.split(".")[-1].lower()

    if file_extension == "vtk":
        try:
            return readLegacyVTK(file_name)[0]
        except:
            reader = vtk.vtkPolyDataReader()
    elif file_extension == "fib":
        reader = vtk.vtkPolyDataReader()
    elif file_extension == "ply":
        reader = vtk.vtkPLYReader()
    elif file_extension == "stl":
        reader = vtk.vtkSTLReader()
    elif file_extension == "vtp":
        reader = vtk.vtkXMLPolyDataReader()
    elif file_extension == "vti":
        return readDataSet(file_name, vtk.vtkXMLImageDataReader)
    elif file_extension == "vts":
        return readDataSet(file_name, vtk.vtkXMLStructuredGridReader)
    elif file_extension == "vtu":
        return readDataSet(file_name, vtk.vtkXMLUnstructuredGridReader)
    elif file_extension == "vtr":
        return readDataSet(file_name, vtk.vtkXMLRectilinearGridReader)
    elif file_extension == "xml":
        reader = vtk.vtkXMLPolyDataReader()
    elif file_extension == "obj":
        try:  # try to read as a normal obj
            reader = vtk.vtkOBJReader()
        except:  # than try load a MNI obj format
            reader = vtk.vtkMNIObjectReader()
    else:
        raise Exception("polydata " + file_extension + " is not suported")

    reader.SetFileName(file_name)
    reader.Update()
    return reader.GetOutput()
Esempio n. 5
0
File: io.py Progetto: bosecodes/fury
def load_polydata(file_name):
    """Load a vtk polydata to a supported format file.
    Supported file formats are VTK, VTP, FIB, PLY, STL XML and OBJ

    Parameters
    ----------
    file_name : string

    Returns
    -------
    output : vtkPolyData

    """
    file_extension = file_name.split(".")[-1].lower()

    poly_reader = {
        "vtk": vtk.vtkPolyDataReader,
        "vtp": vtk.vtkXMLPolyDataWriter,
        "fib": vtk.vtkPolyDataReader,
        "ply": vtk.vtkPLYReader,
        "stl": vtk.vtkSTLReader,
        "xml": vtk.vtkXMLPolyDataReader
    }

    if file_extension in poly_reader.keys():
        reader = poly_reader.get(file_extension)()
    elif file_extension == "obj":
        # Special case, since there is two obj format
        reader = vtk.vtkOBJReader()
        reader.SetFileName(file_name)
        reader.Update()
        if reader.GetOutput().GetNumberOfCells() == 0:
            reader = vtk.vtkMNIObjectReader()
    else:
        raise IOError("." + file_extension + " is not supported by FURY")

    reader.SetFileName(file_name)
    reader.Update()
    return reader.GetOutput()
def addColors(infilename, outfilename, colorfilename=None, colorstring=None,
                                                    binary=True, verbose=False):
    """add color array"""

    outformat = path.splitext(outfilename)[1].strip('.')
    if outformat!='ply':
        raise ValueError('colors are only supported for PLY format')

    informat = path.splitext(infilename)[1].strip('.')
    # set reader based on filename extension
    if informat=='stl':
        reader = vtk.vtkSTLReader()
    elif informat=='vtk':
        reader = vtk.vtkPolyDataReader()
    elif informat=='obj':
        reader = vtk.vtkMNIObjectReader()
    elif informat=='ply':
        reader = vtk.vtkPLYReader()
    elif informat=='vtp':
        reader = vtk.vtkXMLPolyDataReader()
    else:
        raise ValueError('cannot read input format: ' + informat)
    reader.SetFileName(infilename)
    reader.Update()

    #N = reader.GetOutput().GetNumberOfPolys()
    N = reader.GetOutput().GetNumberOfPoints()
    if verbose:
        print("read %i points (vertices)" % (N,))

    if colorfilename:
        colorar = readColorFile(colorfilename)
        if N != colorar.shape[0]:
            raise ValueError('number of rows in color file does not match' +
                             'number of points in mesh file')
    elif colorstring:
        color = [int(i) for i in colorstring.split()]
        colorar = np.ones((N,3)) * np.array(color)

    Colors = vtk.vtkUnsignedCharArray()
    Colors.SetNumberOfComponents(3)
    Colors.SetName("Colors")

    for i in range(0,N):
        Colors.InsertNextTuple3(*colorar[i,:])

    polydata = vtk.vtkPolyData()
    polydata = reader.GetOutput()

    polydata.GetPointData().SetScalars(Colors)
    polydata.Modified()

    writer = vtk.vtkPLYWriter()
    writer.SetArrayName("Colors")
    writer.SetInputData(polydata)
    writer.SetFileName(outfilename)
    if binary:
        if verbose: print('setting output to binary')
        writer.SetFileTypeToBinary()
    else:
        if verbose: print('setting output to ascii')
        writer.SetFileTypeToASCII()
    err = writer.Write()
def readMeshFile(filename, clean=True, verbose=False, recompute_normals=True):
    """Read mesh file.
    The input format is determined by file name extension.
    Polygons get split into triangles to support various restrictive output
    formats.
    If clean, degenerate data gets removed."""

    informat = path.splitext(options.infilename)[1].strip('.')
    # set reader based on filename extension
    if informat=='stl':
        reader = vtk.vtkSTLReader()
    elif informat=='vtk':
        reader = vtk.vtkPolyDataReader()
    elif informat=='obj':
        reader = vtk.vtkMNIObjectReader()
    elif informat=='ply':
        reader = vtk.vtkPLYReader()
    elif informat=='vtp':
        reader = vtk.vtkXMLPolyDataReader()
    #elif informat=='tag':
    #    reader = vtk.vtkMNITagPointReader()
    else:
        raise ValueError('cannot read input format: ' + informat)
    reader.SetFileName(filename)
    reader.Update()

    if verbose:
        print("read %i polygons from file %s" % \
                               (reader.GetOutput().GetNumberOfPolys(), filename))

    # merge duplicate points, and/or remove unused points and/or remove degenerate cells
    if clean:
        polydata = vtk.vtkCleanPolyData()
        polydata.SetInputConnection(reader.GetOutputPort())
        poly_data_algo = polydata
        if verbose:
            print("cleaned poly data")
    else:
        poly_data_algo = reader

    # convert input polygons and strips to triangles
    triangles = vtk.vtkTriangleFilter()
    triangles.SetInputConnection(poly_data_algo.GetOutputPort())

    if recompute_normals:
        normals = vtk.vtkPolyDataNormals()
        normals.SetInputConnection(triangles.GetOutputPort())

        normals.SplittingOff()
        normals.ComputePointNormalsOn()
        normals.AutoOrientNormalsOn()
        normals.ConsistencyOn()
        normals.NonManifoldTraversalOn()
        if verbose:
            print("recomputed normals")
            print("finished reading", filename)
        return normals
    else:
        if verbose:
            print("finished reading", filename)
        return triangles
Esempio n. 8
0
    ren1 = vtk.vtkRenderer()
    ren1.SetViewport(0, 0, 0.33, 1)
    ren2 = vtk.vtkRenderer()
    ren2.SetViewport(0.33, 0, 0.67, 1)
    ren3 = vtk.vtkRenderer()
    ren3.SetViewport(0.67, 0, 1, 1)
    renWin = vtk.vtkRenderWindow()
    renWin.SetSize(600, 200)
    renWin.AddRenderer(ren1)
    renWin.AddRenderer(ren2)
    renWin.AddRenderer(ren3)
    renWin.SetMultiSamples(0)
    property0 = vtk.vtkProperty()
    property0.SetDiffuseColor(0.95, 0.90, 0.70)
    filename = VTK_DATA_ROOT + "/Data/mni-surface-mesh.obj"
    asciiReader = vtk.vtkMNIObjectReader()
    property1 = asciiReader.GetProperty()
    if (asciiReader.CanReadFile(str(filename)) != 0):
        asciiReader.SetFileName(str(filename))

        # this is just to remove the normals, to increase coverage,
        # i.e. by forcing the writer to generate normals
        removeNormals = vtk.vtkClipClosedSurface()
        removeNormals.SetInputConnection(asciiReader.GetOutputPort())

        # this is to make triangle strips, also to increase coverage,
        # because it forces the writer to decompose the strips
        stripper = vtk.vtkStripper()
        stripper.SetInputConnection(removeNormals.GetOutputPort())

        # test binary writing and reading for polygons
Esempio n. 9
0
    ren1 = vtk.vtkRenderer()
    ren1.SetViewport(0, 0, 0.33, 1)
    ren2 = vtk.vtkRenderer()
    ren2.SetViewport(0.33, 0, 0.67, 1)
    ren3 = vtk.vtkRenderer()
    ren3.SetViewport(0.67, 0, 1, 1)
    renWin = vtk.vtkRenderWindow()
    renWin.SetSize(600, 200)
    renWin.AddRenderer(ren1)
    renWin.AddRenderer(ren2)
    renWin.AddRenderer(ren3)
    renWin.SetMultiSamples(0)
    property0 = vtk.vtkProperty()
    property0.SetDiffuseColor(0.95, 0.90, 0.70)
    filename = VTK_DATA_ROOT + "/Data/mni-surface-mesh.obj"
    asciiReader = vtk.vtkMNIObjectReader()
    property1 = asciiReader.GetProperty()
    if (asciiReader.CanReadFile(str(filename)) != 0):
        asciiReader.SetFileName(str(filename))

        # this is just to remove the normals, to increase coverage,
        # i.e. by forcing the writer to generate normals
        removeNormals = vtk.vtkClipClosedSurface()
        removeNormals.SetInputConnection(asciiReader.GetOutputPort())

        # this is to make triangle strips, also to increase coverage,
        # because it forces the writer to decompose the strips
        stripper = vtk.vtkStripper()
        stripper.SetInputConnection(removeNormals.GetOutputPort())

        # test binary writing and reading for polygons
Esempio n. 10
0
def addColors(infilename,
              outfilename,
              colorfilename=None,
              colorstring=None,
              binary=True,
              verbose=False):
    """add color array"""

    outformat = path.splitext(outfilename)[1].strip('.')
    if outformat != 'ply':
        raise ValueError('colors are only supported for PLY format')

    informat = path.splitext(infilename)[1].strip('.')
    # set reader based on filename extension
    if informat == 'stl':
        reader = vtk.vtkSTLReader()
    elif informat == 'vtk':
        reader = vtk.vtkPolyDataReader()
    elif informat == 'obj':
        reader = vtk.vtkMNIObjectReader()
    elif informat == 'ply':
        reader = vtk.vtkPLYReader()
    elif informat == 'vtp':
        reader = vtk.vtkXMLPolyDataReader()
    else:
        raise ValueError('cannot read input format: ' + informat)
    reader.SetFileName(infilename)
    reader.Update()

    #N = reader.GetOutput().GetNumberOfPolys()
    N = reader.GetOutput().GetNumberOfPoints()
    if verbose:
        print("read %i points (vertices)" % (N, ))

    if colorfilename:
        colorar = readColorFile(colorfilename)
        if N != colorar.shape[0]:
            raise ValueError('number of rows in color file does not match' +
                             'number of points in mesh file')
    elif colorstring:
        color = [int(i) for i in colorstring.split()]
        colorar = np.ones((N, 3)) * np.array(color)

    Colors = vtk.vtkUnsignedCharArray()
    Colors.SetNumberOfComponents(3)
    Colors.SetName("Colors")

    for i in range(0, N):
        Colors.InsertNextTuple3(*colorar[i, :])

    polydata = vtk.vtkPolyData()
    polydata = reader.GetOutput()

    polydata.GetPointData().SetScalars(Colors)
    polydata.Modified()

    writer = vtk.vtkPLYWriter()
    writer.SetArrayName("Colors")
    writer.SetInputData(polydata)
    writer.SetFileName(outfilename)
    if binary:
        if verbose: print('setting output to binary')
        writer.SetFileTypeToBinary()
    else:
        if verbose: print('setting output to ascii')
        writer.SetFileTypeToASCII()
    err = writer.Write()
Esempio n. 11
0
def readMeshFile(filename, clean=True, verbose=False, recompute_normals=True):
    """Read mesh file.
    The input format is determined by file name extension.
    Polygons get split into triangles to support various restrictive output
    formats.
    If clean, degenerate data gets removed."""

    informat = path.splitext(options.infilename)[1].strip('.')
    # set reader based on filename extension
    if informat == 'stl':
        reader = vtk.vtkSTLReader()
    elif informat == 'vtk':
        reader = vtk.vtkPolyDataReader()
    elif informat == 'obj':
        reader = vtk.vtkMNIObjectReader()
    elif informat == 'ply':
        reader = vtk.vtkPLYReader()
    elif informat == 'vtp':
        reader = vtk.vtkXMLPolyDataReader()
    #elif informat=='tag':
    #    reader = vtk.vtkMNITagPointReader()
    else:
        raise ValueError('cannot read input format: ' + informat)
    reader.SetFileName(filename)
    reader.Update()

    if verbose:
        print("read %i polygons from file %s" % \
                               (reader.GetOutput().GetNumberOfPolys(), filename))

    # merge duplicate points, and/or remove unused points and/or remove degenerate cells
    if clean:
        polydata = vtk.vtkCleanPolyData()
        polydata.SetInputConnection(reader.GetOutputPort())
        poly_data_algo = polydata
        if verbose:
            print("cleaned poly data")
    else:
        poly_data_algo = reader

    # convert input polygons and strips to triangles
    triangles = vtk.vtkTriangleFilter()
    triangles.SetInputConnection(poly_data_algo.GetOutputPort())

    if recompute_normals:
        normals = vtk.vtkPolyDataNormals()
        normals.SetInputConnection(triangles.GetOutputPort())

        normals.SplittingOff()
        normals.ComputePointNormalsOn()
        normals.AutoOrientNormalsOn()
        normals.ConsistencyOn()
        normals.NonManifoldTraversalOn()
        if verbose:
            print("recomputed normals")
            print("finished reading", filename)
        return normals
    else:
        if verbose:
            print("finished reading", filename)
        return triangles