NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi Cristy, First, these are great questions that really get to the heart of VisAD. > I can display my netCDF file using code from DisplayTest, case 10. > However, I cannot figure out how to query the attributes of the file. > In my test netCDF file I use variables (x, y) -> documents. Where x goes > from 1-30 and y goes from 1-40. I will not always know this apriori. If > I read this file as > > java DisplayTest 10 equinox.nc > > it displays as expected. My question is how can I query the range of > the x and y variables. When I try > > double[] range1lat = map1lat.getRange(); > > where map1lat is > > new ScalarMap((RealType) dtype.getComponent(0),Display.XAxis)); > > NaN is returned. I tried various other combinations of methods and > could not produce the simple result of 1,30 and 1,40 for (x,y). Any > suggestions? The range of values in a ScalarMap (returned by getRange) is set either by (1) an explicit call to setRange, or (2) autoscaling the first time data objects are displayed. Autoscaling will compute the ranges of values of RealTypes, which is what you want. But autoscaling does not happen until the Display thread has had time to display the data. So an immediate call to getRange is likely to return NaN (i.e., missing). Case 27 of visad/examples/DisplayTest.java calls getRange to get the same information you are after, and it first waits 2 seconds (this is a bit of a kludge, we should create some sort of event / listener mechanism for when autoscaled ranges are available). Another, and probably better, way to get the range of values of x and y from your netCDF file would be like this: Field netCDF = . . . SampledSet set = (SampledSet) netCDF.getDomainSet(); // getDomainSet throws VisADException, RemoteException float[] low = set.getLow(); float[] hi = set.getHi(); // now low = {min_x, min_y} and hi = {max_low, max_hi} > Another question. I have a JTable. I would like the cursor on the > surface to reflect the proper entry in the JTable. Which method > returns the (x,y) position of the cursor on the 3-D surface? From > this I can compute the appropriate entry in the JTable. There are two ways to approach this. First, you can get the cursor location as follows: DisplayImplJ3D display = . . . Vector cursor_vector = display.getDisplayRenderer().getCursorStringVector(); Enumeration strings = cursor_vector.elements(); while(strings.hasMoreElements()) { String string = (String) strings.nextElement(); // parse string; these are just the strings of the // form "nl = 1.6514" that appear in the display window // when you press the middle mouse button } The second way to do this, and more in the VisAD spirit, is to create your own cursor as a RealTuple data object displayed using DirectManipulationRendererJ3D. This is done by case 27 of visad/examples/DisplayTest.java (note case 27 again, a very useful case). The benefit of doing it this way is that this RealTuple data object can be connected to a computational Cell (via a call to addReference) and the Cell's doAction method will be invoked whenever the RealTuple "cursor" is moved. The drawback is the "cursor" will appear as a dot rather than a cross hair (you can at least make the dot large by: GraphicsModeControl mode = display.getGraphicsModeControl(); mode.setPointSize(5.0f); Note that DisplayRealType "Shape" is currently not implemented. When it is, it will allow you to define any shape you want for a customized cursor. Please let me know if you have any other questions or problems. Bill ---------------------------------------------------------- Bill Hibbard, SSEC, 1225 W. Dayton St., Madison, WI 53706 whibbard@xxxxxxxxxxxxx 608-263-4427 fax: 608-263-6738 http://www.ssec.wisc.edu/~billh/vis.html
visad
archives: