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
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
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()
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()
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
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
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