Revision: 21144 http://sourceforge.net/p/jmol/code/21144 Author: hansonr Date: 2016-06-15 04:36:56 +0000 (Wed, 15 Jun 2016) Log Message: ----------- Jmol.___JmolVersion="14.6.0_2016.06.14"
bug fix: reading of protein structure for a group that is not in a polymer causes null pointer exception set hiddenLinesDashed for boundbox and unitcell Modified Paths: -------------- branches/v14_6/Jmol/src/org/jmol/modelsetbio/BioModelSet.java branches/v14_6/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/javajs/util/Measure.java trunk/Jmol/src/org/jmol/modelset/Text.java trunk/Jmol/src/org/jmol/modelsetbio/BioModelSet.java trunk/Jmol/src/org/jmol/render/BbcageRenderer.java trunk/Jmol/src/org/jmol/render/CageRenderer.java trunk/Jmol/src/org/jmol/render/EchoRenderer.java trunk/Jmol/src/org/jmol/render/LabelsRenderer.java trunk/Jmol/src/org/jmol/render/UccageRenderer.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/shape/Echo.java trunk/Jmol/src/org/jmol/util/BoxInfo.java trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: branches/v14_6/Jmol/src/org/jmol/modelsetbio/BioModelSet.java =================================================================== --- branches/v14_6/Jmol/src/org/jmol/modelsetbio/BioModelSet.java 2016-06-08 21:56:33 UTC (rev 21143) +++ branches/v14_6/Jmol/src/org/jmol/modelsetbio/BioModelSet.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -564,13 +564,15 @@ Atom[] at = ms.at; Model[] am = ms.am; for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { - if (at[i].group.isAdded(i)) + Atom a = at[i]; + Group g = a.group; + if (g.isAdded(i) || g.getBioPolymerLength() == 0) continue; - monomerIndexCurrent = at[i].group.setProteinStructureType(type, + monomerIndexCurrent = g.setProteinStructureType(type, iLast == i - 1 ? monomerIndexCurrent : -1); - int modelIndex = at[i].mi; + int modelIndex = a.mi; ms.proteinStructureTainted = am[modelIndex].structureTainted = true; - iLast = i = at[i].group.lastAtomIndex; + iLast = i = g.lastAtomIndex; } int[] lastStrucNo = new int[ms.mc]; for (int i = 0; i < ms.ac; i++) { Modified: branches/v14_6/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v14_6/Jmol/src/org/jmol/viewer/Jmol.properties 2016-06-08 21:56:33 UTC (rev 21143) +++ branches/v14_6/Jmol/src/org/jmol/viewer/Jmol.properties 2016-06-15 04:36:56 UTC (rev 21144) @@ -7,8 +7,12 @@ # see also http://chemapps.stolaf.edu/jmol/zip for daily updates -Jmol.___JmolVersion="14.6.0_2016.05.26" +Jmol.___JmolVersion="14.6.0_2016.06.14" +bug fix: reading of protein structure for a group that is not in a polymer causes null pointer exception + +JmolVersion="14.6.0_2016.05.26" + bug fix: set hermiteLevel -4 allows hermite during mouse move but not spinning bug fix: polyhedron faces not generated correctly when postions are very close together (still) Modified: trunk/Jmol/src/javajs/util/Measure.java =================================================================== --- trunk/Jmol/src/javajs/util/Measure.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/javajs/util/Measure.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -206,7 +206,7 @@ * @param vAB */ public static void calcNormalizedNormal(T3 pointA, T3 pointB, - T3 pointC, V3 vNormNorm, V3 vAB) { + T3 pointC, T3 vNormNorm, T3 vAB) { vAB.sub2(pointB, pointA); vNormNorm.sub2(pointC, pointA); vNormNorm.cross(vAB, vNormNorm); @@ -241,7 +241,7 @@ * @return w */ public static float getNormalThroughPoints(T3 pointA, T3 pointB, - T3 pointC, V3 vNorm, V3 vTemp) { + T3 pointC, T3 vNorm, T3 vTemp) { // for Polyhedra calcNormalizedNormal(pointA, pointB, pointC, vNorm, vTemp); // ax + by + cz + d = 0 Modified: trunk/Jmol/src/org/jmol/modelset/Text.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Text.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/modelset/Text.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -25,6 +25,7 @@ import javajs.awt.Font; import javajs.util.P3; +import javajs.util.P3i; import javajs.util.PT; import javajs.util.SB; @@ -641,4 +642,20 @@ + boxHeight); } + public void getPymolScreenOffset(P3 atomPt, P3i screen, int zSlab, P3 pTemp, float sppm) { + if (atomPt != null && Math.abs(pymolOffset[0]) == 1) + pTemp.setT(atomPt); + else + pTemp.set(0, 0, 0); + pTemp.add3(pymolOffset[4], pymolOffset[5], + pymolOffset[6]); + vwr.tm.transformPtScr(pTemp, screen); + setXYZs(screen.x, screen.y, screen.z, zSlab); + setScalePixelsPerMicron(sppm); + + + // TODO + + } + } Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioModelSet.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioModelSet.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -564,13 +564,15 @@ Atom[] at = ms.at; Model[] am = ms.am; for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { - if (at[i].group.isAdded(i)) + Atom a = at[i]; + Group g = a.group; + if (g.isAdded(i) || g.getBioPolymerLength() == 0) continue; - monomerIndexCurrent = at[i].group.setProteinStructureType(type, + monomerIndexCurrent = g.setProteinStructureType(type, iLast == i - 1 ? monomerIndexCurrent : -1); - int modelIndex = at[i].mi; + int modelIndex = a.mi; ms.proteinStructureTainted = am[modelIndex].structureTainted = true; - iLast = i = at[i].group.lastAtomIndex; + iLast = i = g.lastAtomIndex; } int[] lastStrucNo = new int[ms.mc]; for (int i = 0; i < ms.ac; i++) { Modified: trunk/Jmol/src/org/jmol/render/BbcageRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/BbcageRenderer.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/render/BbcageRenderer.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -23,6 +23,7 @@ */ package org.jmol.render; +import org.jmol.script.T; import org.jmol.shape.Bbcage; import org.jmol.util.BoxInfo; import org.jmol.viewer.StateManager; @@ -37,11 +38,12 @@ @Override protected boolean render() { Bbcage bbox = (Bbcage) shape; + boolean hiddenLines = (vwr.getBoolean(T.hiddenlinesdashed)); // no translucent bounding box if (bbox.isVisible && (isExport || g3d.checkTranslucent(false)) && !vwr.isJmolDataFrame()) { colix = vwr.getObjectColix(StateManager.OBJ_BOUNDBOX); - renderCage(vwr.getObjectMad10(StateManager.OBJ_BOUNDBOX), ms.getBBoxVertices(), null, 0, 0xFF, 0xFF, 1); + renderCage(vwr.getObjectMad10(StateManager.OBJ_BOUNDBOX), ms.getBBoxVertices(), (hiddenLines ? BoxInfo.facePoints : null), null, 0, 0xFF, 0xFF, 1); } return false; } Modified: trunk/Jmol/src/org/jmol/render/CageRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/CageRenderer.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/render/CageRenderer.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -24,11 +24,14 @@ package org.jmol.render; +import org.jmol.java.BS; import org.jmol.shape.Bbcage; import org.jmol.shape.FontLineShape; import org.jmol.util.BoxInfo; +import javajs.util.Measure; import javajs.util.P3; +import javajs.util.P3i; abstract class CageRenderer extends FontLineShapeRenderer { @@ -46,10 +49,11 @@ protected boolean isPolymer; private P3 pt = new P3(); + private P3 pt1 = new P3(); - protected void renderCage(int mad, P3[] vertices, P3[] axisPoints, - int firstLine, int allowedEdges0, int allowedEdges1, - float scale) { + protected void renderCage(int mad, P3[] vertices, P3i[] faces, + P3[] axisPoints, int firstLine, int allowedEdges0, + int allowedEdges1, float scale) { //clearBox(); g3d.setC(colix); FontLineShape fls = (FontLineShape) shape; @@ -64,17 +68,33 @@ pt.scaleAdd2(scale, pt, vertices[0]); } tm.transformPtNoClip(pt, p3Screens[i]); + System.out.println(i + " " + p3Screens[i]); zSum += p3Screens[i].z; } - + BS bsSolid = new BS(); + if (faces != null) + for (int i = 12; --i >= 0;) { + P3i face = faces[i]; + Measure.getNormalThroughPoints(p3Screens[face.x], p3Screens[face.y], p3Screens[face.z], pt1, pt); + System.out.println(i + " " + face + " " + pt1); + if (pt1.z <= 0) { + bsSolid.set(face.x); + bsSolid.set(face.y); + bsSolid.set(face.z); + } + } + System.out.println(bsSolid); int diameter = getDiameter((int) Math.floor(zSum / 8), mad); int axisPt = 2; char edge = 0; allowedEdges0 &= (isPolymer ? 0x1 : isSlab ? 0x55 : 0xFF); allowedEdges1 &= (isPolymer ? 0x10 : isSlab ? 0x55 : 0xFF); for (int i = firstLine * 2; i < 24; i += 2) { + int d = diameter; int edge0 = BoxInfo.edges[i]; int edge1 = BoxInfo.edges[i + 1]; + if (!bsSolid.get(edge0) || !bsSolid.get(edge1)) + d = -Math.abs(diameter); if (axisPoints != null && edge0 == 0) tm.transformPtNoClip(axisPoints[axisPt--], p3Screens[0]); if ((allowedEdges0 & (1 << edge0)) == 0 @@ -106,7 +126,7 @@ else tickInfo.first = start; } - renderLine(p3Screens[edge0], p3Screens[edge1], diameter, + renderLine(p3Screens[edge0], p3Screens[edge1], d, drawTicks); } } Modified: trunk/Jmol/src/org/jmol/render/EchoRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/EchoRenderer.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/render/EchoRenderer.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -38,7 +38,7 @@ if (vwr.isPreviewOnly) return false; Echo echo = (Echo) shape; - float scalePixelsPerMicron = (vwr.getBoolean(T.fontscaling) ? vwr + sppm = (vwr.getBoolean(T.fontscaling) ? vwr .getScalePixelsPerAngstrom(true) * 10000 : 0); imageFontScaling = vwr.imageFontScaling; boolean haveTranslucent = false; @@ -54,7 +54,9 @@ tm.transformPtScr(t.xyz, pt0i); t.setXYZs(pt0i.x, pt0i.y, pt0i.z, pt0i.z); } - if (t.movableZPercent != Integer.MAX_VALUE) { + if (t.pymolOffset != null) + t.getPymolScreenOffset(t.xyz, pt0i, zSlab, pTemp, sppm); + else if (t.movableZPercent != Integer.MAX_VALUE) { int z = vwr.tm.zValueFromPercent(t.movableZPercent % 1000); if (t.valign == JC.ECHO_XYZ && Math.abs(t.movableZPercent) >= 1000) z = pt0i.z - vwr.tm.zValueFromPercent(0) + z; @@ -71,7 +73,7 @@ if (t.zSlab == Integer.MIN_VALUE) t.zSlab = 1; } - if (TextRenderer.render(t, g3d, scalePixelsPerMicron, imageFontScaling, + if (TextRenderer.render(t, g3d, sppm, imageFontScaling, false, null, xy) && t.valign == JC.ECHO_BOTTOM && t.align == JC.TEXT_ALIGN_RIGHT) Modified: trunk/Jmol/src/org/jmol/render/LabelsRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/LabelsRenderer.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/render/LabelsRenderer.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -49,7 +49,7 @@ byte fidPrevious; - private P3 pTemp = new P3(); + protected P3 pTemp = new P3(); protected short bgcolix; protected short labelColix; @@ -163,15 +163,7 @@ text.colix = labelColix; text.bgcolix = bgcolix; } else { - if (Math.abs(text.pymolOffset[0]) == 1) - pTemp.setT(atomPt); - else - pTemp.set(0, 0, 0); - pTemp.add3(text.pymolOffset[4], text.pymolOffset[5], - text.pymolOffset[6]); - tm.transformPtScr(pTemp, screen); - text.setXYZs(screen.x, screen.y, screen.z, zSlab); - text.setScalePixelsPerMicron(sppm); + text.getPymolScreenOffset(atomPt, screen, zSlab, pTemp, sppm); } } else { boolean isLeft = (textAlign == JC.TEXT_ALIGN_LEFT || textAlign == JC.TEXT_ALIGN_NONE); Modified: trunk/Jmol/src/org/jmol/render/UccageRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/UccageRenderer.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/render/UccageRenderer.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -96,7 +96,7 @@ offsetT.setT(unitcell.getFractionalOrigin()); unitcell.toCartesian(offsetT, true); offset.sub(offsetT); - + boolean hiddenLines = vwr.getBoolean(T.hiddenlinesdashed); P3 fset = unitcell.getUnitCellMultiplier(); boolean haveMultiple = (fset != null && fset.distanceSquared(fset0) != 0); if (!haveMultiple) @@ -136,7 +136,7 @@ unitcell.toCartesian(v, true); verticesT[i].add2(v, offsetT); } - renderCage(mad10, verticesT, aPoints, firstLine, allow0, allow1, 1); + renderCage(mad10, verticesT, (hiddenLines ? BoxInfo.facePoints : null), aPoints, firstLine, allow0, allow1, 1); } else for (int x = (int) cell0.x; x < cell1.x; x++) { for (int y = (int) cell0.y; y < cell1.y; y++) { @@ -156,8 +156,8 @@ allow1 = 0xFF; for (int i = 8; --i >= 0;) verticesT[i].add2(vertices[i], offsetT); - renderCage(mad10, verticesT, aPoints, firstLine, allow0, allow1, - scale); + renderCage(mad10, verticesT, null, aPoints, firstLine, allow0, + allow1, scale); } } } Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -7264,6 +7264,16 @@ checkLength(pt); setShapeProperty(JC.SHAPE_ECHO, namex, Integer.valueOf(posx)); break; + case T.offset: + P3 pt3 = getPoint3f(pt, false); + if (isPoint3f(pt)) { + // minus 1 here means from Jmol, not from PyMOL + propertyValue = new float[] { -1, pt3.x, pt3.y, pt3.z, 0, 0, 0 }; + } else if (isArrayParameter(2)) { + // PyMOL offsets -- [1, scrx, scry, scrz, molx, moly, molz] in angstroms + propertyValue = floatParameterSet(2, 7, 7); + } + break; case T.off: propertyName = "off"; break; @@ -7287,7 +7297,8 @@ getShapePropertyData(JC.SHAPE_ECHO, "currentTarget", data); id = data[0]; } - if (!chk && vwr.ms.getEchoStateActive() && vwr.fm.loadImage(getToken(pt).value, id, !useThreads())) + if (!chk && vwr.ms.getEchoStateActive() + && vwr.fm.loadImage(getToken(pt).value, id, !useThreads())) throw new ScriptInterruption(this, "setEchoImage", 1); return; } @@ -7295,7 +7306,8 @@ return; case T.point: propertyName = "point"; - propertyValue = (isCenterParameter(pt) ? centerParameter(pt, null) : null); + propertyValue = (isCenterParameter(pt) ? centerParameter(pt, null) + : null); pt = iToken + 1; break; default: Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/script/T.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -1001,6 +1001,7 @@ public final static int hbondsrasmol = booleanparam | 77; public final static int hbondssolid = booleanparam | 78; // see predefinedset public final static int hetero = booleanparam | 80; + public final static int hiddenlinesdashed = booleanparam | 80; public final static int hidenameinpopup = booleanparam | 82; public final static int hidenavigationpoint = booleanparam | 84; public final static int hidenotselected = booleanparam | 86; @@ -2237,6 +2238,7 @@ "functionXY", "functionXYZ", "gridPoints", + "hiddenLinesDashed", "homo", "ignore", "InChI", @@ -3277,6 +3279,7 @@ functionxy, // "functionXY" functionxyz, // "functionXYZ" gridpoints, // "gridPoints" + hiddenlinesdashed, // "hiddenLinesDashed" homo, // "homo" ignore, // "ignore" inchi, // "InChI" Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -1040,9 +1040,10 @@ // x = data(someData,ptrFieldOrColumn,nBytes,firstLine) # extraction of a // column of data based on a field (nBytes = 0) or column range (nBytes > // 0) - String selected = SV.sValue(args[0]); + String selected = (args.length == 0 ? "" : SV.sValue(args[0])); String type = ""; switch (args.length) { + case 0: case 1: break; case 2: Modified: trunk/Jmol/src/org/jmol/shape/Echo.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Echo.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/shape/Echo.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -182,6 +182,13 @@ return; } + if ("offset" == propertyName) { + if (currentObject != null) { + currentObject.pymolOffset = (float[]) value; + } + return; + } + if ("target" == propertyName) { thisID = null; String target = ((String) value).intern().toLowerCase(); Modified: trunk/Jmol/src/org/jmol/util/BoxInfo.java =================================================================== --- trunk/Jmol/src/org/jmol/util/BoxInfo.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/util/BoxInfo.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -145,6 +145,13 @@ P3i.new3(1, 3, 0), P3i.new3(6, 2, 7), P3i.new3(1, 0, 5), + + P3i.new3(0, 2, 6), + P3i.new3(6, 7, 5), + P3i.new3(7, 3, 1), + P3i.new3(3, 2, 0), + P3i.new3(2, 3, 7), + P3i.new3(0, 4, 5), }; public final static int[] toCanonical = new int[] {0, 3, 4, 7, 1, 2, 5, 6}; Modified: trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -274,6 +274,7 @@ setI("hermiteLevel", hermiteLevel); setB("hideNameInPopup", hideNameInPopup); setB("hideNavigationPoint", hideNavigationPoint); + setB("hiddenLinesDashed", hiddenLinesDashed); setB("highResolution", highResolutionFlag); setF("hoverDelay", hoverDelayMs / 1000f); setB("imageState", imageState); @@ -561,6 +562,9 @@ boolean allowModelkit = true; boolean allowMultiTouch = true; // but you still need to set the parameter multiTouchSparshUI=true boolean allowKeyStrokes = false; + + boolean hiddenLinesDashed = false; + int animationFps = 10; boolean atomPicking = true; boolean autoFps = false; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2016-06-15 04:36:56 UTC (rev 21144) @@ -42,8 +42,19 @@ TODO: slightly stronger unitcell lines for near point? -Jmol.___JmolVersion="14.7.0_2016.05.27" +Jmol.___JmolVersion="14.7.0_2016.06.14" +bug fix: reading of protein structure for a group that is not in a polymer causes null pointer exception + +new feature: set echo OFFSET {sx sy sz} + -- sets the echo offset to a specific screen pixel offset + +new feature: set hiddenLinesDashed + -- when set TRUE, hidden lines in unit cells and boundbox are rendered as dashed lines. + -- default is FALSE + +JmolVersion="14.7.0_2016.05.27" + new feature: polyhedron -x.x .... -- sets maximum radius for gap calculation to be x.x Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2016-06-08 21:56:33 UTC (rev 21143) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2016-06-15 04:36:56 UTC (rev 21144) @@ -5084,6 +5084,8 @@ @Override public boolean getBoolean(int tok) { switch (tok) { + case T.hiddenlinesdashed: + return g.hiddenLinesDashed; case T.pdb: return ms.getMSInfoB("isPDB"); case T.allowgestures: @@ -6030,6 +6032,10 @@ private void setBooleanPropertyTok(String key, int tok, boolean value) { boolean doRepaint = true; switch (tok) { + case T.hiddenlinesdashed: + // 14.5.1 + g.hiddenLinesDashed = value; + break; case T.multiplebondbananas: // 14.3.15 g.multipleBondBananas = value; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports. http://pubads.g.doubleclick.net/gampad/clk?id=1444514421&iu=/41014381 _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits