Re: Data not rendering as IsoContour

Hello Bill,

> 2. If the application constructs a visad.util.ContourWidget for
> the ScalarMap to IsoContour, and defines a surface value in the
> ContourWidget constructor, this will set ContourControl.surfaceValue.
> It looks like ContourWidget methods can implicitly set a non-NaN
> value for surfaceValue, but then the value is the minimum of the
> data range so no iso-surface would appear. Does your application
> construct a ContourWidget?

No.

> 3. The application explicitly calls ContourControl.setMainContours()
> or ContourControl.setSurfaceValue() with a non-NaN surfaceValue.
> Does your application make these calls?

No.  But we do call setContourInterval(), in which case the contours
will appear.  Because we have always done this before, we always saw the
contours.  We have been doing a heap of code reorganisation recently,
and the code that called setContourInterval() was temporarily disabled,
which is when we noticed this.

I'll try your most recent suggestion soon, but in the meantime I have
noticed something else, which I'll explain because it may give you some
hints.

You may remember the LayerManager that is common to applications in the
BoM from your last visit.  There are layers that each have a
DataReference, and which generally respond to the LayerManager's request
to set their visible state by calling renderer.toggle(boolean).  Because
my application loads a fair number of layers at once, it spent a while
rendering all the layers at that time, even though most of them were not
visible immediately.  So we decided to have two fields in each layer and
switch between them with dataRef.setData() as required.

The layer has these fields:
  field       (Time -> ((Nx,Ny)->Data))
  nullField   (Time -> RealType.Generic)

The domain sets of these two fields are the same because we need to
ensure that the animation set never changes.  The range of nullField has
been filled in with dummy data, ie setSample(i, new Real(i)) for each
sample.  The point of nullField is that VisAD doesn't spend any time
rendering it when the layer is not visible.

When the layer is created, it does

  dataRef.setData(nullField);

When the layer is told to be visible, it does:

   dataRef.setData(field);
   renderer.toggle(true);

When the layer is told to be invisible, it does:

  dataRef.setData(nullField);
  renderer.toggle(false);

If we change this so that nullField is never used, we only call
dataRef.setData(field) once, and only call renderer.toggle() when the
layer changes visible state, then the contours are displayed as
expected. 

> You may be able to answer these questions by inserting calls to
> DisplayImpl.printStack(String) in ContourControl.setMainContours()
> and ContourControl.setSurfaceValue(), and include the value being
> set in surfaceValue in the String argument to printStack(String).

I'll try this soon, but in the meantime I hope the above information may
be useful.

Thanks
Russell





-- 
Russell Steicke

-- Fortune says:
No snowflake in an avalanche ever feels responsible.