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.