John,
> I would like to enable a user select one of my graphic elements from the
> graph by clicking on it with the mouse. I'd like to highlight the
> selected map element, as well. Are these actions doable? And if so, how
> do I go about it? I've perused the examples and the source, etc. In your
> examples utilizing DirectManipulationDisplayRenderer3D (I think) I've
> seen mouse coord's displayed on-screen. I'd like to capture the mouse
> coord when the mouse is initially clicked, determine which map element
> is under the mouse (this part I can do, of course), and then display it
> in a different color or in some other way highlight its appearance. I am
> using TwoDDisplayRenderer3D at this point given its better performance
> for translating and zooming.
This discussion is relative to the examples/Rivers.java program.
The way to do this is to create a RealTuple 'cursor' object whose
RealTupleType is the same as the domain of your Sets ('earth' in
examples/Rivers.java). Display this using DirectManipulationRendererJ3D
and some ConstantMaps to make a large yellow point (or whatever
size and color you like), then link change events from this cursor
to a CellImpl that selects the appropriate river and displays it
with a special color. Something like this:
// create cursor
RealTuple cursor = new RealTuple(earth, new double[] {0.0, 0.0});
final DataReferenceImpl cursor_ref = new DataReferenceImpl("cursor");
cursor.setData(cursor);
display.addReferences(new DirectManipulationRendererJ3D(),
cursor_ref, new ConstantMap[]
{ConstantMap(4.0, Display.PointSize),
ConstantMap(1.0, Display.Red),
ConstantMap(1.0, Display.Green),
ConstantMap(0.0, Display.Blue)});
// create DataReference for selected data element to be
// rendered in color
final DataReferenceImpl select_ref = new DataReferenceImpl("select");
display.addReference(select_ref, new ConstantMap[]
{ConstantMap(select_red, Display.Red),
ConstantMap(select_green, Display.Green),
ConstantMap(select_blue, Display.Blue)});
// create CellImpl to handle cursor events
CellImpl cell = new CellImpl() {
public void doAction() throws VisADException, RemoteException {
RealTuple cursor = (RealTuple) cursor_ref.getData();
double latitude = ((Real) cursor.getComponent(0)).getValue();
double longitude = ((Real) cursor.getComponent(1)).getValue();
// here you've got the latitude and longitude of the cursor
// each time the user moves the large yellow dot - use it to
// select a data element (Gridded2DSet?) 'set'
Gridded2DSet set = ...
select_ref.setData(set);
}
};
cell.addReference(cursor_ref);
The one complexity is if the selected 'set' is already displayed
as part of the rivers UnionSet in another color, this may interfere
with the dislay via select_ref. If this is a problem, you might
be able to fix it by changing the order in which you invoke
addReference for rivers_ref and select_ref. If that doesn't
work, you may need to construct a new UnionSet for rivers_ref
that does not include the selected 'set'.
Good luck,
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
"kill cross-platform Java by growing the polluted Java market"
- from an internal Microsoft planning document