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