Revision: 5219
Author:   hansonr
Date:     2006-06-13 15:30:34 -0700 (Tue, 13 Jun 2006)
ViewCVS:  http://svn.sourceforge.net/jmol/?rev=5219&view=rev

Log Message:
-----------
bob200603 adds more isosurface functionality, including 

isosurface functionXY
isosurface center 
isosurface fixed
isosurface modelbased

and fixes isosurface visibility for correct multiple model/file display

deletes Geodesic3D2.Java

note - this adds one function to statusListener

Modified Paths:
--------------
    branches/bob200603/Jmol/src/org/jmol/api/JmolStatusListener.java
    branches/bob200603/Jmol/src/org/jmol/applet/Jmol.java
    branches/bob200603/Jmol/src/org/jmol/g3d/Geodesic3D.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Axes.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Draw.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Isosurface.java
    branches/bob200603/Jmol/src/org/jmol/viewer/JmolConstants.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Mesh.java
    branches/bob200603/Jmol/src/org/jmol/viewer/MeshRenderer.java
    branches/bob200603/Jmol/src/org/jmol/viewer/ModelManager.java
    branches/bob200603/Jmol/src/org/jmol/viewer/StatusManager.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Token.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java
    branches/bob200603/Jmol/src/org/openscience/jmol/app/Jmol.java

Removed Paths:
-------------
    branches/bob200603/Jmol/src/org/jmol/g3d/Geodesic3D2.java
Modified: branches/bob200603/Jmol/src/org/jmol/api/JmolStatusListener.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/api/JmolStatusListener.java    
2006-06-13 17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/api/JmolStatusListener.java    
2006-06-13 22:30:34 UTC (rev 5219)
@@ -62,4 +62,5 @@
 
   public void showConsole(boolean showConsole);
   
+  public float functionXY(int x, int y);
 }

Modified: branches/bob200603/Jmol/src/org/jmol/applet/Jmol.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/applet/Jmol.java       2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/applet/Jmol.java       2006-06-13 
22:30:34 UTC (rev 5219)
@@ -139,12 +139,11 @@
     htmlName = getParameter("name");
     String ms = getParameter("mayscript");
     mayScript = (ms != null) && (!ms.equalsIgnoreCase("false"));
-    appletRegistry = new JmolAppletRegistry(htmlName, mayScript, 
appletWrapper);
-
+    appletRegistry = new JmolAppletRegistry(htmlName, mayScript, 
appletWrapper);    
     initWindows();
     initApplication();
   }
-
+  
   String getParameter(String paramName) {
     return appletWrapper.getParameter(paramName);
   }
@@ -672,6 +671,10 @@
       showStatusAndConsole(statusMessage);
     }
 
+    public float functionXY(int x, int y) {
+      return ((Double) jsoWindow.call("functionXY", new Object[] { htmlName, 
new Integer(x), new Integer(y)})).floatValue();
+    }
+    
     public void notifyNewPickingModeMeasurement(int iatom, String strMeasure) {
       showStatusAndConsole(strMeasure);
     }

Modified: branches/bob200603/Jmol/src/org/jmol/g3d/Geodesic3D.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/g3d/Geodesic3D.java    2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/g3d/Geodesic3D.java    2006-06-13 
22:30:34 UTC (rev 5219)
@@ -174,15 +174,16 @@
   
     Geodesic3D(Graphics3D g3d) {
       this.g3d = g3d;
-      //String msg = "Geodesecs "+ System.currentTimeMillis();
-      //System.out.println(msg+" 0");
-      initialize();
-      //System.out.println(msg+" 1");
+      String id = "Geodesecs "+ System.currentTimeMillis();
+      //System.out.println(id+" 0");
+      initialize(id);
+      //System.out.println(id+" 1");
     }
 
-  private static synchronized void initialize() {
+  private static synchronized void initialize(String id) {
     if(vertexCounts != null)
       return;
+    System.out.println(id + " initializing");
     vertexCounts = new short[maxLevel];
     neighborVertexesArrays = new short[maxLevel][];
     faceVertexesArrays = new short[maxLevel][];
@@ -216,7 +217,7 @@
                            " edgeCount=" + getEdgeCount(i));
       }
     }
-    System.out.println("geodesic initialization completed");
+    System.out.println(id+" initialization completed");
   }
   
   static int getVertexCount(int level) {

Deleted: branches/bob200603/Jmol/src/org/jmol/g3d/Geodesic3D2.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/g3d/Geodesic3D2.java   2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/g3d/Geodesic3D2.java   2006-06-13 
22:30:34 UTC (rev 5219)
@@ -1,432 +0,0 @@
-/* $RCSfile$
- * $Author$
- * $Date$
- * $Revision$
- *
- * Copyright (C) 2005  Miguel, Jmol Development, www.jmol.org
- *
- * Contact: [EMAIL PROTECTED]
- *
- *  This library is free software; you can redistribute it and/or
- *  modify it under the terms of the GNU Lesser General Public
- *  License as published by the Free Software Foundation; either
- *  version 2.1 of the License, or (at your option) any later version.
- *
- *  This library is distributed in the hope that it will be useful,
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- *  Lesser General Public License for more details.
- *
- *  You should have received a copy of the GNU Lesser General Public
- *  License along with this library; if not, write to the Free Software
- *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-package org.jmol.g3d;
-
-import javax.vecmath.Vector3f;
-import org.jmol.util.Int2IntHash;
-
-  /**
-   * Constructs a canonical geodesic sphere of unit radius.
-   *<p>
-   * The Normix3D code quantizes arbitrary vectors to the vectors
-   * of this unit sphere. normix values are then used for
-   * high performance surface normal lighting
-   *<p>
-   * The vertices of the geodesic sphere can be used for constructing
-   * vanderWaals and Connolly dot surfaces.
-   *<p>
-   * One geodesic sphere is constructed. It is a unit sphere
-   * with radius of 1.0
-   *<p>
-   * Many times a sphere is constructed with lines of latitude and
-   * longitude. With this type of rendering, the atom has north and
-   * south poles. And the faces are not regularly shaped ... at the
-   * poles they are triangles but elsewhere they are quadrilaterals.
-   *<p>
-   * A geodesic sphere is more appropriate for this type
-   * of application. The geodesic sphere does not have poles and 
-   * looks the same in all orientations ... as a sphere should. All
-   * faces are triangles. Not equilateral, but close. 
-   *<p>
-   * The geodesic sphere is constructed by starting with an icosohedron, 
-   * a platonic solid with 12 vertices and 20 equilateral triangles
-   * for faces. The internal call to the private
-   * method <code>quadruple</code> will
-   * split each triangular face into 4 faces by creating a new vertex
-   * at the midpoint of each edge. These midpoints are still in the
-   * plane, so they are then 'pushed out' to the surface of the
-   * enclosing sphere by normalizing their length back to 1.0
-   *<p>
-   * The sequence of vertex counts is 12, 42, 162, 642, 2562.
-   * These are identified by 'levels', that run from 0 through 4;
-   * The vertices
-   * are stored so that when spheres are small they can choose to display
-   * only the first n bits where n is one of the above vertex counts.
-   *<code>
-   * Faces + Vertices = Edges + 2
-   *   Faces: 20, 80, 320, 1280, 5120, 20480
-   *     start with 20 faces ... at each level multiply by 4
-   *   Edges: 30, 120, 480, 1920, 7680, 30720
-   *     start with 30 edges ... also multipy by 4 ... strange, but true
-   *   Vertices: 12, 42, 162, 642, 2562, 10242
-   *     start with 12 vertices and 30 edges.
-   *     when you subdivide, each edge contributes one vertex
-   *     12 + 30 = 42 vertices at the next level
-   *     80 faces + 42 vertices - 2 = 120 edges at the next level
-   *</code>
-   *<p>
-   * The vertices of the 'one true canonical sphere' are rotated to the
-   * current molecular rotation at the beginning of the repaint cycle.
-   * That way,
-   * individual atoms only need to scale the unit vector to the vdw
-   * radius for that atom.
-   *<p>
-   *
-   * Notes 27 Sep 2005 <br />
-   * If I were to switch the representation to staring with
-   * a tetrahedron instead of an icosohedron we would get:
-   *<code>
-   * Faces: 4, 16, 64, 256, 1024
-   * Edges: 6, 24, 96, 384, 1536
-   * Vertices: 4, 10, 34, 130, 514
-   *</code>
-   * If I switched to face-centered normixes then I could efficiently
-   * Regardless, I think that face-centered normixes would also reduce
-   * ambiguity and would speed up the normal to normix process.
-   *
-   * I could also start with an octahedron that placed one triangle
-   * in each 3D cartesian octant. That would push to 512 faces instead
-   * of 256 faces, leaving me with shorts. But, it would be easier to quantize
-   * at the first level because it would be based upon sign. And perhaps
-   * it would be easier to take advantage of symmetry in the process of
-   * converting from normal to normix.
-   *
-   * Notes 11 Oct 2005 <br />
-   * Using an octahedron, the counts come up as follows:
-   * Faces:  8, 32, 128, 512
-   * Edges: 12, 48, 192, 768
-   * Vrtxs:  6, 18,  66, 258
-   */
-
-class Geodesic3D2 {
-  
-  Graphics3D g3d;
-
-  private final static boolean DUMP = true;
-
-  final static float halfRoot5 = (float)(0.5 * Math.sqrt(5));
-  final static float oneFifth = 2 * (float)Math.PI / 5;
-  final static float oneTenth = oneFifth / 2;
-  
-  // miguel 2005 01 11
-  // within the context of this code, the term 'vertex' is used
-  // to refer to a short which is an index into the tables
-  // of vertex information.
-  final static short[] faceVertexesOctant = {
-    0, 1, 4,
-    0, 5, 1,
-    0, 3, 5,
-    0, 4, 3,
-
-    2, 1, 5,
-    2, 5, 3,
-    2, 3, 4,
-    2, 4, 1,
-  };
-
-  // every vertex has 6 neighbors ... except at the beginning of the world
-  final static short[] neighborVertexesOctant = {
-    1, 4, 3, 5,-1,-1, // 0
-    0, 5, 2, 4,-1,-1, // 1
-    1, 5, 3, 4,-1,-1, // 2
-    0, 4, 2, 5,-1,-1, // 3
-    0, 1, 2, 3,-1,-1, // 4
-    0, 3, 2, 1,-1,-1, // 5
-  };
-
-  /**
-   * 5 levels, 0 through 4
-   */
-  final static int maxLevel = 3;
-  static short[] vertexCounts;
-  static short[][] neighborVertexesArrays;
-  static short[][] faceVertexesArrays;
-  static Vector3f[][] faceVectorsArrays;
-  static Vector3f[] vertexVectors = new Vector3f[] {
-    new Vector3f( 0, 1, 0),
-    new Vector3f( 0, 0, 1),
-    new Vector3f( 0,-1, 0),
-    new Vector3f( 0, 0,-1),
-    new Vector3f( 1, 0, 0),
-    new Vector3f(-1, 0, 0)
-  };
-
-
-
-  Geodesic3D2(Graphics3D g3d) {
-    this.g3d = g3d;
-    if (vertexCounts == null)
-      initialize();
-    if (DUMP) {
-      System.out.println("vertexVectors.length=" + vertexVectors.length);
-      for (int i = 0; i < vertexVectors.length; ++i)
-        System.out.println("" + i + " : " + vertexVectors[i]);
-    }
-  }
-
-  private synchronized void initialize() {
-    if (vertexCounts != null)
-      return;
-    vertexCounts = new short[maxLevel];
-    neighborVertexesArrays = new short[maxLevel][];
-    faceVertexesArrays = new short[maxLevel][];
-    faceVectorsArrays = new Vector3f[maxLevel][];
-    
-    faceVertexesArrays[0] = faceVertexesOctant;
-    neighborVertexesArrays[0] = neighborVertexesOctant;
-    vertexCounts[0] = 6;
-    
-    for (int i = 0; i < maxLevel - 1; ++i)
-      quadruple(i);
-    
-    if (DUMP) {
-      for (int i = 0; i < maxLevel; ++i) {
-        System.out.println("geodesic level " + i +
-                           " vertexCount= " + getVertexCount(i) +
-                           " faceCount=" + getFaceCount(i) +
-                           " edgeCount=" + getEdgeCount(i));
-      }
-    }
-    for (int i = 0; i < maxLevel; ++i)
-      faceVectorsArrays[i] =
-        buildFaceVectors(faceVertexesArrays[i], vertexVectors);
-  }
-  
-  static int getVertexCount(int level) {
-    return vertexCounts[level];
-  }
-
-  static Vector3f[] getVertexVectors() {
-    return vertexVectors;
-  }
-
-  static int getFaceCount(int level) {
-    return faceVertexesArrays[level].length / 3;
-  }
-
-  static int getEdgeCount(int level) {
-    return getVertexCount(level) + getFaceCount(level) - 2;
-  }
-
-  static short[] getNeighborVertexes(int level) {
-    return neighborVertexesArrays[level];
-  }
-
-  static short[] getFaceVertexes(int level) {
-    return faceVertexesArrays[level];
-  }
-
-  static Vector3f[] getFaceVectors(int level) {
-    return faceVectorsArrays[level];
-  }
-
-
-  private static short vertexNext;
-  private static Int2IntHash htVertex;
-    
-  private final static boolean VALIDATE = true;
-
-  private static void quadruple(int level) {
-    if (DUMP)
-      System.out.println("quadruple(" + level + ")");
-    htVertex = new Int2IntHash();
-    int oldVertexCount = vertexVectors.length;
-    short[] oldFaceVertexes = faceVertexesArrays[level];
-    int oldFaceVertexesLength = oldFaceVertexes.length;
-    int oldFaceCount = oldFaceVertexesLength / 3;
-    int oldEdgesCount = oldVertexCount + oldFaceCount - 2;
-    int newVertexCount = oldVertexCount + oldEdgesCount;
-    int newFaceCount = 4 * oldFaceCount;
-    Vector3f[] newVertexVectors = new Vector3f[newVertexCount];
-    System.arraycopy(vertexVectors, 0, newVertexVectors, 0, oldVertexCount);
-    vertexVectors = newVertexVectors;
-
-    short[] newFacesVertexes = new short[3 * newFaceCount];
-    faceVertexesArrays[level + 1] = newFacesVertexes;
-    short[] neighborVertexes = new short[6 * newVertexCount];
-    neighborVertexesArrays[level + 1] = neighborVertexes;
-    for (int i = neighborVertexes.length; --i >= 0; )
-      neighborVertexes[i] = -1;
-
-    vertexCounts[level + 1] = (short)newVertexCount;
-
-    if (DUMP)
-      System.out.println("oldVertexCount=" + oldVertexCount +
-                         " newVertexCount=" + newVertexCount +
-                         " oldFaceCount=" + oldFaceCount +
-                         " newFaceCount=" + newFaceCount);
-    
-    vertexNext = (short)oldVertexCount;
-
-    int iFaceNew = 0;
-    for (int i = 0; i < oldFaceVertexesLength; ) {
-      short iA = oldFaceVertexes[i++];
-      short iB = oldFaceVertexes[i++];
-      short iC = oldFaceVertexes[i++];
-      short iAB = getVertex(iA, iB);
-      short iBC = getVertex(iB, iC);
-      short iCA = getVertex(iC, iA);
-        
-      newFacesVertexes[iFaceNew++] = iA;
-      newFacesVertexes[iFaceNew++] = iAB;
-      newFacesVertexes[iFaceNew++] = iCA;
-
-      newFacesVertexes[iFaceNew++] = iB;
-      newFacesVertexes[iFaceNew++] = iBC;
-      newFacesVertexes[iFaceNew++] = iAB;
-
-      newFacesVertexes[iFaceNew++] = iC;
-      newFacesVertexes[iFaceNew++] = iCA;
-      newFacesVertexes[iFaceNew++] = iBC;
-
-      newFacesVertexes[iFaceNew++] = iCA;
-      newFacesVertexes[iFaceNew++] = iAB;
-      newFacesVertexes[iFaceNew++] = iBC;
-
-      addNeighboringVertexes(neighborVertexes, iAB, iA);
-      addNeighboringVertexes(neighborVertexes, iAB, iCA);
-      addNeighboringVertexes(neighborVertexes, iAB, iBC);
-      addNeighboringVertexes(neighborVertexes, iAB, iB);
-
-      addNeighboringVertexes(neighborVertexes, iBC, iB);
-      addNeighboringVertexes(neighborVertexes, iBC, iCA);
-      addNeighboringVertexes(neighborVertexes, iBC, iC);
-
-      addNeighboringVertexes(neighborVertexes, iCA, iC);
-      addNeighboringVertexes(neighborVertexes, iCA, iA);
-    }
-    if (VALIDATE) {
-      int vertexCount = vertexVectors.length;
-      if (iFaceNew != newFacesVertexes.length)
-        throw new NullPointerException();
-      if (vertexNext != newVertexCount)
-        throw new NullPointerException();
-      for (int i = 0; i < 6; ++i) {
-        for (int j = 0; j < 4; ++j) {
-          int neighbor = neighborVertexes[i * 6 + j];
-          if (neighbor < 0)
-            throw new NullPointerException();
-          if (neighbor >= vertexCount)
-            throw new NullPointerException();
-        }
-        if (neighborVertexes[i * 6 + 4] != -1)
-          throw new NullPointerException();
-        if (neighborVertexes[i * 6 + 5] != -1)
-          throw new NullPointerException();
-      }
-      for (int i = 6 * 6; i < neighborVertexes.length; ++i) {
-        int neighbor = neighborVertexes[i];
-        if (neighbor < 0)
-          throw new NullPointerException();
-        if (neighbor >= vertexCount)
-          throw new NullPointerException();
-      }
-      for (int i = 0; i < newVertexCount; ++i) {
-        int neighborCount = 0;
-        for (int j = neighborVertexes.length; --j >= 0; )
-          if (neighborVertexes[j] == i)
-            ++neighborCount;
-        if (i < 6) {
-          if (neighborCount != 4)
-            throw new NullPointerException();
-        } else {
-          if (neighborCount != 6)
-            throw new NullPointerException();
-        }
-        int faceCount = 0;
-        for (int j = newFacesVertexes.length; --j >= 0; )
-          if (newFacesVertexes[j] == i)
-            ++faceCount;
-        if (i < 6) {
-          if (faceCount != 4)
-            throw new NullPointerException();
-        } else {
-          if (faceCount != 6)
-            throw new NullPointerException();
-        }
-      }
-    }
-    htVertex = null;
-  }
-
-  private static void addNeighboringVertexes(short[] neighborVertexes,
-                                             short v1, short v2) {
-    //System.out.println("addNeighboringVertexes(...," + v1 + "," + v2 + ")");
-    for (int i = v1 * 6, iMax = i + 6; i < iMax; ++i) {
-      if (neighborVertexes[i] == v2)
-        return;
-      if (neighborVertexes[i] < 0) {
-        neighborVertexes[i] = v2;
-        for (int j = v2 * 6, jMax = j + 6; j < jMax; ++j) {
-          if (neighborVertexes[j] == v1)
-            return;
-          if (neighborVertexes[j] < 0) {
-            neighborVertexes[j] = v1;
-            return;
-          }
-        }
-      }
-    }
-    throw new NullPointerException();
-  }
-
-  /*
-  short getNeighborVertex(int level, short vertex, int neighborIndex) {
-    short[] neighborVertexes = neighborVertexesArrays[level];
-    int offset = vertex * 6 + neighborIndex;
-    return neighborVertexes[offset];
-  }
-  */
-    
-  private static short getVertex(short v1, short v2) {
-    if (v1 > v2) {
-      short t = v1;
-      v1 = v2;
-      v2 = t;
-    }
-    int hashKey = (v1 << 16) + v2;
-    int vertex = htVertex.get(hashKey);
-    if (vertex != Integer.MIN_VALUE)
-      return (short)vertex;
-    Vector3f newVertexVector = vertexVectors[vertexNext] = new Vector3f();
-    newVertexVector.add(vertexVectors[v1], vertexVectors[v2]);
-    newVertexVector.normalize();
-    htVertex.put(hashKey, vertexNext);
-    return vertexNext++;
-  }
-
-  static boolean isNeighborVertex(short vertex1, short vertex2, int level) {
-    short[] neighborVertexes = neighborVertexesArrays[level];
-    int offset1 = vertex1 * 6;
-    for (int i = offset1 + (vertex1 < 6 ? 4 : 6); --i >= offset1; )
-      if (neighborVertexes[i] == vertex2)
-        return true;
-    return false;
-  }
-
-  private static Vector3f[] buildFaceVectors(short[] faceVertexes,
-                                      Vector3f[] vertexVectors) {
-    int faceCount = faceVertexes.length / 3;
-    Vector3f faceVectors[] = new Vector3f[faceCount];
-    for (int i = 0, j = 0; i < faceCount; ++i, j += 3) {
-      Vector3f v = faceVectors[i] = new Vector3f();
-      v.add(vertexVectors[faceVertexes[j]],
-            vertexVectors[faceVertexes[j + 1]]);
-      v.add(vertexVectors[faceVertexes[j + 2]]);
-      v.normalize();
-    }
-    return faceVectors;
-  }
-}

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Axes.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Axes.java       2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Axes.java       2006-06-13 
22:30:34 UTC (rev 5219)
@@ -24,11 +24,22 @@
 package org.jmol.viewer;
 
 
+import java.util.BitSet;
+
 import javax.vecmath.Point3f;
 import javax.vecmath.Vector3f;
 
 class Axes extends SelectionIndependentShape {
 
+  
+  void setProperty(String propertyName, Object value, BitSet bs) {
+    if ("scale" == propertyName) {
+      setScale(((Float)value).floatValue());
+      return;
+    }
+    super.setProperty(propertyName, value, bs);
+  }
+
   final static Point3f[] unitAxisPoints = {
     new Point3f( 1, 0, 0),
     new Point3f( 0, 1, 0),
@@ -38,6 +49,8 @@
     new Point3f( 0, 0,-1)
   };
 
+  float scale = 1f;
+
   final Point3f originPoint = new Point3f();
   final Point3f[] axisPoints = new Point3f[6];
   {
@@ -78,10 +91,15 @@
       if (corner.z < MIN_AXIS_LEN)
         corner.z = MIN_AXIS_LEN;
       
-      axisPoint.x *= corner.x;
-      axisPoint.y *= corner.y;
-      axisPoint.z *= corner.z;
+      axisPoint.x *= corner.x * scale;
+      axisPoint.y *= corner.y * scale;
+      axisPoint.z *= corner.z * scale;
       axisPoint.add(originPoint);
     }
   }
+  
+  void setScale(float angstroms) {
+    scale = angstroms;
+    initShape();
+  }
 }

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Draw.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Draw.java       2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Draw.java       2006-06-13 
22:30:34 UTC (rev 5219)
@@ -187,12 +187,12 @@
     if (isFixed) {
       currentMesh.setPolygonCount(1);
       currentMesh.ptCenters = null;
-      currentMesh.visibilityFlags = null;
+      currentMesh.modelFlags = null;
       nPoly = setVerticesAndPolygons(-1, nPoly);
     } else {
       currentMesh.setPolygonCount(modelCount);
       currentMesh.ptCenters = new Point3f[modelCount];
-      currentMesh.visibilityFlags = new int[modelCount];
+      currentMesh.modelFlags = new int[modelCount];
       for (int iModel = 0; iModel < modelCount; iModel++) {
         // int n0 = currentMesh.vertexCount;
         nPoly = setVerticesAndPolygons(iModel, nPoly);
@@ -216,7 +216,7 @@
               addPoint(m.vertices[ipt]);
           } else {
             for (ipt = 0; ipt < m.drawVertexCount; ipt++) {
-              System.out.println(nPoints +" "+m.meshID+ " 
count="+m.drawVertexCount + " length=" + m.vertices.length);
+              //System.out.println(nPoints +" "+m.meshID+ " 
count="+m.drawVertexCount + " length=" + m.vertices.length);
               addPoint(m.vertices[ipt]);
 
             }
@@ -274,10 +274,11 @@
      */
     int modelCount = viewer.getModelCount();
     for (int i = meshCount; --i >= 0;) {
-      if (meshes[i].visibilityFlags == null)
+      meshes[i].visibilityFlags = myVisibilityFlag;
+      if (meshes[i].modelFlags == null)
         continue;
       for (int iModel = modelCount; --iModel >= 0;)
-        meshes[i].visibilityFlags[iModel] = (bs.get(iModel) ? 1 : 0);
+        meshes[i].modelFlags[iModel] = (bs.get(iModel) ? 1 : 0);
     }
   }
 
@@ -294,7 +295,7 @@
       mesh = meshes[i];
       if (mesh.drawVertexCount == 2) {
         for (int iModel = modelCount; --iModel >= 0;) {
-          if (mesh.visibilityFlags != null && mesh.visibilityFlags[iModel] == 
0)
+          if (mesh.modelFlags != null && mesh.modelFlags[iModel] == 0)
             continue;
           for (int iVertex = mesh.polygonIndexes[iModel].length; --iVertex >= 
0;) {
             int d2 = coordinateInRange(x, y,

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java       2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java       2006-06-13 
22:30:34 UTC (rev 5219)
@@ -371,7 +371,7 @@
       if (logMessages || viewer.getDebugScript())
         logDebugScript();
       Token token = statement[0];
-      //System.out.println(token);
+      //System.out.println(token + " token/tok " + token.tok + " isosurface:" 
+ Token.isosurface);
       switch (token.tok) {
       case Token.backbone:
         proteinShape(JmolConstants.SHAPE_BACKBONE);
@@ -842,10 +842,18 @@
     evalError("{ number number number } expected");
   }
 
+  void coordinateOrNameOrExpressionRequired() throws ScriptException {
+    evalError(" {x y z} or $name or (atom expression) required");  
+  }
+  
   void tooManyRotationPoints() throws ScriptException {
     evalError("too many rotation points were specified");
   }
 
+  void keywordRequired(String what) throws ScriptException {
+    evalError("keyword required: " + what);
+  }
+
   void notImplemented(int itoken) {
     notImplemented(statement[itoken]);
   }
@@ -1580,8 +1588,6 @@
     // color $ whatever green
     String objectName = objectNameParameter(index);
     int shapeType = viewer.getShapeIdFromObjectName(objectName);
-    System.out.println("colorIdentifiedObject" + index + " " + shapeType + " "
-        + objectName);
     if (shapeType < 0)
       objectNameExpected();
     viewer.setShapeProperty(shapeType, "meshID", objectName);
@@ -3054,6 +3060,18 @@
   }
 
   void setAxes(int cmdPt) throws ScriptException {
+    if (statement.length == 1) {
+      viewer.setShapeSize(JmolConstants.SHAPE_AXES, 1);
+      return;
+    }
+    // set axes scale x.xxx
+    if (statement.length == cmdPt + 2
+        && statement[cmdPt].tok == Token.identifier
+        && ((String) statement[cmdPt].value).equalsIgnoreCase("scale")) {
+      viewer.setShapeProperty(JmolConstants.SHAPE_AXES, "scale", new Float(
+          floatParameter(cmdPt + 1)));
+      return;
+    }
     viewer.setShapeSize(JmolConstants.SHAPE_AXES, getSetAxesTypeMad(cmdPt));
   }
 
@@ -3980,10 +3998,8 @@
   }
 
   void isosurface() throws ScriptException {
-    int fileIndexPt = 0;
     int signPt = 0;
-    int contourPt = 0;
-    int orbitalPt = 0;
+    boolean isOrbital = false;
     float[] nlmZR = new float[5];
     viewer.loadShape(JmolConstants.SHAPE_ISOSURFACE);
     viewer.setShapeProperty(JmolConstants.SHAPE_ISOSURFACE, "init", null);
@@ -3995,7 +4011,29 @@
       String propertyName = null;
       Object propertyValue = null;
       Token token = statement[i];
+      System.out.println(i + " " + token);
       switch (token.tok) {
+      case Token.center:
+        propertyName = "center";
+        switch (statement[++i].tok) {
+        case Token.dollarsign:
+          String id = objectNameParameter(++i);
+            propertyValue = viewer.getDrawObjectCenter(id);
+            if (propertyValue == null)
+              drawObjectNotDefined(id);
+          break;
+        case Token.expressionBegin:
+            propertyValue = viewer.getAtomSetCenter(expression(statement, i + 
1));
+            i = pcLastExpressionInstruction;
+          break;
+        case Token.leftbrace:
+            propertyValue = getCoordinate(i, true);
+            i = pcLastExpressionInstruction;
+            break;
+        default:
+          coordinateOrNameOrExpressionRequired();
+          }
+        break;
       case Token.leftbrace:
         // {X, Y, Z, W}
         propertyName = "plane";
@@ -4016,12 +4054,22 @@
         colorRangeStage++;
         break;
       case Token.solvent:
-          propertyName = "solvent";
-          propertyValue = new Float(viewer.getSolventProbeRadius());
-          System.out.println (propertyName+" "+propertyValue);
+        propertyName = "solvent";
+        propertyValue = new Float(viewer.getSolventProbeRadius());
         break;
       case Token.identifier:
         String str = (String) token.value;
+        if (str.equalsIgnoreCase("FIXED")) {
+          propertyName = "fixed";
+          propertyValue = Boolean.TRUE;
+          break;
+        }
+        if (str.equalsIgnoreCase("MODELBASED")) {
+          propertyName = "fixed";
+          propertyValue = Boolean.FALSE;
+          break;
+        }
+        
         if (str.equalsIgnoreCase("sign")) {
           signPt = i + 1;
           propertyName = "sign";
@@ -4029,15 +4077,22 @@
           colorRangeStage = 1;
           break;
         } else if (str.equalsIgnoreCase("phase")) {
-          if (orbitalPt != 0) {
+          if (isOrbital) {
             propertyName = "phase";
             propertyValue = "_orb";
             break;
           }
           colorByPhase = true;
           break;
+        } else if (str.equalsIgnoreCase("functionXY")) {
+          propertyName = "functionXY";
+          break;
+        } else if (str.equalsIgnoreCase("insideOut")) {
+          propertyName = "insideOut";
+          break;
         } else if (str.equalsIgnoreCase("fileIndex")) {
-          fileIndexPt = i + 1;
+          propertyName = "fileIndex";
+          propertyValue = new Integer(intParameter(++i));
           break;
         } else if (str.equalsIgnoreCase("noBackground")) {
           propertyName = "background";
@@ -4055,11 +4110,20 @@
           propertyName = "gridPoints";
           break;
         } else if (str.equalsIgnoreCase("orbital")) {
-          orbitalPt = i + nlmZR.length;
+          nlmZR[0] = intParameter(++i);
+          nlmZR[1] = intParameter(++i);
+          nlmZR[2] = intParameter(++i);
+          nlmZR[3] = (statement[i + 1].tok == Token.integer ? 
floatParameter(++i)
+              : 6f);
+          nlmZR[4] = (statement[i + 1].tok == Token.integer ? 
floatParameter(++i)
+              : 10f);
+          propertyName = "orbital";
+          propertyValue = nlmZR;
+          isOrbital = true;
           break;
         } else if (str.equalsIgnoreCase("contour")) {
           propertyName = "contour";
-          contourPt = i + 1;
+          propertyValue = new Integer(intParameter(++i));
           break;
         }
         propertyValue = token.value;
@@ -4091,41 +4155,13 @@
         }
         break;
       case Token.decimal:
-        if (colorRangeStage == 0 && orbitalPt <= 0) {
+        if (colorRangeStage == 0) {
           propertyName = "cutoff";
           propertyValue = token.value;
           break;
         }
       // fall into
       case Token.integer:
-        if (orbitalPt > 0 && i <= orbitalPt) {
-          int ipt = nlmZR.length - (orbitalPt - i) - 1;
-          if (ipt < 3 && token.tok != Token.integer)
-            integerExpected();
-          // n l m Znuc ptsPerAngstrom 
-          nlmZR[ipt] = floatParameter(i);
-          if (i != orbitalPt)
-            break;
-          propertyName = "orbital";
-          propertyValue = nlmZR;
-          orbitalPt = -999;
-          break;
-        }
-        if (i == contourPt) {
-          if (token.tok != Token.integer)
-            integerExpected();
-          propertyName = "contour";
-          propertyValue = new Integer(token.intValue);
-          contourPt = 0;
-          break;
-        }
-        if (i == fileIndexPt) {
-          if (token.tok != Token.integer)
-            integerExpected();
-          propertyName = "fileIndex";
-          propertyValue = new Integer(token.intValue);
-          break;
-        }
         if (colorRangeStage == 0 || colorRangeStage >= 3)
           invalidArgument();
         propertyName = colorRangeStage == 1 ? "red" : "blue";

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Isosurface.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Isosurface.java 2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Isosurface.java 2006-06-13 
22:30:34 UTC (rev 5219)
@@ -115,9 +115,11 @@
   int colorPtr;
   boolean colorByPhase;
   int colorPhase;
+  boolean insideOut;
   boolean isCalculation;
   boolean isOrbital;
   boolean isSolvent;
+  boolean isFunctionXY;
   float solventRadius;
 
   int edgeFractionBase;
@@ -156,10 +158,12 @@
   boolean iDoContourPlane;
   boolean dataIsJvxl2dContour;
 
+  Point3f center = new Point3f();
   Point4f thePlane;
   int nContours;
   int thisContour;
   boolean dotsOnly;
+  boolean isFixed; 
 
   BufferedReader br;
 
@@ -173,6 +177,8 @@
       fileIndex = 1;
       nBytes = 0;
       nContours = 0;
+      insideOut = false;
+      isFixed = false;
       thePlane = null;
       iAddGridPoints = false;
       associateNormals = true;
@@ -188,12 +194,19 @@
       colorByPhase = false;
       isOrbital = false;
       isSolvent = false;
+      isFunctionXY = false;
       isCalculation = false;
+      center.set(Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE);
       cutoff = Float.MAX_VALUE;
       super.setProperty("meshID", null, null);
       return;
     }
 
+    if ("center" == propertyName) {
+      center.set((Point3f) value);
+      return;
+    }
+
     if ("sign" == propertyName) {
       colorBySign = true;
       colorPtr = 0;
@@ -227,6 +240,17 @@
       return;
     }
 
+    if ("insideOut" == propertyName) {
+      insideOut = true;
+      return;
+    }
+
+    if ("fixed" == propertyName) {
+      isFixed = ((Boolean) value).booleanValue();
+      setModelIndex();
+      return;
+    }
+
     if ("contour" == propertyName) {
       if (value instanceof Integer)
         nContours = ((Integer) value).intValue();
@@ -274,13 +298,13 @@
         return;
       }
       applyColorScale();
-      if (currentMesh != null)
-        currentMesh.visible = true;
+      setModelIndex();
       return;
     }
 
     if ("solvent" == propertyName) {
       isSolvent = isCalculation = true;
+      isOrbital = isFunctionXY = false;
       solventRadius = ((Float) value).floatValue();
       if (solventRadius < 0)
         solventRadius = defaultSolventRadius;
@@ -292,6 +316,8 @@
 
     if ("orbital" == propertyName) {
       isOrbital = isCalculation = true;
+      isSolvent = isFunctionXY = false;
+
       float[] nlmZR = (float[]) value;
       psi_n = (int) nlmZR[0];
       psi_l = (int) nlmZR[1];
@@ -307,6 +333,13 @@
       }
       propertyName = "bufferedReader";
     }
+
+    if ("functionXY" == propertyName) {
+      isFunctionXY = true;
+      isSolvent = isOrbital = isCalculation = false;
+      return;
+    }
+
     if ("bufferedReader" == propertyName) {
       if (!isCalculation)
         br = (BufferedReader) value;
@@ -321,12 +354,13 @@
       currentMesh.nBytes = nBytes;
       if (thePlane == null)
         System.out.println("\n" + jvxlGetFile(currentMesh, jvxlFileMessage));
-      currentMesh.visible = true;
+      setModelIndex();
       return;
     }
     if ("colorReader" == propertyName) {
       isSolvent = false;
       isOrbital = false;
+      isFunctionXY = false;
       System.out.println("mapping data...");
       br = (BufferedReader) value;
       checkFlags();
@@ -341,7 +375,7 @@
       discardTempData(true);
       currentMesh.nBytes = nBytes;
       System.out.println("\n" + jvxlGetFile(currentMesh, jvxlFileMessage));
-      currentMesh.visible = true;
+      setModelIndex();
       return;
     }
 
@@ -526,6 +560,8 @@
           System.out.println("cube axes vector:" + volumetricVectors[i]);
         }
       }
+      if (center.x != Float.MAX_VALUE)
+        offsetCenter();
       setupMatrix(volumetricMatrix, volumetricVectors);
       readAtoms();
       return readExtraLine();
@@ -679,6 +715,8 @@
     isJvxlColorMapped = false;
     isJvxlColorPrecision = false;
     thisInside = (!isJvxl || thePlane == null);
+    if(insideOut) 
+      thisInside = !thisInside;
     nDataPoints = 0;
     voxelData = new float[nPointsX][][];
 
@@ -700,6 +738,8 @@
       for (int y = 0; y < nPointsY; ++y) {
         float[] strip = new float[nPointsZ];
         plane[y] = strip;
+        if (isFunctionXY)
+          getValueZ(x, y);
         for (int z = 0; z < nPointsZ; ++z) {
           float voxelValue;
           /*
@@ -714,6 +754,8 @@
             voxelValue = getPsi2(x, y, z);
           else if (isSolvent)
             voxelValue = getSolventValue(x, y, z);
+          else if (isFunctionXY)
+            voxelValue = calcVoxelZDistance(x, y, z);
           else if (isMapData || thePlane == null)
             voxelValue = getNextVoxelValue();
           else
@@ -2787,6 +2829,16 @@
     return ptXyz;
   }
 
+  void offsetCenter() {
+    Point3f ptXyz = new Point3f();
+    ptXyz.scaleAdd((voxelCounts[0] - 1) / 2f, volumetricVectors[0], ptXyz);
+    ptXyz.scaleAdd((voxelCounts[1] - 1) / 2f, volumetricVectors[1], ptXyz);
+    ptXyz.scaleAdd((voxelCounts[2] - 1) / 2f, volumetricVectors[2], ptXyz);
+    System.out.println("teset1 "+volumetricOrigin);
+    volumetricOrigin.sub(center, ptXyz);
+    System.out.println("teset2 "+volumetricOrigin);
+  }
+
   Point3f pixelPtToXYZ(int x, int y) {
     Point3f ptXyz = new Point3f();
     ptXyz.scaleAdd(x, planarVectors[0], planarOrigin);
@@ -2896,7 +2948,7 @@
   int lastFactorial = -1;
 
   int psi_gridMax = 60;
-  Point3f psiOrigin = new Point3f(0, 0, 0);
+  Point3f psiOrigin = new Point3f();
   final static double A0 = 0.52918f; //x10^-10 meters
   final static double ROOT2 = 1.414214;
   int psi_n = 2;
@@ -2908,7 +2960,10 @@
 
   void setupOrbital() {
     psi_radiusAngstroms = autoScaleOrbital();
-
+    if (center.x == Float.MAX_VALUE)
+      psiOrigin.set(0,0,0);
+    else
+      psiOrigin.set(center);
     for (int i = 0; i < 3; i++)
       setVoxelRange(i, -psi_radiusAngstroms, psi_radiusAngstroms,
           psi_ptsPerAngstrom, psi_gridMax);
@@ -3057,13 +3112,10 @@
     jvxlFileHeader = "solvent accesible surface\nrange " + xyzMin + " to "
         + xyzMax + "\n";
 
-    int maxGrid =  solvent_gridMax / (iAtom > 50 ? 2 : 1);
-    setVoxelRange(0, xyzMin.x, xyzMax.x, solvent_ptsPerAngstrom,
-        maxGrid);
-    setVoxelRange(1, xyzMin.y, xyzMax.y, solvent_ptsPerAngstrom,
-        maxGrid);
-    setVoxelRange(2, xyzMin.z, xyzMax.z, solvent_ptsPerAngstrom,
-        maxGrid);
+    int maxGrid = solvent_gridMax / (iAtom > 50 ? 2 : 1);
+    setVoxelRange(0, xyzMin.x, xyzMax.x, solvent_ptsPerAngstrom, maxGrid);
+    setVoxelRange(1, xyzMin.y, xyzMax.y, solvent_ptsPerAngstrom, maxGrid);
+    setVoxelRange(2, xyzMin.z, xyzMax.z, solvent_ptsPerAngstrom, maxGrid);
 
     jvxlFileHeader += jvxlGetVolumeHeader();
     atomCount = 0;
@@ -3074,7 +3126,7 @@
     solvent_voxel.setValue(x, y, z, Float.MAX_VALUE);
     float rA, rB;
     Point3f ptA, ptB;
-      for (int i = 0; i < solvent_nAtoms && solvent_voxel.value >= -0.5; i++) {
+    for (int i = 0; i < solvent_nAtoms && solvent_voxel.value >= -0.5; i++) {
       ptA = solvent_ptAtom[i];
       rA = solvent_atomRadius[i];
       float v = solvent_voxel.ptXyz.distance(ptA) - rA;
@@ -3199,4 +3251,44 @@
         * Math.cos(angleBAS - angleVAB));
     return dVS;
   }
+
+  float zValue;
+
+  void getValueZ(int x, int y) {
+    zValue = viewer.functionXY(x, y);
+  }
+
+  float calcVoxelZDistance(int x, int y, int z) {
+    if (x < 2 && y < 2)
+      System.out.println(x + " " + y + " " + zValue + " " + (z - zValue));
+    return z - zValue;
+  }
+  
+  void setModelIndex() {
+    if (currentMesh == null)
+      return;
+    currentMesh.visible = true;
+    int modelCount = viewer.getModelCount();
+    if (modelCount < 2)
+      isFixed = true;
+    if (isFixed) {
+      currentMesh.modelIndex = -1;
+    } else {
+      currentMesh.modelIndex = viewer.getDisplayModelIndex();
+    }  
+  }
+  
+  void setVisibilityFlags(BitSet bs) {
+    /*
+     * set all fixed objects visible; others based on model being displayed
+     * 
+     */
+    for (int i = meshCount; --i >= 0;) {
+      Mesh mesh = meshes[i];
+      mesh.visibilityFlags = 
+        (mesh.visible && (mesh.modelIndex < 0 || bs.get(mesh.modelIndex)) ? 
myVisibilityFlag : 0);
+    }
+  }
+
+
 }

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/JmolConstants.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/JmolConstants.java      
2006-06-13 17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/JmolConstants.java      
2006-06-13 22:30:34 UTC (rev 5219)
@@ -39,7 +39,7 @@
   // for now, just update this by hand
   // perhaps use ant filter later ... but mth doesn't like it :-(
   public final static String copyright = "(C) 2006 Jmol Development";
-  public final static String version = "10.x.11(branch bob200603)";
+  public final static String version = "10.x.11c(branch bob200603)";
   public final static String cvsDate = "$Date$";
   public final static String date = cvsDate.substring(7, 23);
 

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Mesh.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Mesh.java       2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Mesh.java       2006-06-13 
22:30:34 UTC (rev 5219)
@@ -27,7 +27,6 @@
 
 import org.jmol.g3d.*;
 
-import javax.vecmath.Point3i;
 import javax.vecmath.Point3f;
 import javax.vecmath.Point4f;
 import javax.vecmath.Vector3f;
@@ -73,9 +72,10 @@
   Vector3f axes[];
   String meshType = null;
   String drawType = null;
+  int modelIndex = -1;  // for Isosurface
+  int visibilityFlags;
+  int[] modelFlags = null; //one per POLYGON for DRAW
   
-  int[] visibilityFlags = null;
-  
   boolean showPoints = false;
   boolean drawTriangles = false;
   boolean fillTriangles = true;
@@ -155,7 +155,7 @@
   }
 
   void setPolygonCount(int polygonCount) {
-    System.out.println("Mesh setPolygonCount" + polygonCount);
+    //System.out.println("Mesh setPolygonCount" + polygonCount);
     this.polygonCount = polygonCount;
     if (polygonIndexes == null || polygonCount > polygonIndexes.length)
       polygonIndexes = new int[polygonCount][];
@@ -185,6 +185,7 @@
   }
 
   void checkForDuplicatePoints(float cutoff) {
+    //not implemented
     float cutoff2 = cutoff * cutoff;
     for (int i = vertexCount; --i >= 0; )
       for (int j = i; --j >= 0; ) {
@@ -202,8 +203,8 @@
   }
   
  final  boolean isPolygonDisplayable(int index) {
-    return (visibilityFlags == null ||
-        visibilityFlags[index] != 0); 
+    return (modelFlags == null ||
+        modelFlags[index] != 0); 
   }
   
   final int setPolygon(Point3f[] ptList, int nVertices, int nPoly,

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/MeshRenderer.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/MeshRenderer.java       
2006-06-13 17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/MeshRenderer.java       
2006-06-13 22:30:34 UTC (rev 5219)
@@ -35,7 +35,7 @@
   short backgroundColix;
   
   void render1(Mesh mesh) {
-    if (!mesh.visible)
+    if (mesh.visibilityFlags == 0)
       return;
     int vertexCount = mesh.vertexCount;
     if (vertexCount == 0)

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/ModelManager.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/ModelManager.java       
2006-06-13 17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/ModelManager.java       
2006-06-13 22:30:34 UTC (rev 5219)
@@ -1282,6 +1282,8 @@
     boolean showHydrogens = viewer.getShowHydrogens();
     int ballVisibilityFlag = 
viewer.getShapeVisibilityFlag(JmolConstants.SHAPE_BALLS);
     int haloVisibilityFlag = 
viewer.getShapeVisibilityFlag(JmolConstants.SHAPE_HALO);
+    
+    //the three isosurface-related objects must be set individually
     BitSet bs = viewer.getVisibleFramesBitSet();
     Draw draw = (Draw) frame.shapes[JmolConstants.SHAPE_DRAW];
     if (draw != null)
@@ -1289,6 +1291,10 @@
     Polyhedra p = (Polyhedra) frame.shapes[JmolConstants.SHAPE_POLYHEDRA];
     if (p != null)
       p.setVisibilityFlags(bs);
+    Isosurface surf = (Isosurface) 
frame.shapes[JmolConstants.SHAPE_ISOSURFACE];
+    if (surf != null)
+      surf.setVisibilityFlags(bs);
+    
     for (int i = frame.atomCount; --i >= 0; ) {
       Atom atom = atoms[i];
       atom.shapeVisibilityFlags &= (

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/StatusManager.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/StatusManager.java      
2006-06-13 17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/StatusManager.java      
2006-06-13 22:30:34 UTC (rev 5219)
@@ -304,5 +304,9 @@
     return msgList;
   }
   
+  float functionXY(int x, int y) {
+    return (jmolStatusListener == null ? 0 :
+      jmolStatusListener.functionXY(x, y));
+  }
 }
 

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Token.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Token.java      2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Token.java      2006-06-13 
22:30:34 UTC (rev 5219)
@@ -181,7 +181,7 @@
   final static int pmesh        = command | 91;
   final static int polyhedra    = command | 92 | embeddedExpression;
   final static int centerAt     = command | 93;
-  final static int isosurface   = command | 94 | negnums | showparam | 
colorparam;
+  final static int isosurface   = command | 94 | negnums | showparam | 
colorparam | embeddedExpression;
   final static int draw         = command | 95 | embeddedExpression;
   final static int getproperty  = command | 96;
   final static int dipole       = command | 97 | embeddedExpression;
@@ -546,7 +546,7 @@
 
     // setparams
     "ambient",      new Token(ambient,         "ambient"),
-    "axes",         new Token(axes, onDefault1,    "axes"),
+    "axes",         new Token(axes, varArgCount,    "axes"),
     "backfade",     new Token(backfade,        "backfade"),
     "bondmode",     new Token(bondmode,        "bondmode"),
     "bonds",        new Token(bonds,           "bonds"),

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java     2006-06-13 
17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java     2006-06-13 
22:30:34 UTC (rev 5219)
@@ -3212,5 +3212,8 @@
   public void setAtomCoordRelative(int atomIndex, float x, float y, float z) {
     modelManager.setAtomCoordRelative(atomIndex,x,y,z);
   }
-
+  
+  float functionXY(int x, int y) {
+    return statusManager.functionXY(x, y);
+  }
 }

Modified: branches/bob200603/Jmol/src/org/openscience/jmol/app/Jmol.java
===================================================================
--- branches/bob200603/Jmol/src/org/openscience/jmol/app/Jmol.java      
2006-06-13 17:57:57 UTC (rev 5218)
+++ branches/bob200603/Jmol/src/org/openscience/jmol/app/Jmol.java      
2006-06-13 22:30:34 UTC (rev 5219)
@@ -1439,6 +1439,10 @@
         scriptWindow.hide();
     }
     
+    public float functionXY(int x, int y) {
+      return 0;  // for user-defined isosurface functions (testing only -- bob 
hanson)
+    }
+
   }
 
   class ExecuteScriptAction extends AbstractAction {
@@ -1450,4 +1454,5 @@
       viewer.evalStringQuiet(e.getActionCommand());
     }
   }
+  
 }


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Jmol-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-commits

Reply via email to