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