You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
4.8 KiB
163 lines
4.8 KiB
2 years ago
|
import java.awt.*;
|
||
|
import java.awt.event.*;
|
||
|
import javax.swing.*;
|
||
|
import java.io.*;
|
||
|
import java.util.*;
|
||
|
import vtk.*;
|
||
|
|
||
|
// Example of complex 3D widget in use.
|
||
|
public class ImagePlaneWidget extends vtkCanvas {
|
||
|
|
||
|
private int width = 512;
|
||
|
private int height = 512;
|
||
|
|
||
|
public ImagePlaneWidget(String path) {
|
||
|
super();
|
||
|
|
||
|
// attach observer to set the render window size after
|
||
|
// the render window is created...
|
||
|
addWindowSetObserver(new Observer() {
|
||
|
public void update(Observable o, Object arg) {
|
||
|
setSize(width, height);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
//Start by loading some data.
|
||
|
vtkVolume16Reader v16 = new vtkVolume16Reader();
|
||
|
v16.SetDataDimensions(64, 64);
|
||
|
v16.SetDataByteOrderToLittleEndian();
|
||
|
v16.SetFilePrefix(path);
|
||
|
v16.SetImageRange (1, 93);
|
||
|
v16.SetDataSpacing(3.2, 3.2, 1.5);
|
||
|
v16.Update();
|
||
|
|
||
|
setImageData(v16.GetOutput());
|
||
|
|
||
|
JPanel p = new JPanel();
|
||
|
p.setLayout(new BorderLayout());
|
||
|
p.add(this, BorderLayout.CENTER);
|
||
|
|
||
|
JFrame frame = new JFrame("ImagePlaneWidget Test");
|
||
|
frame.setBounds(10, 10, width, height);
|
||
|
frame.getContentPane().add(p, BorderLayout.CENTER);
|
||
|
frame.setVisible(true);
|
||
|
frame.pack();
|
||
|
|
||
|
frame.addWindowListener(new WindowAdapter()
|
||
|
{
|
||
|
public void windowClosing(WindowEvent e) {System.exit(0);}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public void setImageData(vtkImageData id) {
|
||
|
|
||
|
//The shared picker enables us to use 3 planes at one time
|
||
|
//and gets the picking order right
|
||
|
vtkCellPicker picker = new vtkCellPicker();
|
||
|
picker.SetTolerance(0.005);
|
||
|
|
||
|
//The 3 image plane widgets are used to probe the dataset.
|
||
|
vtkImagePlaneWidget planeWidgetX = new vtkImagePlaneWidget();
|
||
|
planeWidgetX.DisplayTextOn();
|
||
|
planeWidgetX.SetInput(id);
|
||
|
planeWidgetX.SetInteractor(getIren());
|
||
|
planeWidgetX.SetPlaneOrientationToXAxes();
|
||
|
planeWidgetX.SetSliceIndex(32);
|
||
|
planeWidgetX.SetPicker(picker);
|
||
|
planeWidgetX.SetKeyPressActivationValue('x');
|
||
|
planeWidgetX.GetPlaneProperty().SetColor(1, 0, 0);
|
||
|
planeWidgetX.On();
|
||
|
|
||
|
vtkImagePlaneWidget planeWidgetY = new vtkImagePlaneWidget();
|
||
|
planeWidgetY.DisplayTextOn();
|
||
|
planeWidgetY.SetInput(id);
|
||
|
planeWidgetY.SetInteractor(getIren());
|
||
|
planeWidgetY.SetPlaneOrientationToYAxes();
|
||
|
planeWidgetY.SetSliceIndex(32);
|
||
|
planeWidgetY.SetPicker(picker);
|
||
|
planeWidgetY.SetKeyPressActivationValue('y');
|
||
|
planeWidgetY.GetPlaneProperty().SetColor(1, 1, 0);
|
||
|
planeWidgetY.SetLookupTable(planeWidgetX.GetLookupTable());
|
||
|
planeWidgetY.On();
|
||
|
|
||
|
//for the z-slice, turn off texture interpolation:
|
||
|
//interpolation is now nearest neighbour, to demonstrate
|
||
|
//cross-hair cursor snapping to pixel centers
|
||
|
vtkImagePlaneWidget planeWidgetZ = new vtkImagePlaneWidget();
|
||
|
planeWidgetZ.DisplayTextOn();
|
||
|
planeWidgetZ.SetInput(id);
|
||
|
planeWidgetZ.TextureInterpolateOff();
|
||
|
planeWidgetZ.SetInteractor(getIren());
|
||
|
planeWidgetZ.SetPlaneOrientationToZAxes();
|
||
|
planeWidgetZ.SetSliceIndex(46);
|
||
|
planeWidgetZ.SetPicker(picker);
|
||
|
planeWidgetZ.SetKeyPressActivationValue('z');
|
||
|
planeWidgetZ.GetPlaneProperty().SetColor (0, 0, 1);
|
||
|
planeWidgetZ.SetLookupTable(planeWidgetX.GetLookupTable());
|
||
|
planeWidgetZ.On();
|
||
|
|
||
|
//An outline is shown for context.
|
||
|
vtkOutlineFilter outline = new vtkOutlineFilter();
|
||
|
outline.SetInput (id);
|
||
|
|
||
|
vtkPolyDataMapper outlineMapper = new vtkPolyDataMapper();
|
||
|
outlineMapper.SetInput ( outline.GetOutput() );
|
||
|
|
||
|
vtkActor outlineActor = new vtkActor();
|
||
|
outlineActor.SetMapper(outlineMapper);
|
||
|
|
||
|
GetRenderer().AddActor(outlineActor);
|
||
|
|
||
|
//Add the outline actor to the renderer, set the background and size
|
||
|
GetRenderer().GetCullers().RemoveAllItems();
|
||
|
|
||
|
GetRenderer().SetBackground(0.1, 0.1, 0.2);
|
||
|
|
||
|
}
|
||
|
|
||
|
static public void printUsage(String err) {
|
||
|
if (!err.equals("")) {
|
||
|
System.err.println("Error: " + err);
|
||
|
}
|
||
|
System.err.println("Usage: java ImagePlaneWidget [-D path]");
|
||
|
System.err.println("Where:");
|
||
|
System.err.println(" path is location of your VTKData directory");
|
||
|
System.exit(-1);
|
||
|
}
|
||
|
|
||
|
|
||
|
public static void main(String[] argv) {
|
||
|
int argSize = argv.length;
|
||
|
|
||
|
String pathToVTKData = "";
|
||
|
|
||
|
int argCurrent = 0;
|
||
|
|
||
|
try {
|
||
|
while (argSize > argCurrent) {
|
||
|
if (argv[argCurrent].equals("-D")) {
|
||
|
++argCurrent;
|
||
|
pathToVTKData = argv[argCurrent];
|
||
|
++argCurrent;
|
||
|
}
|
||
|
else {
|
||
|
ImagePlaneWidget.printUsage("");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
catch (Exception e) {
|
||
|
ImagePlaneWidget.printUsage("");
|
||
|
}
|
||
|
|
||
|
if (pathToVTKData.equals(""))
|
||
|
ImagePlaneWidget.printUsage("");
|
||
|
|
||
|
File f = new File(pathToVTKData + "/Data/headsq");
|
||
|
if (!f.exists() || !f.canRead() || !f.isDirectory())
|
||
|
ImagePlaneWidget.printUsage(f.getAbsolutePath() + " does not exist or cannot be read.");
|
||
|
|
||
|
new ImagePlaneWidget(f.getAbsolutePath() + "/quarter");
|
||
|
|
||
|
}
|
||
|
}
|