Revision: 20668 http://sourceforge.net/p/jmol/code/20668 Author: hansonr Date: 2015-07-31 12:56:05 +0000 (Fri, 31 Jul 2015) Log Message: ----------- Jmol.___JmolVersion="14.2.15_2015.07.30b"
bug fix: JavaScript deletion of array elements fails for int[] arrays. JmolVersion="14.3.15_2015.07.30" new feature: set multipleBondBananas TRUE -- displays multiple bonds as banana bonds -- does not carry over after model loading new feature: set multipleBondSpacing 0.15; set multipleBondRadiusFactor -1.0 -- positive number for spacing but negative for radiusFactor rotates fixed multiple bonds 90 degrees. bug fix: magnetic spin vectors do not render properly (broken in 14.3.13_2015.05.12) Modified Paths: -------------- trunk/Jmol/src/javajs/util/AU.java trunk/Jmol/src/org/jmol/render/SticksRenderer.java trunk/Jmol/src/org/jmol/renderspecial/DrawRenderer.java trunk/Jmol/src/org/jmol/renderspecial/VectorsRenderer.java trunk/Jmol/src/org/jmol/script/T.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: trunk/Jmol/src/javajs/util/AU.java =================================================================== --- trunk/Jmol/src/javajs/util/AU.java 2015-07-30 13:50:57 UTC (rev 20667) +++ trunk/Jmol/src/javajs/util/AU.java 2015-07-31 12:56:05 UTC (rev 20668) @@ -163,16 +163,18 @@ * @return array */ private static Object newInstanceO(Object array, int n) { + if (isAI(array)) + return new int[n]; /** * @j2sNative * - * if (!array.getClass().getComponentType) + * if (!array.getClass || !array.getClass().getComponentType) * return new Array(n); * */ { - return Array.newInstance(array.getClass().getComponentType(), n); } + return Array.newInstance(array.getClass().getComponentType(), n); } public static int getLength(Object array) { Modified: trunk/Jmol/src/org/jmol/render/SticksRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/SticksRenderer.java 2015-07-30 13:50:57 UTC (rev 20667) +++ trunk/Jmol/src/org/jmol/render/SticksRenderer.java 2015-07-31 12:56:05 UTC (rev 20668) @@ -34,6 +34,9 @@ import org.jmol.util.C; import org.jmol.util.GData; import org.jmol.util.Edge; + +import javajs.util.A4; +import javajs.util.M3; import javajs.util.P3; import javajs.util.V3; import org.jmol.viewer.JC; @@ -43,6 +46,8 @@ private boolean showMultipleBonds; private float multipleBondSpacing; private float multipleBondRadiusFactor; + private boolean bondsPerp; + private boolean useBananas; private byte modeMultipleBond; private boolean isCartesian; //boolean showHydrogens; @@ -113,14 +118,17 @@ return needTranslucent; } -// if (haveMultipleBonds) { -// vwr.setFloatProperty("multipleBondSpacing", 0.15f); -// vwr.setFloatProperty("multipleBondRadiusFactor", 0.4f); -// } - private void getMultipleBondSettings(boolean isPymol) { + useBananas = (vwr.getBoolean(T.multiplebondbananas) && !isPymol); + // negative spacing is relative, depending upon atom-atom distance; + // positive spacing is absolute, for fixed in-plane (radiusFactor > 0) or perp-plane (radiusFactor < 0) multipleBondSpacing = (isPymol ? 0.15f :vwr.getFloat(T.multiplebondspacing)); - multipleBondRadiusFactor = (isPymol ? 0.4f : vwr.getFloat(T.multiplebondradiusfactor)); + // negative radius factor indicates perpendicular fixed double bond + multipleBondRadiusFactor = (isPymol ? 0.4f : vwr.getFloat(T.multiplebondradiusfactor)); + bondsPerp = (useBananas || multipleBondSpacing > 0 && multipleBondRadiusFactor < 0); + if (useBananas) + multipleBondSpacing = (multipleBondSpacing < 0 ? -multipleBondSpacing * 0.4f : multipleBondSpacing); + multipleBondRadiusFactor = Math.abs(multipleBondRadiusFactor); if (multipleBondSpacing == 0 && isCartesian) multipleBondSpacing = 0.2f; modeMultipleBond = vwr.g.modeMultipleBond; @@ -335,9 +343,29 @@ y.cross(y, x); y.normalize(); } + if (bondsPerp) + y.cross(y, x); y.scale(multipleBondSpacing); x.setT(y); x.scale((bondOrder - 1) / 2f); + if (useBananas) { + drawBanana(a, b, x, 0); + switch (bondOrder) { + case 4: + drawBanana(a, b, x, 90); + drawBanana(a, b, x, -90); + //$FALL-THROUGH$ + case 2: + default: + drawBanana(a, b, x, 180); + break; + case 3: + drawBanana(a, b, x, 120); + drawBanana(a, b, x, -120); + break; + } + return; + } p1.sub2(a, x); p2.sub2(b, x); while (true) { @@ -380,6 +408,32 @@ } } + private M3 rot; + private A4 a4; + private void drawBanana(Atom a, Atom b, V3 x, int deg) { + g3d.addRenderer(T.hermitelevel); + vectorT.sub2(b, a); + if (rot == null) { + rot = new M3(); + a4 = new A4(); + } + a4.setVA(vectorT, (float) (deg * Math.PI / 180)); + rot.setAA(a4); + pointT.setT(a); + pointT3.setT(b); + pointT2.ave(a, b); + rot.rotate2(x, vectorT); + pointT2.add(vectorT); + tm.transformPtScrT3(a, pointT); + tm.transformPtScrT3(pointT2, pointT2); + tm.transformPtScrT3(b, pointT3); + int w = Math.max(width, 1); + g3d.setC(colixA); + g3d.fillHermite(5, w, w, w, pointT, pointT, pointT2, pointT3); + g3d.setC(colixB); + g3d.fillHermite(5, w, w, w, pointT, pointT2, pointT3, pointT3); + } + private int xAxis1, yAxis1, xAxis2, yAxis2, dxStep, dyStep; private void resetAxisCoordinates() { Modified: trunk/Jmol/src/org/jmol/renderspecial/DrawRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderspecial/DrawRenderer.java 2015-07-30 13:50:57 UTC (rev 20667) +++ trunk/Jmol/src/org/jmol/renderspecial/DrawRenderer.java 2015-07-31 12:56:05 UTC (rev 20668) @@ -183,48 +183,14 @@ //renderArrowHead(controlHermites[nHermites - 2], controlHermites[nHermites - 1], false); // // {pt1} {pt2} {ptref} {nDegreesOffset, theta, fractionalOffset} + T3 ptRef = (vertexCount > 2 ? vertices[2] : Draw.randomPoint()); float nDegreesOffset = (vertexCount > 3 ? vertices[3].x : 0); float theta = (vertexCount > 3 ? vertices[3].y : 360); if (theta == 0) return; float fractionalOffset = (vertexCount > 3 ? vertices[3].z : 0); - vTemp.sub2(vertices[1], vertices[0]); - // crossing point - pt1f.scaleAdd2(fractionalOffset, vTemp, vertices[0]); - // define rotational axis - M3 mat = new M3().setAA(A4.newVA(vTemp, - (float) (nDegreesOffset * Math.PI / 180))); - // vector to rotate - vTemp2.sub2(vertexCount > 2 ? vertices[2] : Draw.randomPoint(), - vertices[0]); - vTemp2.cross(vTemp, vTemp2); - vTemp2.cross(vTemp2, vTemp); - vTemp2.normalize(); - vTemp2.scale(dmesh.scale / 2); - mat.rotate(vTemp2); - //control points - float degrees = theta / 5; - while (Math.abs(degrees) > 5) - degrees /= 2; - nPoints = Math.round(theta / degrees) + 1; - while (nPoints < 10) { - degrees /= 2; - nPoints = Math.round(theta / degrees) + 1; - } - mat.setAA(A4.newVA(vTemp, (float) (degrees * Math.PI / 180))); - screens = vwr.allocTempScreens(nPoints); - p3Screens = vwr.allocTempPoints(nPoints); - int iBase = nPoints - (dmesh.scale < 2 ? 3 : 3); - for (int i = 0; i < nPoints; i++) { - if (i == iBase) - pt0.setT(pt1); - pt1.scaleAdd2(1, vTemp2, pt1f); - if (i == 0) - pt2.setT(pt1); - tm.transformPtScr(pt1, screens[i]); - tm.transformPtScrT3(pt1, p3Screens[i]); - mat.rotate(vTemp2); - } + nPoints = setArc(vertices[0], vertices[1], ptRef, nDegreesOffset, theta, + fractionalOffset, dmesh.scale); if (dmesh.isVector && !dmesh.noHead) { renderArrowHead(pt0, pt1, 0.3f, false, false, dmesh.isBarb); tm.transformPtScr(pt1f, screens[nPoints - 1]); @@ -267,6 +233,48 @@ } + private int setArc(T3 v1, T3 v2, T3 ptRef, float nDegreesOffset, + float theta, float fractionalOffset, float scale) { + vTemp.sub2(v2, v1); + // crossing point + pt1f.scaleAdd2(fractionalOffset, vTemp, v1); + // define rotational axis + M3 mat = new M3().setAA(A4.newVA(vTemp, + (float) (nDegreesOffset * Math.PI / 180))); + // vector to rotate + vTemp2.sub2(ptRef, + v1); + vTemp2.cross(vTemp, vTemp2); + vTemp2.cross(vTemp2, vTemp); + vTemp2.normalize(); + vTemp2.scale(scale / 2); + mat.rotate(vTemp2); + //control points + float degrees = theta / 5; + while (Math.abs(degrees) > 5) + degrees /= 2; + int nPoints = Math.round(theta / degrees) + 1; + while (nPoints < 10) { + degrees /= 2; + nPoints = Math.round(theta / degrees) + 1; + } + mat.setAA(A4.newVA(vTemp, (float) (degrees * Math.PI / 180))); + screens = vwr.allocTempScreens(nPoints); + p3Screens = vwr.allocTempPoints(nPoints); + int iBase = nPoints - (dmesh.scale < 2 ? 3 : 3); + for (int i = 0; i < nPoints; i++) { + if (i == iBase) + pt0.setT(pt1); + pt1.scaleAdd2(1, vTemp2, pt1f); + if (i == 0) + pt2.setT(pt1); + tm.transformPtScr(pt1, screens[i]); + tm.transformPtScrT3(pt1, p3Screens[i]); + mat.rotate(vTemp2); + } + return nPoints; + } + private void getConnectionPoints() { // now we screens and any adjustment to positions // we need to set the actual control points Modified: trunk/Jmol/src/org/jmol/renderspecial/VectorsRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderspecial/VectorsRenderer.java 2015-07-30 13:50:57 UTC (rev 20667) +++ trunk/Jmol/src/org/jmol/renderspecial/VectorsRenderer.java 2015-07-31 12:56:05 UTC (rev 20668) @@ -214,7 +214,7 @@ } if (!standardVector) { tm.transformPtScrT3(pointVectorEnd, screenVectorEnd); - tm.transformPtScrT3(pointVectorStart, screenVectorEnd); + tm.transformPtScrT3(pointVectorStart, screenVectorStart); if (drawCap) pointArrowHead.add2(pointVectorEnd, headOffsetVector); else Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2015-07-30 13:50:57 UTC (rev 20667) +++ trunk/Jmol/src/org/jmol/script/T.java 2015-07-31 12:56:05 UTC (rev 20668) @@ -1051,19 +1051,20 @@ public final static int modelkitmode = booleanparam | 107; // 12.0.RC15 public final static int modulateoccupancy = booleanparam | 108; // 14.3.13 public final static int monitorenergy = booleanparam | 109; - public final static int multiprocessor = booleanparam | 110; - public final static int navigatesurface = booleanparam | 111; - public final static int navigationmode = booleanparam | 112; - public final static int navigationperiodic = booleanparam | 113; - public final static int partialdots = booleanparam | 114; // 12.1.46 - public final static int pdbaddhydrogens = booleanparam | 115; - public final static int pdbgetheader = booleanparam | 116; - public final static int pdbsequential = booleanparam | 117; - public final static int perspectivedepth = booleanparam | 118; - public final static int preservestate = booleanparam | 119; - public final static int rangeselected = booleanparam | 120; - public final static int refreshing = booleanparam | 121; - public final static int ribbonborder = booleanparam | 122; + public final static int multiplebondbananas = booleanparam | 110; + public final static int multiprocessor = booleanparam | 111; + public final static int navigatesurface = booleanparam | 112; + public final static int navigationmode = booleanparam | 113; + public final static int navigationperiodic = booleanparam | 114; + public final static int partialdots = booleanparam | 115; // 12.1.46 + public final static int pdbaddhydrogens = booleanparam | 116; + public final static int pdbgetheader = booleanparam | 117; + public final static int pdbsequential = booleanparam | 118; + public final static int perspectivedepth = booleanparam | 119; + public final static int preservestate = booleanparam | 120; + public final static int rangeselected = booleanparam | 121; + public final static int refreshing = booleanparam | 122; + public final static int ribbonborder = booleanparam | 123; public final static int rocketbarrels = booleanparam | 124; public final static int saveproteinstructurestate = booleanparam | 126; public final static int scriptqueue = booleanparam | 128; @@ -2578,6 +2579,7 @@ "modelkitMode", "modulateOccupancy", "monitorEnergy", + "multiplebondbananas", "multipleBondRadiusFactor", "multipleBondSpacing", "multiProcessor", @@ -3609,6 +3611,7 @@ modelkitmode, // "modelkitMode" modulateoccupancy, monitorenergy, // "monitorEnergy" + multiplebondbananas, multiplebondradiusfactor, // "multipleBondRadiusFactor" multiplebondspacing, // "multipleBondSpacing" multiprocessor, // "multiProcessor" Modified: trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java 2015-07-30 13:50:57 UTC (rev 20667) +++ trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java 2015-07-31 12:56:05 UTC (rev 20668) @@ -301,6 +301,7 @@ setF("modulationScale", modulationScale); setB("monitorEnergy", monitorEnergy); setF("multipleBondRadiusFactor", multipleBondRadiusFactor); + setB("multipleBondBananas", multipleBondBananas); setF("multipleBondSpacing", multipleBondSpacing); setB("multiProcessor", multiProcessor && (Viewer.nProcessors > 1)); setB("navigationMode", navigationMode); @@ -525,6 +526,7 @@ boolean ssbondsBackbone = false; float multipleBondSpacing = -1; // 0.35? float multipleBondRadiusFactor = 0; // 0.75? + boolean multipleBondBananas = false; //secondary structure + Rasmol @@ -1034,6 +1036,8 @@ // these next two might be part of a 2D->3D operation app(str, "set minimizationCriterion " + minimizationCriterion); app(str, "set minimizationSteps " + minimizationSteps); + // Jmol 14.3.15 introduces bananas, but this setting should not carry through from one model to the next + app(str, "set multipleBondBananas false"); app( str, "set pdbAddHydrogens " Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-07-30 13:50:57 UTC (rev 20667) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2015-07-31 12:56:05 UTC (rev 20668) @@ -48,8 +48,26 @@ TODO: there is something wrong with JSmol and zoneDemo. Just slow? or what? -Jmol.___JmolVersion="14.3.15_2015.07.29" +TODO: curved arrows overextend and with width settings do not truncate shaft properly + +Jmol.___JmolVersion="14.2.15_2015.07.30b" + +bug fix: JavaScript deletion of array elements fails for int[] arrays. + +JmolVersion="14.3.15_2015.07.30" + +new feature: set multipleBondBananas TRUE + -- displays multiple bonds as banana bonds + -- does not carry over after model loading + +new feature: set multipleBondSpacing 0.15; set multipleBondRadiusFactor -1.0 + -- positive number for spacing but negative for radiusFactor rotates fixed multiple bonds 90 degrees. + +bug fix: magnetic spin vectors do not render properly (broken in 14.3.13_2015.05.12) + +JmolVersion="14.3.15_2015.07.29" + new feature: [Font] button added to ScriptEditor bug fix: config 2 and select config=2 may not work properly (still) Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-07-30 13:50:57 UTC (rev 20667) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2015-07-31 12:56:05 UTC (rev 20668) @@ -2531,6 +2531,7 @@ setSelectionHalosEnabled(false); tm.setCenter(); am.initializePointers(1); + setBooleanProperty("multipleBondBananas", false); if (!ms.getMSInfoB("isPyMOL")) { clearAtomSets(); setCurrentModelIndex(0); @@ -5040,6 +5041,8 @@ return g.messageStyleChime; case T.modelkitmode: return g.modelKitMode; + case T.multiplebondbananas: + return g.multipleBondBananas; case T.navigationmode: return g.navigationMode; case T.navigationperiodic: @@ -5857,6 +5860,10 @@ private void setBooleanPropertyTok(String key, int tok, boolean value) { boolean doRepaint = true; switch (tok) { + case T.multiplebondbananas: + // 14.3.15 + g.multipleBondBananas = value; + break; case T.modulateoccupancy: // 12.0.RC6 g.modulateOccupancy = value; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits