Revision: 18266
          http://sourceforge.net/p/jmol/code/18266
Author:   hansonr
Date:     2013-05-30 20:46:54 +0000 (Thu, 30 May 2013)
Log Message:
-----------
___JmolVersion="13.1.16_dev_2013.05.30c"

PyMOL: adds SASURFACE option (surface_solvent ON), with "carving" 
(ProFusion_ABL.pse, scene F6)

Modified Paths:
--------------
    trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java
    trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLGroup.java
    trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java
    trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java
    trunk/Jmol/src/org/jmol/viewer/Jmol.properties

Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java       
2013-05-30 16:35:52 UTC (rev 18265)
+++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java       
2013-05-30 20:46:54 UTC (rev 18266)
@@ -233,8 +233,11 @@
       } else {
         //if (argb == 0)
         //sm.setShapePropertyBs(JC.SHAPE_BALLS, "colors", colors, bsAtoms);
-        String lighting = ((String[]) info)[0];
-        String only = ((String[]) info)[1];
+        String lighting = (String)((Object[]) info)[0];
+        String only = (String)((Object[]) info)[1];
+        only = " only";
+        BS bsCarve = (BS) ((Object[]) info)[2];
+        float carveDistance = ((Float) ((Object[]) info)[3]).floatValue();
         // not implementing "not only" yet because if we did that, since we 
have so
         // many sets of atoms, we could have real problems here.
         String resolution = "";
@@ -243,10 +246,17 @@
           resolution = " resolution 1.5";
         }
         boolean haveMep = Parser.isOneOf(sID, mepList);
+        String model = m.models[modelIndex].getModelNumberDotted();
+//        BS bsIgnore = sm.viewer.getAtomsWithinRadius(0.1f, bsAtoms, true, 
+//            new RadiusData(null, 0.1f, EnumType.ABSOLUTE, null));
+//        bsIgnore.andNot(bsAtoms);
+//        String ignore = " ignore " + Escape.eBS(bsIgnore);
+        String ignore = "";
+        String type = (size < 0 ? " sasurface " : " solvent ");
         sb.append(" model ")
-            .append(m.models[modelIndex].getModelNumberDotted()).append(
+            .append(model).append(
                 resolution).append(" select ").append(Escape.eBS(bsAtoms))
-            .append(" only").append(" solvent ").appendF(size / 1000f);
+            .append(only).append(ignore).append(type).appendF(Math.abs(size / 
1000f));
         if (!haveMep) {
           if (argb == 0)
             sb.append(" map property color");
@@ -256,6 +266,9 @@
         sb.append(";isosurface frontOnly ").append(lighting);
         if (translucency > 0)
           sb.append(";color isosurface translucent " + translucency);
+        if (bsCarve != null && !bsCarve.isEmpty())
+          sb.append(";isosurface slab within " + carveDistance + " {" + model 
+              + " and " + Escape.eBS(bsCarve) + "}");
         if (doCache && !haveMep)
           sb.append(";isosurface cache");
       }

Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLGroup.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLGroup.java       
2013-05-30 16:35:52 UTC (rev 18265)
+++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLGroup.java       
2013-05-30 20:46:54 UTC (rev 18266)
@@ -13,7 +13,7 @@
   JmolList<Object> object;
   boolean visible = true;
   boolean occluded = false;
-  BS bsAtoms;
+  BS bsAtoms = new BS();
   int type;
 
   PyMOLGroup parent;
@@ -35,8 +35,16 @@
       return;    
   }
   
+  BS addGroupAtoms(BS bs) {
+    bsAtoms.or(bs);
+    if (parent != null)
+      parent.addGroupAtoms(bsAtoms);
+    return bsAtoms;
+  }
+
   @Override
   public String toString() {
     return this.name;
   }
+
 }

Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java      
2013-05-30 16:35:52 UTC (rev 18265)
+++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java      
2013-05-30 20:46:54 UTC (rev 18266)
@@ -116,7 +116,6 @@
 
   private boolean isMovie;
 
-  private Map<String, Object> htNames = new Hashtable<String, Object>();
   private int pymolFrame;
   private boolean allStates;
   private int totalAtomCount;
@@ -382,10 +381,9 @@
     }
 
     processDefinitions();
-    if (haveScenes)
-      processScenes(map, names);
+    processSelections(map);
     // no need to render if this is a state script
-    pymolScene.setRendering();
+    pymolScene.finalizeEverything();
     if (!isStateScript) {
       // same idea as for a Jmol state -- session reinitializes
       viewer.initialize(true);
@@ -620,7 +618,8 @@
       processGadget(pymolObject);
       break;
     case PyMOL.OBJECT_GROUP:
-        pymolScene.addGroup(execObject, null, type);
+        if (parentGroupName == null)
+          parentGroupName = ""; // force creation
       break;
     case PyMOL.OBJECT_CGO:
       msg = "CGO";
@@ -645,10 +644,10 @@
       msg = "SURFACE";
       break;
     }
-    if (parentGroupName != null) {
+    if (parentGroupName != null || bsAtoms != null) {
       PyMOLGroup group = pymolScene.addGroup(execObject, parentGroupName, 
type);
       if (bsAtoms != null)
-        pymolScene.addGroupAtoms(group, bsAtoms);
+        bsAtoms = group.addGroupAtoms(bsAtoms);
     }
     if (doExclude) {
       int i0 = intAt(startLen, 0);
@@ -807,17 +806,8 @@
 
     
     JmolList<Object> pymolAtoms = listAt(pymolObject, 7);
-    String fname = "__" + PyMOLScene.fixName(objectName);
     atomMap = new int[nAtoms];
-    BS bsAtoms = (BS) htNames.get(fname);
-    if (bsAtoms == null) {
-      bsAtoms = BS.newN(atomCount0 + nAtoms);
-      Logger.info("PyMOL molecule " + objectName);
-      htNames.put(fname, bsAtoms);
-      pymolScene.addMolecule(objectName);
-    }
-    if (haveScenes)
-      pymolScene.setAtomMap(atomMap, bsAtoms);
+    BS bsAtoms = pymolScene.setAtomMap(atomMap, atomCount0);
     for (int i = 0; i < PyMOL.REP_JMOL_MAX; i++)
       reps[i] = BS.newN(1000);
 
@@ -1218,40 +1208,40 @@
    * 
    */
   private void processDefinitions() {
-    addJmolObject(T.define, null, htNames);
-    String s = viewer.getAtomDefs(htNames);
+    String s = viewer.getAtomDefs(pymolScene.setAtomDefs());
     if (s.length() > 2)
       s = s.substring(0, s.length() - 2);
     appendLoadNote(s);
   }
 
   /**
-   * A PyMOL scene consists of one or more of:
-   *   view
-   *   frame
-   *   visibilities, by object
-   *   colors, by color
-   *   reps, by type
-   * currently just extracts viewpoint
+   * A PyMOL scene consists of one or more of: view frame visibilities, by
+   * object colors, by color reps, by type currently just extracts viewpoint
    * 
    * @param map
-   * @param names 
    */
   @SuppressWarnings("unchecked")
-  private void processScenes(Map<String, Object> map, JmolList<Object>names) {
-    JmolList<Object> order = getMapList(map, "scene_order");
-    Map<String, Object> scenes = (Map<String, Object>) map.get("scene_dict");
-    finalizeSceneData();
-    Map<String, JmolList<Object>> htObjNames = PyMOLScene.listToMap(names);
-    Map<String, JmolList<Object>> htSecrets = 
PyMOLScene.listToMap(getMapList(map, "selector_secrets"));
-    for (int i = 0; i < order.size(); i++) {
-      String name = stringAt(order, i);
-      JmolList<Object> thisScene = getMapList(scenes, name);
-      if (thisScene == null)
-        continue;
-      pymolScene.buildScene(name, thisScene, htObjNames, htSecrets);
-     appendLoadNote("scene: " + name);
+  private void processSelections(Map<String, Object> map) {
+    if (!pymolScene.needSelections())
+      return;
+    Map<String, JmolList<Object>> htObjNames = PyMOLScene.listToMap(getMapList(
+        map, "names"));
+    if (haveScenes) {
+      JmolList<Object> order = getMapList(map, "scene_order");
+      Map<String, Object> scenes = (Map<String, Object>) map.get("scene_dict");
+      finalizeSceneData();
+      Map<String, JmolList<Object>> htSecrets = PyMOLScene
+          .listToMap(getMapList(map, "selector_secrets"));
+      for (int i = 0; i < order.size(); i++) {
+        String name = stringAt(order, i);
+        JmolList<Object> thisScene = getMapList(scenes, name);
+        if (thisScene == null)
+          continue;
+        pymolScene.buildScene(name, thisScene, htObjNames, htSecrets);
+        appendLoadNote("scene: " + name);
+      }
     }
+    pymolScene.setCarveSets(htObjNames);
   }
 
   ////////////////// set the rendering ////////////////

Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java       
2013-05-30 16:35:52 UTC (rev 18265)
+++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java       
2013-05-30 20:46:54 UTC (rev 18266)
@@ -34,7 +34,7 @@
  * 
  */
 class PyMOLScene implements JmolSceneGenerator {
-  
+
   private Viewer viewer;
   private int pymolVersion;
 
@@ -45,7 +45,7 @@
   BS bsLabeled = new BS();
   BS bsHydrogen = new BS();
   BS bsNoSurface = new BS();
-  
+
   // private -- only needed for file reading
 
   private Map<Float, BS> htSpacefill = new Hashtable<Float, BS>();
@@ -85,6 +85,8 @@
   // private -- needed for processing Scenes
 
   private BS bsCartoon = new BS();
+  private Map<String, BS> htCarveSets = new Hashtable<String, BS>();
+  private Map<String, BS> htDefinedAtoms = new Hashtable<String, BS>();
   private Map<String, Boolean> htHiddenObjects = new Hashtable<String, 
Boolean>();
   private JmolList<String> moleculeNames = new JmolList<String>();
   private JmolList<JmolObject> jmolObjects = new JmolList<JmolObject>();
@@ -116,6 +118,7 @@
 
   private String objectName;
   private String objectNameID;
+  private String objectSelectionName;
   private int objectType;
   private BS objectAtoms;
   private boolean objectHidden;
@@ -136,7 +139,10 @@
   private String mepList;
 
   private boolean doCache;
-  
+  private boolean haveScenes;
+  private BS bsCarve;
+  private boolean solventAccessible;
+
   void setStateCount(int stateCount) {
     this.stateCount = stateCount;
   }
@@ -162,9 +168,9 @@
     objectHidden = isHidden;
     objectNameID = (objectName == null ? null : PyMOLScene.fixName(objectName
         + ext));
-    
     objectSettings = new Hashtable<Integer, JmolList<Object>>();
     if (objectName != null) {
+      objectSelectionName = getSelectionName(name);
       if (groupName != null) {
         htObjectGroups.put(objectName, groupName);
         htObjectGroups.put(objectNameID, groupName);
@@ -173,7 +179,8 @@
           Integer.valueOf(type) });
       htObjectSettings.put(objectName, objectSettings);
       if (list != null && list.size() != 0) {
-        Logger.info(objectName + " local settings: " + list.toString());
+        if (Logger.debugging)
+          Logger.info(objectName + " local settings: " + list.toString());
         for (int i = list.size(); --i >= 0;) {
           JmolList<Object> setting = (JmolList<Object>) list.get(i);
           objectSettings.put((Integer) setting.get(0), setting);
@@ -193,6 +200,16 @@
     cartoonRockets = booleanSetting(PyMOL.cartoon_cylindrical_helices);
     surfaceMode = (int) floatSetting(PyMOL.surface_mode);
     surfaceColor = (int) floatSetting(PyMOL.surface_color);
+    solventAccessible = booleanSetting(PyMOL.surface_solvent);
+    String carveSet = stringSetting(PyMOL.surface_carve_selection).trim();
+    if (carveSet.length() == 0) {
+      bsCarve = null;
+    } else {
+      bsCarve = htCarveSets.get(carveSet);
+      if (bsCarve == null)
+        htCarveSets.put(carveSet, bsCarve = new BS());      
+    }
+
     //solventAsSpheres = getBooleanSetting(PyMOL.sphere_solvent); - this is 
for SA-Surfaces
     labelPosition = new P3();
     try {
@@ -250,7 +267,7 @@
     //   {name : [ visFlag, repOn, objVis, color ], ...}
     // As far as I can tell, repOn is not useful, and objVis
     // is only used for measurements.
-    
+
     Map<String, Object> visibilities = (Map<String, Object>) thisScene.get(1);
     smap.put("visibilities", visibilities);
 
@@ -282,7 +299,7 @@
     smap.put("colors", colors);
     addJmolObject(T.scene, null, smap).objectNameID = name;
   }
-  
+
   /**
    * Generate the saved scene.
    * 
@@ -302,10 +319,11 @@
       addJmolObject(T.frame, null, Integer.valueOf(frame.intValue() - 1));
     try {
       int istate = (frame == null ? 0 : frame.intValue());
-      generateVisibilities((Map<String, Object>) scene.get("visibilities"), 
istate);
+      generateVisibilities((Map<String, Object>) scene.get("visibilities"),
+          istate);
       generateColors((Object[]) scene.get("colors"), istate);
       generateShapes((Object[]) scene.get("moleculeReps"), istate);
-      setRendering();
+      finalizeEverything();
       finalizeObjects();
     } catch (Exception e) {
       System.out.println("PyMOLScene exception " + e);
@@ -322,15 +340,19 @@
       Object[] item = (Object[]) colors[i];
       int color = ((Integer) item[0]).intValue();
       int icolor = PyMOL.getRGB(color);
-      BS bs = new BS();
       JmolList<Object> molecules = (JmolList<Object>) item[1];
-      // all states will be colored?
-      for (int j = molecules.size(); --j >= 0;)
-        selectAllAtoms(listAt(molecules, j), istate, bs);
+      BS bs = getSelectionAtoms(molecules, istate, new BS());
       addJmolObject(JC.SHAPE_BALLS, bs, null).argb = icolor;
     }
   }
 
+  private BS getSelectionAtoms(JmolList<Object> molecules, int istate, BS bs) {
+    if (molecules != null)
+      for (int j = molecules.size(); --j >= 0;)
+        selectAllAtoms(listAt(molecules, j), istate, bs);
+    return bs;
+  }
+
   private void selectAllAtoms(JmolList<Object> obj, int istate, BS bs) {
     String name = (String) obj.get(0);
     setObject(name, istate);
@@ -352,7 +374,7 @@
     BS bs = new BS();
     addJmolObject(T.hide, null, null);
     for (Entry<String, PyMOLGroup> e : groups.entrySet())
-      e.getValue().visible = true;    
+      e.getValue().visible = true;
     for (Entry<String, Object> e : vis.entrySet()) {
       String name = e.getKey();
       if (name.equals("all"))
@@ -380,8 +402,8 @@
       JmolList<Object> list = (JmolList<Object>) e.getValue();
       int tok = (objectHidden ? T.hide : T.display);
       bs = null;
-      String info = "__" + fixName(name);
-      switch (getObjectType(name)) {
+      String info = objectSelectionName;
+      switch (objectType) {
       case PyMOL.OBJECT_MOLECULE:
         bs = viewer.getDefinedAtomSet(info);
         if (bs.nextSetBit(0) < 0)
@@ -412,8 +434,9 @@
   private void setObject(String name, int istate) {
     objectName = name;
     objectType = getObjectType(name);
-    objectNameID = (istate == 0 ? getObjectID(name) : "__" + fixName(name)
-        + "_" + istate);
+    objectSelectionName = getSelectionName(name);
+    objectNameID = (istate == 0 ? getObjectID(name) : objectSelectionName + "_"
+        + istate);
     objectAtoms = htObjectAtoms.get(name);
     objectSettings = htObjectSettings.get(name);
     String groupName = htObjectGroups.get(objectName);
@@ -475,12 +498,13 @@
     return getColorPt(c.get(2));
   }
 
-  void setObjects(String mepList, boolean doCache,
-                  int baseModelIndex, int baseAtomIndex, boolean haveScenes) {
+  void setObjects(String mepList, boolean doCache, int baseModelIndex,
+                  int baseAtomIndex, boolean haveScenes) {
     this.baseModelIndex = baseModelIndex;
     this.baseAtomIndex = baseAtomIndex;
     this.mepList = mepList;
     this.doCache = doCache;
+    this.haveScenes = haveScenes;
     clearReaderData(!haveScenes);
     finalizeObjects();
   }
@@ -583,19 +607,24 @@
       occludedObjects.put(objectNameID, Boolean.TRUE);
       htHiddenObjects.put(objectName, Boolean.TRUE);
     }
-    if (parent != null)
+    if (parent != null && parent.length() != 0)
       getGroup(parent).addList(myGroup);
     return myGroup;
   }
 
-  void addGroupAtoms(PyMOLGroup group, BS bsAtoms) {
-    group.bsAtoms = bsAtoms;
+  private PyMOLGroup getGroup(String name) {
+    PyMOLGroup g = groups.get(name);
+    if (g == null) {
+      groups.put(name, (g = new PyMOLGroup(name)));
+      defineAtoms(name, g.bsAtoms);
+    }
+    return g;
   }
 
   /**
    * Create group JmolObjects, and set hierarchical visibilities
    */
-  void setRendering() {
+  void finalizeEverything() {
     viewer.setStringProperty("measurementUnits", "ANGSTROMS");
     viewer.setBooleanProperty("zoomHeight", true);
     setGroupVisibilities();
@@ -612,17 +641,36 @@
       addJmolObject(T.hidden, bsHidden, null);
   }
 
+  void setCarveSets(Map<String, JmolList<Object>> htObjNames) {
+    if (htCarveSets.isEmpty())
+      return;
+    for (Entry<String, BS> e: htCarveSets.entrySet())
+      getSelectionAtoms(listAt(htObjNames.get(e.getKey()), 5), 0, 
e.getValue());
+  }
+
   private void setGroupVisibilities() {
     if (groups != null) {
       Collection<PyMOLGroup> list = groups.values();
+      BS bsAll = new BS();
       for (PyMOLGroup g : list) {
-        if (g.parent != null)
-          continue;
-        setGroupVisible(g, true);
+        bsAll.or(g.bsAtoms);
+        if (g.parent == null) // top
+          setGroupVisible(g, true);
+        else if (g.list.isEmpty()) // bottom
+          g.addGroupAtoms(new BS());
       }
+      defineAtoms("all", bsAll);
     }
   }
 
+  private void defineAtoms(String name, BS bs) {
+    htDefinedAtoms.put(getSelectionName(name), bs);
+  }
+
+  private static String getSelectionName(String name) {
+    return "__" + fixName(name);
+  }
+
   void createShapeObjects(BS[] reps, boolean allowSurface, int atomCount0,
                           int atomCount) {
     if (atomCount >= 0) {
@@ -752,6 +800,20 @@
     }
   }
 
+  @SuppressWarnings("unchecked")
+  String stringSetting(int i) {
+    try {
+      JmolList<Object> setting = null;
+      if (objectSettings != null)
+        setting = objectSettings.get(Integer.valueOf(i));
+      if (setting == null)
+        setting = (JmolList<Object>) settings.get(i);
+      return setting.get(2).toString();
+    } catch (Exception e) {
+      return null;
+    }
+  }
+
   static P3 pointAt(JmolList<Object> list, int i, P3 pt) {
     pt.set(floatAt(list, i++), floatAt(list, i++), floatAt(list, i));
     return pt;
@@ -785,9 +847,9 @@
     return labelPos;
   }
 
-  boolean addMeasurements(MeasurementData[] mdList, int nCoord, 
JmolList<Object> list, BS bsReps,
-                          int color, JmolList<Object> offsets,
-                          boolean haveLabels) {
+  boolean addMeasurements(MeasurementData[] mdList, int nCoord,
+                          JmolList<Object> list, BS bsReps, int color,
+                          JmolList<Object> offsets, boolean haveLabels) {
     boolean isNew = (mdList == null);
     int n = (isNew ? list.size() / 3 / nCoord : mdList.length);
     if (n == 0)
@@ -821,13 +883,13 @@
         offset = floatsAt(listAt(offsets, index), 0, new float[7], 7);
         if (offset == null)
           offset = setLabelPosition(labelPosition, new float[7]);
-        md = mdList[index] = new MeasurementData(objectNameID + "_" + (index + 
1),
-            viewer, points);      
+        md = mdList[index] = new MeasurementData(objectNameID + "_"
+            + (index + 1), viewer, points);
         md.note = objectName;
       } else {
         md = mdList[index];
         offset = md.text.pymolOffset;
-      }      
+      }
       int nDigits = (int) floatSetting(MEAS_DIGITS[nCoord - 2]);
       String strFormat = nCoord + ": "
           + (drawLabel ? "%0." + (nDigits < 0 ? 1 : nDigits) + "VALUE" : "");
@@ -884,7 +946,6 @@
     atomColorList.addLast(Integer.valueOf(getColix(atomColor, translucency)));
   }
 
-
   void setFrameObject(int type, Object info) {
     if (info != null) {
       frameObj = getJmolObject(type, null, info);
@@ -901,20 +962,28 @@
     for (int i = chars.length; --i >= 0;)
       if (!Character.isLetterOrDigit(chars[i]))
         chars[i] = '_';
-    return String.valueOf(chars);
+    return String.valueOf(chars); 
   }
 
   String getObjectID(String name) {
-    return (String)objectInfo.get(name)[0];
+    return (String) objectInfo.get(name)[0];
   }
 
   int getObjectType(String name) {
-    return ((Integer)objectInfo.get(name)[1]).intValue();
+    return ((Integer) objectInfo.get(name)[1]).intValue();
   }
 
-  void setAtomMap(int[] atomMap, BS bsAtoms) {
+  BS setAtomMap(int[] atomMap, int atomCount0) {
     htAtomMap.put(objectNameID, atomMap);
-    htObjectAtoms.put(objectName, bsAtoms);
+    BS bsAtoms = htDefinedAtoms.get(objectSelectionName);
+    if (bsAtoms == null) {
+      bsAtoms = BS.newN(atomCount0 + atomMap.length);
+      Logger.info("PyMOL molecule " + objectName);
+      htDefinedAtoms.put(objectSelectionName, bsAtoms);
+      htObjectAtoms.put(objectName, bsAtoms);
+      moleculeNames.addLast(objectName);
+    }
+    return bsAtoms;
   }
 
   private final static int[] MEAS_DIGITS = { PyMOL.label_distance_digits,
@@ -1034,7 +1103,8 @@
   private void fixReps(BS[] reps) {
     htSpacefill.clear();
     bsCartoon.clearAll();
-    for (int iAtom = objectAtoms.nextSetBit(0); iAtom >= 0; iAtom = 
objectAtoms.nextSetBit(iAtom + 1)) {
+    for (int iAtom = objectAtoms.nextSetBit(0); iAtom >= 0; iAtom = objectAtoms
+        .nextSetBit(iAtom + 1)) {
       float rad = 0;
       int uniqueID = (reader == null ? uniqueIDs[iAtom] : reader
           .getUniqueID(iAtom));
@@ -1089,9 +1159,9 @@
         }
       }
     }
-    
+
     reps[PyMOL.REP_CARTOON].and(bsCartoon);
-    cleanSingletons(reps[PyMOL.REP_CARTOON]);    
+    cleanSingletons(reps[PyMOL.REP_CARTOON]);
     cleanSingletons(reps[PyMOL.REP_RIBBON]);
     cleanSingletons(reps[PyMOL.REP_JMOL_TRACE]);
     cleanSingletons(reps[PyMOL.REP_JMOL_PUTTY]);
@@ -1176,9 +1246,8 @@
       jo.rd = new RadiusData(null, f, RadiusData.EnumType.FACTOR, 
EnumVdw.AUTO);
       break;
     case PyMOL.REP_CARTOON:
-      createCartoonObject("H",
-          (cartoonRockets ? PyMOL.cartoon_helix_radius
-              : PyMOL.cartoon_oval_length));
+      createCartoonObject("H", (cartoonRockets ? PyMOL.cartoon_helix_radius
+          : PyMOL.cartoon_oval_length));
       createCartoonObject("S", PyMOL.cartoon_rect_length);
       createCartoonObject("L", PyMOL.cartoon_loop_radius);
       createCartoonObject(" ", PyMOL.cartoon_loop_radius);
@@ -1189,10 +1258,12 @@
       jo.translucency = floatSetting(PyMOL.transparency);
       break;
     case PyMOL.REP_SURFACE: //   = 2;
-      jo = addJmolObject(T.isosurface, bs, new String[] {
+      float withinDistance = floatSetting(PyMOL.surface_carve_cutoff);
+      jo = addJmolObject(T.isosurface, bs, new Object[] {
           booleanSetting(PyMOL.two_sided_lighting) ? "FULLYLIT" : "FRONTLIT",
-          (surfaceMode == 3 || surfaceMode == 4) ? " only" : "" });
-      jo.setSize(floatSetting(PyMOL.solvent_radius));
+          (surfaceMode == 3 || surfaceMode == 4) ? " only" : "", 
+              bsCarve, Float.valueOf(withinDistance)});
+      jo.setSize(floatSetting(PyMOL.solvent_radius) * (solventAccessible ? -1 
: 1));
       jo.translucency = floatSetting(PyMOL.transparency);
       if (surfaceColor >= 0)
         jo.argb = PyMOL.getRGB(surfaceColor);
@@ -1353,9 +1424,7 @@
     htHiddenObjects.put(g.name, Boolean.TRUE);
     switch (g.type) {
     case PyMOL.OBJECT_MOLECULE:
-      if (g.bsAtoms != null) {
-        bsHidden.or(g.bsAtoms);
-      }
+      bsHidden.or(g.bsAtoms);
       break;
     default:
       // a group?
@@ -1367,13 +1436,6 @@
     }
   }
 
-  private PyMOLGroup getGroup(String name) {
-    PyMOLGroup g = groups.get(name);
-    if (g == null)
-      groups.put(name, (g = new PyMOLGroup(name)));
-    return g;
-  }
-
   private float getUniqueFloat(int uniqueID, int i) {
     float f;
     switch (i) {
@@ -1399,13 +1461,8 @@
     return bs;
   }
 
-  public void addMolecule(String objectName) {
-    moleculeNames .addLast(objectName);
-  }
-
   /**
-   * return a map of lists of the type:
-   * [ [name1,...], [name2,...], ...]
+   * return a map of lists of the type: [ [name1,...], [name2,...], ...]
    * 
    * @param list
    * @return Hashtable
@@ -1415,10 +1472,25 @@
     for (int i = list.size(); --i >= 0;) {
       JmolList<Object> item = PyMOLScene.listAt(list, i);
       if (item != null && item.size() > 0)
-        map.put((String)item.get(0), item);  
+        map.put((String) item.get(0), item);
     }
     return map;
   }
   
+  Map<String, Object> setAtomDefs() {
+    setGroupVisibilities();
+    Map<String, Object> defs = new Hashtable<String, Object>();
+    for (Entry<String, BS> e: htDefinedAtoms.entrySet()) {
+      BS bs = e.getValue();
+      if (!bs.isEmpty())
+        defs.put(e.getKey(), bs);
+    }
+    addJmolObject(T.define, null, defs);
+    return defs;
+  }
 
+  public boolean needSelections() {
+    return haveScenes || !htCarveSets.isEmpty();
+  }
+
 }

Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/Jmol.properties      2013-05-30 16:35:52 UTC 
(rev 18265)
+++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties      2013-05-30 20:46:54 UTC 
(rev 18266)
@@ -9,8 +9,9 @@
 #  The quotes above look odd for a parameter file, but they are 
 #  important for the JavaScript version of Jmol.
 
-___JmolVersion="13.1.16_dev_2013.05.30b"
+___JmolVersion="13.1.16_dev_2013.05.30c"
 
+PyMOL: adds SASURFACE option (surface_solvent ON), with "carving" 
(ProFusion_ABL.pse, scene F6)
 new feature: restore SCENE "xxxx" nSec
 new feature: Scene menu
   -- PyMOL scene names, in order

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


------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap1
_______________________________________________
Jmol-commits mailing list
Jmol-commits@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jmol-commits

Reply via email to