def SurfaceDistance(threeDRA_path, CBCT_path, output_path):
    reader3DRA = vtk.vtkSTLReader()
    reader3DRA.SetFileName(threeDRA_path)
    reader3DRA.Update()
    threeDRA = reader3DRA.GetOutput()

    readerCBCT = vtk.vtkSTLReader()
    readerCBCT.SetFileName(CBCT_path)
    readerCBCT.Update()
    CBCT = readerCBCT.GetOutput()

    distanceFilter = vtk.vtkDistancePolyDataFilter()
    distanceFilter.SetInputData(0, threeDRA)
    distanceFilter.SetInputData(1, CBCT)
    distanceFilter.Update()

    # extract lcc object
    connectivityFilter = vtk.vtkPolyDataConnectivityFilter()
    connectivityFilter.SetInputData(distanceFilter.GetOutput())
    connectivityFilter.Update()

    writer = vtk.vtkXMLPolyDataWriter()
    writer.SetFileName(output_path)
    writer.SetInputData(connectivityFilter.GetOutput())
    writer.Update()
Esempio n. 2
0
def create_or_get_bone_distanced():
    cf_bone = create_contour(BONE_ISO_VALUE)
    cf_skin = create_contour(SKIN_ISO_VALUE)
    color_mapper = vtk.vtkPolyDataMapper()

    if not os.path.exists("bone_distance.vtk"):
        distance_pdFilter = vtk.vtkDistancePolyDataFilter()
        distance_pdFilter.SetInputConnection(0, cf_bone.GetOutputPort())
        distance_pdFilter.SetInputConnection(1, cf_skin.GetOutputPort())
        distance_pdFilter.SignedDistanceOff()
        distance_pdFilter.Update()

        # write in the files
        writer = vtk.vtkPolyDataWriter()
        writer.SetFileName("bone_distance.vtk")
        writer.SetInputData(distance_pdFilter.GetOutput())
        writer.Write()

        color_mapper.SetInputData(distance_pdFilter.GetOutput())
        color_mapper.SetScalarRange(distance_pdFilter.GetOutput().GetPointData().GetScalars().GetRange())

    else:
        reader = vtk.vtkPolyDataReader()
        reader.SetFileName("bone_distance.vtk")
        reader.Update()

        color_mapper.SetInputConnection(reader.GetOutputPort())
        color_mapper.SetScalarRange(reader.GetOutput().GetScalarRange())

    bone = vtk.vtkActor()
    bone.SetMapper(color_mapper)

    return bone
Esempio n. 3
0
def actors_step_4(mapper_bone, mapper_leg):
    """
    Creates the visualization actors for step 4
    :param mapper_bone: The Mapper of the bone
    :param mapper_leg: The Mapper of the leg
    :return: The list with the distance bone actor
    """
    print('start step 4')
    start = time.perf_counter()

    if not os.path.isfile(FILENAME_STEP_4):
        distance_filter = vtk.vtkDistancePolyDataFilter()
        distance_filter.SetInputData(0, mapper_bone.GetInput())
        distance_filter.SetInputData(1, mapper_leg.GetInput())
        distance_filter.SignedDistanceOff()
        distance_filter.Update()

        writer_vtk(FILENAME_STEP_4, distance_filter.GetOutput())

    reader = reader_vtk(FILENAME_STEP_4)

    end = time.perf_counter()
    print(f"End of step 4 in: {end - start:0.4f} seconds")

    mapper_distance = vtk.vtkPolyDataMapper()
    mapper_distance.SetInputData(reader.GetOutput())
    mapper_distance.SetScalarRange(reader.GetOutput().GetPointData().GetScalars().GetRange())
    
    actor_distance = vtk.vtkActor()
    actor_distance.SetMapper(mapper_distance)

    return [actor_distance]
Esempio n. 4
0
def distance_color(data1, data2, filename):
    """Either generates or reads a polydata object colored depending on the distance to another object
    If the filename provided already exists on the file system, the function tries to read it and returns an actor.
    If not, the function generates a distance filter and returns an actor (this takes a long time).
    """
    if isfile(filename):
        dist_polydata = read_from_file(filename)
    else:
        dist_filter = vtk.vtkDistancePolyDataFilter()
        dist_filter.SignedDistanceOff()
        dist_filter.SetInputConnection(0, data1.GetOutputPort())
        dist_filter.SetInputConnection(1, data2.GetOutputPort())
        dist_filter.Update()

        dist_polydata = dist_filter.GetOutput()

        write_to_file(dist_polydata, filename)

    dist_ranges = dist_polydata.GetPointData().GetScalars().GetRange()

    color_mapper = vtk.vtkPolyDataMapper()
    color_mapper.SetInputData(dist_polydata)
    color_mapper.SetScalarRange(dist_ranges[0], dist_ranges[1])

    bone_color = vtk.vtkActor()
    bone_color.SetMapper(color_mapper)

    return bone_color
Esempio n. 5
0
 def _get_assd(p_surf, g_surf):
     dist_fltr = vtk.vtkDistancePolyDataFilter()
     dist_fltr.SetInputData(1, p_surf)
     dist_fltr.SetInputData(0, g_surf)
     dist_fltr.SignedDistanceOff()
     dist_fltr.Update()
     distance_poly = vtk_to_numpy(
         dist_fltr.GetOutput().GetPointData().GetArray(0))
     return np.mean(distance_poly), dist_fltr.GetOutput()
Esempio n. 6
0
def polydata_distance(mflo, mref, do_signed=True):
    """ distance from mflo to mref """
    pdd = vtk.vtkDistancePolyDataFilter()
    pdd.SetSignedDistance(do_signed)  #pdd.SignedDistanceOff()
    pdd.SetInputData(0, mflo)
    pdd.SetInputData(1, mref)

    pdd.Update()
    return pdd.GetOutput()
Esempio n. 7
0
def surface_distance(p_surf, g_surf):
    dist_fltr = vtk.vtkDistancePolyDataFilter()
    dist_fltr.SetInputData(1, p_surf)
    dist_fltr.SetInputData(0, g_surf)
    dist_fltr.SignedDistanceOff()
    dist_fltr.Update()
    distance = vtk_to_numpy(
        dist_fltr.GetOutput().GetPointData().GetArray('Distance'))
    return distance, dist_fltr.GetOutput()
Esempio n. 8
0
    def showColorMap(self):

        # Get PolyData from Segment 1
        self.segment1.CreateClosedSurfaceRepresentation()
        ss1 = self.segment1.GetSegmentation()
        str1 = ss1.GetNthSegmentID(0)
        pl1 = vtk.vtkPolyData()
        pl1 = self.segment1.GetClosedSurfaceRepresentation(str1)

        # Get PolyData from Segment 2
        self.segment2.CreateClosedSurfaceRepresentation()
        ss2 = self.segment2.GetSegmentation()
        str2 = ss2.GetNthSegmentID(0)
        pl2 = vtk.vtkPolyData()
        pl2 = self.segment2.GetClosedSurfaceRepresentation(str2)

        # Compute distance
        distanceFilter = vtk.vtkDistancePolyDataFilter()
        distanceFilter.SetInputData(0, pl1)
        distanceFilter.SetInputData(1, pl2)
        distanceFilter.SignedDistanceOff()
        distanceFilter.Update()

        # Center 3D view
        #slicer.app.layoutManager().tableWidget(0).setVisible(False)
        layoutManager = slicer.app.layoutManager()
        threeDWidget = layoutManager.threeDWidget(0)
        threeDView = threeDWidget.threeDView()
        threeDView.resetFocalPoint()

        # Output model
        model = slicer.vtkMRMLModelNode()
        slicer.mrmlScene.AddNode(model)
        model.SetName('DistanceModelNode')
        model.SetAndObservePolyData(distanceFilter.GetOutput())
        self.distanceColorMap_display = slicer.vtkMRMLModelDisplayNode()
        slicer.mrmlScene.AddNode(self.distanceColorMap_display)
        model.SetAndObserveDisplayNodeID(self.distanceColorMap_display.GetID())
        self.distanceColorMap_display.SetActiveScalarName('Distance')
        self.distanceColorMap_display.SetAndObserveColorNodeID(
            'vtkMRMLColorTableNodeFileDivergingBlueRed.txt')
        self.distanceColorMap_display.SetScalarVisibility(True)
        self.distanceColorMap_display.SetScalarRangeFlag(
            0)  # Set scalar range mode to Manual
        self.distanceColorMap_display.SetScalarRange(0.0, 10.0)

        [rmin, rmax] = self.distanceColorMap_display.GetScalarRange()
        print(rmin)
        print(rmax)

        # Scalar bar
        self.updateScalarBarRange(0.0, 10.0)
        self.updateScalarBarVisibility(True)

        # Deactivate visibility of segments (deberia actualizarse el checkbox del GUI pero no lo consigo)
        self.updateSegment1Visibility(False)
        self.updateSegment2Visibility(False)
Esempio n. 9
0
def CreateBoneColor(cb, cs):
    data = vtk.vtkDistancePolyDataFilter()
    data.SignedDistanceOff()
    data.SetInputConnection(0, cb.GetOutputPort())
    data.SetInputConnection(1, cs.GetOutputPort())
    data.Update()

    write = vtk.vtkPolyDataWriter()
    write.SetFileName("data_bone.vtk")
    write.SetInputConnection(data.GetOutputPort())
    write.Write()

    return data
Esempio n. 10
0
def surfacedistance(surface, referencesurface, distancearrayname='distance',
                    signeddistance=False):
    """Calculate unsigned distance to the reference surface at each point of the
    input surface."""
    distance = vtk.vtkDistancePolyDataFilter()
    distance.SetInput(0, surface)
    distance.SetInput(1, referencesurface)
    if signeddistance:
        distance.SetSignedDistance(signeddistance)
    distance.Update()
    osurface = distance.GetOutput()
    osurface.GetPointData().GetArray('Distance').SetName(distancearrayname)
    osurface.GetCellData().RemoveArray('Distance')
    return osurface
Esempio n. 11
0
def surfacedistance(surface,
                    referencesurface,
                    distancearrayname='distance',
                    signeddistance=False):
    """Calculate unsigned distance to the reference surface at each point of the
    input surface."""
    distance = vtk.vtkDistancePolyDataFilter()
    distance.SetInput(0, surface)
    distance.SetInput(1, referencesurface)
    if signeddistance:
        distance.SetSignedDistance(signeddistance)
    distance.Update()
    osurface = distance.GetOutput()
    osurface.GetPointData().GetArray('Distance').SetName(distancearrayname)
    osurface.GetCellData().RemoveArray('Distance')
    return osurface
	def ClosestPoint(self,signed=True,inverse=False):
		distancefilter=vtk.vtkDistancePolyDataFilter()

		if inverse:
			distancefilter.SetInputData(1,self.getPolydata('A'))
			distancefilter.SetInputData(0,self.getPolydata('B'))
		else:
			distancefilter.SetInputData(0,self.getPolydata('A'))
			distancefilter.SetInputData(1,self.getPolydata('B'))

		distancefilter.SetSignedDistance(signed)
		distancefilter.Update()

		datavtkfloat=distancefilter.GetOutput().GetPointData().GetScalars()
		dist = vtk_to_numpy(datavtkfloat)

		return dist.tolist()
Esempio n. 13
0
def calculateBonesContactData(
                                vtkBoneA,
                                vtkBoneB,
                             ):

    distanceFilter = vtk.vtkDistancePolyDataFilter()
    if vtk.VTK_MAJOR_VERSION <= 5:
        distanceFilter.SetInput(0, vtkBoneA)
        distanceFilter.SetInput(1, vtkBoneB)
    else:
        distanceFilter.SetInputData(0, vtkBoneA)
        distanceFilter.SetInputData(1, vtkBoneB)
    distanceFilter.Update()
    
    vtkBoneADistance = distanceFilter.GetOutput()
    vtkBoneBDistance = distanceFilter.GetSecondDistanceOutput()
    
    return vtkBoneADistance, vtkBoneBDistance
Esempio n. 14
0
def create_renderer_4(bone, skin):
    '''
    Return the fourth renderer
    '''
    distanceFilter = None
    # writing to the file or open from file
    if write_file:
        # computing the distance between the bone and the skin
        distanceFilter = vtk.vtkDistancePolyDataFilter()
        distanceFilter.SetInputConnection(0, bone.GetOutputPort())
        distanceFilter.SetInputConnection(1, skin.GetOutputPort())
        distanceFilter.Update()

        # writing data
        writer = vtk.vtkPolyDataWriter()
        writer.SetInputConnection(distanceFilter.GetOutputPort())
        writer.SetFileName('bone_distances.vtk')
        writer.Update()
    else:
        reader = vtk.vtkPolyDataReader()
        reader.SetFileName('bone_distances.vtk')
        reader.Update()

        distanceFilter = reader

    # creating bone actor
    mapper = vtk.vtkDataSetMapper()
    mapper.SetInputConnection(distanceFilter.GetOutputPort())
    mapper.SetScalarRange(
        distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[0],
        distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[1])
    # inversing colors
    table = mapper.GetLookupTable()
    table.SetHueRange(2 / 3, 0)
    table.Build()

    bone_actor = vtk.vtkActor()
    bone_actor.SetMapper(mapper)

    # creating renderer
    ren = create_renderer([bone_actor])
    ren.SetBackground(0.824, 0.827, 0.824)

    return ren
Esempio n. 15
0
def create_distance_map(tumor, ablation):
    distance_filter = vtk.vtkDistancePolyDataFilter()
    distance_filter.SignedDistanceOn()
    distance_filter.SetInputConnection(1, tumor.GetOutputPort())
    distance_filter.SetInputConnection(0, ablation.GetOutputPort())
    distance_filter.Update()

    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputConnection(distance_filter.GetOutputPort())
    mapper.SetScalarRange(
        distance_filter.GetOutput().GetPointData().GetScalars().GetRange()[0],
        distance_filter.GetOutput().GetPointData().GetScalars().GetRange()[1])
    print(
        'Min distance: ',
        distance_filter.GetOutput().GetPointData().GetScalars().GetRange()[0])
    print(
        'Max distance: ',
        distance_filter.GetOutput().GetPointData().GetScalars().GetRange()[1])
    mapper.SetScalarRange(-5, 15)

    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    # actor.GetProperty().SetOpacity(0.75)
    scalar_bar = vtk.vtkScalarBarActor()
    scalar_bar.SetLookupTable(mapper.GetLookupTable())
    scalar_bar.SetTitle("Distance")
    scalar_bar.SetNumberOfLabels(3)

    hueLut = vtk.vtkLookupTable()
    hueLut.SetTableRange(0, 10)
    hueLut.SetHueRange(0, 0.4)
    hueLut.SetSaturationRange(1, 1)
    hueLut.SetValueRange(1, 1)
    hueLut.Build()

    mapper.SetLookupTable(hueLut)
    scalar_bar.SetLookupTable(hueLut)

    return actor, scalar_bar
Esempio n. 16
0
def compute_surface_to_surface_distance(isocontour1: vtk.vtkPolyData, isocontour2: vtk.vtkPolyData) -> vtk.vtkPolyData:
    """Calculates the surface-to-surface distance between two isocontours.

    Args:
        isocontour1 (vtk.vtkPolyData): The first isocontour.
        isocontour2 (vtk.vtkPolyData): The second isocontour.

    Returns:
        (vtk.vtkPolyData)
    """
    cleaner1 = vtk.vtkCleanPolyData()
    cleaner1.SetInputData(isocontour1)

    cleaner2 = vtk.vtkCleanPolyData()
    cleaner2.SetInputData(isocontour2)

    distance_filter = vtk.vtkDistancePolyDataFilter()
    distance_filter.SetInputConnection(0, cleaner1.GetOutputPort())
    distance_filter.SetInputConnection(1, cleaner2.GetOutputPort())
    distance_filter.Update()

    return distance_filter.GetOutput()
Esempio n. 17
0
def join2Polydata(vtkPolydata1,
                  vtkPolydata2,
                  threshold1='lower',
                  threshold2='upper',
                  outThres=False,
                  saveIntersect=False):
    """ Function finds the intersect of two polydata and returns the append of the 2.
    """
    import modelTools as mT

    # NOTE: Test this to deal with inaccuracies.
    # Copy the structure from the inputs.
    vtkpolyStructure1 = vtk.vtkPolyData()
    vtkpolyStructure1.CopyStructure(vtkPolydata1)
    vtkpolyStructure2 = vtk.vtkPolyData()
    vtkpolyStructure2.CopyStructure(vtkPolydata2)

    # Make triangular mesh from the polydata.
    tri1Filt = vtk.vtkTriangleFilter()
    tri1Filt.SetInputData(vtkpolyStructure1)
    tri1Filt.Update()
    tri2Filt = vtk.vtkTriangleFilter()
    tri2Filt.SetInputData(vtkpolyStructure2)
    tri2Filt.Update()

    # Use the clean polydata filter
    if False:
        tri1CleanFilt = vtk.vtkCleanPolyData()
        tri1CleanFilt.SetInputConnection(tri1Filt.GetOutputPort())
        tri1CleanFilt.Update()
        tri2CleanFilt = vtk.vtkCleanPolyData()
        tri2CleanFilt.SetInputConnection(tri2Filt.GetOutputPort())
        tri2CleanFilt.Update()

        # Try on local grid
        locPoint = np.concatenate(
            (np.sum(np.array(tri2Filt.GetOutput().GetBounds())[0:4].reshape(
                (2, 2)),
                    axis=1) / 2, np.array([0])))
        tri1Loc = transformToLocalCoords(locPoint, tri1CleanFilt.GetOutput())
        tri2Loc = transformToLocalCoords(locPoint, tri2CleanFilt.GetOutput())
    else:
        # Try on local grid
        locPoint = np.concatenate(
            (np.sum(np.array(tri2Filt.GetOutput().GetBounds())[0:4].reshape(
                (2, 2)),
                    axis=1) / 2, np.array([0])))
        tri1Loc = transformToLocalCoords(locPoint, tri1Filt.GetOutput())
        tri2Loc = transformToLocalCoords(locPoint, tri2Filt.GetOutput())

    # Setup the intersect.
    polyIntersectFilt = vtk.vtkIntersectionPolyDataFilter()
    polyIntersectFilt.SplitFirstOutputOn()
    polyIntersectFilt.SplitSecondOutputOn()
    polyIntersectFilt.SetInputData(0, tri1Loc)
    polyIntersectFilt.SetInputData(1, tri2Loc)
    polyIntersectFilt.Update()

    # Temp: save the outputs
    if saveIntersect:
        io.writeVTPFile('InterSect0.vtp', polyIntersectFilt.GetOutput(0))
        io.writeVTPFile('InterSect1.vtp', polyIntersectFilt.GetOutput(1))
        io.writeVTPFile('InterSect2.vtp', polyIntersectFilt.GetOutput(2))
    # To do: need to check if they intersect.
    # Calculate the distance of the intersect
    polyDist = vtk.vtkDistancePolyDataFilter()
    polyDist.SetInputConnection(0, polyIntersectFilt.GetOutputPort(1))
    polyDist.SetInputConnection(1, polyIntersectFilt.GetOutputPort(2))
    if saveIntersect:
        polyDist.Update()
        io.writeVTPFile('distPoly0.vtp', polyDist.GetOutput(0))
        io.writeVTPFile('distPoly1.vtp', polyDist.GetOutput(1))
    poly0thr = vtk.vtkThreshold()
    poly0thr.AllScalarsOn()
    poly0thr.SetInputArrayToProcess(0, 0, 0,
                                    vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS,
                                    'Distance')
    poly0thr.SetInputConnection(polyDist.GetOutputPort(0))
    if threshold1 == 'lower':
        poly0thr.ThresholdByLower(0.0)
    else:
        poly0thr.ThresholdByUpper(0.0)
    poly0surf = vtk.vtkDataSetSurfaceFilter()
    poly0surf.SetInputConnection(poly0thr.GetOutputPort())
    poly1thr = vtk.vtkThreshold()
    poly1thr.AllScalarsOn()
    poly1thr.SetInputArrayToProcess(0, 0, 0,
                                    vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS,
                                    'Distance')
    poly1thr.SetInputConnection(polyDist.GetOutputPort(1))
    if threshold2 == 'upper':
        poly1thr.ThresholdByUpper(0.0)
    else:
        poly1thr.ThresholdByLower(0.0)
    poly1surf = vtk.vtkDataSetSurfaceFilter()
    poly1surf.SetInputConnection(poly1thr.GetOutputPort())
    # Append the polydata's
    polyAppendFilt = vtk.vtkAppendPolyData()
    polyAppendFilt.SetInputConnection(poly0surf.GetOutputPort())
    polyAppendFilt.AddInputConnection(poly1surf.GetOutputPort())
    polyAppendFilt.Update()
    # Return the appended polydata
    if outThres:
        return transformToLocalCoords(
            -locPoint, polyAppendFilt.GetOutput()), transformToLocalCoords(
                -locPoint, poly0surf.GetOutput()), transformToLocalCoords(
                    -locPoint, poly1surf.GetOutput())
    else:
        return transformToLocalCoords(-locPoint, polyAppendFilt.GetOutput())
Esempio n. 18
0
def AccuracyPlotter(meshA, meshB, rmax=[]):
    """ Plot mesh accuracy between A and B """
    distfilt = vtk.vtkDistancePolyDataFilter()
    if vtk.vtkVersion().GetVTKMajorVersion() > 5:
        distfilt.SetInputData(0, meshA)
        distfilt.SetInputData(1, meshB)
    else:
        distfilt.SetInput(0, meshA)
        distfilt.SetInput(1, meshB)
    distfilt.ComputeSecondDistanceOn()
    distfilt.Update()
    distvtk = distfilt.GetOutput()

    # Make absolute value
    dist = VN.vtk_to_numpy(distvtk.GetPointData().GetScalars())
    dist = np.abs(dist)
    vtkfloat = VN.numpy_to_vtk(np.ascontiguousarray(dist), deep=True)
    distvtk.GetPointData().SetScalars(vtkfloat)

    # if range has not been specified
    if not rmax:
        dist = VN.vtk_to_numpy(distvtk.GetPointData().GetScalars())
        rmax = dist.max()

    # Create lookup table
    look = vtk.vtkLookupTable()
    look.SetHueRange(0.33, 0)
    look.SetTableRange(0, rmax)
    look.SetSaturationRange(1, 1)
    look.SetValueRange(1, 1)
    look.Build()

    # Create mapper
    mapper = vtk.vtkDataSetMapper()
    if vtk.vtkVersion().GetVTKMajorVersion() > 5:
        mapper.SetInputData(distvtk)
    else:
        mapper.SetInput(distvtk)
    mapper.SetScalarRange(0, rmax)
    mapper.SetLookupTable(look)

    # Create Actor
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    actor.GetProperty().EdgeVisibilityOn()
    actor.GetProperty().SetColor(1, 1, 1)
    actor.GetProperty().LightingOff()

    scalarBar = vtk.vtkScalarBarActor()
    scalarBar.SetLookupTable(look)
    scalarBar.SetTitle('Accuracy')
    scalarBar.SetNumberOfLabels(5)

    # Add FEM Actor to renderer window
    ren = vtk.vtkRenderer()
    ren.SetBackground(0.3, 0.3, 0.3)
    renWin = vtk.vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    # Allow user to interact
    istyle = vtk.vtkInteractorStyleTrackballCamera()
    iren.SetInteractorStyle(istyle)

    # Add actor
    ren.AddActor(actor)
    ren.AddActor(scalarBar)

    # Render
    iren.Initialize()
    renWin.Render()
    renWin.SetWindowName('FEM to STL Accuracy')
    iren.Start()
Esempio n. 19
0
def colorBones(mcBone, mcSkin):
    """ Create the colored distance visualisation of the bone to the skin.
        The bone is colored from blue (far) to red (close) based on its
        distance to the skin. This function looks for a file named
        'distanceFilter.vtk' in the current directory and if it exists, it
        reads the necessary data from it (thus saving a processing time).
        If the file is not to be found, the script processes the distances and
        saves the result in a file with the same name as above.
    Args:
        mcBone: vtkMarchingCubes used to create the bone
        mcSkin: vtkMarchingCubes used to create the skin
    Returns:
        vtkAssembly
    """

    SAVED_DISTANCE_FILEPATH = './distanceFilter.vtk'

    # Get the distance between the bone and the skin
    # If a saved file already exists, use iter
    distanceFilter = vtk.vtkDistancePolyDataFilter()
    if (os.path.isfile(SAVED_DISTANCE_FILEPATH)):
        # Read from saved file
        reader = vtk.vtkPolyDataReader()
        reader.SetFileName(SAVED_DISTANCE_FILEPATH)
        reader.Update()
        input = reader.GetOutput()

        distanceFilter = vtk.vtkCleanPolyData()
        distanceFilter.SetInputData(input)
    else:
        # Compute the data
        distanceFilter.SetInputData(0, mcBone.GetOutput())
        distanceFilter.SetInputData(1, mcSkin.GetOutput())
        distanceFilter.Update()

        # Save to file
        writer = vtk.vtkPolyDataWriter()
        writer.SetInputConnection(distanceFilter.GetOutputPort())
        writer.SetFileName(SAVED_DISTANCE_FILEPATH)
        writer.Update()

    # Update
    distanceFilter.Update()

    mapper = vtk.vtkPolyDataMapper()

    # Set the coloring range
    lut = mapper.GetLookupTable()
    lut.SetHueRange(2 / 3, 0)
    lut.Build()

    # Apply the color
    mapper.SetInputConnection(distanceFilter.GetOutputPort())
    mapper.SetScalarRange(
        distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[0],
        distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[1])

    actorBone = vtk.vtkActor()
    actorBone.SetMapper(mapper)
    actorBone.GetProperty().SetColor(0.9, 0.9, 0.9)

    # Group the actors
    assembly = vtk.vtkAssembly()
    assembly.AddPart(actorBone)

    return assembly
Esempio n. 20
0
def AccuracyPlotter(meshA, meshB, rmax=[]):
    """ Plot mesh accuracy between A and B """
    distfilt = vtk.vtkDistancePolyDataFilter()
    if vtk.vtkVersion().GetVTKMajorVersion() >5:
        distfilt.SetInputData(0, meshA)
        distfilt.SetInputData(1, meshB)
    else:
        distfilt.SetInput(0, meshA)
        distfilt.SetInput(1, meshB)
    distfilt.ComputeSecondDistanceOn()
    distfilt.Update()
    distvtk = distfilt.GetOutput()
    
    # Make absolute value
    dist = VN.vtk_to_numpy(distvtk.GetPointData().GetScalars())
    dist = np.abs(dist)
    vtkfloat = VN.numpy_to_vtk(np.ascontiguousarray(dist), deep=True)
    distvtk.GetPointData().SetScalars(vtkfloat)
    
    # if range has not been specified
    if not rmax:
        dist = VN.vtk_to_numpy(distvtk.GetPointData().GetScalars())
        rmax =  dist.max()

    # Create lookup table
    look = vtk.vtkLookupTable()
    look.SetHueRange(0.33, 0)
    look.SetTableRange (0, rmax)
    look.SetSaturationRange (1, 1)
    look.SetValueRange (1, 1)
    look.Build()

    # Create mapper
    mapper = vtk.vtkDataSetMapper()
    if vtk.vtkVersion().GetVTKMajorVersion() >5:
        mapper.SetInputData(distvtk)
    else:
        mapper.SetInput(distvtk)
    mapper.SetScalarRange(0, rmax)
    mapper.SetLookupTable(look)

    # Create Actor
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    actor.GetProperty().EdgeVisibilityOn()
    actor.GetProperty().SetColor(1, 1, 1)
    actor.GetProperty().LightingOff()

    scalarBar = vtk.vtkScalarBarActor()
    scalarBar.SetLookupTable(look)
    scalarBar.SetTitle('Accuracy')
    scalarBar.SetNumberOfLabels(5)    
    
    # Add FEM Actor to renderer window
    ren = vtk.vtkRenderer()
    ren.SetBackground(0.3, 0.3, 0.3)
    renWin = vtk.vtkRenderWindow()
    renWin.AddRenderer(ren)
    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)
    
    # Allow user to interact
    istyle = vtk.vtkInteractorStyleTrackballCamera()
    iren.SetInteractorStyle(istyle)
    
    # Add actor
    ren.AddActor(actor)
    ren.AddActor(scalarBar)

    # Render
    iren.Initialize()
    renWin.Render()
    renWin.SetWindowName('FEM to STL Accuracy')
    iren.Start()
Esempio n. 21
0
clipTransparentMapper.ScalarVisibilityOff()

clippedTransparentSkinActor = vtk.vtkActor()
clippedTransparentSkinActor.SetMapper(clipTransparentMapper)
clippedTransparentSkinActor.SetProperty(frontProp)
clippedTransparentSkinActor.SetBackfaceProperty(backProp)

# coloration de l'os selon la distance à la peau
# utilise un fichier sauvegardé si disponible et non forcé à le réécrire
if os.path.isfile(KNEE_COLOR_FILE) and not(WRITE_FILE):
    vtkReader = vtk.vtkXMLPolyDataReader()
    vtkReader.SetFileName(KNEE_COLOR_FILE)
    vtkReader.Update()
    boneFilter = vtkReader
else: 
    boneFilter = vtk.vtkDistancePolyDataFilter()
    boneFilter.SetInputConnection(0, boneSurface.GetOutputPort())
    boneFilter.SetInputConnection(1, skinSurface.GetOutputPort())
    boneFilter.Update()

    vtkWriter = vtk.vtkXMLPolyDataWriter()
    vtkWriter.SetInputData(boneFilter.GetOutput())
    vtkWriter.SetFileName(KNEE_COLOR_FILE)
    vtkWriter.Write()

colorsArray = vtk.vtkLookupTable()
colorsArray.SetHueRange(0.8, 0)
colorsArray.Build()

distanceMapper = vtk.vtkPolyDataMapper()
distanceMapper.SetInputConnection(boneFilter.GetOutputPort() )
Esempio n. 22
0
def CreateRen4(slcr, cam, viewport, background):
    
    if os.path.isfile('data_bone.vtk'):
        read = vtk.vtkPolyDataReader()
        read.SetFileName("data_bone.vtk")
        read.Update()
        
        mapperBone = vtk.vtkPolyDataMapper()
        mapperBone.SetInputConnection(read.GetOutputPort())
        mapperBone.SetScalarRange(
            read.GetOutput().GetPointData().GetScalars().GetRange()[0],
            read.GetOutput().GetPointData().GetScalars().GetRange()[1])
        
    else:
        contourBone = vtk.vtkContourFilter()
        contourBone.SetInputConnection(slcr.GetOutputPort())
        contourBone.SetValue(0,75.0)
        contourBone.Update()
        
        contourSkin = vtk.vtkContourFilter()
        contourSkin.SetInputConnection(slcr.GetOutputPort())
        contourSkin.SetValue(0,50.0)
        contourSkin.Update()
        
        distanceFilter = vtk.vtkDistancePolyDataFilter()
        distanceFilter.SignedDistanceOff()
        distanceFilter.SetInputConnection(0, contourBone.GetOutputPort())
        distanceFilter.SetInputConnection(1, contourSkin.GetOutputPort())
        distanceFilter.Update()
        
        mapperBone = vtk.vtkPolyDataMapper()
        mapperBone.SetInputConnection(distanceFilter.GetOutputPort())
        mapperBone.SetScalarRange(
            distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[0],
            distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[1])
    
    
    outliner = vtk.vtkOutlineFilter()
    outliner.SetInputConnection(slcr.GetOutputPort())
    outliner.Update()
    
    mapperOutliner = vtk.vtkPolyDataMapper()
    mapperOutliner.SetInputConnection(outliner.GetOutputPort())
    
    actorBone = vtk.vtkActor()
    actorBone.SetMapper(mapperBone)

    actorOutliner = vtk.vtkActor()
    actorOutliner.SetMapper(mapperOutliner)
    
    ren = vtk.vtkRenderer()
    ren.AddActor(actorBone)
    ren.AddActor(actorOutliner)
    ren.SetViewport(viewport)
    ren.SetActiveCamera(cam)
    ren.ResetCamera()
    ren.SetBackground(background)
    
    if not os.path.isfile('data_bone.vtk'):
        # write a file for restart 
        write = vtk.vtkPolyDataWriter()
        write.SetFileName("data_bone.vtk")
        write.SetInputConnection(distanceFilter.GetOutputPort())
        write.Write()
    
    return ren
    
    
Esempio n. 23
0
results = {"seed": seed,
           "rms": np.zeros(N, np.float32),
           "voxel_dims": voxel_dims}
for i in xrange(N):
    probe = vtk.vtkProbeFilter()
    probe.SetInputData(mech.rsurfs[i])
    probe.SetSourceData(mech.cell_fields[i])
    probe.Update()

    poly = probe.GetOutput()
    poly.GetPointData().SetActiveVectors("Displacement")

    warp = vtk.vtkWarpVector()
    warp.SetInputData(poly)
    warp.Update()

    dist = vtk.vtkDistancePolyDataFilter()
    dist.SetInputData(0, mech.dsurfs[i])
    dist.SetInputData(1, warp.GetPolyDataOutput())
    dist.Update()
    residual = numpy_support.vtk_to_numpy(
        dist.GetOutput().GetPointData().GetArray("Distance"))
    rms = np.linalg.norm(residual) / np.sqrt(residual.size)
    results["rms"][i] = rms
    writePoly("DistanceErrors/dist_error{:04d}.vtp".format(i + 1), dist)

fid = open("results.pkl", "wb")
pickle.dump(results, fid, 2)
fid.close()
    def cut_example(self,
                    normal_opt,
                    centroid_opt,
                    cut_points,
                    thres_value=10,
                    vis_split=False):

        # 1. Udregn signed distance fra alle punkter i pred_surface til nearest point on finalCut
        plane = vtk.vtkPlaneSource()
        plane.SetNormal(-normal_opt)
        plane.SetCenter(centroid_opt)
        plane.Update()

        df = vtk.vtkDistancePolyDataFilter()
        df.SetInputData(self.pred_surface)
        df.SetInputData(1, plane.GetOutput())
        df.Update()  # df er afstanden til planet (signed)

        #pointTree = vtk.vtkKdTree()
        #pointTree.BuildLocatorFromPoints(cut_points)
        pd_points = vtk.vtkPolyData()
        pd_points.SetPoints(cut_points)
        pl = vtk.vtkPointLocator()
        pl.SetDataSet(pd_points)

        dist = vtk.vtkDoubleArray()
        dist.SetNumberOfValues(self.pred_surface.GetNumberOfCells())
        for i in range(self.pred_surface.GetNumberOfCells()):
            cell_com = self.vtkCenterOfMass(
                self.pred_surface.GetCell(i).GetPoints())
            #idx = pointTree.FindClosestPoint(1,cell_com)
            idx = pl.FindClosestPoint(cell_com)
            #print(idx)

            if np.sign(
                    df.GetOutput().GetCellData().GetScalars().GetValue(i)) < 0:
                d = 1
            else:
                d = np.sqrt(vtk.vtkMath().Distance2BetweenPoints(
                    cell_com, pd_points.GetPoint(idx)))
                #d = np.sqrt(vtk.vtkMath().Distance2BetweenPoints(cell_com,COM))
                if d > thres_value:
                    d = 1
                else:
                    d = 0

            dist.SetValue(i, d)

        # 1b. Assign distance to the vertex
        d_surface = vtk.vtkPolyData()
        d_surface.DeepCopy(self.pred_surface)
        d_surface.GetCellData().SetScalars(dist)

        # 2. Remove zero values of the mesh
        threshold = vtk.vtkThreshold()
        threshold.SetInputData(d_surface)
        threshold.ThresholdByUpper(0.5)
        threshold.Update()
        split_surface = threshold.GetOutput()

        geometryFilter = vtk.vtkGeometryFilter()
        geometryFilter.SetInputData(split_surface)
        geometryFilter.Update()
        split_pd = geometryFilter.GetOutput()

        # 3. Connectivity filter
        # 4. Keep smallest part (el.lign heuristik)
        COM = self.vtkCenterOfMass(cut_points)

        # Closest to COM
        connFilter = vtk.vtkPolyDataConnectivityFilter()
        connFilter.SetInputData(split_pd)
        connFilter.SetExtractionModeToClosestPointRegion()
        connFilter.SetClosestPoint(COM + 5 * normal_opt)
        #connFilter.SetExtractionModeToLargestRegion()
        connFilter.SetOutputPointsPrecision(vtk.vtkAlgorithm.DOUBLE_PRECISION)
        connFilter.Update()
        LAA_surface = connFilter.GetOutput()
        LAA_surface.GetNumberOfPoints()

        # If a small region is found the point is shifted a little in the direction of the normal
        if LAA_surface.GetNumberOfPoints() < 100:
            condition = True
            i = 2
            while condition:
                #print(i)
                i += 1
                connFilter.SetClosestPoint(COM + i * normal_opt)
                connFilter.Update()
                LAA_surface = connFilter.GetOutput()
                if LAA_surface.GetNumberOfPoints() > 100:
                    condition = False

        if LAA_surface.GetNumberOfPoints(
        ) > 0.8 * self.pred_surface.GetNumberOfPoints():
            print("Increasing threshold")
            LAA_surface = self.cut_example(normal_opt,
                                           centroid_opt,
                                           cut_points,
                                           thres_value=thres_value + 5,
                                           vis_split=vis_split)
        else:
            if vis_split:
                mapper = vtk.vtkPolyDataMapper()
                mapper.SetInputData(split_pd)
                actor = vtk.vtkActor()
                actor.SetMapper(mapper)

                renderWindow = vtk.vtkRenderWindow()
                renderWindow.SetSize(800, 600)
                renderWindow.SetPosition(0, 100)
                renderWindow.SetWindowName("VTK")

                renderWindowInteractor = vtk.vtkRenderWindowInteractor()
                renderWindowInteractor.SetRenderWindow(renderWindow)
                renderer = vtk.vtkRenderer()
                renderer.AddActor(actor)  #surface
                renderer.SetBackground(1, 1, 1)

                renderWindow.AddRenderer(renderer)
                renderWindow.Render()
                renderWindowInteractor.Start()

        return LAA_surface
Esempio n. 25
0
    def run(self, templateMesh, templateLM, templateSLM, meshDirectory,
            lmDirectory, slmDirectory, outDirectory, signedDistanceOption):

        if (bool(templateSLM) and bool(slmDirectory)):
            templateLMTotal = self.mergeLandmarks(templateLM, templateSLM)
        else:
            templateLMTotal = templateLM
        #get template points as vtk array
        templatePoints = vtk.vtkPoints()
        p = [0, 0, 0]
        for i in range(templateLMTotal.GetNumberOfMarkups()):
            templateLMTotal.GetMarkupPoint(0, i, p)
            templatePoints.InsertNextPoint(p)

        # write selected triangles to table
        tableNode = slicer.mrmlScene.AddNewNodeByClass('vtkMRMLTableNode',
                                                       'Mean Mesh Distances')
        col1 = tableNode.AddColumn()
        col1.SetName('Subject ID')
        col2 = tableNode.AddColumn()
        col2.SetName('Mesh RMSE')
        tableNode.SetColumnType('Subject ID', vtk.VTK_STRING)
        tableNode.SetColumnType('Mean Mesh Distance', vtk.VTK_STRING)

        subjectCount = 0
        for meshFileName in os.listdir(meshDirectory):
            if (not meshFileName.startswith(".")):
                #get corresponding landmarks
                lmFilePath, subjectID = self.findCorrespondingFilePath(
                    lmDirectory, meshFileName)
                if (lmFilePath):
                    currentLMNode = slicer.util.loadMarkupsFiducialList(
                        lmFilePath)
                    if bool(slmDirectory):  # add semi-landmarks if present
                        slmFilePath, sID = self.findCorrespondingFilePath(
                            slmDirectory, meshFileName)
                        if (slmFilePath):
                            currentSLMNode = slicer.util.loadMarkupsFiducialList(
                                slmFilePath)
                            currentLMTotal = self.mergeLandmarks(
                                templateLM, currentSLMNode)
                        else:
                            print("problem with reading semi-landmarks")
                            return False
                    else:
                        currentLMTotal = currentLMNode
                else:
                    print("problem with reading landmarks")
                    return False
                    # if mesh and lm file with same subject id exist, load into scene
                meshFilePath = os.path.join(meshDirectory, meshFileName)
                currentMeshNode = slicer.util.loadModel(meshFilePath)

                #get subject points into vtk array
                subjectPoints = vtk.vtkPoints()
                p = [0, 0, 0]
                for i in range(currentLMTotal.GetNumberOfMarkups()):
                    currentLMTotal.GetMarkupPoint(0, i, p)
                    subjectPoints.InsertNextPoint(p)

                transform = vtk.vtkThinPlateSplineTransform()
                transform.SetSourceLandmarks(subjectPoints)
                transform.SetTargetLandmarks(templatePoints)
                transform.SetBasisToR()  # for 3D transform

                transformNode = slicer.mrmlScene.AddNewNodeByClass(
                    "vtkMRMLTransformNode", "TPS")
                transformNode.SetAndObserveTransformToParent(transform)

                currentMeshNode.SetAndObserveTransformNodeID(
                    transformNode.GetID())
                slicer.vtkSlicerTransformLogic().hardenTransform(
                    currentMeshNode)

                distanceFilter = vtk.vtkDistancePolyDataFilter()
                distanceFilter.SetInputData(0, templateMesh.GetPolyData())
                distanceFilter.SetInputData(1, currentMeshNode.GetPolyData())
                distanceFilter.SetSignedDistance(signedDistanceOption)
                distanceFilter.Update()

                distanceMap = distanceFilter.GetOutput()
                distanceArray = distanceMap.GetPointData().GetArray('Distance')
                #meanDistance = np.average(distanceArray)
                meanDistance = self.rmse(distanceArray)

                #save output distance map
                outputNode = slicer.mrmlScene.AddNewNodeByClass(
                    "vtkMRMLModelNode", "ouputDistanceMap")
                outputNode.SetAndObservePolyData(distanceMap)
                outputFilename = os.path.join(outDirectory,
                                              str(subjectID) + '.vtp')
                slicer.util.saveNode(outputNode, outputFilename)

                #update table and subjectCount
                tableNode.AddEmptyRow()
                tableNode.SetCellText(subjectCount, 0, str(subjectID))
                tableNode.SetCellText(subjectCount, 1, str(meanDistance))
                subjectCount += 1

                # clean up
                slicer.mrmlScene.RemoveNode(outputNode)
                slicer.mrmlScene.RemoveNode(transformNode)
                slicer.mrmlScene.RemoveNode(currentMeshNode)
                slicer.mrmlScene.RemoveNode(currentLMNode)
Esempio n. 26
0
def join2Polydata(vtkPolydata1,vtkPolydata2,threshold1='lower',threshold2='upper',outThres=False,saveIntersect=False):
    """ Function finds the intersect of two polydata and returns the append of the 2.

    """

    # NOTE: Test this to deal with inaccuracies.
    # Copy the structure from the inputs.
    vtkpolyStructure1 = vtk.vtkPolyData()
    vtkpolyStructure1.CopyStructure(vtkPolydata1)
    vtkpolyStructure2 = vtk.vtkPolyData()
    vtkpolyStructure2.CopyStructure(vtkPolydata2)

    # Make triangular mesh from the polydata.
    tri1Filt = vtk.vtkTriangleFilter()
    tri1Filt.SetInputData(vtkpolyStructure1)
    tri1Filt.Update()
    tri2Filt = vtk.vtkTriangleFilter()
    tri2Filt.SetInputData(vtkpolyStructure2)
    tri2Filt.Update()

    # Use the clean polydata filter
    if False:
        tri1CleanFilt = vtk.vtkCleanPolyData()
        tri1CleanFilt.SetInputConnection(tri1Filt.GetOutputPort())
        tri1CleanFilt.Update()
        tri2CleanFilt = vtk.vtkCleanPolyData()
        tri2CleanFilt.SetInputConnection(tri2Filt.GetOutputPort())
        tri2CleanFilt.Update()

        # Try on local grid
        locPoint = np.concatenate((np.sum(np.array(tri2Filt.GetOutput().GetBounds())[0:4].reshape((2,2)),axis=1)/2,np.array([0])))
        tri1Loc = transformToLocalCoords(locPoint,tri1CleanFilt.GetOutput())
        tri2Loc = transformToLocalCoords(locPoint,tri2CleanFilt.GetOutput())
    else:
        # Try on local grid
        locPoint = np.concatenate((np.sum(np.array(tri2Filt.GetOutput().GetBounds())[0:4].reshape((2,2)),axis=1)/2,np.array([0])))
        tri1Loc = transformToLocalCoords(locPoint,tri1Filt.GetOutput())
        tri2Loc = transformToLocalCoords(locPoint,tri2Filt.GetOutput())

    # Setup the intersect.
    polyIntersectFilt = vtk.vtkIntersectionPolyDataFilter()
    polyIntersectFilt.SplitFirstOutputOn()
    polyIntersectFilt.SplitSecondOutputOn()
    polyIntersectFilt.SetInputData(0,tri1Loc)
    polyIntersectFilt.SetInputData(1,tri2Loc)
    polyIntersectFilt.Update()

    # Temp: save the outputs
    if saveIntersect:
        io.writeVTPFile('InterSect0.vtp',polyIntersectFilt.GetOutput(0))
        io.writeVTPFile('InterSect1.vtp',polyIntersectFilt.GetOutput(1))
        io.writeVTPFile('InterSect2.vtp',polyIntersectFilt.GetOutput(2))
    # To do: need to check if they intersect.
    # Calculate the distance of the intersect
    polyDist = vtk.vtkDistancePolyDataFilter()
    polyDist.SetInputConnection(0,polyIntersectFilt.GetOutputPort(1))
    polyDist.SetInputConnection(1,polyIntersectFilt.GetOutputPort(2))
    if saveIntersect:
        polyDist.Update()
        io.writeVTPFile('distPoly0.vtp',polyDist.GetOutput(0))
        io.writeVTPFile('distPoly1.vtp',polyDist.GetOutput(1))
    poly0thr = vtk.vtkThreshold()
    poly0thr.AllScalarsOn()
    poly0thr.SetInputArrayToProcess(0,0,0,vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS,'Distance')
    poly0thr.SetInputConnection(polyDist.GetOutputPort(0))
    if threshold1=='lower':
        poly0thr.ThresholdByLower(0.0)
    else:
        poly0thr.ThresholdByUpper(0.0)
    poly0surf = vtk.vtkDataSetSurfaceFilter()
    poly0surf.SetInputConnection(poly0thr.GetOutputPort())
    poly1thr = vtk.vtkThreshold()
    poly1thr.AllScalarsOn()
    poly1thr.SetInputArrayToProcess(0,0,0,vtk.vtkDataObject.FIELD_ASSOCIATION_CELLS,'Distance')
    poly1thr.SetInputConnection(polyDist.GetOutputPort(1))
    if threshold2=='upper':
        poly1thr.ThresholdByUpper(0.0)
    else:
        poly1thr.ThresholdByLower(0.0)
    poly1surf = vtk.vtkDataSetSurfaceFilter()
    poly1surf.SetInputConnection(poly1thr.GetOutputPort())
    # Append the polydata's
    polyAppendFilt = vtk.vtkAppendPolyData()
    polyAppendFilt.SetInputConnection(poly0surf.GetOutputPort())
    polyAppendFilt.AddInputConnection(poly1surf.GetOutputPort())
    polyAppendFilt.Update()
    # Return the appended polydata
    if outThres:
        return transformToLocalCoords(-locPoint,polyAppendFilt.GetOutput()),transformToLocalCoords(-locPoint,poly0surf.GetOutput()),transformToLocalCoords(-locPoint,poly1surf.GetOutput())
    else:
        return transformToLocalCoords(-locPoint,polyAppendFilt.GetOutput())