# 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:");
                }

    }