Revision: 5141
Author:   hansonr
Date:     2006-05-18 18:36:34 -0700 (Thu, 18 May 2006)
ViewCVS:  http://svn.sourceforge.net/jmol/?rev=5141&view=rev

Log Message:
-----------
bob200603 introduces fractional coordinates.

xyz coordinates in the form {x,y,z} now accept fractions:

{1/2, 0, 1/2}

and apply to the unit cell system, when appropriate.
A 1 in the denominator is optional, so 

{0.5/, 0, 0.5/}

also refers to the crystallographic fractional coordinate system. 

Note that only one "/" is necessary:

{0.5/, 0, 0.5}

is still fractional coordinates. 

So, we have:

center {1/2, 0, 1/2}
#center on the ac face

draw axis1 150 {0/,0,0} {1/,1,1}
#draw an axis through {0,0,0} to {1,1,1}, centered between those 
points and 150% of their distance long. 

draw plane1 {0/,0,0} {1/,0,0}, {1/,1,1}
#draw a plane through these points

draw plane1 {0,0,0/} {1,0,0/}, {1,1,0/}, {0,1,0/}
#draw a plane through these points

etc. 

Modified Paths:
--------------
    branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java
    branches/bob200603/Jmol/src/org/jmol/viewer/Frame.java
    branches/bob200603/Jmol/src/org/jmol/viewer/ModelManager.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-05-18 
19:49:28 UTC (rev 5140)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Eval.java       2006-05-19 
01:36:34 UTC (rev 5141)
@@ -1380,47 +1380,54 @@
     if (statement[1].tok == Token.leftbrace) {
       //center { x y z } 
       Point3f pt = getCoordinate(1);
+      if (coordinatesAreFractional)
+        viewer.convertFractionalCoordinates(pt);
       viewer.setNewRotationCenter(pt);
       return;
     }
 
     viewer.setCenterBitSet(expression(statement, 1), true);
   }
-
+  
+  boolean coordinatesAreFractional;
   Point3f getCoordinate(int i) throws ScriptException {
-    Token token = statement[i++];
+    coordinatesAreFractional = false;
+    // syntax:  {1/2, 1/2, 1/3} or {0.5/, 0.5, 0.5}
+    // ONE fractional sign anywhere is enough to make ALL fractional;
+    // denominator of 1 can be implied;
+    // commas not necessary if denominator is present or not a fraction
+    if (statement[i++].tok != Token.leftbrace)
+      coordinateExpected();
     Point3f pt = new Point3f();
-    while (true) {
-    if (token.tok != Token.leftbrace)
-      break;
-    
-    token = statement[i++];
-    if (token.tok != Token.integer && token.tok != Token.decimal)
-      break;
-    pt.x = floatValue(token);
+    for (int j = i; j + 1 < statement.length; j++) {
+        switch (statement[j].tok) {
+        case Token.slash:
+          coordinatesAreFractional = true;
+        case Token.rightbrace:          
+          break;
+        }
+    }
+    pt.x = coordinateValue(i);
+    pt.y = coordinateValue(++pcLastExpressionInstruction);
+    pt.z = coordinateValue(++pcLastExpressionInstruction);
+    if (statement[++pcLastExpressionInstruction].tok != Token.rightbrace)
+      coordinateExpected();
+    return pt;
+  }
 
-    token = statement[i++];
-    if (token.tok == Token.opOr)
-      token = statement[i++];
-    if (token.tok != Token.integer && token.tok != Token.decimal)
-      break;
-    pt.y = floatValue(token);
-
-    token = statement[i++];
-    if (token.tok == Token.opOr)
-      token = statement[i++];
-    if (token.tok != Token.integer && token.tok != Token.decimal)
-      break;
-    pt.z = floatValue(token);
-    
-    token = statement[i];
-    if (token.tok != Token.rightbrace)
-      break;
-    pcLastExpressionInstruction = i;
-    return pt;
+  float coordinateValue(int i) throws ScriptException {
+    // includes support for fractional coordinates
+    float val = floatParameter(i++);
+    Token token = statement[i];
+    if (token.tok == Token.slash) {
+      token = statement[++i];
+      if (token.tok == Token.integer || token.tok == Token.decimal) {
+        val /= floatParameter(i++);
+        token = statement[i];
+      }
     }
-    coordinateExpected();
-    return null; //can't get here
+    pcLastExpressionInstruction = (token.tok == Token.opOr ? i : i - 1);
+    return val;
   }
 
   float floatValue(Token token) {
@@ -1907,7 +1914,7 @@
         break;
       case Token.leftbrace:
         // {X, Y, Z}
-        Point3f pt = getCoordinate(i);
+        Point3f pt = getCoordinate(i); //fractional spin?
         i = pcLastExpressionInstruction;
         if (isAxisAngle) {
             if (axesOrientationRasmol)
@@ -2420,7 +2427,9 @@
         break;
       case Token.leftbrace:
         // {X, Y, Z}
-        Point3f pt = getCoordinate(i);
+        Point3f pt = getCoordinate(i); //fractional dipole point?
+        if (coordinatesAreFractional)
+          viewer.convertFractionalCoordinates(pt);
         i = pcLastExpressionInstruction;
         propertyName = (iHaveCoord ? "endCoord" : "startCoord");
         propertyValue = pt;
@@ -3482,6 +3491,8 @@
     if (statement[2].tok == Token.leftbrace) {
       // {X, Y, Z}
       pt = getCoordinate(2);
+      if (coordinatesAreFractional)
+        viewer.convertFractionalCoordinates(pt);
       i = pcLastExpressionInstruction + 1;
     } else {
       pt = new Point3f(floatParameter(i++), floatParameter(i++),
@@ -3671,6 +3682,8 @@
       case Token.leftbrace:
         // {X, Y, Z}
         Point3f pt = getCoordinate(i);
+        if (coordinatesAreFractional)
+          viewer.convertFractionalCoordinates(pt);
         i = pcLastExpressionInstruction;
         propertyName = "coord";
         propertyValue = pt;
@@ -3856,6 +3869,8 @@
       pt.z = floatParameter(4);
     } else if (statement[2].tok == Token.leftbrace) {
       pt = getCoordinate(2);
+      if (coordinatesAreFractional)
+        viewer.convertFractionalCoordinates(pt);
     }
     viewer.setCenter(relativeTo, pt);
   }

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Frame.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Frame.java      2006-05-18 
19:49:28 UTC (rev 5140)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Frame.java      2006-05-19 
01:36:34 UTC (rev 5141)
@@ -2671,4 +2671,14 @@
       //System.out.println(pt);   
     }
   }
+  
+  void convertFractionalCoordinates(int modelIndex, Point3f pt) {
+    if (modelIndex < 0)
+      modelIndex = 0;
+    if (modelIndex >= cellInfo.length || cellInfo[modelIndex] == null) return;
+System.out.print(pt+"--->");
+    cellInfo[modelIndex].transform(pt);
+    System.out.println(pt);
+  }
+
 }

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/ModelManager.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/ModelManager.java       
2006-05-18 19:49:28 UTC (rev 5140)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/ModelManager.java       
2006-05-19 01:36:34 UTC (rev 5141)
@@ -1425,4 +1425,10 @@
     return false;
   }
 
+  void convertFractionalCoordinates(int modelIndex, Point3f pt) {
+    frame.convertFractionalCoordinates(modelIndex, pt);
+    return;
+  }
+  
+
 }

Modified: branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java
===================================================================
--- branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java     2006-05-18 
19:49:28 UTC (rev 5140)
+++ branches/bob200603/Jmol/src/org/jmol/viewer/Viewer.java     2006-05-19 
01:36:34 UTC (rev 5141)
@@ -1392,7 +1392,11 @@
   BitSet findAtomsInRectangle(Rectangle rectRubberBand) {
     return modelManager.findAtomsInRectangle(rectRubberBand);
   }
-
+  
+  void convertFractionalCoordinates(Point3f pt) {
+    modelManager.convertFractionalCoordinates(getDisplayModelIndex(), pt);
+  }
+  
   Point3f getCenter() {
     return modelManager.getRotationCenter();
   }


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