SelectGraphVertices
VTKExamples/Java/Graphs/SelectGraphVertices
Code¶
SelectGraphVertices.java
import vtk.*; /* * Java language example to select edges and vertices from a generated Graph. */ public class SelectGraphVertices { /** * All Java programs require a host class. in addition, * these two instance variables provide access to the * callback data used in this example. */ vtkGraphLayoutView view; vtkAnnotationLink link; /* * The following static calls will load the respective * vtkJava interface libraries on first reference to this * class. */ static { System.loadLibrary("vtkCommonJava"); System.loadLibrary("vtkFilteringJava"); System.loadLibrary("vtkViewsJava"); System.loadLibrary("vtkImagingJava"); System.loadLibrary("vtkInfovisJava"); System.loadLibrary("vtkGraphicsJava"); System.loadLibrary("vtkRenderingJava"); } /* * primary test driver, creates an instance of this class * and then runs the example function. */ public static void main(String[] args) { SelectGraphVertices me = new SelectGraphVertices(); me.doit(); } /* * doit creates local objects and instantiates instance variables */ public void doit() { vtkRandomGraphSource source = new vtkRandomGraphSource(); source.Update(); view = new vtkGraphLayoutView(); view.AddRepresentationFromInputConnection(source.GetOutputPort()); /* * This was described as vtkRenderedGraphRepresentation in the python example, * but the java type returns it as vtkDataRepresentation. */ vtkDataRepresentation rep = view.GetRepresentation(0); /* * The vtkDataRepresentation should already have a vtkAnnotationLink, * so we just want to grab it and add an observer with our callback function attached * Note that Java callbacks use the this "pointer" to anchor vtk objects used by the callback * to establish references to required vtkobjects. */ link = rep.GetAnnotationLink(); link.AddObserver("AnnotationChangedEvent", this, "selectionCallback"); view.GetRenderWindow().SetSize(600, 600); view.ResetCamera(); view.Render(); view.GetInteractor().Start(); } /* * The Java callback signature has no parameters. This complicates some * vtk processes by eliminating the eventid and user data normally available * to C++ logic. */ public void selectionCallback() { // In C++ there is some extra data passed to the callback, but in Python // the callback data is lost... // There can be two selection nodes, but which one is vertices and which is edges // does not seem to be guaranteed... System.out.println("in selection callback"); vtkSelection sel = link.GetCurrentSelection(); vtkSelectionNode node0 = sel.GetNode(0); int node0_field_type = node0.GetFieldType(); vtkIdTypeArray sel_list0 = (vtkIdTypeArray)(link.GetCurrentSelection().GetNode(0).GetSelectionList()); vtkSelectionNode node1 = sel.GetNode(1); int node1_field_type = node1.GetFieldType(); vtkIdTypeArray sel_list1 = (vtkIdTypeArray)(link.GetCurrentSelection().GetNode(1).GetSelectionList()); if (sel_list0.GetNumberOfTuples() > 0) { printFieldType(node0_field_type); for (int ii = 0; ii < sel_list0.GetNumberOfTuples(); ii++){ System.out.print( "\t" + sel_list0.GetValue(ii)); } System.out.println(" - on list 0." ); } if (sel_list1.GetNumberOfTuples() > 0) { printFieldType(node1_field_type); for (int ii = 0; ii < sel_list1.GetNumberOfTuples(); ii++){ System.out.print( "\t" + sel_list1.GetValue(ii)); } System.out.println(" - on list 1." ); } System.out.println( "- - -"); } public void printFieldType(int field_type) { if (field_type == 3) System.out.print("Vertices Selected:"); else if (field_type == 4) System.out.print ("Edges Selected:"); else System.out.print ("Unknown type:"); } }