Example #1
2
    def OnExportSurface(self, pubsub_evt):
        filename, filetype = pubsub_evt.data
        if (filetype == const.FILETYPE_STL) or\
           (filetype == const.FILETYPE_VTP) or\
           (filetype == const.FILETYPE_PLY) or\
           (filetype == const.FILETYPE_STL_ASCII):

            # First we identify all surfaces that are selected
            # (if any)
            proj = prj.Project()
            polydata_list = []

            for index in proj.surface_dict:
                surface = proj.surface_dict[index]
                if surface.is_shown:
                    polydata_list.append(surface.polydata)

            if len(polydata_list) == 0:
                utl.debug("oops - no polydata")
                return
            elif len(polydata_list) == 1:
                polydata = polydata_list[0]
            else:
                polydata = pu.Merge(polydata_list)

            # Having a polydata that represents all surfaces
            # selected, we write it, according to filetype
            if filetype == const.FILETYPE_STL:
                writer = vtk.vtkSTLWriter()
                writer.SetFileTypeToBinary()
            elif filetype == const.FILETYPE_STL_ASCII:
                writer = vtk.vtkSTLWriter()
                writer.SetFileTypeToASCII()
            elif filetype == const.FILETYPE_VTP:
                writer = vtk.vtkXMLPolyDataWriter()
            #elif filetype == const.FILETYPE_IV:
            #    writer = vtk.vtkIVWriter()
            elif filetype == const.FILETYPE_PLY:
                writer = vtk.vtkPLYWriter()
                writer.SetFileTypeToASCII()
                writer.SetColorModeToOff()
                #writer.SetDataByteOrderToLittleEndian()
                #writer.SetColorModeToUniformCellColor()
                #writer.SetColor(255, 0, 0)

            if filetype in (const.FILETYPE_STL, const.FILETYPE_PLY):
                # Invert normals
                normals = vtk.vtkPolyDataNormals()
                normals.SetInputData(polydata)
                normals.SetFeatureAngle(80)
                normals.AutoOrientNormalsOn()
                #  normals.GetOutput().ReleaseDataFlagOn()
                normals.UpdateInformation()
                normals.Update()
                polydata = normals.GetOutput()

            filename = filename.encode(wx.GetDefaultPyEncoding())
            writer.SetFileName(filename)
            writer.SetInputData(polydata)
            writer.Write()
Example #2
0
    def OnExportSurface(self, pubsub_evt):
        filename, filetype = pubsub_evt.data
        if (filetype == const.FILETYPE_STL) or\
           (filetype == const.FILETYPE_VTP) or\
           (filetype == const.FILETYPE_PLY) or\
           (filetype == const.FILETYPE_STL_ASCII):

            # First we identify all surfaces that are selected
            # (if any)
            proj = prj.Project()
            polydata_list = []

            for index in proj.surface_dict:
                surface = proj.surface_dict[index]
                if surface.is_shown:
                    polydata_list.append(surface.polydata)

            if len(polydata_list) == 0:
                utl.debug("oops - no polydata")
                return
            elif len(polydata_list) == 1:
                polydata = polydata_list[0]
            else:
                polydata = pu.Merge(polydata_list)

            # Having a polydata that represents all surfaces
            # selected, we write it, according to filetype
            if filetype == const.FILETYPE_STL:
                writer = vtk.vtkSTLWriter()
                writer.SetFileTypeToBinary()
            elif filetype == const.FILETYPE_STL_ASCII:
                writer = vtk.vtkSTLWriter()
                writer.SetFileTypeToASCII()
            elif filetype == const.FILETYPE_VTP:
                writer = vtk.vtkXMLPolyDataWriter()
            #elif filetype == const.FILETYPE_IV:
            #    writer = vtk.vtkIVWriter()
            elif filetype == const.FILETYPE_PLY:
                writer = vtk.vtkPLYWriter()
                writer.SetFileTypeToASCII()
                writer.SetColorModeToOff()
                #writer.SetDataByteOrderToLittleEndian()
                #writer.SetColorModeToUniformCellColor()
                #writer.SetColor(255, 0, 0)

            if filetype in (const.FILETYPE_STL, const.FILETYPE_PLY):
                # Invert normals
                normals = vtk.vtkPolyDataNormals()
                normals.SetInputData(polydata)
                normals.SetFeatureAngle(80)
                normals.AutoOrientNormalsOn()
                #  normals.GetOutput().ReleaseDataFlagOn()
                normals.UpdateInformation()
                normals.Update()
                polydata = normals.GetOutput()

            filename = filename.encode(wx.GetDefaultPyEncoding())
            writer.SetFileName(filename)
            writer.SetInputData(polydata)
            writer.Write()
Example #3
0
def write_data(input_data, filename):
    """
    Write the given input data based on the file name extension.

    Args:
        input_data (vtkSTL/vtkPolyData/vtkXMLPolydata/vtkXMLUnstructured): Input data.
        filename (str): Save path location.
    """
    # Check filename format
    fileType = filename.split(".")[-1]
    if fileType == '':
        raise NameError('The file does not have an extension')

    # Get writer
    if fileType == 'stl':
        writer = vtk.vtkSTLWriter()
    elif fileType == 'vtp':
        writer = vtk.vtkXMLPolyDataWriter()
    elif fileType == 'vtu':
        writer = vtk.vtkXMLUnstructuredGridWriter()
    else:
        raise NameError('Unknown file type %s' % fileType)

    # Set filename and input
    writer.SetFileName(filename)
    writer.SetInputData(input_data)
    writer.Update()

    # Write
    writer.Write()
Example #4
0
def create_mesh_and_save(cloud):
    filename = "object.stl"

    vtk_points = vtk.vtkPoints()
    np_cloud = np.asarray(cloud)

    for i in range(0, np_cloud.shape[0]):
        vtk_points.InsertPoint(i, np_cloud[i][0], np_cloud[i][1], np_cloud[i][2])

    profile = vtk.vtkPolyData()
    profile.SetPoints(vtk_points)

    aCellArray = vtk.vtkCellArray()

    boundary = vtk.vtkPolyData()
    boundary.SetPoints(profile.GetPoints())
    boundary.SetPolys(aCellArray)

    delny = vtk.vtkDelaunay2D()
    delny.SetInputData(profile)
    delny.SetSourceData(boundary)
    delny.SetTolerance(0.0001)
    delny.SetAlpha(4.0)
    delny.SetOffset(1.25)
    delny.BoundingTriangulationOff()
    delny.Update()

    stl_writer = vtk.vtkSTLWriter()
    stl_writer.SetFileName(filename)
    stl_writer.SetInputConnection(delny.GetOutputPort())
    stl_writer.Write()
Example #5
0
 def get_boundaries(self):
     '''
     Extracts the boundaries of the model to a polydata object, if export_STL is selected then ask for where to save it.
     '''
     #can't be activated unless load_model has run
     extract_surface = vtk.vtkDataSetSurfaceFilter()
     extract_surface.SetInputDataObject(self.vtu_output)
     extract_surface.Update()
     self.model_boundary = vtk.vtkPolyData()
     self.model_boundary = extract_surface.GetOutput()
     msg = 'Extracted boundaries.'
     
     if self.ui.export_STL_button.isChecked():
         #get file name
         fileo, _ = get_save_file('*.stl')
         if fileo is None:
             return
         writer = vtk.vtkSTLWriter()
         writer.SetFileName(fileo)
         writer.SetInputData(self.model_boundary)
         msg = 'Extracted boundaries and wrote STL file.' #overwrite msg if stl was written
         writer.Write()
     
     self.display_info(msg)
     self.ui.vtkWidget.update()
Example #6
0
 def write_model_stl(self, path):
     write = vtk.vtkSTLWriter()
     write.SetInputData(self.mapper.GetInput())
     write.SetFileTypeToBinary()
     write.SetFileName(path)
     write.Write()
     write.Update()
Example #7
0
def remesh_file(inputname, outputname, N):

    _meshfix.clean_from_file(inputname, outputname)

    stlReader = vtk.vtkSTLReader()
    stlReader.SetFileName(outputname)
    stlReader.Update()
    mesh = stlReader.GetOutput()
    mesh = pyvista.PolyData(mesh)

    cobj = clustering.Clustering(mesh)
    cobj.subdivide(
        3
    )  # lijn toegevoegd tov python3 versie bart, want remeshing lukte niet cfr pyacvd documentatie
    cobj.cluster(N)
    remesh = cobj.create_mesh()

    w = vtk.vtkSTLWriter()
    w.SetFileName(outputname)
    w.SetInputData(remesh)
    w.Update()

    _meshfix.clean_from_file(outputname, outputname)

    ctrl, vil = read.read_stl(outputname)
    mesh = TriangleMeshObject()
    for xi in ctrl:
        mesh.add_vertex(tuple(xi))
    for ti in vil:
        mesh.add_triangle(tuple([int(el) for el in ti]))
    if mesh.is_cavity():
        vil = [el[::-1] for el in vil]
    write.save_stl(ctrl, vil, outputname)

    return
    def load_nii_save_stl(self,
                          in_name='data/skull.nii',
                          out_name='data/skull.stl',
                          threshold=100.0):
        print "Function: load_nii_save_stl"
        print "Para1: input file name (.nii file)\nPara2: output file name (.stl file)"

        reader = vtk.vtkNIFTIImageReader()
        reader.SetFileName(in_name)
        reader.Update()
        image = reader.GetOutput()

        surface = vtk.vtkMarchingCubes()
        surface.SetInputData(image)
        surface.SetValue(0, threshold)
        surface.Update()
        # extract largest connectivity area
        confilter = vtk.vtkPolyDataConnectivityFilter()
        confilter.SetInputData(surface.GetOutput())
        confilter.SetExtractionModeToLargestRegion()
        confilter.Update()

        skull = confilter.GetOutput()

        writer = vtk.vtkSTLWriter()
        writer.SetFileName(out_name)
        writer.SetInputData(skull)
        writer.Update()
        print out_name, '  saved!'
Example #9
0
 def __init__(self, module_manager):
     SimpleVTKClassModuleBase.__init__(
         self, module_manager,
         vtk.vtkSTLWriter(), 'Writing vtkSTL.',
         ('vtkSTL',), (),
         replaceDoc=True,
         inputFunctions=None, outputFunctions=None)
Example #10
0
    def _save_polydata(self, data, write_bin=False):
        """
		This private method saves into `filename` the `data`. `data` is a
		vtkPolydata. It is possible to specify format for `filename`: if
		`write_bin` is True, file is written in binary format, otherwise in
		ASCII format. This method save cached polydata to reduce number of IO
		operations.

		:param vtkPolyData data: polydatat to save.
		:param bool write_bin: for binary format file.
		"""

        self._cached_data = data

        writer = vtk.vtkSTLWriter()

        if write_bin:
            writer.SetFileTypeToBinary()

        writer.SetFileName(self._filename)

        if vtk.VTK_MAJOR_VERSION <= 5:
            writer.SetInput(data)
        else:
            writer.SetInputData(data)
        writer.Write()
Example #11
0
 def save(self): # writer to new file
     logger.log('Exporting temp STL of model %s...' % self.name)
     # Extract transformations done to the actor
     matrix = vtk.vtkMatrix4x4() 
     self.getActor().GetMatrix(matrix)
     # Apply transformation
     transform = vtk.vtkTransform()
     transform.SetMatrix(matrix)
     # T
     t_filter = vtk.vtkTransformPolyDataFilter()
     t_filter.SetInput(self.getPolyData())
     t_filter.SetTransform(transform)
     # Triangle filter
     #vtkTriangleFilter
     # Clean Polydata
     #vtkcleanpolydata
     # Simplify the model
     #vtk.vtkDecimate
     # Save data to a STL file
     writer = vtk.vtkSTLWriter()
     writer.SetFileName('temp.stl')
     writer.SetInputConnection(t_filter.GetOutputPort())
     writer.SetFileTypeToBinary()
     writer.Write()
     logger.log('End exporting')
Example #12
0
def createSTL(mha, stl):

    reader = vtk.vtkMetaImageReader()
    reader.SetFileName(mha)
    reader.Update()

    threshold = vtk.vtkImageThreshold()
    threshold.SetInputConnection(reader.GetOutputPort())
    threshold.ThresholdByLower(0.1)
    threshold.ReplaceInOn()
    threshold.SetInValue(0)  # set all values below 0.1 to 0
    threshold.ReplaceOutOn()
    threshold.SetOutValue(1)  # set all values above 0.1 to 1
    threshold.Update()

    dmc = vtk.vtkFlyingEdges3D()
    dmc.SetInputConnection(threshold.GetOutputPort())
    dmc.ComputeNormalsOn()
    dmc.GenerateValues(1, 1, 1)
    dmc.Update()

    smoother = vtk.vtkWindowedSincPolyDataFilter()
    smoother.SetInputConnection(dmc.GetOutputPort())
    smoother.SetNumberOfIterations(15)
    smoother.BoundarySmoothingOff()
    smoother.Update()

    writer = vtk.vtkSTLWriter()
    writer.SetInputConnection(smoother.GetOutputPort())
    writer.SetFileTypeToBinary()
    writer.SetFileName(stl)
    writer.Write()

    return 0
Example #13
0
def save_stl(array, spacing, origin, name):
    # array to vtkImageData
    flatten_array = array.ravel()
    shape = np.array(array.shape)
    vtk_data_array = numpy_to_vtk(
        num_array=
        flatten_array,  # ndarray contains the fitting result from the points. It is a 3D array
        deep=True,
        array_type=vtk.VTK_FLOAT)

    # convert vessel array to poly and save as STL
    img_vtk = vtk.vtkImageData()
    img_vtk.SetDimensions(shape[::-1])
    img_vtk.SetSpacing(spacing)
    img_vtk.SetOrigin(origin)
    img_vtk.SetDirectionMatrix(-1, 0, 0, 0, -1, 0, 0, 0, 1)
    img_vtk.GetPointData().SetScalars(vtk_data_array)

    surf = vtk.vtkDiscreteMarchingCubes()
    surf.SetInputData(img_vtk)
    surf.SetValue(0, array.max())

    # smoothing the mesh
    smoother = vtk.vtkSmoothPolyDataFilter()
    smoother.SetInputConnection(surf.GetOutputPort())
    smoother.SetNumberOfIterations(50)
    smoother.SetRelaxationFactor(0.1)
    smoother.FeatureEdgeSmoothingOff()
    smoother.BoundarySmoothingOn()
    smoother.Update()

    stl_writer = vtk.vtkSTLWriter()
    stl_writer.SetFileName(name)
    stl_writer.SetInputData(smoother.GetOutput())
    stl_writer.Write()
Example #14
0
def save_polydata(polydata, file_name, binary=False, color_array_name=None):
    # get file extension (type)
    file_extension = file_name.split(".")[-1].lower()

    if file_extension == "vtk":
        writer = vtk.vtkPolyDataWriter()
    elif file_extension == "vtp":
        writer = vtk.vtkPolyDataWriter()
    elif file_extension == "fib":
        writer = vtk.vtkPolyDataWriter()
    elif file_extension == "ply":
        writer = vtk.vtkPLYWriter()
    elif file_extension == "stl":
        writer = vtk.vtkSTLWriter()
    elif file_extension == "xml":
        writer = vtk.vtkXMLPolyDataWriter()
    elif file_extension == "obj":
        raise "mni obj or Wavefront obj ?"
    #    writer = set_input(vtk.vtkMNIObjectWriter(), polydata)

    writer.SetFileName(file_name)
    writer = set_input(writer, polydata)
    if color_array_name is not None:
        writer.SetArrayName(color_array_name)

    if binary:
        writer.SetFileTypeToBinary()
    writer.Update()
    writer.Write()
Example #15
0
def writeMeshFile(triangles, filename, binary=True, verbose=False):
    """Write mesh file.
    The output format is determined by file name extension. Files can be written
    in binary (default) and ASCII format."""

    outformat = path.splitext(options.outfilename)[1].strip('.')
    # set writer based on filename extension
    if outformat == 'stl':
        write = vtk.vtkSTLWriter()
    elif outformat == 'vtk':
        write = vtk.vtkPolyDataWriter()
    elif outformat == 'obj':
        write = vtk.vtkMNIObjectWriter()
    elif outformat == 'tag':
        write = vtk.vtkMNITagPointWriter()
    else:
        raise ValueError('cannot write outpur format' + outformat)
    write.SetInputConnection(triangles.GetOutputPort())

    if outformat != 'tag':
        if binary:
            if verbose: print 'setting ouptut to binary'
            write.SetFileTypeToBinary()
        else:
            if verbose: print 'setting ouptut to ascii'
            write.SetFileTypeToASCII()

    write.SetFileName(filename)
    err = write.Write()
    if err != 1:
        raise IOError('failed to write')

    if verbose:
        print "wrote", filename
    pass
Example #16
0
def WriteMesh(filename, mesh, binary=True):
    """ Writes a VTK mesh to one of the following formats:
        ply, stl, vtk
    """

    # Get extention
    ftype = filename[-3:]

    # Get filetype
    if ftype == 'ply':
        writer = vtk.vtkPLYWriter()
    elif ftype == 'stl':
        writer = vtk.vtkSTLWriter()
    elif ftype == 'vtk':
        writer = vtk.vtkPolyDataWriter()
    else:
        raise Exception('Unknown file type')

    # Write
    writer.SetFileName(filename)
    SetVTKInput(writer, mesh)
    if binary:
        writer.SetFileTypeToBinary()
    else:
        writer.SetFileTypeToASCII()
    writer.Write()
Example #17
0
    def _save_polydata(self, data, write_bin=False):
        """
        This private method saves into `filename` the `data`. `data` is a
        vtkPolydata. It is possible to specify format for `filename`: if
        `write_bin` is True, file is written in binary format, otherwise in
        ASCII format. This method save cached polydata to reduce number of IO
        operations.

        :param vtkPolyData data: polydatat to save.
        :param bool write_bin: for binary format file.
        """
        self._cached_data = data

        writer = vtk.vtkSTLWriter()

        if write_bin:
            writer.SetFileTypeToBinary()

        writer.SetFileName(self._filename)

        if vtk.VTK_MAJOR_VERSION <= 5:
            writer.SetInput(data)
        else:
            writer.SetInputData(data)
        writer.Write()
def write_STL(pointCloud):
    # Write the stl file to disk
    filename = "DataPoints.stl"
    stlWriter = vtk.vtkSTLWriter()
    stlWriter.SetFileName(filename)
    stlWriter.SetInputData(pointCloud.vtkPolyData)
    stlWriter.Write()
Example #19
0
def writeMeshFile(triangles, filename, binary=True, verbose=False):
    """Write mesh file.
    The output format is determined by file name extension. Files can be written
    in binary (default) and ASCII format."""

    outformat = path.splitext(options.outfilename)[1].strip('.')
    # set writer based on filename extension
    if outformat=='stl':
        write = vtk.vtkSTLWriter()
    elif outformat=='vtk':
        write = vtk.vtkPolyDataWriter()
    elif outformat=='obj':
        write = vtk.vtkMNIObjectWriter()
    elif outformat=='tag':
        write = vtk.vtkMNITagPointWriter()
    else:
        raise ValueError('cannot write outpur format' + outformat)
    write.SetInputConnection(triangles.GetOutputPort())

    if outformat!='tag':
        if binary:
            if verbose: print 'setting ouptut to binary'
            write.SetFileTypeToBinary()
        else:
            if verbose: print 'setting ouptut to ascii'
            write.SetFileTypeToASCII()

    write.SetFileName(filename)
    err = write.Write()
    if err != 1:
        raise IOError('failed to write')

    if verbose:
        print "wrote", filename
    pass
Example #20
0
def write(obj, fileoutput):
    '''
    Write 3D object to file.
    Possile extensions are: .vtk, .ply, .obj, .stl, .byu, .vtp
    '''
    fr = fileoutput.lower()
    if '.vtk' in fr: w = vtk.vtkPolyDataWriter()
    elif '.ply' in fr: w = vtk.vtkPLYWriter()
    elif '.obj' in fr:
        w = vtk.vtkOBJExporter()
        w.SetFilePrefix(fileoutput.replace('.obj', ''))
        vc.printc('Please use write(vp.renderWin)', 3)
        w.SetInput(obj)
        w.Update()
        vc.printc("Saved file: " + fileoutput, 'g')
        return
    elif '.stl' in fr:
        w = vtk.vtkSTLWriter()
    elif '.byu' in fr or '.g' in fr:
        w = vtk.vtkBYUWriter()
    elif '.vtp' in fr:
        w = vtk.vtkXMLPolyDataWriter()
    else:
        vc.printc('Unavailable format in file ' + fileoutput, c='r')
        exit(1)
    try:
        vu.setInput(w, vu.polydata(obj, True))
        w.SetFileName(fileoutput)
        w.Write()
        vc.printc("Saved file: " + fileoutput, 'g')
    except:
        vc.printc("Error saving: " + fileoutput, 'r')
def Decimate_mesh(meshvtk,name_vtkmesh,nvertices=2000):
    print 'test'
    stlWriter = vtk.vtkSTLWriter()
    stlWriter.SetFileName('meshdecimated.stl')
    stlWriter.SetInputData(meshvtk)
    stlWriter.Write()
    
    mesh_om = om.PolyMesh()
    Result=om.read_mesh(mesh_om, "meshdecimated.stl")
    print Result
    deci_om=om.PolyMeshDecimater(mesh_om)
    mh=om.PolyMeshModQuadricHandle()   
    
    deci_om.add(mh)
    deci_om.initialize()
    deci_om.decimate_to(nvertices)
    mesh_om.garbage_collection()
    
    
    
    assert mesh_om.n_vertices()==nvertices, 'vertices goal not acomplished; nvertices={0:d}'.format(mesh_om.n_vertices())
    print "Decimation to {0} vertices Sucessful".format(nvertices)
    om.write_mesh(mesh_om,'meshdecimated.stl')
    stlReader = vtk.vtkSTLReader()
    stlReader.SetFileName('meshdecimated.stl')
    stlReader.Update()   
      
    vtkwrite=vtk.vtkPolyDataWriter()
    vtkwrite.SetInputData(stlReader.GetOutput())
    vtkwrite.SetFileName(name_vtkmesh)
    vtkwrite.Write()
    
    print "enters"
Example #22
0
 def GravarModeloCortado(self, path):
     write = vtk.vtkSTLWriter()
     write.SetInputConnection(self.clipper.GetOutputPort())
     write.SetFileTypeToBinary()
     write.SetFileName(path)
     write.Write()
     write.Update()
Example #23
0
def write_vtk_polydata(poly, fn):
    """
    This function writes a vtk polydata to disk
    Args:
        poly: vtk polydata
        fn: file name
    Returns:
        None
    """
    print('Writing vtp with name:', fn)
    if (fn == ''):
        return 0

    _, extension = os.path.splitext(fn)

    if extension == '.vtk':
        writer = vtk.vtkPolyDataWriter()
    elif extension == '.stl':
        writer = vtk.vtkSTLWriter()
    elif extension == '.vtp':
        writer = vtk.vtkXMLPolyDataWriter()
    elif extension == '.obj':
        writer = vtk.vtkOBJWriter()
    else:
        raise ValueError("Incorrect extension" + extension)
    writer.SetInputData(poly)
    writer.SetFileName(fn)
    writer.Update()
    writer.Write()
    return
Example #24
0
def write_to_file(filename, face_to_delete, output_filename):

    Points = vtk.vtkPoints()
    Triangles = vtk.vtkCellArray()
    Triangle = vtk.vtkTriangle()
    points, faces = parse(filename)
    for point in points:
        id = Points.InsertNextPoint(point[0], point[1], point[2])
    for i, face in enumerate(faces):

        skip = compare_faces(face_to_delete, face)
        if not skip:
            Triangle.GetPointIds().SetId(0, int(face[0]))
            Triangle.GetPointIds().SetId(1, int(face[1]))
            Triangle.GetPointIds().SetId(2, int(face[2]))
            Triangles.InsertNextCell(Triangle)
    polydata = vtk.vtkPolyData()
    polydata.SetPoints(Points)
    polydata.SetPolys(Triangles)
    polydata.Modified()

    if vtk.VTK_MAJOR_VERSION <= 5:
        polydata.Update()
    writer = vtk.vtkSTLWriter()
    writer.SetFileName(output_filename)
    if vtk.VTK_MAJOR_VERSION <= 5:
        writer.SetInput(polydata)
    else:
        writer.SetInputData(polydata)
    writer.Write()
Example #25
0
def smooth_surface(vtk_path, output_path):
    reader = vtk.vtkPolyDataReader()
    reader.SetFileName(vtk_path)
    reader.Update()

    if (reader.GetOutput().GetNumberOfPoints() == 0):
        print('WARNING: nothing to smooth for', vtk_path)
        return 
    
    smoothingIterations = 50
    passBand = 0.05
    smoother = vtk.vtkWindowedSincPolyDataFilter()
    smoother.SetInputConnection(reader.GetOutputPort())
    smoother.SetNumberOfIterations(smoothingIterations)
    smoother.SetPassBand(passBand)
    smoother.Update()

    decimate = vtk.vtkDecimatePro()
    decimate.SetInputData(smoother.GetOutput())
    decimate.SetTargetReduction(0.8)
    decimate.PreserveTopologyOn()
    decimate.Update()


    writer = vtk.vtkSTLWriter()
    writer.SetInputData(decimate.GetOutput())
    writer.SetFileTypeToASCII()  
    writer.SetFileName(output_path)  # .stl
    writer.Update()
Example #26
0
def save_polydata(polydata, file_name, binary=False, color_array_name=None):
    # get file extension (type)
    file_extension = file_name.split(".")[-1].lower()

    # todo better generic load
    # todo test all
    if file_extension == "vtk":
        writer = vtk.vtkPolyDataWriter()
    elif file_extension == "vtp":
        writer = vtk.vtkPolyDataWriter()
    elif file_extension == "fib":
        writer = vtk.vtkPolyDataWriter()
    elif file_extension == "ply":
        writer = vtk.vtkPLYWriter()
    elif file_extension == "stl":
        writer = vtk.vtkSTLWriter()
    elif file_extension == "xml":
        writer = vtk.vtkXMLPolyDataWriter()
    elif file_extension == "obj":
        raise "mni obj or Wavefront obj ?"
    #    writer = set_input(vtk.vtkMNIObjectWriter(), polydata)

    writer.SetFileName(file_name)
    writer = set_input(writer, polydata)
    if color_array_name is not None:
        writer.SetArrayName(color_array_name);
    
    if binary :
        writer.SetFileTypeToBinary()
    writer.Update()
    writer.Write()
Example #27
0
def labels2meshes_vtk(surfdir,
                      compdict,
                      labelimage,
                      labels=[],
                      spacing=[1, 1, 1],
                      offset=[0, 0, 0],
                      nvoxthr=0):
    """Generate meshes from a labelimage with vtk marching cubes."""

    try:
        import vtk
    except ImportError:
        return

    if not labels:
        labels = np.unique(labelimage)
        labels = np.delete(labels, 0)
        # labels = np.unique(labelimage[labelimage > 0])
    print('number of labels to process: ', len(labels))

    labelimage = np.lib.pad(labelimage.tolist(), ((1, 1), (1, 1), (1, 1)),
                            'constant')
    dims = labelimage.shape

    vol = vtk.vtkImageData()
    vol.SetDimensions(dims[0], dims[1], dims[2])
    vol.SetOrigin(offset[0] * spacing[0] + spacing[0],
                  offset[1] * spacing[1] + spacing[1],
                  offset[2] * spacing[2] + spacing[2])
    # vol.SetOrigin(0, 0, 0)
    vol.SetSpacing(spacing[0], spacing[1], spacing[2])

    sc = vtk.vtkFloatArray()
    sc.SetNumberOfValues(labelimage.size)
    sc.SetNumberOfComponents(1)
    sc.SetName('tnf')
    for ii, val in enumerate(np.ravel(labelimage.swapaxes(0, 2))):
        # FIXME: why swapaxes???
        sc.SetValue(ii, val)
    vol.GetPointData().SetScalars(sc)

    dmc = vtk.vtkDiscreteMarchingCubes()
    dmc.SetInput(vol)
    dmc.ComputeNormalsOn()

    for label in labels:
        try:
            labelname = compdict[label]['name']
        except KeyError:
            labelname = 'label.{:05d}'.format(label)
        fpath = os.path.join(surfdir, '{:s}.stl'.format(labelname))
        print("Processing label {} (value: {:05d})".format(labelname, label))
        dmc.SetValue(0, label)
        dmc.Update()

        writer = vtk.vtkSTLWriter()
        writer.SetInputConnection(dmc.GetOutputPort())
        writer.SetFileName(fpath)
        writer.Write()
Example #28
0
def main():

    # data_dir = os.environ.get('OneDrive') + r'\data\dti_navigation\joonas'
    #
    # filenames = {'T1': 'sub-S1_ses-S8741_T1w',
    #              'STL_INVESALIUS': 'half_head_inv',
    #              'STL_WORLD': 'half_head_world'}

    subj_id = 7
    item = 'brain'
    data_dir = os.environ.get(
        'OneDrive') + r'\data\nexstim_coord\mri\ppM1_S{}'.format(subj_id)

    filenames = {
        'T1': 'ppM1_S{}'.format(subj_id),
        'STL_INVESALIUS': 'ppM1_S{}_{}_shell_inv'.format(subj_id, item),
        'STL_WORLD': 'ppM1_S{}_{}_shell_world'.format(subj_id, item)
    }

    img_path = os.path.join(data_dir, filenames['T1'] + '.nii')
    stl_invesalius_path = os.path.join(data_dir,
                                       filenames['STL_INVESALIUS'] + '.stl')
    stl_world_path = os.path.join(data_dir, filenames['STL_WORLD'] + '.stl')

    imagedata, affine = imf.load_image(img_path)
    # mri2inv_mat = imf.mri2inv(imagedata, affine)
    inv2mri_mat = imf.inv2mri(imagedata, affine)

    matrix_vtk = vtk.vtkMatrix4x4()

    for row in range(0, 4):
        for col in range(0, 4):
            matrix_vtk.SetElement(row, col, inv2mri_mat[row, col])

    reader = vtk.vtkSTLReader()
    reader.SetFileName(stl_invesalius_path)
    reader.Update()

    # poly_normals = vtk.vtkPolyDataNormals()
    # poly_normals.SetInputData(reader.GetOutput())
    # poly_normals.ConsistencyOn()
    # poly_normals.AutoOrientNormalsOn()
    # poly_normals.SplittingOff()
    # poly_normals.UpdateInformation()
    # poly_normals.Update()

    transform = vtk.vtkTransform()
    transform.SetMatrix(matrix_vtk)

    transform_polydata = vtk.vtkTransformPolyDataFilter()
    transform_polydata.SetTransform(transform)
    transform_polydata.SetInputData(reader.GetOutput())
    transform_polydata.Update()

    stl_writer = vtk.vtkSTLWriter()
    stl_writer.SetFileTypeToBinary()
    stl_writer.SetFileName(stl_world_path)
    stl_writer.SetInputConnection(transform_polydata.GetOutputPort())
    stl_writer.Write()
def labels2meshes_vtk(datadir,
                      compdict,
                      labelimage,
                      labels=[],
                      spacing=[1, 1, 1],
                      offset=[0, 0, 0],
                      nvoxthr=0):
    """"""
    if not labels:
        labels = np.unique(labelimage)
        labels = np.delete(labels,
                           0)  # labels = np.unique(labelimage[labelimage>0])
    print('number of labels to process: ', len(labels))
    labelimage = np.lib.pad(labelimage.tolist(), ((1, 1), (1, 1), (1, 1)),
                            'constant')
    dims = labelimage.shape

    vol = vtk.vtkImageData()
    vol.SetDimensions(dims[0], dims[1], dims[2])
    vol.SetOrigin(offset[0] * spacing[0] + spacing[0],
                  offset[1] * spacing[1] + spacing[1], offset[2] * spacing[2] +
                  spacing[2])  # vol.SetOrigin(0, 0, 0)
    vol.SetSpacing(spacing[0], spacing[1], spacing[2])
    sc = vtk.vtkFloatArray()
    sc.SetNumberOfValues(labelimage.size)
    sc.SetNumberOfComponents(1)
    sc.SetName('tnf')
    for ii, val in enumerate(np.ravel(labelimage.swapaxes(
            0, 2))):  # why swapaxes???
        sc.SetValue(ii, val)
    vol.GetPointData().SetScalars(sc)
    dmc = vtk.vtkDiscreteMarchingCubes()
    dmc.SetInput(vol)
    dmc.ComputeNormalsOn()

    surfdir = 'dmcsurf'
    mkdir_p(os.path.join(datadir, surfdir))

    for ii, label in enumerate(labels):
        for labelclass, labels in compdict.items():
            if label in labels:
                break
            else:
                labelclass = 'NN'
        ndepth = 1
        fpath = os.path.join(
            datadir, surfdir,
            labelclass + '.{:05d}.{:02d}.stl'.format(label, ndepth))
        print("Processing labelnr " + str(ii) + " of class " + labelclass +
              " with value: " + str(label))
        #         print("Saving to " + fpath)

        dmc.SetValue(0, label)
        # dmc.GenerateValues(nb_labels, 0, nb_labels)
        dmc.Update()
        writer = vtk.vtkSTLWriter()
        writer.SetInputConnection(dmc.GetOutputPort())
        writer.SetFileName(fpath)
        writer.Write()
Example #30
0
    def saveCone(self, path):
        filename = path + "/" + self.coneNameInput.text() + "stl"
        self.cone.SetResolution(int(self.coneResoluInput.text()))

        writer = vtk.vtkSTLWriter()
        writer.SetFileName(filename)
        writer.SetInputConnection(self.cone.GetOutputPort())
        writer.Write()
Example #31
0
 def WriteSTLSurfaceFile(self):
     if (self.OutputFileName == ''):
         self.PrintError('Error: no OutputFileName.')
     self.PrintLog('Writing STL surface file.')
     writer = vtk.vtkSTLWriter()
     writer.SetInputData(self.Surface)
     writer.SetFileName(self.OutputFileName)
     writer.Write()
 def WriteModel(self):
     """Writes model to file as stl file"""
     if self.fname == '':
         self.fname = 'Model1'
     stlWriter = vtk.vtkSTLWriter()
     stlWriter.SetFileName(self.fname + '.stl')
     stlWriter.SetInputData(self.clipped.GetOutput())
     stlWriter.Write()
Example #33
0
 def salva_triOsso(self, path):
     assembly = self.assemblagem(self.ListaOssos)
     write = vtk.vtkSTLWriter()
     write.SetInputConnection(assembly.GetOutputPort())
     write.SetFileTypeToBinary()
     write.SetFileName(path)
     write.Write()
     write.Update()
Example #34
0
def vtp_to_stl(file_in, file_out):
    reader = vtk.vtkXMLPolyDataReader()
    reader.SetFileName(file_in)
    writer = vtk.vtkSTLWriter()
    writer.SetInputConnection(reader.GetOutputPort())
    writer.SetFileName(file_out)
    writer.SetFileTypeToBinary()
    writer.Write()
Example #35
0
 def writeStl(self, name):
     # Write the stl file to disk
     self.writer = vtk.vtkSTLWriter()
     self.writer.SetFileName(name)
     # self.writer.SetFileTypeToASCII()
     self.writer.SetFileTypeToBinary()
     self.writer.SetInputConnection(self.reader.GetOutputPort())
     self.writer.Write()
Example #36
0
 def OnSaveSTL(self, e):
     path = self._dialog_save()
     if path:
         w = vtk.vtkSTLWriter()
         w.SetFileTypeToBinary()
         w.SetFileName(path)
         w.SetInputData(self.cortical_viewer.actor.GetMapper().GetInput())
         w.Write()
Example #37
0
 def WriteSTLSurfaceFile(self):
     if self.OutputFileName == "":
         self.PrintError("Error: no OutputFileName.")
     self.PrintLog("Writing STL surface file.")
     writer = vtk.vtkSTLWriter()
     writer.SetInput(self.Surface)
     writer.SetFileName(self.OutputFileName)
     writer.Write()
def ConvertMSH(file_name):
	out_name = file_name.split('.')[0]+'.stl'
	print 'Out file:'+out_name
	# read file head
	file = open(file_name,'r')
	line = file.readline().split('=')
	while(line[0].strip() != 'Points'):
		line = file.readline().split('=')
		print 'Processing ', line[0]
		if(line[0].strip() == 'NPoints'):
			num_Points = int(line[1].strip())
			print 'Number of Points is ' + str(num_Points)
			
	# put in to vtkPoints
	print 'Writing Points'
	points = vtk.vtkPoints()
	points.SetNumberOfPoints(num_Points)
	for i in range(0,num_Points):
		line = file.readline()
		nums = line.split( )
		x = float(nums[1])
		y = float(nums[2])
		z = float(nums[3])
		points.SetPoint(i,x,y,z)

	# create cells
	print 'Writing Cells'
	line = file.readline().split('=')
	while(line[0].strip() != 'Cells'):
		line = file.readline().split('=')
		print 'Processing ', line[0]
		if(line[0].strip() == 'NCells'):
			num_Triangles = int(line[1].strip())
			print 'Number of num_Triangles: '+str(num_Triangles)
		
	polys = vtk.vtkCellArray()
	for i in range(1,num_Triangles):
		line = file.readline()
		nums = line.split( )
		a = int(nums[1])
		b = int(nums[2])
		c = int(nums[3])
		polys.InsertNextCell(3)
		polys.InsertCellPoint(a)
		polys.InsertCellPoint(b)
		polys.InsertCellPoint(c)
	
	polyData = vtk.vtkPolyData()
	polyData.SetPoints(points)
	polyData.SetPolys(polys)
	
	print 'Writing to STL file'
	writer = vtk.vtkSTLWriter()
	writer.SetFileName(out_name)
	writer.SetInputData(polyData)
	writer.Update()
Example #39
0
    def exportToSTL(self, filename):
        """
        Export the rendered scene to a Wavefront .obj file.

        @param filename: the name of the file
        @type filename: str
        """
        self.__exportToVtkDataExporter(vtk.vtkSTLWriter(),
                                       self.vtkMesh.GetOutput(),
                                       filename)
def write_stl(ugrid, filename):
    surface_filter = vtk.vtkDataSetSurfaceFilter()
    surface_filter.SetInputData(ugrid)

    triangle_filter = vtk.vtkTriangleFilter()
    triangle_filter.SetInputConnection(surface_filter.GetOutputPort())

    writer = vtk.vtkSTLWriter()
    writer.SetFileName(filename)
    writer.SetInputConnection(triangle_filter.GetOutputPort())
    writer.Write()
Example #41
0
def main():
    poly = load_file(sys.argv[1])
    steps = int(sys.argv[3])
    
    new_poly = taubin_smooth(poly, 0.5, -0.53, steps)

    w = vtk.vtkSTLWriter()
    w.SetFileName(sys.argv[2])
    w.SetInput(new_poly)
    w.SetFileTypeToBinary()
    w.Write()
def writeSTL(
        pdata,
        filename,
        verbose=1):

    myVTK.myPrint(verbose, "*** writeSTL: " + filename + " ***")

    stl_writer = vtk.vtkSTLWriter()
    stl_writer.SetFileName(filename)
    stl_writer.SetInputData(pdata)
    stl_writer.Update()
    stl_writer.Write()
Example #43
0
 def WriteSTLSurfaceFile(self):
     if (self.OutputFileName == ''):
         self.PrintError('Error: no OutputFileName.')
     self.PrintLog('Writing STL surface file.')
     writer = vtk.vtkSTLWriter()
     writer.SetInputData(self.Surface)
     writer.SetFileName(self.OutputFileName)
     if self.Mode == "binary":
         writer.SetFileTypeToBinary()
     elif self.Mode == "ascii":
         writer.SetFileTypeToASCII()
     writer.Write()
Example #44
0
def vtk2stl(fn_in, fn_out):

    reader = vtk.vtkDataSetReader()
    reader.SetFileName(fn_in)
    reader.Update()

    gfilter = vtk.vtkGeometryFilter()
    gfilter.SetInput(reader.GetOutput())

    writer = vtk.vtkSTLWriter()
    writer.SetFileName(fn_out)
    writer.SetInput(gfilter.GetOutput())
    writer.Write()
Example #45
0
File: app.py Project: jcdinis/POMES
    def gravar_Modelo_stl(self, path):

        app_polidata = vtk.vtkAppendPolyData()
        app_polidata.AddInput(self.polydata)
        app_polidata.AddInput(self.estruturas.GetOutput())
        app_polidata.Update()

        write = vtk.vtkSTLWriter()
        write.SetInputData(app_polidata.GetOutput())
        write.SetFileTypeToBinary()
        write.SetFileName(path)
        write.Write()
        write.Update()
    def __init__(self):
        """
        Initializes VTK objects for rendering.
        """
        # vtk objects for rendering
        self.vtkrenderer = vtk.vtkRenderer()
        
        self.vtkcamera = vtk.vtkCamera()
        self.vtkcamera.SetPosition(self.camera_pos)
        self.vtkcamera.SetFocalPoint(0, 0, 0)
        self.vtkcamera.SetViewUp(self.camera_up)
 
        # lighting
        self.light1 = vtk.vtkLight()
        self.light1.SetIntensity(.4)
        self.light1.SetPosition(10, -10, 10)
        self.light1.SetDiffuseColor(1, 1, 1)
        self.light2 = vtk.vtkLight()
        self.light2.SetIntensity(.4)
        self.light2.SetPosition(-10, -10, 10)
        self.light2.SetDiffuseColor(1, 1, 1)
        self.light3 = vtk.vtkLight()
        self.light3.SetIntensity(.4)
        self.light3.SetPosition(10, -10, -10)
        self.light3.SetDiffuseColor(1, 1, 1)
        self.light4 = vtk.vtkLight()
        self.light4.SetIntensity(.4)
        self.light4.SetPosition(-10, -10, -10)
        self.light4.SetDiffuseColor(1, 1, 1)
        self.vtkrenderer.AddLight(self.light1)
        self.vtkrenderer.AddLight(self.light2)
        self.vtkrenderer.AddLight(self.light3)
        self.vtkrenderer.AddLight(self.light4)
        self.vtkrenderer.SetBackground(0.1, 0.1, 0.1) # Background color

        self.vtkrender_window = vtk.vtkRenderWindow()
        self.vtkrender_window.AddRenderer(self.vtkrenderer)
        self.vtkrender_window.SetSize(self.render_size)
        self.vtkrender_window_interactor = vtk.vtkRenderWindowInteractor()
        self.vtkrender_window_interactor.SetRenderWindow(self.vtkrender_window)

        # vtk objects for reading, and rendering object parts
        self.part_source = vtk.vtkCubeSource()
        self.part_output = self.part_source.GetOutput()
        self.part_mapper = vtk.vtkPolyDataMapper()
        self.part_mapper.SetInput(self.part_output)

        # exporters
        self.vtkvrml_exporter = vtk.vtkVRMLExporter()
        self.vtkobj_exporter = vtk.vtkOBJExporter()
        self.stl_writer = vtk.vtkSTLWriter()
Example #47
0
def main():
    poly = load_file('monkey.ply')
    poly.BuildLinks(0)
    np = poly.GetNumberOfPoints()

    Ls = numpy.zeros((np, np))
    X, Y, Z = numpy_support.vtk_to_numpy(poly.GetPoints().GetData()).transpose()

    for i in xrange(np):
        for j in xrange(np):
            if i != j :
                if poly.IsEdge(i, j):
                    Ls[i, j] = -1
                    Ls[i, i] += 1

    Ls = numpy.matrix(Ls)
    Dx = X * Ls
    Dy = Y * Ls
    Dz = Z * Ls
    
    Dxg = gaussian_filter1d(Dx, 1)
    Dyg = gaussian_filter1d(Dy, 1)
    Dzg = gaussian_filter1d(Dz, 1)

    #Lsn = numpy.linalg.inv(Ls)

    #Xn = Lsn * Dxg
    #Yn = Lsn * Dyg
    #Zn = Lsn * Dzg

    X[:] = numpy.linalg.lstsq(Ls, Dxg.transpose())
    Y[:] = Dyg[0, :]
    Z[:] = Dzg[0, :]

    print X.shape
    
    V = numpy.zeros((np, 3))
    V[:,0] = X
    V[:,1] = Y
    V[:,2] = Z

    poly.GetPoints().SetData(numpy_support.numpy_to_vtk(V))
    poly.BuildLinks(0)
    poly.BuildCells()

    w = vtk.vtkSTLWriter()
    w.SetFileName('/tmp/teste.stl')
    w.SetInput(poly)
    w.Write()
Example #48
0
def writeSTL(
        pdata,
        filename,
        verbose=1):

    myVTK.myPrint(verbose, "*** writeSTL: "+filename+" ***")

    stl_writer = vtk.vtkSTLWriter()
    stl_writer.SetFileName(filename)
    if (vtk.vtkVersion.GetVTKMajorVersion() >= 6):
        stl_writer.SetInputData(pdata)
    else:
        stl_writer.SetInput(pdata)
    stl_writer.Update()
    stl_writer.Write()
Example #49
0
def CylinderGenerator(radius, length, resolution, outfile, direction=(0,0,1)):
    """Write an STL file of a triangulated, uncapped, origin-centred cylinder
    of the specified radius, length and resolution to the specified file.
    """
    tcs = TriangulatedCylinderSource()
    w = vtkSTLWriter()
    w.SetInputConnection(tcs.GetOutputPort())

    tcs.SetRadius(radius)
    tcs.SetResolution(resolution)
    tcs.SetHeight(length)
    tcs.SetDirection(direction)
    tcs.CappingOff()
    w.SetFileName(outfile)

    w.Write()
Example #50
0
def writeSTL(mesh, name):
    try:
        writer = vtk.vtkSTLWriter()
        if vtk.vtkVersion.GetVTKMajorVersion() >= 6:
            print "writeSTL 1"
            writer.SetInputData( mesh )
        else:
            print "writeSTL 2"
            writer.SetInput( mesh )
        writer.SetFileTypeToBinary()
        writer.SetFileName( name )
        writer.Write()
        print "Output mesh:", name
        writer = None
    except:
        print "STL mesh writer failed"
        exc_type, exc_value, exc_traceback = sys.exc_info()
        traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout)
    return None
Example #51
0
def vtk2stl(fn_in, fn_out):

    reader = vtk.vtkDataSetReader()
    reader.SetFileName(fn_in)
    reader.Update()

    gfilter = vtk.vtkGeometryFilter()
    if vtk.VTK_MAJOR_VERSION <= 5:
        gfilter.SetInput(reader.GetOutput())
    else:
        gfilter.SetInputData(reader.GetOutput())
        gfilter.Update()

    writer = vtk.vtkSTLWriter()
    writer.SetFileName(fn_out)
    if vtk.VTK_MAJOR_VERSION <= 5:
        writer.SetInput(gfilter.GetOutput())
    else:
        writer.SetInputData(gfilter.GetOutput())
    writer.Write()
Example #52
0
 def getWriter(self,polyData):
     writer = None;
     if self.destFormat == "ply":
         writer = vtk.vtkPLYWriter();
         writer.SetFileTypeToBinary();
     elif self.destFormat == "stl":
         writer =  vtk.vtkSTLWriter();
         writer.SetFileTypeToBinary();
     elif self.destFormat == "vtp":
         writer = vtk.vtkXMLPolyDataWriter();
         writer.SetDataModeToBinary();
     elif self.destFormat == "obj":
         writer = VTKOBJWriter();
     elif self.destFormat == "json":
         writer = my_vtkGeoJSONWriter();
     else:
         raise IOError("Export {} is not supported currently".format(self.destFormat));
     writer.SetFileName(self.dest);
     writer.SetInputData(polyData);
     return writer;
Example #53
0
    def write(self, mesh_points, filename, write_bin=False):
        """
        Writes a stl file, called filename, copying all the lines from
        self.filename but the coordinates. mesh_points is a matrix that contains
        the new coordinates to write in the stl file.

        :param numpy.ndarray mesh_points: it is a `n_points`-by-3 matrix
            containing the coordinates of the points of the mesh.
        :param string filename: name of the output file.
        :param boolean write_bin: flag to write in the binary format. Default is
            False.
        """
        self._check_filename_type(filename)
        self._check_extension(filename)
        self._check_infile_instantiation()

        self.outfile = filename

        reader = vtk.vtkSTLReader()
        reader.SetFileName(self.infile)
        reader.Update()
        data = reader.GetOutput()

        points = vtk.vtkPoints()

        for i in range(data.GetNumberOfPoints()):
            points.InsertNextPoint(mesh_points[i, :])

        data.SetPoints(points)

        writer = vtk.vtkSTLWriter()
        writer.SetFileName(self.outfile)

        writer.SetInputData(data)

        if write_bin:
            writer.SetFileTypeToBinary()
        else:
            writer.SetFileTypeToASCII()

        writer.Write()
Example #54
0
def decimate_pro(nameOfInputFile, nameOfOutputFile, reductionValue):
        reader = vtkSTLReader()
        reader.SetFileName(nameOfInputFile)
        reader.Update()

        input = vtkPolyData()
        input.ShallowCopy(reader.GetOutput())

        decimate = vtkDecimatePro()
        decimate.SetInputConnection(input.GetProducerPort())
        decimate.SetTargetReduction(reductionValue)
        decimate.Update()

        decimated = vtkPolyData()
        decimated.ShallowCopy(decimate.GetOutput())

        writer = vtk.vtkSTLWriter()
        writer.SetFileName(nameOfOutputFile)
        if vtk.VTK_MAJOR_VERSION <= 5:
            writer.SetInput(decimated)
        else:
            writer.SetInputData(decimated)
        writer.Write()
Example #55
0
    def __init__(self, module_manager):

        # call parent constructor
        ModuleBase.__init__(self, module_manager)

        # need to make sure that we're all happy triangles and stuff
        self._cleaner = vtk.vtkCleanPolyData()
        self._tf = vtk.vtkTriangleFilter()
        self._tf.SetInput(self._cleaner.GetOutput())
        self._writer = vtk.vtkSTLWriter()
        self._writer.SetInput(self._tf.GetOutput())
        # sorry about this, but the files get REALLY big if we write them
        # in ASCII - I'll make this a gui option later.
        #self._writer.SetFileTypeToBinary()

        # following is the standard way of connecting up the devide progress
        # callback to a VTK object; you should do this for all objects in
        mm = self._module_manager        
        for textobj in (('Cleaning data', self._cleaner),
                        ('Converting to triangles', self._tf),
                        ('Writing STL data', self._writer)):
            module_utils.setup_vtk_object_progress(self, textobj[1],
                                               textobj[0])

            
        # ctor for this specific mixin
        FilenameViewModuleMixin.__init__(
            self,
            'Select a filename',
            'STL data (*.stl)|*.stl|All files (*)|*',
            {'vtkSTLWriter': self._writer},
            fileOpen=False)

        # set up some defaults
        self._config.filename = ''

        self.sync_module_logic_with_config()
Example #56
0
def main(filenameIn,filenameOut,xmin,ymin,zmin,dx,dy,dz,render):
    # print vtk.VTK_MAJOR_VERSION # Check the version
    # Read the file and create polydata
    reader = vtk.vtkSTLReader()
    reader.SetFileName(filenameIn)
    # Define planes for clipping
    Origins=[
        [xmin,ymin,zmin],
        [xmin,ymin,zmin],
        [xmin,ymin,zmin],
        [xmin+dx,ymin+dy,zmin+dz],
        [xmin+dx,ymin+dy,zmin+dz],
        [xmin+dx,ymin+dy,zmin+dz],
    ]
    Normals=[
        [[-1,0,0],[0,-1,0],[0,0,-1],[-1,0,0],[0,-1,0],[0,0,-1]],
        [[+1,0,0],[0,-1,0],[0,0,-1],[-1,0,0],[0,-1,0],[0,0,-1]],
        [[+1,0,0],[0,-1,0],[0,0,-1],[+1,0,0],[0,-1,0],[0,0,-1]],
        [[-1,0,0],[0,+1,0],[0,0,-1],[-1,0,0],[0,-1,0],[0,0,-1]],
        [[+1,0,0],[0,+1,0],[0,0,-1],[-1,0,0],[0,-1,0],[0,0,-1]],
        [[+1,0,0],[0,+1,0],[0,0,-1],[+1,0,0],[0,-1,0],[0,0,-1]],
        [[-1,0,0],[0,+1,0],[0,0,-1],[-1,0,0],[0,+1,0],[0,0,-1]],
        [[+1,0,0],[0,+1,0],[0,0,-1],[-1,0,0],[0,+1,0],[0,0,-1]],
        [[+1,0,0],[0,+1,0],[0,0,-1],[+1,0,0],[0,+1,0],[0,0,-1]],

        [[-1,0,0],[0,-1,0],[0,0,+1],[-1,0,0],[0,-1,0],[0,0,-1]],
        [[+1,0,0],[0,-1,0],[0,0,+1],[-1,0,0],[0,-1,0],[0,0,-1]],
        [[+1,0,0],[0,-1,0],[0,0,+1],[+1,0,0],[0,-1,0],[0,0,-1]],
        [[-1,0,0],[0,+1,0],[0,0,+1],[-1,0,0],[0,-1,0],[0,0,-1]],
        [[+1,0,0],[0,+1,0],[0,0,+1],[-1,0,0],[0,-1,0],[0,0,-1]],
        [[+1,0,0],[0,+1,0],[0,0,+1],[+1,0,0],[0,-1,0],[0,0,-1]],
        [[-1,0,0],[0,+1,0],[0,0,+1],[-1,0,0],[0,+1,0],[0,0,-1]],
        [[+1,0,0],[0,+1,0],[0,0,+1],[-1,0,0],[0,+1,0],[0,0,-1]],
        [[+1,0,0],[0,+1,0],[0,0,+1],[+1,0,0],[0,+1,0],[0,0,-1]],

        [[-1,0,0],[0,-1,0],[0,0,+1],[-1,0,0],[0,-1,0],[0,0,+1]],
        [[+1,0,0],[0,-1,0],[0,0,+1],[-1,0,0],[0,-1,0],[0,0,+1]],
        [[+1,0,0],[0,-1,0],[0,0,+1],[+1,0,0],[0,-1,0],[0,0,+1]],
        [[-1,0,0],[0,+1,0],[0,0,+1],[-1,0,0],[0,-1,0],[0,0,+1]],
        [[+1,0,0],[0,+1,0],[0,0,+1],[-1,0,0],[0,-1,0],[0,0,+1]],
        [[+1,0,0],[0,+1,0],[0,0,+1],[+1,0,0],[0,-1,0],[0,0,+1]],
        [[-1,0,0],[0,+1,0],[0,0,+1],[-1,0,0],[0,+1,0],[0,0,+1]],
        [[+1,0,0],[0,+1,0],[0,0,+1],[-1,0,0],[0,+1,0],[0,0,+1]],
        [[+1,0,0],[0,+1,0],[0,0,+1],[+1,0,0],[0,+1,0],[0,0,+1]],
    ]
    # Define directions for moving clipped regions
    Direction=[
        [dx,dy,dz],
        [0,dy,dz],
        [-dx,dy,dz],
        [dx,0,dz],
        [0,0,dz],
        [-dx,0,dz],
        [dx,-dy,dz],
        [0,-dy,dz],
        [-dx,-dy,dz],
        [dx,dy,0],
        [0,dy,0],
        [-dx,dy,0],
        [dx,0,0],
        [0,0,0],
        [-dx,0,0],
        [dx,-dy,0],
        [0,-dy,0],
        [-dx,-dy,0],
        [dx,dy,-dz],
        [0,dy,-dz],
        [-dx,dy,-dz],
        [dx,0,-dz],
        [0,0,-dz],
        [-dx,0,-dz],
        [dx,-dy,-dz],
        [0,-dy,-dz],
        [-dx,-dy,-dz],
    ]
    regions=[]
    n=27
    for j in xrange(n):
        polydata=reader
        # Clip it with all 6 planes
        for i in xrange(6):
            plane=vtk.vtkPlane()
            plane.SetOrigin(Origins[i])
            plane.SetNormal(Normals[j][i])
            clipper = vtk.vtkClipPolyData()
            clipper.SetInputConnection(polydata.GetOutputPort())
            clipper.SetClipFunction(plane)
            polydata=clipper
            polydata.Update()
        # Move it if not empty
        if polydata.GetOutput().GetLength()>0:
            transform = vtk.vtkTransform()
            transform.Translate(Direction[j])
            transformFilter = vtk.vtkTransformPolyDataFilter()
            transformFilter.SetTransform(transform)
            transformFilter.SetInputConnection(polydata.GetOutputPort())
            transformFilter.Update()
            regions.append(vtk.vtkPolyData())
            regions[j].ShallowCopy(transformFilter.GetOutput())
        else:
            regions.append(vtk.vtkPolyData())
            regions[j].ShallowCopy(polydata.GetOutput())
    # Append the all regions
    appendFilter = vtk.vtkAppendPolyData()
    if vtk.VTK_MAJOR_VERSION <= 5:
        for j in xrange(n):
            appendFilter.AddInputConnection(regions[j].GetProducerPort())
    else:
        for j in xrange(n):
            appendFilter.AddInputData(regions[j])
    appendFilter.Update()
    #  Remove any duplicate points
    cleanFilter = vtk.vtkCleanPolyData()
    cleanFilter.SetInputConnection(appendFilter.GetOutputPort())
    cleanFilter.Update()
    # One more rotation - not needed
    # transform = vtk.vtkTransform()
    # transform.Translate(-6,-6,-6)
    # transformFilter = vtk.vtkTransformPolyDataFilter()
    # transformFilter.SetTransform(transform)
    # transformFilter.SetInputConnection(cleanFilter.GetOutputPort())
    # transformFilter.Update()
    # transform = vtk.vtkTransform()
    # transform.RotateWXYZ(90,1,0,0)
    # transform.RotateWXYZ(-90,0,1,0)
    # transformFilter2 = vtk.vtkTransformPolyDataFilter()
    # transformFilter2.SetTransform(transform)
    # transformFilter2.SetInputConnection(transformFilter.GetOutputPort())
    # transformFilter2.Update()
    # transform = vtk.vtkTransform()
    # transform.Translate(6,6,6)
    # transformFilter = vtk.vtkTransformPolyDataFilter()
    # transformFilter.SetTransform(transform)
    # transformFilter.SetInputConnection(transformFilter2.GetOutputPort())
    # transformFilter.Update()
    # Final data to be saved and displayed
    finalData=cleanFilter
    # Write the stl file to disk
    stlWriter = vtk.vtkSTLWriter()
    stlWriter.SetFileName(filenameOut)
    stlWriter.SetInputConnection(finalData.GetOutputPort())
    stlWriter.Write()
    if render:
        # Create mappper and actor for rendering
        mapper = vtk.vtkPolyDataMapper()
        if vtk.VTK_MAJOR_VERSION <= 5:
            mapper.SetInput(finalData.GetOutput())
        else:
            mapper.SetInputConnection(finalData.GetOutputPort())
        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
        # Create a rendering window and renderer
        ren = vtk.vtkRenderer()
        renWin = vtk.vtkRenderWindow()
        renWin.AddRenderer(ren)
        # Create a renderwindowinteractor
        iren = vtk.vtkRenderWindowInteractor()
        iren.SetRenderWindow(renWin)
        # Assign actor to the renderer
        ren.AddActor(actor)
        # Enable user interface interactor
        iren.Initialize()
        renWin.Render()
        iren.Start()
Example #57
0
#!/usr/bin/env python
 
import vtk
 
filename = "example1_python.stl"
 
sphereSource = vtk.vtkSphereSource()
sphereSource.Update()
 
# Write the stl file to disk
stlWriter = vtk.vtkSTLWriter()
stlWriter.SetFileName(filename)
stlWriter.SetInputConnection(sphereSource.GetOutputPort())
stlWriter.Write()
 
# Read and display for verification
reader = vtk.vtkSTLReader()
reader.SetFileName(filename)
 
mapper = vtk.vtkPolyDataMapper()
if vtk.VTK_MAJOR_VERSION <= 5:
    mapper.SetInput(reader.GetOutput())
else:
    mapper.SetInputConnection(reader.GetOutputPort())
 
actor = vtk.vtkActor()
actor.SetMapper(mapper)
 
# Create a rendering window and renderer
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
Example #58
0
    def _makeSTL(self):
        local_dir = self._gray_dir
        surface_dir = self._vol_dir+'_surfaces'+self._path_dlm
        try:
            os.mkdir(surface_dir)
        except:
            pass
        files = fnmatch.filter(sorted(os.listdir(local_dir)),'*.tif')
        counter = re.search("[0-9]*\.tif", files[0]).group()
        prefix = self._path_dlm+string.replace(files[0],counter,'')
        counter = str(len(counter)-4)
        prefixImageName = local_dir + prefix

        ### Create the renderer, the render window, and the interactor. The renderer
        # The following reader is used to read a series of 2D slices (images)
        # that compose the volume. The slice dimensions are set, and the
        # pixel spacing. The data Endianness must also be specified. The reader
        v16=vtk.vtkTIFFReader()

        v16.SetFilePrefix(prefixImageName)
        v16.SetDataExtent(0,100,0,100,1,len(files))
        v16.SetFilePattern("%s%0"+counter+"d.tif")
        v16.Update()

        im = v16.GetOutput()
        im.SetSpacing(self._pixel_dim[0],self._pixel_dim[1],self._pixel_dim[2])

        v = vte.vtkImageExportToArray()
        v.SetInputData(im)

        n = np.float32(v.GetArray())
        idx = np.argwhere(n)
        (ystart,xstart,zstart), (ystop,xstop,zstop) = idx.min(0),idx.max(0)+1
        I,J,K = n.shape
        if ystart > 5:
            ystart -= 5
        else:
            ystart = 0
        if ystop < I-5:
            ystop += 5
        else:
            ystop = I
        if xstart > 5:
            xstart -= 5
        else:
            xstart = 0
        if xstop < J-5:
            xstop += 5
        else:
            xstop = J
        if zstart > 5:
            zstart -= 5
        else:
            zstart = 0
        if zstop < K-5:
            zstop += 5
        else:
            zstop = K

        a = n[ystart:ystop,xstart:xstop,zstart:zstop]
        itk_img = sitk.GetImageFromArray(a)
        itk_img.SetSpacing([self._pixel_dim[0],self._pixel_dim[1],self._pixel_dim[2]])
        
        print "\n"
        print "-------------------------------------------------------"
        print "-- Applying Patch Based Denoising - this can be slow --"
        print "-------------------------------------------------------"
        print "\n"
        pb = sitk.PatchBasedDenoisingImageFilter()
        pb.KernelBandwidthEstimationOn()
        pb.SetNoiseModel(3) #use a Poisson noise model since this is confocal
        pb.SetNoiseModelFidelityWeight(1)
        pb.SetNumberOfSamplePatches(20)
        pb.SetPatchRadius(4)
        pb.SetNumberOfIterations(10)

        fimg = pb.Execute(itk_img)
        b = sitk.GetArrayFromImage(fimg)
        intensity = b.max()

        #grad = sitk.GradientMagnitudeRecursiveGaussianImageFilter()
        #grad.SetSigma(0.05)
        gf = sitk.GradientMagnitudeImageFilter()
        gf.UseImageSpacingOn()
        grad = gf.Execute(fimg)
        edge = sitk.Cast(sitk.BoundedReciprocal( grad ),sitk.sitkFloat32)


        print "\n"
        print "-------------------------------------------------------"
        print "---- Thresholding to deterimine initial level sets ----"
        print "-------------------------------------------------------"
        print "\n"
        t = 0.5
        seed = sitk.BinaryThreshold(fimg,t*intensity)
        #Opening (Erosion/Dilation) step to remove islands smaller than 2 voxels in radius)
        seed = sitk.BinaryMorphologicalOpening(seed,2)
        seed = sitk.BinaryFillhole(seed!=0)
        #Get connected regions
        r = sitk.ConnectedComponent(seed)
        labels = sitk.GetArrayFromImage(r)
        ids = sorted(np.unique(labels))
        N = len(ids)
        if N > 2:
            i = np.copy(N)
            while i == N and (t-self._tratio)>-1e-7:
                t -= 0.01
                seed = sitk.BinaryThreshold(fimg,t*intensity)
                #Opening (Erosion/Dilation) step to remove islands smaller than 2 voxels in radius)
                seed = sitk.BinaryMorphologicalOpening(seed,2)
                seed = sitk.BinaryFillhole(seed!=0)
                #Get connected regions
                r = sitk.ConnectedComponent(seed)
                labels = sitk.GetArrayFromImage(r)
                i = len(np.unique(labels))
                if i > N:
                    N = np.copy(i)
            t+=0.01
        else:
            t = np.copy(self._tratio)
        seed = sitk.BinaryThreshold(fimg,t*intensity)
        #Opening (Erosion/Dilation) step to remove islands smaller than 2 voxels in radius)
        seed = sitk.BinaryMorphologicalOpening(seed,2)
        seed = sitk.BinaryFillhole(seed!=0)
        #Get connected regions
        r = sitk.ConnectedComponent(seed)
        labels = sitk.GetArrayFromImage(r)
        labels = np.unique(labels)[1:]

        '''
        labels[labels==0] = -1
        labels = sitk.GetImageFromArray(labels)
        labels.SetSpacing([self._pixel_dim[0],self._pixel_dim[1],self._pixel_dim[2]])
        #myshow3d(labels,zslices=range(20))
        #plt.show()
        ls = sitk.ScalarChanAndVeseDenseLevelSetImageFilter()
        ls.UseImageSpacingOn()
        ls.SetLambda2(1.5)
        #ls.SetCurvatureWeight(1.0)
        ls.SetAreaWeight(1.0)
        #ls.SetReinitializationSmoothingWeight(1.0)
        ls.SetNumberOfIterations(100)
        seg = ls.Execute(sitk.Cast(labels,sitk.sitkFloat32),sitk.Cast(fimg,sitk.sitkFloat32))
        seg = sitk.Cast(seg,sitk.sitkUInt8)
        seg = sitk.BinaryMorphologicalOpening(seg,1)
        seg = sitk.BinaryFillhole(seg!=0)
        #Get connected regions
        #r = sitk.ConnectedComponent(seg)
        contours = sitk.BinaryContour(seg)
        myshow3d(sitk.LabelOverlay(sitk.Cast(fimg,sitk.sitkUInt8),contours),zslices=range(fimg.GetSize()[2]))
        plt.show()
        '''

        segmentation = sitk.Image(r.GetSize(),sitk.sitkUInt8)
        segmentation.SetSpacing([self._pixel_dim[0],self._pixel_dim[1],self._pixel_dim[2]])
        for l in labels:
            d = sitk.SignedMaurerDistanceMap(r==l,insideIsPositive=False,squaredDistance=True,useImageSpacing=True)
            #d = sitk.BinaryThreshold(d,-1000,0)
            #d = sitk.Cast(d,edge.GetPixelIDValue() )*-1+0.5
            #d = sitk.Cast(d,edge.GetPixelIDValue() )
            seg = sitk.GeodesicActiveContourLevelSetImageFilter()
            seg.SetPropagationScaling(1.0)
            seg.SetAdvectionScaling(1.0)
            seg.SetCurvatureScaling(0.5)
            seg.SetMaximumRMSError(0.01)
            levelset = seg.Execute(d,edge)
            levelset = sitk.BinaryThreshold(levelset,-1000,0)
            segmentation = sitk.Add(segmentation,levelset)
            print ("RMS Change for Cell %d: "% l,seg.GetRMSChange())
            print ("Elapsed Iterations for Cell %d: "% l, seg.GetElapsedIterations())
        '''
        contours = sitk.BinaryContour(segmentation)
        myshow3d(sitk.LabelOverlay(sitk.Cast(fimg,sitk.sitkUInt8),contours),zslices=range(fimg.GetSize()[2]))
        plt.show()
        '''

        n[ystart:ystop,xstart:xstop,zstart:zstop] = sitk.GetArrayFromImage(segmentation)*100

        i = vti.vtkImageImportFromArray()
        i.SetDataSpacing([self._pixel_dim[0],self._pixel_dim[1],self._pixel_dim[2]])
        i.SetDataExtent([0,100,0,100,1,len(files)])
        i.SetArray(n)
        i.Update()

        thres=vtk.vtkImageThreshold()
        thres.SetInputData(i.GetOutput())
        thres.ThresholdByLower(0)
        thres.ThresholdByUpper(101)

        iso=vtk.vtkImageMarchingCubes()
        iso.SetInputConnection(thres.GetOutputPort())
        iso.SetValue(0,1)

        regions = vtk.vtkConnectivityFilter()
        regions.SetInputConnection(iso.GetOutputPort())
        regions.SetExtractionModeToAllRegions()
        regions.ColorRegionsOn()
        regions.Update()

        N = regions.GetNumberOfExtractedRegions()
        for i in xrange(N):
            r = vtk.vtkConnectivityFilter()
            r.SetInputConnection(iso.GetOutputPort())
            r.SetExtractionModeToSpecifiedRegions()
            r.AddSpecifiedRegion(i)
            g = vtk.vtkExtractUnstructuredGrid()
            g.SetInputConnection(r.GetOutputPort())
            geo = vtk.vtkGeometryFilter()
            geo.SetInputConnection(g.GetOutputPort())
            geo.Update()
            t = vtk.vtkTriangleFilter()
            t.SetInputConnection(geo.GetOutputPort())
            t.Update()
            cleaner = vtk.vtkCleanPolyData()
            cleaner.SetInputConnection(t.GetOutputPort())
            s = vtk.vtkSmoothPolyDataFilter()
            s.SetInputConnection(cleaner.GetOutputPort())
            s.SetNumberOfIterations(50)
            dl = vtk.vtkDelaunay3D()
            dl.SetInputConnection(s.GetOutputPort())
            dl.Update()

            self.cells.append(dl)

        for i in xrange(N):
            g = vtk.vtkGeometryFilter()
            g.SetInputConnection(self.cells[i].GetOutputPort())
            t = vtk.vtkTriangleFilter()
            t.SetInputConnection(g.GetOutputPort())

            #get the surface points of the cells and save to points attribute
            v = t.GetOutput()
            points = []
            for j in xrange(v.GetNumberOfPoints()):
                p = [0,0,0]
                v.GetPoint(j,p)
                points.append(p)
            self.points.append(points)

            #get the volume of the cell
            vo = vtk.vtkMassProperties()
            vo.SetInputConnection(t.GetOutputPort())
            self.volumes.append(vo.GetVolume())

            stl = vtk.vtkSTLWriter()
            stl.SetInputConnection(t.GetOutputPort())
            stl.SetFileName(surface_dir+'cell%02d.stl' % (i+self._counter))
            stl.Write()

        if self._display:
            skinMapper = vtk.vtkDataSetMapper()
            skinMapper.SetInputConnection(regions.GetOutputPort())
            skinMapper.SetScalarRange(regions.GetOutput().GetPointData().GetArray("RegionId").GetRange())
            skinMapper.SetColorModeToMapScalars()
            #skinMapper.ScalarVisibilityOff()
            skinMapper.Update()

            skin = vtk.vtkActor()
            skin.SetMapper(skinMapper)
            #skin.GetProperty().SetColor(0,0,255)

            # An outline provides context around the data.
            #
            outlineData = vtk.vtkOutlineFilter()
            outlineData.SetInputConnection(v16.GetOutputPort())

            mapOutline = vtk.vtkPolyDataMapper()
            mapOutline.SetInputConnection(outlineData.GetOutputPort())

            outline = vtk.vtkActor()
            #outline.SetMapper(mapOutline)
            #outline.GetProperty().SetColor(0,0,0)

            colorbar = vtk.vtkScalarBarActor()
            colorbar.SetLookupTable(skinMapper.GetLookupTable())
            colorbar.SetTitle("Cells")
            colorbar.SetNumberOfLabels(N)


            # Create the renderer, the render window, and the interactor. The renderer
            # draws into the render window, the interactor enables mouse- and 
            # keyboard-based interaction with the data within the render window.
            #
            aRenderer = vtk.vtkRenderer()
            renWin = vtk.vtkRenderWindow()
            renWin.AddRenderer(aRenderer)
            iren = vtk.vtkRenderWindowInteractor()
            iren.SetRenderWindow(renWin)

            # It is convenient to create an initial view of the data. The FocalPoint
            # and Position form a vector direction. Later on (ResetCamera() method)
            # this vector is used to position the camera to look at the data in
            # this direction.
            aCamera = vtk.vtkCamera()
            aCamera.SetViewUp (0, 0, -1)
            aCamera.SetPosition (0, 1, 0)
            aCamera.SetFocalPoint (0, 0, 0)
            aCamera.ComputeViewPlaneNormal()

            # Actors are added to the renderer. An initial camera view is created.
            # The Dolly() method moves the camera towards the FocalPoint,
            # thereby enlarging the image.
            aRenderer.AddActor(outline)
            aRenderer.AddActor(skin)
            aRenderer.AddActor(colorbar)
            aRenderer.SetActiveCamera(aCamera)
            aRenderer.ResetCamera ()
            aCamera.Dolly(1.5)

            # Set a background color for the renderer and set the size of the
            # render window (expressed in pixels).
            aRenderer.SetBackground(0.0,0.0,0.0)
            renWin.SetSize(800, 600)

            # Note that when camera movement occurs (as it does in the Dolly()
            # method), the clipping planes often need adjusting. Clipping planes
            # consist of two planes: near and far along the view direction. The 
            # near plane clips out objects in front of the plane the far plane
            # clips out objects behind the plane. This way only what is drawn
            # between the planes is actually rendered.
            aRenderer.ResetCameraClippingRange()

            im=vtk.vtkWindowToImageFilter()
            im.SetInput(renWin)

            iren.Initialize();
            iren.Start();

        #remove gray directory
        shutil.rmtree(local_dir)