
package auto3DVisad;

import java.applet.Applet;
import java.awt.BorderLayout;
import java.net.URL;
import java.util.Vector;

import visad.ColorControl;
import visad.DataImpl;
import visad.DataReference;
import visad.DataReferenceImpl;
import visad.Display;
import visad.DisplayImpl;
import visad.GraphicsModeControl;
import visad.ProjectionControl;
import visad.RealTupleType;
import visad.ScalarMap;
import visad.data.netcdf.Plain;
import visad.util.ContourWidget;
import visad.ConstantMap;
import visad.RealType;
import visad.RangeControl;

//modify visad.src code
import visad.util.DataUtility;
import visad.data.mcidas.BaseMapAdapter;

public class Auto3DVisad0410 extends Applet 
{    
    public void init()// throws VisADException, RemoteException,
IOException
    {
        try
        {         
            Plain plain = new Plain();
            DataImpl image_sequence = null;
            BaseMapAdapter baseMapAdapter;
            
            String url = "";
            String varname = "";
            String file = "";
            String mapFile = "";
                                    
            //g2var1level.nc
            varname = "dms200";
            url = "http://iiiserver:81/monica/data/g2var1level.nc";
                             
            mapFile = "http://iiiserver:81/monica/data/OUTLSUPW";
            
            /*url = getParameter("HTTPNetcdfFile");
            file = getParameter("NetcdfFile");
            varname = getParameter("VariableName");
            mapFile = getParameter("OUTLFile");*/
                                 
            //open netcdf file
            if(url != null && !url.equals(""))
                image_sequence = plain.open(new URL(url));
            else
                image_sequence = plain.open(file);
            
            //open OUTL* file
            if (mapFile.indexOf("://") > 0)            
            	baseMapAdapter = new BaseMapAdapter(new URL(mapFile));
        
            else
                baseMapAdapter = new BaseMapAdapter(mapFile);
            
            // create a Display using Java3D
            DisplayImpl display =
DataUtility.makeSimpleDisplay(image_sequence);
            GraphicsModeControl dispGMC = (GraphicsModeControl)
display.getGraphicsModeControl();
            dispGMC.setScaleEnable(true);
            
            // create reference
            DataReference image_ref = new
DataReferenceImpl("NetcdfData");
            image_ref.setData(image_sequence);            
            display.addReference(image_ref);
                                    
            ScalarMap latMap = null, lonMap = null, varMap = null;
            Vector mapList = display.getMapVector();
            for(int idx = 0 ; idx < mapList.size() ; idx++)
            {
                ScalarMap tempMap = (ScalarMap)mapList.get(idx);
                
                if(tempMap.getScalarName().equals("Latitude"))
                    latMap = tempMap;
                else if(tempMap.getScalarName().equals("Longitude"))
                    lonMap = tempMap;
                else if(tempMap.getScalarName().equals(varname))
                    varMap = tempMap;
                /*else if(tempMap.getScalarName().indexOf("_") != -1)
                    display.removeMap(tempMap);*/
            }
                                   
            //double lonRange[] = lonMap.getRange();
            double lonRange[] = lonMap.getRange();
            double latRange[] = latMap.getRange();
            lonMap.setRange(lonRange[0], lonRange[1]);
            //System.out.println("lonRange " + lonRange[0] + " " +
lonRange[1]);
            latMap.setRange(latRange[0], latRange[1]);
            //System.out.println("latRange " + latRange[0] + " " +
latRange[1]);                        
            
            // rh.nc, g2var1level.nc
            ScalarMap varRGBMap = new ScalarMap(varMap.getScalar(),
Display.RGB);                    
            display.addMap(varRGBMap);
            ContourWidget contourWid = new ContourWidget(varMap);
                  
            
            DataReference maplinesRef = new
DataReferenceImpl("MapLines");
            baseMapAdapter.setLatLonLimits((float)latRange[0],
(float)latRange[1], (float)lonRange[0], (float)lonRange[1]);
            maplinesRef.setData(baseMapAdapter.getData());
            
            ConstantMap[] maplinesConstantMap = new ConstantMap[5];
            maplinesConstantMap[0] = new ConstantMap(1.,
Display.Blue);
            maplinesConstantMap[1] = new ConstantMap(1., Display.Red);
            maplinesConstantMap[2] = new ConstantMap(1.,
Display.Green);
            maplinesConstantMap[3] = new ConstantMap(1.001,
Display.Radius); // just above the image
            maplinesConstantMap[4] = new ConstantMap(-1.0f,
Display.ZAxis);
            display.addReference(maplinesRef, maplinesConstantMap);
      
            
            // change ratio
            ProjectionControl projCont =
display.getProjectionControl();
            double[] latvalue = latMap.getRange();
            double[] lonvalue = lonMap.getRange();
            double latStart = latvalue[0];
            double latEnd = latvalue[latvalue.length - 1];
            double lonStart = lonvalue[0];
            double lonEnd = lonvalue[lonvalue.length - 1];
   
            
            if(!Double.isNaN(latStart) && !Double.isNaN(latEnd) &&
!Double.isNaN(lonStart) && !Double.isNaN(lonEnd))
            {
                if(latStart != Double.NaN && latEnd != Double.NaN &&
lonStart != Double.NaN &&lonEnd != Double.NaN)
                {
                    if((latEnd - latStart) <= (lonEnd - lonStart))
                    {
                        double[] aspect = new double[]{1, (latEnd -
latStart) / (lonEnd - lonStart), 1};                
                        projCont.setAspect(aspect);
                    }
                    else
                    {                
                        double[] aspect = new double[]{(lonEnd -
lonStart) / (latEnd - latStart), 1, 1};
                        projCont.setAspect(aspect);
                    }
                }
            }
            
            setLayout(new BorderLayout());            
            add(display.getComponent(), BorderLayout.CENTER);

            add(contourWid, BorderLayout.SOUTH);                        
        }
        catch(Exception ex)
        {
            System.out.println(ex);
        }
    }
    
    public void start()
    {
        try
        {            
        }
        catch(Exception ex)
        {
            System.out.println(ex);
        }
    }
    
    public void stop()
    {        
    }
}
