Revision: 20963
          http://sourceforge.net/p/jmol/code/20963
Author:   hansonr
Date:     2016-02-18 04:29:30 +0000 (Thu, 18 Feb 2016)
Log Message:
-----------
Jmol.___JmolVersion="14.4.3_2016.02.17"

bug fix: slab/depth SET do not behave properly
bug fix: select VISIBLE is not properly set based on slab/depth SET 

bug fix: _GEOM_BOND reading in CIF files nonfunctional.
 -- broken in 13.3.4_dev_2013.08.21
 -- result is that between 8/21/2013 and 2/15/2016 the CIF reader
    would not recognize _GEOM_BOND and so also not create whole molecules 
    as it was designed to do when those are present.
 -- no impact on states created within this version range 
 -- no impact on mmCIF reader
 -- only impact is upon Materials Studio-generated files such as
    http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt
    (supplemental mat. for 
http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h)
    See Jmol list discussion: 
https://sourceforge.net/p/jmol/mailman/message/31308577/

Modified Paths:
--------------
    branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java
    branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java
    branches/v14_4/Jmol/src/org/jmol/export/__RayTracerExporter.java
    branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java
    branches/v14_4/Jmol/src/org/jmol/render/RepaintManager.java
    branches/v14_4/Jmol/src/org/jmol/render/SticksRenderer.java
    branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java
    branches/v14_4/Jmol/src/org/jmol/scriptext/IsoExt.java
    branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties
    branches/v14_4/Jmol/src/org/jmol/viewer/ShapeManager.java
    branches/v14_4/Jmol/src/org/jmol/viewer/StateCreator.java
    branches/v14_4/Jmol/src/org/jmol/viewer/TransformManager.java
    branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java
    trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java
    trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java
    trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java
    trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java
    trunk/Jmol/src/org/jmol/export/__RayTracerExporter.java
    trunk/Jmol/src/org/jmol/modelset/AtomCollection.java
    trunk/Jmol/src/org/jmol/render/RepaintManager.java
    trunk/Jmol/src/org/jmol/render/SticksRenderer.java
    trunk/Jmol/src/org/jmol/script/ScriptEval.java
    trunk/Jmol/src/org/jmol/scriptext/IsoExt.java
    trunk/Jmol/src/org/jmol/viewer/Jmol.properties
    trunk/Jmol/src/org/jmol/viewer/ShapeManager.java
    trunk/Jmol/src/org/jmol/viewer/StateCreator.java
    trunk/Jmol/src/org/jmol/viewer/TransformManager.java
    trunk/Jmol/src/org/jmol/viewer/Viewer.java

Modified: branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 
2016-02-15 20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 
2016-02-18 04:29:30 UTC (rev 20963)
@@ -51,8 +51,8 @@
  * A true line-free CIF file reader for CIF files.
  * 
  * Subclasses of CIF -- mmCIF/PDBx (pre-initialized) and msCIF (initialized
- * here).
- * 
+ * here)
+ *
  * Note that a file can be a PDB file without being
  * 
  * Added nonstandard mCIF (magnetic_ tags) 5/2/2014 note that PRELIM keys can 
be
@@ -84,7 +84,6 @@
 
   GenericCifDataParser parser;
 
-  private boolean isMolecular;
   private boolean filterAssembly;
   private boolean allowRotations = true;
   private boolean readIdeal = true;
@@ -181,6 +180,8 @@
   private boolean readAllData() throws Exception {
     if (key.startsWith("data_")) {
       isLigand = false;
+      if (asc.atomSetCount == 0)
+        iHaveDesiredModel = false;
       if (iHaveDesiredModel)
         return false;
       if (desiredModelNumber != Integer.MIN_VALUE)
@@ -222,7 +223,7 @@
      * tokenizer.getTokenPeeked(); continue; }
      */
     if (key.indexOf("_") != 0) {
-        Logger.warn("CIF ERROR ? should be an underscore: " + key);
+      Logger.warn("CIF ERROR ? should be an underscore: " + key);
       parser.getTokenPeeked();
     } else if (!getData()) {
       return true;
@@ -243,22 +244,26 @@
         processCellParameter();
       } else if (key.startsWith("_atom_sites_fract_tran")) {
         processUnitCellTransformMatrix();
-      } else if (key.equals("_audit_block_code")) {
-        auditBlockCode = parser.fullTrim(data).toUpperCase();
-        appendLoadNote(auditBlockCode);
-        if (htAudit != null && auditBlockCode.contains("_MOD_")) {
-          String key = PT.rep(auditBlockCode, "_MOD_", "_REFRNCE_");
-          if (asc.setSymmetry((SymmetryInterface) htAudit.get(key)) != null) {
-            unitCellParams = asc.getSymmetry().getUnitCellParams();
-            iHaveUnitCell = true;
+      } else if (key.startsWith("_audit")) {
+        if (key.equals("_audit_block_code")) {
+          auditBlockCode = parser.fullTrim(data).toUpperCase();
+          appendLoadNote(auditBlockCode);
+          if (htAudit != null && auditBlockCode.contains("_MOD_")) {
+            String key = PT.rep(auditBlockCode, "_MOD_", "_REFRNCE_");
+            if (asc.setSymmetry((SymmetryInterface) htAudit.get(key)) != null) 
{
+              unitCellParams = asc.getSymmetry().getUnitCellParams();
+              iHaveUnitCell = true;
+            }
+          } else if (htAudit != null) {
+            if (symops != null)
+              for (int i = 0; i < symops.size(); i++)
+                setSymmetryOperator(symops.get(i));
           }
-        } else if (htAudit != null) {
-          if (symops != null)
-            for (int i = 0; i < symops.size(); i++)
-              setSymmetryOperator(symops.get(i));
+          if (lastSpaceGroupName != null)
+            setSpaceGroupName(lastSpaceGroupName);
+        } else if (key.equals("_audit_creation_date")) {
+            symmetry = null;
         }
-        if (lastSpaceGroupName != null)
-          setSpaceGroupName(lastSpaceGroupName);
       } else if (key.equals(singleAtomID)) {
         readSingleAtom();
       } else if (key.startsWith("_symmetry_space_group_name_h-m")
@@ -847,7 +852,7 @@
    */
   private void processAtomTypeLoopBlock() throws Exception {
     parseLoopParameters(atomTypeFields);
-    if (!checkAllFieldsPresent(atomTypeFields, false)) {
+    if (!checkAllFieldsPresent(atomTypeFields, -1, false)) {
       parser.skipLoop(false);
       return;
     }
@@ -1519,8 +1524,12 @@
    * @throws Exception
    */
   private void processGeomBondLoopBlock() throws Exception {
+    // broken in 13.3.4_dev_2013.08.20c
+    // fixed in 14.4.3_2016.02.16
+    boolean bondLoopBug = (stateScriptVersionInt >= 130304 && 
stateScriptVersionInt < 140403
+        || stateScriptVersionInt >= 150000 && stateScriptVersionInt < 150403);
     parseLoopParameters(geomBondFields);
-    if (!checkAllFieldsPresent(geomBondFields, true)) {
+    if (bondLoopBug || !checkAllFieldsPresent(geomBondFields, 2, true)) {
       parser.skipLoop(false);
       return;
     }
@@ -1556,6 +1565,12 @@
         dx = 0.015f;
       }
       int order = getBondOrder(getField(CCDC_GEOM_BOND_TYPE));
+      // This field is from Materials Studio. See supplemental material for
+      // http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h
+      // http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt
+      // Jmol list discussion: 
https://sourceforge.net/p/jmol/mailman/message/31308577/
+      // this 5-model file can be read using one model at a time: load 
"c2cc34714h.txt" 3
+      // but it is far from perfect, and still the best way is load 
"c2cc34714h.txt" 3 packed
       bondCount++;
       bondTypes.addLast(new Object[] { name1, name2, Float.valueOf(distance),
           Float.valueOf(dx), Integer.valueOf(order) });
@@ -1594,12 +1609,12 @@
    * (g) set all coordinates as Cartesians (h) remove all unit cell information
    */
   private void setBondingAndMolecules() {
-    Logger.info("CIF creating molecule "
-        + (bondTypes.size() > 0 ? " using GEOM_BOND records" : ""));
     atoms = asc.atoms;
     firstAtom = asc.getLastAtomSetAtomIndex();
     int nat = asc.getLastAtomSetAtomCount();
     ac = firstAtom + nat;
+    Logger.info("CIF creating molecule for " + nat + " atoms "
+        + (bondTypes.size() > 0 ? " using GEOM_BOND records" : ""));
 
     // get list of sites based on atom names
 
@@ -1836,8 +1851,8 @@
     return doCheckUnitCell;
   }
 
-  protected boolean checkAllFieldsPresent(String[] keys, boolean critical) {
-    for (int i = keys.length; --i >= 0;)
+  protected boolean checkAllFieldsPresent(String[] keys, int lastKey, boolean 
critical) {
+    for (int i = (lastKey < 0 ? keys.length : lastKey); --i >= 0;)
       if (key2col[i] == NONE) {
         if (critical)
           Logger.warn("CIF reader missing property: " + keys[i]);

Modified: branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java       
2016-02-15 20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java       
2016-02-18 04:29:30 UTC (rev 20963)
@@ -688,7 +688,7 @@
    */
   private boolean processStructConfLoopBlock() throws Exception {
     parseLoopParametersFor(FAMILY_STRUCTCONF, structConfFields);
-    if (!checkAllFieldsPresent(structConfFields, true)) {
+    if (!checkAllFieldsPresent(structConfFields, -1, true)) {
       parser.skipLoop(true);
       return false;
     }
@@ -772,7 +772,7 @@
    */
   private boolean processStructSheetRangeLoopBlock() throws Exception {
     parseLoopParametersFor(FAMILY_SHEET, structSheetRangeFields);
-    if (!checkAllFieldsPresent(structSheetRangeFields, true)) {
+    if (!checkAllFieldsPresent(structSheetRangeFields, -1, true)) {
       parser.skipLoop(true);
       return false;
     }

Modified: branches/v14_4/Jmol/src/org/jmol/export/__RayTracerExporter.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/export/__RayTracerExporter.java    
2016-02-15 20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/export/__RayTracerExporter.java    
2016-02-18 04:29:30 UTC (rev 20963)
@@ -61,7 +61,7 @@
     if (super.initOutput(vwr, privateKey, g3d, params)) {
       vwr.tm.perspectiveDepth = false;
       if (wasPerspective)
-        vwr.shm.finalizeAtoms(false, false);
+        vwr.shm.finalizeAtoms(null, false);
       return true;
     }
     return false; 

Modified: branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java       
2016-02-15 20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java       
2016-02-18 04:29:30 UTC (rev 20963)
@@ -2466,14 +2466,16 @@
   public BS getVisibleSet(boolean forceNew) {
     if (forceNew) {
       vwr.setModelVisibility();
-      vwr.shm.finalizeAtoms(false, true);
+      vwr.shm.finalizeAtoms(null, true);
+    } else if (haveBSVisible) {
+      return bsVisible;
     }
-    else if (haveBSVisible)
-      return bsVisible;
     bsVisible.clearAll();
     for (int i = ac; --i >= 0;)
       if (at[i].checkVisible())
         bsVisible.set(i);
+    if (vwr.shm.bsSlabbedInternal != null)
+      bsVisible.andNot(vwr.shm.bsSlabbedInternal);
     haveBSVisible = true;
     return bsVisible;
   }

Modified: branches/v14_4/Jmol/src/org/jmol/render/RepaintManager.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/render/RepaintManager.java 2016-02-15 
20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/render/RepaintManager.java 2016-02-18 
04:29:30 UTC (rev 20963)
@@ -243,7 +243,7 @@
   public String renderExport(GData gdata, ModelSet modelSet,
                              Map<String, Object> params) {
     boolean isOK;
-    shapeManager.finalizeAtoms(false, true);
+    shapeManager.finalizeAtoms(null, true);
     JmolRendererInterface exporter3D = vwr.initializeExporter(params);
     isOK = (exporter3D != null);
     if (!isOK) {

Modified: branches/v14_4/Jmol/src/org/jmol/render/SticksRenderer.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/render/SticksRenderer.java 2016-02-15 
20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/render/SticksRenderer.java 2016-02-18 
04:29:30 UTC (rev 20963)
@@ -169,9 +169,9 @@
       return false;
 
     if (slabbing) {
-      if (vwr.gdata.isClippedZ(a.sZ) && vwr.gdata.isClippedZ(b.sZ)
-          || slabByAtom
-          && (vwr.gdata.isClippedZ(a.sZ) || vwr.gdata.isClippedZ(b.sZ)))
+      boolean ba = vwr.gdata.isClippedZ(a.sZ);
+      if (ba && vwr.gdata.isClippedZ(b.sZ) || slabByAtom
+          && (ba || vwr.gdata.isClippedZ(b.sZ)))
         return false;
     }
     zA = a.sZ;
@@ -182,14 +182,12 @@
     colixB = atomB0.colixAtom;
     if (((colix = bond.colix) & C.OPAQUE_MASK) == C.USE_PALETTE) {
       colix = (short) (colix & ~C.OPAQUE_MASK);
-      colixA = C
-          .getColixInherited(
-              (short) (colix | vwr.cm.getColixAtomPalette(atomA0, PAL.CPK.id)),
-              colixA);
-      colixB = C
-          .getColixInherited(
-              (short) (colix | vwr.cm.getColixAtomPalette(atomB0, PAL.CPK.id)),
-              colixB);
+      colixA = C.getColixInherited(
+          (short) (colix | vwr.cm.getColixAtomPalette(atomA0, PAL.CPK.id)),
+          colixA);
+      colixB = C.getColixInherited(
+          (short) (colix | vwr.cm.getColixAtomPalette(atomB0, PAL.CPK.id)),
+          colixB);
     } else {
       colixA = C.getColixInherited(colix, colixA);
       colixB = C.getColixInherited(colix, colixB);
@@ -258,7 +256,6 @@
       }
     }
 
-    
     // set the diameter
 
     xA = a.sX;

Modified: branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java     2016-02-15 
20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java     2016-02-18 
04:29:30 UTC (rev 20963)
@@ -7508,10 +7508,8 @@
         return;
       case T.set:
         checkLength(2);
-        if (chk)
-          return;
-        vwr.tm.setSlabDepthInternal(isDepth);
-        setBooleanProperty("slabEnabled", true);
+        if (!chk)
+          vwr.tm.setSlabDepthInternal(isDepth);
         return;
       case T.minus:
         str = paramAsStr(2);

Modified: branches/v14_4/Jmol/src/org/jmol/scriptext/IsoExt.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/scriptext/IsoExt.java      2016-02-15 
20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/scriptext/IsoExt.java      2016-02-18 
04:29:30 UTC (rev 20963)
@@ -1132,7 +1132,7 @@
     boolean isPmesh = (iShape == JC.SHAPE_PMESH);
     boolean isPlot3d = (iShape == JC.SHAPE_PLOT3D);
     boolean isLcaoCartoon = (iShape == JC.SHAPE_LCAOCARTOON);
-    boolean isSilent = (isLcaoCartoon || tokAt(1) == T.delete);
+    boolean isSilent = (isLcaoCartoon || tokAt(1) == T.delete || 
eval.isStateScript);
     boolean surfaceObjectSeen = false;
     boolean planeSeen = false;
     boolean isMapped = false;

Modified: branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties     2016-02-15 
20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties     2016-02-18 
04:29:30 UTC (rev 20963)
@@ -7,11 +7,22 @@
 
 # see also http://chemapps.stolaf.edu/jmol/zip for daily updates
        
-Jmol.___JmolVersion="14.4.2_2016.02.15"
+Jmol.___JmolVersion="14.4.3_2016.02.17"
 
+bug fix: slab/depth SET do not behave properly
+bug fix: select VISIBLE is not properly set based on slab/depth SET 
+
 bug fix: _GEOM_BOND reading in CIF files nonfunctional.
- -- broken in 14.3.16_2015.08.11
- -- only affects CCDC file reading, as it requires presence of 
_ccdc_geom_bond_type
+ -- broken in 13.3.4_dev_2013.08.21
+ -- result is that between 8/21/2013 and 2/15/2016 the CIF reader
+    would not recognize _GEOM_BOND and so also not create whole molecules 
+    as it was designed to do when those are present.
+ -- no impact on states created within this version range 
+ -- no impact on mmCIF reader
+ -- only impact is upon Materials Studio-generated files such as
+    http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt
+    (supplemental mat. for 
http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h)
+    See Jmol list discussion: 
https://sourceforge.net/p/jmol/mailman/message/31308577/
 
 JmolVersion="14.4.2_2016.02.14"
 

Modified: branches/v14_4/Jmol/src/org/jmol/viewer/ShapeManager.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/viewer/ShapeManager.java   2016-02-15 
20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/viewer/ShapeManager.java   2016-02-18 
04:29:30 UTC (rev 20963)
@@ -57,6 +57,7 @@
   public ShapeManager(Viewer vwr) {
     this.vwr = vwr;
     bsRenderableAtoms = new BS();
+    bsSlabbedInternal = new BS();
   }
 
   /**
@@ -308,10 +309,11 @@
   Object getProperty(Object paramInfo) {
     if (paramInfo.equals("getShapes"))
       return shapes;
+    // could be more here...
     return null;
   }
 
-  public final BS bsRenderableAtoms;
+  public final BS bsRenderableAtoms, bsSlabbedInternal;
 
   public Shape getShape(int i) {
     //RepaintManager
@@ -401,39 +403,43 @@
 
   private final int[] navMinMax = new int[4];
 
-  public int[] finalizeAtoms(boolean checkAtoms, boolean finalizeParams) {
+  public int[] finalizeAtoms(BS bsTranslateSelected, boolean finalizeParams) {
     Viewer vwr = this.vwr;
+    TransformManager tm = vwr.tm;
     if (finalizeParams)
       vwr.finalizeTransformParameters();
-    TransformManager tm = vwr.tm;
-    BS bs = bsRenderableAtoms;
-    BS bsAtoms = (checkAtoms ? tm.bsSelectedAtoms : null); 
-    if (bsAtoms != null) {
+    if (bsTranslateSelected != null) {
       // translateSelected operation
-      P3 ptCenter = ms.getAtomSetCenter(bsAtoms);
+      P3 ptCenter = ms.getAtomSetCenter(bsTranslateSelected);
       P3 pt = new P3();
       tm.transformPt3f(ptCenter, pt);
       pt.add(tm.ptOffset);
       tm.unTransformPoint(pt, pt);
       pt.sub(ptCenter);
-      vwr.setAtomCoordsRelative(pt, bsAtoms);
+      vwr.setAtomCoordsRelative(pt, bsTranslateSelected);
       tm.ptOffset.set(0, 0, 0);
       tm.bsSelectedAtoms = null;
     }
-    ms.getAtomsInFrame(bs);
+    BS bsOK = bsRenderableAtoms;
+    ms.getAtomsInFrame(bsOK);
     Vibration[] vibrationVectors = ms.vibrations;
     boolean vibs = (vibrationVectors != null && tm.vibrationOn);
     boolean checkOccupancy = (ms.bsModulated != null && ms.occupancies != 
null);
     Atom[] atoms = ms.at;
     int occ;
     boolean haveMods = false;
-    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) {
+    BS bsSlabbed = bsSlabbedInternal;
+    bsSlabbed.clearAll();
+    for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) {
       // note that this vibration business is not compatible with
       // PDB objects such as cartoons and traces, which 
       // use Cartesian coordinates, not screen coordinates
       Atom atom = atoms[i];
       P3i screen = (vibs && atom.hasVibration() ? tm.transformPtVib(atom,
           vibrationVectors[i]) : tm.transformPt(atom));
+      if (screen.z == 1 && tm.internalSlab && tm.xyzIsSlabbedInternal(atom)) {
+        bsSlabbed.set(i);
+      }
       atom.sX = screen.x;
       atom.sY = screen.y;
       atom.sZ = screen.z;
@@ -471,7 +477,7 @@
           JmolMolecule m = molecules[i];
           int j = 0;
           int pt = m.firstAtomIndex;
-          if (!bs.get(pt))
+          if (!bsOK.get(pt))
             continue;
           for (; j < m.ac; j++, pt++)
             if (gdata.isClippedZ(atoms[pt].sZ - (atoms[pt].sD >> 1)))
@@ -479,13 +485,13 @@
           if (j != m.ac) {
             pt = m.firstAtomIndex;
             for (int k = 0; k < m.ac; k++) {
-              bs.clear(pt);
+              bsOK.clear(pt);
               atoms[pt++].sZ = 0;
             }
           }
         }
       }
-      for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) {
+      for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) {
         Atom atom = atoms[i];
         if (gdata.isClippedZ(atom.sZ - (slabByAtom ? atoms[i].sD >> 1 : 0))) {
           atom.setClickable(0);
@@ -494,7 +500,7 @@
           int r = (slabByAtom ? -1 : 1) * atom.sD / 2;
           if (atom.sZ + r < minZ || atom.sZ - r > maxZ
               || !gdata.isInDisplayRange(atom.sX, atom.sY)) {
-            bs.clear(i);
+            bsOK.clear(i);
           }
         }
       }
@@ -506,7 +512,7 @@
     int maxX = Integer.MIN_VALUE;
     int minY = Integer.MAX_VALUE;
     int maxY = Integer.MIN_VALUE;
-    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) {
+    for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) {
       Atom atom = atoms[i];
       if (atom.sX < minX)
         minX = atom.sX;

Modified: branches/v14_4/Jmol/src/org/jmol/viewer/StateCreator.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/viewer/StateCreator.java   2016-02-15 
20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/viewer/StateCreator.java   2016-02-18 
04:29:30 UTC (rev 20963)
@@ -233,8 +233,7 @@
   }
 
   @Override
-  String getModelState(SB sfunc, boolean isAll,
-                              boolean withProteinStructure) {
+  String getModelState(SB sfunc, boolean isAll, boolean withProteinStructure) {
     SB commands = new SB();
     if (isAll && sfunc != null) {
       sfunc.append("  _setModelState;\n");
@@ -262,22 +261,21 @@
       SB sb = new SB();
       for (int i = 0; i < ms.bondCount; i++)
         if (!models[bonds[i].atom1.mi].isModelKit)
-          if (bonds[i].isHydrogen()
-              || (bonds[i].order & Edge.BOND_NEW) != 0) {
+          if (bonds[i].isHydrogen() || (bonds[i].order & Edge.BOND_NEW) != 0) {
             Bond bond = bonds[i];
             int index = bond.atom1.i;
             if (bond.atom1.group.isAdded(index))
               index = -1 - index;
-            sb.appendI(index).appendC('\t').appendI(bond.atom2.i).appendC(
-                '\t').appendI(bond.order & ~Edge.BOND_NEW).appendC('\t')
-                .appendF(bond.mad / 1000f).appendC('\t').appendF(
-                    bond.getEnergy()).appendC('\t').append(
-                    Edge.getBondOrderNameFromOrder(bond.order)).append(
-                    ";\n");
+            sb.appendI(index).appendC('\t').appendI(bond.atom2.i).appendC('\t')
+                .appendI(bond.order & ~Edge.BOND_NEW).appendC('\t')
+                .appendF(bond.mad / 1000f).appendC('\t')
+                .appendF(bond.getEnergy()).appendC('\t')
+                .append(Edge.getBondOrderNameFromOrder(bond.order))
+                .append(";\n");
           }
       if (sb.length() > 0)
-        commands.append("data \"connect_atoms\"\n").appendSB(sb).append(
-            "end \"connect_atoms\";\n");
+        commands.append("data \"connect_atoms\"\n").appendSB(sb)
+            .append("end \"connect_atoms\";\n");
       commands.append("\n");
     }
 
@@ -302,12 +300,14 @@
     // unnecessary. Removed in 11.5.35 -- oops!
 
     if (withProteinStructure)
-      commands.append(ms.getProteinStructureState(null, isAll ? T.all : 
T.state));
+      commands.append(ms
+          .getProteinStructureState(null, isAll ? T.all : T.state));
 
     // introduced in 14.4.2
     for (int i = 0; i < modelCount; i++)
       if (models[i].mat4 != null)
-        commands.append("  frame orientation " + ms.getModelNumberDotted(i) + 
Escape.matrixToScript(models[i].mat4) + ";\n");
+        commands.append("  frame orientation " + ms.getModelNumberDotted(i)
+            + Escape.matrixToScript(models[i].mat4) + ";\n");
 
     getShapeState(commands, isAll, Integer.MAX_VALUE);
 
@@ -319,33 +319,31 @@
           break;
         }
       SB sb = new SB();
-           for (int i = 0; i < modelCount; i++) {
+      for (int i = 0; i < modelCount; i++) {
         Model m = models[i];
         sb.setLength(0);
         String s = (String) ms.getInfo(i, "modelID");
-        if (s != null
-            && !s.equals(ms.getInfo(i, "modelID0")))
-          sb.append("  frame ID ").append(PT.esc(s))
-              .append(";\n");
+        if (s != null && !s.equals(ms.getInfo(i, "modelID0")))
+          sb.append("  frame ID ").append(PT.esc(s)).append(";\n");
         String t = ms.frameTitles[i];
         if (t != null && t.length() > 0)
-          sb.append("  frame title ").append(PT.esc(t))
-              .append(";\n");
+          sb.append("  frame title ").append(PT.esc(t)).append(";\n");
         if (needOrientations && m.orientation != null
             && !ms.isTrajectorySubFrame(i))
-          sb.append("  ").append(
-              m.orientation.getMoveToText(false)).append(";\n");
+          sb.append("  ").append(m.orientation.getMoveToText(false))
+              .append(";\n");
         if (m.frameDelay != 0 && !ms.isTrajectorySubFrame(i))
-          sb.append("  frame delay ").appendF(
-              m.frameDelay / 1000f).append(";\n");
+          sb.append("  frame delay ").appendF(m.frameDelay / 1000f)
+              .append(";\n");
         if (m.simpleCage != null) {
-          sb.append("  unitcell ").append(
-              Escape.eAP(m.simpleCage.getUnitCellVectors())).append(
-              ";\n");
+          sb.append("  unitcell ")
+              .append(Escape.eAP(m.simpleCage.getUnitCellVectors()))
+              .append(";\n");
           getShapeState(sb, isAll, JC.SHAPE_UCCAGE);
         }
         if (sb.length() > 0)
-          commands.append("  frame " + ms.getModelNumberDotted(i) + 
";\n").appendSB(sb);
+          commands.append("  frame " + ms.getModelNumberDotted(i) + ";\n")
+              .appendSB(sb);
       }
 
       boolean loadUC = false;
@@ -358,9 +356,8 @@
           sb.setLength(0);
           if (symmetry.getState(sb)) {
             loadUC = true;
-            commands.append("  frame ")
-              .append(ms.getModelNumberDotted(i))
-              .appendSB(sb).append(";\n");
+            commands.append("  frame ").append(ms.getModelNumberDotted(i))
+                .appendSB(sb).append(";\n");
           }
           haveModulation |= (vwr.ms.getLastVibrationVector(i, T.modulation) >= 
0);
         }
@@ -383,8 +380,8 @@
       }
       commands.append("  set fontScaling " + vwr.getBoolean(T.fontscaling)
           + ";\n");
-//      if (vwr.getBoolean(T.modelkitmode))
-  //      commands.append("  set modelKitMode true;\n");
+      //      if (vwr.getBoolean(T.modelkitmode))
+      //      commands.append("  set modelKitMode true;\n");
     }
     if (sfunc != null)
       commands.append("\n}\n\n");
@@ -811,11 +808,12 @@
     if (vwr.ms.modelSetHasVibrationVectors() && tm.vibrationOn)
       app(commands, "set vibrationPeriod " + tm.vibrationPeriod
           + ";vibration on");
+    boolean slabInternal = (tm.depthPlane != null || tm.slabPlane != null);
     if (navigating) {
       commands.append(tm.getNavigationState());
-      if (tm.depthPlane != null || tm.slabPlane != null)
-        commands.append("  slab on;\n");
-    }
+    } 
+    if (!tm.slabEnabled && slabInternal)
+      commands.append("  slab off;\n");
     if (sfunc != null)
       commands.append("}\n\n");
     return commands.toString();

Modified: branches/v14_4/Jmol/src/org/jmol/viewer/TransformManager.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/viewer/TransformManager.java       
2016-02-15 20:33:16 UTC (rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/viewer/TransformManager.java       
2016-02-18 04:29:30 UTC (rev 20963)
@@ -831,7 +831,7 @@
   public boolean slabEnabled;
   public boolean zShadeEnabled;
 
-  boolean internalSlab;
+  public boolean internalSlab;
 
   int slabPercentSetting;
   int depthPercentSetting;
@@ -851,8 +851,7 @@
   }
 
   void setSlabEnabled(boolean slabEnabled) {
-    this.slabEnabled = slabEnabled;
-    vwr.g.setB("slabEnabled", slabEnabled);
+    vwr.g.setB("slabEnabled", this.slabEnabled = slabEnabled);
   }
 
   void setZShadeEnabled(boolean zShadeEnabled) {
@@ -922,15 +921,16 @@
   }
 
   public void slabToPercent(int percentSlab) {
+    slabPlane = null;
     vwr.setFloatProperty("slabRange", 0);
     slabPercentSetting = percentSlab;
-    slabPlane = null;
     if (depthPercentSetting >= slabPercentSetting)
       depthPercentSetting = slabPercentSetting - 1;
     slabDepthChanged();
   }
 
   public void depthToPercent(int percentDepth) {
+    depthPlane = null;
     vwr.g.setI("depth", percentDepth);
     depthPercentSetting = percentDepth;
     if (slabPercentSetting <= depthPercentSetting)
@@ -972,23 +972,24 @@
       depthPlane = null;
     else
       slabPlane = null;
+    finalizeTransformParameters();
     slabInternal(getSlabDepthPlane(isDepth), isDepth);
   }
 
   private P4 getSlabDepthPlane(boolean isDepth) {
     // the third row of the matrix defines the Z coordinate, which is all we 
need
     // and, in fact, it defines the plane. How convenient!
-    // eval "slab set"
+    // eval "slab set"  
     if (isDepth) {
       if (depthPlane != null)
         return depthPlane;
-    } else {
-      if (slabPlane != null)
+    } else if (slabPlane != null) {
         return slabPlane;
     }
     M4 m = matrixTransform;
-    return P4.new4(-m.m20, -m.m21, -m.m22, -m.m23
+    P4 plane = P4.new4(-m.m20, -m.m21, -m.m22, -m.m23
         + (isDepth ? depthValue : slabValue));
+    return plane;
   }
 
   /* ***************************************************************
@@ -1446,7 +1447,6 @@
         // don't care
       }
     }
-
     vwr.g.setO("_slabPlane", Escape.eP4(getSlabDepthPlane(false)));
     vwr.g.setO("_depthPlane", Escape.eP4(getSlabDepthPlane(true)));
     if (slabEnabled)
@@ -1508,9 +1508,16 @@
 
   public void transformPtScrT3(T3 ptXYZ, T3 pointScreen) {
     transformPt(ptXYZ);
+    // note that this point may be returned as z=1 if the point is 
+    // past the camera or slabbed internally
     pointScreen.setT(fScrPt);
   }
 
+  public void transformPt3f(T3 ptXYZ, P3 screen) {
+    applyPerspective(ptXYZ, ptXYZ);
+    screen.setT(fScrPt);
+  }
+
   public void transformPtNoClip(T3 ptXYZ, T3 pointScreen) {
     applyPerspective(ptXYZ, null);
     pointScreen.setT(fScrPt);
@@ -1548,11 +1555,6 @@
         (Float.isNaN(scale) ? vibrationScale : scale), vwr.g.modulationScale);
   }
 
-  public void transformPt3f(T3 ptXYZ, P3 screen) {
-    applyPerspective(ptXYZ, ptXYZ);
-    screen.setT(fScrPt);
-  }
-
   public synchronized P3i transformPt2D(T3 ptXyp) {
     // axes position [50 50]
     // just does the processing for [x y] and [x y %]
@@ -1650,16 +1652,19 @@
     iScrPt.set((int) fScrPt.x, (int) fScrPt.y,
         (int) fScrPt.z);
 
-    if (ptRef != null
-        && (slabPlane != null
-            && ptRef.x * slabPlane.x + ptRef.y * slabPlane.y + ptRef.z
-                * slabPlane.z + slabPlane.w > 0 || depthPlane != null
-            && ptRef.x * depthPlane.x + ptRef.y * depthPlane.y + ptRef.z
-                * depthPlane.z + depthPlane.w < 0))
+    if (ptRef != null && xyzIsSlabbedInternal(ptRef))
       fScrPt.z = iScrPt.z = 1;
     return iScrPt;
   }
 
+  public boolean xyzIsSlabbedInternal(T3 ptRef) {
+    return (slabPlane != null
+        && ptRef.x * slabPlane.x + ptRef.y * slabPlane.y + ptRef.z
+            * slabPlane.z + slabPlane.w > 0 || depthPlane != null
+        && ptRef.x * depthPlane.x + ptRef.y * depthPlane.y + ptRef.z
+            * depthPlane.z + depthPlane.w < 0);
+  }
+
   final protected P3 untransformedPoint = new P3();
 
   /* ***************************************************************

Modified: branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java
===================================================================
--- branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-15 20:33:16 UTC 
(rev 20962)
+++ branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-18 04:29:30 UTC 
(rev 20963)
@@ -3346,7 +3346,7 @@
       return;
     if (!haveDisplay) {
       setModelVisibility();
-      shm.finalizeAtoms(false, true);
+      shm.finalizeAtoms(null, true);
       return;
     }
     rm.requestRepaintAndWait(why);
@@ -3630,7 +3630,7 @@
         || rm == null)
       return;
     boolean antialias2 = antialiased && g.antialiasTranslucent;
-    int[] navMinMax = shm.finalizeAtoms(true, true);
+    int[] navMinMax = shm.finalizeAtoms(tm.bsSelectedAtoms, true);
     if (isWebGL) {
       rm.renderExport(gdata, ms, jsParams);
       notifyViewerRepaintDone();

Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java  2016-02-15 
20:33:16 UTC (rev 20962)
+++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java  2016-02-18 
04:29:30 UTC (rev 20963)
@@ -51,8 +51,8 @@
  * A true line-free CIF file reader for CIF files.
  * 
  * Subclasses of CIF -- mmCIF/PDBx (pre-initialized) and msCIF (initialized
- * here).
- * 
+ * here)
+ *
  * Note that a file can be a PDB file without being
  * 
  * Added nonstandard mCIF (magnetic_ tags) 5/2/2014 note that PRELIM keys can 
be
@@ -84,7 +84,6 @@
 
   GenericCifDataParser parser;
 
-  private boolean isMolecular;
   private boolean filterAssembly;
   private boolean allowRotations = true;
   private boolean readIdeal = true;
@@ -181,6 +180,8 @@
   private boolean readAllData() throws Exception {
     if (key.startsWith("data_")) {
       isLigand = false;
+      if (asc.atomSetCount == 0)
+        iHaveDesiredModel = false;
       if (iHaveDesiredModel)
         return false;
       if (desiredModelNumber != Integer.MIN_VALUE)
@@ -222,7 +223,7 @@
      * tokenizer.getTokenPeeked(); continue; }
      */
     if (key.indexOf("_") != 0) {
-        Logger.warn("CIF ERROR ? should be an underscore: " + key);
+      Logger.warn("CIF ERROR ? should be an underscore: " + key);
       parser.getTokenPeeked();
     } else if (!getData()) {
       return true;
@@ -243,22 +244,26 @@
         processCellParameter();
       } else if (key.startsWith("_atom_sites_fract_tran")) {
         processUnitCellTransformMatrix();
-      } else if (key.equals("_audit_block_code")) {
-        auditBlockCode = parser.fullTrim(data).toUpperCase();
-        appendLoadNote(auditBlockCode);
-        if (htAudit != null && auditBlockCode.contains("_MOD_")) {
-          String key = PT.rep(auditBlockCode, "_MOD_", "_REFRNCE_");
-          if (asc.setSymmetry((SymmetryInterface) htAudit.get(key)) != null) {
-            unitCellParams = asc.getSymmetry().getUnitCellParams();
-            iHaveUnitCell = true;
+      } else if (key.startsWith("_audit")) {
+        if (key.equals("_audit_block_code")) {
+          auditBlockCode = parser.fullTrim(data).toUpperCase();
+          appendLoadNote(auditBlockCode);
+          if (htAudit != null && auditBlockCode.contains("_MOD_")) {
+            String key = PT.rep(auditBlockCode, "_MOD_", "_REFRNCE_");
+            if (asc.setSymmetry((SymmetryInterface) htAudit.get(key)) != null) 
{
+              unitCellParams = asc.getSymmetry().getUnitCellParams();
+              iHaveUnitCell = true;
+            }
+          } else if (htAudit != null) {
+            if (symops != null)
+              for (int i = 0; i < symops.size(); i++)
+                setSymmetryOperator(symops.get(i));
           }
-        } else if (htAudit != null) {
-          if (symops != null)
-            for (int i = 0; i < symops.size(); i++)
-              setSymmetryOperator(symops.get(i));
+          if (lastSpaceGroupName != null)
+            setSpaceGroupName(lastSpaceGroupName);
+        } else if (key.equals("_audit_creation_date")) {
+            symmetry = null;
         }
-        if (lastSpaceGroupName != null)
-          setSpaceGroupName(lastSpaceGroupName);
       } else if (key.equals(singleAtomID)) {
         readSingleAtom();
       } else if (key.startsWith("_symmetry_space_group_name_h-m")
@@ -847,7 +852,7 @@
    */
   private void processAtomTypeLoopBlock() throws Exception {
     parseLoopParameters(atomTypeFields);
-    if (!checkAllFieldsPresent(atomTypeFields, false)) {
+    if (!checkAllFieldsPresent(atomTypeFields, -1, false)) {
       parser.skipLoop(false);
       return;
     }
@@ -1519,8 +1524,12 @@
    * @throws Exception
    */
   private void processGeomBondLoopBlock() throws Exception {
+    // broken in 13.3.4_dev_2013.08.20c
+    // fixed in 14.4.3_2016.02.16
+    boolean bondLoopBug = (stateScriptVersionInt >= 130304 && 
stateScriptVersionInt < 140403
+        || stateScriptVersionInt >= 150000 && stateScriptVersionInt < 150403);
     parseLoopParameters(geomBondFields);
-    if (!checkAllFieldsPresent(geomBondFields, true)) {
+    if (bondLoopBug || !checkAllFieldsPresent(geomBondFields, 2, true)) {
       parser.skipLoop(false);
       return;
     }
@@ -1556,6 +1565,12 @@
         dx = 0.015f;
       }
       int order = getBondOrder(getField(CCDC_GEOM_BOND_TYPE));
+      // This field is from Materials Studio. See supplemental material for
+      // http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h
+      // http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt
+      // Jmol list discussion: 
https://sourceforge.net/p/jmol/mailman/message/31308577/
+      // this 5-model file can be read using one model at a time: load 
"c2cc34714h.txt" 3
+      // but it is far from perfect, and still the best way is load 
"c2cc34714h.txt" 3 packed
       bondCount++;
       bondTypes.addLast(new Object[] { name1, name2, Float.valueOf(distance),
           Float.valueOf(dx), Integer.valueOf(order) });
@@ -1594,12 +1609,12 @@
    * (g) set all coordinates as Cartesians (h) remove all unit cell information
    */
   private void setBondingAndMolecules() {
-    Logger.info("CIF creating molecule "
-        + (bondTypes.size() > 0 ? " using GEOM_BOND records" : ""));
     atoms = asc.atoms;
     firstAtom = asc.getLastAtomSetAtomIndex();
     int nat = asc.getLastAtomSetAtomCount();
     ac = firstAtom + nat;
+    Logger.info("CIF creating molecule for " + nat + " atoms "
+        + (bondTypes.size() > 0 ? " using GEOM_BOND records" : ""));
 
     // get list of sites based on atom names
 
@@ -1836,8 +1851,8 @@
     return doCheckUnitCell;
   }
 
-  protected boolean checkAllFieldsPresent(String[] keys, boolean critical) {
-    for (int i = keys.length; --i >= 0;)
+  protected boolean checkAllFieldsPresent(String[] keys, int lastKey, boolean 
critical) {
+    for (int i = (lastKey < 0 ? keys.length : lastKey); --i >= 0;)
       if (key2col[i] == NONE) {
         if (critical)
           Logger.warn("CIF reader missing property: " + keys[i]);

Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java        
2016-02-15 20:33:16 UTC (rev 20962)
+++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java        
2016-02-18 04:29:30 UTC (rev 20963)
@@ -688,7 +688,7 @@
    */
   private boolean processStructConfLoopBlock() throws Exception {
     parseLoopParametersFor(FAMILY_STRUCTCONF, structConfFields);
-    if (!checkAllFieldsPresent(structConfFields, true)) {
+    if (!checkAllFieldsPresent(structConfFields, -1, true)) {
       parser.skipLoop(true);
       return false;
     }
@@ -772,7 +772,7 @@
    */
   private boolean processStructSheetRangeLoopBlock() throws Exception {
     parseLoopParametersFor(FAMILY_SHEET, structSheetRangeFields);
-    if (!checkAllFieldsPresent(structSheetRangeFields, true)) {
+    if (!checkAllFieldsPresent(structSheetRangeFields, -1, true)) {
       parser.skipLoop(true);
       return false;
     }

Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java        
2016-02-15 20:33:16 UTC (rev 20962)
+++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java        
2016-02-18 04:29:30 UTC (rev 20963)
@@ -173,6 +173,7 @@
   protected boolean doCheckUnitCell;
   protected boolean getHeader;
   protected boolean isSequential;
+  public boolean isMolecular; // only for CIF so that it can read multiple 
unit cells
   protected int templateAtomCount;
   public int modelNumber;
   protected int vibrationNumber;

Modified: trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java   2016-02-15 
20:33:16 UTC (rev 20962)
+++ trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java   2016-02-18 
04:29:30 UTC (rev 20963)
@@ -779,7 +779,7 @@
     boolean checkSymmetryRange = (checkRangeNoSymmetry || checkRange111);
     boolean checkDistances = (checkSpecial || checkSymmetryRange);
     boolean addCartesian = (checkSpecial || checkSymmetryMinMax);
-
+    BS bsAtoms = (acr.isMolecular ? null : asc.bsAtoms);
     SymmetryInterface symmetry = this.symmetry;
     if (checkRangeNoSymmetry)
       baseCount = noSymmetryCount;
@@ -809,7 +809,7 @@
         Atom a = asc.atoms[i];
         if (a.ignoreSymmetry)
           continue;
-        if (asc.bsAtoms != null && !asc.bsAtoms.get(i))
+        if (bsAtoms != null && !bsAtoms.get(i))
           continue;
 
         if (ms == null) {

Modified: trunk/Jmol/src/org/jmol/export/__RayTracerExporter.java
===================================================================
--- trunk/Jmol/src/org/jmol/export/__RayTracerExporter.java     2016-02-15 
20:33:16 UTC (rev 20962)
+++ trunk/Jmol/src/org/jmol/export/__RayTracerExporter.java     2016-02-18 
04:29:30 UTC (rev 20963)
@@ -61,7 +61,7 @@
     if (super.initOutput(vwr, privateKey, g3d, params)) {
       vwr.tm.perspectiveDepth = false;
       if (wasPerspective)
-        vwr.shm.finalizeAtoms(false, false);
+        vwr.shm.finalizeAtoms(null, false);
       return true;
     }
     return false; 

Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java
===================================================================
--- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java        2016-02-15 
20:33:16 UTC (rev 20962)
+++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java        2016-02-18 
04:29:30 UTC (rev 20963)
@@ -2466,14 +2466,16 @@
   public BS getVisibleSet(boolean forceNew) {
     if (forceNew) {
       vwr.setModelVisibility();
-      vwr.shm.finalizeAtoms(false, true);
+      vwr.shm.finalizeAtoms(null, true);
+    } else if (haveBSVisible) {
+      return bsVisible;
     }
-    else if (haveBSVisible)
-      return bsVisible;
     bsVisible.clearAll();
     for (int i = ac; --i >= 0;)
       if (at[i].checkVisible())
         bsVisible.set(i);
+    if (vwr.shm.bsSlabbedInternal != null)
+      bsVisible.andNot(vwr.shm.bsSlabbedInternal);
     haveBSVisible = true;
     return bsVisible;
   }

Modified: trunk/Jmol/src/org/jmol/render/RepaintManager.java
===================================================================
--- trunk/Jmol/src/org/jmol/render/RepaintManager.java  2016-02-15 20:33:16 UTC 
(rev 20962)
+++ trunk/Jmol/src/org/jmol/render/RepaintManager.java  2016-02-18 04:29:30 UTC 
(rev 20963)
@@ -243,7 +243,7 @@
   public String renderExport(GData gdata, ModelSet modelSet,
                              Map<String, Object> params) {
     boolean isOK;
-    shapeManager.finalizeAtoms(false, true);
+    shapeManager.finalizeAtoms(null, true);
     JmolRendererInterface exporter3D = vwr.initializeExporter(params);
     isOK = (exporter3D != null);
     if (!isOK) {

Modified: trunk/Jmol/src/org/jmol/render/SticksRenderer.java
===================================================================
--- trunk/Jmol/src/org/jmol/render/SticksRenderer.java  2016-02-15 20:33:16 UTC 
(rev 20962)
+++ trunk/Jmol/src/org/jmol/render/SticksRenderer.java  2016-02-18 04:29:30 UTC 
(rev 20963)
@@ -169,9 +169,9 @@
       return false;
 
     if (slabbing) {
-      if (vwr.gdata.isClippedZ(a.sZ) && vwr.gdata.isClippedZ(b.sZ)
-          || slabByAtom
-          && (vwr.gdata.isClippedZ(a.sZ) || vwr.gdata.isClippedZ(b.sZ)))
+      boolean ba = vwr.gdata.isClippedZ(a.sZ);
+      if (ba && vwr.gdata.isClippedZ(b.sZ) || slabByAtom
+          && (ba || vwr.gdata.isClippedZ(b.sZ)))
         return false;
     }
     zA = a.sZ;
@@ -182,14 +182,12 @@
     colixB = atomB0.colixAtom;
     if (((colix = bond.colix) & C.OPAQUE_MASK) == C.USE_PALETTE) {
       colix = (short) (colix & ~C.OPAQUE_MASK);
-      colixA = C
-          .getColixInherited(
-              (short) (colix | vwr.cm.getColixAtomPalette(atomA0, PAL.CPK.id)),
-              colixA);
-      colixB = C
-          .getColixInherited(
-              (short) (colix | vwr.cm.getColixAtomPalette(atomB0, PAL.CPK.id)),
-              colixB);
+      colixA = C.getColixInherited(
+          (short) (colix | vwr.cm.getColixAtomPalette(atomA0, PAL.CPK.id)),
+          colixA);
+      colixB = C.getColixInherited(
+          (short) (colix | vwr.cm.getColixAtomPalette(atomB0, PAL.CPK.id)),
+          colixB);
     } else {
       colixA = C.getColixInherited(colix, colixA);
       colixB = C.getColixInherited(colix, colixB);
@@ -258,7 +256,6 @@
       }
     }
 
-    
     // set the diameter
 
     xA = a.sX;

Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java
===================================================================
--- trunk/Jmol/src/org/jmol/script/ScriptEval.java      2016-02-15 20:33:16 UTC 
(rev 20962)
+++ trunk/Jmol/src/org/jmol/script/ScriptEval.java      2016-02-18 04:29:30 UTC 
(rev 20963)
@@ -7492,8 +7492,7 @@
             vwr.tm.slabToPercent(percent);
         return;
       case T.on:
-        checkLength(2);
-        TF = true;
+       TF = true;
         //$FALL-THROUGH$
       case T.off:
         checkLength(2);
@@ -7508,10 +7507,8 @@
         return;
       case T.set:
         checkLength(2);
-        if (chk)
-          return;
-        vwr.tm.setSlabDepthInternal(isDepth);
-        setBooleanProperty("slabEnabled", true);
+        if (!chk)
+          vwr.tm.setSlabDepthInternal(isDepth);
         return;
       case T.minus:
         str = paramAsStr(2);

Modified: trunk/Jmol/src/org/jmol/scriptext/IsoExt.java
===================================================================
--- trunk/Jmol/src/org/jmol/scriptext/IsoExt.java       2016-02-15 20:33:16 UTC 
(rev 20962)
+++ trunk/Jmol/src/org/jmol/scriptext/IsoExt.java       2016-02-18 04:29:30 UTC 
(rev 20963)
@@ -78,7 +78,7 @@
   
   @Override
   public String dispatch(int iTok, boolean b, T[] st) throws ScriptException {
-    chk = e.chk;
+    chk = e.chk; 
     slen = e.slen;
     this.st = st;
 
@@ -1132,7 +1132,7 @@
     boolean isPmesh = (iShape == JC.SHAPE_PMESH);
     boolean isPlot3d = (iShape == JC.SHAPE_PLOT3D);
     boolean isLcaoCartoon = (iShape == JC.SHAPE_LCAOCARTOON);
-    boolean isSilent = (isLcaoCartoon || tokAt(1) == T.delete);
+    boolean isSilent = (isLcaoCartoon || tokAt(1) == T.delete || 
eval.isStateScript);
     boolean surfaceObjectSeen = false;
     boolean planeSeen = false;
     boolean isMapped = false;

Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/Jmol.properties      2016-02-15 20:33:16 UTC 
(rev 20962)
+++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties      2016-02-18 04:29:30 UTC 
(rev 20963)
@@ -63,12 +63,25 @@
 TODO: consider if models with no atoms will cause issues in relation to 
model.firstAtomIndex
 
 TODO: isosurface molecular has an issue with 2gb1
+TODO: slab SET will not be rendered correctly when exported because 
tm.transformPoint
 
-Jmol.___JmolVersion="14.5.2_2016.02.15"
+Jmol.___JmolVersion="14.5.3_2016.02.17"
 
+bug fix: slab/depth SET do not behave properly
+bug fix: select VISIBLE is not properly set based on slab/depth SET 
+
 bug fix: _GEOM_BOND reading in CIF files nonfunctional.
- -- broken in 14.3.16_2015.08.11
- -- only affects CCDC file reading, as it requires presence of 
_ccdc_geom_bond_type
+ -- broken in 13.3.4_dev_2013.08.21
+ -- result is that between 8/21/2013 and 2/15/2016 the CIF reader
+    would not recognize _GEOM_BOND and so also not create whole molecules 
+    as it was designed to do when those are present.
+ -- no impact on states created within this version range 
+ -- no impact on mmCIF reader
+ -- only impact is upon Materials Studio-generated files such as
+    http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt
+    (supplemental mat. for 
http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h)
+    See Jmol list discussion: 
https://sourceforge.net/p/jmol/mailman/message/31308577/
+  
 
 JmolVersion="14.5.2_2016.02.14"
 

Modified: trunk/Jmol/src/org/jmol/viewer/ShapeManager.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/ShapeManager.java    2016-02-15 20:33:16 UTC 
(rev 20962)
+++ trunk/Jmol/src/org/jmol/viewer/ShapeManager.java    2016-02-18 04:29:30 UTC 
(rev 20963)
@@ -57,6 +57,7 @@
   public ShapeManager(Viewer vwr) {
     this.vwr = vwr;
     bsRenderableAtoms = new BS();
+    bsSlabbedInternal = new BS();
   }
 
   /**
@@ -308,10 +309,11 @@
   Object getProperty(Object paramInfo) {
     if (paramInfo.equals("getShapes"))
       return shapes;
+    // could be more here...
     return null;
   }
 
-  public final BS bsRenderableAtoms;
+  public final BS bsRenderableAtoms, bsSlabbedInternal;
 
   public Shape getShape(int i) {
     //RepaintManager
@@ -401,39 +403,43 @@
 
   private final int[] navMinMax = new int[4];
 
-  public int[] finalizeAtoms(boolean checkAtoms, boolean finalizeParams) {
+  public int[] finalizeAtoms(BS bsTranslateSelected, boolean finalizeParams) {
     Viewer vwr = this.vwr;
+    TransformManager tm = vwr.tm;
     if (finalizeParams)
       vwr.finalizeTransformParameters();
-    TransformManager tm = vwr.tm;
-    BS bs = bsRenderableAtoms;
-    BS bsAtoms = (checkAtoms ? tm.bsSelectedAtoms : null); 
-    if (bsAtoms != null) {
+    if (bsTranslateSelected != null) {
       // translateSelected operation
-      P3 ptCenter = ms.getAtomSetCenter(bsAtoms);
+      P3 ptCenter = ms.getAtomSetCenter(bsTranslateSelected);
       P3 pt = new P3();
       tm.transformPt3f(ptCenter, pt);
       pt.add(tm.ptOffset);
       tm.unTransformPoint(pt, pt);
       pt.sub(ptCenter);
-      vwr.setAtomCoordsRelative(pt, bsAtoms);
+      vwr.setAtomCoordsRelative(pt, bsTranslateSelected);
       tm.ptOffset.set(0, 0, 0);
       tm.bsSelectedAtoms = null;
     }
-    ms.getAtomsInFrame(bs);
+    BS bsOK = bsRenderableAtoms;
+    ms.getAtomsInFrame(bsOK);
     Vibration[] vibrationVectors = ms.vibrations;
     boolean vibs = (vibrationVectors != null && tm.vibrationOn);
     boolean checkOccupancy = (ms.bsModulated != null && ms.occupancies != 
null);
     Atom[] atoms = ms.at;
     int occ;
     boolean haveMods = false;
-    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) {
+    BS bsSlabbed = bsSlabbedInternal;
+    bsSlabbed.clearAll();
+    for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) {
       // note that this vibration business is not compatible with
       // PDB objects such as cartoons and traces, which 
       // use Cartesian coordinates, not screen coordinates
       Atom atom = atoms[i];
       P3i screen = (vibs && atom.hasVibration() ? tm.transformPtVib(atom,
           vibrationVectors[i]) : tm.transformPt(atom));
+      if (screen.z == 1 && tm.internalSlab && tm.xyzIsSlabbedInternal(atom)) {
+        bsSlabbed.set(i);
+      }
       atom.sX = screen.x;
       atom.sY = screen.y;
       atom.sZ = screen.z;
@@ -471,7 +477,7 @@
           JmolMolecule m = molecules[i];
           int j = 0;
           int pt = m.firstAtomIndex;
-          if (!bs.get(pt))
+          if (!bsOK.get(pt))
             continue;
           for (; j < m.ac; j++, pt++)
             if (gdata.isClippedZ(atoms[pt].sZ - (atoms[pt].sD >> 1)))
@@ -479,13 +485,13 @@
           if (j != m.ac) {
             pt = m.firstAtomIndex;
             for (int k = 0; k < m.ac; k++) {
-              bs.clear(pt);
+              bsOK.clear(pt);
               atoms[pt++].sZ = 0;
             }
           }
         }
       }
-      for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) {
+      for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) {
         Atom atom = atoms[i];
         if (gdata.isClippedZ(atom.sZ - (slabByAtom ? atoms[i].sD >> 1 : 0))) {
           atom.setClickable(0);
@@ -494,7 +500,7 @@
           int r = (slabByAtom ? -1 : 1) * atom.sD / 2;
           if (atom.sZ + r < minZ || atom.sZ - r > maxZ
               || !gdata.isInDisplayRange(atom.sX, atom.sY)) {
-            bs.clear(i);
+            bsOK.clear(i);
           }
         }
       }
@@ -506,7 +512,7 @@
     int maxX = Integer.MIN_VALUE;
     int minY = Integer.MAX_VALUE;
     int maxY = Integer.MIN_VALUE;
-    for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) {
+    for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) {
       Atom atom = atoms[i];
       if (atom.sX < minX)
         minX = atom.sX;

Modified: trunk/Jmol/src/org/jmol/viewer/StateCreator.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/StateCreator.java    2016-02-15 20:33:16 UTC 
(rev 20962)
+++ trunk/Jmol/src/org/jmol/viewer/StateCreator.java    2016-02-18 04:29:30 UTC 
(rev 20963)
@@ -808,11 +808,12 @@
     if (vwr.ms.modelSetHasVibrationVectors() && tm.vibrationOn)
       app(commands, "set vibrationPeriod " + tm.vibrationPeriod
           + ";vibration on");
+    boolean slabInternal = (tm.depthPlane != null || tm.slabPlane != null);
     if (navigating) {
       commands.append(tm.getNavigationState());
-      if (tm.depthPlane != null || tm.slabPlane != null)
-        commands.append("  slab on;\n");
-    }
+    } 
+    if (!tm.slabEnabled && slabInternal)
+      commands.append("  slab off;\n");
     if (sfunc != null)
       commands.append("}\n\n");
     return commands.toString();

Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/TransformManager.java        2016-02-15 
20:33:16 UTC (rev 20962)
+++ trunk/Jmol/src/org/jmol/viewer/TransformManager.java        2016-02-18 
04:29:30 UTC (rev 20963)
@@ -831,7 +831,7 @@
   public boolean slabEnabled;
   public boolean zShadeEnabled;
 
-  boolean internalSlab;
+  public boolean internalSlab;
 
   int slabPercentSetting;
   int depthPercentSetting;
@@ -851,8 +851,7 @@
   }
 
   void setSlabEnabled(boolean slabEnabled) {
-    this.slabEnabled = slabEnabled;
-    vwr.g.setB("slabEnabled", slabEnabled);
+    vwr.g.setB("slabEnabled", this.slabEnabled = slabEnabled);
   }
 
   void setZShadeEnabled(boolean zShadeEnabled) {
@@ -922,15 +921,16 @@
   }
 
   public void slabToPercent(int percentSlab) {
+    slabPlane = null;
     vwr.setFloatProperty("slabRange", 0);
     slabPercentSetting = percentSlab;
-    slabPlane = null;
     if (depthPercentSetting >= slabPercentSetting)
       depthPercentSetting = slabPercentSetting - 1;
     slabDepthChanged();
   }
 
   public void depthToPercent(int percentDepth) {
+    depthPlane = null;
     vwr.g.setI("depth", percentDepth);
     depthPercentSetting = percentDepth;
     if (slabPercentSetting <= depthPercentSetting)
@@ -972,23 +972,24 @@
       depthPlane = null;
     else
       slabPlane = null;
+    finalizeTransformParameters();
     slabInternal(getSlabDepthPlane(isDepth), isDepth);
   }
 
   private P4 getSlabDepthPlane(boolean isDepth) {
     // the third row of the matrix defines the Z coordinate, which is all we 
need
     // and, in fact, it defines the plane. How convenient!
-    // eval "slab set"
+    // eval "slab set"  
     if (isDepth) {
       if (depthPlane != null)
         return depthPlane;
-    } else {
-      if (slabPlane != null)
+    } else if (slabPlane != null) {
         return slabPlane;
     }
     M4 m = matrixTransform;
-    return P4.new4(-m.m20, -m.m21, -m.m22, -m.m23
+    P4 plane = P4.new4(-m.m20, -m.m21, -m.m22, -m.m23
         + (isDepth ? depthValue : slabValue));
+    return plane;
   }
 
   /* ***************************************************************
@@ -1446,7 +1447,6 @@
         // don't care
       }
     }
-
     vwr.g.setO("_slabPlane", Escape.eP4(getSlabDepthPlane(false)));
     vwr.g.setO("_depthPlane", Escape.eP4(getSlabDepthPlane(true)));
     if (slabEnabled)
@@ -1508,9 +1508,16 @@
 
   public void transformPtScrT3(T3 ptXYZ, T3 pointScreen) {
     transformPt(ptXYZ);
+    // note that this point may be returned as z=1 if the point is 
+    // past the camera or slabbed internally
     pointScreen.setT(fScrPt);
   }
 
+  public void transformPt3f(T3 ptXYZ, P3 screen) {
+    applyPerspective(ptXYZ, ptXYZ);
+    screen.setT(fScrPt);
+  }
+
   public void transformPtNoClip(T3 ptXYZ, T3 pointScreen) {
     applyPerspective(ptXYZ, null);
     pointScreen.setT(fScrPt);
@@ -1548,11 +1555,6 @@
         (Float.isNaN(scale) ? vibrationScale : scale), vwr.g.modulationScale);
   }
 
-  public void transformPt3f(T3 ptXYZ, P3 screen) {
-    applyPerspective(ptXYZ, ptXYZ);
-    screen.setT(fScrPt);
-  }
-
   public synchronized P3i transformPt2D(T3 ptXyp) {
     // axes position [50 50]
     // just does the processing for [x y] and [x y %]
@@ -1650,16 +1652,19 @@
     iScrPt.set((int) fScrPt.x, (int) fScrPt.y,
         (int) fScrPt.z);
 
-    if (ptRef != null
-        && (slabPlane != null
-            && ptRef.x * slabPlane.x + ptRef.y * slabPlane.y + ptRef.z
-                * slabPlane.z + slabPlane.w > 0 || depthPlane != null
-            && ptRef.x * depthPlane.x + ptRef.y * depthPlane.y + ptRef.z
-                * depthPlane.z + depthPlane.w < 0))
+    if (ptRef != null && xyzIsSlabbedInternal(ptRef))
       fScrPt.z = iScrPt.z = 1;
     return iScrPt;
   }
 
+  public boolean xyzIsSlabbedInternal(T3 ptRef) {
+    return (slabPlane != null
+        && ptRef.x * slabPlane.x + ptRef.y * slabPlane.y + ptRef.z
+            * slabPlane.z + slabPlane.w > 0 || depthPlane != null
+        && ptRef.x * depthPlane.x + ptRef.y * depthPlane.y + ptRef.z
+            * depthPlane.z + depthPlane.w < 0);
+  }
+
   final protected P3 untransformedPoint = new P3();
 
   /* ***************************************************************

Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/Viewer.java  2016-02-15 20:33:16 UTC (rev 
20962)
+++ trunk/Jmol/src/org/jmol/viewer/Viewer.java  2016-02-18 04:29:30 UTC (rev 
20963)
@@ -3346,7 +3346,7 @@
       return;
     if (!haveDisplay) {
       setModelVisibility();
-      shm.finalizeAtoms(false, true);
+      shm.finalizeAtoms(null, true);
       return;
     }
     rm.requestRepaintAndWait(why);
@@ -3630,7 +3630,7 @@
         || rm == null)
       return;
     boolean antialias2 = antialiased && g.antialiasTranslucent;
-    int[] navMinMax = shm.finalizeAtoms(true, true);
+    int[] navMinMax = shm.finalizeAtoms(tm.bsSelectedAtoms, true);
     if (isWebGL) {
       rm.renderExport(gdata, ms, jsParams);
       notifyViewerRepaintDone();

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


------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Jmol-commits mailing list
Jmol-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-commits

Reply via email to