package examples;
import vtk.*;
import vtk.util.VtkPanelContainer;
import vtk.util.VtkPanelUtil;
import vtk.util.VtkUtil;
import java.util.ArrayList;
import javax.swing.*;
import java.awt.*;
import java.io.File;
public class AWTMedical3 extends JComponent implements VtkPanelContainer {
private vtkPanel renWin;
vtkImageData ReadDataFile(File inSelectedFile){
vtkImageData outImageData = null;
Directory theDir = new Directory();
String theInputDirectory = inSelectedFile.getPath();
theDir.Load(theInputDirectory);
Scanner theScanner = new Scanner();
Tag theStudyTag = new Tag(0x0020,0x000d);
Tag theSeriesTag = new Tag(0x0020,0x000e);
theScanner.AddTag(theStudyTag);
theScanner.AddTag(theSeriesTag);
theScanner.Scan(theDir.GetFilenames());
FilenamesType theStudyValues = theScanner.GetOrderedValues(theStudyTag);
long theNumStudies = theStudyValues.size();
if (theNumStudies != 1)
return outImageData;
String theStudyVal = theStudyValues.get(0);
FilenamesType theFilenames =
theScanner.GetAllFilenamesFromTagToValue(theStudyTag, theStudyVal);
theScanner.Scan(theFilenames);
FilenamesType theSeriesValues = theScanner.GetOrderedValues(theSeriesTag);
String studyUID = theScanner.GetValue(theScanner.GetFilenames().get(0), theStudyTag);
long theNumSeries = theSeriesValues.size();
for (int i = 0; i < theNumSeries; i++) {
FilenamesType theSeriesFiles =
theScanner.GetAllFilenamesFromTagToValue(theSeriesTag, theSeriesValues.get(i));
long theNumFilesInSeries = theSeriesFiles.size();
if (theNumFilesInSeries > 1) {
IPPSorter sorter = new IPPSorter();
sorter.SetComputeZSpacing(true);
sorter.SetZSpacingTolerance(0.001);
Boolean sorted = sorter.Sort(theSeriesFiles);
if (!sorted){
return outImageData;
}
FilenamesType sortedFT = sorter.GetFilenames();
long theSize = sortedFT.size();
vtkStringArray sa = new vtkStringArray();
ArrayList<String> theStrings = new ArrayList<String>();
for (int j = 0; j < theSize; j++) {
String theFileName = sortedFT.get(j);
if (gdcmReader.CanReadFile(theFileName) > 0){
theStrings.add(theFileName);
sa.InsertNextValue(theFileName);
} else {
return outImageData;
}
}
gdcmReader.SetFileNames(sa);
gdcmReader.Update();
outImageData = gdcmReader.GetOutput();
}
}
String theImageInfo = "";
if (outImageData != null){
theImageInfo = outImageData.Print();
}
return outImageData;
}
public AWTMedical3(File inFile) {
renWin = new vtkPanel();
vtkImageData theImageData = ReadDataFile(inFile);
vtkContourFilter skinExtractor = new vtkContourFilter();
skinExtractor.SetInput(theImageData);
skinExtractor.SetValue(0, 500);
vtkPolyDataNormals skinNormals = new vtkPolyDataNormals();
skinNormals.SetInput(skinExtractor.GetOutput());
skinNormals.SetFeatureAngle(60.0);
vtkPolyDataMapper skinMapper = new vtkPolyDataMapper();
skinMapper.SetInput(skinNormals.GetOutput());
skinMapper.ScalarVisibilityOff();
vtkActor skin = new vtkActor();
skin.SetMapper(skinMapper);
skin.GetProperty().SetDiffuseColor(1, .49, .25);
skin.GetProperty().SetSpecular(.3);
skin.GetProperty().SetSpecularPower(20);
vtkContourFilter boneExtractor = new vtkContourFilter();
boneExtractor.SetInput(theImageData);
boneExtractor.SetValue(0, 1150);
vtkPolyDataNormals boneNormals = new vtkPolyDataNormals();
boneNormals.SetInput(boneExtractor.GetOutput());
boneNormals.SetFeatureAngle(60.0);
vtkStripper boneStripper = new vtkStripper();
boneStripper.SetInput(boneNormals.GetOutput());
vtkPolyDataMapper boneMapper = new vtkPolyDataMapper();
boneMapper.SetInput(boneStripper.GetOutput());
boneMapper.ScalarVisibilityOff();
vtkActor bone = new vtkActor();
bone.SetMapper(boneMapper);
bone.GetProperty().SetDiffuseColor(1, 1, .9412);
vtkOutlineFilter outlineData = new vtkOutlineFilter();
outlineData.SetInput(theImageData);
vtkPolyDataMapper mapOutline = new vtkPolyDataMapper();
mapOutline.SetInput(outlineData.GetOutput());
vtkActor outline = new vtkActor();
outline.SetMapper(mapOutline);
outline.GetProperty().SetColor(0, 0, 0);
vtkLookupTable bwLut = new vtkLookupTable();
bwLut.SetTableRange(0, 2000);
bwLut.SetSaturationRange(0, 0);
bwLut.SetHueRange(0, 0);
bwLut.SetValueRange(0, 1);
bwLut.Build();
vtkLookupTable hueLut = new vtkLookupTable();
hueLut.SetTableRange(0, 2000);
hueLut.SetHueRange(0, 1);
hueLut.SetSaturationRange(1, 1);
hueLut.SetValueRange(1, 1);
hueLut.Build();
vtkLookupTable satLut = new vtkLookupTable();
satLut.SetTableRange(0, 2000);
satLut.SetHueRange(.6, .6);
satLut.SetSaturationRange(0, 1);
satLut.SetValueRange(1, 1);
satLut.Build();
vtkImageMapToColors saggitalColors = new vtkImageMapToColors();
saggitalColors.SetInput(theImageData);
saggitalColors.SetLookupTable(bwLut);
vtkImageActor saggital = new vtkImageActor();
saggital.SetInput(saggitalColors.GetOutput());
saggital.SetDisplayExtent(32, 32, 0, 63, 0, 92);
vtkImageMapToColors axialColors = new vtkImageMapToColors();
axialColors.SetInput(theImageData);
axialColors.SetLookupTable(hueLut);
vtkImageActor axial = new vtkImageActor();
axial.SetInput(axialColors.GetOutput());
axial.SetDisplayExtent(0, 63, 0, 63, 46, 46);
vtkImageMapToColors coronalColors = new vtkImageMapToColors();
coronalColors.SetInput(theImageData);
coronalColors.SetLookupTable(satLut);
vtkImageActor coronal = new vtkImageActor();
coronal.SetInput(coronalColors.GetOutput());
coronal.SetDisplayExtent(0, 63, 32, 32, 0, 92);
vtkCamera aCamera = new vtkCamera();
aCamera.SetViewUp(0, 0, -1);
aCamera.SetPosition(0, 1, 0);
aCamera.SetFocalPoint(0, 0, 0);
aCamera.ComputeViewPlaneNormal();
renWin.GetRenderer().AddActor(saggital);
renWin.GetRenderer().AddActor(axial);
renWin.GetRenderer().AddActor(coronal);
renWin.GetRenderer().AddActor(outline);
renWin.GetRenderer().AddActor(skin);
renWin.GetRenderer().AddActor(bone);
bone.VisibilityOff();
skin.GetProperty().SetOpacity(0.5);
renWin.GetRenderer().SetActiveCamera(aCamera);
renWin.GetRenderer().ResetCamera();
aCamera.Dolly(1.5);
renWin.GetRenderer().SetBackground(1, 1, 1);
VtkPanelUtil.setSize(renWin, 640, 480);
renWin.GetRenderer().ResetCameraClippingRange();
setLayout(new BorderLayout());
add(renWin, BorderLayout.CENTER);
}
public vtkPanel getRenWin() {
return renWin;
}
public static void main(String s[]) {
if (s.length == 0){
return;
}
File theFile = new File(s[0]);
AWTMedical3 panel = new AWTMedical3(theFile);
JFrame frame = new JFrame("AWTMedical3");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add("Center", panel);
frame.pack();
frame.setVisible(true);
}
}