DisplayListener

Hi Bill and others,

I am using VisAD for creating 3D object content. The object content
represents a terrain surface and is reused in my own Java3D based
3D-GIS-Service. The terrain consists of several parts. Thus I am
creating several objects of the class DEMFeatureProxy3D.
For each DEMFeatureProxy3D the method addSurfacePart is called once.
This method includes the VisAD code, which is creating my terrainpart 
object:

        // VisAD stuff
        //
        eastValues = RealType.getRealType("eastValues");
        northValues = RealType.getRealType("northValues");
        heightValues = RealType.getRealType("heightValues");
        try {
                domain_tuple = new RealTupleType(eastValues, northValues);
                // Create a FunctionType (domain_tuple -> range_tuple);
                func_en_h = new FunctionType(domain_tuple, heightValues);       
                

                domain_set
                        new Linear2DSet(
                                domain_tuple,
                                northMin,
                                northMax,
                                nRows,
                                eastMin,
                                eastMax,
                                nCols);

                double[][] flat_samples = new double[1][nCols * nRows];
                for (int c = 0; c < (nRows); c++) {
                        for (int r = 0; r < (nCols); r++) {
                                // dgm 1 x y z
                                flat_samples[0][c * nCols + r] = height[c
* nCols + r];
                        }
                }

                // Create a FlatField  
                // Use FlatField(FunctionType type, Set domain_set)    
                vals_ff = new FlatField(func_en_h, domain_set);

                // ...and put the values above into it
                // Note the argument false, meaning that the array won't
be copied 
                vals_ff.setSamples(flat_samples, false);

                // Create Display and its maps    
                // A 2D display    
                display = new DisplayImplJ3D("display1");

                // Create the ScalarMaps: latitude to XAxis, longitude to
YAxis and
                // altitude to RGB and temperature to IsoContour
                // Use ScalarMap(ScalarType scalar, DisplayRealType
display_scalar) 
                eastMap = new ScalarMap(eastValues, visad.Display.YAxis);
                northMap = new ScalarMap(northValues,
visad.Display.XAxis);
                heightMap = new ScalarMap(heightValues,
visad.Display.ZAxis);

                eastMap.setRange(-1.0, 1.0);
                northMap.setRange(-1.0, 1.0);
                heightMap.setRange(-1.0, 1.0);

                // Add maps to display
                display.addMap(eastMap);
                display.addMap(northMap);
                display.addMap(heightMap);

                // Create a data reference and set the FlatField as our
data 
                data_ref = new DataReferenceImpl("data_ref");
                data_ref.setData(vals_ff);
                renderer = new DefaultRendererJ3D();

                // Add reference to display
                GraphicsModeControl dispGMC

(GraphicsModeControl) display.getGraphicsModeControl();
                //dispGMC.setScaleEnable(true);
                //dispGMC.setPolygonMode(1);
                dispGMC.setTextureEnable(false);

                display.addReferences(renderer, data_ref);

                //      For DEM part indentification
                display.setName(String.valueOf(partNumber));

                display.addDisplayListener(listener);

        } catch (VisADException ve) {
                System.out.println("VisAd TupleType Exception");
        } catch (RemoteException re) {
                System.out.println("RemoteExcpetion");
        }
                
Add the end the DisplayListener is attached.
I thought the method displayChanged is called when 
VisAD is ready. In displayChanged I am looking for
the object content and transform so that I can reuse
the object geometry for my 3D-Service.

public synchronized void displayChanged(DisplayEvent e) {               

// DEM-Konzept-Test multiple parts of DEM                       
WorldVolume wv2 = null;
if (e.getId() == DisplayEvent.TRANSFORM_DONE) {                 
        DisplayImplJ3D displayInC = (DisplayImplJ3D) e.getDisplay();
        Vector renderers = displayInC.getRenderers();
        if (renderers.size() != 1) {
                System.err.println(
                        "Error: Number of Renderes should be one! Num: "
                                + renderers.size());
        } else {
                DefaultRendererJ3D rendererInC
                        (DefaultRendererJ3D) renderers.elementAt(0);

                // Look for DEM part number
                String pns = displayInC.getName();
                Integer pnI = new Integer(pns);
                int partNumber = pnI.intValue();
                //System.out.println("partNumber " + partNumber);
                BranchGroup branchGroup = rendererInC.getBranch();
                
                try {
                        renderer.clearScene();
                        renderer.clearBranch();
                        display.destroy();
                } catch (VisADException ex) {
                        System.err.println(ex);
                } catch (RemoteException re) {
                        System.err.println(re);
                }

                if (branchGroup != null) {
                        branchGroup.detach();
                        Enumeration enum = branchGroup.getAllChildren();
                        while (enum.hasMoreElements()) {
                        
                                ...
                        }
                }
        }
}
}

Unfortunately sometimes I never come into the displayChanged method.
Say the terrain consists of 9 parts, thus I shoul reach the method 
displayChanged 9 times, but sometimes I reach it only 2 times or
5 times. Thus some parts for my final terrain are missing.

Any ideas?

Thank for your help in advance.

Greetings Desiree





oooooooooooooooooooooooooooooooooooooooooooooooo
Desiree Hilbring

Institut fuer Photogrammetrie und Fernerkundung  
Universitaet Karlsruhe, Germany
email: hilbring@xxxxxxxxxxxxxxxxxxxx             
# 0721 6083676                                   
oooooooooooooooooooooooooooooooooooooooooooooooo