VectorFieldExample

VTKExamples/Java/Visualization/VectorFieldExample

Description

The code bellow shows how to load a vector field from a vtu file, where some data is stored and we are only interested in the vector field.

'''Note:''' Please make sure that you adapt the code below to your system properties, like e.g. paths to native vtk libraries.

Code

VectorFieldExample.java

import java.awt.BorderLayout;
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import vtk.vtkActor;
import vtk.vtkArrowSource;
import vtk.vtkCubeSource;
import vtk.vtkGlyph3D;
import vtk.vtkObject;
import vtk.vtkPanel;
import vtk.vtkPolyData;
import vtk.vtkPolyDataMapper;
import vtk.vtkThresholdPoints;
import vtk.vtkUnstructuredGrid;
import vtk.vtkXMLUnstructuredGridReader;


public class VectorFieldExample implements Serializable {

  // Loading Native Libraries.
  // Now it works in eclipse without any issues.
  static {
    if (!vtkNativeLibrary.LoadAllNativeLibraries()) {
      for (vtkNativeLibrary lib : vtkNativeLibrary.values()) {
        if (!lib.IsLoaded()) {
          System.out.println(lib.GetLibraryName() + " not loaded");
        }
      }
    }
    vtkNativeLibrary.DisableOutputWindow(null);
  }
  private static final long serialVersionUID = 1L;

  public static vtkPanel showVectorField(
    File file,
    int elementInFile,
    double threshold,
    double scaleFactor) {

    vtkXMLUnstructuredGridReader reader = new vtkXMLUnstructuredGridReader();

    reader.SetFileName(file.getAbsolutePath());
    reader.Update();
    vtkUnstructuredGrid image = reader.GetOutput();
    image.GetPointData().SetVectors(image.GetPointData().GetArray(elementInFile));

    vtkThresholdPoints thresholdVector = new vtkThresholdPoints();
    thresholdVector.SetInputData(image);
    thresholdVector.SetInputArrayToProcess(
      elementInFile,
      image.GetInformation());

    thresholdVector.ThresholdByUpper(threshold);
    thresholdVector.Update();


    // represent vector field
    vtkGlyph3D vectorGlyph = new vtkGlyph3D();
    vtkArrowSource arrowSource = new vtkArrowSource();
    vtkPolyDataMapper vectorGlyphMapper = new vtkPolyDataMapper();

    int n = image.GetPointData().GetNumberOfArrays();
    for (int i = 0; i < n; i++) {
      System.out.println("name of array[" + i + "]: " + image.GetPointData().GetArrayName(i));
    }

    vtkPolyData tmp = thresholdVector.GetOutput();
    System.out.println("number of thresholded points: " + tmp.GetNumberOfPoints());

    vectorGlyph.SetInputData(image);
    vectorGlyph.SetSourceConnection(arrowSource.GetOutputPort());
    vectorGlyph.SetScaleModeToScaleByVector();
    vectorGlyph.SetVectorModeToUseVector();
    vectorGlyph.ScalingOn();
    vectorGlyph.OrientOn();
    vectorGlyph.SetInputArrayToProcess(
      elementInFile,
      image.GetInformation());

    vectorGlyph.SetScaleFactor(scaleFactor);

    vectorGlyph.Update();

    vectorGlyphMapper.SetInputConnection(vectorGlyph.GetOutputPort());
    vectorGlyphMapper.Update();

    vtkActor vectorActor = new vtkActor();
    vectorActor.SetMapper(vectorGlyphMapper);



    vtkPanel vis = new vtkPanel();
    vis.GetRenderer().AddActor(vectorActor);

    return vis;
  }

  public static void main(String s[]) throws IOException {


    SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {

          JFrame frame = new JFrame("VTKJPanel Demo");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          File file = new File("../src/Testing/Data/tetra.vtu"); // needs to be replaced

          vtkPanel panel = showVectorField(file, 2, 0.001, 0.05); // values need to be replaced

          frame.add(panel, BorderLayout.CENTER);
          frame.setSize(600, 600);
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);

          panel.repaint();

        }
      });
  }
}