SphereInteractionPanel

VTKExamples/Java/Interaction/SphereInteractionPanel

Code

SphereInteractionPanel.java

import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;

import vtk.*;

public class SphereInteractorPanel extends vtkCanvas {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    /**
     * @param args
     */
    /*
     * Switch style interactor
     */
    vtkInteractorStyleSwitch cstyle = new vtkInteractorStyleSwitch();
    /*
     * Interactor state for addObserver callback reference.
     */
    vtkActor lineActor = new vtkActor();
    vtkActor sphereActor = new vtkActor();
    vtkActor sphActor = new vtkActor();

    public SphereInteractorPanel() {
        super();
        vtkSphereSource sphere = new vtkSphereSource();
        sphere.SetRadius(1.0);
        sphere.SetPhiResolution(12);
        sphere.SetThetaResolution(12);
        vtkSphereSource sph = new vtkSphereSource();
        vtkPolyData pd = new vtkPolyData();
        vtkTubeFilter tubes = new vtkTubeFilter();
        vtkCellArray polys = new vtkCellArray();
        vtkPoints points = new vtkPoints();
        points.Allocate(10, 10);
        polys.Allocate(10, 10);
        pd.Allocate(10, 10);
        sph.SetCenter(3, 0, 2);
        sph.SetRadius(2);
        sph.SetThetaResolution(25);
        sph.SetPhiResolution(25);
        sph.Update();
        points.InsertNextPoint(3, 0, 2);
        points.InsertNextPoint(3, 3, 3);
        points.InsertNextPoint(5, 3, 3);
        points.InsertNextPoint(2, 4, 2);
        points.InsertNextPoint(4, 4, 4);

        polys.InsertNextCell(2);
        polys.InsertCellPoint(0);
        polys.InsertCellPoint(1);
        polys.InsertNextCell(2);
        polys.InsertCellPoint(1);
        polys.InsertCellPoint(2);
        polys.InsertNextCell(2);
        polys.InsertCellPoint(2);
        polys.InsertCellPoint(3);
        polys.InsertNextCell(2);
        polys.InsertCellPoint(3);
        polys.InsertCellPoint(1);
        pd.SetLines(polys);
        pd.SetPoints(points);
        tubes.AddInput(pd);
        tubes.SetRadius(.25);
        tubes.SetNumberOfSides(9);
        tubes.Update();

        // Create a mapper for each object.

        vtkPolyDataMapper sphereMapper = new vtkPolyDataMapper();
        sphereMapper.SetInput(sphere.GetOutput());
        vtkPolyDataMapper sphMapper = new vtkPolyDataMapper();
        sphMapper.SetInput(sph.GetOutput());
        vtkPolyDataMapper lineMapper = new vtkPolyDataMapper();
        lineMapper.SetInput(tubes.GetOutput());
        // 
        // Create an actor for each object
        // this allows us to act on each actor independently when
        // manipulate each object independently when in actor interaction mode.
        //
        sphereActor.SetMapper(sphereMapper);
        sphActor.SetMapper(sphMapper);
        lineActor.SetMapper(lineMapper);

        // Add the actors to the renderer

        ren.AddActor(sphereActor);
        ren.AddActor(sphActor);
        ren.AddActor(lineActor);

        ren.SetBackground(0.1, 0.2, 0.4);

        rw.AddRenderer(ren);

        rw.SetSize(600, 600);
        ren.SetRenderWindow(rw);

        // The vtkRenderWindowInteractor class watches for events (e.g.,
        // keypress,
        // mouse) in the vtkRenderWindow. These events are translated into
        // event invocations that VTK understands (see VTK/Common/vtkCommand.h
        // for all events that VTK processes). Then observers of these VTK
        // events can process them as appropriate.

        // By default the vtkRenderWindowInteractor instantiates an instance
        // of vtkInteractorStyle. vtkInteractorStyle translates a set of events
        // it observes into operations on the camera, actors, and/or properties
        // in the vtkRenderWindow associated with the vtkRenderWinodwInteractor.
        // Here we specify a particular interactor style.
        iren.SetInteractorStyle(cstyle);
        // add observer for key event:
        iren.AddObserver("CharEvent", this, "myCharEvent");
        // Start the event loop.
        ren.ResetCamera();

    }

    /*
     * Main routine to invoke example.
     */
    public static void main(String[] args) {
        SphereInteractorPanel me = new SphereInteractorPanel();
        JFrame frame = new JFrame("Toggle Camera Actor Interaction");
        frame.getContentPane().setLayout(new BorderLayout());
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.getContentPane().add(me, BorderLayout.CENTER);
        frame.pack();
        frame.setBounds(100, 100, 500, 500);
        frame.setVisible(true);

    }

    /*
     * myCharEvent is a callback set on the renderWindowInteractor for the
     * CharEvent using AddObserver. based in the character entered it performs
     * an interaction request.
     */
    void myCharEvent() {
        char code = Character.toLowerCase(iren.GetKeyCode());
        if (code == 'e' | code == 'q') {
            System.exit(0);
        }
    }

}