def __init__(self, module_manager): SimpleVTKClassModuleBase.__init__( self, module_manager, vtk.vtkSelectionSource(), 'Processing.', (), ('vtkSelection',), replaceDoc=True, inputFunctions=None, outputFunctions=None)
def setup(self): self.CLselS = vtk.vtkSelectionSource() self.CLselS.SetContentType( 4 ) # vtkSelection:: #1 GLOBALIDS(nada) #3 VALUES(nada) #4 INDICES(varios) self.CLselS.SetFieldType(1) # vtkSelection:: #0 CELL #1 POINT self.CLselS.SetContainingCells( 0) # para non extraer tamén as celdas que conteñen o punto dado self.CLselF = vtk.vtkExtractSelectedIds() self.CLselF.SetInputConnection(self.src.GetOutputPort()) self.CLselF.SetSelectionConnection(self.CLselS.GetOutputPort()) self.CLlabelsbM = vtk.vtkLabeledDataMapper() self.CLlabelsbM.SetInputConnection(self.CLselF.GetOutputPort()) # self.CLlabelsbM.SetLabelFormat("%g") self.CLlabelsbM.SetLabelModeToLabelScalars() self.CLlabelsbM.GetLabelTextProperty().SetColor(Plot.label_color) self.CLlabelsbA = vtk.vtkActor2D() self.CLlabelsbA.SetMapper(self.CLlabelsbM) # self.CLlabelsbA.SetVisibility(0) self.renderer.AddActor(self.CLlabelsbA) self.iren.AddObserver("LeftButtonPressEvent", self.ButtonPress) self.iren.AddObserver("LeftButtonReleaseEvent", self.ButtonRelease) self.picker = vtk.vtkPointPicker() # picker.SetTolerance(0.005) self.picker.AddObserver("EndPickEvent", self.EndPick) self.iren.SetPicker(self.picker)
def GetSelection(ids, inverse=False): selectionSource = vtk.vtkSelectionSource() selectionSource.SetInverse(inverse) selectionSource.SetContentType(vtk.vtkSelectionNode.BLOCKS) for i in range(len(ids)): selectionSource.AddBlock(ids[i]) return selectionSource
def plot(self, struct): # creates self. data1, legend, filename, fieldname, dim, has_field, tracker, revision if not self.call_config(struct): return # creates self.src if not self.call_src(): return # wireframe # test proba #self.ref0 = vtk.vtkThreshold() # necesario en selrF_ #self.ref0.SetInputConnection(self.src.GetOutputPort()) #self.ref0.ThresholdByLower(0.999) # valor inclusive self.wireM = vtk.vtkDataSetMapper() # test proba #self.wireM.SetInputConnection(self.ref0.GetOutputPort()) self.wireM.SetInputConnection(self.src.GetOutputPort()) self.wireM.ScalarVisibilityOff() self.wireA = vtk.vtkActor() self.wireA.SetMapper(self.wireM) self.wireA.GetProperty().SetRepresentationToWireframe() self.wireA.GetProperty().SetColor(Plot.mesh3_color) self.wireA.SetVisibility(0) self.add_outline_2(self.src) if self.has_field: # reference labels if self.data1.get('fielddomain') == 'point': self.refsT = vtk.vtkThresholdPoints() self.refsT.SetInputConnection(self.src.GetOutputPort()) self.refsT.ThresholdByUpper(1.0 - epsilon) else: self.refsT = vtk.vtkThreshold() # necesario en selrF_ self.refsT.SetInputConnection(self.src.GetOutputPort()) self.refsT.ThresholdByUpper(1.0 - epsilon) # self.refsT.SetInputArrayToProcess(1, 0, 0, 0, self.fieldname) # self.refsT.SetAttributeModeToUseCellData() if self.data1.get('fielddomain') == 'point': label_con = self.refsT.GetOutputPort() else: self.ccrF = vtk.vtkCellCenters() self.ccrF.SetInputConnection(self.refsT.GetOutputPort()) label_con = self.ccrF.GetOutputPort() self.lrM = vtk.vtkLabeledDataMapper() self.lrM.SetInputConnection(label_con) self.lrM.SetLabelModeToLabelScalars() self.lrM.GetLabelTextProperty().SetColor(Plot.label_color) self.lrA = vtk.vtkActor2D() self.lrA.SetMapper(self.lrM) self.lrA.SetVisibility(0) # CELL POINT FIELD VERTEX EDGE if self.data1.get('fielddomain') == 'point': ftype = 1 # vtkSelection::POINT else: ftype = 0 # vtkSelection::CELL # selected edges self.selr = vtk.vtkSelectionSource() self.selr.SetContentType(7) # vtkSelection::THRESHOLDS self.selr.SetFieldType(ftype) if self.data1.get( 'fielddomain' ) == 'point': # necesario para los puntos, sino colapsa self.selr.SetContainingCells(0) # unselected edges self.selr_ = vtk.vtkSelectionSource() self.selr_.SetContentType(7) # vtkSelection::THRESHOLDS self.selr_.SetFieldType(ftype) if self.data1.get( 'fielddomain' ) == 'point': # necesario para los puntos, sino colapsa self.selr_.SetContainingCells(0) self.selr_.SetInverse(1) self.selrF = vtk.vtkExtractSelectedThresholds() #self.selrF.SetInputConnection(self.src.GetOutputPort()) # por que era asi? # x1sbc self.selrF.SetInputConnection(self.refsT.GetOutputPort()) self.selrF.SetSelectionConnection(self.selr.GetOutputPort()) self.selrF_ = vtk.vtkExtractSelectedThresholds() self.selrF_.SetInputConnection(self.refsT.GetOutputPort()) # self.selrF_.SetSelectionConnection(self.selr_.GetOutputPort()) self.selrM = vtk.vtkDataSetMapper() self.selrM.SetInputConnection(self.selrF.GetOutputPort()) if not several_colors: self.selrM.ScalarVisibilityOff() self.selrM_ = vtk.vtkDataSetMapper() self.selrM_.SetInputConnection(self.selrF_.GetOutputPort()) self.selrM_.ScalarVisibilityOff() self.selrM.SetScalarRange(self.change_range(self.src)) self.selrA = vtk.vtkActor() self.selrA.SetMapper(self.selrM) if not several_colors: self.selrA.GetProperty().SetColor(Plot.mesh2_color) if self.data1.get('fielddomain') == 'point': self.selrA.GetProperty().SetRepresentationToPoints() else: self.selrA.GetProperty().SetRepresentationToSurface() self.selrA_ = vtk.vtkActor() self.selrA_.SetMapper(self.selrM_) if several_colors: self.selrA_.GetProperty().SetColor(Plot.unselected_color) else: self.selrA_.GetProperty().SetColor(Plot.mesh_color) if self.data1.get('fielddomain') == 'point': self.selrA_.GetProperty().SetRepresentationToPoints() else: self.selrA_.GetProperty().SetRepresentationToWireframe() if self.data1.get('fielddomain') == 'point': self.selrA.GetProperty().SetPointSize(3.0) self.selrA_.GetProperty().SetPointSize(2.0) # lóxica dudosa: depende do nome do campo if self.data1.get('fieldname') == 'edge_ref': self.selrA.GetProperty().SetLineWidth(5.0) self.selrA_.GetProperty().SetLineWidth(5.0) self.update_thresholds(struct, True) # Add the actors to the render self.rens[0].AddActor(self.selrA_) # unselected self.rens[0].AddActor(self.selrA) # selected self.rens[0].AddActor(self.lrA) # labels self.rens[0].AddActor(self.wireA) # mesh self.set_iren() self.iren.AddObserver("LeftButtonPressEvent", self.ButtonEvent) if self.data1.get('fielddomain') == 'cell': self.picker = vtk.vtkCellPicker() else: self.picker = vtk.vtkPointPicker() self.picker.AddObserver("EndPickEvent", self.EndPick) self.iren.SetPicker(self.picker) self.done = True
def setup(self): self.CLselS = vtk.vtkSelectionSource() self.CLselS.SetContentType( 4 ) # vtkSelection:: #1 GLOBALIDS(nada) #3 VALUES(nada) #4 INDICES(varios) self.CLselS.SetFieldType(1) # vtkSelection:: #0 CELL #1 POINT self.CLselS.SetContainingCells( 0) # para non extraer tamén as celdas que conteñen o punto dado self.CLselF = vtk.vtkExtractSelectedIds() self.CLselF.SetInputConnection(self.src.GetOutputPort()) self.CLselF.SetSelectionConnection(self.CLselS.GetOutputPort()) # marcar puntos if True: # puntos. tamanho en pantalla constante # self.CLPointsV = vtk.vtkVertexGlyphFilter() # self.CLPointsV.SetInputConnection(self.CLselF.GetOutputPort()) # self.CLPointsM = vtk.vtkPolyDataMapper() # self.CLPointsM.SetInputConnection(self.CLPointsV.GetOutputPort()) # self.CLPointsM.ScalarVisibilityOff() self.CLPointsM = vtk.vtkDataSetMapper() self.CLPointsM.SetInputConnection(self.CLselF.GetOutputPort()) self.CLPointsM.ScalarVisibilityOff() self.CLPointsA = vtk.vtkActor() self.CLPointsA.SetMapper(self.CLPointsM) self.CLPointsA.GetProperty().SetRepresentationToPoints() self.CLPointsA.GetProperty().SetPointSize(3.0) self.CLPointsA.GetProperty().SetColor(Plot.points_color) self.renderer.AddActor(self.CLPointsA) else: # esferas. tamanho en pantalla variable self.CLglyph = vtk.vtkSphereSource() self.CLPointsG = vtk.vtkGlyph3D() self.CLPointsG.SetInputConnection(self.CLselF.GetOutputPort()) self.CLPointsG.SetSourceConnection(self.CLglyph.GetOutputPort()) self.CLPointsG.ScalingOff() #self.CLPointsG.SetScaleModeToDataScalingOff() self.CLPointsM = vtk.vtkPolyDataMapper() self.CLPointsM.SetInputConnection(self.CLPointsG.GetOutputPort()) self.CLPointsM.ScalarVisibilityOff() self.CLPointsA = vtk.vtkActor() self.CLPointsA.SetMapper(self.CLPointsM) self.CLPointsA.GetProperty().SetColor(Plot.points_color) self.renderer.AddActor(self.CLPointsA) # labels self.CLlabelsbM = vtk.vtkLabeledDataMapper() self.CLlabelsbM.SetInputConnection(self.CLselF.GetOutputPort()) # self.CLlabelsbM.SetLabelFormat("%g") if self.mode == 0: self.CLlabelsbM.SetLabelModeToLabelScalars() elif self.mode == 1: self.CLlabelsbM.SetLabelModeToLabelVectors() self.CLlabelsbM.GetLabelTextProperty().SetColor(Plot.label_color) self.CLlabelsbA = vtk.vtkActor2D() self.CLlabelsbA.SetMapper(self.CLlabelsbM) # self.CLlabelsbA.SetVisibility(0) self.renderer.AddActor(self.CLlabelsbA) # point locator self.point_locator = vtk.vtkPointLocator() self.point_locator_pending = True self.iren.AddObserver("LeftButtonPressEvent", self.ButtonPress) self.iren.AddObserver("LeftButtonReleaseEvent", self.ButtonRelease) self.picker = vtk.vtkPropPicker() # picker.SetTolerance(0.005) self.picker.AddObserver("EndPickEvent", self.EndPick) self.iren.SetPicker(self.picker)
def setup(self): # temporal HACK does not work #self.cellcenters = None #if self.pointcell == 1: # self.cellcenters = vtk.vtkCellCenters() # self.cellcenters.SetInputConnection(self.src.GetOutputPort()) # self.pointcell = 0 self.CLselS = vtk.vtkSelectionSource() self.CLselS.SetContentType(4) # vtkSelection:: #1 GLOBALIDS(nada) #3 VALUES(nada) #4 INDICES(varios) if self.pointcell == 0: self.CLselS.SetFieldType(1) # vtkSelection:: #0 CELL #1 POINT self.CLselS.SetContainingCells(0) # para non extraer tamén as celdas que conteñen o punto dado elif self.pointcell == 1: self.CLselS.SetFieldType(0) # vtkSelection:: #0 CELL #1 POINT self.CLselF = vtk.vtkExtractSelectedIds() # if self.cellcenters is not None: # self.CLselF.SetInputConnection(self.cellcenters.GetOutputPort()) # else: # self.CLselF.SetInputConnection(self.src.GetOutputPort()) self.CLselF.SetInputConnection(self.src.GetOutputPort()) self.CLselF.SetSelectionConnection(self.CLselS.GetOutputPort()) if self.pointcell == 1: self.cellcenters = vtk.vtkCellCenters() self.cellcenters.VertexCellsOn() # que ? self.cellcenters.SetInputConnection(self.CLselF.GetOutputPort()) # marcar puntos if True: # puntos. tamanho en pantalla constante # self.CLPointsV = vtk.vtkVertexGlyphFilter() # self.CLPointsV.SetInputConnection(self.CLselF.GetOutputPort()) # self.CLPointsM = vtk.vtkPolyDataMapper() # self.CLPointsM.SetInputConnection(self.CLPointsV.GetOutputPort()) # self.CLPointsM.ScalarVisibilityOff() self.CLPointsM = vtk.vtkDataSetMapper() if self.pointcell == 1: self.CLPointsM.SetInputConnection(self.cellcenters.GetOutputPort()) else: self.CLPointsM.SetInputConnection(self.CLselF.GetOutputPort()) self.CLPointsM.ScalarVisibilityOff() self.CLPointsA = vtk.vtkActor() self.CLPointsA.SetMapper(self.CLPointsM) self.CLPointsA.GetProperty().SetRepresentationToPoints() self.CLPointsA.GetProperty().SetPointSize(3.0) self.CLPointsA.GetProperty().SetColor(Plot.points_color) self.renderer.AddActor(self.CLPointsA) else: # esferas. tamanho en pantalla variable self.CLglyph = vtk.vtkSphereSource() self.CLPointsG = vtk.vtkGlyph3D() self.CLPointsG.SetInputConnection(self.CLselF.GetOutputPort()) self.CLPointsG.SetSourceConnection(self.CLglyph.GetOutputPort()) self.CLPointsG.ScalingOff() #self.CLPointsG.SetScaleModeToDataScalingOff() self.CLPointsM = vtk.vtkPolyDataMapper() self.CLPointsM.SetInputConnection(self.CLPointsG.GetOutputPort()) self.CLPointsM.ScalarVisibilityOff() self.CLPointsA = vtk.vtkActor() self.CLPointsA.SetMapper(self.CLPointsM) self.CLPointsA.GetProperty().SetColor(Plot.points_color) self.renderer.AddActor(self.CLPointsA) # labels # protesta por que: # ..\archive\VTK\Rendering\vtkLabeledDataMapper.cxx, line 377 # vtkLabeledDataMapper (094D4C80): Could not find label array (index 0) in input. self.CLlabelsbM = vtk.vtkLabeledDataMapper() #FIX FIX FIX if self.pointcell == 1: #self.cellcenters = vtk.vtkCellCenters() #self.cellcenters.SetInputConnection(self.CLselF.GetOutputPort()) #self.CLlabelsbM.SetInputConnection(self.cellcenters.GetOutputPort()) self.CLlabelsbM.SetInputConnection(self.cellcenters.GetOutputPort()) else: self.CLlabelsbM.SetInputConnection(self.CLselF.GetOutputPort()) # self.CLlabelsbM.SetLabelFormat("%g") if self.mode == 0: self.CLlabelsbM.SetLabelModeToLabelScalars() elif self.mode == 1: self.CLlabelsbM.SetLabelModeToLabelVectors() self.CLlabelsbM.GetLabelTextProperty().SetColor(Plot.label_color) self.CLlabelsbA = vtk.vtkActor2D() self.CLlabelsbA.SetMapper(self.CLlabelsbM) # self.CLlabelsbA.SetVisibility(0) self.renderer.AddActor(self.CLlabelsbA) # point locator if self.pointcell == 0: self.locator = vtk.vtkPointLocator() elif self.pointcell == 1: self.locator = vtk.vtkCellLocator() self.locator_pending = True if self.click == 0: self.iren.AddObserver("LeftButtonPressEvent", self.ButtonPress1) elif self.click == 1: self.iren.AddObserver("LeftButtonPressEvent", self.ButtonPress2) self.iren.AddObserver("LeftButtonReleaseEvent", self.ButtonRelease2) self.picker = vtk.vtkPropPicker() # picker.SetTolerance(0.005) self.picker.AddObserver("EndPickEvent", self.EndPick) self.iren.SetPicker(self.picker)
def loadGraph(): # ---------- # Load and construct whole graph and multi-resolution data from Matlab structure dataDir = '/Users/emonson/Programming/Matlab/EMonson/Fodava/DocumentAnalysis/Analysis/' filename = dataDir + 'X20_042709b.mat' # filename = '/Users/emonson/Programming/Python/VTK/X20_040609b.mat' X = scipy.io.loadmat(filename) # Get graph structure G out of matlab variables G = X['G'] # ---------- # Set multi-resolution level bounds in GUI sliders levelMax = G.Tree.shape[0]-1 ui_window.hSlider_level.setMinimum(1) ui_window.hSlider_level.setMaximum(levelMax) ui_window.spinBox_level.setMinimum(1) ui_window.spinBox_level.setMaximum(levelMax) # Start setting up basis function for display as subgraph ExtBasis = GTree[level,0]['ExtBasis'][0][0][0] basisMax = ExtBasis.shape[1]-1 # zero-based indices # Set particular level basis function bounds in GUI sliders ui_window.hSlider_basisIndex.setMinimum(0) ui_window.hSlider_basisIndex.setMaximum(basisMax) ui_window.spinBox_basisIndex.setMinimum(0) ui_window.spinBox_basisIndex.setMaximum(basisMax) # Build table which will become graph table = vtk.vtkTable() col0 = vtk.vtkIntArray() col0.SetName('index1') col1 = vtk.vtkIntArray() col1.SetName('index2') val = vtk.vtkDoubleArray() val.SetName('weight') Tmat = G.T # Tmat = G.W for ii in range(Tmat.nzmax): col0.InsertNextValue(Tmat.rowcol(ii)[0]) col1.InsertNextValue(Tmat.rowcol(ii)[1]) val.InsertNextValue(abs(Tmat.getdata(ii))) table.AddColumn(col0) table.AddColumn(col1) table.AddColumn(val) # Vertex links need to be done with index2 first or indexing won't be right... # TODO: Make this foolproof so that graph always ends up with correct ordering of indices... tgraph = vtk.vtkTableToGraph() tgraph.SetInput(table) tgraph.AddLinkVertex('index2', 'stuff', False) tgraph.AddLinkVertex('index1', 'stuff', False) tgraph.AddLinkEdge('index2', 'index1') rawGraph = tgraph.GetOutput() rawGraph.Update() # print graph # Load and assign whole graph pre-layout coordinates ptsFile = os.path.splitext(filename)[0] + '_pts.vtp' if os.path.exists(ptsFile): polyreader = vtk.vtkXMLPolyDataReader() polyreader.SetFileName(ptsFile) polyreader.Update() pts = polyreader.GetOutput().GetPoints() rawGraph.SetPoints(pts) # print pts strategy = vtk.vtkPassThroughLayoutStrategy() layout = vtk.vtkGraphLayout() layout.SetInput(rawGraph) layout.SetLayoutStrategy(strategy) edgeLayout = vtk.vtkEdgeLayout() edgeStrategy = vtk.vtkArcParallelEdgeStrategy() edgeStrategy.SetNumberOfSubdivisions(50) edgeLayout.SetInputConnection(layout.GetOutputPort()) edgeLayout.SetLayoutStrategy(edgeStrategy) graph = edgeLayout.GetOutput() graph.Update() # -------- # Add ExtBasis to graph data & Select particular basis function # print 'ExtBasis shape: ' + str(ExtBasis[:,basisNum].data.shape) + ' (level,basis) (' + str(level) + ',' + str(basisNum) + ')' # Indexing of ExtBasis is backwards from graph, so need to reverse with [::-1] # and array not "contiguous" if don't do .copy() Esub = ExtBasis[:,basisNum].data[::-1].copy() EsubSq = Esub**2 # Esub = N.random.random(ExtBasis[:,basisNum].data.shape[0]) # SubIdxs = (Esub > 0.001).nonzero() # SubIdxs = (Esub**2 > 0.8).nonzero() # Set ExtBasis vertex data from numpy array basisFunc = VN.numpy_to_vtk(Esub) basisFunc.SetName('ExtBasis') basisFuncSq = VN.numpy_to_vtk(EsubSq) basisFuncSq.SetName('ExtBasisSq') vertexData = graph.GetVertexData() vertexData.AddArray(basisFunc) vertexData.AddArray(basisFuncSq) selection = vtk.vtkSelectionSource() selection.SetContentType(7) # vtkSelection::THRESHOLDS # selection.SetContentType(2) # vtkSelection::PEDIGREE_IDS selection.SetFieldType(3) # vtkSelection::VERTEX selection.SetArrayName("ExtBasisSq") selection.AddThreshold(basisCutoff, 10) # TODO: There was something wrong with the indexing in the PEDIGREE_IDS selection... # for ii in SubIdxs[0]: # selection.AddID(0,ii) minmax = "(%3.2e, %3.2e)" % (EsubSq.min(), EsubSq.max()) ui_window.label_basisCutoff_minmax.setText(minmax) selection.Update() # ---------- # Back to pipeline degree = vtk.vtkVertexDegree() degree.SetInput(graph) subgraph = vtk.vtkExtractSelectedGraph() subgraph.SetRemoveIsolatedVertices(False) subgraph.SetInputConnection(degree.GetOutputPort()) subgraph.SetSelectionConnection(selection.GetOutputPort()) # +++++++++++++ graphToPoly = vtk.vtkGraphToPolyData() graphToPoly.SetInputConnection(subgraph.GetOutputPort()) edgeMapper = vtk.vtkPolyDataMapper() edgeMapper.SetInputConnection(graphToPoly.GetOutputPort()) edgeMapper.SetScalarModeToUseCellData() edgeMapper.SetScalarVisibility(False) edgeMapper.SetImmediateModeRendering(True) edgeActor = vtk.vtkActor() edgeActor.SetMapper(edgeMapper) edgeActor.SetPosition(0, 0, -0.003); lut = vtk.vtkLookupTable() lutNum = 256 lut.SetNumberOfTableValues(lutNum) ctf = vtk.vtkColorTransferFunction() ctf.SetColorSpaceToDiverging() ctf.AddRGBPoint(0.0, 0, 0, 1.0) ctf.AddRGBPoint(1.0, 1.0, 0, 0) for ii,ss in enumerate([float(xx)/float(lutNum) for xx in range(lutNum)]): cc = ctf.GetColor(ss) lut.SetTableValue(ii,cc[0],cc[1],cc[2],1.0) vertGlyph = vtk.vtkVertexGlyphFilter() vertGlyph.SetInputConnection(subgraph.GetOutputPort()) vertMapper = vtk.vtkPolyDataMapper() vertMapper.SetInputConnection(vertGlyph.GetOutputPort()) vertMapper.SetImmediateModeRendering(True) vertMapper.SetScalarModeToUsePointFieldData() vertMapper.SetLookupTable(lut) vertMapper.SelectColorArray('ExtBasis') vertMapper.Update() vertRange = vertMapper.GetInput().GetPointData().GetArray(vertMapper.GetArrayName()).GetRange() vertMapper.SetScalarRange(-1.0*vertRange[1], vertRange[1]) vertActor = vtk.vtkActor() vertActor.SetMapper(vertMapper) outlineMapper = vtk.vtkPolyDataMapper() outlineMapper.SetScalarVisibility(False) outlineMapper.SetImmediateModeRendering(True) outlineMapper.SetInputConnection(vertGlyph.GetOutputPort()) outlineActor = vtk.vtkActor() outlineActor.PickableOff() outlineActor.SetPosition(0, 0, -0.001) outlineActor.GetProperty().SetRepresentationToWireframe() outlineActor.SetMapper(outlineMapper) # Create an Actor Collection for applying visibility to group basisActorCollection = vtk.vtkActorCollection() basisActorCollection.AddItem(vertActor) # basisActorCollection.AddItem(edgeActor) basisActorCollection.AddItem(outlineActor) # Apply a theme to the views theme = vtk.vtkViewTheme.CreateMellowTheme() theme.SetLineWidth(3) theme.SetPointSize(5) theme.SetSelectedCellColor(1,1,1) theme.SetSelectedPointColor(1,1,1) theme.SetOutlineColor(0.8, 0.8, 0.8) # theme.SetPointColor(0.9, 0.7, 0.3) theme.SetCellColor(0.9, 0.7, 0.3) # theme.SetPointOpacity(0.5) # theme.SetPointHueRange(0.0, 0.15) # theme.SetPointSaturationRange(0.6, 0.8) # theme.SetPointValueRange(0.4,0.8) # theme.SetPointAlphaRange(0.2,0.8) # theme.SetPointAlphaRange(1.0,1.0) # Apply theme # vertActor.GetProperty().SetColor(theme.GetPointColor()) # vertActor.GetProperty().SetOpacity(theme.GetPointOpacity()) vertActor.GetProperty().SetPointSize(theme.GetPointSize()) outlineActor.GetProperty().SetPointSize(vertActor.GetProperty().GetPointSize()+2) outlineActor.GetProperty().SetColor(theme.GetOutlineColor()) outlineActor.GetProperty().SetOpacity(theme.GetPointOpacity()) edgeActor.GetProperty().SetColor(theme.GetCellColor()) edgeActor.GetProperty().SetOpacity(theme.GetCellOpacity()) edgeActor.GetProperty().SetLineWidth(theme.GetLineWidth()) # ---------- # Background graph skeleton graphMapper = vtk.vtkGraphMapper() graphMapper.SetInputConnection(0, degree.GetOutputPort(0)) # Apply a theme to the background graph gtheme = vtk.vtkViewTheme() gtheme.SetLineWidth(1) gtheme.SetPointSize(0) gtheme.SetCellColor(0.8, 0.8, 0.8) gtheme.SetCellOpacity(0.2) gtheme.SetOutlineColor(0.8, 0.8, 0.8) gtheme.SetPointColor(0.8, 0.8, 0.8) gtheme.SetPointOpacity(0.0) graphMapper.ApplyViewTheme(gtheme) graphActor = vtk.vtkActor() graphActor.SetMapper(graphMapper) graphActor.SetPosition(0,0,-0.005) # ---------- # Background vertices graphPoly = vtk.vtkGraphToPolyData() graphPoly.SetInputConnection(0, tgraph.GetOutputPort(0)) vertGlyph = vtk.vtkGlyph3D() vertGlyph.SetInputConnection(0, graphPoly.GetOutputPort()) glyphSource = vtk.vtkGlyphSource2D() glyphSource.SetGlyphTypeToVertex() # glyphSource.SetGlyphTypeToCircle() # glyphSource.SetScale(0.025) vertGlyph.SetInputConnection(1, glyphSource.GetOutputPort()) vertexMapper = vtk.vtkPolyDataMapper() vertexMapper.SetInputConnection(vertGlyph.GetOutputPort()) vertexActor = vtk.vtkActor() vertexActor.SetMapper(vertexMapper) vertexActor.GetProperty().SetPointSize(4) vertexActor.GetProperty().SetOpacity(0.5) vertexActor.GetProperty().SetColor(0.6, 0.6, 0.6) vertexActor.SetPosition(0, 0, -0.004) # ---------- # Vertex index labels labelMapper = vtk.vtkDynamic2DLabelMapper() labelMapper.SetInputConnection(0, graphPoly.GetOutputPort(0)) labelMapper.SetLabelModeToLabelFieldData() labelMapper.SetFieldDataName("label") labelMapper.SetLabelFormat("%s") labelMapper.GetLabelTextProperty().SetColor(0.0, 0.0, 0.0) labelActor = vtk.vtkActor2D() labelActor.SetMapper(labelMapper) # ---------- # MultiScale Graph msGraph = buildSubGraph(level) msMapper = vtk.vtkGraphMapper() msMapper.SetInput(msGraph) msMapper.SetColorEdges(True) msMapper.SetEdgeColorArrayName('weight') # Apply a theme to the background graph mtheme = vtk.vtkViewTheme() mtheme.SetLineWidth(3) mtheme.SetPointSize(11) # mtheme.SetCellColor(0.5, 0.5, 0.7) # mtheme.SetCellOpacity(0.5) mtheme.SetOutlineColor(0.8, 0.8, 0.8) mtheme.SetPointColor(0.3, 0.3, 0.6) mtheme.SetPointOpacity(1.0) mtheme.SetCellHueRange(0.67, 0.67) mtheme.SetCellSaturationRange(0.6, 0.1) mtheme.SetCellValueRange(0.5,1.0) mtheme.SetCellAlphaRange(0.2,0.8) msMapper.ApplyViewTheme(mtheme) msActor = vtk.vtkActor() msActor.SetMapper(msMapper) msActor.SetPosition(0,0,-0.002) # ---------- # Set up window and add actors view.SetLayoutStrategyToPassThrough() # view.ApplyViewTheme(theme) # view.SetupRenderWindow(win) view.GetRenderer().SetBackground(theme.GetBackgroundColor()) view.GetRenderer().SetBackground2(theme.GetBackgroundColor2()) view.GetRenderer().SetGradientBackground(True) view.GetRenderer().AddActor(vertActor) view.GetRenderer().AddActor(outlineActor) view.GetRenderer().AddActor(edgeActor) view.GetRenderer().AddActor(graphActor) view.GetRenderer().AddActor(vertexActor) view.GetRenderer().AddActor(labelActor) view.GetRenderer().AddActor(msActor) # ---------- # General interactor isty = vtk.vtkInteractorStyleRubberBand2D() # RubberBand2D assumes/needs parallel projection ON view.GetRenderer().GetActiveCamera().ParallelProjectionOn() iren = view.GetRenderWindow().GetInteractor() iren.SetInteractorStyle(isty) # Interactor style must be set before scalar bar can be shown # view.SetVertexScalarBarVisibility(True) sbActor = vtk.vtkScalarBarActor() sbActor.SetLookupTable(vertMapper.GetLookupTable()) sbActor.SetTitle(vertMapper.GetArrayName()) sbActor.SetNumberOfLabels(3) vertexScalarBar = vtk.vtkScalarBarWidget() vertexScalarBar.SetScalarBarActor(sbActor) vertexScalarBar.SetInteractor(iren) vertexScalarBar.SetDefaultRenderer(view.GetRenderer()) vertexScalarBar.SetCurrentRenderer(view.GetRenderer()) vertexScalarBar.SetEnabled(True) scalarBarRep = vertexScalarBar.GetRepresentation() scalarBarRep.SetOrientation(1) # 0 = Horizontal, 1 = Vertical scalarBarRep.GetPositionCoordinate().SetValue(0.05,0.05) scalarBarRep.GetPosition2Coordinate().SetValue(0.15,0.25) # Adding it this way gets it to show up, but it's not interactive view.GetRenderer().AddActor(sbActor) view.ResetCamera() view.Render() # ---------- # Add Actors to QListWidget to allow check and uncheck for visibility listItem0 = QtGui.QListWidgetItem() listItem0.setText('Index Labels') listItem0.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) labelActor.SetVisibility(0) listItem0.setCheckState(QtCore.Qt.Unchecked) # Put actor it in as data in the list widget item listItem0.setData(QtCore.Qt.UserRole, QtCore.QVariant(labelActor)) ui_window.listWidget.insertItem(0,listItem0) # Test retrieval of actor from list widget item # tmpItem = ui_window.listWidget.item(0) # tmpQtActor = tmpItem.data(QtCore.Qt.UserRole) # tmpActor = tmpQtActor.toPyObject() # tmpActor.SetVisibility(0) # Shorter way to add item to list widget listItem1 = QtGui.QListWidgetItem('Vertices (background)', ui_window.listWidget) listItem1.setData(QtCore.Qt.UserRole, QtCore.QVariant(vertexActor)) listItem1.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) listItem1.setCheckState(QtCore.Qt.Checked) listItem2 = QtGui.QListWidgetItem('Graph (background)', ui_window.listWidget) listItem2.setData(QtCore.Qt.UserRole, QtCore.QVariant(graphActor)) listItem2.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) listItem2.setCheckState(QtCore.Qt.Checked) listItem3 = QtGui.QListWidgetItem() listItem3.setText('Basis Function Vertices') listItem3.setData(QtCore.Qt.UserRole, QtCore.QVariant(basisActorCollection)) listItem3.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) listItem3.setCheckState(QtCore.Qt.Checked) ui_window.listWidget.insertItem(1,listItem3) listItem6 = QtGui.QListWidgetItem() listItem6.setText('Basis Function Edges') listItem6.setData(QtCore.Qt.UserRole, QtCore.QVariant(edgeActor)) listItem6.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) listItem6.setCheckState(QtCore.Qt.Checked) ui_window.listWidget.insertItem(2,listItem6) listItem4 = QtGui.QListWidgetItem() listItem4.setText('MultiScale Graph') listItem4.setData(QtCore.Qt.UserRole, QtCore.QVariant(msActor)) listItem4.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) listItem4.setCheckState(QtCore.Qt.Checked) ui_window.listWidget.insertItem(3,listItem4) listItem5 = QtGui.QListWidgetItem() listItem5.setText('Basis Function Scale Bar') listItem5.setData(QtCore.Qt.UserRole, QtCore.QVariant(sbActor)) listItem5.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable) listItem5.setCheckState(QtCore.Qt.Checked) ui_window.listWidget.insertItem(3,listItem5) iren.Initialize() iren.Start()