From: <ha...@us...> - 2010-12-24 01:48:19
|
Revision: 14892 http://jmol.svn.sourceforge.net/jmol/?rev=14892&view=rev Author: hansonr Date: 2010-12-24 01:48:11 +0000 (Fri, 24 Dec 2010) Log Message: ----------- version=12.1.27_dev # new feature: isosurface MSMS xxxx.vert -- creates isosurface from MSMS output files # -- implies xxxx.face is also present in the same directory as xxxx.vert. # -- if only .vert are present, only dots will be generated Modified Paths: -------------- trunk/Jmol/src/org/jmol/jvxl/api/MeshDataServer.java trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java trunk/Jmol/src/org/jmol/jvxl/readers/ObjReader.java trunk/Jmol/src/org/jmol/jvxl/readers/PmeshReader.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceFileReader.java trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/script/Token.java trunk/Jmol/src/org/jmol/shape/MeshRenderer.java trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java trunk/Jmol/src/org/jmol/util/SurfaceFileTyper.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Added Paths: ----------- trunk/Jmol/src/org/jmol/jvxl/readers/MsmsReader.java Modified: trunk/Jmol/src/org/jmol/jvxl/api/MeshDataServer.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/api/MeshDataServer.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/jvxl/api/MeshDataServer.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -35,5 +35,6 @@ public abstract void fillMeshData(MeshData meshData, int mode, IsosurfaceMesh mesh); public abstract void notifySurfaceGenerationCompleted(); public abstract void notifySurfaceMappingCompleted(); - public abstract Point3f[] calculateGeodesicSurface(BitSet bsSelected, float envelopeRadius); + public abstract Point3f[] calculateGeodesicSurface(BitSet bsSelected, float envelopeRadius); + public abstract void addRequiredFile(String fileName); } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/jvxl/readers/IsoSolventReader.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -354,6 +354,7 @@ return; if (doCalculateTroughs) { volumeData.getYzCount(); + Logger.info("calculating troughs for grid min " + volumeData.minGrid + " max " + volumeData.maxGrid); if (params.doFullMolecular) { Point3f pt = new Point3f(); Vector3f vTemp = new Vector3f(); Added: trunk/Jmol/src/org/jmol/jvxl/readers/MsmsReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/MsmsReader.java (rev 0) +++ trunk/Jmol/src/org/jmol/jvxl/readers/MsmsReader.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -0,0 +1,83 @@ +/* $RCSfile$ + * $Author: hansonr $ + * $Date: 2007-03-30 11:40:16 -0500 (Fri, 30 Mar 2007) $ + * $Revision: 7273 $ + * + * Copyright (C) 2007 Miguel, Bob, Jmol Development + * + * Contact: ha...@st... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + */ +package org.jmol.jvxl.readers; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import org.jmol.util.Logger; +import org.jmol.util.TextFormat; + +/* + * + * reads MSMS output files .vert with implied .face also present + * + */ + + +class MsmsReader extends PmeshReader { + + private String fileName; + MsmsReader(SurfaceGenerator sg, String fileName, BufferedReader br) { + super(sg, br); + this.fileName = fileName; + type = "msms"; + onePerLine = true; + fixedCount = 3; + vertexBase = 1; + setHeader(); + } + + @Override + protected boolean readVertices() throws Exception { + skipHeader(); + return super.readVertices(); + } + + @Override + protected boolean readPolygons() throws Exception { + br.close(); + fileName = TextFormat.simpleReplace(fileName, ".vert", ".face"); + Logger.info("reading from file " + fileName); + try { + br = new BufferedReader(new InputStreamReader(sg.getAtomDataServer().getBufferedInputStream( + fileName))); + } catch (Exception e) { + Logger.info("Note: file " + fileName + " was not found"); + br = null; + return true; + } + sg.addRequiredFile(fileName); + skipHeader(); + return super.readPolygons(); + } + + private void skipHeader() throws Exception { + while (readLine() != null && line.indexOf("#") >= 0) { + // skip header + } + tokens = getTokens(); + iToken = 0; + } + +} Modified: trunk/Jmol/src/org/jmol/jvxl/readers/ObjReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/ObjReader.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/jvxl/readers/ObjReader.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -24,14 +24,13 @@ package org.jmol.jvxl.readers; import java.io.BufferedReader; +import java.util.BitSet; import java.util.Hashtable; import java.util.Map; import javax.vecmath.Point3f; import org.jmol.g3d.Graphics3D; -import org.jmol.jvxl.data.JvxlCoder; -import org.jmol.util.Logger; import org.jmol.util.Parser; /* @@ -73,11 +72,8 @@ */ -class ObjReader extends PolygonFileReader { +class ObjReader extends PmeshReader { - private int nPolygons; - String pmeshError; - /** * * @param sg @@ -85,43 +81,16 @@ */ ObjReader(SurfaceGenerator sg, BufferedReader br) { super(sg, br); - jvxlFileHeaderBuffer - .append("pmesh file format\nvertices and triangles only\n"); - JvxlCoder.jvxlCreateHeaderWithoutTitleOrAtoms(volumeData, - jvxlFileHeaderBuffer); + type = "obj"; + setHeader(); } @Override - void getSurfaceData() throws Exception { - if (readPmesh()) - Logger.info("obj file contains " - + nVertices + " vertices and " + nPolygons + " polygons for " - + nTriangles + " triangles"); - else - Logger.error(params.fileName + ": " - + (pmeshError == null ? "Error reading obj data " - : pmeshError)); - } - - private boolean readPmesh() { - nPolygons = 0; - try { - if (readVerticesAndPolygons()) - return true; - } catch (Exception e) { - if (pmeshError == null) - pmeshError = "pmesh ERROR: " + e; - } - return false; - } - - Point3f pt = new Point3f(); - - private boolean readVerticesAndPolygons() throws Exception { + protected boolean readVertices() throws Exception { + // also reads polygons pmeshError = "pmesh ERROR: invalid vertex/face list"; Point3f pt = new Point3f(); int color = 0; - boolean haveColor = false; int ia, ib, ic, id = 0; int i = 0; int nPts = 0; @@ -130,73 +99,87 @@ String spt = null; int[] pymolMap = new int[3]; // pymol writes a crude file with much re-writing of vertices - - try { - while (readLine() != null) { - if (line.length() < 2 || line.charAt(1) != ' ') - continue; - switch (line.charAt(0)) { - case 'v': - next[0] = 2; - pt.set(Parser.parseFloat(line, next), Parser.parseFloat(line, next), - Parser.parseFloat(line, next)); - if (htPymol == null) { - i = nVertices; - } else if ((ipt = htPymol.get(spt = "" + pt)) == null) { - htPymol.put(spt, Integer.valueOf(i = nVertices)); - } else { - i = ipt.intValue(); - } - if (i == nVertices) { - if (isAnisotropic) - setVertexAnisotropy(pt); - addVertexCopy(pt, 0, nVertices++); - } - pymolMap[nPts % 3] = i; - nPts++; - break; - case 'f': - if (nPts == 3 && line.indexOf("//") < 0) - htPymol = null; - nPolygons++; - String[] tokens = Parser.getTokens(line); - int vertexCount = tokens.length - 1; - if (vertexCount == 4) - htPymol = null; - if (htPymol == null) { - ia = Parser.parseInt(tokens[1]) - 1; - ib = Parser.parseInt(tokens[2]) - 1; - ic = Parser.parseInt(tokens[3]) - 1; - if (vertexCount == 4) { - id = Parser.parseInt(tokens[4]) - 1; - addTriangleCheck(ia, ib, ic, 5, 0, false, color); + + BitSet bsOK = new BitSet(); + while (readLine() != null) { + if (line.length() < 2 || line.charAt(1) != ' ') + continue; + switch (line.charAt(0)) { + case 'v': + next[0] = 2; + pt.set(Parser.parseFloat(line, next), Parser.parseFloat(line, next), + Parser.parseFloat(line, next)); + boolean addHt = false; + if (htPymol == null) { + i = nVertices; + } else if ((ipt = htPymol.get(spt = "" + pt)) == null) { + addHt = true; + i = nVertices; + } else { + i = ipt.intValue(); + } + + int j = i; + if (i == nVertices) { + if (isAnisotropic) + setVertexAnisotropy(pt); + j = addVertexCopy(pt, 0, nVertices++); + if (j >= 0) + bsOK.set(i); + } + pymolMap[nPts % 3] = j; + if (addHt) + htPymol.put(spt, Integer.valueOf(i)); + nPts++; + if (htPymol != null && nPts > 3) + htPymol = null; + break; + case 'f': + if (nPts == 3 && line.indexOf("//") < 0) + htPymol = null; + nPts = 0; + nPolygons++; + String[] tokens = Parser.getTokens(line); + int vertexCount = tokens.length - 1; + if (vertexCount == 4) + htPymol = null; + if (htPymol == null) { + ia = Parser.parseInt(tokens[1]) - 1; + ib = Parser.parseInt(tokens[2]) - 1; + ic = Parser.parseInt(tokens[3]) - 1; + pmeshError = " " + ia + " " + ib + " " + ic + " " + line; + if (!bsOK.get(ia) || !bsOK.get(ib) || !bsOK.get(ic)) + continue; + if (vertexCount == 4) { + id = Parser.parseInt(tokens[4]) - 1; + boolean isOK = (bsOK.get(id)); + addTriangleCheck(ia, ib, ic, (isOK ? 5 : 7), 0, false, color); + if (isOK) nTriangles = addTriangleCheck(ib, ic, id, 3, 0, false, color); - continue; - } - } else { - ia = pymolMap[0]; - ib = pymolMap[1]; - ic = pymolMap[2]; + continue; } - nTriangles = addTriangleCheck(ia, ib, ic, 7, 0, false, color); - break; - case 'g': - htPymol = null; - if (params.readAllData != haveColor) - color = Graphics3D - .getArgbFromString("[x" + line.substring(3) + "]"); - haveColor = true; - break; + } else { + ia = pymolMap[0]; + ib = pymolMap[1]; + ic = pymolMap[2]; + if (ia < 0 || ib < 0 || ic < 0) + continue; } + nTriangles = addTriangleCheck(ia, ib, ic, 7, 0, false, color); + break; + case 'g': + htPymol = null; + if (params.readAllData) + color = Graphics3D.getArgbFromString("[x" + line.substring(3) + "]"); + break; } - } catch (Exception e) { - if (line != null) { - pmeshError = "problem reading OBJ file at: " + line; - return true; - } } pmeshError = null; return true; } + @Override + protected boolean readPolygons() { + return true; + } } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/PmeshReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/PmeshReader.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/jvxl/readers/PmeshReader.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -87,21 +87,37 @@ class PmeshReader extends PolygonFileReader { - private int nPolygons; - private boolean isBinary; final static String PMESH_BINARY_MAGIC_NUMBER = SurfaceFileTyper.PMESH_BINARY_MAGIC_NUMBER; - String pmeshError; + private boolean isBinary; + protected int nPolygons; + protected String pmeshError; + protected String type; + protected boolean isClosedFace; // a b c d a (pmesh only) + protected int fixedCount; + protected boolean onePerLine; + protected int vertexBase; + + PmeshReader(SurfaceGenerator sg, BufferedReader br) { + super(sg, br); + } + PmeshReader(SurfaceGenerator sg, String fileName, BufferedReader br) { super(sg, br); - jvxlFileHeaderBuffer - .append("pmesh file format\nvertices and triangles only\n"); + type = "pmesh"; + setHeader(); + isBinary = checkBinary(fileName); + isClosedFace = !isBinary; + } + + protected void setHeader() { + jvxlFileHeaderBuffer.append(type + + " file format\nvertices and triangles only\n"); JvxlCoder.jvxlCreateHeaderWithoutTitleOrAtoms(volumeData, jvxlFileHeaderBuffer); - isBinary = checkBinary(fileName); } - private boolean checkBinary(String fileName) { + protected boolean checkBinary(String fileName) { try { br.mark(4); char[] buf = new char[5]; @@ -121,8 +137,8 @@ @Override void getSurfaceData() throws Exception { - if (readPmesh()) - Logger.info((isBinary ? "binary " : "") + "pmesh file contains " + if (readVerticesAndPolygons()) + Logger.info((isBinary ? "binary " : "") + type + " file contains " + nVertices + " vertices and " + nPolygons + " polygons for " + nTriangles + " triangles"); else @@ -131,7 +147,7 @@ : pmeshError)); } - private boolean readPmesh() { + protected boolean readVerticesAndPolygons() { try { if (isBinary && !readBinaryHeader()) return false; @@ -139,7 +155,7 @@ return true; } catch (Exception e) { if (pmeshError == null) - pmeshError = "pmesh ERROR: " + e; + pmeshError = type + " ERROR: " + e; } return false; } @@ -161,51 +177,68 @@ return true; } - private boolean readVertices() throws Exception { - pmeshError = "pmesh ERROR: vertex count must be positive"; + protected int[] vertexMap; + + protected boolean readVertices() throws Exception { + pmeshError = type + " ERROR: vertex count must be positive"; if (!isBinary) nVertices = getInt(); + if (onePerLine) + iToken = Integer.MAX_VALUE; if (nVertices <= 0) { pmeshError += " (" + nVertices + ")"; return false; } - pmeshError = "pmesh ERROR: invalid vertex list"; + pmeshError = type + " ERROR: invalid vertex list"; Point3f pt = new Point3f(); + vertexMap = new int[nVertices]; for (int i = 0; i < nVertices; i++) { pt.set(getFloat(), getFloat(), getFloat()); if (isAnisotropic) setVertexAnisotropy(pt); if (Logger.debugging) Logger.debug(i + ": " + pt); - addVertexCopy(pt, 0, i); + vertexMap[i] = addVertexCopy(pt, 0, i); + if (onePerLine) + iToken = Integer.MAX_VALUE; } pmeshError = null; return true; } - private boolean readPolygons() throws Exception { - pmeshError = "pmesh ERROR: polygon count must be zero or positive"; + protected boolean readPolygons() throws Exception { + pmeshError = type + " ERROR: polygon count must be zero or positive"; if (!isBinary) nPolygons = getInt(); if (nPolygons < 0) { pmeshError += " (" + nPolygons + ")"; return false; } + if (onePerLine) + iToken = Integer.MAX_VALUE; int[] vertices = new int[5]; for (int iPoly = 0; iPoly < nPolygons; iPoly++) { - int intCount = getInt(); - int vertexCount = intCount - (isBinary ? 0 : 1); - // (we will ignore the redundant extra vertex when not binary) + int intCount = (fixedCount == 0 ? getInt() : fixedCount); + int vertexCount = intCount - (isClosedFace ? 1 : 0); + // (we will ignore the redundant extra vertex when not binary and not msms) if (vertexCount < 1 || vertexCount > 4) { - pmeshError = "pmesh ERROR: bad polygon (must have 1-4 vertices) at #" + pmeshError = type + " ERROR: bad polygon (must have 1-4 vertices) at #" + (iPoly + 1); return false; } - for (int i = 0; i < intCount; ++i) - if ((vertices[i] = getInt()) < 0 || vertices[i] >= nVertices) { - pmeshError = "pmesh ERROR: invalid vertex index: " + vertices[i]; + boolean isOK = true; + for (int i = 0; i < intCount; ++i) { + if ((vertices[i] = getInt() - vertexBase) < 0 || vertices[i] >= nVertices) { + pmeshError = type + " ERROR: invalid vertex index: " + vertices[i]; return false; } + if ((vertices[i] = vertexMap[vertices[i]]) < 0) + isOK = false; + } + if (onePerLine) + iToken = Integer.MAX_VALUE; + if (!isOK) + continue; // allow for point or line definition here if (vertexCount < 3) for (int i = vertexCount; i < 3; ++i) @@ -245,8 +278,8 @@ //////////// file reading - private String[] tokens = new String[0]; - private int iToken = 0; + protected String[] tokens = new String[0]; + protected int iToken = 0; private String nextToken() throws Exception { while (iToken >= tokens.length) { Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceFileReader.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceFileReader.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceFileReader.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -130,10 +130,12 @@ protected String readLine() throws Exception { line = br.readLine(); - nBytes += line.length(); - if (os != null && line != null) { - os.write(line.getBytes()); - os.write('\n'); + if (line != null) { + nBytes += line.length(); + if (os != null) { + os.write(line.getBytes()); + os.write('\n'); + } } return line; } Modified: trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java =================================================================== --- trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/jvxl/readers/SurfaceGenerator.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -1200,6 +1200,8 @@ return new PmeshReader(this, params.fileName, br); if (fileType.equals("Obj")) return new ObjReader(this, br); + if (fileType.equals("Msms")) + return new MsmsReader(this, params.fileName, br); return null; } @@ -1310,4 +1312,11 @@ return dist1; } + public void addRequiredFile(String fileName) { + if (meshDataServer == null) + return; + meshDataServer.addRequiredFile(fileName); + } + + } Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -16045,6 +16045,10 @@ addShapeProperty(propertyList, "fileType", "Obj"); sbCommand.append(" obj"); continue; + case Token.msms: + addShapeProperty(propertyList, "fileType", "Msms"); + sbCommand.append(" msms"); + continue; case Token.phase: if (surfaceObjectSeen) error(ERROR_invalidArgument); Modified: trunk/Jmol/src/org/jmol/script/Token.java =================================================================== --- trunk/Jmol/src/org/jmol/script/Token.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/script/Token.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -1121,6 +1121,7 @@ final static int modelbased = misc | 204;// new final static int molecular = misc | 206;// new final static int monomer = misc | 208; + final static int msms = misc | 209;// new public final static int next = misc | 210; public final static int nocontourlines = misc | 212; final static int nocross = misc | 214;// new @@ -1945,6 +1946,7 @@ "minSet", new Token(minset), "modelBased", new Token(modelbased), "molecular", new Token(molecular), + "msms", new Token(msms), "noCross", new Token(nocross), "noDebug", new Token(nodebug), "noEdges", new Token(noedges), Modified: trunk/Jmol/src/org/jmol/shape/MeshRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/MeshRenderer.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/shape/MeshRenderer.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -79,10 +79,8 @@ return mesh.title != null; latticeOffset.set(0, 0, 0); for (int i = vertexCount; --i >= 0;) - if (vertices[i] == null) - System.out.println("meshrend test"); - else - viewer.transformPoint(vertices[i], screens[i]); + if (vertices[i] != null) + viewer.transformPoint(vertices[i], screens[i]); if (mesh.lattice == null || mesh.modelIndex < 0) { render2(exportType != Graphics3D.EXPORT_NOT); } else { @@ -122,8 +120,7 @@ if (mesh.visibilityFlags == 0) return false; if (mesh.lineData == null) { - if ((vertexCount = mesh.vertexCount) == 0 || - !mesh.colorDensity && mesh.polygonCount == 0) + if ((vertexCount = mesh.vertexCount) == 0) return false; normixes = mesh.normixes; if (normixes == null || vertices == null) @@ -157,7 +154,7 @@ protected void render2(boolean generateSet) { if (!g3d.setColix(colix)) return; - if (mesh.showPoints) + if (mesh.showPoints || mesh.polygonCount == 0) renderPoints(); if (mesh.drawTriangles) renderTriangles(false, mesh.showTriangles, false); Modified: trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java =================================================================== --- trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -1068,7 +1068,7 @@ int pt; if (!explicitID && script != null && (pt = script.indexOf("# ID=")) >= 0) thisMesh.thisID = Parser.getNextQuotedString(script, pt); - thisMesh.scriptCommand = script; + thisMesh.scriptCommand = script + scriptAppendix; // Vector v = (Vector) sg.getFunctionXYinfo(); // if (thisMesh.data1 == null) // thisMesh.data1 = v; @@ -1447,4 +1447,9 @@ public void merge(Shape shape) { super.merge(shape); } + + private String scriptAppendix = ""; + public void addRequiredFile(String fileName) { + scriptAppendix += " # /*file*/\"" + fileName + "\""; + } } Modified: trunk/Jmol/src/org/jmol/util/SurfaceFileTyper.java =================================================================== --- trunk/Jmol/src/org/jmol/util/SurfaceFileTyper.java 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/util/SurfaceFileTyper.java 2010-12-24 01:48:11 UTC (rev 14892) @@ -70,6 +70,8 @@ case '#': if (line.indexOf(".obj") >= 0) return "Obj"; // #file: pymol.obj + if (line.indexOf("MSMS") >= 0) + return "Msms"; break; case '&': if (line.indexOf("&plot") == 0) Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-12-23 11:06:08 UTC (rev 14891) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2010-12-24 01:48:11 UTC (rev 14892) @@ -3,6 +3,9 @@ version=12.1.27_dev +# new feature: isosurface MSMS xxxx.vert -- creates isosurface from MSMS output files +# -- implies xxxx.face is also present in the same directory as xxxx.vert. +# -- if only .vert are present, only dots will be generated # bug fix: failure to create atomicOrbital does not clear that isosurface # new feature: QuantumEspresso reader # bug fix: popup menu does not show load {1 1 1} options correctly This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |