Example #1
0
    def __init__(self, caller):
        self.caller = caller
        self.dlg = DlgProfileInspector(Globals.root, self.SelectProfile,
                                       self.SelectPoint)

        self.pointId = None
        self.glyph = None
        self.profile = None
        self.region = None
Example #2
0
    def __init__(self,caller):
        self.caller = caller
        self.dlg = DlgProfileInspector(Globals.root,
                                       self.SelectProfile,
                                       self.SelectPoint )

        self.pointId = None
        self.glyph = None
        self.profile = None
        self.region = None
Example #3
0
class ProfileInspector(ModeInterface):
    def __init__(self, caller):
        self.caller = caller
        self.dlg = DlgProfileInspector(Globals.root, self.SelectProfile,
                                       self.SelectPoint)

        self.pointId = None
        self.glyph = None
        self.profile = None
        self.region = None

    def Start(self):
        self.caller.imageObservers.append(self.UpdateObservers)
        istyle = vtk.vtkInteractorStyleImage()
        istyle.AddObserver("LeftButtonPressEvent", self.ClickRegion)
        iren = Globals.renWin.GetInteractor()
        iren.SetInteractorStyle(istyle)

        self.dic = {}
        self.BuildCellLocator()

    def Finish(self):
        self.caller.imageObservers.remove(self.UpdateObservers)
        self.UpdateObservers()
        self.dlg.cancel()
        Globals.renWin.Render()

    def ClickRegion(self, a, b):

        if not self.locator: return

        wp = GetEventWorldPoint()
        cellId = self.locator.FindClosestPoint(wp[0], wp[1], wp[2])
        elts = self.dic[cellId]
        region = elts[0]
        profileId = elts[1]
        ptId = self.GetClosestProfilePoint(wp, region.profiles[profileId])
        self.dlg.SetSelectedRegion(region, profileId, ptId)
        self.SelectRegion(region)
        self.SelectProfile(profileId)
        self.SelectPoint(ptId)

        # update dlg info
        self.dlg.SetSelectedRegion(self.region, profileId, ptId)
        Globals.renWin.Render()

    def UpdateObservers(self):

        # rebuild locator
        self.dic = {}
        self.BuildCellLocator()

        # clear selected data and restore default states
        self.ClearSelectedPoint()
        self.ClearSelectedProfile()
        self.ClearSelectedRegion()

        # clear GUI data
        self.dlg.SetSelectedRegion()

    def ClearSelectedPoint(self):
        if self.glyph:
            self.glyph.Hide()
            self.glyph = None
            self.pointId = None

    def ClearSelectedProfile(self):
        if self.profile:
            self.profile.profile.GetProperty().SetColor(1, 1, 1)
            self.profile = None

    def ClearSelectedRegion(self):
        if self.region:
            self.region.rendering.SetDefaultColors()
            self.region = None

    def SelectPoint(self, ptId):
        self.ClearSelectedPoint()
        if self.region:
            if not self.glyph:
                self.glyph = CrossHair.CrossHairWidget(
                    1, Globals.renderProps["sphereSize"])
            self.pointId = ptId
            pt = self.profile.handles.points[ptId]
            self.glyph.SetPosition(pt[0], pt[1])
        Globals.renWin.Render()

    def SelectProfile(self, profile):
        self.ClearSelectedProfile()
        if self.region:
            self.profile = self.region.rendering.profiles[profile]
            self.profile.profile.GetProperty().SetColor(0, 1, 0)
            if self.pointId:
                self.SelectPoint(self.pointId)
        Globals.renWin.Render()

    def SelectRegion(self, region):
        self.ClearSelectedPoint()
        self.ClearSelectedProfile()
        self.ClearSelectedRegion()
        self.region = region
        self.region.rendering.SetSelected()

    def GetClosestProfilePoint(self, worldPoint, spline):
        pointLocator = vtk.vtkPointLocator()
        pointLocator.SetDataSet(spline.GetVtkPolyData())

        return pointLocator.FindClosestPoint(worldPoint)

    def BuildCellLocator(self):

        regions = Globals.objectSet.visibleRegions
        if not len(regions):
            self.locator = None
            return

        self.locator = Locator()
        wrapper = WrapperPolyData()

        pointCounter = 0
        cellCounter = 0
        for r in regions:
            localCounter = 0
            for p in r.profiles:
                startCounter = cellCounter
                for pt in p.points:
                    wrapper.InsertPoint(pointCounter, pt[0], pt[1], pt[2])
                    pointCounter += 1
                wrapper.InsertNextCell(len(p.points))
                for i in range(startCounter, pointCounter):
                    wrapper.InsertCellPoint(i)
                item = [r, localCounter]
                self.dic[cellCounter] = item
                cellCounter += 1
                localCounter += 1

        self.locator.SetInputData(wrapper)
Example #4
0
class ProfileInspector(ModeInterface):
    
    def __init__(self,caller):
        self.caller = caller
        self.dlg = DlgProfileInspector(Globals.root,
                                       self.SelectProfile,
                                       self.SelectPoint )

        self.pointId = None
        self.glyph = None
        self.profile = None
        self.region = None
        
    def Start(self):
        self.caller.imageObservers.append(self.UpdateObservers)
        istyle = vtk.vtkInteractorStyleImage()
        istyle.AddObserver("LeftButtonPressEvent",self.ClickRegion)
        iren = Globals.renWin.GetInteractor()
        iren.SetInteractorStyle(istyle)
        
        self.dic = {}
        self.BuildCellLocator()
        
        
    def Finish(self):
        self.caller.imageObservers.remove(self.UpdateObservers)
        self.UpdateObservers()
        self.dlg.cancel()
        Globals.renWin.Render()
        
    def ClickRegion(self,a,b):

        if not self.locator: return
        
        wp = GetEventWorldPoint()
        cellId = self.locator.FindClosestPoint(
            wp[0],wp[1],wp[2] )
        elts = self.dic[cellId]
        region = elts[0]
        profileId = elts[1]
        ptId = self.GetClosestProfilePoint(
            wp,
            region.profiles[profileId] )
        self.dlg.SetSelectedRegion(region,
                                   profileId,
                                   ptId)
        self.SelectRegion(region)
        self.SelectProfile(profileId)
        self.SelectPoint(ptId)
        
        # update dlg info
        self.dlg.SetSelectedRegion(self.region,
                                   profileId, ptId)
        Globals.renWin.Render()

    def UpdateObservers(self):
        
        # rebuild locator
        self.dic = {}
        self.BuildCellLocator()
        
        # clear selected data and restore default states
        self.ClearSelectedPoint()
        self.ClearSelectedProfile()
        self.ClearSelectedRegion()
            
        # clear GUI data
        self.dlg.SetSelectedRegion()

    def ClearSelectedPoint(self):
        if self.glyph:
            self.glyph.Hide()
            self.glyph = None
            self.pointId = None
    def ClearSelectedProfile(self):
        if self.profile:
            self.profile.profile.GetProperty().SetColor(1,1,1)
            self.profile = None
    def ClearSelectedRegion(self):
        if self.region:
            self.region.rendering.SetDefaultColors()
            self.region = None

    def SelectPoint(self,ptId):
        self.ClearSelectedPoint()
        if self.region:
            if not self.glyph:
                self.glyph = CrossHair.CrossHairWidget(1,
                                                       Globals.renderProps["sphereSize"])
            self.pointId = ptId
            pt = self.profile.handles.points[ptId]
            self.glyph.SetPosition(pt[0],
                                   pt[1])
        Globals.renWin.Render()
    def SelectProfile(self,profile):
        self.ClearSelectedProfile()
        if self.region:
            self.profile = self.region.rendering.profiles[
                profile]
            self.profile.profile.GetProperty().SetColor(0,1,0)
            if self.pointId:
                self.SelectPoint(self.pointId)
        Globals.renWin.Render()
    def SelectRegion(self,region):
        self.ClearSelectedPoint()
        self.ClearSelectedProfile()
        self.ClearSelectedRegion()
        self.region = region
        self.region.rendering.SetSelected()

    def GetClosestProfilePoint(self,worldPoint,
                               spline):
        pointLocator = vtk.vtkPointLocator()
        pointLocator.SetDataSet( spline.GetVtkPolyData() )
        
        return pointLocator.FindClosestPoint( worldPoint )

    def BuildCellLocator(self):

        regions = Globals.objectSet.visibleRegions
        if not len(regions):
            self.locator = None
            return

        self.locator = Locator()
        wrapper = WrapperPolyData()

        pointCounter = 0
        cellCounter = 0
        for r in regions:
            localCounter = 0
            for p in r.profiles:
                startCounter = cellCounter
                for pt in p.points:
                    wrapper.InsertPoint( pointCounter,
                                         pt[0],pt[1],pt[2] )
                    pointCounter += 1
                wrapper.InsertNextCell( len(p.points) )
                for i in range(startCounter, pointCounter):
                    wrapper.InsertCellPoint(i)
                item = [r,localCounter]
                self.dic[cellCounter] = item
                cellCounter += 1
                localCounter += 1

        self.locator.SetInputData( wrapper )