Hi Bill,
a few years ago you helped me to grab my created VisAD-Shape3Ds and put
them into my own scenegraph.
Today I tried to grab my newly created 3D-lines for the profile and put
them into my scenegraph as well. Unforetunately I get an
J:\java\visad\tutorial>java LineTest6
In enumeration
Located Shape3D javax.media.j3d.Shape3D@d10a5c
java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.RangeCheck(ArrayList.java:508)
at java.util.ArrayList.get(ArrayList.java:320)
at javax.media.j3d.GroupRetained.getChild(GroupRetained.java:408)
at javax.media.j3d.Group.getChild(Group.java:224)
at visad.java3d.RendererJ3D.getBranch(RendererJ3D.java:258)
at LineTest6.displayChanged(LineTest6.java:165)
at visad.DisplayImpl.notifyListeners(DisplayImpl.java:484)
at visad.DisplayImpl.notifyListeners(DisplayImpl.java:466)
at visad.DisplayImpl.doAction(DisplayImpl.java:1510)
at visad.ActionImpl.run(ActionImpl.java:303)
at visad.util.ThreadPool$ThreadMinnow.run(ThreadPool.java:95)
exception the second time I try to get hold of the VisAD-BranchGroup.
A little test programm trying to simulate the flow is attached:
First I am creating my terrain and add it two the view.
The terrain is grabbed and in reality put into my own scene.
After that I am creating my 3D-line and add it into the VisAD-View (In
reality I need some user input to create the clipping plane).
Trying to grab the VisAD BranchGroup a second time, directs me to the
error.
I was thinking of not detaching the BranchGroup in the first place, so
that I only need to grap the group once. But then I am not allowed to look
for the geometry, because of capability bits, which are not set.
Can I avoid the error?
Is it possible to reattach the VisAD-BranchGroup, and would that help?
Or is there another solution?
Thanks for your help
Desiree
oooooooooooooooooooooooooooooooooooooooooooooooo
Desiree Hilbring
Institut fuer Photogrammetrie und Fernerkundung
Universitaet Karlsruhe, Germany
email: hilbring@xxxxxxxxxxxxxxxxxxxx
# 0721 6083676
oooooooooooooooooooooooooooooooooooooooooooooooo
// Import needed classes
import visad.*;
import visad.util.*;
//import visad.java3d.DisplayImplJ3D;
import visad.java3d.*;
import java.rmi.RemoteException;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import javax.media.j3d.*;
import java.util.Enumeration;
public class LineTest6 implements DisplayListener{
int counter;
public DisplayListener listener;
DefaultRendererJ3D renderer;
// Declare variables
// The domain quantities longitude and latitude
// and the dependent quantity rgbVal
private RealType x,y,height;
// Tuple to pack x and y together
private RealTupleType xy;
// The function (domain_tuple -> rgbVal )
private FunctionType terrain_type;
// Our Data values for the domain are represented by the Set
private Set set;
// The Data class FlatField
private FlatField terrain;
// The DataReference from data to display
private DataReferenceImpl data_ref;
// The 2D display, and its the maps
static private DisplayImpl display;
private ScalarMap hoxmap,reymap,heightmap;
public LineTest6(String []args) throws RemoteException, VisADException {
counter = 0;
this.listener = this;
// Create the quantities
// Use RealType(String name, Unit unit, Set set);
RealType x = RealType.getRealType("x");
RealType y = RealType.getRealType("y");
RealType height = RealType.getRealType("height");
xy = new RealTupleType(x, y);
RealTupleType xheight = new RealTupleType(x, height);
terrain_type = new FunctionType( xy, height);
FunctionType line_type = new FunctionType(x,height);
float[] eastValues = {1,2,7,7,13};
float[] northValues = {3,8,1,6,3};
float[] heightValues = {1,2,3,2,1};
set = new Irregular2DSet(xy,new float[][] {eastValues, northValues});
// Create a FlatField
// Use FlatField(FunctionType type, Set domain_set)
terrain = new FlatField( terrain_type, set);
// ...and put the rgbVal values above into it
// Note the argument false, meaning that the array won't be copied
terrain.setSamples(new float[][] {heightValues});
// Create Display and its maps
// This is new: a 3D display
display = new DisplayImplJ3D("display1");
// Get display's graphics mode control and draw scales
GraphicsModeControl dispGMC = (GraphicsModeControl)
display.getGraphicsModeControl();
dispGMC.setScaleEnable(true);
// Create the ScalarMaps: latitude to XAxis, longitude to YAxis and
// rgbVal to ZAxis and to RGB
// Use ScalarMap(ScalarType scalar, DisplayRealType display_scalar)
hoxmap = new ScalarMap( x, Display.XAxis );
reymap = new ScalarMap( y, Display.YAxis );
heightmap = new ScalarMap( height, Display.ZAxis );
// Add maps to display
display.addMap( hoxmap );
display.addMap( reymap );
display.addMap( heightmap );
heightmap.setRange(0,15);
hoxmap.setRange(0,15);
reymap.setRange(0,15);
// Create a data reference and set the FlatField as our data
data_ref = new DataReferenceImpl("data_ref");
data_ref.setData( terrain );
renderer = new DefaultRendererJ3D();
display.addReferences( renderer, data_ref );
display.addDisplayListener(listener);
// Create application window and add display to window
JFrame jframe = new JFrame("LineTest6");
jframe.getContentPane().add(display.getComponent());
// Set window size and make it visible
jframe.setSize(300, 300);
jframe.setVisible(true);
}
public void makeProfileView() {
try {
if (counter==0) {
counter++;
float[][] eastNorthSamples = new float[2][50];
for (int i=0;i<50;i++) {
eastNorthSamples[0][i]=i;
eastNorthSamples[1][i]=i;
}
Gridded2DSet setGrid2D = new Gridded2DSet(xy, eastNorthSamples,
50);
FlatField terrain_new = (FlatField)
terrain.resample(setGrid2D,Data.WEIGHTED_AVERAGE,Data.NO_ERRORS);
DataReferenceImpl data_ref5 = new
DataReferenceImpl("data_ref5");
data_ref5.setData( terrain_new );
display.addReference( data_ref5 );
}
}
catch (VisADException ve) {
System.out.println("VisAd TupleType Exception "+ve);
}
catch (RemoteException re) {
System.out.println("RemoteExcpetion "+re);
}
}
public synchronized void displayChanged(DisplayEvent e) {
//System.out.println("DISPLAY CHANGED !!!!!!!!!!!!!!!");
if (e.getId() == DisplayEvent.TRANSFORM_DONE) {
// Branch from VisAD with Shape3D
BranchGroup branchGroup = renderer.getBranch();
if (branchGroup != null) {
branchGroup.detach();
Enumeration enum = branchGroup.getAllChildren();
while(enum.hasMoreElements()) {
System.out.println("In enumeration");
Object o;
o = enum.nextElement();
if (o instanceof Shape3D) {
System.out.println("Located Shape3D "+(Shape3D) o);
}
}
}
}
makeProfileView();
}
public static void main(String[] args)
throws RemoteException, VisADException
{
new LineTest6(args);
/*
System.out.println("111111111111111");
//JFrame jframe = new JFrame("LineTest6");
//jframe.getContentPane().add(display.getComponent());
System.out.println("22222222222222222222");
// Set window size and make it visible
//jframe.setSize(300, 300);
//jframe.setVisible(true);
System.out.println("3333333333333333333");
*/
}
}