Revision: 5223
Author:   hansonr
Date:     2006-06-14 11:03:21 -0700 (Wed, 14 Jun 2006)
ViewCVS:  http://svn.sourceforge.net/jmol/?rev=5223&view=rev

Log Message:
-----------
bob200603 10.x.13 measure

10.2-functionality:

changes "measures off" to turn measures off, not delete them

10.x functionality:
adds "measure OFF/ON/DELETE ALL/ALLCONNECTED (atom expr)..."

adds "measures delete" to do that
fixes bugs in measurement table not updating
fixes bug in measure not respecting "set showMeasurements"
adds "set measurementNumbers" equivalent to "set measurements"
leaves "set measurements" for compatibility

Modified Paths:
--------------
    branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java
    branches/bob200603/Jmol/src/org/jmol/viewer/JmolConstants.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Measurement.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Measures.java
    branches/bob200603/Jmol/src/org/jmol/viewer/MeasuresRenderer.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java
Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java       2006-06-14 
03:19:21 UTC (rev 5222)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java       2006-06-14 
18:03:21 UTC (rev 5223)
@@ -683,6 +683,8 @@
     viewer.scriptStatus(strbufLog.toString());
   }
 
+  ///// ERROR TRAPS /////
+  
   void evalError(String message) throws ScriptException {
     throw new ScriptException(message, getLine(), filename, getLinenumber());
   }
@@ -719,6 +721,10 @@
     evalError("(atom expression) or decimal number expected");
   }
 
+  void expressionOrIntegerExpected() throws ScriptException {
+    evalError("(atom expression) or integer expected");
+  }
+
   void expressionExpected() throws ScriptException {
     evalError("(atom expression) expected");
   }
@@ -850,8 +856,8 @@
     evalError("too many rotation points were specified");
   }
 
-  void keywordRequired(String what) throws ScriptException {
-    evalError("keyword required: " + what);
+  void keywordExpected(String what) throws ScriptException {
+    evalError("keyword expected: " + what);
   }
 
   void notImplemented(int itoken) {
@@ -1771,89 +1777,130 @@
   }
 
   //measure() see monitor()
-  
+
   void monitor() throws ScriptException {
     int[] monitorArgs = new int[5];
     float[] rangeMinMax = new float[2];
     if (statementLength == 1) {
-      viewer.setShowMeasurements(true);
+      viewer.hideMeasurements(false);
       return;
     }
     if (statementLength == 2) {
       if (statement[1].tok == Token.on)
-        viewer.setShowMeasurements(true);
+        viewer.hideMeasurements(false);
       else if (statement[1].tok == Token.off)
+        viewer.hideMeasurements(true);
+      else if (statement[1].tok == Token.delete)
         viewer.clearMeasurements();
       else
-        booleanExpected();
+        keywordExpected("ON, OFF, or DELETE");
       return;
     }
     monitorArgs[0] = 0;
     int argCount = statementLength - 1;
+    int expressionCount = 0;
     int atomIndex = -1;
     int atomNumber = 0;
     int ptFloat = -1;
     rangeMinMax[0] = Float.MAX_VALUE;
     rangeMinMax[1] = Float.MAX_VALUE;
     boolean isAll = false;
+    boolean isAllConnected = false;
+    boolean isExpression = false;
     boolean isDelete = false;
+    boolean isRange = true;
+    boolean isON = false;
+    boolean isOFF = false;
     Vector monitorExpressions = new Vector();
 
     BitSet bs = new BitSet();
 
-    // int numAtoms = viewer.getAtomCount();
-    for (int i = 0; i < argCount; ++i) {
-      Token token = statement[i + 1];
-      //System.out.println(i+" "+token.toString());
+    for (int i = 1; i <= argCount; ++i) {
+      Token token = statement[i];
       switch (token.tok) {
+      case Token.on:
+        if (isON || isOFF || isDelete)
+          invalidArgument();
+        isON = true;
+        continue;
+      case Token.off:
+        if (isON || isOFF || isDelete)
+          invalidArgument();
+        isOFF = true;
+        continue;
       case Token.delete:
+        if (isON || isOFF || isDelete)
+          invalidArgument();
         isDelete = true;
+        continue;
+      case Token.identifier:
+        if (((String) token.value).equalsIgnoreCase("ALLCONNECTED"))
+          isAllConnected = true;
+        else if (((String) token.value).equalsIgnoreCase("RANGE"))
+          isRange = true; //unnecessary
+        else
+          keywordExpected("ALL, ALLCONNECTED, or DELETE");
+      // fall through
       case Token.all:
         atomIndex = -1;
         isAll = true;
-        break;
+        continue;
       case Token.decimal:
         isAll = true;
+        isRange = true;
         ptFloat = (ptFloat + 1) % 2;
         rangeMinMax[ptFloat] = ((Float) token.value).floatValue();
-        break;
+        continue;
       case Token.integer:
+        isRange = true; // irrelevant if just four integers
         atomNumber = token.intValue;
         atomIndex = viewer.getAtomIndexFromAtomNumber(atomNumber);
         ptFloat = (ptFloat + 1) % 2;
         rangeMinMax[ptFloat] = atomNumber;
         break;
       case Token.expressionBegin:
-        bs = expression(statement, i + 1);
+        isExpression = true;
+        bs = expression(statement, i);
         atomIndex = viewer.firstAtomOf(bs);
-        i = pcLastExpressionInstruction - 1;
+        i = pcLastExpressionInstruction;
         break;
       default:
-        integerExpected();
+        expressionOrIntegerExpected();
       }
-      // System.out.println("eval monitor"+isAll + " " +atomIndex + " " + bs);
-      if (atomIndex == -1 && !isAll)
+      if (atomIndex == -1)
         badAtomNumber();
-      if (monitorArgs[0] == 4)
-        badArgumentCount();
-      // System.out.println("monitor() adding " + atomIndex);
       if (isAll) {
-        if (atomIndex >= 0)
-          monitorExpressions.add(bs);
+        if (bs == null || bs.size() == 0)
+          badAtomNumber();
+        if (++expressionCount > 4)
+          badArgumentCount();
+        monitorExpressions.add(bs);
       } else {
-        monitorArgs[++monitorArgs[0]] = atomIndex;
+        if (atomIndex == -1)
+          badAtomNumber();
+        if (++monitorArgs[0] > 4)
+          badArgumentCount();
+        monitorArgs[monitorArgs[0]] = atomIndex;
       }
     }
     if (isAll) {
-      if (rangeMinMax[1] < rangeMinMax[0]) {
+      if (!isExpression)
+        expressionExpected();
+      if (isRange && rangeMinMax[1] < rangeMinMax[0]) {
         rangeMinMax[1] = rangeMinMax[0];
         rangeMinMax[0] = (rangeMinMax[1] == Float.MAX_VALUE ? Float.MAX_VALUE
             : -200F);
       }
-      viewer.defineMeasurement(monitorExpressions, rangeMinMax, isDelete);
-    } else {
+      viewer.defineMeasurement(monitorExpressions, rangeMinMax, isDelete,
+          isAllConnected, isON || isOFF, isOFF);
+    } else if (isDelete)
+      viewer.deleteMeasurement(monitorArgs);
+    else if (isON)
+      viewer.showMeasurement(monitorArgs, true);
+    else if (isOFF)
+      viewer.showMeasurement(monitorArgs, false);
+    else
       viewer.toggleMeasurement(monitorArgs);
-    }
   }
 
   void refresh() {
@@ -3023,7 +3070,11 @@
       notImplemented(1);
       break;
     case Token.identifier:
-      String str = (String) statement[1].value; 
+      String str = (String) statement[1].value;
+      if (str.equalsIgnoreCase("measurementNumbers")) {
+        setMonitor(2);
+        break;
+      }
       if (str.equalsIgnoreCase("defaultLattice")) {
         if (statement.length < 3)
           badArgumentCount();
@@ -3036,14 +3087,14 @@
         }
         viewer.setDefaultLattice(pt);
         break;
-      } 
+      }
       if (str.equalsIgnoreCase("defaultLoadScript")) {
         checkLength3();
         if (statement[2].tok != Token.string)
           stringExpected();
         viewer.setDefaultLoadScript((String) statement[2].value);
         break;
-      } 
+      }
       if (str.equalsIgnoreCase("dipoleScale")) {
         checkLength3();
         float scale = floatParameter(2);

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/JmolConstants.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/JmolConstants.java      
2006-06-14 03:19:21 UTC (rev 5222)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/JmolConstants.java      
2006-06-14 18:03:21 UTC (rev 5223)
@@ -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.12(branch bob200603)";
+  public final static String version = "10.x.13(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/Measurement.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Measurement.java        
2006-06-14 03:19:21 UTC (rev 5222)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Measurement.java        
2006-06-14 18:03:21 UTC (rev 5223)
@@ -36,6 +36,7 @@
   String strMeasurement;
   float value;
   boolean isVisible = true;
+  boolean isHidden = false;
   short colix;
   
   AxisAngle4f aa;

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Measures.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Measures.java   2006-06-14 
03:19:21 UTC (rev 5222)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Measures.java   2006-06-14 
18:03:21 UTC (rev 5223)
@@ -40,6 +40,8 @@
   short mad = (short)-1;
   short colix; // default to none in order to contrast with background
   boolean showMeasurementNumbers = true;
+  boolean isAllConnected = false;
+  
   Font3D font3d;
   float[] rangeMinMax = {Float.MAX_VALUE, Float.MAX_VALUE};
   
@@ -55,19 +57,27 @@
       measurements[i] = null;
   }
 
-  boolean isDefined(int[] atomCountPlusIndices) {
+  int defined(int[] atomCountPlusIndices) {
     for (int i = measurementCount; --i >= 0; ) {
       if (measurements[i].sameAs(atomCountPlusIndices))
-        return true;
+        return i;
     }
-    return false;
+    return -1;
   }
 
+  void toggle(int[] atomCountPlusIndices) {
+    rangeMinMax[0] = Float.MAX_VALUE;
+    if (defined(atomCountPlusIndices) >= 0)
+      define(atomCountPlusIndices, true, false, false);
+    else
+      define(atomCountPlusIndices, false, false, false);
+  }
+
   void define(int[] atomCountPlusIndices) {
-    define(atomCountPlusIndices, false);
+    define(atomCountPlusIndices, false, false, false);
   }
   
-  void define(int[] atomCountPlusIndices, boolean isDelete) {
+  void define(int[] atomCountPlusIndices, boolean isDelete, boolean isShow, 
boolean isHide) {
     if (viewer.getMeasureAllModelsFlag()) {
       Vector measureList = new Vector();
       int nPoints = atomCountPlusIndices[0];
@@ -75,12 +85,99 @@
         Atom atom = frame.atoms[atomCountPlusIndices[i]];
         measureList.add(viewer.getAtomBits("atomno", atom.getAtomNumber()));
       }
-      define(measureList, isDelete);
+      define(measureList, isDelete, isShow, isHide);
       return;
     }    
     defineOnly(atomCountPlusIndices, isDelete);
   }
   
+  void define(Vector monitorExpressions, boolean isDelete, boolean isShow, 
boolean isHide) {
+    /*
+     * sets up measures based on an array of atom selection expressions -RMH 
3/06
+     * 
+     *(1) run through first expression, choosing model
+     *(2) for each item of next bs, iterate over next bitset, etc.
+     *(3) for each last bitset, trigger toggle(int[])
+     *
+     *simple!
+     *
+     */
+    int nPoints = monitorExpressions.size();
+    if (nPoints < 2)
+      return;
+    boolean isOneToOne = true;
+    for (int i = 0; i < nPoints && isOneToOne; i++)
+      if (viewer.cardinalityOf((BitSet) monitorExpressions.get(i)) > 1)
+        isOneToOne = false;
+    int[] atomCountPlusIndices = new int[5];
+    atomCountPlusIndices[0] = nPoints;
+    //System.out.println("measure define "+ nPoints + " " + isOneToOne);
+    nextMeasure(0, nPoints, monitorExpressions, atomCountPlusIndices,
+        isOneToOne ? -1 : 0, isDelete, isShow, isHide);
+  }
+
+  void showHide(int[] atomCountPlusIndices, boolean isHide) {
+    int i = defined(atomCountPlusIndices);
+    if (i < 0)
+      return;
+    measurements[i].isHidden = isHide;
+  }
+  
+  void showHide(boolean isHide) {
+    for (int i = measurementCount; --i >= 0; )
+      measurements[i].isHidden = isHide;
+  }
+
+  void nextMeasure(int thispt, int nPoints, Vector monitorExpressions,
+                   int[] atomCountPlusIndices, int thisModel, boolean isDelete,
+                   boolean isShow, boolean isHide) {
+    BitSet bs = (BitSet) monitorExpressions.get(thispt);
+    //System.out.println("nextMeasure" + thispt + " acpi:" + 
atomCountPlusIndices
+    //+ " " + isDelete);
+    //System.out.println("bs "+ bs);
+    int iMax = bs.size();
+    for (int i = 0; i < iMax; i++) {
+      if (bs.get(i)) {
+        if (thispt > 0 && i == atomCountPlusIndices[thispt])
+          continue;
+        int modelIndex = frame.atoms[i].getModelIndex();
+        //System.out.println("nextMeasure i "+i+" modelIndex:"+modelIndex + " 
thismodel = "+thisModel);
+        if (thisModel >= 0) {
+          if (thispt == 0) {
+            thisModel = modelIndex;
+          } else if (thisModel != modelIndex) {
+            continue;
+          }
+        }
+        atomCountPlusIndices[thispt + 1] = i;
+        if (thispt == nPoints - 1) {
+          if (isAllConnected && !isConnected(atomCountPlusIndices))
+            continue;
+          if (defined(atomCountPlusIndices) >= 0) {
+            if (isHide || isShow)
+              showHide(atomCountPlusIndices, isHide);
+            else if (isDelete)
+              defineOnly(atomCountPlusIndices, true);
+            continue;
+          }
+          if (!isDelete && !isHide && !isShow)
+            defineOnly(atomCountPlusIndices, false);
+          continue;
+        }
+        nextMeasure(thispt + 1, nPoints, monitorExpressions,
+            atomCountPlusIndices, thisModel, isDelete, isShow, isHide);
+      }
+    }
+  }
+    
+  boolean isConnected(int[] atomCountPlusIndices) {
+    Atom[] atoms = frame.atoms;
+    for (int i = atomCountPlusIndices[0]; i > 1; --i)
+      if 
(!atoms[atomCountPlusIndices[i]].isBonded(atoms[atomCountPlusIndices[i-1]]))
+        return false;
+    return true;
+  }
+  
   void defineOnly(int[] atomCountPlusIndices, boolean isDelete) {
     float value = frame.getMeasurement(atomCountPlusIndices);
     //System.out.println("measures define value,maxmin "+value+" 
"+rangeMinMax[0]+" "+rangeMinMax[1] + " " + isDelete);
@@ -90,7 +187,7 @@
         return;
     }
 
-    if (isDefined(atomCountPlusIndices)) {
+    if (defined(atomCountPlusIndices) >= 0) {
       if(isDelete)
         delete(atomCountPlusIndices);
       return;
@@ -144,73 +241,9 @@
     this.rangeMinMax[1] = rangeMinMax[1];
   }
   
-  void toggle(int[] atomCountPlusIndices) {
-    rangeMinMax[0] = Float.MAX_VALUE;
-    if (isDefined(atomCountPlusIndices))
-      define(atomCountPlusIndices, true);
-    else
-      define(atomCountPlusIndices, false);
+  void setConnected(boolean isAllConnected) {
+    this.isAllConnected = isAllConnected;  
   }
-
-  void define(Vector monitorExpressions, boolean isDelete) {
-  /*
-   * sets up measures based on an array of atom selection expressions -RMH 3/06
-   * 
-   *(1) run through first expression, choosing model
-   *(2) for each item of next bs, iterate over next bitset, etc.
-   *(3) for each last bitset, trigger toggle(int[])
-   *
-   *simple!
-   *
-   */
-    int nPoints = monitorExpressions.size();
-    if (nPoints < 2)
-      return;
-    boolean isOneToOne = true;
-    for (int i = 0; i < nPoints && isOneToOne; i++)
-      if (viewer.cardinalityOf((BitSet) monitorExpressions.get(i)) > 1)
-        isOneToOne = false;
-    int[] atomCountPlusIndices = new int[5];
-    atomCountPlusIndices[0] = nPoints;
-    //System.out.println("measure define "+ nPoints + " " + isOneToOne);
-    nextMeasure(0, nPoints, monitorExpressions, atomCountPlusIndices, 
isOneToOne ? -1 : 0, isDelete);
-  }
-
-  void nextMeasure(int thispt, int nPoints, Vector monitorExpressions,
-                   int[] atomCountPlusIndices, int thisModel, boolean 
isDelete) {
-    BitSet bs = (BitSet) monitorExpressions.get(thispt);
-    //System.out.println("nextMeasure" + thispt + " acpi:" + 
atomCountPlusIndices
-        //+ " " + isDelete);
-    //System.out.println("bs "+ bs);
-    int iMax = bs.size();
-    for (int i = 0; i < iMax; i++) {
-      if (bs.get(i)) {
-        if (thispt > 0 && i == atomCountPlusIndices[thispt])
-          continue;
-        int modelIndex = frame.atoms[i].getModelIndex();
-        //System.out.println("nextMeasure i "+i+" modelIndex:"+modelIndex + " 
thismodel = "+thisModel);
-        if (thisModel >= 0) {
-          if (thispt == 0) {
-            thisModel = modelIndex;
-          } else if (thisModel != modelIndex) {
-            continue;
-          }
-        }
-        atomCountPlusIndices[thispt + 1] = i;
-        if (thispt == nPoints - 1) {
-          if (isDefined(atomCountPlusIndices)) {
-            if (isDelete)
-              defineOnly(atomCountPlusIndices, true);
-          } else if (!isDelete) {
-            defineOnly(atomCountPlusIndices, false);
-          }
-        } else {
-          nextMeasure(thispt + 1, nPoints, monitorExpressions,
-              atomCountPlusIndices, thisModel, isDelete);
-        }
-      }
-    }
-  }
   
   void pending(int[] countPlusIndices) {
     pendingMeasurement.setCountPlusIndices(countPlusIndices);
@@ -244,15 +277,27 @@
     else if ("toggle".equals(propertyName))
     { toggle((int[])value); }
     else if ("deleteVector".equals(propertyName))
-    { define((Vector)value, true); }
+    { define((Vector)value, true, false, false); }
     else if ("defineVector".equals(propertyName))
-    { define((Vector)value, false); }
+    { define((Vector)value, false, false, false); }
+    else if ("showVector".equals(propertyName))
+    { define((Vector)value, false, true, false); }
+    else if ("hideVector".equals(propertyName))
+    { define((Vector)value, false, false, true); }
     else if ("setRange".equals(propertyName))
     { setRange((float[])value); }
+    else if ("setConnected".equals(propertyName))
+    { setConnected(((Boolean)value).booleanValue()); }
     else if ("pending".equals(propertyName))
       { pending((int[])value); }
     else if ("clear".equals(propertyName))
       { clear(); }
+    else if ("hideAll".equals(propertyName))
+    { showHide(((Boolean)value).booleanValue()); }
+    else if ("show".equals(propertyName))
+    { showHide((int[])value, false); }
+    else if ("hide".equals(propertyName))
+    { showHide((int[])value, true); }
     else if ("showMeasurementNumbers".equals(propertyName))
       { showMeasurementNumbers = ((Boolean)value).booleanValue(); }
     else if ("reformatDistances".equals(propertyName))
@@ -341,7 +386,7 @@
     out:
     for (int i = measurementCount; --i >= 0; ) {
       measurements[i].isVisible = false;
-      if(mad == 0)
+      if(mad == 0 || measurements[i].isHidden)
         continue;
       for (int iAtom = measurements[i].count; iAtom > 0; iAtom--) { 
         Atom atom = frame.getAtomAt(measurements[i].countPlusIndices[iAtom]);

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/MeasuresRenderer.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/MeasuresRenderer.java   
2006-06-14 03:19:21 UTC (rev 5222)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/MeasuresRenderer.java   
2006-06-14 18:03:21 UTC (rev 5223)
@@ -38,6 +38,8 @@
   Measurement measurement;
 
   void render() {
+    if (!viewer.getShowMeasurements())
+      return;
 
     Measures measures = (Measures) shape;
 

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java     2006-06-14 
03:19:21 UTC (rev 5222)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java     2006-06-14 
18:03:21 UTC (rev 5223)
@@ -1705,7 +1705,6 @@
   public String getMeasurementStringValue(int i) {
     String str = ""
         + getShapeProperty(JmolConstants.SHAPE_MEASURES, "stringValue", i);
-    System.out.println("getMeasurementStringValue" + i + " " + str);
     return str;
   }
 
@@ -1720,7 +1719,6 @@
   public int[] getMeasurementCountPlusIndices(int i) {
     int[] List = (int[]) getShapeProperty(JmolConstants.SHAPE_MEASURES,
         "countPlusIndices", i);
-    System.out.println(List);
     return List;
   }
 
@@ -1729,17 +1727,15 @@
         atomCountPlusIndices);
   }
 
-  void defineMeasurement(int[] atomCountPlusIndices) {
-    setShapeProperty(JmolConstants.SHAPE_MEASURES, "define",
-        atomCountPlusIndices);
-    setStatusNewDefaultModeMeasurement("scripted", 1,"?");
-  }
-
   void defineMeasurement(Vector monitorExpressions, float[] rangeMinMax,
-                         boolean isDelete) {
+                         boolean isDelete, boolean isAllConnected,
+                         boolean isShowHide, boolean isHidden) {
+    setShapeProperty(JmolConstants.SHAPE_MEASURES, "setConnected", new Boolean(
+        isAllConnected));
     setShapeProperty(JmolConstants.SHAPE_MEASURES, "setRange", rangeMinMax);
     setShapeProperty(JmolConstants.SHAPE_MEASURES, isDelete ? "deleteVector"
-        : "defineVector", monitorExpressions);
+        : isShowHide ? (isHidden ? "hideVector" : "showVector")
+            : "defineVector", monitorExpressions);
     setStatusNewDefaultModeMeasurement("scripted", 1, "?");
   }
 
@@ -1752,6 +1748,19 @@
         atomCountPlusIndices);
   }
 
+  public void showMeasurement(int[] atomCountPlusIndices, boolean isON) {
+    setShapeProperty(JmolConstants.SHAPE_MEASURES, isON ? "show" : "hide",
+        atomCountPlusIndices);
+    refresh(0, "Viewer:clearMeasurements()");
+  }
+
+  public void hideMeasurements(boolean isOFF) {
+    setShapeProperty(JmolConstants.SHAPE_MEASURES, "hideAll", new 
Boolean(isOFF));
+    refresh(0, "setShowMeasurements()");
+  }
+
+
+
   void toggleMeasurement(int[] atomCountPlusIndices) {
     setShapeProperty(JmolConstants.SHAPE_MEASURES, "toggle",
         atomCountPlusIndices);


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