Revision: 5146
Author:   hansonr
Date:     2006-05-19 14:09:40 -0700 (Fri, 19 May 2006)
ViewCVS:  http://svn.sourceforge.net/jmol/?rev=5146&view=rev

Log Message:
-----------
bob200603 isosurface

 -adds fileindex option to isosurface command for reading files with multiple 
orbitals.
 -adds empty string "" default filename is current data file. Could be "that or 
previously read isosurface file?"

Modified Paths:
--------------
    branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Isosurface.java
Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java       2006-05-19 
14:28:45 UTC (rev 5145)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java       2006-05-19 
21:09:40 UTC (rev 5146)
@@ -3877,8 +3877,9 @@
   }
 
   void isosurface() throws ScriptException {
+    int fileIndexPt = 0;
     viewer.loadShape(JmolConstants.SHAPE_ISOSURFACE);
-    viewer.setShapeProperty(JmolConstants.SHAPE_ISOSURFACE, "meshID", null);
+    viewer.setShapeProperty(JmolConstants.SHAPE_ISOSURFACE, "init", null);
     boolean colorSeen = false;
     int colorRangeStage = 0;
     for (int i = 1; i < statementLength; ++i) {
@@ -3887,13 +3888,19 @@
       Token token = statement[i];
       switch (token.tok) {
       case Token.identifier:
+        if (((String)token.value).equalsIgnoreCase("fileIndex")) {
+          fileIndexPt = i + 1;
+          break;
+        }
         propertyValue = token.value;
-        // fall into
       case Token.all:
         propertyName = "meshID";
         break;
       case Token.string:
         String filename = (String)token.value;
+        if (filename.length() == 0)
+          filename = viewer.getFullPathName();
+        System.out.println("reading isosurface data from " + filename);
         Object t =
           viewer.getUnzippedBufferedReaderOrErrorMessageFromName(filename);
         if (t instanceof String)
@@ -3911,6 +3918,13 @@
         }
         // fall into
       case Token.integer:
+        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 ? "rangeMin" : "rangeMax";

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Isosurface.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Isosurface.java 2006-05-19 
14:28:45 UTC (rev 5145)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Isosurface.java 2006-05-19 
21:09:40 UTC (rev 5146)
@@ -75,6 +75,7 @@
   float[][][] voxelData;
 
   int edgePointCount = 0;
+  int fileIndex = 0;  //one-based
   Point3f[] edgePoints;
 
   float cutoff = 0.02f;
@@ -82,14 +83,22 @@
   float minRange, maxRange;
 
   void setProperty(String propertyName, Object value, BitSet bs) {
+    if ("init" == propertyName) {
+      fileIndex = 1;
+      super.setProperty("meshID", null, null);
+      return;  
+    }
+    if ("fileIndex" == propertyName) {
+      fileIndex= ((Integer)value).intValue();
+      if (fileIndex < 1) fileIndex = 1;
+      return;  
+    }
     if ("bufferedReader" == propertyName) {
       BufferedReader br = (BufferedReader)value;
       if (currentMesh == null)
         allocMesh(null);
       currentMesh.clear("isosurface");
-      readVolumetricHeader(br);
-      calcVolumetricMatrix();
-      readVolumetricData(br);
+      readData(br);
       calcVoxelVertexVectors();
       constructTessellatedSurface();
       currentMesh.colix = getDefaultColix();
@@ -117,11 +126,9 @@
       return;
     }
     if ("colorReader" == propertyName) {
+      System.out.println("colorReader seen!");
       BufferedReader br = (BufferedReader)value;
-      System.out.println("colorReader seen!");
-      readVolumetricHeader(br);
-      calcVolumetricMatrix();
-      readVolumetricData(br);
+      readData(br);
       if (! rangeDefined) {
         minRange = getMinMappedValue();
         maxRange = getMaxMappedValue();
@@ -134,7 +141,17 @@
     }
     super.setProperty(propertyName, value, bs);
   }
-  
+
+  void readData(BufferedReader br) {
+    int nSurfaces = readVolumetricHeader(br);
+    if (nSurfaces < fileIndex) {
+      System.out.println("not enough surfaces in file -- resetting fileIndex 
to " + nSurfaces);
+      fileIndex = nSurfaces;
+    }
+    calcVolumetricMatrix();
+    readVolumetricData(br);
+  }
+
   void calcVolumetricMatrix() {
     for (int i = 3; --i >= 0; )
       volumetricMatrix.setColumn(i, volumetricVectors[i]);
@@ -189,13 +206,13 @@
   // file reading stuff
   ////////////////////////////////////////////////////////////////
 
-  void readVolumetricHeader(BufferedReader br) {
+  int readVolumetricHeader(BufferedReader br) {
     try {
       readTitleLines(br);
       readAtomCountAndOrigin(br);
       readVoxelVectors(br);
       readAtoms(br);
-      readExtraLine(br);
+      return readExtraLine(br);
     } catch (Exception e) {
       e.printStackTrace();
       throw new NullPointerException();
@@ -265,19 +282,19 @@
     }
   }
 
-  void readExtraLine(BufferedReader br) throws Exception {
-    if (negativeAtomCount)
-      br.readLine();
+  int readExtraLine(BufferedReader br) throws Exception {
+      return (negativeAtomCount ? parseInt(br.readLine()) : 1);
   }
 
   void readVoxelData(BufferedReader br) throws Exception {
-    System.out.println("entering readVoxelData");
+    System.out.println("entering readVoxelData for fileIndex = " + fileIndex);
     String line = "";
     ichNextParse = 0;
     int voxelCountX = voxelCounts[0];
     int voxelCountY = voxelCounts[1];
     int voxelCountZ = voxelCounts[2];
     voxelData = new float[voxelCountX][][];
+    skipData(br, (fileIndex - 1) * voxelCountX * voxelCountY * voxelCountZ);
     for (int x = 0; x < voxelCountX; ++x) {
       float[][] plane = new float[voxelCountY][];
       voxelData[x] = plane;
@@ -302,6 +319,35 @@
                        " x " + voxelCountZ + " voxels");
   }
 
+  void skipData(BufferedReader br, int n) throws Exception {
+    if (n == 0)
+      return;
+    System.out.println("skipping " + n + " datapoints");
+    String line = "";
+    int i=0;
+    while (i < n) {
+        line = br.readLine();
+        int c = countData(line);
+        System.out.println(c + " " + i);
+        i += c;
+    }
+  }
+  
+  int countData(String str) {
+    int ich = 0;
+    int count = 0;
+    int ichMax = str.length();
+    char ch;
+    while (ich < ichMax) {
+      while (ich < ichMax && ((ch = str.charAt(ich)) == ' ' || ch == '\t'))
+        ++ich;
+      if (ich < ichMax)
+        ++count;
+      while (ich < ichMax && ((ch = str.charAt(ich)) != ' ' && ch != '\t'))
+        ++ich;
+    }
+    return count;
+  }
   ////////////////////////////////////////////////////////////////
   // marching cube stuff
   ////////////////////////////////////////////////////////////////


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



-------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Jmol-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jmol-commits

Reply via email to