You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
(35) |
May
(67) |
Jun
(2) |
Jul
|
Aug
(12) |
Sep
(54) |
Oct
(91) |
Nov
(168) |
Dec
(100) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(209) |
Feb
(158) |
Mar
(19) |
Apr
(24) |
May
(184) |
Jun
(134) |
Jul
(54) |
Aug
(399) |
Sep
(218) |
Oct
(271) |
Nov
(207) |
Dec
(126) |
2004 |
Jan
(138) |
Feb
(249) |
Mar
(420) |
Apr
(100) |
May
(335) |
Jun
(143) |
Jul
(91) |
Aug
(129) |
Sep
(98) |
Oct
(170) |
Nov
(352) |
Dec
(355) |
2005 |
Jan
(256) |
Feb
(158) |
Mar
(163) |
Apr
(38) |
May
(217) |
Jun
(98) |
Jul
(213) |
Aug
(169) |
Sep
(260) |
Oct
(94) |
Nov
(87) |
Dec
(153) |
2006 |
Jan
(35) |
Feb
(176) |
Mar
(308) |
Apr
(168) |
May
(152) |
Jun
(67) |
Jul
(99) |
Aug
(90) |
Sep
(313) |
Oct
(266) |
Nov
(282) |
Dec
(189) |
2007 |
Jan
(118) |
Feb
(309) |
Mar
(289) |
Apr
(209) |
May
(268) |
Jun
(103) |
Jul
(91) |
Aug
(143) |
Sep
(146) |
Oct
(205) |
Nov
(157) |
Dec
(172) |
2008 |
Jan
(53) |
Feb
(87) |
Mar
(188) |
Apr
(99) |
May
(101) |
Jun
(91) |
Jul
(117) |
Aug
(158) |
Sep
(100) |
Oct
(221) |
Nov
(184) |
Dec
(127) |
2009 |
Jan
(64) |
Feb
(93) |
Mar
(60) |
Apr
(74) |
May
(76) |
Jun
(218) |
Jul
(130) |
Aug
(115) |
Sep
(142) |
Oct
(76) |
Nov
(160) |
Dec
(181) |
2010 |
Jan
(229) |
Feb
(231) |
Mar
(184) |
Apr
(243) |
May
(229) |
Jun
(204) |
Jul
(293) |
Aug
(370) |
Sep
(160) |
Oct
(164) |
Nov
(163) |
Dec
(161) |
2011 |
Jan
(145) |
Feb
(147) |
Mar
(117) |
Apr
(43) |
May
(102) |
Jun
(152) |
Jul
(204) |
Aug
(98) |
Sep
(162) |
Oct
(216) |
Nov
(107) |
Dec
(98) |
2012 |
Jan
(53) |
Feb
(131) |
Mar
(105) |
Apr
(109) |
May
(155) |
Jun
(88) |
Jul
(82) |
Aug
(69) |
Sep
(96) |
Oct
(83) |
Nov
(71) |
Dec
(50) |
2013 |
Jan
(51) |
Feb
(53) |
Mar
(81) |
Apr
(143) |
May
(75) |
Jun
(103) |
Jul
(126) |
Aug
(104) |
Sep
(73) |
Oct
(136) |
Nov
(148) |
Dec
(90) |
2014 |
Jan
(82) |
Feb
(146) |
Mar
(132) |
Apr
(125) |
May
(72) |
Jun
(84) |
Jul
(35) |
Aug
(68) |
Sep
(49) |
Oct
(54) |
Nov
(58) |
Dec
(15) |
2015 |
Jan
(76) |
Feb
(82) |
Mar
(74) |
Apr
(49) |
May
(48) |
Jun
(48) |
Jul
(57) |
Aug
(66) |
Sep
(45) |
Oct
(52) |
Nov
(18) |
Dec
(33) |
2016 |
Jan
(26) |
Feb
(27) |
Mar
(60) |
Apr
(30) |
May
(51) |
Jun
(25) |
Jul
(12) |
Aug
(47) |
Sep
(11) |
Oct
(26) |
Nov
(9) |
Dec
(27) |
2017 |
Jan
(44) |
Feb
(34) |
Mar
(22) |
Apr
(108) |
May
(42) |
Jun
(17) |
Jul
(38) |
Aug
|
Sep
(2) |
Oct
|
Nov
|
Dec
|
2018 |
Jan
|
Feb
|
Mar
|
Apr
(5) |
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2019 |
Jan
|
Feb
(1) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2020 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2021 |
Jan
(3) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
(13) |
Aug
(39) |
Sep
(8) |
Oct
(7) |
Nov
(25) |
Dec
(16) |
2022 |
Jan
(26) |
Feb
(30) |
Mar
(31) |
Apr
(16) |
May
(12) |
Jun
(7) |
Jul
(15) |
Aug
(24) |
Sep
(4) |
Oct
(10) |
Nov
(7) |
Dec
(5) |
2023 |
Jan
(7) |
Feb
(2) |
Mar
(4) |
Apr
(1) |
May
|
Jun
(3) |
Jul
(13) |
Aug
(14) |
Sep
(17) |
Oct
(3) |
Nov
(13) |
Dec
(6) |
2024 |
Jan
|
Feb
(1) |
Mar
(1) |
Apr
(3) |
May
(3) |
Jun
(1) |
Jul
(2) |
Aug
(1) |
Sep
(1) |
Oct
|
Nov
|
Dec
|
From: <ha...@us...> - 2024-09-14 17:17:56
|
Revision: 22633 http://sourceforge.net/p/jmol/code/22633 Author: hansonr Date: 2024-09-14 17:17:54 +0000 (Sat, 14 Sep 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.29" // (legacy) also 16.2.30 (swingJS) development note: {workspace}/test/scripts/16.2.spt cumulative for 16.2 (starting with 16.2.27!) bug fix: MOLDEN reader not counting coefficients in some cases bug fix: set picking rotateBond, assignBond not working bug fix: modelkit zap spacegroup "P 2/m 1 1" does not create compatible unit cell -- nonstandard Hermann-Mauguin name -- 10.3 OK, but P 2/m 1 1 fails bug fix: modelkit spacegroup not returning error message -- should report errors in syntax or space group names bug fix: modelkit spacegroup "R...:r" fails -- :r here is not an abbreviation, just Hermann-Mauguin name part bug fix: modelkit draw spacegroup may miss some symmetry elements -- particularly for rhombohedral settings of cubic groups -- for example: modelkit draw spacegroup 225:1/2b+1/2c,1/2a+1/2c,1/2a+1/2b draw * off; draw *bar_4* on should show eleven complete rosettes new feature: modelkit spacegroup "225:p" -- ":p" specially for Jmol "primitive" -- many settings not found in the International Tables -- example: modelkit zap spacegroup "225:p" print spacegroup().operations.count 48 new feature: CASTEP reader adds filer "NOSYM" to skip symmetry generation new feature: spacegroup("list") -- displays a multiline string listing of all Jmol space group settings -- form: 10.1 P 1 2/m 1 10:a,b,c new feature: spacegroup(n, "list") -- displays a multiline string listing of name info for the specified space group number -- for example: print spacegroup(10) 10.1 P 1 2/m 1 10:a,b,c 10.2 P 1 1 2/m 10:c,a,b 10.3 P 2/m 1 1 10:b,c,a new feature: modelkit spacegroup xxx:p -- special ":p" extension for IT numbers (10 or 10.3) or HM names -- "primitive" -- attaches the matrix to the primive for centered cells (A,B,C,F,I). Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/quantum/BasisFunctionReader.java trunk/Jmol/src/org/jmol/adapter/readers/quantum/MoldenReader.java trunk/Jmol/src/org/jmol/api/SymmetryInterface.java trunk/Jmol/src/org/jmol/render/MeasuresRenderer.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/symmetry/CLEG.java trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java trunk/Jmol/src/org/jmol/symmetry/Symmetry.java trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java trunk/Jmol/src/org/jmol/symmetry/UnitCell.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/JC.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/test/scripts/16.2.28.spt Added Paths: ----------- trunk/Jmol/test/scripts/16.2.spt Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/BasisFunctionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/BasisFunctionReader.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/BasisFunctionReader.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -165,6 +165,7 @@ } protected int nCoef; + protected boolean haveCoefs; public int[][] getDfCoefMaps() { return (dfCoefMaps == null ? (dfCoefMaps = QS.getNewDfCoefMap()) : dfCoefMaps); @@ -180,6 +181,15 @@ return tag; } + /** + * Only for 5D, 10F, 15G designations. + * Each time this method is run through, additional changes are made + * in the orbital count. So only the final reading is significant. + * + * @param typeOld + * @param typeNew + * @return the number of coefficients overall, for all orbital types + */ protected int fixSlaterTypes(int typeOld, int typeNew) { // Molden reader, QchemReader // in certain cases we assume Cartesian and then later have to @@ -194,6 +204,7 @@ int m = getDfCoefMaps()[slater[1]].length; nCoef += m; } + haveCoefs = true; return nCoef; } Modified: trunk/Jmol/src/org/jmol/adapter/readers/quantum/MoldenReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/quantum/MoldenReader.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/adapter/readers/quantum/MoldenReader.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -277,6 +277,11 @@ slater[1] = type; slater[2] = gaussianPtr + 1; slater[3] = nPrimitives; + int n = getDfCoefMaps()[type].length; + if (!haveCoefs) { + System.out.println(this.nCoef + " adding " + n + " coefficients type " + BasisFunctionReader.getQuantumShellTag(type) + " for atom " + atomIndex); + nCoef += n; + } for (int ip = nPrimitives; --ip >= 0;) { // Read ip primitives, each containing an exponent and one (s,p,d,f) // or two (sp) contraction coefficient(s) Modified: trunk/Jmol/src/org/jmol/api/SymmetryInterface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/SymmetryInterface.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/api/SymmetryInterface.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -287,7 +287,7 @@ */ SymmetryInterface setViewer(Viewer vwr); - M4 staticGetMatrixTransform(Viewer viewer, String cleg); + M4 staticGetMatrixTransform(String cleg); - String staticTransformSpaceGroup(Viewer viewer, BS bs, String cleg, Object paramsOrUC, SB sb); + String staticTransformSpaceGroup(BS bs, String cleg, Object paramsOrUC, SB sb); } Modified: trunk/Jmol/src/org/jmol/render/MeasuresRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/MeasuresRenderer.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/render/MeasuresRenderer.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -175,7 +175,7 @@ } else { mad = (short) m.mad; dotsOrDashes = true; - dashDots = (m.text.pymolOffset != null ? + dashDots = (m.text != null && m.text.pymolOffset != null ? pymoldashes : mad < 0 ? null : ndots); } Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -6837,9 +6837,7 @@ invArg(); type = sym.getClegId(); } else { - if (tokAt(i + 1) == T.colon) { - type = concatString(i, "packed"); - } + type = concatString(i, "packed"); if (type.length() > 0 && type.indexOf(":") < 0 && type.indexOf(">") < 0 && (type.indexOf(",") > 0 || "rh".indexOf(type) >= 0)) { // allow for MODELKIT SPACEGROUP "a,b,2c" @@ -7086,12 +7084,13 @@ private String assignSpaceGroup(BS bs, String cleg, Object paramsOrUC, boolean isPacked, boolean doDraw, String cmd) { SB sb = new SB(); - String ret = vwr.getSymStatic().staticTransformSpaceGroup(vwr, bs, cleg, paramsOrUC, sb); - String msg = sb.toString(); - boolean isError = msg.endsWith("!"); - if (!isError && (isPacked || doDraw)) + String ret = vwr.getSymStatic().staticTransformSpaceGroup(bs, cleg, paramsOrUC, sb); + boolean isError = ret.endsWith("!"); + if (isError) + return ret; + if (isPacked || doDraw) vwr.getModelkit(false).cmdAssignSpaceGroup(ret, sb, cmd, isPacked, doDraw); - return msg; + return sb.toString(); } } Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -260,6 +260,9 @@ // matrix([.................]) // matrix([,,][,,][,,]) // matrix([,,,][,,,][,,,][,,,]) + // matrix([[,,][,,][,,]]) + // matrix([[,,,][,,,][,,,][,,,]]) + // matrix([[,,][,,][,,]]) // any of 4x4 with "abc" or "xyz" // matrix("!b,c,a>a-c,b,2c;0,0,1/2>a,-a-c,b") // matrix("13>>15>>14>>2") @@ -287,7 +290,7 @@ case T.string: String s = (String) args[0].value; if (!s.equals("h") && !s.equals("r") && (s.indexOf(">") >= 0 || s.indexOf(",") < 0 || s.indexOf(":") > 0 )) { - m4 = vwr.getSymStatic().staticGetMatrixTransform(vwr, s); + m4 = vwr.getSymStatic().staticGetMatrixTransform(s); } else { m4 = (M4) vwr.getSymTemp().convertTransform(s, null); } @@ -363,6 +366,8 @@ private boolean evaluateSpacegroup(ScriptMathProcessor mp, SV[] args) { // spacegroup(); + // spacegroup("list") + // spacegroup(10, "list") // spacegroup("setting") // spacegroup(3); // spacegroup("133:2") // this name @@ -398,7 +403,8 @@ // * // spacegroup("all"); - float[] unitCellParams = null; + float[] ucParams = null; + Object params = null; int n = args.length; if (n == 0) return mp.addXObj(vwr.getSymTemp().getSpaceGroupInfo(vwr.ms, null, @@ -406,7 +412,9 @@ String mode = (args[args.length - 1].tok == T.string ? (String) args[args.length - 1].value : null); boolean isSettings = "settings".equalsIgnoreCase(mode); - boolean isSubgroups = (n > 1 && (n != 2 || !"settings".equalsIgnoreCase(mode))); + boolean isSubgroups = (n > 1 && (n != 2 + || !"settings".equalsIgnoreCase(mode) && !"list".equalsIgnoreCase(mode)) + ); String xyzList = args[0].asString(); if (isSubgroups || "subgroups".equals(mode)) { SymmetryInterface sym; @@ -457,12 +465,18 @@ default: return false; case 2: + if ("list".equals(mode)) { + params = Integer.valueOf((String) vwr.getSymTemp().getSpaceGroupInfoObj( + "itaNumber", xyzList, false, false)); + xyzList = "list"; + break; + } if (args[1].tok != T.string) { - unitCellParams = SV.flistValue(args[1], 0); - if (unitCellParams == null || unitCellParams.length != 6) + ucParams = SV.flistValue(args[1], 0); + if (ucParams == null || ucParams.length != 6) return false; // set excess params to NaN; does not set slop - unitCellParams = SimpleUnitCell.newParams(unitCellParams, Float.NaN); + params = ucParams = SimpleUnitCell.newParams(ucParams, Float.NaN); } //$FALL-THROUGH$ case 1: @@ -478,18 +492,15 @@ return mp.addXObj(vwr.getSymTemp().getSpaceGroupJSON(vwr, "AFLOW", xyzList.substring(6), 0)); } - if (xyzList.startsWith("Hall:") || xyzList.indexOf("x") >= 0 - || unitCellParams != null) { + if (xyzList.startsWith("Hall:") || xyzList.indexOf("x") >= 0 || ucParams != null) { return mp.addXObj(vwr.findSpaceGroup(null, null, xyzList, - unitCellParams, null, null, JC.SG_AS_STRING)); + ucParams, null, null, JC.SG_AS_STRING)); } - if (itaNo > 0 || !xyzList.endsWith(":") && !Float.isNaN(PT.parseFloat(xyzList))) + if (itaNo > 0 || !xyzList.endsWith(":") && !Double.isNaN(PT.parseFloat(xyzList))) xyzList = "ITA/" + xyzList; if ("setting".equalsIgnoreCase(xyzList)) { SymmetryInterface sym = vwr.getOperativeSymmetry(); - return mp.addXObj(sym == null ? null - : sym.getSpaceGroupJSON(vwr, "settings", null, - Integer.MIN_VALUE)); + return mp.addXObj(sym == null ? null : sym.getSpaceGroupJSON(vwr, "settings", null, Integer.MIN_VALUE)); } // spacegroup("x,y,z;-x,-y,-z;...") // spacegroup("132:2") @@ -503,15 +514,16 @@ if (atoms != null) { // undocumented first parameter atoms return mp.addXObj(vwr.findSpaceGroup(null, atoms, null, - unitCellParams, null, null, JC.SG_AS_STRING)); + ucParams, null, null, JC.SG_AS_STRING)); } } break; } - return mp.addXObj(vwr.getSymTemp().getSpaceGroupInfoObj(xyzList, - unitCellParams, true, false)); + return mp.addXObj(vwr.getSymStatic().getSpaceGroupInfoObj( + xyzList, params, true, false)); } + @SuppressWarnings("unchecked") private boolean evaluatePointGroup(ScriptMathProcessor mp, SV[] args, boolean isAtomProperty) Modified: trunk/Jmol/src/org/jmol/symmetry/CLEG.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/CLEG.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/symmetry/CLEG.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -157,8 +157,22 @@ System.out.println("cleg? setprev " + node); return prevNode = node; } - } + public String addPrimitiveTransform(String myIta, String myTrm) { + String hmName = (String) sym.getSpaceGroupInfoObj("hmName", myIta + ":" + myTrm, + false, false); + if (hmName == null) + return myTrm; + char c = hmName.charAt(0); + if ("ABCFI".indexOf(c) < 0) + return myTrm; + M4 t = M4.newMV(UnitCell.getPrimitiveTransform(c), P3.new3(0,0,0)); + sym.convertTransform(myTrm, trTemp); + t.mul(trTemp); + return abcFor(t); + } +} + public static class ClegNode { public final static String TYPE_REFERENCE = "ref"; @@ -221,10 +235,13 @@ // } // private void init(ClegData data, String name) { - int pt; + int pt; if (name.equals(TYPE_REFERENCE)) { isThisModelCalc = true; } + boolean isPrimitive = name.endsWith(":p"); + if (isPrimitive) + name = name.substring(0, name.length() - 2); boolean isITAnDotm = name.startsWith("ITA/"); if (isITAnDotm) { // ITA/140 or ITA/140.2 @@ -301,7 +318,10 @@ data.errString = "Could not get ITA space group for " + name + "!"; return; } - setITAName(); + if (isPrimitive) { + myTrm = data.addPrimitiveTransform(myIta, myTrm); + } + setITAName(); } public String setITAName() { @@ -417,11 +437,13 @@ } t = CLEG.cleanCleg000(t); if (t.endsWith(":h")) { - t = t.substring(0, t.length() - 2); + if (!t.startsWith("R")) + t = t.substring(0, t.length() - 2); } else if (!isEnd && t.endsWith(":" + HEX_TO_RHOMB)) { //don't do this t = t.substring(0, t.lastIndexOf(":")) + ":r"; } else if (t.endsWith(":r")) { - t = t.substring(0, t.length() - 1) + HEX_TO_RHOMB; + if (!t.startsWith("R")) + t = t.substring(0, t.length() - 1) + HEX_TO_RHOMB; } else if (t.equals("r")) { t = HEX_TO_RHOMB; } else if (t.equals("h")) { @@ -892,13 +914,9 @@ // check for a zap if (!asgParams.mkCalcOnly && !isTransformOnly && zapped - && !node.isDefaultSetting() - && (CLEG.isTransform(token, true) || (pt = token.indexOf('.')) > 0)) { + && !node.isDefaultSetting()) { // modelkit zap spacegroup nnn.m or nnn:ttttt // What about non-reference H-M?? - // no unit cell -- force new reference? - if (pt < 0) - return "error in CLEG syntax: " + token + "!"; - String ita = token.substring(0, pt); + String ita = node.myIta; // easiest is to restart with the default configuration and unit cell // modelkit zap spacegroup ita .... String[] cleg = new String[] { ita }; Modified: trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -3476,6 +3476,10 @@ return (hmName != null ? HMtoCleg.get(PT.rep(hmName, " ","")) : ClegtoHM.get(cleg)); } + public String getHMName() { + return hmSymbol; + } + static { getSpaceGroups(); } Modified: trunk/Jmol/src/org/jmol/symmetry/Symmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -191,7 +191,8 @@ boolean isNorT = false; switch (name) { case "list": - return getSpaceGroupList((Viewer) params); + // from spacegroup(n, "list") + return getSpaceGroupList((Integer) params); case "opsCtr": return spaceGroup.getOpsCtr((String) params); case "itaTransform": @@ -200,6 +201,7 @@ //$FALL-THROUGH$ case "nameToXYZList": case "itaIndex": + case "hmName": SpaceGroup sg = null; if (params != null) { String s = (String) params; @@ -221,6 +223,8 @@ sg = symmetryInfo.getDerivedSpaceGroup(); } switch (sg == null ? "" : name) { + case "hmName": + return sg.getHMName(); case "nameToXYZList": Lst<Object> genPos = new Lst<Object>(); sg.setFinalOperations(); @@ -243,13 +247,15 @@ } @SuppressWarnings("unchecked") - private String getSpaceGroupList(Viewer vwr) { + private String getSpaceGroupList(Integer sg0) { SB sb = new SB(); Lst<Object> list = (Lst<Object>) getSpaceGroupJSON(vwr, "ITA", "ALL", 0); for (int i = 0, n = list.size(); i < n; i++) { Map<String, Object> map = (Map<String, Object>) list.get(i); - sb.appendO(map.get("sg")).appendC('.').appendO(map.get("set")) - .appendC('\t').appendO(map.get("hm")).appendC('\t').appendO(map.get("sg")).appendC(':').appendO(map.get("trm")).appendC('\n'); + Integer sg = (Integer) map.get("sg"); + if (sg0 == null || sg.equals(sg0)) + sb.appendO(sg).appendC('.').appendO(map.get("set")) + .appendC('\t').appendO(map.get("hm")).appendC('\t').appendO(map.get("sg")).appendC(':').appendO(map.get("trm")).appendC('\n'); } return sb.toString(); } @@ -1634,13 +1640,13 @@ @Override - public M4 staticGetMatrixTransform(Viewer vwr, String cleg) { + public M4 staticGetMatrixTransform(String cleg) { return getCLEGInstance().getMatrixTransform(vwr, cleg); } @Override - public String staticTransformSpaceGroup(Viewer vwr, BS bs, String cleg, + public String staticTransformSpaceGroup(BS bs, String cleg, Object paramsOrUC, SB sb) { return getCLEGInstance().transformSpaceGroup(vwr, bs, cleg, paramsOrUC, sb); } @@ -1657,7 +1663,7 @@ private Viewer vwr = null; /** - * for the vwr.getSymTemp() only + * for the vwr.getSymStatic() only * * @param vwr */ Modified: trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -120,7 +120,7 @@ case TYPE_INVERSION: return "Inv" + op48(opPoint); case TYPE_REFLECTION: - return (opMode == OP_MODE_POSITION_ONLY ? "" : "Plane") + opPlane; + return (opMode == OP_MODE_POSITION_ONLY ? "" : "Plane") + opRound(opPlane); case TYPE_SCREW_ROTATION: return (opMode == OP_MODE_POSITION_ONLY ? "S" + op48(opPoint) + op48(opAxis) : "Screw" + opOrder + op48(opPoint) + op48(opAxis) + op48(opTrans) + opIsCCW); @@ -133,6 +133,14 @@ System.out.println("SymmetryOperation REJECTED TYPE FOR " + this); return ""; } + + private String opRound(P4 p) { + return Math.round(p.x * 1000) + + "," + Math.round(p.y * 1000) + + "," + Math.round(p.z * 1000) + + "," + Math.round(p.w * 1000) + ; + } String getOpTitle() { if (opType == TYPE_UNKNOWN) @@ -1588,7 +1596,6 @@ if (opTrans.z == 0 && opTrans.lengthSquared() == 1.25f) { // SG 177 -x+y+2,y+1,-z+2 dmax = 1.25f; -// System.out.println("SO opLong " + opTrans + " " + getXYZFromMatrix(this, false, false, false)); opIsLong = true; } } @@ -1698,9 +1705,7 @@ private static boolean checkOpPlane(P3 p1, P3 p2, P3 p3, P4 plane, V3 vtemp1, V3 vtemp2) { // just check all 8 cell points for directed distance to the plane // any mix of + and - and 0 is OK; all + or all - is a fail - Measure.getPlaneThroughPoints(p1, p2, p3, vtemp1, vtemp2, plane); - //System.out.println( "draw plane " + p1 + p2 + p3 + "//" + v + vtemp1 + vtemp2); - + Measure.getPlaneThroughPoints(p1, p2, p3, vtemp1, vtemp2, plane); P3[] pts = BoxInfo.unitCubePoints; int nPos = 0; int nNeg = 0; @@ -1768,10 +1773,12 @@ V3 t = new V3(); SymmetryOperation opTemp = null; - // from -2 to 2, starting with + so that we get the + version - for (int i = 3; --i >= -3;) { - for (int j = 3; --j >= -3;) { - for (int k = 3; --k >= -3;) { + // originally from -2 to 2, starting with + so that we get the + version + // but for "225:1/2b+1/2c,1/2a+1/2c,1/2a+1/2b" we need higher. + // and needed =2 to 4 to catch all the elemens + for (int i = 5; --i >= -2;) { + for (int j = 5; --j >= -2;) { + for (int k = 5; --k >= -2;) { if (opTemp == null) opTemp = new SymmetryOperation(null, 0, false); t.set(i, j, k); Modified: trunk/Jmol/src/org/jmol/symmetry/UnitCell.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/UnitCell.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/symmetry/UnitCell.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -39,6 +39,7 @@ import javajs.util.AU; import javajs.util.Lst; import javajs.util.M3; +import javajs.util.M3; import javajs.util.M4; import javajs.util.P3; import javajs.util.P4; @@ -748,7 +749,7 @@ * @param uc * generally this or null * @param def - * String "abc;offset" or M3d or M4d to origin; if String, can be + * String "abc;offset" or M3 or M4d to origin; if String, can be * preceded by ! for "reverse of". For example, * "!a-b,-5a-5b,-c;7/8,0,1/8" offset is optional, and can be a * definition such as "a=3.40,b=4.30,c=5.02,alpha=90,beta=90,gamma=129" @@ -1128,28 +1129,14 @@ return true; case 'P': toPrimitive = true; - mf = M3.newA9(new float[] { 1, 0, 0, 0, 1, 0, 0, 0, 1 }); - break; + //$FALL-THROUGH$ case 'A': - mf = M3.newA9(new float[] { 1, 0, 0, 0, 0.5f, 0.5f, 0, -0.5f, 0.5f }); - break; case 'B': - mf = M3.newA9(new float[] { 0.5f, 0, 0.5f, 0, 1, 0, -0.5f, 0, 0.5f }); - break; case 'C': - mf = M3.newA9(new float[] { 0.5f, 0.5f, 0, -0.5f, 0.5f, 0, 0, 0, 1 }); - break; case 'R': - mf = M3.newA9(new float[] { 2 / 3f, -1 / 3f, -1 / 3f, 1 / 3f, 1 / 3f, - -2 / 3f, 1 / 3f, 1 / 3f, 1 / 3f }); - break; case 'I': - mf = M3.newA9( - new float[] { -.5f, .5f, .5f, .5f, -.5f, .5f, .5f, .5f, -.5f }); - break; case 'F': - mf = M3 - .newA9(new float[] { 0, 0.5f, 0.5f, 0.5f, 0, 0.5f, 0.5f, 0.5f, 0 }); + mf = getPrimitiveTransform(type); break; } if (!toPrimitive) @@ -1170,6 +1157,28 @@ return true; } + static M3 getPrimitiveTransform(char type) { + switch (type) { + case 'P': + return M3.newA9(new float[] { 1, 0, 0, 0, 1, 0, 0, 0, 1 }); + case 'A': + return M3.newA9(new float[] { 1, 0, 0, 0, 0.5f, 0.5f, 0, -0.5f, 0.5f }); + case 'B': + return M3.newA9(new float[] { 0.5f, 0, 0.5f, 0, 1, 0, -0.5f, 0, 0.5f }); + case 'C': + return M3.newA9(new float[] { 0.5f, 0.5f, 0, -0.5f, 0.5f, 0, 0, 0, 1 }); + case 'R': + return M3.newA9(new float[] { 2 / 3f, -1 / 3f, -1 / 3f, 1 / 3f, 1 / 3f, + -2 / 3f, 1 / 3f, 1 / 3f, 1 / 3f }); + case 'I': + return M3.newA9( + new float[] { -.5f, .5f, .5f, .5f, -.5f, .5f, .5f, .5f, -.5f }); + case 'F': + return M3 + .newA9(new float[] { 0, 0.5f, 0.5f, 0.5f, 0, 0.5f, 0.5f, 0.5f, 0 }); + } + return null; + } /** * when offset is null, use the current cell, otherwise use the original unit cell Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -2039,7 +2039,7 @@ switch (bondPickingMode) { case PICKING_ASSIGN_BOND: vwr.undoMoveActionClear(-1, T.save, true); - vwr.setModelkitPropertySafely(JC.MODELKIT_ASSIGN_BOND, Integer.valueOf(index)); + vwr.getModelkit(false).setProperty(JC.MODELKIT_ASSIGN_BOND, Integer.valueOf(index)); break; case PICKING_ROTATE_BOND: // done separately Modified: trunk/Jmol/src/org/jmol/viewer/JC.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JC.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/viewer/JC.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -970,8 +970,8 @@ public static final String MODELKIT_UDPATE_KEY_STATE = "updatekeysfromstate"; public static final String MODELKIT_UPDATE_MODEL_KEYS = "updatemodelkeys"; public static final String MODELKIT_UPDATE_ATOM_KEYS = "updateatomkeys"; - public static final String MODELKIT_ASSIGN_BOND = "assignBond"; - public static final String MODELKIT_ROTATE_BOND_ATOM_INDEX = "rotateBond"; + public static final String MODELKIT_ASSIGN_BOND = "assignbond"; + public static final String MODELKIT_ROTATE_BOND_ATOM_INDEX = "rotatebond"; public static final String MODELKIT_BRANCH_ATOM_PICKED = "branchatomclicked"; public static final String MODELKIT_BRANCH_ATOM_DRAGGED = "branchatomdragged"; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-09-14 17:17:54 UTC (rev 22633) @@ -54,8 +54,71 @@ # FEATURE REQUEST: dock/undock consoles to main window. # TODO: allow FIXED to work with MODELKIT MINIMIZE -Jmol.___JmolVersion="16.2.27" // (legacy) also 16.2.28 (swingJS) +Jmol.___JmolVersion="16.2.29" // (legacy) also 16.2.30 (swingJS) +development note: {workspace}/test/scripts/16.2.spt cumulative for 16.2 (starting with 16.2.27!) + +bug fix: MOLDEN reader not counting coefficients in some cases + +bug fix: set picking rotateBond, assignBond not working + +bug fix: modelkit zap spacegroup "P 2/m 1 1" does not create compatible unit cell + -- nonstandard Hermann-Mauguin name + -- 10.3 OK, but P 2/m 1 1 fails + +bug fix: modelkit spacegroup not returning error message + -- should report errors in syntax or space group names + +bug fix: modelkit spacegroup "R...:r" fails + -- :r here is not an abbreviation, just Hermann-Mauguin name part + +bug fix: modelkit draw spacegroup may miss some symmetry elements + -- particularly for rhombohedral settings of cubic groups + -- for example: + + modelkit draw spacegroup 225:1/2b+1/2c,1/2a+1/2c,1/2a+1/2b + draw * off; draw *bar_4* on + + should show eleven complete rosettes + + +new feature: modelkit spacegroup "225:p" + -- ":p" specially for Jmol "primitive" + -- many settings not found in the International Tables + -- example: + + modelkit zap spacegroup "225:p" + print spacegroup().operations.count + + 48 + +new feature: CASTEP reader adds filer "NOSYM" to skip symmetry generation + +new feature: spacegroup("list") + -- displays a multiline string listing of all Jmol space group settings + -- form: + + 10.1 P 1 2/m 1 10:a,b,c + +new feature: spacegroup(n, "list") + -- displays a multiline string listing of name info for the specified space group number + -- for example: + + print spacegroup(10) + + 10.1 P 1 2/m 1 10:a,b,c + 10.2 P 1 1 2/m 10:c,a,b + 10.3 P 2/m 1 1 10:b,c,a + +new feature: modelkit spacegroup xxx:p + -- special ":p" extension for IT numbers (10 or 10.3) or HM names + -- "primitive" + -- attaches the matrix to the primive for centered cells (A,B,C,F,I). + +# all 58 16.2 tests passing + +JmolVersion="16.2.27" // (legacy) also 16.2.28 (swingJS) + new feature: spacegroup() method accepts Hermann-Mauguin names for subgroups: print spacegroup("P2/m", "subgroups") print spacegroup("P2/m", "subgroups").subgroups.select("(subgroupHM)").format("JSON") Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2024-09-14 17:17:54 UTC (rev 22633) @@ -10551,7 +10551,7 @@ * @return org.jmol.symmetry.Symmetry object */ public SymmetryInterface getSymStatic() { - return (symStatic == null ? (symStatic = Interface.getSymmetry(this, "ms")) : symStatic); + return (symStatic == null ? (symStatic = Interface.getSymmetry(this, "ms")).setViewer(this) : symStatic); } public void setWindowDimensions(float[] dims) { Modified: trunk/Jmol/test/scripts/16.2.28.spt =================================================================== --- trunk/Jmol/test/scripts/16.2.28.spt 2024-09-07 02:43:08 UTC (rev 22632) +++ trunk/Jmol/test/scripts/16.2.28.spt 2024-09-14 17:17:54 UTC (rev 22633) @@ -10,9 +10,23 @@ } } + print "test 16.2.28" -// BH 2024.09.05 passes all 45 tests +// BH 2024.09.05 passes all 49 tests +modelkit zap spacegroup "[-C 2c 2]" +test (spacegroup().spaceGroupInfo.hm "C m c m"); + +modelkit zap spacegroup "[-C 2c 2]:a,-c,b" +test (spacegroup().spaceGroupInfo.hm "B m m b"); + + +load =aflowlib/128 +test(matrix(">>128.2", "abc"), "a-b,a+b,c") + +test(matrix("227.2>>227.1", "abc"), "a,b,c;1/8,1/8,1/8") + + var CASTEPcell = "%block lattice_abc\n" + " 3.92*sqrt(3)/2 3.92*sqrt(3)/2 3.92*sqrt(3)/2\n" + " 109.47 109.47 109.47\n" + @@ -34,6 +48,34 @@ test spacegroup().spaceGroupName "166:r HM:R -3 m :r #166:2/3a+1/3b+1/3c,-1/3a+1/3b+1/3c,-1/3a-2/3b+1/3c" +load DATA "CASTEP2" +%block lattice_cart +2.6954645 2.6954645 0.0 +2.6954645 0.0 2.6954645 +0.0 2.6954645 2.6954645 +%endblock lattice_cart + +%block positions_frac +Si 0.00 0.00 0.00 +Si 0.25 0.25 0.25 +%endblock positions_frac + +%block species_pot +Si C9 +%endblock species_pot + +%BLOCK KPOINTS_LIST +-0.250000 -0.250000 -0.250000 0.2500000 +-0.250000 0.250000 0.250000 0.7500000 +%ENDBLOCK KPOINTS_LIST + +symmetry_generate +END "CASTEP2" filter "NOSYM" +unitcell "!1/2b+1/2c,1/2a+1/2c,1/2a+1/2b" +modelkit spacegroup 227.2 packed +connect +print symop().count + load =aflowlib/146.1 MODELKIT SPACEGROUP >r> PACKED test({*}.length, 13) @@ -109,28 +151,28 @@ modelkit zap spacegroup "146:r" test symop().count 3 modelkit spacegroup "146:r>h>146:h" -test symop(9,"label") "3(-) (0 0 2/3) screw axis" +test symop(8,"label") "3(+) (0 0 2/3) screw axis" modelkit zap spacegroup "146:r" test symop().count 3 modelkit spacegroup "146:r>>146:h" -test symop(9,"label") "3(-) (0 0 2/3) screw axis" +test symop(7,"label") "translation: 1/3 2/3 2/3" modelkit zap spacegroup "146:r" test symop().count 3 modelkit spacegroup ">h>146:h" -test symop(9,"label") "3(-) (0 0 2/3) screw axis" +test symop(6,"label") "3(-) (0 0 1/3) screw axis" modelkit zap spacegroup "146:r" test symop().count 3 modelkit spacegroup ">>146:h" -test symop(9,"label") "3(-) (0 0 2/3) screw axis" +test symop(5,"label") "3(+) (0 0 1/3) screw axis" modelkit zap SPACEGROUP 146:r test unitcell()[2].length/unitcell()[3].length,1 -modelkit spacegroup "Cmmb" +modelkit zap spacegroup "Cmmb" test spacegroup().spaceGroupInfo.clegId "67:b,a,-c" test spacegroup().spaceGroupInfo.hm "C m m b" @@ -225,4 +267,5 @@ draw sp2 spacegroup all test symop().count 8 +print "test 16.2.28 complete" Added: trunk/Jmol/test/scripts/16.2.spt =================================================================== --- trunk/Jmol/test/scripts/16.2.spt (rev 0) +++ trunk/Jmol/test/scripts/16.2.spt 2024-09-14 17:17:54 UTC (rev 22633) @@ -0,0 +1,300 @@ +ntest = 0 +function test(a,b) { + if (a != b) { + print a; + print b; + print "FAILED" + exit + } else { + print "OK " + (++ntest) + " " + b + } +} + +print "test 16.2.30" + +modelkit zap spacegroup "225:p" +test (spacegroup().operations.count, 48) + +modelkit zap spacegroup "[-C 2c 2]:p" +test (spacegroup().operations.count, 8) + +modelkit zap spacegroup "[-C 2c 2]" +test (spacegroup().spaceGroupInfo.hm "C m c m"); + +modelkit zap spacegroup "[-C 2c 2]:a,-c,b" +test (spacegroup().spaceGroupInfo.hm "B m m b"); + +test(matrix("15.16:p>>15.16" "abc"), "a+b,-a+b,c") + +test(spacegroup(10,"list").lines.count,3) + +modelkit zap spacegroup "P 2/m 1 1"; +test(_M.unitCellParams[4]/100, 1) + +try { + modelkit zap spacegroup 10.57 + test "is OK" "shouldn't be here" +} catch(e) { + test(e.lines[1],"invalid argument: Unknown ITA setting: 10.57!") +} + +print "test 16.2.28" +// BH 2024.09.05 passes all 49 tests + +modelkit zap spacegroup "[-C 2c 2]" +test (spacegroup().spaceGroupInfo.hm "C m c m"); + +modelkit zap spacegroup "[-C 2c 2]:a,-c,b" +test (spacegroup().spaceGroupInfo.hm "B m m b"); + + +load =aflowlib/128 +test(matrix(">>128.2", "abc"), "a-b,a+b,c") + +test(matrix("227.2>>227.1", "abc"), "a,b,c;1/8,1/8,1/8") + + +var CASTEPcell = "%block lattice_abc\n" + + " 3.92*sqrt(3)/2 3.92*sqrt(3)/2 3.92*sqrt(3)/2\n" + + " 109.47 109.47 109.47\n" + + "%endblock lattice_abc\n" + + "\n" + + "%block positions_frac\n" + + " Pb 0.0 0.0 0.0\n" + + "%endblock positions_frac\n" + + "\n" + + "%block species_pot\n" + + "Pb Pb_OTF-saved.uspso\n" + + "%endblock species_pot\n" + + "\n" + + "kpoint_mp_grid 4 4 4\n" + + "\n" + + "symmetry_generate" + +load inline @CASTEPcell packed +test spacegroup().spaceGroupName "166:r HM:R -3 m :r #166:2/3a+1/3b+1/3c,-1/3a+1/3b+1/3c,-1/3a-2/3b+1/3c" + + +load DATA "CASTEP2" +%block lattice_cart +2.6954645 2.6954645 0.0 +2.6954645 0.0 2.6954645 +0.0 2.6954645 2.6954645 +%endblock lattice_cart + +%block positions_frac +Si 0.00 0.00 0.00 +Si 0.25 0.25 0.25 +%endblock positions_frac + +%block species_pot +Si C9 +%endblock species_pot + +%BLOCK KPOINTS_LIST +-0.250000 -0.250000 -0.250000 0.2500000 +-0.250000 0.250000 0.250000 0.7500000 +%ENDBLOCK KPOINTS_LIST + +symmetry_generate +END "CASTEP2" filter "NOSYM" +unitcell "!1/2b+1/2c,1/2a+1/2c,1/2a+1/2b" +modelkit spacegroup 227.2 packed +connect +print symop().count + +load =aflowlib/146.1 +MODELKIT SPACEGROUP >r> PACKED +test({*}.length, 13) + +modelkit zap spacegroup 10.2 +u2= unitcell()[3] +modelkit spacegroup 10.1 +u1 = unitcell()[2] +test u1 u2 + +modelkit zap spacegroup 10.1 +u1 = unitcell()[2] +modelkit spacegroup 10.2 +u2= unitcell()[3] +test u1 u2 + + +test(spacegroup("P2/m", "subgroups").subgroups.select("(subgroupHM)"), [ "P-1","P2","Pm","P2/m","P2/m","P21/m","C2/m","P2/c" ]) +test(spacegroup("P2/m", "P2/c")[1].trms.select("(trm)"), +[ "a-c,b,2c;0,0,1/2","a-c,b,2c","-2a-c,b,2a;1/2,0,0","-2a-c,b,2a","a,b,2c;0,0,1/2","a,b,2c" ]) + +test(point("(1/2,1/4,1/8)"), {0.5 0.25 0.125}) +test(point("(cos(60)/cos(60),sin(60)/sin(60),sqrt(2)/sqrt(2))"), {1,1,1}) + +modelkit zap spacegroup 30 +test([symop(1,"xyz"), symop(2,"xyz"), symop(3,"xyz")], symop([symop(1), symop(2), symop(3)], "xyz")) + +test(matrix("A2/m"), matrix([ + [-1.0 0.0 1.0 0.0] + [0.0 1.0 0.0 0.0] + [-1.0 0.0 0.0 0.0] + [0.0 0.0 0.0 1.0] ])) + + +test(spacegroup(10.2).hm, "P 1 1 2/m") +test(spacegroup(15).n, 18) + +test matrix("P2/m>>P112/m"), matrix([ + [0.0 1.0 0.0 0.0] + [0.0 0.0 1.0 0.0] + [1.0 0.0 0.0 0.0] + [0.0 0.0 0.0 1.0] ]) + + + +test(matrix("13>>15>>14>>2").format("abc"), "a,b,c;1,1,0") + +test matrix("r").format("abc") "2/3a+1/3b+1/3c,-1/3a+1/3b+1/3c,-1/3a-2/3b+1/3c" +test matrix("h").format("abc") "a-b,b-c,a+b+c" +modelkit spacegroup 10 +test symop(4).format("xyz") "x,-y,z" + +modelkit zap spacegroup "146:r" +test symop().count 3 +modelkit spacegroup "146:r>>146:h" +test symop(9,"label") "3(-) (0 0 2/3) screw axis" + +modelkit zap spacegroup "146:h" +modelkit spacegroup "146:h>>146:r" +test symop().count 3 +test symop(3,"label") "3(-) axis" + +modelkit zap spacegroup "146:h" +modelkit spacegroup "146:h>r>146:r" +test symop().count 3 +test symop(2,"label") "3(+) axis" + +modelkit zap spacegroup "146:r" +test symop().count 3 +modelkit spacegroup "146:r>>146:h" +test symop(9,"label") "3(-) (0 0 2/3) screw axis" + +modelkit zap spacegroup "146:r" +test symop().count 3 +modelkit spacegroup "146:r>h>146:h" +test symop(8,"label") "3(+) (0 0 2/3) screw axis" + +modelkit zap spacegroup "146:r" +test symop().count 3 +modelkit spacegroup "146:r>>146:h" +test symop(7,"label") "translation: 1/3 2/3 2/3" + +modelkit zap spacegroup "146:r" +test symop().count 3 +modelkit spacegroup ">h>146:h" +test symop(6,"label") "3(-) (0 0 1/3) screw axis" + +modelkit zap spacegroup "146:r" +test symop().count 3 +modelkit spacegroup ">>146:h" +test symop(5,"label") "3(+) (0 0 1/3) screw axis" + + +modelkit zap SPACEGROUP 146:r +test unitcell()[2].length/unitcell()[3].length,1 + +modelkit zap spacegroup "Cmmb" +test spacegroup().spaceGroupInfo.clegId "67:b,a,-c" +test spacegroup().spaceGroupInfo.hm "C m m b" + + + +load $2-butanol +@2.property_atomclass=2 +@3.property_atomclass=3 +@5.property_atomclass=5 +test({*}.find("smiles/open"), "C[C@H:2]([OH:5])[CH2:3]C") +test({*}.find("smiles", "C[C@H:2]([OH:5])[CH2:3]C"),({0:14})) +test({*}.find("smiles", "C[C@H:2]([OH:5])[CH2:6]C"),({})) + + + +load =aflowlib/146.1 +MODELKIT SPACEGROUP 146>>146:r PACKED +test({*}.length, 13) + + + +load =aflowlib/146.1 +MODELKIT SPACEGROUP >r> PACKED +test({*}.length, 13) + + +/* + * show subgroup chain using BCS format + * + * for example: + * + * showsubs("C2/c > P21/c > P21") + * + * showsubs([13 15 14 2]) + */ +function showsubs(chain) { + save orientation o; + draw * delete; + // chain = "C2/c > P21/c > P21" + var colors = ["red", "orange", "yellow", "green", "blue", "violet" ]; + if (chain.type == "array") + chain = chain.join(">"); + var groups = chain.replace(" ","").replace(">>",">").split(">"); + + var drawIDs = []; + for (var i = 1; i<= groups.length; i++) { + var sg = groups[i]; + if (i == 1) { + print sg; + modelkit zap spacegroup @sg; + } else { + print ">>" + sg; + modelkit spacegroup @{">>" + sg}; + } + restore orientation o + var dsg = "sg"+sg + "_"; + drawIDs.push(dsg); + draw ID @{"uc"+sg + "_"} unitcell color @{colors[((i-1)%6)+1]} @sg; + draw ID @dsg spacegroup all; + draw ID @{dsg + "*"} off; + delay 2 + } + set echo bottom left; + for (var i = drawIDS.length; i > 0; --i) { + draw sg* off; + draw ID @{drawIDs[i] + "*"} on; + echo @{groups[i]} + delay 2; + } + draw ID * on; + echo @chain; + restore orientation o; + } + + //showsubs([13 15 14 2]) + showsubs("C2/c > P21/c > P21") + +modelkit zap spacegroup "P21/c" +draw uc unitcell +draw sp1 spacegroup all +test symop().count 4 +modelkit spacegroup "P21/c >super> C2/c" +draw sp2 spacegroup all +test symop().count 8 + + +modelkit zap spacegroup "P21/c" +draw uc unitcell +draw sp1 spacegroup all +test symop().count 4 +modelkit spacegroup "P21/c << C2/c" +draw sp2 spacegroup all +test symop().count 8 + +print "test 16.2.28 complete" +print "test 16.2.30 complete" +print "DONE " + ntest + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-08-06 13:08:53
|
Revision: 22629 http://sourceforge.net/p/jmol/code/22629 Author: hansonr Date: 2024-08-06 13:08:14 +0000 (Tue, 06 Aug 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.23" // (legacy) also 16.2.24 (swingJS) bug fix: CALCULATE STRUTS fails for $LOAD =4mwb -- singleton MET amino acid as ligand was not handled bug fix: CIFReader should read atomName from _jmol_atom_name block -- _jmol_atom_name is created by WRITE CIF bug fix: SHELXReader support for space-starting comment lines new feature: atom property translucent -- 0.0 to 1.0, with 0 being opaque and 1 being transparent -- for example, select translucent = 0.5; select translucent > 0 new feature: atom.property_part -- the SHELX PART or CIF atom_site_disorder_group as a float value -- note that for negative part, the fragments are given unique altloc values that range from 1-9A-Za-z. 'A' and 'a' can be distinguished using LIKE, as in SELECT ALTLOC LIKE 'a' -- for space groups with m symmetry operatiosn and n parts, if m*n > 53 then altloc values will restart at "A" after reaching 'z'. This may result in undesired bonding between parts. -- atom.property_part is not produced for mmCIF or binaryCIF files -- property_part overrides altloc value for WRITE CIF new feature: CONFIG -n and SELECT CONFIG=-n for SHELX and non-PDB CIF -- negative configuration number -- selects property_part=0 or property_part=n or property_part=-n Modified Paths: -------------- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/ShelxReader.java trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomIterator.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java trunk/Jmol/src/org/jmol/adapter/writers/CIFWriter.java trunk/Jmol/src/org/jmol/api/JmolAdapterAtomIterator.java trunk/Jmol/src/org/jmol/awt/Image.java trunk/Jmol/src/org/jmol/modelset/Atom.java trunk/Jmol/src/org/jmol/modelset/ModelLoader.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/modelsetbio/BioExt.java trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/util/C.java trunk/Jmol/src/org/jmol/viewer/FileManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/OutputManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -515,6 +515,8 @@ protected void finalizeSubclassReader() throws Exception { if (htOxStates != null) setOxidationStates(); + if (htJmolNames != null) + setJmolNames(); // added check for final data_global if (asc.iSet > 0 && asc.getAtomSetAtomCount(asc.iSet) == 0) asc.atomSetCount--; @@ -529,6 +531,9 @@ addHeader(); if (haveAromatic) addJmolScript("calculate aromatic"); + if (!isMMCIF && asc.xtalSymmetry != null) { + asc.xtalSymmetry.setPartProperty(); + } } private void setOxidationStates() { @@ -944,6 +949,10 @@ processGeomBondLoopBlock(); return; } + if (key.startsWith("_jmol")) { + processJmolBlock(); + return; + } if (processSubclassLoopBlock()) return; if (key.equals("_propagation_vector_seq_id")) {// Bilbao mCIF @@ -1051,6 +1060,49 @@ return true; } + //final private static byte JMOL_ATOM_INDEX = 0; + final private static byte JMOL_ATOM_NAME = 1; + final private static byte JMOL_ATOM_SITE_LABEL = 2; + + final private static String[] jmolAtomFields = { + "_jmol_atom_index", + "_jmol_atom_name", + "_jmol_atom_site_label" + }; + +// loop_ +// _jmol_atom_index +// _jmol_atom_name +// _jmol_atom_site_label +// 0 FE1 Fe1 +// 1 CL1 Cl1 +// 2 P1 P1 +// 3 N1 N1 +// 143 Q11 Xx11 + + private Map<String, String> htJmolNames; + + private void processJmolBlock() throws Exception { + htJmolNames = new Hashtable<>(); + parseLoopParameters(jmolAtomFields); + while (cifParser.getData()) { + String jmolName = getFieldString(JMOL_ATOM_NAME); + String cifName = getFieldString(JMOL_ATOM_SITE_LABEL); + if (jmolName == null || cifName == null) + continue; + htJmolNames.put(cifName, jmolName); + } + } + + private void setJmolNames() { + for (int i = 0, n = asc.ac; i < n; i++) { + Atom a = asc.atoms[i]; + String name = htJmolNames.get(a.atomName); + if (name != null) + a.atomName = name; + } + } + //////////////////////////////////////////////////////////////// // atom site data //////////////////////////////////////////////////////////////// @@ -1490,7 +1542,11 @@ disorderAssembly = field; break; case DISORDER_GROUP: - if (firstChar == '-' && field.length() > 1) { + if (!isMMCIF) { + atom.part = PT.parseInt(field); + } + atom.altLoc = (atom.part < 0 ? field.charAt(1) : firstChar); + // disorder group -1 // email exchange with Brian McMahon 22.10.11 @@ -1514,17 +1570,11 @@ // PDB format. However, this notation is difficult to use when there // is a disorder within a disorder." - // atom.basLoc provides the base altloc "n" of "-n" - // as symmetry is applied, if basLoc is found, then + // atom.part < 0 indicates the negative case; atom.altloc is the "n" of "-n" + // as symmetry is applied, if atom.isNegDisorder is true, then // the cloned atom is given an incremented altloc // this only works with C2 and m; with higher-order symmetry, this // will dump all the symmetry-related groups into the same configuration=2 - - atom.altLoc = field.charAt(1); - atom.isNegDisorder = true; - } else { - atom.altLoc = firstChar; - } break; case GROUP_PDB: if ("HETATM".equals(field)) Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/ShelxReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/ShelxReader.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/ShelxReader.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -57,8 +57,11 @@ private String[] sfacElementSymbols; private boolean isCmdf; - String[] tokens; + private String[] tokens; + private char altloc = '\0'; + private int part; + @Override public void initializeReader() { setFractionalCoordinates(true); @@ -68,14 +71,14 @@ protected boolean checkLine() throws Exception { int lineLength ; + if (line.length() == 0 || line.startsWith(" ")) + return true; // '=' as last char of line means continue on next line - while ((lineLength = (line = line.trim()).length()) > 0 + while ((lineLength = line.length()) > 0 && line.charAt(lineLength - 1) == '=') line = line.substring(0, lineLength - 1) + rd(); tokens = getTokens(); - if (tokens.length == 0) - return true; String command = tokens[0].toUpperCase(); if (command.equals("TITL")) { if (!doGetModel(++modelNumber, null)) @@ -160,9 +163,6 @@ } } - char altloc = '\0'; - private boolean negDisorder; - private void processPartRecord() { // email exchange with Brian McMahon 22.10.11 @@ -195,11 +195,8 @@ // PART 1 become altloc '1' - int part = parseIntStr(tokens[1]); - + part = parseIntStr(tokens[1]); altloc = (char) (part == 0 ? 0 : '0' + Math.abs(part)); - if (part < 0) - negDisorder = true; } private boolean isCentroSymmetric; @@ -299,6 +296,7 @@ try { atomName = tokens[0]; + elementIndex = parseIntStr(tokens[1]) - 1; x = parsePrecision(tokens[2])%10; y = parsePrecision(tokens[3])%10; z = parsePrecision(tokens[4])%10; @@ -323,7 +321,7 @@ } setAtomCoordXYZ(atom, x, y, z); atom.altLoc = altloc; - atom.isNegDisorder = negDisorder; + atom.part = part; if (tokens.length == 12) { float[] data = new float[8]; @@ -390,4 +388,9 @@ applySymTrajASCR(); } + @Override + public void finalizeSubclassReader() throws Exception { + super.finalizeReaderASCR(); + asc.xtalSymmetry.setPartProperty(); + } } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/adapter/smarter/Atom.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -62,10 +62,9 @@ public char insertionCode = '\0'; public float[] anisoBorU; //[6] = 1 for U, 0 for B; [7] = bFactor public Lst<Object> tensors; - public boolean isNegDisorder; // CIF _atom_site_disorder_group -n public String typeSymbol; // CIF only - - + public int part; // CIF _atom_site_disorder_group or SHELX PART + public Tensor addTensor(Tensor tensor, String type, boolean reset) { if (tensor == null) return null; Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomIterator.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomIterator.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomIterator.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -213,10 +213,9 @@ return getElementNumber() >> 7; } - @Override - public boolean getIsNegDisorder() { - return atom.isNegDisorder; - } + @Override + public int getPart() { + return atom.part; + } - } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollection.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -1261,10 +1261,6 @@ bsAtoms.clear(b.atomIndex1); } } - - // TODO - } - } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -428,8 +428,10 @@ htParams.put("trajectorySteps", trajectorySteps = new Lst<P3[]>()); } - /** - * optional reader-specific method run first. + /* + * Optional reader-specific method run first. May or may not call + * finalizeReaderASCR(), when symmetry for the last model is finalized if + * necessary. * * @throws Exception */ Modified: trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -154,10 +154,11 @@ public String getSpaceGroupTitle() { String s = getSpaceGroupName(); - return (s.startsWith("cell=") ? s : spaceGroup != null ? spaceGroup.asString() - : unitCell != null && unitCell.name.length() > 0 - ? "cell=" + unitCell.name - : ""); + return (s.startsWith("cell=") ? s + : spaceGroup != null ? spaceGroup.asString() + : unitCell != null && unitCell.name.length() > 0 + ? "cell=" + unitCell.name + : ""); } public void setPrecision(float prec) { @@ -746,11 +747,11 @@ setLatticeCells(); boolean doApplySymmetry = true; if (acr.ignoreFileSpaceGroupName || !acr.iHaveSymmetryOperators) { + if (!acr.merging || readerSymmetry == null) + readerSymmetry = new FileSymmetry(); if (acr.unitCellParams[0] == 0 && acr.unitCellParams[2] == 0) { SimpleUnitCell.fillParams(null, null, null, acr.unitCellParams); } - if (!acr.merging || readerSymmetry == null) - readerSymmetry = new FileSymmetry(); doApplySymmetry = readerSymmetry.createSpaceGroup( acr.desiredSpaceGroupIndex, (acr.sgName.indexOf("!") >= 0 ? "P1" : acr.sgName), @@ -1205,13 +1206,14 @@ int maxX = latticeCells[0]; int maxY = latticeCells[1]; int maxZ = Math.abs(latticeCells[2]); - /** kcode: Generally the multiplier is just {ijk ijk scale}, but when we have - * 1iiijjjkkk 1iiijjjkkk scale, floats lose kkk due to Java float - * precision issues so we use P4 {1iiijjjkkk 1iiijjjkkk scale, - * 1kkkkkk}. Here, our offset -- initially 0 or 1 from the uccage - * renderer, but later -500 or -499 -- tells us which code we are - * looking at, the first one or the second one. - */ + /** + * kcode: Generally the multiplier is just {ijk ijk scale}, but when we have + * 1iiijjjkkk 1iiijjjkkk scale, floats lose kkk due to Java float precision + * issues so we use P4 {1iiijjjkkk 1iiijjjkkk scale, 1kkkkkk}. Here, our + * offset -- initially 0 or 1 from the uccage renderer, but later -500 or + * -499 -- tells us which code we are looking at, the first one or the + * second one. + */ int kcode = latticeCells[3]; firstAtom = asc.getLastAtomSetAtomIndex(); BS bsAtoms = asc.bsAtoms; @@ -1226,7 +1228,7 @@ if (acr.isPrimitive) { asc.setCurrentModelInfo("isprimitive", Boolean.TRUE); if (!"P".equals(acr.latticeType) || acr.primitiveToCrystal != null) { - asc.setCurrentModelInfo("unitcell_conventional", symmetry + asc.setCurrentModelInfo(JC.INFO_UNIT_CELL_CONVENTIONAL, symmetry .getConventionalUnitCell(acr.latticeType, acr.primitiveToCrystal)); } } @@ -1297,7 +1299,7 @@ bsAtoms = updateBSAtoms(); slop = symmetry.getPrecision(); applySuperSymmetry(supercell, bsAtoms, iAtomFirst, oabc, pt0, vabc, slop); - } + } setMinMax(ndims, kcode, maxX, maxY, maxZ); if (oabc == null) { // finally operate on the simple cell @@ -1347,13 +1349,15 @@ } private void finalizeSymmetry(FileSymmetry symmetry) { - String name = (String) asc.getAtomSetAuxiliaryInfoValue(-1, "spaceGroup"); + String name = (String) asc.getAtomSetAuxiliaryInfoValue(-1, + JC.INFO_SPACE_GROUP); symmetry.setFinalOperations(ndims, name, asc.atoms, firstAtom, noSymmetryCount, doNormalize, filterSymop); if (filterSymop != null || name == null || name.equals("unspecified!")) { setAtomSetSpaceGroupName(symmetry.getSpaceGroupName()); } - if (unitCellParams != null || Float.isNaN(acr.unitCellParams[SimpleUnitCell.INFO_A])) + if (unitCellParams != null + || Float.isNaN(acr.unitCellParams[SimpleUnitCell.INFO_A])) return; if (symmetry.fixUnitCell(acr.unitCellParams)) { acr.appendLoadNote( @@ -1363,12 +1367,12 @@ } public boolean removePacking(int ndims, P3 pt, float minX, float maxX, - float minY, float maxY, float minZ, float maxZ, - float slop) { + float minY, float maxY, float minZ, float maxZ, + float slop) { return (pt.x > minX - slop && pt.x < maxX - slop && (ndims < 2 || pt.y > minY - slop && pt.y < maxY - slop) && (ndims < 3 || pt.z > minZ - slop && pt.z < maxZ - slop)); -} + } private void reset() { asc.coordinatesAreFractional = false; @@ -1378,7 +1382,7 @@ private void setAtomSetSpaceGroupName(String spaceGroupName) { symmetry.setSpaceGroupName(spaceGroupName); - asc.setCurrentModelInfo("spaceGroup", spaceGroupName + ""); + asc.setCurrentModelInfo(JC.INFO_SPACE_GROUP, spaceGroupName + ""); } private void setCurrentModelInfo(int n, FileSymmetry sym, int[] unitCells) { @@ -1393,7 +1397,7 @@ asc.setCurrentModelInfo("latticeDesignation", sym.getLatticeDesignation()); asc.setCurrentModelInfo(JC.INFO_UNIT_CELL_RANGE, unitCells); -// asc.setCurrentModelInfo(JC.INFO_UNIT_CELL_TRANSLATIONS, unitCellTranslations); + // asc.setCurrentModelInfo(JC.INFO_UNIT_CELL_TRANSLATIONS, unitCellTranslations); if (acr.isSUPERCELL) asc.setCurrentModelInfo("supercell", acr.strSupercell); } @@ -1410,20 +1414,22 @@ asc.setCurrentModelInfo("latticeType", acr.latticeType == null ? "P" : acr.latticeType); asc.setCurrentModelInfo("intlTableNo", symmetry.getIntTableNumber()); - asc.setCurrentModelInfo("intlTableIndex", symmetry.getSpaceGroupInfoObj("itaIndex", null, false, false)); - asc.setCurrentModelInfo("intlTableTransform", symmetry.getSpaceGroupInfoObj("itaTransform", null, false, false)); + asc.setCurrentModelInfo("intlTableIndex", + symmetry.getSpaceGroupInfoObj("itaIndex", null, false, false)); + asc.setCurrentModelInfo("intlTableTransform", + symmetry.getSpaceGroupInfoObj("itaTransform", null, false, false)); asc.setCurrentModelInfo("intlTableJmolID", symmetry.getIntTableNumberFull()); asc.setCurrentModelInfo(JC.INFO_SPACE_GROUP_INDEX, Integer.valueOf(symmetry.getSpaceGroupIndex())); - asc.setCurrentModelInfo(JC.INFO_SPACE_GROUP_TITLE, symmetry.getSpaceGroupTitle()); + asc.setCurrentModelInfo(JC.INFO_SPACE_GROUP_TITLE, + symmetry.getSpaceGroupTitle()); if (acr.sgName == null || acr.sgName.indexOf("?") >= 0 || acr.sgName.indexOf("!") >= 0) setAtomSetSpaceGroupName(acr.sgName = symmetry.getSpaceGroupName()); } - private void setCurrentModelUCInfo(float[] unitCellParams, - P3 unitCellOffset, + private void setCurrentModelUCInfo(float[] unitCellParams, P3 unitCellOffset, M3 matUnitCellOrientation) { if (unitCellParams != null) asc.setCurrentModelInfo(JC.INFO_UNIT_CELL_PARAMS, unitCellParams); @@ -1744,17 +1750,28 @@ sym.getSpaceGroupOperation(iSym).rotate(atom1.vib); atom1.vib.scale(spinOp); } - if (atom1.isNegDisorder) { + if (atom1.part < 0) { // special negative disorder group in CifReader + Integer key = Integer.valueOf(iSym * 1000 + 500 + atom1.part); if (disorderMap == null) disorderMap = new Hashtable<Integer, Character>(); - Integer key = Integer.valueOf(iSym * 1000 + atom1.altLoc); Character ch = disorderMap.get(key); if (ch == null) { - if (disorderMapMax == 0 || disorderMapMax == 'Z') - disorderMapMax = (int) '@'; // necessary for legacy java2script JSmol - disorderMap.put(key, - ch = new Character((char) (++disorderMapMax))); + Integer ia = Integer.valueOf(atom1.part); + boolean isNew = (disorderMap.get(ia) == null); + if (disorderMapMax == 0 || disorderMapMax == 'z') { + // back to "A" + disorderMapMax = '@'; + } else if (disorderMapMax == 'Z') { + // allow a-z as well; use select ALTLOC like 'a' to distinguish 'a' from 'A' + disorderMapMax = '`'; + } + // first time will be altloc, then start incrementing altLoc + ch = new Character( + isNew ? atom1.altLoc : (char) ++disorderMapMax); + disorderMap.put(key, ch); + if (isNew) + disorderMap.put(ia, ch); } atom1.altLoc = ch.charValue(); } @@ -1800,7 +1817,7 @@ ia1 = ia2; ia2 = i; } - if (ia1 != ia2 && (ia1 >= bondAtomMin || ia2 >= bondAtomMin) + if ((ia1 != ia2 && (ia1 >= bondAtomMin || ia2 >= bondAtomMin)) && bondsFound.indexOf(key = "-" + ia1 + "," + ia2) < 0) { bondsFound.append(key); asc.addNewBondWithOrder(ia1, ia2, bond.order);//.distance = d; @@ -1811,6 +1828,23 @@ return pt; } + /** + * + * create property_part for SHELX and CIF loaders + * + */ + public void setPartProperty() { + for (int iset = asc.atomSetCount; --iset >= 0;) { + float[] parts = new float[asc.getAtomSetAtomCount(iset)]; + for (int i = 0, ia = asc + .getAtomSetAtomIndex(iset), n = parts.length; i < n; i++) { + Atom a = asc.atoms[ia++]; + parts[i] = a.part; + } + asc.setAtomProperties("part", parts, iset, false); + } + } + private void trimToUnitCell(int iAtomFirst) { // trim atom set based on current min/max Atom[] atoms = asc.atoms; Modified: trunk/Jmol/src/org/jmol/adapter/writers/CIFWriter.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/writers/CIFWriter.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/adapter/writers/CIFWriter.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -1,8 +1,10 @@ package org.jmol.adapter.writers; +import org.jmol.api.JmolDataManager; import org.jmol.api.JmolWriter; import org.jmol.api.SymmetryInterface; import org.jmol.modelset.Atom; +import org.jmol.util.BSUtil; import org.jmol.util.SimpleUnitCell; import org.jmol.viewer.Viewer; @@ -42,16 +44,24 @@ public String write(BS bs) { if (bs == null) bs = vwr.bsA(); + else + bs = BSUtil.copy(bs); try { - short mi = vwr.ms.at[bs.nextSetBit(0)].mi; - - SymmetryInterface uc = vwr.getCurrentUnitCell(); + // note that this is confined to the FIRST model in the set. + // TODO allow multiple unit cells? + int mi = vwr.ms.at[bs.nextSetBit(0)].mi; + int n0 = bs.cardinality(); + bs.and(vwr.getModelUndeletedAtomsBitSet(mi)); + if (n0 < bs.cardinality()) { + System.err.println("CIFWriter Warning: Atoms not in model " + (mi + 1) + " ignored"); + } + SymmetryInterface uc = vwr.ms.getUnitCell(mi); haveUnitCell = (uc != null); if (!haveUnitCell) uc = vwr.getSymTemp().setUnitCellFromParams(null, false, 0.00001f); slop = uc.getPrecision(); - isHighPrecision = (slop == SimpleUnitCell.SLOPDP); precision = (int) -Math.log10(slop); + isHighPrecision = (slop == SimpleUnitCell.SLOPDP); // not used in legacy Jmol P3 offset = uc.getFractionalOffset(); boolean fractionalOffset = offset != null && (offset.x != (int) offset.x || offset.y != (int) offset.y || offset.z != (int) offset.z); @@ -60,11 +70,13 @@ || (fset = uc.getUnitCellMultiplier()) != null && (fset.z == 1 ? !fset.equals(fset0) : fset.z != 0)); SymmetryInterface ucm = uc.getUnitCellMultiplied(); - isP1 = (isP1 || ucm != uc || fractionalOffset || uc.getSpaceGroupOperationCount() < 2); + isP1 = (isP1 || ucm != uc || fractionalOffset + || uc.getSpaceGroupOperationCount() < 2); uc = ucm; - // only write the asymmetric unit set - BS modelAU = (!haveUnitCell ? bs : isP1 ? uc.removeDuplicates(vwr.ms, bs, false) : vwr.ms.am[mi].bsAsymmetricUnit); + BS modelAU = (!haveUnitCell ? bs + : isP1 ? uc.removeDuplicates(vwr.ms, bs, false) // in SwingJS this is isHighPrecision + : vwr.ms.am[mi].bsAsymmetricUnit); BS bsOut; if (modelAU == null) { bsOut = bs; @@ -151,6 +163,7 @@ break; } } + float[] parts = (haveAltLoc ? (float[]) vwr.getDataObj("property_part", bsOut, JmolDataManager.DATA_TYPE_AF) : null); int sbLength = sb.length(); @@ -175,8 +188,7 @@ int nAtoms = 0; P3 p = new P3(); int[] elemNums = new int[130]; - for (int i = bsOut.nextSetBit(0); i >= 0; i = bsOut - .nextSetBit(i + 1)) { + for (int pi = 0, i = bsOut.nextSetBit(0); i >= 0; i = bsOut.nextSetBit(i + 1)) { Atom a = atoms[i]; p.setT(a); if (haveUnitCell) { @@ -195,13 +207,19 @@ String label = sym + ++elemNums[elemno]; sb.append(PT.formatS(label, 5, 0, true, false)).append(" ") - .append(PT.formatS(sym, 3, 0, true, false)) - .append(clean(p.x)) - .append(clean(p.y)) - .append(clean(p.z)); + .append(PT.formatS(sym, 3, 0, true, false)).append(clean(p.x)) + .append(clean(p.y)).append(clean(p.z)); if (haveAltLoc) { - sb.append(" ").appendC(a.altloc == '\0' ? '.' : a.altloc); + sb.append(" "); + String sdis; + if (parts != null) { + int part = (int) parts[pi++]; + sdis = (part == 0 ? "." : "" + part); + } else { + sdis = "" + (a.altloc == '\0' ? '.' : a.altloc); } + sb.append(sdis); + } if (haveOccupancy) sb.append(" ").append(clean(occ[i]/100)); else if (!haveUnitCell) Modified: trunk/Jmol/src/org/jmol/api/JmolAdapterAtomIterator.java =================================================================== --- trunk/Jmol/src/org/jmol/api/JmolAdapterAtomIterator.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/api/JmolAdapterAtomIterator.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -85,6 +85,6 @@ public abstract int getIsotope(); - public abstract boolean getIsNegDisorder(); + int getPart(); } Modified: trunk/Jmol/src/org/jmol/awt/Image.java =================================================================== --- trunk/Jmol/src/org/jmol/awt/Image.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/awt/Image.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -123,6 +123,8 @@ static int[] grabPixels(Object imageobj, int width, int height, int[] pixels) { // keep this simple! + if (imageobj instanceof sun.awt.image.ToolkitImage) + imageobj = ((sun.awt.image.ToolkitImage) imageobj).getBufferedImage(); BufferedImage image = (BufferedImage) imageobj; int iw = image.getWidth(); int[] data = ((DataBufferInt) image.getRaster().getDataBuffer()).getData(); Modified: trunk/Jmol/src/org/jmol/modelset/Atom.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Atom.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/modelset/Atom.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -1352,6 +1352,10 @@ return getSurfaceDistance100() / 100f; case T.temperature: // 0 - 9999 return getBfactor100() / 100f; + case T.translucent: + return C.getColixTranslucencyFractional(colixAtom); + case T.volume: + return getVolume(vwr, VDW.AUTO); case T.unitx: return getFractionalUnitCoord(!vwr.g.legacyJavaFloat, 'X', ptTemp); case T.unity: @@ -1383,8 +1387,6 @@ return getVib('2'); case T.modt3: return getVib('3'); - case T.volume: - return getVolume(vwr, VDW.AUTO); case T.fracxyz: case T.fuxyz: case T.unitxyz: Modified: trunk/Jmol/src/org/jmol/modelset/ModelLoader.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/modelset/ModelLoader.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -830,27 +830,7 @@ jbr.setHaveHsAlready(true); String name = iterAtom.getAtomName(); int charge = (addH ? getPdbCharge(group3, name) : iterAtom.getFormalCharge()); - - Atom atom = addAtom(isPdbThisModel, iterAtom.getSymmetry(), - iterAtom.getAtomSite() + siteBase, - isotope, - name, - charge, - iterAtom.getPartialCharge(), - iterAtom.getTensors(), - iterAtom.getOccupancy(), - iterAtom.getBfactor(), - iterAtom.getXYZ(), - iterAtom.getIsHetero(), - iterAtom.getIsNegDisorder(), - iterAtom.getSerial(), - iterAtom.getSeqID(), - group3, - iterAtom.getVib(), - iterAtom.getAltLoc(), - iterAtom.getRadius(), - iterAtom.getBondRadius() - ); + Atom atom = addAtom(isPdbThisModel, iterAtom, name, isotope, siteBase, charge, group3); if (haveBonds) htAtomMap.put(iterAtom.getUniqueID(), atom); } @@ -944,12 +924,22 @@ : 0); } - private Atom addAtom(boolean isPDB, BS atomSymmetry, int atomSite, int atomicAndIsotopeNumber, - String atomName, int formalCharge, float partialCharge, - Lst<Object> tensors, float occupancy, float bfactor, - P3 xyz, boolean isHetero, boolean isNegDisorder, int atomSerial, int atomSeqID, - String group3, V3 vib, char alternateLocationID, - float radius, float bondRadius) { + private Atom addAtom(boolean isPDB, JmolAdapterAtomIterator iterAtom, String atomName, int atomicAndIsotopeNumber, int siteBase, int formalCharge, String group3) { + BS atomSymmetry = iterAtom.getSymmetry(); + int atomSite = iterAtom.getAtomSite() + siteBase; + float partialCharge = iterAtom.getPartialCharge(); + Lst<Object> tensors = iterAtom.getTensors(); + float occupancy = iterAtom.getOccupancy(); + float bfactor = iterAtom.getBfactor(); + P3 xyz = iterAtom.getXYZ(); + boolean isHetero = iterAtom.getIsHetero(); + boolean isNegDisorder = (iterAtom.getPart() < 0); + int atomSerial = iterAtom.getSerial(); + int atomSeqID = iterAtom.getSeqID(); + V3 vib = iterAtom.getVib(); + char alternateLocationID = iterAtom.getAltLoc(); + float radius = iterAtom.getRadius(); + float bondRadius = iterAtom.getBondRadius(); byte specialAtomID = 0; String atomType = null; if (atomName != null) { Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -34,6 +34,7 @@ import org.jmol.api.AtomIndexIterator; import org.jmol.api.Interface; +import org.jmol.api.JmolDataManager; import org.jmol.api.JmolModulationSet; import org.jmol.api.SymmetryInterface; import org.jmol.atomdata.AtomData; @@ -4110,8 +4111,22 @@ if (conformationIndex < -1000) { char c = (char) (-1000 - conformationIndex); c0 = altLocs.indexOf(c); + } else if (conformationIndex < 0) { + c0 = -conformationIndex; + float[] parts = (float[]) vwr.getDataObj("property_part", bsAtoms, JmolDataManager.DATA_TYPE_AF); + if (parts == null) { + c0 -= 1; + } else { + for (int p = 0, ia = bsAtoms.nextSetBit(0); ia >= 0; ia = bsAtoms.nextSetBit(ia + 1)) { + double part = parts[p++]; + if (part != 0 && part != c0 && part != -c0) + bsAtoms.clear(ia); + } + bs.or(bsAtoms); + c0 = -1; + } } else { - c0 = Math.abs(conformationIndex) - 1; + c0 = conformationIndex - 1; } if (c0 < 0 || c0 >= nAltLocs) { continue; Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioExt.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioExt.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioExt.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -779,6 +779,8 @@ for (int i = 0; i < n; i++) { a1 = vCA.get(i); int polymerIndex = a1.group.getBioPolymerIndexInModel(); + if (polymerIndex < 0) + continue; // lone MET ligand in 4mwb int monomerIndex = a1.group.getMonomerIndex(); int bpt = monomerIndex; if (bpt < nEndMin) Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -2080,7 +2080,7 @@ setBraceCount = 0; break; } - if (theTok != T.identifier && theTok != T.andequals + if (theTok != T.translucent && theTok != T.identifier && theTok != T.andequals && theTok != T.define && (!T.tokAttr(theTok, T.setparam))) { if (isNewSet) commandExpected(); Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -1126,10 +1126,14 @@ scriptFileName = filename; data[1] = FileManager.getEmbeddedScript(data[1]); String script = fixScriptPath(data[1], data[0]); + int pt = -1; + String path = scriptPath; if (scriptPath == null) { - scriptPath = vwr.fm.getFilePath(filename, false, false); - scriptPath = scriptPath.substring(0, - Math.max(scriptPath.lastIndexOf("|"), scriptPath.lastIndexOf("/"))); + path = vwr.fm.getFilePath(filename, false, false); + scriptPath = path.substring(0, + Math.max((pt = path.lastIndexOf("|")), path.lastIndexOf("/"))); + if (pt > 0) + vwr.setAccessInternal(path.substring(0, pt)); } return FileManager.setScriptFileReferences(script, localPath, remotePath, scriptPath) + movieScript; @@ -1721,6 +1725,7 @@ return; isFuncReturn = false; Logger.error("eval ERROR: " + s + "\n" + toString()); + vwr.setAccessInternal(null); if (vwr.autoExit) vwr.exitJmol(); } @@ -7189,6 +7194,11 @@ vwr.setStructureList(data, type); checkLast(iToken); return; + case T.translucent: + if (slen > 3) + checkLast(2); + setBooleanProperty("translucent", slen == 2 || SV.bValue(getToken(2))); + return; case T.axescolor: ival = getArgbParam(2); if (!chk) Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/script/T.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -624,6 +624,7 @@ public final static int modz = floatproperty | 25; public final static int modo = floatproperty | 26; public final static int dssr = floatproperty | 27; + public final static int translucent = floatproperty | 28; public final static int vectorscale = floatproperty | 1 | floatparam; public final static int atomx = floatproperty | 1 | settable; public final static int atomy = floatproperty | 2 | settable; @@ -1125,7 +1126,6 @@ public final static int testflag3 = booleanparam | 188; public final static int testflag4 = booleanparam | 189; public final static int tracealpha = booleanparam | 190; - public final static int translucent = booleanparam | 191; public final static int twistedsheets = booleanparam | 192; public final static int undo = booleanparam | scriptCommand | 193; public final static int undoauto = booleanparam | 193; Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -4088,6 +4088,8 @@ * @throws ScriptException */ private String write(T[] args) throws ScriptException { + if (args == null && !vwr.haveAccessInternal("|")) + invArg(); ScriptEval eval = e; int pt = 1, pt0 = 1; String[] scripts = null; Modified: trunk/Jmol/src/org/jmol/util/C.java =================================================================== --- trunk/Jmol/src/org/jmol/util/C.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/util/C.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -141,6 +141,7 @@ public final static short CHANGEABLE_MASK = (short) 0x8000; // negative public final static int LAST_AVAILABLE_COLIX = UNMASK_CHANGEABLE_TRANSLUCENT; public final static int TRANSLUCENT_SHIFT = 11; + public static final int TRANSPARENT_LEVEL = 0xFF; public final static int ALPHA_SHIFT = 24 - TRANSLUCENT_SHIFT; public final static int TRANSLUCENT_MASK = 0xF << TRANSLUCENT_SHIFT; //0x7800 public final static int TRANSLUCENT_SCREENED = TRANSLUCENT_MASK; @@ -429,10 +430,14 @@ case 15: return -1; default: - return 255; + return TRANSPARENT_LEVEL; // 255 } } + public static boolean isTransparent(short colix) { + return (colix & TRANSLUCENT_MASK) == TRANSPARENT; + } + public static short getColixS(String colorName) { int argb = CU.getArgbFromString(colorName); if (argb != 0) Modified: trunk/Jmol/src/org/jmol/viewer/FileManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/FileManager.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/viewer/FileManager.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -964,7 +964,8 @@ // -- no local file reading for headless if (OC.urlTypeIndex(name) >= 0 || vwr.haveAccess(ACCESS.NONE) || vwr.haveAccess(ACCESS.READSPT) && !name.endsWith(".spt") - && !name.endsWith("/")) { + && !name.endsWith("/") + || !vwr.haveAccessInternal(name)) { try { url = new URL((URL) null, name, null); } catch (MalformedURLException e) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-08-06 13:08:14 UTC (rev 22629) @@ -54,8 +54,38 @@ # FEATURE REQUEST: dock/undock consoles to main window. # TODO: allow FIXED to work with MODELKIT MINIMIZE -Jmol.___JmolVersion="16.2.21" // (legacy) also 16.2.22 (swingJS) +Jmol.___JmolVersion="16.2.23" // (legacy) also 16.2.24 (swingJS) +bug fix: CALCULATE STRUTS fails for $LOAD =4mwb + -- singleton MET amino acid as ligand was not handled + +bug fix: CIFReader should read atomName from _jmol_atom_name block + -- _jmol_atom_name is created by WRITE CIF + +bug fix: SHELXReader support for space-starting comment lines + +new feature: atom property translucent + -- 0.0 to 1.0, with 0 being opaque and 1 being transparent + -- for example, select translucent = 0.5; select translucent > 0 + +new feature: atom.property_part + -- the SHELX PART or CIF atom_site_disorder_group as a float value + -- note that for negative part, the fragments are given unique + altloc values that range from 1-9A-Za-z. 'A' and 'a' can be + distinguished using LIKE, as in SELECT ALTLOC LIKE 'a' + -- for space groups with m symmetry operatiosn and n parts, + if m*n > 53 then altloc values will restart at "A" after reaching 'z'. + This may result in undesired bonding between parts. + -- atom.property_part is not produced for mmCIF or binaryCIF files + -- property_part overrides altloc value for WRITE CIF + +new feature: CONFIG -n and SELECT CONFIG=-n for SHELX and non-PDB CIF + -- negative configuration number + -- selects property_part=0 or property_part=n or property_part=-n + + +JmolVersion="16.2.21" // (legacy) also 16.2.22 (swingJS) + bug fix: PyMOLReader handling of measurement and atom labels refined bug fix: PyMOLReader skipping display of nonbonded atoms (water as red stars) bug fix: PyMOLReader mishandling unique settings for valence Modified: trunk/Jmol/src/org/jmol/viewer/OutputManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/OutputManager.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/viewer/OutputManager.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -290,17 +290,40 @@ v.removeItemAt(0); v.removeItemAt(0); // also "_IMAGE_" byte[] bytes = (byte[]) v.removeItemAt(0); - if (Rdr.isPngZipB(bytes)) { - params.put("pngImgData", bytes); - } else { - getImagePixels(vwr.fm.getImage(bytes, null, true), params); - } OC oz = getOutputChannel(null, null); errRet[0] = writeZipFile(oz, v, "OK JMOL", null); + params.put("pngAppData", oz.toByteArray()); params.put("type", "PNGJ"); type = "Png"; params.put("pngAppPrefix", "Jmol Type"); - params.put("pngAppData", oz.toByteArray()); + if (Rdr.isPngZipB(bytes)) { + params.put("pngImgData", bytes); + } else { + Object image = vwr.fm.getImage(bytes, null, true); + Runnable r = new Runnable() { + + @Override + public void run() { + try { + getImagePixels(image, params); + } catch (Exception e) { + e.printStackTrace(); + } + finishImage(errRet, "Png", out, null, params); + out.closeChannel(); + } + }; + // difference here with SwingJS -- uses asyncronous Runnable + // since bytes will not be ready yet in JavaScript + // TODO: implement that here as well? + if (false && Viewer.isJS) { + errRet[0] = "async"; + new Thread(r).start(); + return true; + } + r.run(); + return errRet[0] == null; + } } else if (v.size() == 1) { byte[] b = (byte[]) v.removeItemAt(0); out.write(b, 0, b.length); @@ -310,11 +333,17 @@ return true; } } + finishImage(errRet, type, out, objImage, params); + return errRet[0] == null; + } + + void finishImage(String[] errRet, String type, OC out, + Object objImage, Map<String, Object> params) { GenericImageEncoder ie = (GenericImageEncoder) Interface .getInterface("javajs.img." + type + "Encoder", vwr, "file"); if (ie == null) { errRet[0] = "Image encoder type " + type + " not available"; - return false; + return; } boolean doClose = true; try { @@ -333,10 +362,9 @@ if (doClose) out.closeChannel(); } - return (errRet[0] == null); } - - private void getImagePixels(Object objImage, Map<String, Object> params) + + void getImagePixels(Object objImage, Map<String, Object> params) throws Exception { int w = objImage == null ? -1 : AU.isAI(objImage) ? ((Integer) params.get("width")).intValue() Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2024-07-26 13:09:09 UTC (rev 22628) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2024-08-06 13:08:14 UTC (rev 22629) @@ -223,7 +223,7 @@ public static String jsDocumentBase = ""; public enum ACCESS { - NONE, READSPT, ALL + NONE, READSPT, ALL, INTERNAL } public Object compiler; @@ -286,7 +286,8 @@ public Map<String, Object> vwrOptions; public Object display; private JmolAdapter modelAdapter; - private ACCESS access; + private ACCESS access0, access; + private String internalAccessPath; private CommandHistory commandHistory; public ModelManager mm; @@ -487,7 +488,7 @@ htmlName = (i < 0 ? fullName : fullName.substring(0, i)); appletName = PT.split(htmlName + "_", "_")[0]; syncId = (i < 0 ? "" : fullName.substring(i + 2, fullName.length() - 2)); - access = (checkOption2("access:READSPT", "-r") ? ACCESS.READSPT + access = access0 = (checkOption2("access:READSPT", "-r") ? ACCESS.READSPT : checkOption2("access:NONE", "-R") ? ACCESS.NONE : ACCESS.ALL); isPreviewOnly = info.containsKey("previewOnly"); if (isPreviewOnly) @@ -10896,19 +10897,14 @@ /** * - * @param sym TODO + * @param sym * @param bsAtoms * @param xyzList * if present, a semicolon-separated list of operators * @param unitCellParams * @param origin - * TODO - * @param oabc TODO - * @param spaceGroup TODO - * @param asString - * @param isAssign - * from ModelKit - * @param checkSupercell only true for x=spacegroup("parent") + * @param oabc + * @param flags special flags * @return either an array of space group identifiers or, if asString, "", or * null * @@ -11137,5 +11133,45 @@ } return false; } + + /** + * Check for allowed access only to the designated path starting with this path. + * Restricts access to internal PNGJ files and disallows WRITE and JAVASCRIPT commands from within PNGJ files. + * + * Java only. + * + * @param path + * @return true if access is allowed + */ + public final boolean haveAccessInternal(String path) { + if (isJS) + return true; + path = path.replace('\\', '/'); + boolean ret = access != ACCESS.NONE && (internalAccessPath == null || access != ACCESS.INTERNAL || path.startsWith(internalAccessPath)); + if (!ret) + System.err.println("Viewe internal file access in " + internalAccessPath + " denied for " + path); + return ret; + } + /** + * Set access to the specified path only; used for restricting file read/write + * access to only those files within the zip block of a PNGJ file + * + * Java only. + * + * @param path + */ + public void setAccessInternal(String path) { + if (isJS) + return; + if (access != ACCESS.INTERNAL) { + access = ACCESS.INTERNAL; + } else if (path == null) { + access = access0; + } + internalAccessPath = path; + } + + + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-07-26 13:09:12
|
Revision: 22628 http://sourceforge.net/p/jmol/code/22628 Author: hansonr Date: 2024-07-26 13:09:09 +0000 (Fri, 26 Jul 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.21" // (legacy) also 16.2.22 (swingJS) bug fix: PyMOLReader handling of measurement and atom labels refined bug fix: PyMOLReader skipping display of nonbonded atoms (water as red stars) bug fix: PyMOLReader mishandling unique settings for valence new feature: PyMOLReader FILTER "SHOWVALENCE" -- may be needed for PyMOL files that have not been saved with valence setting ON in order to show multiple bonds in Jmol -- note that PyMOL valence_mode setting is NOT implemented in Jmol Modified Paths: -------------- trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/j2s/timestamp trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.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/render/SticksRenderer.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2024-07-24 00:27:28 UTC (rev 22627) +++ trunk/Jmol/j2s/timestamp 2024-07-26 13:09:09 UTC (rev 22628) @@ -1 +1 @@ -20240719082216 +20240724075120 Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java 2024-07-24 00:27:28 UTC (rev 22627) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java 2024-07-26 13:09:09 UTC (rev 22628) @@ -395,4 +395,8 @@ this.size = (int) (size * 1000); } + @Override + public String toString() { + return "[JmolObject " + id + " " + (bsAtoms == null ? "" : bsAtoms.cardinality() + " atoms")+"]"; + } } \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2024-07-24 00:27:28 UTC (rev 22627) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2024-07-26 13:09:09 UTC (rev 22628) @@ -6287,6 +6287,7 @@ case label_digits: case ribbon_sampling: return 1; + case auto_show_spheres: case sphere_transparency: case ellipsoid_transparency: case ribbon_transparency: @@ -6299,7 +6300,6 @@ case surface_mode: case surface_solvent: case all_states: - case valence: case cgo_transparency: case cartoon_fancy_helices: case cartoon_putty_transform: @@ -6308,12 +6308,16 @@ case ribbon_radius: case ribbon_smooth: case sphere_solvent: + case stick_ball: case surface_carve_cutoff: + case valence: return 0; case cartoon_loop_radius: return 0.2F; case cartoon_rect_length: return 1.4F; + case stick_ball_ratio: + return 1.0f; case nonbonded_size: return 0.25F; case fog_start: Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2024-07-24 00:27:28 UTC (rev 22627) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2024-07-26 13:09:09 UTC (rev 22628) @@ -106,8 +106,10 @@ private BS bsStructureDefined = new BS(); private BS bsBytesExcluded; + private BS bsValence = new BS(); private int[] atomMap; + private int[] jmolToUniqueID; private Map<String, BS> ssMapSeq; private PyMOLScene pymolScene; @@ -146,6 +148,15 @@ private boolean haveBinaryArrays = true; + private byte[] aTemp = new byte[16]; + private final P3 ptTemp = new P3(); + + + /** + * set TRUE using FILTER "SHOWVALENCE" to force multiple bonding + */ + private boolean forceValence; + @Override protected void setup(String fullPath, Map<String, Object> htParams, Object reader) { isBinary = mustFinalizeModelSet = true; @@ -156,6 +167,7 @@ protected void initializeReader() throws Exception { baseAtomIndex = ((Integer) htParams.get("baseAtomIndex")).intValue(); baseModelIndex = ((Integer) htParams.get("baseModelIndex")).intValue(); + forceValence = checkFilterKey("SHOWVALENCE"); asc.setInfo("noAutoBond", Boolean.TRUE); asc.setCurrentModelInfo("pdbNoHydrogens", Boolean.TRUE); @@ -162,7 +174,6 @@ asc.setInfo("isPyMOL", Boolean.TRUE); if (isTrajectory) trajectorySteps = new Lst<P3[]>(); - isStateScript = htParams.containsKey("isStateScript"); sourcePNGJ = htParams.containsKey("sourcePNGJ"); doResize = checkFilterKey("DORESIZE"); @@ -401,7 +412,13 @@ } int n = names.size(); + int nAtomsJmol = 0; for (int j = 0; j < stateCount; j++) { + for (int i = 1; i < n; i++) + nAtomsJmol += processObject(listAt(names, i), true, j, true); + } + jmolToUniqueID = new int[nAtomsJmol]; + for (int j = 0; j < stateCount; j++) { if (!doGetModel(++nModels, null)) continue; model(nModels, null); @@ -412,10 +429,10 @@ trajectoryPtr = 0; } for (int i = 1; i < n; i++) - processObject(listAt(names, i), true, j); + processObject(listAt(names, i), true, j, false); } for (int i = 1; i < n; i++) - processObject(listAt(names, i), false, 0); + processObject(listAt(names, i), false, 0, false); pymolScene.setReaderObjectInfo(null, 0, null, false, null, null, null); // meshes are special objects that depend upon grid map data @@ -458,14 +475,13 @@ Lst<Object> setting = (Lst<Object>) settings.get(i); int i2 = intAt(setting, 0); if (i2 == -1) { - //Logger.info("PyMOL reader adding null setting #" + i); settings.set(i, new Lst<Object>()); // PyMOL 1.7 needs this } else { while (i < i2) { - //Logger.info("PyMOL reader adding null setting #" + i); settings.add(i++, new Lst<Object>()); n++; } + System.out.println("PyMOL global setting " + setting); } } return settings; @@ -501,6 +517,7 @@ private int setUniqueSettings(Lst<Object> list) { uniqueSettings = new Hashtable<Integer, Lst<Object>>(); int max = 0; + int n = 0; if (list != null && list.size() != 0) { for (int i = list.size(); --i >= 0;) { Lst<Object> atomSettings = (Lst<Object>) list.get(i); @@ -512,17 +529,19 @@ Lst<Object> setting = (Lst<Object>) mySettings.get(j); int type = intAt(setting, 0); int uid = (id << 10) + type; - //System.out.println("uniqu " + id + " " + type + " " + uid); uniqueSettings.put(Integer.valueOf(uid), setting); - //System.out.println("PyMOL unique setting " + id + " " + setting); + n++; + if (type != 64) + System.out.println("UniqueSetting " + id + " " + setting); + if (Logger.debugging) + Logger.info("PyMOL unique setting " + id + " " + setting); } } } + Logger.info("PyMOL uniqueSettings: " + n); return max; } - private final P3 ptTemp = new P3(); - /** * Add new colors from the main "colors" map object. * Not 100% clear how color clamping works. @@ -681,17 +700,18 @@ * @param execObject * @param moleculeOnly * @param iState + * @param justCountJmolAtoms */ @SuppressWarnings("unchecked") - private void processObject(Lst<Object> execObject, boolean moleculeOnly, - int iState) { + private int processObject(Lst<Object> execObject, boolean moleculeOnly, + int iState, boolean justCountJmolAtoms) { if (execObject == null) - return; + return 0; int type = intAt(execObject, 4); - Lst<Object> startLen = (Lst<Object>) execObject - .get(execObject.size() - 1); - if ((type == PyMOL.OBJECT_MOLECULE) != moleculeOnly || !checkObject(execObject)) - return; + Lst<Object> startLen = (Lst<Object>) execObject.get(execObject.size() - 1); + if ((type == PyMOL.OBJECT_MOLECULE) != moleculeOnly + || !checkObject(execObject)) + return 0; Lst<Object> pymolObject = listAt(execObject, 5); Lst<Object> stateSettings = null; if (type == PyMOL.OBJECT_MOLECULE) { @@ -699,10 +719,13 @@ Lst<Object> state = listAt(states, iState); Lst<Object> idxToAtm = listAt(state, 3); if (iState > 0 && (idxToAtm == null || idxToAtm.size() == 0)) - return; + return 0; stateSettings = listAt(state, 7); + if (justCountJmolAtoms) { + return intAt(pymolObject, 3); + } } else if (iState > 0) { - return; + return 0; } Logger.info("PyMOL model " + (nModels) + " Object " + objectName @@ -783,6 +806,7 @@ } if (msg != null) Logger.error("Unprocessed object type " + msg + " " + objectName); + return 0; } /** @@ -902,8 +926,7 @@ } else { coords = listAt(state, 2); idxToAtm = listAt(state, 3); - // atomToIdx = listAt(state, 4); - + // atomToIdx = listAt(state, 4); labelPositions = listAt(state, 8); if (idxToAtm != null) n = idxToAtm.size(); @@ -917,7 +940,6 @@ ssMapSeq = new Hashtable<String, BS>(); if (iState == 0) processMolCryst(listAt(pymolObject, 10)); - Lst<Bond> bonds = getBondList(listAt(pymolObject, 6)); Lst<Object> pymolAtoms = listAt(pymolObject, 7); atomMap = new int[nAtoms]; BS bsAtoms = pymolScene.setAtomMap(atomMap, ac0); @@ -926,6 +948,7 @@ // TODO: Implement trajectory business here. + pymolScene.htSpacefill.clear(); if (iState == 0 || !isTrajectory) { pymolScene.ensureCapacity(n); String[] lexStr = null; @@ -948,7 +971,7 @@ trajectoryStep[trajectoryPtr++] = a; } } - addBonds(bonds); + addBonds(getBondList(listAt(pymolObject, 6))); addMolStructures(); atoms = asc.atoms; if (!isStateScript) { @@ -999,9 +1022,6 @@ } } - byte[] aTemp = new byte[16]; - - /** * Pick up the crystal data. * @@ -1056,8 +1076,11 @@ } if (order < 1 || order > 3) order = 1; - order |= (asSingle || order == 1 ? JmolAdapter.ORDER_PYMOL_SINGLE + boolean isSpecial = (order > 1 && bsValence.get(ia) && bsValence.get(ib)); + order |= (order == 1 || asSingle && !isSpecial ? JmolAdapter.ORDER_PYMOL_SINGLE : JmolAdapter.ORDER_PYMOL_MULT); + // initially this is an apt + Bond bond = new Bond(ia, ib, order); bond.uniqueID = uid; bondList.addLast(bond); @@ -1137,7 +1160,7 @@ * @param atomArray * @param vArray * @param lexStr - * @param icoord + * @param idx * array pointer into coords (/3) * @param coords * coordinates array @@ -1153,7 +1176,7 @@ */ private P3 addAtom(Lst<Object> pymolAtoms, int apt, byte[] atomArray, int[] vArray, String[] lexStr, - int icoord, + int idx, Lst<Object> coords, float[] coordArray, Lst<Object> labelPositions, Lst<Object> uniqueIds, float[] labelArray, BS bsState, int iState) { @@ -1241,11 +1264,15 @@ if (uniqueID == 0) { uniqueID = -1; if (uniqueIds != null) { - Integer id = (Integer) uniqueIds.get(apt); - if (id != null) + Integer id = (Integer) uniqueIds.get(idx); + if (id != null) { uniqueID = id.intValue(); + } } } + if (forceValence || pymolScene.getUniqueFloatDef(uniqueID, PyMOL.valence, pymolScene.valence) == 1) { + bsValence.set(apt); + } if (insCode == null) { int len = resi.length(); char ch = (len > 0 ? resi.charAt(len - 1) : ' '); @@ -1259,12 +1286,13 @@ if (sym.equals("A")) sym = "C"; int ichain = vwr.getChainID(chainID, true); - Atom atom = processAtom(new Atom(), name, (altLoc.length() == 0 ? ' ' : altLoc.charAt(0)), group3, - ichain, seqNo, insCode.charAt(0), isHetero, sym); + Atom atom = processAtom(new Atom(), name, + (altLoc.length() == 0 ? ' ' : altLoc.charAt(0)), group3, ichain, seqNo, + insCode.charAt(0), isHetero, sym); if (!filterPDBAtom(atom, fileAtomIndex++)) return null; float x, y, z; - icoord *= 3; + int icoord = idx * 3; if (haveBinaryArrays) { x = coordArray[icoord]; y = coordArray[++icoord]; @@ -1304,12 +1332,19 @@ if (anisou != null && anisou[0] != 0) asc.setAnisoBorU(atom, anisou, 12); pymolScene.setAtomColor(atomColor); + if (pymolScene.getUniqueFloatDef(uniqueID, PyMOL.valence, pymolScene.valence) == 1) { + bsValence.set(apt); + } + processAtom2(atom, serNo, x, y, z, formalCharge); // set pymolScene bit sets and create labels - if (!bonded) + if (!bonded) { + // setting 420 apparently this is not necessary + //if (pymolScene.getUniqueFloatDef(uniqueID, PyMOL.auto_show_spheres, 0) == 0) pymolScene.bsNonbonded.set(ac); + } if (label.trim().length() > 0) { pymolScene.bsLabeled.set(ac); float[] labelPos = new float[7]; @@ -1320,7 +1355,7 @@ Lst<Object> labelOffset = listAt(labelPositions, apt); if (labelOffset != null) { for (int i = 0; i < 7; i++) - labelPos[i] = floatAt(labelOffset, i); + labelPos[i] = floatAt(labelOffset, i); } } labelPos = PyMOL.fixAllZeroLabelPosition(labelPos); @@ -1337,6 +1372,7 @@ pymolScene.bsHydrogen.set(ac); if ((flags & PyMOL.FLAG_NOSURFACE) != 0) pymolScene.bsNoSurface.set(ac); + jmolToUniqueID[ac] = uniqueID; atomMap[apt] = ac++; return null; } @@ -1368,15 +1404,31 @@ int n = bonds.size(); for (int i = 0; i < n; i++) { Bond bond = bonds.get(i); - bond.atomIndex1 = atomMap[bond.atomIndex1]; - bond.atomIndex2 = atomMap[bond.atomIndex2]; - if (bond.atomIndex1 < 0 || bond.atomIndex2 < 0) + int a1 = atomMap[bond.atomIndex1]; + int a2 = atomMap[bond.atomIndex2]; + if (a1 < 0 || a2 < 0) continue; + bond.atomIndex1 = a1; + bond.atomIndex2 = a2; + checkStickBall(a1); + checkStickBall(a2); pymolScene.setUniqueBond(bondCount++, bond.uniqueID); asc.addBond(bond); } } + private void checkStickBall(int iatom) { + int id = jmolToUniqueID[iatom]; + float radius = (pymolScene.getUniqueFloatDef(id, PyMOL.stick_ball, pymolScene.stickBalls)); + if (radius == 1) { + radius = pymolScene.getUniqueFloatDef(id, PyMOL.stick_radius, pymolScene.stickRadius) + * pymolScene.getUniqueFloatDef(id, PyMOL.stick_ball_ratio, pymolScene.stickBallRatio); + } else { + radius = 0; + } + pymolScene.addSpacefill(iatom, radius, false); + } + private void addMolStructures() { addMolSS("H", STR.HELIX); addMolSS("S", STR.SHEET); Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2024-07-24 00:27:28 UTC (rev 22627) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2024-07-26 13:09:09 UTC (rev 22628) @@ -93,7 +93,8 @@ // private -- only needed for file reading - private Map<Float, BS> htSpacefill = new Hashtable<Float, BS>(); + Map<Float, BS> htSpacefill = new Hashtable<Float, BS>(); + BS bsSpacefillSphere = new BS(); private Map<String, BS> ssMapAtom = new Hashtable<String, BS>(); private Lst<Integer> atomColorList = new Lst<Integer>(); private Map<String, Boolean> occludedObjects = new Hashtable<String, Boolean>(); @@ -131,6 +132,8 @@ // private -- needed for processing Scenes + private final P3 ptTemp = new P3(); + private BS bsCartoon = new BS(); private Map<String, BS> htCarveSets = new Hashtable<String, BS>(); private Map<String, BS> htDefinedAtoms = new Hashtable<String, BS>(); @@ -149,16 +152,7 @@ private Map<Integer, Lst<Object>> uniqueSettings; private Map<Integer, Integer> uniqueList; private BS bsUniqueBonds; - void setUniqueBond(int index, int uniqueID) { - if (uniqueID < 0) - return; - if (uniqueList == null) { - uniqueList = new Hashtable<Integer, Integer>(); - bsUniqueBonds = new BS(); - } - uniqueList.put(Integer.valueOf(index), Integer.valueOf(uniqueID)); - bsUniqueBonds.set(index); - } + private int bgRgb; private int dotColor; private int surfaceMode; @@ -178,6 +172,11 @@ private float sphereTranslucency; private float stickTranslucency; private float transparency; + float stickBallRatio; + float stickBalls; + float stickRadius; + float valence; + private boolean cartoonLadderMode; private boolean cartoonRockets; private boolean haveNucleicLadder; @@ -218,10 +217,6 @@ String surfaceInfoName; String modelName; - void setStateCount(int stateCount) { - this.stateCount = stateCount; - } - PyMOLScene(PymolAtomReader reader, Viewer vwr, Lst<Object> settings, Map<Integer, Lst<Object>> uniqueSettings, int pymolVersion, boolean haveScenes, int baseAtomIndex, int baseModelIndex, @@ -242,6 +237,21 @@ labelPosition0 = pointSetting(PyMOL.label_position); } + void setUniqueBond(int index, int uniqueID) { + if (uniqueID < 0) + return; + if (uniqueList == null) { + uniqueList = new Hashtable<Integer, Integer>(); + bsUniqueBonds = new BS(); + } + uniqueList.put(Integer.valueOf(index), Integer.valueOf(uniqueID)); + bsUniqueBonds.set(index); + } + + void setStateCount(int stateCount) { + this.stateCount = stateCount; + } + /** * Find the color setting and return an int AARRGGBB for it; * Accept either an integer value or an (r,g,b) triplet @@ -312,6 +322,10 @@ } private void getObjectSettings() { + stickBallRatio = floatSetting(PyMOL.stick_ball_ratio); + stickBalls = floatSetting(PyMOL.stick_ball); + stickRadius = floatSetting(PyMOL.stick_radius); + valence = floatSetting(PyMOL.valence); transparency = floatSetting(PyMOL.transparency); dotColor = (int) floatSetting(PyMOL.dot_color); nonbondedSize = floatSetting(PyMOL.nonbonded_size); @@ -678,8 +692,6 @@ bs.set(atomMap[PyMOLReader.intAt(list, i)]); } - private final P3 ptTemp = new P3(); - void setReaderObjects() { clearReaderData(); finalizeObjects(); @@ -1104,7 +1116,7 @@ } offset = PyMOL.fixAllZeroLabelPosition(offset); if (offset == null) - offset = new float[] {1, 0, 0, 0, 0, 0, 0}; + offset = new float[] {Text.PYMOL_LABEL_OFFSET_REL_ANG, 0, 0, 0, 0, 0, 0}; int nDigits = (int) floatSetting(MEAS_DIGITS[nCoord - 2]); String strFormat = nCoord + ": " + (drawLabel ? "%0." + (nDigits < 0 ? 1 : nDigits) + "VALUE" : ""); @@ -1194,7 +1206,7 @@ BS bsAtoms = htDefinedAtoms.get(objectJmolName); if (bsAtoms == null) { bsAtoms = BS.newN(ac0 + atomMap.length); - Logger.info("PyMOL molecule " + objectName); + Logger.info("PyMOL molecule " + objectName + " " + objectHidden); htDefinedAtoms.put(objectJmolName, bsAtoms); htObjectAtoms.put(objectName, bsAtoms); moleculeNames.addLast(objectName); @@ -1325,7 +1337,6 @@ } private void fixReps(BS[] reps) { - htSpacefill.clear(); bsCartoon.clearAll(); for (int iAtom = bsAtoms.nextSetBit(0); iAtom >= 0; iAtom = bsAtoms .nextSetBit(iAtom + 1)) { @@ -1340,11 +1351,7 @@ rad = nonbondedSize; } if (rad != 0) { - Float r = Float.valueOf(rad); - BS bsr = htSpacefill.get(r); - if (bsr == null) - htSpacefill.put(r, bsr = new BS()); - bsr.set(iAtom); + addSpacefill(iAtom, rad, true); } int cartoonType = (reader == null ? cartoonTypes[iAtom] : reader .getCartoonType(iAtom)); @@ -1392,6 +1399,17 @@ bsCartoon.and(reps[PyMOL.REP_CARTOON]); } + void addSpacefill(int iAtom, float rad, boolean doCheck) { + if (doCheck && bsSpacefillSphere.get(iAtom)) + return; + bsSpacefillSphere.set(iAtom); + Float r = Float.valueOf(rad); + BS bsr = htSpacefill.get(r); + if (bsr == null) + htSpacefill.put(r, bsr = new BS()); + bsr.set(iAtom); + } + /** * PyMOL does not display cartoons or traces for single-residue runs. This * two-pass routine first sets bits in a residue bitset, then it clears out @@ -1543,7 +1561,9 @@ float[] sizes = new float[n]; for (int pt = 0, i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1), pt++) { int id = (reader == null ? uniqueIDs[i] : reader.getUniqueID(i)); - if (colixes != null) { + if (setColor == 0) { + + } else { int c = (int) getUniqueFloatDef(id, setColor, color); if (c > 0) colixes[pt] = getColix(c, 0); Modified: trunk/Jmol/src/org/jmol/render/SticksRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/SticksRenderer.java 2024-07-24 00:27:28 UTC (rev 22627) +++ trunk/Jmol/src/org/jmol/render/SticksRenderer.java 2024-07-26 13:09:09 UTC (rev 22628) @@ -121,7 +121,7 @@ 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 + multipleBondSpacing = (isPymol ? 0.26f : vwr .getFloat(T.multiplebondspacing)); // negative radius factor indicates perpendicular fixed double bond multipleBondRadiusFactor = (isPymol ? 0.4f : vwr Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-07-24 00:27:28 UTC (rev 22627) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-07-26 13:09:09 UTC (rev 22628) @@ -54,8 +54,20 @@ # FEATURE REQUEST: dock/undock consoles to main window. # TODO: allow FIXED to work with MODELKIT MINIMIZE -Jmol.___JmolVersion="16.2.19" // (legacy) also 16.2.20 (swingJS) +Jmol.___JmolVersion="16.2.21" // (legacy) also 16.2.22 (swingJS) +bug fix: PyMOLReader handling of measurement and atom labels refined +bug fix: PyMOLReader skipping display of nonbonded atoms (water as red stars) +bug fix: PyMOLReader mishandling unique settings for valence + +new feature: PyMOLReader FILTER "SHOWVALENCE" + -- may be needed for PyMOL files that have not been saved with valence setting ON + in order to show multiple bonds in Jmol + -- note that PyMOL valence_mode setting is NOT implemented in Jmol + + +JmolVersion="16.2.19" // (legacy) also 16.2.20 (swingJS) + bug fix: SHELX reader LATT 1 does not add "x,y,z" so does not also add "-x,-y,-z" bug fix: DRAW ARROW can produce very long head This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-07-24 00:27:32
|
Revision: 22627 http://sourceforge.net/p/jmol/code/22627 Author: hansonr Date: 2024-07-24 00:27:28 +0000 (Wed, 24 Jul 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.19" // (legacy) also 16.2.20 (swingJS) includes update for PyMOL labels and measurements bug fix: SHELX reader LATT 1 does not add "x,y,z" so does not also add "-x,-y,-z" bug fix: DRAW ARROW can produce very long head -- now limited to 1.5 * width of arrowhead (4.5 * width of arrow shaft) bug fix: PyMOLReader does not recognize default label position (skips labels and measurements) bug fix: PyMOLReader assigns wrong background color bug fix: PyMOLReader fails to read file when it includes a default (null) measurement dash setting bug fix: PyMOLReader creates measurement dots that are too large bug fix: CIFReader fails to read multiple structures if _shelx_hkl_file is found bug fix: MODELKIT SPACEGROUP 10:bca not reversion any prior nonstandard setting bug fix: MODELKIT SPACEGROUP 145:a-b,a+2b,c fails -- had not completed implementation of expanded unit cells for settings # new features from the Denver 2024 ACA meeting: # see https://github.com/BobHanson/CLEG/tree/main/presentations # for the presentation "A Concise Linear Encoding of Crystallographic Space Group Settings # and Group-Subgroup Relationships" # # also see https://crystals.symotter.org/ for # the new Jmol Space Group Visualizer. https://spacegroups.symotter.org # presented by Dean Johnston at the ACA meeting new feature: CIFReader filter "StopOnSHELXHKL" -- stops reading file when _shelx_hkl_file is found -- should not be used with multiple structures -- default FALSE; prior version this was (effectively) default TRUE but that causes problems for multiple-stucture CIF files new feature: SHELX reader and CIFReader by default assign translucent 0.5 to symmetry-related disorder -- PART -n -- for example, when a solvent is alternatively on one side or another of a C2 rotation new feature: matrix("!b,c,a>a-c,b,2c;0,0,1/2>a,-a-c,b") -- calculates the transformation from a CLEG chain -- same as matrix("!b,c,a")*matrix(">a-c,b,2c;0,0,1/2")*matrix("a,-a-c,b") -- also works for operations expressed in x,y,z feature change: DRAW SPACEGROUP ALL glide arrows thicker and colored green -- the thin yellow lines were hard to see on slides in Denver scripting note: algorithm for generating operations from generators: // start with the array of "x,y,z" generators function getGeneralPositions(gen) { var a = []; var b = [matrix("x,y,z")]; var s= "" for (var i = 1; i <= gen.length; i++) { for (var j = 1; j <= b.length; j++) { var m = matrix(gen[i])*matrix(b[j]); // normalize to positive ("unitary") translations only // by pulling the translation out, turning it into cartesians, and then unifying it, // then adding it back into the 3x3 to regenerate a 4x4 operation m = m%1 + (m%2).xyz.uxyz var xyz = matrix(m,"xyz"); var key = ";"+xyz+";"; if (s.find(key) == 0) { // only add already-unfound operations s += key; b.push(m); a.push(xyz); } } } return a; } scripting note: Using CLEG notation; showing the 3D model of Figure 1.5.1.8 based on matrices in Table 1.5.1.1, p. 79 Primitive hexagonal cell P with a, b, c and the three triple hexagonal cells H with a1; b1; c; a2; b2; c; a3; b3; c. The origin for all cells is the same. International Tables for Crystallography (2016). Vol. A, Section 1.5.1.2, p. 82. https://onlinelibrary.wiley.com/iucr/itc/Ac/ch1o5v0001/sec1o5o1o2.pdf modelkit zap spacegroup 145 draw u0 unitcell color white draw s0 spacegroup all modelkit spacegroup 145:a-b,a+2b,c draw u1 unitcell color pink draw s1 spacegroup all modelkit spacegroup 145:2a+b,-a+b,c draw u2 unitcell color red draw s2 spacegroup all modelkit spacegroup 145:a+2b,-2a-b,c draw u3 unitcell color purple draw s3 spacegroup all modelkit spacegroup 145 Modified Paths: -------------- trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/jsv/build_info.properties trunk/Jmol/src/jspecview/common/PanelData.java trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.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/adapter/readers/xml/XmlCdxReader.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/modelset/Text.java trunk/Jmol/src/org/jmol/render/EchoRenderer.java trunk/Jmol/src/org/jmol/render/FontLineShapeRenderer.java trunk/Jmol/src/org/jmol/render/LabelsRenderer.java trunk/Jmol/src/org/jmol/render/MeasuresRenderer.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/util/Font.java trunk/Jmol/src/org/jmol/util/GData.java trunk/Jmol/src/org/jmol/viewer/StateCreator.java Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/jsv/build_info.properties =================================================================== --- trunk/Jmol/jsv/build_info.properties 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/jsv/build_info.properties 2024-07-24 00:27:28 UTC (rev 22627) @@ -1,4 +1,4 @@ -#Wed, 17 Jul 2024 10:46:54 -0500 +#Tue, 23 Jul 2024 17:30:38 -0500 build.major.number=2 -build.revision.number=11978 +build.revision.number=11979 build.minor.number=0 Modified: trunk/Jmol/src/jspecview/common/PanelData.java =================================================================== --- trunk/Jmol/src/jspecview/common/PanelData.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/jspecview/common/PanelData.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -885,7 +885,7 @@ } int face = jsvp.getFontFaceID(isPrinting ? printingFontName : displayFontName); - return currentFont = Font.createFont3D(face, style, size, size, jsvp.getApiPlatform(), g); + return currentFont = Font.createFont3D(face, style, size, size, 0, jsvp.getApiPlatform(), g); } // listeners to handle various events, from GraphSet or AwtPanel Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOL.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -381,6 +381,8 @@ final static int label_font_id = 328; final static int label_outline_color = 467; final static int label_position = 471; + final static int label_placement_offset = 718; + final static int label_shadow_mode = 462; final static int label_size = 453; final static int legacy_mouse_zoom = 442; @@ -6229,6 +6231,8 @@ }; static int getRGB(int color) { + if ((color & 0xFF000000) != 0) + return color; if (moreColors != null) { Integer key = Integer.valueOf(color); Integer c = moreColors.get(key); @@ -6235,9 +6239,7 @@ if (c != null) return c.intValue(); } - if (color < colors.length) - return (colors[color]); - return 0; + return (color < colors.length ? colors[color] : color); } private final static Map<Integer, Integer> moreColors = new Hashtable<Integer, Integer>(); @@ -6364,7 +6366,7 @@ static P3 getDefaultSettingPt(int i, int pymolVersion, P3 pt) { switch (i) { case label_position: - pt.set(0, 0, 0.75f); + pt.set(0, 0, 1.75f); // was 0.75, but that does not work in PyMOL or Jmol -- just dead center. break; default: Logger.error("PyMOL " + pymolVersion + " default point setting not found: " + i); @@ -6889,13 +6891,14 @@ * If the label position array is all zeros, set the first value to 1.0, indicating "default". * * @param labelPos + * @return labelPos or null if all zeros (use unique_settings) */ - static void fixAllZeroLabelPosition(float[] labelPos) { + static float[] fixAllZeroLabelPosition(float[] labelPos) { for (int i = 0; i < 7; i++) { if (labelPos[i] != 0) - return; + return labelPos; } - labelPos[0] = 1; // default position + return null; } } Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -455,13 +455,14 @@ int n = settings.size(); for (int i = 0; i < n; i++) { @SuppressWarnings("unchecked") - int i2 = intAt((Lst<Object>) settings.get(i), 0); + Lst<Object> setting = (Lst<Object>) settings.get(i); + int i2 = intAt(setting, 0); if (i2 == -1) { - Logger.info("PyMOL reader adding null setting #" + i); + //Logger.info("PyMOL reader adding null setting #" + i); settings.set(i, new Lst<Object>()); // PyMOL 1.7 needs this } else { while (i < i2) { - Logger.info("PyMOL reader adding null setting #" + i); + //Logger.info("PyMOL reader adding null setting #" + i); settings.add(i++, new Lst<Object>()); n++; } @@ -509,7 +510,9 @@ Lst<Object> mySettings = (Lst<Object>) atomSettings.get(1); for (int j = mySettings.size(); --j >= 0;) { Lst<Object> setting = (Lst<Object>) mySettings.get(j); - int uid = (id << 10) + intAt(setting, 0); + int type = intAt(setting, 0); + int uid = (id << 10) + type; + //System.out.println("uniqu " + id + " " + type + " " + uid); uniqueSettings.put(Integer.valueOf(uid), setting); //System.out.println("PyMOL unique setting " + id + " " + setting); } @@ -855,7 +858,7 @@ if (nCoord == 0) return; Lst<Object> setting = listAt(pymolObject, 0); - BS bsReps = getBsReps(listAt(setting, 3)); + BS bsReps = getBsReps(setting, 3); Lst<Object> list = listAt(measure, pt); Lst<Object> offsets = listAt(measure, 8); boolean haveLabels = (measure.size() > 8); @@ -877,6 +880,7 @@ Lst<Object> idxToAtm; Lst<Object> coords; Lst<Object> labelPositions; + Lst<Object> uniqueIds = listAt(state, 11); int[] idxArray = null; float[] coordsArray = null; float[] labelArray = null; @@ -935,10 +939,11 @@ vArray = (haveBinaryArrays ? PyMOL.getVArray(ver) : null); } for (int idx = 0; idx < n; idx++) { - P3 a = addAtom(pymolAtoms, (idxToAtm != null ? intAt(idxToAtm, idx) - : idxArray != null ? idxArray[idx] : idx), + int index = (idxToAtm != null ? intAt(idxToAtm, idx) + : idxArray != null ? idxArray[idx] : idx); + P3 a = addAtom(pymolAtoms, index, atomArray, vArray, lexStr, idx, coords, - coordsArray, labelPositions, labelArray, bsAtoms, iState); + coordsArray, labelPositions, uniqueIds, labelArray, bsAtoms, iState); if (a != null) trajectoryStep[trajectoryPtr++] = a; } @@ -946,8 +951,10 @@ addBonds(bonds); addMolStructures(); atoms = asc.atoms; - if (!isStateScript) + if (!isStateScript) { + asc.setCurrentModelInfo("name", pymolScene.modelName); createShapeObjects(); + } ssMapSeq = null; Logger.info("reading " + (ac - ac0) + " atoms and " + nBonds + " bonds"); @@ -1136,6 +1143,7 @@ * coordinates array * @param coordArray * @param labelPositions + * @param uniqueIds * @param labelArray * @param bsState * this state -- Jmol atomIndex @@ -1147,7 +1155,7 @@ byte[] atomArray, int[] vArray, String[] lexStr, int icoord, Lst<Object> coords, float[] coordArray, - Lst<Object> labelPositions, float[] labelArray, + Lst<Object> labelPositions, Lst<Object> uniqueIds, float[] labelArray, BS bsState, int iState) { atomMap[apt] = -1; String chainID, altLoc, group3, name, sym, label, ssType, resi, insCode = null; @@ -1191,8 +1199,6 @@ cartoonType = atomInt(atomArray, pt, vArray[PyMOL.CARTOON]); flags = atomInt(atomArray, pt, vArray[PyMOL.FLAGS]); uniqueID = atomInt(atomArray, pt, vArray[PyMOL.UNIQUEID]); - if (uniqueID == 0) - uniqueID = -1; anisou = new float[8]; if ((vpt = vArray[PyMOL.ANISOU]) > 0) for (int i = 0; i < 6; i++) @@ -1221,7 +1227,7 @@ partialCharge = floatAt(a, 17); formalCharge = intAt(a, 18); isHetero = (intAt(a, 19) != 0); - bsReps = getBsReps(listAt(a, 20)); + bsReps = getBsReps(a, 20); intReps = (bsReps == null ? intAt(a, 20) : 0); // Pymol 1.8 atomColor = intAt(a, 21); serNo = intAt(a, 22); @@ -1228,10 +1234,18 @@ cartoonType = intAt(a, 23); flags = intAt(a, 24); bonded = (intAt(a, 25) != 0); - uniqueID = (a.size() > 40 && intAt(a, 40) == 1 ? intAt(a, 32) : -1); + uniqueID = (a.size() > 40 && intAt(a, 40) == 1 ? intAt(a, 32) : 0); if (a.size() > 46) anisou = floatsAt(a, 41, new float[8], 6); } + if (uniqueID == 0) { + uniqueID = -1; + if (uniqueIds != null) { + Integer id = (Integer) uniqueIds.get(apt); + if (id != null) + uniqueID = id.intValue(); + } + } if (insCode == null) { int len = resi.length(); char ch = (len > 0 ? resi.charAt(len - 1) : ' '); @@ -1296,7 +1310,7 @@ if (!bonded) pymolScene.bsNonbonded.set(ac); - if (!label.equals(" ")) { + if (label.trim().length() > 0) { pymolScene.bsLabeled.set(ac); float[] labelPos = new float[7]; if (labelArray != null) { @@ -1309,7 +1323,7 @@ labelPos[i] = floatAt(labelOffset, i); } } - PyMOL.fixAllZeroLabelPosition(labelPos); + labelPos = PyMOL.fixAllZeroLabelPosition(labelPos); pymolScene.addLabel(ac, uniqueID, atomColor, labelPos, label); } if (isHidden) @@ -1647,14 +1661,27 @@ return (Lst<Object>) map.get(key); } - private static BS getBsReps(Lst<Object> list) { - if (list == null) + private static BS getBsReps(Lst<Object> setting, int pt) { + if (setting.size() <= pt) return null; BS bsReps = new BS(); - int n = Math.min(list.size(), PyMOL.REP_MAX); - for (int i = 0; i < n; i++) { - if (intAt(list, i) == 1) - bsReps.set(i); + Object o = setting.get(pt); + if (o instanceof Integer) { + int bits = ((Integer) o).intValue(); + for (int i = 0, b = 1; i < 32; i++) { + if ((bits & b) != 0) { + bsReps.set(i); + } + b <<= 1; + } + } else { + @SuppressWarnings("unchecked") + Lst<Object> list = (Lst<Object>) o; + int n = Math.min(list.size(), PyMOL.REP_MAX); + for (int i = 0; i < n; i++) { + if (intAt(list, i) == 1) + bsReps.set(i); + } } return bsReps; } Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -72,6 +72,14 @@ // ring_radius // ring_width + private final static int[] MEAS_DIGITS = { + PyMOL.label_distance_digits, + PyMOL.label_angle_digits, + PyMOL.label_dihedral_digits + }; + + private static final double PYMOL_FONT_SIZE_FACTOR = 1.25d; + private Viewer vwr; private int pymolVersion; @@ -234,6 +242,12 @@ labelPosition0 = pointSetting(PyMOL.label_position); } + /** + * Find the color setting and return an int AARRGGBB for it; + * Accept either an integer value or an (r,g,b) triplet + * @param i + * @return AARRGGBB + */ @SuppressWarnings("unchecked") private int colorSetting(int i) { Lst<Object> pos = PyMOLReader.listAt(settings, i); @@ -634,7 +648,8 @@ // through all molecules... // for (int m = moleculeNames.size(); --m >= 0;) { for (int m = 0; m < moleculeNames.size(); m++) { - setSceneObject(moleculeNames.get(m), thisState); + String name = moleculeNames.get(m); + setSceneObject(name, thisState); if (objectHidden) continue; BS[] molReps = new BS[PyMOL.REP_JMOL_MAX]; @@ -917,15 +932,50 @@ icolor = atomColor; } if (labelPos == null) { - P3 offset = getUniquePoint(uniqueID, PyMOL.label_position, null); - if (offset == null) - offset = labelPosition; - else - offset.add(labelPosition); - setLabelPosition(offset, labelPos); + labelPos = setLabelPosition( + getUniquePoint(uniqueID, PyMOL.label_position, labelPosition), + labelPos, false); + + // from pymol/data/setting_help.csv + // + // "label_position","controls the position and alignment of labels in camera X, Y, and Z. + // Values between -1.0 and 1.0 affect alignment only, with the label attached to the atom position. + // Values beyond that range represent coordinate displacements. + // For the z dimension, values from -1 to 1 do not mean anything. Values above 1 and below -1 are offsets + // (minus 1 of the absolute value) in world coordinates. For example, the default 1.75 is .75 angstroms closer + // to the viewer.","vector","[0.0, 0.0, 1.75]","4" + // + // "label_placement_offset","controls the position of labels in camera X, Y, and Z. + // This value is changed at the atom-state level when the labels are dragged with the mouse. + // This setting behaves similar to the label_position + // setting without the alignment functionality.","vector","[0.0, 0.0, 0.0]","4" + // + // THIS IS NOT HELPFUL!!! + // It is actually not this at all. + // These are two completely different (and additive) parameters. + // + // label_placement sets the base location of the center of the label. + // It is not in camera coordinates; it is in CARTESIAN space, a relative + // offset from the atom coordinate. + // It is static, unless the atom is moved. + // + // label_position is completely different. "-1 to 1" relates to an alignment relative to centered: + // -- horizontally, -1 is right-justified; +1 is left-justified + // anything beyond 1 or -1 is ADDED to this justification in Angstroms + // -- vertically -1 is top-aligned; +1 is bottom aligned, then similarly, + // any additional value is added in Angstroms (converted to screen coordinates). + // -- forward/back is just the same, but there is no alignment, and the + // shift is Math.max(0, abs(value) - 1)*sign(value) + // This value is adjusted at rendering time, keeping the offset the same no matter how the + // molecule is rotated. + } - labels.put(Integer.valueOf(atomIndex), newTextLabel(label, labelPos, - icolor, labelFontId, labelSize)); + P3 offset = getUniquePoint(uniqueID, PyMOL.label_placement_offset, null); + if (offset != null) { + labelPos = setLabelPosition(offset, labelPos, true); + } + labels.put(Integer.valueOf(atomIndex), + newTextLabel(label, labelPos, icolor, labelFontId, labelSize)); } float getUniqueFloatDef(int id, int key, float defaultValue) { @@ -986,11 +1036,19 @@ return setting; } - float[] setLabelPosition(P3 offset, float[] labelPos) { - labelPos[0] = 1; - labelPos[1] = offset.x; - labelPos[2] = offset.y; - labelPos[3] = offset.z; + float[] setLabelPosition(P3 offset, float[] labelPos, boolean isPlacement) { + if (labelPos == null) + labelPos = new float[7]; + labelPos[0] = Text.PYMOL_LABEL_OFFSET_REL_ANG; + if (isPlacement) { + labelPos[4] = offset.x; + labelPos[5] = offset.y; + labelPos[6] = offset.z; + } else { + labelPos[1] = offset.x; + labelPos[2] = offset.y; + labelPos[3] = offset.z; + } return labelPos; } @@ -1011,7 +1069,8 @@ return false; boolean drawLabel = haveLabels && (bsReps == null || bsReps.get(PyMOL.REP_LABELS)); boolean drawDashes = (bsReps == null || bsReps.get(PyMOL.REP_DASHES)); - float rad = floatSetting(PyMOL.dash_width) / 80; // was 20 + float rad = floatSetting(PyMOL.dash_width); + rad /= 400; // I don't know what these units are! if (rad == 0) rad = 0.05f; if (!drawDashes) @@ -1032,10 +1091,10 @@ if (isNew) { Lst<Object> points = new Lst<Object>(); for (int i = 0; i < nCoord; i++, p += 3) - points.addLast(PyMOLReader.pointAt(list, p, new Point3fi())); - offset = PyMOLReader.floatsAt(PyMOLReader.listAt(offsets, index), 0, new float[7], 7); + points.addLast(newP3i(PyMOLReader.pointAt(list, p, new P3()))); + offset = (PyMOLReader.floatsAt(PyMOLReader.listAt(offsets, index), 0, new float[7], 7)); if (offset == null) - offset = setLabelPosition(labelPosition, new float[7]); + offset = setLabelPosition(labelPosition, new float[7], false); md = mdList[index] = vwr.newMeasurementData(objectNameID + "_" + (index + 1), points); md.note = objectName; @@ -1043,21 +1102,29 @@ md = mdList[index]; offset = md.text.pymolOffset; } - PyMOL.fixAllZeroLabelPosition(offset); + offset = PyMOL.fixAllZeroLabelPosition(offset); + if (offset == null) + offset = new float[] {1, 0, 0, 0, 0, 0, 0}; int nDigits = (int) floatSetting(MEAS_DIGITS[nCoord - 2]); String strFormat = nCoord + ": " + (drawLabel ? "%0." + (nDigits < 0 ? 1 : nDigits) + "VALUE" : ""); //strFormat += " -- " + objectNameID + " " + floatSetting(PyMOL.surface_color) + " " + Integer.toHexString(c); + float fontSize = floatSetting(PyMOL.label_size); Text text = newTextLabel(strFormat, offset, clabel, - (int) floatSetting(PyMOL.label_font_id), - floatSetting(PyMOL.label_size)); + (int) floatSetting(PyMOL.label_font_id), fontSize); md.set(T.define, null, null, null, strFormat, "angstroms", null, false, false, null, - false, (int) (rad * 2000), colix, text, Float.NaN, null); + false,(int) (rad * 2000), colix, text, Float.NaN, null); addJmolObject(JC.SHAPE_MEASURES, bs, md); } return true; } + private static Point3fi newP3i(P3 p) { + Point3fi pi = new Point3fi(); + pi.set(p.x, p.y, p.z); + return pi; + } + SB getViewScript(Lst<Object> view) { SB sb = new SB(); float[] pymolView = getPymolView(view, true); @@ -1135,10 +1202,7 @@ } return bsAtoms; } - - private final static int[] MEAS_DIGITS = { PyMOL.label_distance_digits, - PyMOL.label_angle_digits, PyMOL.label_dihedral_digits }; - + private Text newTextLabel(String label, float[] labelOffset, int colorIndex, int fontID, float fontSize) { // 0 GLUT 8x13 @@ -1162,7 +1226,6 @@ // 18 DejaVuSerif_BoldOblique String face; - float factor = 1f; switch (fontID) { default: case 11: @@ -1207,8 +1270,17 @@ style = "BoldItalic"; break; } - Font font = vwr.getFont3D(face, style, fontSize == 0 ? 12 : fontSize - * factor); + +// pymol/data/setting_help.csv +// label_size controls the approximate size of label text. Negative values specify label size in world coordinates (e.g., -1. will show a label 1 angstrom in height) + + if (fontSize > 0) + fontSize *= PYMOL_FONT_SIZE_FACTOR; + // PyMOL is using the front of the viewing box; Jmol uses the center, + // so we boost this a bit to approximately match. + // note that this font could have negative size. + // this means use angstroms + Font font = vwr.getFont3D(face, style, fontSize == 0 ? 12 : fontSize); Text t = Text.newLabel(vwr, font, label, getColix( colorIndex, 0), (short) 0, 0, 0); if (t != null) Modified: trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCdxReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCdxReader.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/adapter/readers/xml/XmlCdxReader.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -42,9 +42,31 @@ /** * A reader for CambridgeSoft CDXML files. * - * See - * https://www.cambridgesoft.com/services/documentation/sdk/chemdraw/cdx/IntroCDXML.htm + * revvity site: * + * + * https://support.revvitysignals.com/hc/en-us/articles/4408233129748-Where-is-the-ChemDraw-SDK-located + * + * Their link: + * + * https://web.archive.org/web/20221209095323/https://www.cambridgesoft.com/services/documentation/sdk/chemdraw/cdx/ + * + * WayBack machine Overview: + * + * https://web.archive.org/web/20240000000000* + * /https://www.cambridgesoft.com/services/documentation/sdk/chemdraw/cdx + * + * Partial archives: + * + * https://web.archive.org/web/20160911235313/http://www.cambridgesoft.com/services/documentation/sdk/chemdraw/cdx/index.htm + * + * https://web.archive.org/web/20160310081515/http://www.cambridgesoft.com/services/documentation/sdk/chemdraw/cdx/ + * + * https://web.archive.org/web/20100503174209/http://www.cambridgesoft.com/services/documentation/sdk/chemdraw/cdx/ + * + * Unfortunately, there appears to be no single archive that has all the images, + * and so some of those are missing. + * * for the full, detailed specification. * * Here we are just looking for simple aspects that could be converted to valid Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -3156,7 +3156,7 @@ m.act = bs.cardinality(); m.isOrderly = (m.act == m.bsAtoms.length() - m.firstAtomIndex); } - deleteBonds(bsBonds, false); + dBb(bsBonds, false); vwr.shm.notifyAtoms(JC.PROP_ATOMS_DELETED, new BS[] { bsAtoms, bsModels} ); validateBspf(false); } Modified: trunk/Jmol/src/org/jmol/modelset/Text.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Text.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/modelset/Text.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -37,6 +37,17 @@ public class Text { + public final static int PYMOL_LABEL_OFFSET_JMOL= -1; + public final static int PYMOL_LABEL_OFFSET_ABS = 0; + public final static int PYMOL_LABEL_OFFSET_ANG = 0; + public final static int PYMOL_LABEL_OFFSET_REL = 1; + public final static int PYMOL_LABEL_OFFSET_PIX = 2; // and not -1 + + public final static int PYMOL_LABEL_OFFSET_ABS_ANG = 0; + public final static int PYMOL_LABEL_OFFSET_REL_ANG = PYMOL_LABEL_OFFSET_REL; + public final static int PYMOL_LABEL_OFFSET_ABS_PIX = PYMOL_LABEL_OFFSET_PIX; + public final static int PYMOL_LABEL_OFFSET_REL_PIX = PYMOL_LABEL_OFFSET_REL | PYMOL_LABEL_OFFSET_PIX; + private Viewer vwr; public boolean doFormatText; @@ -66,7 +77,56 @@ public float barDistance; + public boolean isMeasure; + public boolean isEcho; + public P3 xyz; + public String target; + public String script; + public short colix; + public short bgcolix; + public int pointer; + public float fontScale; + public int align; + public int valign; + public int atomX, atomY, atomZ = Integer.MAX_VALUE; + public int movableX, movableY, movableZ; // Echo only + public int movableXPercent = Integer.MAX_VALUE; // Echo only + public int movableYPercent = Integer.MAX_VALUE; // Echo only + public int movableZPercent = Integer.MAX_VALUE; // Echo only + + public int z = 1; // front plane + public int zSlab = Integer.MIN_VALUE; // z for slabbing purposes -- may be near an atom + + private float xAdj, yAdj; + + private float y0; + + public P3 pointerPt; // for echo + + public float[] pymolOffset; + + protected int windowWidth; + protected int windowHeight; + public boolean adjustForWindow; + public float boxWidth; + public float boxHeight; + public float boxX; + public float boxY; + + public int modelIndex = -1; + public boolean thisModelOnly; + public boolean visible = true; + public boolean hidden = false; + + public float[] boxXY; + + public float scalePixelsPerMicron; + + public int barPixelsXYZ; + + private float sppa; + public Text() { // public for reflection // requires .newLabel or .newEcho @@ -73,6 +133,17 @@ boxXY = new float[5]; } + /** + * + * @param vwr + * @param font + * @param text + * @param colix + * @param bgcolix + * @param align + * @param scalePixelsPerMicron + * @return the new label + */ static public Text newLabel(Viewer vwr, Font font, String text, short colix, short bgcolix, int align, float scalePixelsPerMicron) { // for labels and hover @@ -216,10 +287,15 @@ else this.boxXY = boxXY; setWindow(vwr.gdata.width, vwr.gdata.height, scalePixelsPerMicron); - if (scalePixelsPerMicron != 0 && this.scalePixelsPerMicron != 0) + if (font.fontSizeAngstroms != 0 || scalePixelsPerMicron != 0 && this.scalePixelsPerMicron != 0) { + if (font.fontSizeAngstroms == 0) { setFontScale(scalePixelsPerMicron / this.scalePixelsPerMicron); - else if (fontScale != imageFontScaling) + } else { + setFontScale(sppa * font.fontSizeAngstroms / font.fontSizeNominal); + } + } else if (fontScale != imageFontScaling) { setFontScale(imageFontScaling); + } if (doFormatText) { text = (isEcho ? vwr.formatText(textUnformatted) : textUnformatted); recalc(); @@ -245,7 +321,7 @@ // [1,2,3] are in Angstroms, not screen pixels float pixelsPerAngstrom = vwr.tm.scaleToScreen(z, 1000); float pz = pymolOffset[3]; - float dz = (pz < 0 ? -1 : 1) * Math.max(pz == 0 ? 0.5f : 0, Math.abs(pz) - 1) + float dz = (pz < 0 ? -1 : 1) * Math.max(pz == 0 ? 0 : 0, Math.abs(pz) - 1) * pixelsPerAngstrom; z -= (int) dz; pixelsPerAngstrom = vwr.tm.scaleToScreen(z, 1000); @@ -286,8 +362,12 @@ // xAdj and yAdj are the adjustments for the box itself relative to the text xAdj = (fontScale >= 2 ? 8 : 4); yAdj = -descent; - boxXY[0] = movableX - xAdj; - boxXY[1] = movableY - yAdj; + // a bit of a hack here. + // a bit of a hack here. +// boxXY[0] = movableX - xAdj; +// boxXY[1] = movableY - yAdj; + boxXY[0] = movableX - xAdj; + boxXY[1] = movableY - yAdj + (descent -ascent)/2 + 8; // empirical only isAbsolute = true; boxYoff2 = -2; // empirical fudge factor } else { @@ -465,12 +545,6 @@ return w; } - private float xAdj, yAdj; - - private float y0; - - public P3 pointerPt; // for echo - public void setXYA(float[] xy, int i) { if (i == 0) { xy[2] = boxX; @@ -503,27 +577,6 @@ s.append(" " + (10000f / scalePixelsPerMicron)); // Angstroms per pixel } - public boolean isMeasure; - public boolean isEcho; - public P3 xyz; - public String target; - public String script; - public short colix; - public short bgcolix; - public int pointer; - public float fontScale; - - public int align; - public int valign; - public int atomX, atomY, atomZ = Integer.MAX_VALUE; - public int movableX, movableY, movableZ; // Echo only - public int movableXPercent = Integer.MAX_VALUE; // Echo only - public int movableYPercent = Integer.MAX_VALUE; // Echo only - public int movableZPercent = Integer.MAX_VALUE; // Echo only - - public int z = 1; // front plane - public int zSlab = Integer.MIN_VALUE; // z for slabbing purposes -- may be near an atom - // PyMOL-type offset // [mode, screenoffsetx,y,z (applied after tranform), positionOffsetx,y,z (applied before transform)] @@ -548,36 +601,6 @@ // // - public final static int PYMOL_LABEL_OFFSET_JMOL= -1; - public final static int PYMOL_LABEL_OFFSET_REL = 1; - public final static int PYMOL_LABEL_OFFSET_PIX = 2; // and not -1 - - public final static int PYMOL_LABEL_OFFSET_ABS_ANG = 0; - public final static int PYMOL_LABEL_OFFSET_REL_ANG = PYMOL_LABEL_OFFSET_REL; - public final static int PYMOL_LABEL_OFFSET_ABS_PIX = PYMOL_LABEL_OFFSET_PIX; - public final static int PYMOL_LABEL_OFFSET_REL_PIX = PYMOL_LABEL_OFFSET_REL | PYMOL_LABEL_OFFSET_PIX; - - public float[] pymolOffset; - - protected int windowWidth; - protected int windowHeight; - public boolean adjustForWindow; - public float boxWidth; - public float boxHeight; - public float boxX; - public float boxY; - - public int modelIndex = -1; - public boolean thisModelOnly; - public boolean visible = true; - public boolean hidden = false; - - public float[] boxXY; - - public float scalePixelsPerMicron; - - public int barPixelsXYZ; - public void setScalePixelsPerMicron(float scalePixelsPerMicron) { fontScale = 0;//fontScale * this.scalePixelsPerMicron / scalePixelsPerMicron; this.scalePixelsPerMicron = scalePixelsPerMicron; @@ -729,10 +752,11 @@ * @param screen * @param zSlab * @param pTemp - * @param sppm + * @param sppa screen pixels per angstrom regardless of font scaling */ - public void getPymolScreenOffset(P3 atomPt, P3i screen, int zSlab, P3 pTemp, - double sppm) { + public void getPymolScreenOffset(P3 atomPt, P3i screen, int zSlab, P3 pTemp, + float sppa) { + this.sppa = sppa; boolean isPixel = isPymolOffsetPixels(); boolean isRelative = isPymolOffsetRelative(); if (atomPt != null && isRelative) @@ -747,8 +771,6 @@ screen.z += pymolOffset[3]; } setXYZs(screen.x, screen.y, screen.z, zSlab); - // commented out; this next was the problem with setFontScaling TRUE and a 3d echo with offset - // setScalePixelsPerMicron(sppm); } private boolean isPymolOffsetRelative() { Modified: trunk/Jmol/src/org/jmol/render/EchoRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/EchoRenderer.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/render/EchoRenderer.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -25,7 +25,6 @@ import org.jmol.modelset.Atom; import org.jmol.modelset.Text; -import org.jmol.script.T; import org.jmol.shape.Echo; import org.jmol.util.C; import org.jmol.viewer.JC; @@ -39,9 +38,7 @@ if (vwr.isPreviewOnly) return false; Echo echo = (Echo) shape; - sppm = (vwr.getBoolean(T.fontscaling) ? vwr - .getScalePixelsPerAngstrom(true) * 10000 : 0); - imageFontScaling = vwr.imageFontScaling; + setRenderVars(); haveTranslucent = false; int alias = (g3d.isAntialiased() ? TextRenderer.MODE_IS_ANTIALIASED : 0); for (Text t : echo.objects.values()) { @@ -71,7 +68,7 @@ if (t.valign == JC.ECHO_XYZ) TextRenderer.calcBarPixelsXYZ(vwr, t, pt0i, true); if (t.pymolOffset != null) - t.getPymolScreenOffset(t.xyz, pt0i, zSlab, pTemp, sppm); + t.getPymolScreenOffset(t.xyz, pt0i, zSlab, pTemp, sppa); 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) @@ -89,7 +86,7 @@ if (t.zSlab == Integer.MIN_VALUE) t.zSlab = 1; } - if (TextRenderer.render(vwr, t, g3d, sppm, imageFontScaling, null, xy, pt2i, (short) 0, 0, alias) + if (TextRenderer.render(vwr, t, g3d, sppa, imageFontScaling, null, xy, pt2i, (short) 0, 0, alias) && t.valign == JC.ECHO_BOTTOM && t.align == JC.TEXT_ALIGN_RIGHT) vwr.noFrankEcho = false; Modified: trunk/Jmol/src/org/jmol/render/FontLineShapeRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/FontLineShapeRenderer.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/render/FontLineShapeRenderer.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -45,6 +45,14 @@ protected final static int[] dashes = { 12, 0, 0, 2, 5, 7, 10 }; protected final static int[] hDashes = { 10, 7, 6, 1, 3, 4, 6, 7, 9 }; + protected final static int[] pymoldashes = { 30, 0, 0, // length, start colix pt, end colix pt + 2, 4, // dash + 7, 9, // dash + 12, 14, // dash... + 17, 19, + 22, 24, + 27, 30 }; + protected final static int[] ndots = { 0, 3, 1000 }; protected final static int[] sixdots = { 12, 3, 6, 1, 3, 5, 7, 9, 11 }; protected final static int[] fourdots = { 13, 3, 5, 2, 5, 8, 11 }; Modified: trunk/Jmol/src/org/jmol/render/LabelsRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/LabelsRenderer.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/render/LabelsRenderer.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -29,6 +29,7 @@ import org.jmol.modelset.Text; import org.jmol.script.T; import org.jmol.shape.Labels; +import org.jmol.util.C; import org.jmol.util.Font; import org.jmol.util.Point3fi; import org.jmol.viewer.JC; @@ -44,7 +45,7 @@ protected int ascent; protected int descent; - protected float sppm; + protected float sppa; protected float[] xy = new float[3]; private P3i screen = new P3i(); @@ -78,6 +79,12 @@ protected int mode; + protected void setRenderVars() { + sppa = vwr.getScalePixelsPerAngstrom(true); + scalePixelsPerMicron = (vwr.getBoolean(T.fontscaling) ? sppa * 10000f : 0); + imageFontScaling = vwr.imageFontScaling; + } + @Override protected boolean render() { fidPrevious = 0; @@ -91,9 +98,7 @@ Atom[] atoms = ms.at; short backgroundColixContrast = vwr.cm.colixBackgroundContrast; int backgroundColor = vwr.getBackgroundArgb(); - sppm = vwr.getScalePixelsPerAngstrom(true); - scalePixelsPerMicron = (vwr.getBoolean(T.fontscaling) ? sppm * 10000f : 0); - imageFontScaling = vwr.imageFontScaling; + setRenderVars(); int iGroup = -1; minZ[0] = Integer.MAX_VALUE; boolean isAntialiased = g3d.isAntialiased(); @@ -107,7 +112,8 @@ continue; labelColix = labels.getColix2(i, atom, false); bgcolix = labels.getColix2(i, atom, true); - if (bgcolix == 0 + // black on black or white on white or colorX on colorX will set the label to contrast + if (bgcolix == C.INHERIT_ALL // 0x0000 && vwr.gdata.getColorArgbOrGray(labelColix) == backgroundColor) labelColix = backgroundColixContrast; fid = ((fids == null || i >= fids.length || fids[i] == 0) ? labels.zeroFontId @@ -159,20 +165,7 @@ boolean newText = false; short pointerColix = ((pointer & JC.LABEL_POINTER_BACKGROUND) != 0 && bgcolix != 0 ? bgcolix : labelColix); - if (text != null) { - if (text.font == null) - text.setFontFromFid(fid); - text.atomX = atomPt.sX; // just for pointer - text.atomY = atomPt.sY; - text.atomZ = zSlab; - if (text.pymolOffset == null) { - text.setXYZs(atomPt.sX, atomPt.sY, zBox, zSlab); - text.colix = labelColix; - text.bgcolix = bgcolix; - } else { - text.getPymolScreenOffset(atomPt, screen, zSlab, pTemp, sppm); - } - } else { + if (text== null) { // Labels only, not measurements boolean isLeft = (textAlign == JC.TEXT_ALIGN_LEFT || textAlign == JC.TEXT_ALIGN_NONE); if (fid != fidPrevious || ascent == 0) { @@ -203,6 +196,19 @@ text.atomZ = zSlab; text.setXYZs(atomPt.sX, atomPt.sY, zBox, zSlab); newText = true; + } else { + if (text.font == null) + text.setFontFromFid(fid); + text.atomX = atomPt.sX; // just for pointer + text.atomY = atomPt.sY; + text.atomZ = zSlab; + if (text.pymolOffset == null) { + text.setXYZs(atomPt.sX, atomPt.sY, zBox, zSlab); + text.colix = labelColix; + text.bgcolix = bgcolix; + } else { + text.getPymolScreenOffset(atomPt, screen, zSlab, pTemp, sppa); + } } if (text.pymolOffset == null) { if (text.font == null) @@ -212,8 +218,13 @@ text.setAlignment(textAlign); } text.pointer = pointer; - TextRenderer.render(null, text, g3d, scalePixelsPerMicron, imageFontScaling, - boxXY, xy, null, pointerColix, (doPointer == 0 ? 0 : vwr.getInt(T.labelpointerwidth)), mode); + renderText(text, null, pointerColix, mode); return (newText ? text : null); } + + protected boolean renderText(Text text, P3i pTemp, short pointerColix, int mode) { + return TextRenderer.render(vwr, text, g3d, scalePixelsPerMicron, imageFontScaling, + boxXY, xy, pTemp, pointerColix, (doPointer == 0 ? 0 : vwr.getInt(T.labelpointerwidth)), mode); + } + } Modified: trunk/Jmol/src/org/jmol/render/MeasuresRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/MeasuresRenderer.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/render/MeasuresRenderer.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -86,7 +86,8 @@ doJustify = vwr.getBoolean(T.justifymeasurements); modulating = ms.bsModulated != null; // note that this COULD be screen pixels if <= 20. - imageFontScaling = vwr.imageFontScaling; + + setRenderVars(); mad0 = measures.mad; font3d =vwr.gdata.getFont3DScaled(measures.font3d, imageFontScaling); m = measures.mPending; @@ -174,7 +175,9 @@ } else { mad = (short) m.mad; dotsOrDashes = true; - dashDots = (mad < 0 ? null : ndots); + dashDots = (m.text.pymolOffset != null ? + pymoldashes + : mad < 0 ? null : ndots); } switch (count) { case 1: @@ -377,7 +380,7 @@ // small numbers refer to pixels already? int diameter = (int) (mad >= 20 && exportType != GData.EXPORT_CARTESIAN ? vwr.tm.scaleToScreen((z1 + z2) / 2, mad) : mad); - if (dotsOrDashes && (dashDots == null || dashDots == ndots)) + if (dotsOrDashes && (dashDots == null || dashDots == ndots || dashDots == pymoldashes)) width = diameter; return drawLine2(g3d, x1, y1, z1, x2, y2, z2, diameter); } Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -4111,7 +4111,7 @@ shapeType = (isScale ? JC.SHAPE_ECHO : getShapeType(getToken(1).tok)); if (shapeType == JC.SHAPE_LABELS) { - if (fontsize < 0 || fontsize >= 1 && (fontsize < JC.LABEL_MINIMUM_FONTSIZE + if (fontsize == 0 || fontsize >= 1 && (fontsize < JC.LABEL_MINIMUM_FONTSIZE || fontsize > JC.LABEL_MAXIMUM_FONTSIZE)) { integerOutOfRange(JC.LABEL_MINIMUM_FONTSIZE - sizeAdjust, JC.LABEL_MAXIMUM_FONTSIZE - sizeAdjust); Modified: trunk/Jmol/src/org/jmol/util/Font.java =================================================================== --- trunk/Jmol/src/org/jmol/util/Font.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/util/Font.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -56,9 +56,20 @@ private int descent; private boolean isBold; private boolean isItalic; + public float fontSizeAngstroms; + /** + * @param manager + * @param fid + * @param idFontFace + * @param idFontStyle + * @param fontSize + * @param fontSizeNominal + * @param fontSizeAngstroms + * @param graphics + */ private Font(FontManager manager, int fid, int idFontFace, - int idFontStyle, float fontSize, float fontSizeNominal, Object graphics) { + int idFontStyle, float fontSize, float fontSizeNominal, float fontSizeAngstroms, Object graphics) { this.manager = manager; this.fid = fid; this.fontFace = fontFaces[idFontFace]; @@ -66,6 +77,7 @@ this.idFontFace = idFontFace; this.idFontStyle = idFontStyle; this.fontSize = fontSize; + this.fontSizeAngstroms = fontSizeAngstroms; this.isBold = (idFontStyle & FONT_STYLE_BOLD) == FONT_STYLE_BOLD; this.isItalic = (idFontStyle & FONT_STYLE_ITALIC) == FONT_STYLE_ITALIC; this.fontSizeNominal = fontSizeNominal; @@ -92,6 +104,7 @@ public static synchronized Font createFont3D(int fontface, int fontstyle, float fontsize, float fontsizeNominal, + float fontSizeAngstroms, FontManager manager, Object graphicsForMetrics) { //if (graphicsForMetrics == null) @@ -98,6 +111,11 @@ // return null; if (fontsize > 0xFF) fontsize = 0xFF; + if (fontsize < 0) { + fontSizeAngstroms = -fontsize; + fontsizeNominal = fontsize = 10; + } + int fontsizeX16 = ((int) fontsize) << 4; int fontkey = ((fontface & 3) | ((fontstyle & 3) << 2) | (fontsizeX16 << 4)); @@ -113,7 +131,7 @@ fontIndexNext + FONT_ALLOCATION_UNIT); } Font font3d = new Font(manager, fontIndexNext, fontface, fontstyle, - fontsize, fontsizeNominal, graphicsForMetrics); + fontsize, fontsizeNominal, fontSizeAngstroms, graphicsForMetrics); // you must set the font3d before setting the fontkey in order // to prevent a race condition with getFont3D font3ds[fontIndexNext] = font3d; @@ -170,7 +188,7 @@ } public String getInfo() { - return fontSizeNominal + " " + fontFace + " " + fontStyle; + return (fontSizeAngstroms > 0 ? -fontSizeAngstroms : fontSizeNominal) + " " + fontFace + " " + fontStyle; } @Override Modified: trunk/Jmol/src/org/jmol/util/GData.java =================================================================== --- trunk/Jmol/src/org/jmol/util/GData.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/util/GData.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -409,12 +409,12 @@ public Font getFont3D(float fontSize) { return Font.createFont3D(Font.FONT_FACE_SANS, Font.FONT_STYLE_PLAIN, - fontSize, fontSize, apiPlatform, graphicsForMetrics); + fontSize, fontSize, 0, apiPlatform, graphicsForMetrics); } public Font getFont3DFS(String fontFace, float fontSize) { return Font.createFont3D(Font.getFontFaceID(fontFace), - Font.FONT_STYLE_PLAIN, fontSize, fontSize, apiPlatform, graphicsForMetrics); + Font.FONT_STYLE_PLAIN, fontSize, fontSize, 0, apiPlatform, graphicsForMetrics); } public int getFontFidFS(String fontFace, float fontSize) { @@ -426,7 +426,7 @@ if (iStyle < 0) iStyle = 0; return Font.createFont3D(Font.getFontFaceID(fontFace), iStyle, fontSize, - fontSize, apiPlatform, graphicsForMetrics); + fontSize, 0, apiPlatform, graphicsForMetrics); } public Font getFont3DScaled(Font font, float scale) { @@ -433,7 +433,7 @@ // TODO: problem here is that we are assigning a bold font, then not DEassigning it float newScale = font.fontSizeNominal * scale; return (newScale == font.fontSize ? font : Font.createFont3D( - font.idFontFace, font.idFontStyle, newScale, font.fontSizeNominal, apiPlatform, graphicsForMetrics)); + font.idFontFace, font.idFontStyle, newScale, font.fontSizeNominal, font.fontSizeAngstroms, apiPlatform, graphicsForMetrics)); } public int getFontFidI(float fontSize) { Modified: trunk/Jmol/src/org/jmol/viewer/StateCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2024-07-20 02:35:16 UTC (rev 22626) +++ trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2024-07-24 00:27:28 UTC (rev 22627) @@ -1054,6 +1054,7 @@ private Map<String, BS> temp = new Hashtable<String, BS>(); private Map<String, BS> temp2 = new Hashtable<String, BS>(); private Map<String, BS> temp3 = new Hashtable<String, BS>(); + private Map<String, BS> temp4 = new Hashtable<String, BS>(); private void getShapeStatePriv(SB commands, boolean isAll, int iShape) { Shape[] shapes = vwr.shm.shapes; @@ -1214,8 +1215,12 @@ if (!l.isActive || l.bsSizeSet == null) return ""; clearTemp(); + BS bs = vwr.getAllAtoms(); + boolean isNeg = false; // protect script from failing in old versions of Jmol for (int i = l.bsSizeSet.nextSetBit(0); i >= 0; i = l.bsSizeSet .nextSetBit(i + 1)) { + if (!bs.get(i)) + continue; Text t = l.getLabel(i); String cmd = "label "; if (t == null) { @@ -1261,12 +1266,23 @@ if (l.mads != null && l.mads[i] < 0) BSUtil.setMapBitSet(temp2, i, i, "set toggleLabel"); - if (l.bsFontSet != null && l.bsFontSet.get(i)) - BSUtil.setMapBitSet(temp2, i, i, - Shape.getFontCommand("label", Font.getFont3D(l.fids[i]))); + if (l.bsFontSet != null && l.bsFontSet.get(i)) { + Font f = Font.getFont3D(l.fids[i]); + if (f.fontSizeAngstroms > 0) + isNeg = true; + BSUtil.setMapBitSet(temp4, i, i, + Shape.getFontCommand("label", f)); + } } + String sf = getCommands(null, temp4, "select"); + if (isNeg) { + // protect from older versions without neg font size + sf = " try{\n" + sf + " }catch{}\n"; + } s = getCommands(temp, temp2, "select") + + sf + getCommands(null, temp3, "select"); + temp4.clear(); temp3.clear(); clearTemp(); break; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-06-07 14:31:12
|
Revision: 22625 http://sourceforge.net/p/jmol/code/22625 Author: hansonr Date: 2024-06-07 14:31:04 +0000 (Fri, 07 Jun 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.17" // (legacy) also 16.2.18 (swingJS) new feature: SHELX reader adds support for PART -- *.altloc set by PART number -- use display config=1 to show PARTS 0+1, config=2 to show PARTS 0+2 -- noting that OpenBabel 3.1.1 does not write disorder to CIF when reading PART and writes invalid CIF when CIF->CIF new feature: WRITE CIF adds altloc -- _atom_site_disorder_assembly A -- _atom_site_disorder_group [altLoc value] bug fix: SHELX reader does not apply LATT > 0 (centrosymmetric) operation bug fix: SHELX reader not reading occupancy bug fix: CIF writer may gernerate P1 when space group is from file loading rather than structure creation bug fix: CIF reader fails to bond molecules properly when the structure has an _atom_site_aniso block bug fix: STL exporter makes isosurface meshes too thick bug fix: DRAW SYMOP should not draw "wings" on screw axes, since it draws curved angle arrow already bug fix: {"y": z.x}.format("JSON") fails when z is a map bug fix: Wyckoff position b not found for CSD XAZTAW and BROFRM05 The problem is what to do with xx.yyyyy(zz) for precision. I had given that 5 places, but more consideration suggests that the presence of error value should limit the precision to 4. This worked in both of these cases. (All this is somewhat of an approximation.) Precision can also be set using a load filter: load xxxx.cif ... filter "precision=3" Modified Paths: -------------- trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/j2s/timestamp trunk/Jmol/site-resources/jsmol/php/jsmol.php trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/xtal/ShelxReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java trunk/Jmol/src/org/jmol/adapter/writers/CIFWriter.java trunk/Jmol/src/org/jmol/export/_StlExporter.java trunk/Jmol/src/org/jmol/script/SV.java trunk/Jmol/src/org/jmol/symmetry/Symmetry.java trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java trunk/Jmol/src/org/jmol/symmetry/SymmetryInfo.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/j2s/timestamp 2024-06-07 14:31:04 UTC (rev 22625) @@ -1 +1 @@ -20240503154552 +20240530062252 Modified: trunk/Jmol/site-resources/jsmol/php/jsmol.php =================================================================== --- trunk/Jmol/site-resources/jsmol/php/jsmol.php 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/site-resources/jsmol/php/jsmol.php 2024-06-07 14:31:04 UTC (rev 22625) @@ -2,6 +2,7 @@ // jsmol.php // Bob Hanson ha...@st... 1/11/2013 +// 2024.06.04 removing CORS header -- allowing .htaccess to take care of this for the PHP file itself // 2024.04.16 reinstating CORS header for NON-chemapps files // 2024.04.10 switching to default binary // 2024.04.06 removing ajax access header added 2024.02.06 -- already have .htaccess in site/ @@ -23,9 +24,11 @@ // // header('Access-Control-Allow-Origin: *'); // -// is commented out below. That is because a .htaccess flag file is in the site/ directory. -// Browers reject AJAX when multiple headers exist. -// Enable this line only if you need to remove .htaccess +// is disabled below due to $addAccessHeader = false. +// That is because a .htaccess flag file is in the path of the /site/ subdirectory at St. Olaf and contains +// Header set Access-Control-Allow-Origin "*" +// Newer brower versions reject AJAX when multiple headers exist. +// Enable this only if your server does not implement .htaccess // Multiple headers can be seen in the browser network report showing "*,*" instead of just "*" // -BH 2024.04.06 // @@ -117,6 +120,7 @@ $isJS = false; $filename = ""; $isChemapps = false; +$addAccessHeader = false; // needs to be true if server does not implement .htaccess if ($call == "getInfoFromDatabase") { // TODO: add PDBe annotation business here @@ -203,7 +207,7 @@ header('Pragma: public'); } } else { - if (!$isChemapps) { + if ($addAccessHeader) { header('Access-Control-Allow-Origin: *'); } if ($isBinary) { Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -225,7 +225,6 @@ } private boolean readEntryOrLoopData() throws Exception { - //System.out.println("key is " + key); if (key.startsWith("data_")) { isLigand = false; if (asc.atomSetCount == 0) @@ -1149,7 +1148,7 @@ "*_label_alt_id", // "*_group_pdb", // "*_pdbx_pdb_model_num", // - "*_calc_flag", // + "*_calc_flag", // 18 "*_disorder_group", // "*_aniso_label", // "*_anisotrop_id", // @@ -1314,7 +1313,7 @@ if ((f0 = f = fieldProperty(key2col[LABEL])) != NONE || (f = fieldProperty(key2col[CC_ATOM_ID])) != NONE || (f = fieldProperty(key2col[LABEL_ATOM_ID])) != NONE - || (f = fieldProperty(key2col[ANISO_LABEL])) != NONE + || (f0 = f = fieldProperty(key2col[ANISO_LABEL])) != NONE || (f = fieldProperty(key2col[ANISO_MMCIF_ID])) != NONE || (f = fieldProperty(key2col[MOMENT_LABEL])) != NONE) { if (f0 != NONE && atomLabels != null) { @@ -1789,7 +1788,8 @@ "*_magn_ssg_operation_timereversal", // another iteration "*_operation_timereversal", // preliminary only - "*_magn_centering_xyz", "*_magn_ssg_centering_algebraic", + "*_magn_centering_xyz", + "*_magn_ssg_centering_algebraic", "*_magn_ssg_centering_xyz" // preliminary }; @@ -2169,9 +2169,13 @@ Atom a1 = getAtomFromNameCheckCase((String) o[0]); Atom a2 = getAtomFromNameCheckCase((String) o[1]); if (a1 == null || a2 == null) { - a2 = getAtomFromNameCheckCase((String) o[1]); + System.err.println("CifReader checking GEOM_BOND " + o[0] + "-" + o[1] + " found " + a1 + " " + a2); continue; } + if (Float.isNaN(a1.x) || Float.isNaN(a2.x)) { + System.err.println("CifReader checking GEOM_BOND " + o[0] + "-" + o[1] + " found x coord NaN"); + continue; + } int iatom1 = a1.index; int iatom2 = a2.index; if (doInit) { @@ -2191,11 +2195,13 @@ for (int j = bs1.nextSetBit(0); j >= 0; j = bs1.nextSetBit(j + 1)) { for (int k = bs2.nextSetBit(0); k >= 0; k = bs2.nextSetBit(k + 1)) { if ((!isMolecular || !bsConnected[j + firstAtom].get(k)) - && checkBondDistance(atoms[j + firstAtom], atoms[k + firstAtom], distance, dx)) + && checkBondDistance(atoms[j + firstAtom], atoms[k + firstAtom], + distance, dx)) { addNewBond(j + firstAtom, k + firstAtom, order); } } } + } if (!iHaveFractionalCoordinates) return false; Modified: trunk/Jmol/src/org/jmol/adapter/readers/xtal/ShelxReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/xtal/ShelxReader.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/adapter/readers/xtal/ShelxReader.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -27,6 +27,7 @@ import org.jmol.adapter.smarter.Atom; import javajs.util.AU; +import javajs.util.Lst; import javajs.util.PT; import org.jmol.util.Logger; @@ -111,7 +112,7 @@ "HKLF;OMIT;SHEL;BASF;TWIN;EXTI;SWAT;HOPE;MERG;" + "SPEC;RESI;MOVE;ANIS;AFIX;HFIX;FRAG;FEND;EXYZ;" + "EXTI;EADP;EQIV;" + - "CONN;PART;BIND;FREE;" + + "CONN;BIND;FREE;" + "DFIX;DANG;BUMP;SAME;SADI;CHIV;FLAT;DELU;SIMU;" + "DEFS;ISOR;NCSY;SUMP;" + "L.S.;CGLS;BLOC;DAMP;STIR;WGHT;FVAR;" + @@ -118,15 +119,18 @@ "BOND;CONF;MPLA;RTAB;HTAB;LIST;ACTA;SIZE;TEMP;" + "WPDB;" + "FMAP;GRID;PLAN;MOLE;"; - + + /** + * Supported records -- remove from unsupportedRecordTypes if added here + */ final private static String[] supportedRecordTypes = { "TITL", "CELL", "SPGR", - "SFAC", "LATT", "SYMM", "NOTE", "ATOM", "END" }; + "SFAC", "LATT", "SYMM", "NOTE", "ATOM", "PART", "END" }; private void processSupportedRecord(int recordIndex) throws Exception { - //Logger.debug(recordIndex+" "+line); + //System.out.println(recordIndex+" "+line); switch (recordIndex) { case 0: // TITL - case 8: // END + case 9: // END break; case 1: // CELL cell(); @@ -150,11 +154,55 @@ isCmdf = true; processCmdfAtoms(); break; + case 8: // PART + processPartRecord(); + break; } } + + char altloc = '\0'; + private void processPartRecord() { + + // email exchange with Brian McMahon 22.10.11 + // see + // https://journals.iucr.org/c/issues/2015/01/00/fa3356/ (in the below I + // take PART to be the same as + // _atom_site_disorder_group): + // + // "The use of PART numbers, introduced in SHELXL93, has proved invaluable + // in the refinement of disordered structures. Two atoms are considered to + // be bonded if they have the same PART number or if one of them is in + // PART 0. The resulting connectivity table is used for the generation of + // H atoms (HFIX and AFIX), for setting up restraints such as DELU, SIMU, + // RIGU, CHIV, BUMP and SAME, and for generating tables of geometric + // parameters (BOND, CONF, HTAB). Usually, most of the atoms are in + // PART 0, but, for example, a molecule or side chain disordered over + // three positions could use PART 1, PART 2 and PART 3. If the PART + // number is negative, bonds are not generated to symmetry-equivalent + // atoms. It should be noted that positive PART numbers 1, 2, 3 etc. + // correspond to the alternative location indicators A, B, C etc. in + // PDB format. However, this notation is difficult to use when there + // is a disorder within a disorder." + + // atom.basLoc provides the base altloc "n" of "-n" + // as symmetry is applied, if basLoc is found, then + // the cloned atom is given an incremented altloc + // this only works with C2 and m; with higher-order symmetry, this + // will dump all the symmetry-related groups into the same configuration=2 + + + + // PART 1 become altloc '1' + int part = parseIntStr(tokens[1]); + altloc = (char) (part == 0 ? 0 : '0' + part); + } + + private boolean isCentroSymmetric; + private void parseLattRecord() throws Exception { int latt = parseIntStr(tokens[1]); + isCentroSymmetric = (latt > 0); if (latt ==1 || latt == -1) return; asc.getXSymmetry().setLatticeParameter(latt); @@ -241,16 +289,18 @@ // this line gives an atom, because any line not starting with // a SHELX command is an atom float x = Float.NaN, y = Float.NaN, z = Float.NaN; + float occ = 1; int elementIndex = -1; String atomName = null; try { atomName = tokens[0]; elementIndex = parseIntStr(tokens[1]) - 1; - x = parseFloatStr(tokens[2]); - y = parseFloatStr(tokens[3]); - z = parseFloatStr(tokens[4]); + x = parseFloatStr(tokens[2])%10; + y = parseFloatStr(tokens[3])%10; + z = parseFloatStr(tokens[4])%10; + occ = parseFloatStr(tokens[5])%10; } catch (Exception e) { - // NaN + // must have a NaN } if (Float.isNaN(x) || Float.isNaN(y) || Float.isNaN(z)) { Logger.error("skipping line " + line); @@ -259,6 +309,7 @@ Atom atom = asc.addNewAtom(); atom.atomName = atomName; + atom.foccupancy = occ; boolean isQPeak = atomName.startsWith("Q"); if (isQPeak) { atom.elementSymbol = "Xx"; @@ -267,6 +318,7 @@ atom.elementSymbol = sfacElementSymbols[elementIndex]; } setAtomCoordXYZ(atom, x, y, z); + atom.altLoc = altloc; if (tokens.length == 12) { float[] data = new float[8]; @@ -320,5 +372,13 @@ return Atom.isValidSymNoCase(chFirst, chSecond); } + @Override + public void applySymmetryAndSetTrajectory() throws Exception { + if (isCentroSymmetric && !ignoreFileSymmetryOperators) { + asc.getXSymmetry().getSymmetry().addInversion(); + isCentroSymmetric = false; + } + applySymTrajASCR(); + } } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -750,19 +750,32 @@ /** * Track the precision (count of y digits in "xx.yyyy") for setting cellSlop. * - * We assume that with the numbers 0.25 0.33333 that the precision is really 5, not 2. + * We assume that with the numbers 0.25 0.33333 that the precision is really + * 5, not 2. * + * Note that in the end, the precision will never be set lower than 4. + * * @param s * @return parsed number */ protected float parsePrecision(String s) { - // will be double in JavaScript - // Max of xx.yyyyy number of y digits. + // xx.yyyyy max of current precision and number of y digits (5 here). + // xx.yyyyy(zz) min of current precision and number of y digits - 1 (4 here) + // I considered subtracting the number of z digits, + // but I think that is probably too extreme. + // this fixes the Wyckoff calculation for CSD XAZTAW and BROFRM05 + if (!filteredPrecision) { int pt = s.indexOf('.') + 1; if (pt >= 0) { int n = s.indexOf('('); - precision = Math.max(precision, (n < 0 ? s.length() : n) - pt); + if (n < 0) { + precision = Math.max(precision, s.length() - pt); + } else { + if (precision == 0) + precision = n; + precision = Math.min(precision, n - 1 - pt); + } } } return parseFloatStr(s); @@ -789,6 +802,7 @@ precision = 4; // legacy } else { if (precision > 1000) { + // from filter "PRECISION=n" precision -= 1000; } else { // packingRange must be null Modified: trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -203,6 +203,20 @@ return unitCell.getF2C(); } + public void addInversion() { + SymmetryOperation[] ops = spaceGroup.operations; + M4 inv = new M4(); + inv.m00 = inv.m11 = inv.m22 = -1; + inv.m33 = 1; + int n = getSpaceGroupOperationCount(); + M4 m = new M4(); + for (int i = 0; i < n; i++) { + m.mul2(inv, ops[i]); + String s = SymmetryOperation.getXYZFromMatrix(m, true, true, false); + addSpaceGroupOperation(s, 0); + } + } + } private static final float MAX_INTERCHAIN_BOND_2 = 25; // allowing for hydrogen bonds Modified: trunk/Jmol/src/org/jmol/adapter/writers/CIFWriter.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/writers/CIFWriter.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/adapter/writers/CIFWriter.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -144,21 +144,33 @@ } } } + boolean haveAltLoc = false; + for (int i = bsOut.nextSetBit(0); i >= 0; i = bsOut.nextSetBit(i + 1)) { + if (atoms[i].altloc != '\0') { + haveAltLoc = true; + break; + } + } + int sbLength = sb.length(); sb.append("\n" + "\nloop_" + "\n_atom_site_label" + "\n_atom_site_type_symbol" + "\n_atom_site_fract_x" + "\n_atom_site_fract_y" + "\n_atom_site_fract_z"); + if (haveAltLoc) { + sb.append("\n_atom_site_disorder_group"); + } if (haveOccupancy) { sb.append("\n_atom_site_occupancy"); - } else if (!haveUnitCell) + } else if (!haveUnitCell) { sb.append("\n_atom_site_Cartn_x" + "\n_atom_site_Cartn_y" + "\n_atom_site_Cartn_z"); + } sb.append("\n"); SB jmol_atom = new SB(); - jmol_atom.append("\n" + "\nloop_" + "\n_jmol_atom_index" + "\n_jmol_atom_name" - + "\n_jmol_atom_site_label\n"); + jmol_atom.append("\n" + "\nloop_" + "\n_jmol_atom_index" + + "\n_jmol_atom_name" + "\n_jmol_atom_site_label\n"); int nAtoms = 0; P3 p = new P3(); @@ -187,6 +199,9 @@ .append(clean(p.x)) .append(clean(p.y)) .append(clean(p.z)); + if (haveAltLoc) { + sb.append(" ").appendC(a.altloc == '\0' ? '.' : a.altloc); + } if (haveOccupancy) sb.append(" ").append(clean(occ[i]/100)); else if (!haveUnitCell) Modified: trunk/Jmol/src/org/jmol/export/_StlExporter.java =================================================================== --- trunk/Jmol/src/org/jmol/export/_StlExporter.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/export/_StlExporter.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -72,6 +72,7 @@ public _StlExporter() { super(); useTable = null; + lineWidthMad = 20; noColor = true; isDebug = Logger.debugging; if (!isDebug) { Modified: trunk/Jmol/src/org/jmol/script/SV.java =================================================================== --- trunk/Jmol/src/org/jmol/script/SV.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/script/SV.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -386,7 +386,7 @@ return (itest ? vT : vF); case 1: return (inum > Integer.MAX_VALUE || inum != Math.floor(inum) - ? SV.newF(inum) : newI((int) inum)); + ? newF(inum) : newI((int) inum)); case 2: Lst<SV> v = new javajs.util.Lst<SV>(); for (int i = 0, n = array.length; i < n; i++) @@ -406,7 +406,7 @@ } map.put(keys[i], newJSVar(o)); } - return SV.getVariableMap(map); + return getVariableMap(map); } return newS(x.toString()); } @@ -856,7 +856,7 @@ sb.append(PT.esc(key)).append(" :"); SB sb2 = new SB(); if (!(ht.get(key) instanceof SV)) - ht.put(key, SV.getVariable(ht.get(key))); + ht.put(key, getVariable(ht.get(key))); SV v = ht.get(key); isEscaped = isRawType(v.tok); sValueArray(sb2, v, path, tabs, isEscaped, false, addValues, maxLevels, skipEmpty); @@ -1681,10 +1681,11 @@ } return (v == null ? newS("") : v); } + // case where value != null if (m != null) { //assocArray.push(key,value) - String key = mapKey.asString(); - m.put(key, copySafely(value).setName(key)); + // don't set name in map! + m.put(mapKey.asString(), copySafely(value));//.setName(key)); } } return this; @@ -1987,7 +1988,7 @@ case varray: if ("\r".equals(vm.myName)) { vm.myName = null; - vm = SV.newV(vm.tok, (vm.tok == hash ? new Hashtable<String, SV>() : new Lst<SV>())); + vm = newV(vm.tok, (vm.tok == hash ? new Hashtable<String, SV>() : new Lst<SV>())); } else { String name0 = vm.myName; vm.myName = "\r"; Modified: trunk/Jmol/src/org/jmol/symmetry/Symmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -393,8 +393,9 @@ public int getSpaceGroupOperationCount() { return (symmetryInfo != null && symmetryInfo.symmetryOperations != null ? // null here for PDB symmetryInfo.symmetryOperations.length - : spaceGroup != null && spaceGroup.finalOperations != null - ? spaceGroup.finalOperations.length + : spaceGroup != null ? (spaceGroup.finalOperations != null ? + spaceGroup.finalOperations.length + : spaceGroup.operationCount) : 0); } Modified: trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -1116,6 +1116,7 @@ if (!ignore) { if (screwDir != 0) { + // get the polygon wings right (isSpaceGroupAll only) switch (order) { case 2: // ignoring @@ -1139,12 +1140,12 @@ String name = opType + "_"+ nrot + "rotvector1"; drawOrderVector(drawSB, name, "vector", THICK_LINE + wp, pa1, nrot, screwDir, haveInversion && isSpaceGroupAll, isccw == Boolean.TRUE, - vtemp, isTimeReversed ? "gray" : color, title); + vtemp, isTimeReversed ? "gray" : color, title, isSpaceGroupAll); if (p2 != null) { // second standard rotation arrow on other side of unit cell only drawOrderVector(drawSB, name + "2", "vector", THICK_LINE + wp, ptr, order, screwDir, haveInversion, isccw == Boolean.TRUE, vtemp, - isTimeReversed ? "gray" : color, title); + isTimeReversed ? "gray" : color, title, isSpaceGroupAll); } } @@ -1592,7 +1593,7 @@ private void drawOrderVector(SB sb, String label, String type, String d, P3 pt, int order, int screwDir, boolean haveInversion, boolean isCCW, V3 vtemp, - String color, String title) { + String color, String title, boolean isSpaceGroupAll) { drawVector(sb, label, type, d, pt, vtemp, color, title); if (order == 2 || haveInversion && !isCCW) return; @@ -1602,7 +1603,7 @@ for (int i = 0, n = l.size(); i < n; i++) sb.appendO(l.get(i)); sb.append(" color ").append(color); - if (screwDir != 0) { + if (screwDir != 0 && isSpaceGroupAll) { // add screw axis "windmill" poly = getPolygon(order, screwDir, haveInversion, pt, vtemp); sb.append(getDrawID(label + "_key2")); Modified: trunk/Jmol/src/org/jmol/symmetry/SymmetryInfo.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SymmetryInfo.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/symmetry/SymmetryInfo.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -210,7 +210,7 @@ intTab += ":" + trm; } } - sgName = (sgName.startsWith("0") ? "" : sgName + " #") + intTab; + sgName = (sgName.startsWith("0") ? "" : sgName.equals("unspecified!") ? "#" : sgName + " #") + intTab; } } if (sgName.indexOf(SpaceGroup.NO_NAME) >= 0) Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-06-07 14:31:04 UTC (rev 22625) @@ -54,8 +54,44 @@ # FEATURE REQUEST: dock/undock consoles to main window. # TODO: allow FIXED to work with MODELKIT MINIMIZE -Jmol.___JmolVersion="16.2.15" // (legacy) also 16.2.16 (swingJS) +Jmol.___JmolVersion="16.2.17" // (legacy) also 16.2.18 (swingJS) +new feature: SHELX reader adds support for PART + -- *.altloc set by PART number + -- use display config=1 to show PARTS 0+1, config=2 to show PARTS 0+2 + -- noting that OpenBabel 3.1.1 does not write disorder to CIF when reading PART and writes invalid CIF when CIF->CIF + +new feature: WRITE CIF adds altloc + -- _atom_site_disorder_assembly A + -- _atom_site_disorder_group [altLoc value] + +bug fix: SHELX reader does not apply LATT > 0 (centrosymmetric) operation + +bug fix: SHELX reader not reading occupancy + +bug fix: CIF writer may gernerate P1 when space group is from file loading rather than structure creation + +bug fix: CIF reader fails to bond molecules properly when the structure has an _atom_site_aniso block + +bug fix: STL exporter makes isosurface meshes too thick + +bug fix: DRAW SYMOP should not draw "wings" on screw axes, since it draws curved angle arrow already + +bug fix: {"y": z.x}.format("JSON") fails when z is a map + +bug fix: Wyckoff position b not found for CSD XAZTAW and BROFRM05 + The problem is what to do with xx.yyyyy(zz) for precision. + I had given that 5 places, but more consideration suggests that + the presence of error value should limit the precision to 4. + This worked in both of these cases. + (All this is somewhat of an approximation.) + Precision can also be set using a load filter: + + load xxxx.cif ... filter "precision=3" + + +JmolVersion="16.2.15" // (legacy) also 16.2.16 (swingJS) + bug fix: x = symop(n) broken for n a symmetry operator number bug fix: draw symop [4x4 matrix] not working Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2024-05-05 15:18:44 UTC (rev 22624) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2024-06-07 14:31:04 UTC (rev 22625) @@ -9602,7 +9602,7 @@ */ public static boolean isHighPrecision = false; - public final static boolean isDoublePrecision = true; + public final static boolean isDoublePrecision = false; static { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-05-05 15:18:49
|
Revision: 22624 http://sourceforge.net/p/jmol/code/22624 Author: hansonr Date: 2024-05-05 15:18:44 +0000 (Sun, 05 May 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.15" // (legacy) also 16.2.16 (swingJS) bug fix: x = symop(n) broken for n a symmetry operator number bug fix: draw symop [4x4 matrix] not working bug fix: MODELKIT DRAW SPACEGROUP should use prefix "sg" not "sym" bug fix: various minor aspects of DRAW SPACEGROUP ALL and MODELKIT DRAW SPACEGROUP -- new color coding for n-axes -- new color coding and larger icons for n-bar axes -- missing split planes (mirror+glide and glide+glide) -- missing additional 2-fold rotations tangent to corners in hexagonal groups Modified Paths: -------------- trunk/Jmol/j2s/timestamp trunk/Jmol/src/org/jmol/console/GenericConsole.java trunk/Jmol/src/org/jmol/modelkit/ModelKit.java trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/renderspecial/PolyhedraRenderer.java trunk/Jmol/src/org/jmol/script/ScriptCompiler.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/scriptext/IsoExt.java trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java trunk/Jmol/src/org/jmol/shapespecial/Polyhedron.java trunk/Jmol/src/org/jmol/symmetry/Symmetry.java trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java trunk/Jmol/src/org/jmol/viewer/ColorManager.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/j2s/timestamp 2024-05-05 15:18:44 UTC (rev 22624) @@ -1 +1 @@ -20240502092243 +20240503154552 Modified: trunk/Jmol/src/org/jmol/console/GenericConsole.java =================================================================== --- trunk/Jmol/src/org/jmol/console/GenericConsole.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/console/GenericConsole.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -431,9 +431,12 @@ } protected String trimGUI(String cmd) { - int pt = cmd.indexOf(JC.SCRIPT_GUI); + int pt = cmd.indexOf(JC.SCRIPT_EXT); if (pt >= 0) cmd = cmd.substring(0, pt); + pt = cmd.indexOf(JC.SCRIPT_GUI); + if (pt >= 0) + cmd = cmd.substring(0, pt); return PT.trim(cmd, "; "); } Modified: trunk/Jmol/src/org/jmol/modelkit/ModelKit.java =================================================================== --- trunk/Jmol/src/org/jmol/modelkit/ModelKit.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/modelkit/ModelKit.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -1060,7 +1060,7 @@ vwr.ms.restoreAtomPositions(apos0); bsAtoms.clearAll(); } else { - updateDrawAtomSets(JC.PROP_ATOMS_MOVED, bsAtoms); + updateDrawAtomSymmetry(JC.PROP_ATOMS_MOVED, bsAtoms); } } } @@ -1306,7 +1306,7 @@ boolean isError = msg.endsWith("!"); if (doDraw && !isError) { String s = drawSymmetry("sym", false, -1, null, Integer.MAX_VALUE, null, - null, null, 0, -2, 0, null); + null, null, 0, -2, 0, null, true); appRunScript(s); } return msg; @@ -1632,16 +1632,16 @@ } if (key == JC.PROP_ATOMS_MOVED) { - if (drawAtomSets != null) { - updateDrawAtomSets(key, ((BS[]) value)[0]); + if (drawAtomSymmetry != null) { + updateDrawAtomSymmetry(key, ((BS[]) value)[0]); } return null; } if (key == JC.MODELKIT_UPDATE_MODEL_KEYS) { if (haveElementKeys) - updateModelElementKeys(((BS[]) value)[1], true); - if (drawAtomSets != null) { - updateDrawAtomSets(JC.PROP_ATOMS_DELETED, ((BS[]) value)[0]); + updateModelElementKeys(value == null ? null : ((BS[]) value)[1], true); + if (drawAtomSymmetry != null && value != null) { + updateDrawAtomSymmetry(JC.PROP_ATOMS_DELETED, ((BS[]) value)[0]); } return null; } @@ -3089,7 +3089,7 @@ } finally { setMKState(state); if (n > 0) { - updateDrawAtomSets(JC.PROP_ATOMS_MOVED, bsMoved); + updateDrawAtomSymmetry(JC.PROP_ATOMS_MOVED, bsMoved); } } @@ -3708,8 +3708,8 @@ // don't change the first line of this message -- it will be used in packing. transform = sym.staticGetTransformABC(trm, false); - String msg = transform + "\n" + PT.join(tokens, '>', 0) + "\n basis=" - + basis; + String msg = transform + "\n" + + PT.join(tokens, '>' , 0) + (basis.isEmpty() ? "" : "\n basis=" + basis); System.out.println("ModelKit trm=" + msg); sb.append(msg).append("\n"); return transform; @@ -4702,14 +4702,14 @@ } - private Lst<DrawAtomSet> drawAtomSets; + private Lst<DrawAtomSet> drawAtomSymmetry; - public synchronized void updateDrawAtomSets(String mode, BS atoms) { - if (drawAtomSets == null) + private synchronized void updateDrawAtomSymmetry(String mode, BS atoms) { + if (drawAtomSymmetry == null) return; String cmd = ""; - for (int i = drawAtomSets.size(); --i >= 0;) { - DrawAtomSet a = drawAtomSets.get(i); + for (int i = drawAtomSymmetry.size(); --i >= 0;) { + DrawAtomSet a = drawAtomSymmetry.get(i); if (mode == JC.PROP_DELETE_MODEL_ATOMS ? atoms.get(a.bsAtoms.nextSetBit(0)) : atoms.intersects(a.bsAtoms)) { @@ -4718,12 +4718,12 @@ case JC.PROP_ATOMS_DELETED: System.out .println("remove deleteatoms " + atoms + " " + a.bsAtoms + a.id); - drawAtomSets.removeItemAt(i); + drawAtomSymmetry.removeItemAt(i); break; case JC.PROP_ATOMS_MOVED: try { if (!checkDrawID(a.id)) { - drawAtomSets.removeItemAt(i); + drawAtomSymmetry.removeItemAt(i); } else { cmd += a.cmd + JC.SCRIPT_QUIET + "\n"; } @@ -4732,8 +4732,8 @@ } break; } - if (drawAtomSets.size() == 0) - drawAtomSets = null; + if (drawAtomSymmetry.size() == 0) + drawAtomSymmetry = null; } if (cmd.length() > 0) vwr.evalStringGUI(cmd); @@ -4767,19 +4767,19 @@ String cmd = tokens[3]; BS bs = BSUtil.newAndSetBit(a1); bs.set(a2); - if (drawAtomSets == null) { - drawAtomSets = new Lst<DrawAtomSet>(); + if (drawAtomSymmetry == null) { + drawAtomSymmetry = new Lst<DrawAtomSet>(); } - drawAtomSets.addLast(new DrawAtomSet(bs, id, cmd)); + drawAtomSymmetry.addLast(new DrawAtomSet(bs, id, cmd)); } private void clearAtomSets(String id) { - if (drawAtomSets == null) + if (drawAtomSymmetry == null) return; - for (int i = drawAtomSets.size(); --i >= 0;) { - DrawAtomSet a = drawAtomSets.get(i); + for (int i = drawAtomSymmetry.size(); --i >= 0;) { + DrawAtomSet a = drawAtomSymmetry.get(i); if (a.id.equals(id)) { - drawAtomSets.remove(i); + drawAtomSymmetry.remove(i); return; } } @@ -4849,7 +4849,7 @@ public String drawSymmetry(String thisId, boolean isSymop, int iatom, String xyz, int iSym, P3 trans, P3 center, P3 target, int intScale, int nth, int options, - int[] opList) { + int[] opList, boolean isModelkit) { String s = null; if (options != 0) { @@ -4870,6 +4870,8 @@ s = "draw ID " + (isSymop ? "sg" : "sym") + "* delete;" + s; s = "draw ID " + thisId + "* delete;" + s; } + if (isModelkit) + s += ";draw ID sg_xes axes 0.05;"; return s; } Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -2276,6 +2276,7 @@ bs = new BS(); P3 pt = (P3) specInfo; SymmetryInterface uc = vwr.getSymTemp(); + System.out.println("MS test within"); for (int mi = -1, i = ac; --i >= 0;) { if (isDeleted(at[i])) continue; @@ -2291,6 +2292,7 @@ if (uc.isWithinUnitCell(ptTemp, pt.x, pt.y, pt.z)) bs.set(i); } + System.out.println("MS test within" + bs); return bs; } } Modified: trunk/Jmol/src/org/jmol/renderspecial/PolyhedraRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/renderspecial/PolyhedraRenderer.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/renderspecial/PolyhedraRenderer.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -119,7 +119,7 @@ } P3[] sc = this.screens3f; int[][] planes = p.triangles; - int[] elemNos = (p.pointScale > 0 ? p.getElemNos() : null); + int[] elemNos = (p.pointScale > 0 ? p.getElemNos(false) : null); for (int i = vertices.length; --i >= 0;) { Atom atom = (vertices[i] instanceof Atom ? (Atom) vertices[i] : null); P3 v = sc[i]; @@ -135,8 +135,8 @@ } if (elemNos != null && i < elemNos.length - && g3d.setC(elemNos[i] < 0 ? colix : vwr.cm.setElementArgb( - elemNos[i], Integer.MAX_VALUE))) { + && g3d.setC(elemNos[i] < 0 ? colix + : vwr.cm.getElementColix(elemNos[i]))) { g3d.fillSphereBits( (int) tm.scaleToScreen((int) v.z, (int) (p.pointScale * 1000)), v); g3d.setC(colix); Modified: trunk/Jmol/src/org/jmol/script/ScriptCompiler.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/script/ScriptCompiler.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -1293,7 +1293,9 @@ } } if (!iHaveQuotedString - && lookingAtImpliedString(tokCommand == T.show, tokCommand == T.load, + && lookingAtImpliedString( + tokCommand == T.show, + tokCommand == T.load, nTokens > 1 || tokCommand != T.script && tokCommand != T.macro, false)) { String str = script.substring(ichToken, ichToken + cchToken); if (tokCommand == T.script) { @@ -1739,8 +1741,8 @@ } private boolean checkNewSetCommand() { - String name = ltoken.get(0).value.toString(); - if (!isContextVariable(name.toLowerCase())) + String name = (nTokens == 0 ? "" : ltoken.get(0).value.toString()); + if (nTokens > 0 && !isContextVariable(name.toLowerCase())) return false; T t = setNewSetCommand(false, name); setCommand(T.tokenSet); Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -9422,42 +9422,46 @@ } private boolean setElementColor(String str, int argb) { - for (int i = Elements.elementNumberMax; --i >= 0;) { - if (str.equalsIgnoreCase(Elements.elementNameFromNumber(i))) { - if (!chk) - vwr.setElementArgb(i, argb); - return true; + int n = -1; + boolean isSym = (str.charAt(0) == '_'); + out: while (true) { + if (isSym) { + str = str.substring(1); + for (int i = Elements.elementNumberMax; --i >= 0;) { + if (str.equalsIgnoreCase(Elements.elementSymbolFromNumber(i))) { + n = i; + break out; + } + } + for (int i = Elements.altElementMax; --i >= Elements.firstIsotope;) { + if (str.equalsIgnoreCase(Elements.altElementSymbolFromIndex(i)) + || str.equalsIgnoreCase(Elements.altIsotopeSymbolFromIndex(i)) + ) { + n = Elements.altElementNumberFromIndex(i); + break out; + } + } + } else { + for (int i = Elements.elementNumberMax; --i >= 0;) { + if (str.equalsIgnoreCase(Elements.elementNameFromNumber(i))) { + n = i; + break out; + } + } + for (int i = Elements.altElementMax; --i >= 0;) { + if (str.equalsIgnoreCase(Elements.altElementNameFromIndex(i))) { + n = Elements.altElementNumberFromIndex(i); + break out; + } + } } + break; } - for (int i = Elements.altElementMax; --i >= 0;) { - if (str.equalsIgnoreCase(Elements.altElementNameFromIndex(i))) { - if (!chk) - vwr.setElementArgb(Elements.altElementNumberFromIndex(i), argb); - return true; - } - } - if (str.charAt(0) != '_') + if (chk || n < 0) { return false; - for (int i = Elements.elementNumberMax; --i >= 0;) { - if (str.equalsIgnoreCase("_" + Elements.elementSymbolFromNumber(i))) { - if (!chk) - vwr.setElementArgb(i, argb); - return true; - } } - for (int i = Elements.altElementMax; --i >= Elements.firstIsotope;) { - if (str.equalsIgnoreCase("_" + Elements.altElementSymbolFromIndex(i))) { - if (!chk) - vwr.setElementArgb(Elements.altElementNumberFromIndex(i), argb); - return true; - } - if (str.equalsIgnoreCase("_" + Elements.altIsotopeSymbolFromIndex(i))) { - if (!chk) - vwr.setElementArgb(Elements.altElementNumberFromIndex(i), argb); - return true; - } - } - return false; + vwr.setElementArgb(n, argb); + return true; } /** Modified: trunk/Jmol/src/org/jmol/scriptext/IsoExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/IsoExt.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/scriptext/IsoExt.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -816,7 +816,7 @@ xyz = stringParameter(i); break; case T.matrix4f: - xyz = SV.sValue(getToken(i)); + xyz = (String) vwr.getSymStatic().convertTransform("xyz", (M4) getToken(i).value); break; case T.integer: default: @@ -887,7 +887,7 @@ if (bsAtoms == null && vwr.am.cmi >= 0) bsAtoms = vwr.getModelUndeletedAtomsBitSet(vwr.am.cmi); if (bsAtoms != null) { - s = vwr.getModelkit(false).drawSymmetry(thisId, isSymop, iatom, xyz, iSym, trans, center, target, intScale, nth, options, opList); + s = vwr.getModelkit(false).drawSymmetry(thisId, isSymop, iatom, xyz, iSym, trans, center, target, intScale, nth, options, opList, false); if (s == null) return; if (isSymop && target instanceof Atom && center instanceof Atom) { @@ -899,10 +899,9 @@ + "|" + eval.fullCommand) + ";"; } } - if (s != null) - eval.runBufferedSafely( - s.length() > 0 ? s : "draw ID \"" + thisId + "*\" delete", - eval.outputBuffer); + eval.runBufferedSafely( + s.length() > 0 ? s : "draw ID \"" + thisId + "*\" delete", + eval.outputBuffer); return; case T.frame: isFrame = true; Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -4102,7 +4102,7 @@ if (iOp == Integer.MIN_VALUE && tok != T.var) iOp = 0; Map<String, ?> map = null; - if (tok == 0 && xyz.indexOf(",") < 0) { + if (tok == 0 && xyz != null && xyz.indexOf(",") < 0) { if (apt == narg) { map = vwr.ms.getPointGroupInfo(null); } else if (args[apt].tok == T.hash) { Modified: trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -467,7 +467,7 @@ private void pointsPolyhedra(BS bs, float pointScale) { bs = findPolyBS(thisID == null ? bs : null, false); for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) - polyhedrons[i].pointScale = pointScale; + polyhedrons[i].setPointScale(pointScale); } private void scalePolyhedra(float scale) { Modified: trunk/Jmol/src/org/jmol/shapespecial/Polyhedron.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Polyhedron.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/shapespecial/Polyhedron.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -26,7 +26,6 @@ import org.jmol.util.Escape; import org.jmol.util.Logger; import org.jmol.util.MeshCapper; -import org.jmol.util.Node; import org.jmol.util.Normix; import org.jmol.util.Point3fi; import org.jmol.viewer.JC; @@ -261,7 +260,7 @@ for (int i = 0; i < nv; i++) pts[i] = P3.newP(vertices[i]); info.put("vertices", pts); - info.put("elemNos", getElemNos()); + info.put("elemNos", getElemNos(true)); if (id == null) { info.put("atomIndex", Integer.valueOf(centralAtom.i)); @@ -296,11 +295,11 @@ int[] indices = new int[nVertices]; for (int i = nVertices; --i >= 0;) { P3 pt = vertices[i]; - boolean isNode = pt instanceof Node; - names[i] = (isNode ? ((Node) pt).getAtomName() + boolean isNode = pt instanceof Atom; + names[i] = (isNode ? ((Atom) pt).getAtomName() : pt instanceof Point3fi ? Elements .elementSymbolFromNumber(((Point3fi) pt).sD) : ""); - indices[i] = (isNode ? ((Node) pt).getIndex() : -1); + indices[i] = (isNode ? ((Atom) pt).getIndex() : -1); } info.put("atomNames", names); info.put("vertexIndices", indices); @@ -370,15 +369,28 @@ private int[] elemNos; - public int[] getElemNos() { - if (elemNos == null) { - elemNos = new int[nVertices]; + void setPointScale(float scale) { + pointScale = scale; + elemNos = null; + } + + public int[] getElemNos(boolean forInfo) { + if (forInfo) { + int[] a = new int[nVertices]; for (int i = 0; i < nVertices; i++) { P3 pt = vertices[i]; - elemNos[i] = (pt instanceof Node ? ((Node) pt).getElementNumber() + a[i] = (pt instanceof Atom ? ((Atom) pt).getElementNumber() : pt instanceof Point3fi ? ((Point3fi) pt).sD : -2); } + return a; } + if (elemNos == null) + elemNos = new int[nVertices]; + for (int i = 0; i < nVertices; i++) { + P3 pt = vertices[i]; + elemNos[i] = (pt instanceof Atom ? ((Atom) pt).getAtomicAndIsotopeNumber() + : pt instanceof Point3fi ? ((Point3fi) pt).sD : -2); + } return elemNos; } Modified: trunk/Jmol/src/org/jmol/symmetry/Symmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -1592,6 +1592,9 @@ if (transform == null) { return staticGetTransformABC(trm, false); } + if (transform.equals("xyz")) { + return (trm == null ? null : SymmetryOperation.getXYZFromMatrix(trm, false, false, false)); + } if (trm == null) trm = new M4(); UnitCell.getMatrixAndUnitCell(null, transform, trm); Modified: trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -121,6 +121,10 @@ private static final String PLANE_COLOR_N_GLIDE = "orange"; // naranja private static final String COLOR_SCREW_1 = "orange"; private static final String COLOR_SCREW_2 = "blue"; + private static final String COLOR_2 = "red"; + private static final String COLOR_BAR_3 = "[xA00040]"; + private static final String COLOR_BAR_4 = "[x800080]"; + private static final String COLOR_BAR_6 = "[x4000A0]"; //////////// private methods /////////// @@ -761,7 +765,7 @@ ptr.scaleAdd2(0.5f, vtemp, pa1); } ptemp.add2(pa1, vtemp); - ang2 = (int) Math + ang2 = Math .round(Measure.computeTorsion(pta00, pa1, ptemp, p0, true)); if (SymmetryOperation.approx(ang2) != 0) { ang1 = ang2; @@ -781,7 +785,7 @@ op.isIrrelevant |= isIrrelevant; Boolean isccw = op.getOpIsCCW(); int screwDir = 0; - + int nrot = 0; if (bsInfo.get(RET_LABEL) || bsInfo.get(RET_TYPE)) { info1 = type = "identity"; @@ -796,19 +800,22 @@ if (isccw != null) { screwtype = (isccw == Boolean.TRUE ? "(+)" : "(-)"); screwDir = (isccw == Boolean.TRUE ? 1 : -1); + if (haveInversion && screwDir == -1) + isIrrelevant = true; } + nrot = 360 / ang; if (haveInversion) { // n-bar - info1 = (360 / ang) + "-bar" + screwtype + " axis"; + info1 = nrot + "-bar" + screwtype + " axis"; } else if (pitch1 != 0) { // screw axis ptemp.setT(ax1); uc.toFractional(ptemp, false); - info1 = (360 / ang) + screwtype + " (" + strCoord(ptemp, op.isBio) + info1 = nrot + screwtype + " (" + strCoord(ptemp, op.isBio) + ") screw axis"; } else { - info1 = (360 / ang) + screwtype + " axis"; + info1 = nrot + screwtype + " axis"; if (order % 2 == 0) screwDir *= order / 2; // 6_3, 4_2 } @@ -904,7 +911,7 @@ if (isRotation) { - color = "red"; + color = (nrot == 2 ? COLOR_2 : nrot == 3 ? COLOR_BAR_3 : nrot == 4 ? COLOR_BAR_4 : COLOR_BAR_6); ang = ang1; float scale = 1f; @@ -912,9 +919,6 @@ // draw the lines associated with a rotation - if (haveInversion) { - color = "purple"; - } String wp = ""; if (isSpaceGroup) { pa1.setT(op.getOpPoint()); @@ -1065,7 +1069,6 @@ } P3 p2 = null; - float wscale = 1; if (pitch1 == 0 && !haveInversion) { // simple rotation ptemp.scaleAdd2(0.5f, vtemp, pa1); @@ -1085,8 +1088,7 @@ && (d = op.getOpTrans().length()) > 0.4f) { // all space group screw if (isccw == Boolean.TRUE) { - // vtemp.scale(1.02d); - // wscale = 2d; + // n/a } else if (isccw == null) { // 2-fold // maybe add a second @@ -1105,13 +1107,11 @@ } else if (isSpaceGroup && haveInversion) { // all space group n-bar // pitch1 here is 120 or 60 or 0 ?? - p2 = pt1; - vtemp.scale(-1f); scaleByOrder(vtemp, order, isccw); wp = "80"; } if (pitch1 > 0 && !haveInversion) { - wp = "" + (90 - (int) (vtemp.length() * wscale / pitch1 * 90)); + wp = "" + (90 - (int) (vtemp.length() / pitch1 * 90)); } if (!ignore) { @@ -1136,12 +1136,15 @@ } color = (screwDir < 0 ? COLOR_SCREW_2 : COLOR_SCREW_1); } - String name = opType + "_"+ order + "rotvector1"; + String name = opType + "_"+ nrot + "rotvector1"; drawOrderVector(drawSB, name, "vector", THICK_LINE + wp, pa1, - order, screwDir, haveInversion, 1, vtemp, isTimeReversed ? "gray" : color, title); + nrot, screwDir, haveInversion && isSpaceGroupAll, isccw == Boolean.TRUE, + vtemp, isTimeReversed ? "gray" : color, title); if (p2 != null) { - drawOrderVector(drawSB, name, "vector", THICK_LINE + wp, - ptr, order, screwDir, haveInversion, 2, vtemp, isTimeReversed ? "gray" : color, title); + // second standard rotation arrow on other side of unit cell only + drawOrderVector(drawSB, name + "2", "vector", THICK_LINE + wp, + ptr, order, screwDir, haveInversion, isccw == Boolean.TRUE, vtemp, + isTimeReversed ? "gray" : color, title); } } @@ -1308,11 +1311,20 @@ ptref = (isSpaceGroup ? pta00 : P3.newP(pta00)); } if (ptref != null && !ignore) { - drawVector(drawSB, (glideType == '\0' ? "centering_" : glideType + "_g") + "trans_vector", "vector", - (isTranslationOnly ? THICK_LINE : THIN_LINE), ptref, trans, - isTimeReversed && !haveInversion && !isMirrorPlane - && !isRotation ? "darkGray" : "gold", - title); + boolean isCentered = (glideType == '\0'); + color = (isTimeReversed && !haveInversion && !isMirrorPlane + && !isRotation ? "darkGray" : "gold"); + drawVector(drawSB, (isCentered ? "centering_" : glideType + "_g") + "trans_vector", "vector", + (isTranslationOnly ? THICK_LINE : THIN_LINE), ptref, trans, color, title); + if (isSpaceGroup && !isCentered && !isTranslationOnly) { + // draw reverse arrow as well + ptemp.setT(ptref); + ptemp.add(trans); + ptemp2.setT(trans); + ptemp2.scale(-1); + drawVector(drawSB, glideType + "_g" + "trans_vector2", "vector", + THIN_LINE, ptemp, ptemp2, color, title); + } } } @@ -1579,14 +1591,12 @@ @SuppressWarnings("unchecked") private void drawOrderVector(SB sb, String label, String type, String d, P3 pt, int order, int screwDir, - boolean haveInversion, int index, V3 vtemp, + boolean haveInversion, boolean isCCW, V3 vtemp, String color, String title) { - if (index == 2) - label += "b"; drawVector(sb, label, type, d, pt, vtemp, color, title); - if (order == 2) + if (order == 2 || haveInversion && !isCCW) return; - Object[] poly = getPolygon(order, 0, false, pt, vtemp); + Object[] poly = getPolygon(order, !haveInversion ? 0 : isCCW ? 1 : -1, haveInversion, pt, vtemp); Lst<Object> l = (Lst<Object>) poly[0]; sb.append(getDrawID(label + "_key")).append(" POLYGON ").appendI(l.size()); for (int i = 0, n = l.size(); i < n; i++) @@ -1593,6 +1603,7 @@ sb.appendO(l.get(i)); sb.append(" color ").append(color); if (screwDir != 0) { + // add screw axis "windmill" poly = getPolygon(order, screwDir, haveInversion, pt, vtemp); sb.append(getDrawID(label + "_key2")); l = (Lst<Object>) poly[0]; @@ -1608,7 +1619,7 @@ } private static Object[] getPolygon(int order, int screwDir, boolean haveInversion, P3 pt0, V3 v) { - float scale = 0.4f; + float scale = (haveInversion ? 0.6f : 0.4f); Lst<P3> pts = new Lst<>(); Lst<int[]> faces = new Lst<>(); V3 offset = V3.newV(v); @@ -1638,12 +1649,12 @@ if (i < order) { pts.addLast(pt); } - if (screwDir != 0 && (i % screwDir == 0) && ptLast != null) { + if (!haveInversion && screwDir != 0 && (i % screwDir == 0) && ptLast != null) { vt.sub2(pt, ptLast); int p2 = (i < order ? p++ : 0); P3 pt1 = P3.newP(pt); - pt1.scaleAdd2(1f, pt, pt1); - pt1.scaleAdd2(-1f, offset, pt1); + pt1.scaleAdd2(1, pt, pt1); + pt1.scaleAdd2(-1, offset, pt1); pts.addLast(pt1); faces.addLast(new int[] {plast, p++, p2, 0}); plast = p2; Modified: trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -42,6 +42,7 @@ import javajs.util.SB; import javajs.util.T3; import javajs.util.V3; +import javajs.util.V3d; /* * Bob Hanson 4/2006 @@ -89,7 +90,7 @@ private int opType = TYPE_UNKNOWN; private int opOrder; - private V3 opTrans; + private V3 opTrans, opGlide; private P3 opPoint, opPoint2; private V3 opAxis; P4 opPlane; @@ -619,7 +620,8 @@ int modDim = (op == null ? 0 : op.modDim); int nRows = 4 + modDim; int divisor = (op == null ? setDivisor(xyz) : op.divisor); - boolean doNormalize = halfOrLess && (op == null ? !xyz.startsWith("!") : op.doNormalize); + boolean doNormalize = halfOrLess + && (op == null ? !xyz.startsWith("!") : op.doNormalize); int dimOffset = (modDim > 0 ? 3 : 0); // allow a b c to represent x y z if (linearRotTrans != null) { int n = linearRotTrans.length - 1; @@ -1447,7 +1449,6 @@ m4.getTranslation(opTrans); opTrans.scale(1f / order); float d = approx6(opTrans.length()); - float dmax = 1; opPoint = new P3(); V3 v = null; boolean isOK = true; @@ -1524,20 +1525,13 @@ if (!checkOpPoint(p1sum)) opPoint2 = null; } - } - } // real question here... // problem here with p1 not being a vector, just the base point along the axis. if (v.dot(p1) < 0) { isOK = false; } - if (d > 0 && opTrans.z == 0 && opTrans.lengthSquared() == 1.25f) { - // SG 177 - dmax = 1.25f; - opIsLong = true; - } else { - dmax = 1.0f; } + } break; case TYPE_REFLECTION: // first plane point is half way from 0 to p1 - trans @@ -1564,28 +1558,40 @@ opPlane.w = 0; approx6Pt(opAxis); normalizePlane(opPlane); -// -// opAxis.setT(opPlane); - if (d > 0 && - (opTrans.z == 0 && opTrans.lengthSquared() == 1.25f - || opTrans.z == 0.5f && opTrans.lengthSquared() == 1.5f)) { - // SG 186 - // +/-0.5x +/-y, +/-x +/-0.5y - dmax = 1.25f; - opIsLong = true; - } else { - dmax = 0.78f; - } break; } if (d > 0) { opClean6(opTrans); + float dmax = 1; if (opType == TYPE_REFLECTION) { + // BUT opTrans is the composite translation, not just the glide?? + if (opTrans.z == 0 && opTrans.lengthSquared() == 1.25f + || opTrans.z == 0.5f && opTrans.lengthSquared() == 1.5f) { + // SG 186 + // -x+y+2,y+1,z + dmax = 1.25f; + opIsLong = true; + } else { + // this is skipping "-y+2/3,-x+1/3,z+5/6" in SG 161 + dmax = 0.78f; + } + opGlide = V3.newV(opTrans); + fixNegTrans(opGlide); + if (opGlide.length() == 0) + opGlide = null; // being careful here not to disallow this for vertical planes in #156; only for #88 if ((opTrans.x == 1 || opTrans.y == 1 || opTrans.z == 1) && m22 == -1) isOK = false; + } else { + if (opTrans.z == 0 && opTrans.lengthSquared() == 1.25f) { + // SG 177 -x+y+2,y+1,-z+2 + dmax = 1.25f; +// System.out.println("SO opLong " + opTrans + " " + getXYZFromMatrix(this, false, false, false)); + opIsLong = true; } + } opType |= TYPE_TRANSLATION; + // opTrans is the FULL translation, not just the glide! if (Math.abs(approx(opTrans.x)) >= dmax || Math.abs(approx(opTrans.y)) >= dmax || Math.abs(approx(opTrans.z)) >= dmax) { @@ -1612,6 +1618,12 @@ // return "" + ((int)approx(v1.x)) + ((int)approx(v1.y)) + ((int)approx(v1.z)); // } + private void fixNegTrans(V3 t) { + t.x = normHalf(t.x); + t.y = normHalf(t.y); + t.z = normHalf(t.z); + } + private static void normalizePlane(P4 plane) { approx6Pt(plane); plane.w = approx6(plane.w); @@ -1717,6 +1729,7 @@ SB xyzLst = new SB(); Map<String, Lst<SymmetryOperation>> mapPlanes = new Hashtable<String, Lst<SymmetryOperation>>(); + V3 vTemp = new V3(); for (int i = 0; i < n; i++) { SymmetryOperation op = ops[i]; lst.addLast(op); @@ -1723,12 +1736,12 @@ String s = op.getOpName(OP_MODE_NOTRANS); xyzLst.append(s).appendC(';'); if ((op.getOpType() & TYPE_REFLECTION) != 0) - addCoincidentMap(mapPlanes, op, TYPE_REFLECTION); + addCoincidentMap(mapPlanes, op, TYPE_REFLECTION, vTemp); else if (op.getOpType() == TYPE_SCREW_ROTATION) - addCoincidentMap(mapPlanes, op, TYPE_SCREW_ROTATION); + addCoincidentMap(mapPlanes, op, TYPE_SCREW_ROTATION, null); } for (int i = 1; i < n; i++) { // skip x,y,z - ops[i].addOps(xyzLst, lst, mapPlanes, n, i); + ops[i].addOps(xyzLst, lst, mapPlanes, n, i, vTemp); } return lst.toArray(new SymmetryOperation[lst.size()]); } @@ -1739,12 +1752,12 @@ * * @param xyzList * @param lst - * @param mapPlanes + * @param mapCoincident * @param n0 * @param isym */ void addOps(SB xyzList, Lst<SymmetryOperation> lst, - Map<String, Lst<SymmetryOperation>> mapCoincident, int n0, int isym) { + Map<String, Lst<SymmetryOperation>> mapCoincident, int n0, int isym, V3 vTemp) { V3 t0 = new V3(); getTranslation(t0); boolean isPlane = ((getOpType() & TYPE_REFLECTION) == TYPE_REFLECTION); @@ -1759,13 +1772,13 @@ if (opTemp == null) opTemp = new SymmetryOperation(null, 0, false); t.set(i, j, k); - if (checkOpSimilar(t)) + if (checkOpSimilar(t, vTemp)) continue; if (opTemp.opCheckAdd(this, t0, n0, t, xyzList, lst, isym + 1)) { if (isPlane) - addCoincidentMap(mapCoincident, opTemp, TYPE_REFLECTION); + addCoincidentMap(mapCoincident, opTemp, TYPE_REFLECTION, vTemp); else if (isScrew) - addCoincidentMap(mapCoincident, opTemp, TYPE_SCREW_ROTATION); + addCoincidentMap(mapCoincident, opTemp, TYPE_SCREW_ROTATION, null); opTemp = null; } } @@ -1783,9 +1796,11 @@ * coincident planes map * @param op * @param opType + * @param vTemp */ private static void addCoincidentMap(Map<String, Lst<SymmetryOperation>> mapCoincident, - SymmetryOperation op, int opType) { + SymmetryOperation op, int opType, + V3 vTemp) { if (op.isIrrelevant) return; String s = op.getOpName(OP_MODE_POSITION_ONLY); @@ -1812,16 +1827,50 @@ } op.iCoincident = 1; } else { - SymmetryOperation op0 = l.get(0); - if (op.opTrans != null && op0.opTrans != null) { - V3 v = V3.newV(op.opTrans); - v.add(op0.opTrans); - if (v.lengthSquared() < 1e-6) { + SymmetryOperation op0 = null; + for (int i = l.size(); --i >= 0;) { + op0 = l.get(i); + if (op.opGlide != null && op0.opGlide != null) { + vTemp.sub2(op.opGlide, op0.opGlide); + if (vTemp.lengthSquared() < 1e-6) { + // space groups 218, 225, 227 will fire this + op.isIrrelevant = true; + return; + } + vTemp.add2(op.opGlide, op0.opGlide); + if (vTemp.lengthSquared() < 1e-6) { // space groups 218, 225, 227 will fire this op.isIrrelevant = true; return; } + vTemp.add2(op.opAxis, op0.opAxis); + if (vTemp.lengthSquared() < 1e-6) { + // opposite axes. Should we reverse one? + // maybe check trans vs opAxis? + op.isIrrelevant = true; + return; + } + } else if (op.opGlide == null && op0.opGlide == null) { + + vTemp.add2(op.opAxis, op0.opAxis); + if (vTemp.lengthSquared() < 1e-6) { + // opposite axes. Should we reverse one? + // maybe check trans vs opAxis? + op.isIrrelevant = true; + return; } + vTemp.sub2(op.opAxis, op0.opAxis); + if (vTemp.lengthSquared() < 1e-6) { + // same axes + // how did this happen? + op.isIrrelevant = true; + return; + } + } + + + } + // FOR loop leaves op0 = lst.get(0); if (op0.iCoincident == 0) { op.iCoincident = 1; op0.iCoincident = -1; @@ -1844,7 +1893,7 @@ * @param t * @return true if */ - private boolean checkOpSimilar(V3 t) { + private boolean checkOpSimilar(V3 t, V3 vTemp) { switch (getOpType() &~ TYPE_TRANSLATION) { default: return false; @@ -1853,7 +1902,10 @@ case TYPE_ROTATION: // includes screw rotation return (approx6(t.dot(opAxis) - t.length()) == 0); case TYPE_REFLECTION: // includes glide reflection - return (approx6(t.dot(opAxis)) == 0); + vTemp.cross(t, opAxis); + // t.cross(opAxis)==0 is a translation PERPENDICULAR to the plane + // t.dot(opAxis)==0 is a translation IN the plane + return (approx6(vTemp.length()) == 0 ? false : approx6(t.dot(opAxis)) == 0); } } @@ -1879,14 +1931,15 @@ if (isIrrelevant || opType == TYPE_IDENTITY || opType == TYPE_TRANSLATION) return false; String s = getOpName(OP_MODE_NOTRANS) + ";"; - if (xyzList.indexOf(s) >= 0) + if ((opType & TYPE_REFLECTION) == 0 && xyzList.indexOf(s) >= 0) { return false; - xyzList.append(s); - lst.addLast(this); - isFinalized = true; - xyz = getXYZFromMatrix(this, false, false, false); - return true; - } + } + xyzList.append(s); + lst.addLast(this); + isFinalized = true; + xyz = getXYZFromMatrix(this, false, false, false); + return true; + } static void approx6Pt(T3 pt) { if (pt != null) { @@ -2197,6 +2250,10 @@ * @return normalized translation */ private static String norm(float d) { + return opF(normHalf(d)); + } + + private static float normHalf(float d) { while (d <= -0.5) { d += 1; } @@ -2203,7 +2260,7 @@ while (d > 0.5) { d -= 1; } - return opF(d); + return d; } /** Modified: trunk/Jmol/src/org/jmol/viewer/ColorManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ColorManager.java 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/viewer/ColorManager.java 2024-05-05 15:18:44 UTC (rev 22624) @@ -134,22 +134,26 @@ // we need to use the byte form here for speed switch (pid) { case PAL.PALETTE_PROPERTY: - return (colorData == null || atom.i >= colorData.length || Float.isNaN(colorData[atom.i]) ? C.GRAY : - ce.getColorIndex(colorData[atom.i])); + return (colorData == null || atom.i >= colorData.length + || Float.isNaN(colorData[atom.i]) ? C.GRAY + : ce.getColorIndex(colorData[atom.i])); case PAL.PALETTE_NONE: case PAL.PALETTE_CPK: + int[] a = argbsCpk; + int i = id = atom.getAtomicAndIsotopeNumber(); + if (i >= Elements.elementNumberMax) { + id = Elements.altElementIndexFromNumber(i); + if (id > 0) { + i = id; + id += Elements.elementNumberMax; + a = altArgbsCpk; + } else { + i = id = Elements.getElementNumber(i); + } + } // Note that CPK colors can be changed based upon user preference // therefore, a changeable colix is allocated in this case - id = atom.getAtomicAndIsotopeNumber(); - if (id < Elements.elementNumberMax) - return g3d.getChangeableColix(id, argbsCpk[id]); - int id0 = id; - id = Elements.altElementIndexFromNumber(id); - if (id > 0) - return g3d.getChangeableColix(Elements.elementNumberMax + id, - altArgbsCpk[id]); - id = Elements.getElementNumber(id0); - return g3d.getChangeableColix(id, argbsCpk[id]); + return g3d.getChangeableColix(id, a[i]); case PAL.PALETTE_PARTIAL_CHARGE: // This code assumes that the range of partial charges is [-1, 1]. index = ColorEncoder.quantize4(atom.getPartialCharge(), -1, 1, @@ -173,8 +177,8 @@ ColorEncoder.BWR, false); case PAL.PALETTE_STRAIGHTNESS: return ce.getColorIndexFromPalette( - atom.group.getGroupParameter(T.straightness), -1, 1, - ColorEncoder.BWR, false); + atom.group.getGroupParameter(T.straightness), -1, 1, ColorEncoder.BWR, + false); case PAL.PALETTE_SURFACE: hi = vwr.ms.getSurfaceDistanceMax(); return ce.getColorIndexFromPalette(atom.getSurfaceDistance100(), 0, hi, @@ -202,9 +206,8 @@ atom.group.chain.selectedGroupCount - 1, ColorEncoder.BGYOR, false); case PAL.PALETTE_POLYMER: Model m = vwr.ms.am[atom.mi]; - return ce.getColorIndexFromPalette( - atom.group.getBioPolymerIndexInModel(), 0, - (m.isBioModel ? ((BioModel) m).getBioPolymerCount() : 0) - 1, + return ce.getColorIndexFromPalette(atom.group.getBioPolymerIndexInModel(), + 0, (m.isBioModel ? ((BioModel) m).getBioPolymerCount() : 0) - 1, ColorEncoder.BGYOR, false); case PAL.PALETTE_MONOMER: // vwr.calcSelectedMonomersCount() must be called first ... @@ -219,18 +222,17 @@ case PAL.PALETTE_ALTLOC: //very inefficient! modelIndex = atom.mi; - return ce - .getColorIndexFromPalette( - modelSet.getAltLocIndexInModel(modelIndex, atom.altloc), 0, - modelSet.getAltLocCountInModel(modelIndex), ColorEncoder.ROYGB, - false); + return ce.getColorIndexFromPalette( + modelSet.getAltLocIndexInModel(modelIndex, atom.altloc), 0, + modelSet.getAltLocCountInModel(modelIndex), ColorEncoder.ROYGB, + false); case PAL.PALETTE_INSERTION: //very inefficient! modelIndex = atom.mi; return ce.getColorIndexFromPalette( modelSet.getInsertionCodeIndexInModel(modelIndex, - atom.group.getInsertionCode()), 0, - modelSet.getInsertionCountInModel(modelIndex), ColorEncoder.ROYGB, + atom.group.getInsertionCode()), + 0, modelSet.getInsertionCountInModel(modelIndex), ColorEncoder.ROYGB, false); case PAL.PALETTE_JMOL: id = atom.getAtomicAndIsotopeNumber(); @@ -280,25 +282,40 @@ return JC.altArgbsCpk[Elements.altElementIndexFromNumber(id)]; } - public short setElementArgb(int id, int argb) { + public short getElementColix(int elemNo) { + // could be isotope,elemno + int[] a = argbsCpk; + int i = elemNo; + if (i > Elements.elementNumberMax) { + int ialt = Elements.altElementIndexFromNumber(i); + if (ialt > 0) { + i = ialt; + a = altArgbsCpk; + } else { + i = Elements.getElementNumber(i); + } + } + return C.getColix(a[i]); + } + + public void setElementArgb(int elemNo, int argb) { if (argb == T.jmol && argbsCpk == PAL.argbsCpk) - return 0; - argb = getJmolOrRasmolArgb(id, argb); - if (argbsCpk == PAL.argbsCpk) { - argbsCpk = AU.arrayCopyRangeI(PAL.argbsCpk, 0, -1); + return; + argb = getJmolOrRasmolArgb(elemNo, argb); + if (argbsCpk == PAL.argbsCpk) { + argbsCpk = AU.arrayCopyRangeI(PAL.argbsCpk, 0, -1); altArgbsCpk = AU.arrayCopyRangeI(JC.altArgbsCpk, 0, -1); } + int id = elemNo; if (id < Elements.elementNumberMax) { - if (argb == Integer.MAX_VALUE) - return C.getColix(argbsCpk[id]); argbsCpk[id] = argb; - g3d.changeColixArgb(id, argb); - return 0; + } else { + id = Elements.altElementIndexFromNumber(elemNo); + altArgbsCpk[id] = argb; + id += Elements.elementNumberMax; } - id = Elements.altElementIndexFromNumber(id); - altArgbsCpk[id] = argb; - g3d.changeColixArgb(Elements.elementNumberMax + id, argb); - return 0; + g3d.changeColixArgb(id, argb); + vwr.setModelkitPropertySafely(JC.MODELKIT_UPDATE_MODEL_KEYS, null); } /////////////////// propertyColorScheme /////////////// @@ -365,4 +382,5 @@ c.currentPalette = c.createColorScheme(colorScheme, false, true); return (c.currentPalette == Integer.MAX_VALUE ? null : c); } + } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-05-02 18:36:04 UTC (rev 22623) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-05-05 15:18:44 UTC (rev 22624) @@ -54,14 +54,32 @@ # FEATURE REQUEST: dock/undock consoles to main window. # TODO: allow FIXED to work with MODELKIT MINIMIZE +Jmol.___JmolVersion="16.2.15" // (legacy) also 16.2.16 (swingJS) -Jmol.___JmolVersion="16.2.13" // (legacy) also 16.2.14 (swingJS) +bug fix: x = symop(n) broken for n a symmetry operator number -bug fix: select UNITCELL should be inclusive, [0,1] (broken in 14.32.17) +bug fix: draw symop [4x4 matrix] not working + +bug fix: MODELKIT DRAW SPACEGROUP should use prefix "sg" not "sym" + +bug fix: various minor aspects of DRAW SPACEGROUP ALL and MODELKIT DRAW SPACEGROUP + -- new color coding for n-axes + -- new color coding and larger icons for n-bar axes + -- missing split planes (mirror+glide and glide+glide) + -- missing additional 2-fold rotations tangent to corners in hexagonal groups + + +JmolVersion="16.2.13" // (legacy) also 16.2.14 (swingJS) + +bug fix: select UNITCELL should be inclusive, [0,1] (broken in 14.32.18) -- not the same as within(unitcell), which is [0,1) exclusive -bug fix: polyhedra COLLAPSED EDGES does not just act on current polyhedra (never worked) +bug fix: polyhedra COLLAPSED EDGES does not just act on current polyhedra +bug fix: polyhedra POINTS miscolors isotopes + +bug fix: atom color change using color <element name> not reflected in element key + bug fix: MODELKIT SET KEY not working correctly (broken in 16.2.1) -- had been changed to "ELEMENTKEY" without documentation -- now just an alias for MODELKIT SET ELEMENTKEY @@ -78,13 +96,12 @@ -- presence of DRAW objects in a state sets MODELKIT SET ELEMENTKEY ON for associated models when restored, preserving the key for those models that had them when saved - -- setting persists through ZAP and LOAD + -- persistent through ZAP -new feature: MODELKIT SET ELEMENTKEY ON/OFF - -- adds or removes an element key as per SET ELEMENTKEY ON/OFF, - but only for the CURRENT model only +new feature: MODELKIT SET ELEMENTKEY ON/OFF (actually introduced in 16.2.1) + -- adds or removes an element key as per SET ELEMENTKEY ON/OFF, but only for the CURRENT model only -- indirectly saved in state as the presence of the associated DRAW objects - -- setting does NOT persist through ZAP or LOAD + -- key does NOT persist through ZAP new feature: frank (bottom right corner "Jmol") displays "JmolD" for JmolD.jar and JmolDataD.jar This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-05-02 18:36:07
|
Revision: 22623 http://sourceforge.net/p/jmol/code/22623 Author: hansonr Date: 2024-05-02 18:36:04 +0000 (Thu, 02 May 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.13" // (legacy) also 16.2.14 (swingJS) bug fix: select UNITCELL should be inclusive, [0,1] (broken in 14.32.17) -- not the same as within(unitcell), which is [0,1) exclusive bug fix: polyhedra COLLAPSED EDGES does not just act on current polyhedra (never worked) bug fix: MODELKIT SET KEY not working correctly (broken in 16.2.1) -- had been changed to "ELEMENTKEY" without documentation -- now just an alias for MODELKIT SET ELEMENTKEY -- not supposed to persist through ZAP new feature: SET ELEMENTKEY ON/OFF (actually introduced in 16.2.1) -- adds or removes an element key in the upper right for ALL models -- key is a list of a colored DRAW point and a b/w ECHO with ids "_!_elkey_<modelIndex>_*" -- overrides current settings from MODELKIT SET ELEMENTKEY -- only visible when just a single model is visible -- recognizes different isotope colors -- does not appear if atoms of the same element or isotope have different colors -- setting itself is not explicitly saved in the state -- presence of DRAW objects in a state sets MODELKIT SET ELEMENTKEY ON for associated models when restored, preserving the key for those models that had them when saved -- setting persists through ZAP and LOAD new feature: MODELKIT SET ELEMENTKEY ON/OFF -- adds or removes an element key as per SET ELEMENTKEY ON/OFF, but only for the CURRENT model only -- indirectly saved in state as the presence of the associated DRAW objects -- setting does NOT persist through ZAP or LOAD new feature: frank (bottom right corner "Jmol") displays "JmolD" for JmolD.jar and JmolDataD.jar Modified Paths: -------------- trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/j2s/timestamp trunk/Jmol/src/org/jmol/modelkit/ModelKit.java trunk/Jmol/src/org/jmol/popup/MainPopupResourceBundle.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/shape/Frank.java trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java trunk/Jmol/src/org/jmol/viewer/JC.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/j2s/timestamp 2024-05-02 18:36:04 UTC (rev 22623) @@ -1 +1 @@ -20240430165520 +20240502092243 Modified: trunk/Jmol/src/org/jmol/modelkit/ModelKit.java =================================================================== --- trunk/Jmol/src/org/jmol/modelkit/ModelKit.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/modelkit/ModelKit.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -89,9 +89,9 @@ boolean isITA; boolean isHM; String hallSymbol; - + String errString; - + private M4 trLink; private int index; protected String calcNext; // "sub" or "super" @@ -107,12 +107,11 @@ if (isITA) { // ITA/140 or ITA/140.2 name = name.substring(4); - } + } isHM = false; hallSymbol = null; if (name.charAt(0) == '[') { - - + // [P 2y] is a Hall symbol pt = name.indexOf(']'); if (pt < 0) { @@ -154,7 +153,7 @@ } this.name = name; } - + void addTransform(M4 trm) { if (trLink == null) { trLink = new M4(); @@ -162,7 +161,7 @@ } trLink.mul(trm); } - + boolean update(Viewer vwr, ClegNode prevNode, M4 trm, M4 trTemp, SymmetryInterface sym) { if (errString != null) @@ -175,7 +174,8 @@ // set the unit cell in SG_IS_ASSIGN mode and there is a // unit cell already. This call will build the space group if necessary // if it is from Wyckoff - myTrm = (name.endsWith(".1") ? "a,b,c" : (String) sym.getITASettingValue(vwr, name, "trm")); + myTrm = (name.endsWith(".1") ? "a,b,c" + : (String) sym.getITASettingValue(vwr, name, "trm")); if (myTrm == null) { errString = "Unknown ITA setting: " + name + "!"; return false; @@ -182,12 +182,13 @@ } String[] tokens = PT.split(name, "."); myIta = tokens[0]; - name = "ITA/" + myIta + ":" + name = "ITA/" + myIta + ":" + (myTrm == null || myTrm.equals("a,b,c") ? setting : myTrm); - // (setting != null ? ":" + setting - // : myTrm);//tokens[1].equals("1") ? "" : "." + tokens[1]); // for SpaceGroupFinder - } else if (hallSymbol != null){ - if (sym.getSpaceGroupInfoObj("nameToXYZList", "Hall:" + hallSymbol, false, false) == null) { + // (setting != null ? ":" + setting + // : myTrm);//tokens[1].equals("1") ? "" : "." + tokens[1]); // for SpaceGroupFinder + } else if (hallSymbol != null) { + if (sym.getSpaceGroupInfoObj("nameToXYZList", "Hall:" + hallSymbol, + false, false) == null) { errString = "Invalid Hall notation: " + hallSymbol; return false; } @@ -194,12 +195,15 @@ int pt = hallSymbol.indexOf("("); if (pt > 0) { //modelkit spacegroup "[p 32 2\" (0 0 4)]" - String[] vabc = PT.split(hallSymbol.substring(pt + 1, hallSymbol.length() - 1), " "); + String[] vabc = PT.split( + hallSymbol.substring(pt + 1, hallSymbol.length() - 1), " "); hallSymbol = hallSymbol.substring(0, pt).trim(); - P3 v = P3.new3(-PT.parseFloat(vabc[0])/12,-PT.parseFloat(vabc[1])/12,-PT.parseFloat(vabc[2])/12); + P3 v = P3.new3(-PT.parseFloat(vabc[0]) / 12, + -PT.parseFloat(vabc[1]) / 12, -PT.parseFloat(vabc[2]) / 12); setting = "a,b,c;" + sym.staticToRationalXYZ(v, ","); } - name = "[" + hallSymbol + "]" + (setting.equals("a,b,c") ? "" :":" + setting); + name = "[" + hallSymbol + "]" + + (setting.equals("a,b,c") ? "" : ":" + setting); } else { myTrm = (String) sym.getSpaceGroupInfoObj("itaTransform", name, false, false); @@ -218,8 +222,8 @@ M4 trm0 = null; boolean haveCalc = false; boolean haveReferenceCell = (prevNode != null && trLink == null - && (hallSymbol != null - || myIta != null && (myIta.equals(prevNode.myIta) || prevNode.calcNext != null))); + && (hallSymbol != null || myIta != null + && (myIta.equals(prevNode.myIta) || prevNode.calcNext != null))); if (haveReferenceCell) { trm0 = M4.newM4(trm); if (prevNode != null && prevNode.myTrm != null) { @@ -233,7 +237,7 @@ switch (prevNode.calcNext) { case "super": isSub = false; - break; + break; case "sub": break; case "": @@ -242,12 +246,12 @@ isImplicit = true; break; } - int ita1 = PT.parseInt(prevNode.myIta); + int ita1 = PT.parseInt(prevNode.myIta); int ita2 = PT.parseInt(myIta); boolean isSetting = (isImplicit && ita1 == ita2); if (!isSetting) { - trCalc = (String) sym.getSubgroupJSON(vwr, - (isSub ? ita1 : ita2), (isSub ? ita2 : ita1), 0, 1); + trCalc = (String) sym.getSubgroupJSON(vwr, (isSub ? ita1 : ita2), + (isSub ? ita2 : ita1), 0, 1); haveCalc = (trCalc != null); if (haveCalc && !isSub) trCalc = "!" + trCalc; @@ -267,7 +271,7 @@ trm1.mul(trm0); calculated = (String) sym.convertTransform(null, trm1); } - + } return true; } @@ -274,7 +278,8 @@ @Override public String toString() { - return "[ClegNode #" + index + " " + name + " " + myIta + ":" + setting + " " + myTrm + "]"; + return "[ClegNode #" + index + " " + name + " " + myIta + ":" + setting + + " " + myTrm + "]"; } /** @@ -289,7 +294,7 @@ SymmetryInterface sym) { for (int i = 0; i < tokens.length; i++) { String s = tokens[i].trim(); - if (s.length()==0) + if (s.length() == 0) continue; int pt = s.indexOf(":"); String transform; @@ -320,7 +325,8 @@ break; default: if (transform.indexOf(",") >= 0) { - if (((M4) sym.convertTransform(transform, null)).determinant3() == 0) + if (((M4) sym.convertTransform(transform, null)) + .determinant3() == 0) return false; } break; @@ -385,17 +391,17 @@ // break; // case TYPE_DISTANCE: // // not implemented - // value = ((Float) params[0]).floatValue(); + // value = ((Float) params[0]).doubleValue(); // points = new P3[] { (P3) params[1], null }; // break; // case TYPE_ANGLE: // // not implemented - // value = ((Float) params[0]).floatValue(); + // value = ((Float) params[0]).doubleValue(); // points = new P3[] { (P3) params[1], (P3) params[2], null }; // break; // case TYPE_DIHEDRAL: // // not implemented - // value = ((Float) params[0]).floatValue(); + // value = ((Float) params[0]).doubleValue(); // points = new P3[] { (P3) params[1], (P3) params[2], (P3) params[3], null }; // break; default: @@ -457,7 +463,7 @@ } /** - * A class to use temporarily to create an element key for a model. + * A class to use just temporarily to create an element key for a model. */ private static class EKey { BS bsElements = new BS(); @@ -632,9 +638,9 @@ } private void setPos(SymmetryInterface sym, Constraint c, float scale) { - x = (float)(Math.random() - 0.5d) / wyckoffFactor * scale; - y = (float)(Math.random() - 0.5d) / wyckoffFactor * scale; - z = (float)(Math.random() - 0.5d) / wyckoffFactor * scale; + x = (float) (Math.random() - 0.5f) / wyckoffFactor * scale; + y = (float) (Math.random() - 0.5f) / wyckoffFactor * scale; + z = (float) (Math.random() - 0.5f) / wyckoffFactor * scale; // apply this random walk to the base atom and constrain pt0.setT(atom); ptf.setT(pt0); @@ -884,8 +890,8 @@ private BS minTempModelAtoms; /** - * TRUE to automatically set element keys for all atoms; see SET ELEMENTKEYS - * ON/OFF + * from SET ELEMENTKEY ON/OFF; TRUE to automatically set element keys for all + * models; off to turn them off */ private boolean setElementKeys; @@ -895,6 +901,11 @@ * */ final private BS bsElementKeyModels = new BS(); + + /** + * tracks models for which the element key has been explicitly set OFF, + * overriding global SET elementKey ON + */ final private BS bsElementKeyModelsOFF = new BS(); private boolean haveElementKeys; @@ -964,7 +975,7 @@ if (!forceFull && a0 != null) { // integerize float ang0 = Measure.computeTorsion(a0, b.atom1, b.atom2, a3, true); - float ang1 = Math.round(ang0 + degrees); + float ang1 = (int) Math.round(ang0 + degrees); degrees = ang1 - ang0; } BS bs = BSUtil.copy(bsBranch); @@ -1063,18 +1074,23 @@ * @return true if the type exists */ public boolean checkOption(char type, String key) { + // only for use internally -- not for MODELKIT SET String check = null; switch (type) { case 'M': + // MODELKIT MODE .... check = ";view;edit;molecular;"; break; case 'S': + // MODELKIT check = ";none;applylocal;retainlocal;applyfull;"; break; case 'U': + // MODELKIT UNITCELL ... check = ";packed;extend;"; break; case 'B': + // MODELKIT (set) but not MODELKIT SET check = ";key;elementkey;autobond;hidden;showsymopinfo;clicktosetelement;addhydrogen;addhydrogens;"; break; } @@ -1102,12 +1118,8 @@ * if dragged to a new location to create a bond */ public void clickAssignAtom(int atomIndex, String element, P3 ptNew) { - int n = addAtomType(element, - new P3[] { (ptNew == null ? null : ptNew) }, - BSUtil.newAndSetBit(atomIndex), - "", - null, - "click"); + int n = addAtomType(element, new P3[] { (ptNew == null ? null : ptNew) }, + BSUtil.newAndSetBit(atomIndex), "", null, "click"); if (n > 0) // do we really want this??? vwr.setPickingMode("dragAtom", 0); } @@ -1122,7 +1134,9 @@ * * this model only * - * @param type <element Symbol> | "_"<element Symbol> | <element symbol>":"<Wyckoff letter [a-zAG] + * @param type + * <element Symbol> | "_"<element Symbol> | <element symbol>":"<Wyckoff + * letter [a-zAG] * @param pts * one or more new points, may be null * @param bsAtoms @@ -1137,17 +1151,12 @@ String packing, String cmd) { if (type.startsWith("_")) type = type.substring(1); - return Math.abs(addAtomType(type, - pts, - bsAtoms, - packing, - null, - cmd)); + return Math.abs(addAtomType(type, pts, bsAtoms, packing, null, cmd)); } /** * A versatile method that allows changing element, setting charge, setting - * position, adding or deleting an atom via + * position, adding or deleting an atom via * * MODELKIT ASSIGN ATOM * @@ -1168,13 +1177,7 @@ bs = BSUtil.newAndSetBit(bs.nextSetBit(0)); if (type.startsWith("_")) type = type.substring(1); - assignAtomNoAddedSymmetry(pt, - -1, - bs, - type, - (pt != null), - cmd, - 0); + assignAtomNoAddedSymmetry(pt, -1, bs, type, (pt != null), cmd, 0); } public void cmdAssignBond(int bondIndex, char type, String cmd) { @@ -1261,11 +1264,10 @@ } /** - * MODELKIT SPACEGROUP + * MODELKIT SPACEGROUP * - * Assign a given space group, currently only "P1" - * Do all the necessary changes in unit cells and atom - * site assignments. + * Assign a given space group, currently only "P1" Do all the necessary + * changes in unit cells and atom site assignments. * * @param bs * atoms in the set defining the space group @@ -1272,17 +1274,21 @@ * @param name * "P1" or "1" or ignored * @param paramsOrUC - * @param isPacked - * @param cmd + * @param isPacked + * @param doDraw + * @param cmd * @return new name or "" or error message */ - public String cmdAssignSpaceGroup(BS bs, String name, Object paramsOrUC, boolean isPacked, boolean doDraw, String cmd) { + public String cmdAssignSpaceGroup(BS bs, String name, Object paramsOrUC, + boolean isPacked, boolean doDraw, + String cmd) { SymmetryInterface sym0 = vwr.getCurrentUnitCell(); SymmetryInterface sym = vwr.getOperativeSymmetry(); if (sym0 != null && sym != sym0) - sym.getUnitCell(sym0.getV0abc(null,null), false, "modelkit"); - SB sb = new SB(); - String ret = assignSpaceGroup(sym, null, bs, paramsOrUC, PT.split(name, ">"), 0, null, null, sb); + sym.getUnitCell(sym0.getV0abc(null, null), false, "modelkit"); + SB sb = new SB(); + String ret = assignSpaceGroup(sym, null, bs, paramsOrUC, + PT.split(name, ">"), 0, null, null, sb); if (ret.endsWith("!")) return ret; if (isPacked) { @@ -1290,8 +1296,8 @@ if (doDraw) { n = cmdAssignAddAtoms("N:G", null, null, "packed", cmd); } else { - String transform = ret; - BS bsModelAtoms = vwr.getThisModelAtoms(); + String transform = ret; + BS bsModelAtoms = vwr.getThisModelAtoms(); n = cmdAssignSpaceGroupPacked(bsModelAtoms, transform, cmd); } sb.append("\n").append(GT.i(GT.$("{0} atoms added"), n)); @@ -1299,7 +1305,7 @@ String msg = sb.toString(); boolean isError = msg.endsWith("!"); if (doDraw && !isError) { - String s = drawSymmetry("sym", false, -1, null, Integer.MAX_VALUE, null, + String s = drawSymmetry("sym", false, -1, null, Integer.MAX_VALUE, null, null, null, 0, -2, 0, null); appRunScript(s); } @@ -1324,7 +1330,8 @@ * @param cmd * @return number of atoms added */ - public int cmdAssignSpaceGroupPacked(BS bsAtoms, String transform, String cmd) { + public int cmdAssignSpaceGroupPacked(BS bsAtoms, String transform, + String cmd) { SymmetryInterface sym = vwr.getOperativeSymmetry(); if (sym == null) return 0; @@ -1423,8 +1430,7 @@ return Boolean.valueOf(getMKState() == STATE_MOLECULAR); } - if (name == JC.MODELKIT_KEY || name == JC.MODELKIT_ELEMENT_KEYS - || name == JC.MODELKIT_ELEMENT_KEYS) { + if (name == JC.MODELKIT_KEY || name == JC.MODELKIT_ELEMENT_KEY) { return Boolean.valueOf(isElementKeyOn(vwr.am.cmi)); } @@ -1505,11 +1511,13 @@ } /** - * Not clear this is a good idea. It's possible for this to be set only once, - * when the file is loaded + * From menu opening and Not clear this is a good idea. It's possible for this + * to be set only once, when the file is loaded + * + * @param isZap */ - public void initializeForModel() { - // from Viewer also + private void initializeForModel(boolean isZap) { + // from ZAP or from menu opening resetBondFields(); allOperators = null; currentModelIndex = -999; @@ -1523,8 +1531,12 @@ STATE_MOLECULAR); //setProperty("clicktosetelement",Boolean.valueOf(!hasUnitCell)); //setProperty("addhydrogen",Boolean.valueOf(!hasUnitCell)); - if (setElementKeys) { - updateModelElementKey(vwr.am.cmi, true); + if (isZap) { + if (setElementKeys) { + updateModelElementKey(vwr.am.cmi, true); + } + bsElementKeyModels.clearAll(); + bsElementKeyModelsOFF.clearAll(); } } @@ -1575,7 +1587,7 @@ this.menu = menu; this.vwr = menu.vwr; menu.modelkit = this; - initializeForModel(); + initializeForModel(false); } /** @@ -1609,7 +1621,8 @@ // set only if (key == JC.MODELKIT_INITIALIZE_MODEL) { - initializeForModel(); + // from ZAP only + initializeForModel(true); return null; } @@ -1618,17 +1631,6 @@ return null; } - if (key == JC.MODELKIT_SET_ELEMENT_KEYS) { - setElementKeys(isTrue(value)); - return null; - } - - if (key == JC.MODELKIT_FRAME_RESIZED) { - clearElementKey(-1); - updateModelElementKeys(null, true); - return null; - } - if (key == JC.PROP_ATOMS_MOVED) { if (drawAtomSets != null) { updateDrawAtomSets(key, ((BS[]) value)[0]); @@ -1648,17 +1650,31 @@ updateElementKeyFromStateScript(); return null; } - if (key == JC.MODELKIT_UPDATE_ATOM_KEYS || key == JC.MODELKIT_ELEMENT_KEY - || key == JC.MODELKIT_ELEMENT_KEYS) { - if (value == null || value instanceof BS) { - BS bsAtoms = (BS) value; - updateElementKey(bsAtoms); - return null; - } - // modelkit set elementkey, setelementkeys + + if (key == JC.MODELKIT_UPDATE_ATOM_KEYS) { + BS bsAtoms = (BS) value; + updateElementKey(bsAtoms); + return null; + } + + if (key == JC.MODELKIT_SET_ELEMENT_KEY) { + // exclusively from SET elementKeys... + setElementKeys(isTrue(value)); + return null; + } + + if (key == JC.MODELKIT_FRAME_RESIZED) { + clearElementKey(-2); + updateModelElementKeys(null, true); + return null; + } + + if (key == JC.MODELKIT_KEY || key == JC.MODELKIT_ELEMENT_KEY) { + // modelkit set elementkey(s), set key int mi = vwr.am.cmi; boolean isOn = isTrue(value); bsElementKeyModelsOFF.setBitTo(mi, !isOn); + bsElementKeyModels.setBitTo(mi, false);// force new, for whatever reason setElementKey(mi, isOn); return isOn ? "true" : "false"; } @@ -2241,7 +2257,8 @@ /** * Entry point from clickAssignAtom or cmdAssignAddAtoms * - * @param type <element Symbol> | <element symbol>":"<Wyckoff letter [a-zAG] + * @param type + * <element Symbol> | <element symbol>":"<Wyckoff letter [a-zAG] * @param pts * @param bsAtoms * @param packing @@ -2250,24 +2267,24 @@ * @return number of atoms added */ private int addAtomType(String type, P3[] pts, BS bsAtoms, String packing, - M4[] opsCtr, String cmd) { - SymmetryInterface sym = vwr.getOperativeSymmetry(); - int ipt = type.indexOf(":"); - String wyckoff = (ipt > 0 && ipt == type.length() - 2 - ? type.substring(ipt + 1) - : null); - if (wyckoff != null) { - type = type.substring(0, ipt); - if (sym != null) { - Object o = sym.getWyckoffPosition(vwr, null, wyckoff); - if (!(o instanceof P3)) - return 0; - pts = new P3[] { (P3) o }; - } - } - return addAtoms(type, pts, bsAtoms, packing, opsCtr, cmd); + M4[] opsCtr, String cmd) { + SymmetryInterface sym = vwr.getOperativeSymmetry(); + int ipt = type.indexOf(":"); + String wyckoff = (ipt > 0 && ipt == type.length() - 2 + ? type.substring(ipt + 1) + : null); + if (wyckoff != null) { + type = type.substring(0, ipt); + if (sym != null) { + Object o = sym.getWyckoffPosition(vwr, null, wyckoff); + if (!(o instanceof P3)) + return 0; + pts = new P3[] { (P3) o }; + } } - + return addAtoms(type, pts, bsAtoms, packing, opsCtr, cmd); + } + /** * The full-blown command with all options, called by addAtomType or * cmdAssignSpaceGroupPacked @@ -2314,13 +2331,14 @@ assignAtomNoAddedSymmetry(pts[i], -1, null, type, true, cmd, -1); n = -pts.length; } else { - assignAtomNoAddedSymmetry(pts[0], atomIndex, null, type, true, cmd, -1); + assignAtomNoAddedSymmetry(pts[0], atomIndex, null, type, true, cmd, + -1); n = -1; } } else { // handle equilivalent positions n = addAtomsWithSymmetry(sym, bsAtoms, type, atomIndex, isPoint, pts, - packing, opsCtr); + packing, opsCtr); } return n; } catch (Exception e) { @@ -2333,25 +2351,28 @@ /** * - * Add atoms with or without packing, but - * always with consideration of equivalent positions. + * Add atoms with or without packing, but always with consideration of + * equivalent positions. * - * + * * must have symmetry; must be this model - + * * @param sym - * @param bsAtoms model atoms to check for identity of atom at the specified location + * @param bsAtoms + * model atoms to check for identity of atom at the specified location * @param type * @param atomIndex * @param isPoint - * @param pts - * @param packing "packed" or "" - * @param opsCtr augmented operator set that includes lost translations for subgroups - * @return number of atoms added + * @param pts + * @param packing + * "packed" or "" + * @param opsCtr + * augmented operator set that includes lost translations for subgroups + * @return number of atoms added */ private int addAtomsWithSymmetry(SymmetryInterface sym, BS bsAtoms, - String type, int atomIndex, - boolean isPoint, P3[] pts, String packing, M4[] opsCtr) { + String type, int atomIndex, boolean isPoint, + P3[] pts, String packing, M4[] opsCtr) { BS bsM = vwr.getThisModelAtoms(); int n = bsM.cardinality(); if (n == 0) @@ -2379,38 +2400,29 @@ int nInitial = points.size(); packing = "fromfractional;tocartesian;" + packing; if (isPoint) { - + // MODELKIT ASSIGN ATOM .... // new atom at a single point, // but there could be equivalent atoms. // note that if there are occupancies at the same spot // even if "a point", we need to move all of them. - + BS bsEquiv = (bsAtoms == null ? null : vwr.ms.getSymmetryEquivAtoms(bsAtoms, null, null)); for (int i = 0; i < pts.length; i++) { - assignAtoms(P3.newP(pts[i]), - atomIndex, - bsEquiv, - stype, - true, // newPoint + assignAtoms(P3.newP(pts[i]), atomIndex, bsEquiv, stype, true, // newPoint null, // cmd - false, - site, - sym, - points, - packing, - null); + false, site, sym, points, packing, null); } } else { - + // MODELKIT SPACEGROUP - + // Go through site-by-site. There is no need to check // every atom of a given site, since any one will produce // the closed set of all the others. But we do need to // add all symmetry-equivalent atoms for each site. - + BS sites = new BS(); for (int i = bsAtoms.nextSetBit(0); i >= 0; i = bsAtoms .nextSetBit(i + 1)) { @@ -2420,22 +2432,12 @@ continue; sites.set(site); stype = (type == null ? a.getElementSymbolIso(true) : stype); - + // now assign atoms with consideration for equivalent atoms. - - assignAtoms(P3.newP(a), - -1, - null, - stype, - false, - null, - false, - site, - sym, - points, - packing, - opsCtr); - + + assignAtoms(P3.newP(a), -1, null, stype, false, null, false, site, sym, + points, packing, opsCtr); + // If we don't have augmnted operations, we can just // remove the new atoms from the list, because there won't be any // cross-over between Wyckoff positions. @@ -2445,7 +2447,7 @@ // can be checked for duplicate positions. // (They were converted to Cartesians in order to // load them into the structure.) - + if (opsCtr == null) { for (int j = points.size(); --j >= nInitial;) points.removeItemAt(j); @@ -2522,7 +2524,7 @@ } /** - * Just a conduit for debugging and keeping one's sanity. + * Just a conduit for debugging and keeping one's sanity. * * * @param pt @@ -2533,28 +2535,21 @@ * @param cmd * @param site */ - private void assignAtomNoAddedSymmetry(P3 pt, int atomIndex, BS bs, String type, - boolean newPoint, String cmd, - // strictly internal, for crystal work: - int site) { - assignAtoms(pt, atomIndex, - bs, - type, - newPoint, - cmd, - false, - site, - null, - null, - null, - null); + private void assignAtomNoAddedSymmetry(P3 pt, int atomIndex, BS bs, + String type, boolean newPoint, + String cmd, + // strictly internal, for crystal work: + int site) { + assignAtoms(pt, atomIndex, bs, type, newPoint, cmd, false, site, null, null, + null, null); } /** - * The penultimate target method. + * The penultimate target method. * * Change element, charge, and deleting an atom by clicking on it or via the - * MODELKIT ASSIGN ATOM command or from packing with MODELKIT SPACEGROUP ... PACKED + * MODELKIT ASSIGN ATOM command or from packing with MODELKIT SPACEGROUP ... + * PACKED * * <pre> * pt atomIndex bs @@ -2572,11 +2567,13 @@ * @param bs * @param type * @param newPoint - * @param cmd passed on to notifications + * @param cmd + * passed on to notifications * @param isClick * @param site * @param sym - * a SymmetryInterface being passed on from addAtoms, or null; will be set if null + * a SymmetryInterface being passed on from addAtoms, or null; will be + * set if null * @param points * @param packing * @param opsCtr @@ -2587,8 +2584,8 @@ private void assignAtoms(P3 pt, int atomIndex, BS bs, String type, boolean newPoint, String cmd, boolean isClick, // strictly internal, for crystal work: - int site, SymmetryInterface sym, - Lst<P3> points, String packing, M4[] opsCtr) { + int site, SymmetryInterface sym, Lst<P3> points, + String packing, M4[] opsCtr) { if (sym == null) sym = vwr.getOperativeSymmetry(); boolean haveAtomByIndex = (atomIndex >= 0); @@ -2737,7 +2734,7 @@ // now add the "hydrogens" aka new atoms // using vwr.addHydrogensInline, which works through a merge using ModelLoader - + Map<String, Object> htParams = new Hashtable<String, Object>(); if (site > 0) htParams.put("fixedSite", Integer.valueOf(site)); @@ -2749,7 +2746,7 @@ // bs now points to the new atoms // restore globals - + if (!isMK) { vwr.setBooleanProperty("modelkitmode", false); menu.hidden = wasHidden; @@ -2759,12 +2756,12 @@ } // we have the new atom, now assign it - + int atomIndexNew = bs.nextSetBit(0); if (points == null) { // new single atom - assignAtom(atomIndexNew, type, false, - atomIndex >= 0 && sym == null, true); + assignAtom(atomIndexNew, type, false, atomIndex >= 0 && sym == null, + true); if (atomIndex >= 0) { boolean doAutobond = (sym == null && !"H".equals(type)); assignAtom(atomIndex, ".", false, doAutobond, isClick); @@ -2796,12 +2793,13 @@ } /** - * Do the actual assignment of a single atom, possibly with bonding, - * possibly deletion or charge increment/decerement. + * Do the actual assignment of a single atom, possibly with bonding, possibly + * deletion or charge increment/decerement. * * This is the terminal method in the series: * - * <pre> + * <pre> + * * clickAssignAtom cmdAssignAddAtoms * | | * +----> AddAtomType <---+ cmdAssignSpaceGroupPacked @@ -2813,7 +2811,7 @@ * +-----------> assignAtoms <----------+ * | * +--------> assignAtom - * ========== + * ========== * * </pre> * @@ -2831,8 +2829,8 @@ * whether this is a click or not * @return atomicNumber or -1 */ - private int assignAtom(int atomIndex, String type, - boolean autoBond, boolean addHsAndBond, boolean isClick) { + private int assignAtom(int atomIndex, String type, boolean autoBond, + boolean addHsAndBond, boolean isClick) { if (isClick) { if (vwr.isModelkitPickingRotateBond()) { @@ -3482,7 +3480,8 @@ } String token = tokens[index].trim(); - boolean isSubgroupCalc = token.length() == 0 || token.equals("sub") || token.equals("super"); + boolean isSubgroupCalc = token.length() == 0 || token.equals("sub") + || token.equals("super"); String calcNext = (isSubgroupCalc ? token : null); if (isSubgroupCalc) { token = tokens[++index].trim(); @@ -3491,24 +3490,25 @@ int pt = token.lastIndexOf(":"); // could be "154:_2" or "R 3 2 :" or 5:a,b,c boolean haveUnitCell = (sym00 != null); boolean isUnknown = false; - boolean haveTransform = (token.length() == 0 - || token.indexOf(',') > 0 - || "!r!h".indexOf(token) >= 0); // r !r h !h + boolean haveTransform = (token.length() == 0 || token.indexOf(',') > 0 + || "!r!h".indexOf(token) >= 0); // r !r h !h boolean haveJmolSetting = (!haveTransform && pt > 0 && pt < token.length() - 1); boolean isTransformOnly = (haveTransform && pt < 0); String transform = (haveTransform ? token.substring(pt + 1) : null); - + M4 trTemp = new M4(); boolean restarted = false; SymmetryInterface sym = vwr.getSymTemp(); - if (prevNode == null) { + if (prevNode == null) { if (!ClegNode.checkSyntax(tokens, sym)) return "invalid CLEG expression!"; - if (!haveUnitCell && !haveUCParams && (haveTransform || (pt = token.indexOf('.')) > 0)) { + if (!haveUnitCell && !haveUCParams + && (haveTransform || (pt = token.indexOf('.')) > 0)) { String ita = token.substring(0, pt); // easiest is to restart with the default configuration - String err = assignSpaceGroup(null, null, null, null, new String[] { ita }, 0, null, null, sb); + String err = assignSpaceGroup(null, null, null, null, + new String[] { ita }, 0, null, null, sb); if (err.endsWith("!")) return err; sym00 = vwr.getOperativeSymmetry(); @@ -3605,11 +3605,11 @@ params = (!haveUCParams || !AU.isAD(paramsOrUC) ? null : (float[]) paramsOrUC); if (!haveUnitCell) { - sym.setUnitCellFromParams( - params == null ? new float[] { 10, 10, 10, 90, 90, 90 } : params, - false, Float.NaN); - paramsOrUC = null; - haveUCParams = false; + sym.setUnitCellFromParams( + params == null ? new float[] { 10, 10, 10, 90, 90, 90 } : params, + false, Float.NaN); + paramsOrUC = null; + haveUCParams = false; } if (haveUCParams) { // have UNITCELL params, either [a b c..] or [o a b c] or 'a,b,c:...' @@ -3704,12 +3704,12 @@ "unitcell on; center unitcell;axes unitcell; axes 0.1; axes on;" + "set perspectivedepth false;moveto 0 axis c1;draw delete;show spacegroup"); } - + // don't change the first line of this message -- it will be used in packing. - + transform = sym.staticGetTransformABC(trm, false); - String msg = transform + "\n" - + PT.join(tokens, '>' , 0) + "\n basis=" + basis; + String msg = transform + "\n" + PT.join(tokens, '>', 0) + "\n basis=" + + basis; System.out.println("ModelKit trm=" + msg); sb.append(msg).append("\n"); return transform; @@ -3720,8 +3720,8 @@ } } - protected static M4 addSGTransform(SymmetryInterface sym, String tr, M4 trm0, - M4 temp) { + protected static M4 addSGTransform(SymmetryInterface sym, String tr, + M4 trm0, M4 temp) { if (trm0 == null) { trm0 = new M4(); trm0.setIdentity(); @@ -3757,6 +3757,13 @@ return false; } + /** + * Deletes the DRAW object for this or all models and adjusts haveElementKeys + * appropriately. + * + * @param modelIndex + * -1 for all models + */ private void clearElementKey(int modelIndex) { if (!haveElementKeys) return; @@ -3764,13 +3771,17 @@ Object[][] val = new Object[][] { { "thisID", key }, { "delete", null } }; vwr.shm.setShapeProperties(JC.SHAPE_DRAW, val); vwr.shm.setShapeProperties(JC.SHAPE_ECHO, val); - if (modelIndex < 0) { + switch (modelIndex) { + case -2: + break; + case -1: bsElementKeyModels.clearAll(); - haveElementKeys = false; - } else { + break; + default: bsElementKeyModels.clear(modelIndex); - haveElementKeys = !bsElementKeyModels.isEmpty(); + break; } + haveElementKeys = !bsElementKeyModels.isEmpty(); } /** @@ -4443,12 +4454,15 @@ /** * Triggered by a MODELKIT OFF in a state script, set there by StateCreator - * when there is an ECHO for _!_elkey*. + * when there is an ECHO for _!_elkey*. Just checks for DRAW objects and sets + * haveElementKeys and bsElementKeyModels appropriately. */ private void updateElementKeyFromStateScript() { for (int i = vwr.ms.mc; --i >= 0;) { - if (isElementKeyOn(i)) + if (isElementKeyOn(i)) { bsElementKeyModels.set(i); + haveElementKeys = true; + } } } @@ -4573,7 +4587,7 @@ } /** - * Only set a model's elmeent key if it is already on or if SET ELEMENTKEYS ON + * Only set a model's element key if it is already on or if SET ELEMENTKEYS ON * has been issued. "ON" is defined as "present as a draw object" * * @param modelIndex @@ -4592,7 +4606,8 @@ return modelIndex >= 0 // && !vwr.ms.isJmolDataFrameForModel(modelIndex) // && !bsElementKeyModelsOFF.get(modelIndex) // - && (setElementKeys || isElementKeyOn(modelIndex)); + && (setElementKeys || bsElementKeyModels.get(modelIndex) + || isElementKeyOn(modelIndex)); } /** @@ -4670,8 +4685,8 @@ } /** - * A class to maintain the connection between drawn symmetry business - * and sets of atoms. This allows them to be adjusted on the fly. + * A class to maintain the connection between drawn symmetry business and sets + * of atoms. This allows them to be adjusted on the fly. * */ private class DrawAtomSet { @@ -4771,9 +4786,9 @@ } /** - * @param id - * @param ucLattice - * @param swidth + * @param id + * @param ucLattice + * @param swidth */ public void drawUnitCell(String id, T3 ucLattice, String swidth) { SymmetryInterface sym = vwr.getOperativeSymmetry(); @@ -4794,9 +4809,8 @@ for (int p = 1, x = (int) cellRange[0].x; x < cellRange[1].x; x++) { for (int y = (int) cellRange[0].y; y < cellRange[1].y; y++) { for (int z = (int) cellRange[0].z; z < cellRange[1].z; z++, p++) { - s += "\ndraw ID " + PT.esc(id + "_" + p) - + " " + swidth + " unitcell \"a,b,c;" + x - + "," + y + "," + z + "\""; + s += "\ndraw ID " + PT.esc(id + "_" + p) + " " + swidth + + " unitcell \"a,b,c;" + x + "," + y + "," + z + "\""; } } } @@ -4811,32 +4825,37 @@ } private String getDrawAxes(String id, String swidth) { - if (vwr.g.axesMode != T.axesunitcell || vwr.shm.getShapePropertyIndex(JC.SHAPE_AXES,"axesTypeXY", 0) == Boolean.TRUE) + if (vwr.g.axesMode != T.axesunitcell || vwr.shm + .getShapePropertyIndex(JC.SHAPE_AXES, "axesTypeXY", 0) == Boolean.TRUE) return ""; if (id == null) id = "uca"; if (swidth.indexOf(".") > 0) swidth += "05"; - P3 origin = (P3) vwr.shm.getShapePropertyIndex(JC.SHAPE_AXES, "originPoint", 0); - P3[] axisPoints = (P3[]) vwr.shm.getShapePropertyIndex(JC.SHAPE_AXES, "axisPoints", 0); + P3 origin = (P3) vwr.shm.getShapePropertyIndex(JC.SHAPE_AXES, + "originPoint", 0); + P3[] axisPoints = (P3[]) vwr.shm.getShapePropertyIndex(JC.SHAPE_AXES, + "axisPoints", 0); String s = ""; - String[] colors = new String[] {"red", "green", "blue"}; + String[] colors = new String[] { "red", "green", "blue" }; for (int i = 0, a = JC.AXIS_A; i < 3; i++, a++) { - s += "\ndraw ID " + PT.esc(id + "_axis_" + JC.axisLabels[a]) - + " " + swidth + " line " + origin + " " + axisPoints[i] + " color " + colors[i]; + s += "\ndraw ID " + PT.esc(id + "_axis_" + JC.axisLabels[a]) + " " + + swidth + " line " + origin + " " + axisPoints[i] + " color " + + colors[i]; } return s; } - public String drawSymmetry(String thisId, boolean isSymop, int iatom, String xyz, int iSym, - P3 trans, P3 center, P3 target, int intScale, int nth, - int options, int[] opList) { - + public String drawSymmetry(String thisId, boolean isSymop, int iatom, + String xyz, int iSym, P3 trans, P3 center, + P3 target, int intScale, int nth, int options, + int[] opList) { + String s = null; if (options != 0) { // options is T.offset, and target is an {i j k} offset from cell 555 - Object o = vwr.getSymmetryInfo(iatom, xyz, iSym, trans, center, - target, T.point, null, intScale / 100f, nth, options, opList); + Object o = vwr.getSymmetryInfo(iatom, xyz, iSym, trans, center, target, + T.point, null, intScale / 100f, nth, options, opList); if (o instanceof P3) target = (P3) o; else @@ -4845,8 +4864,8 @@ if (thisId == null) thisId = (isSymop ? "sym" : "sg"); if (s == null) - s = (String) vwr.getSymmetryInfo(iatom, xyz, iSym, trans, center, - target, T.draw, thisId, intScale / 100, nth, options, opList); + s = (String) vwr.getSymmetryInfo(iatom, xyz, iSym, trans, center, target, + T.draw, thisId, intScale / 100, nth, options, opList); if (s != null) { s = "draw ID " + (isSymop ? "sg" : "sym") + "* delete;" + s; s = "draw ID " + thisId + "* delete;" + s; Modified: trunk/Jmol/src/org/jmol/popup/MainPopupResourceBundle.java =================================================================== --- trunk/Jmol/src/org/jmol/popup/MainPopupResourceBundle.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/popup/MainPopupResourceBundle.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -211,7 +211,7 @@ + "pickMolecule pickElement - dragAtom dragMolecule - pickSpin - modelKitMode - PDBpickChain PDBpickGroup SYMMETRYpickSite" }, { "computationMenu", - "minimize modelkit" + "minimize" /* calculateVolume*/ }, @@ -218,7 +218,9 @@ { "showMenu", "showHistory showFile showFileHeader - " + "showOrient showMeasure - " - + "showSpacegroup showState SYMMETRYshowSymmetry UNITCELLshow - showIsosurface showMo - extractMOL" }, + + "showSpacegroup showState SYMMETRYshowSymmetry UNITCELLshow - " + + "showIsosurface showMo - " + + "modelkit extractMOL" }, { "SIGNEDJAVAcaptureMenuSPECIAL", "SIGNEDJAVAcaptureRock SIGNEDJAVAcaptureSpin - SIGNEDJAVAcaptureBegin SIGNEDJAVAcaptureEnd SIGNEDJAVAcaptureOff SIGNEDJAVAcaptureOn SIGNEDJAVAcaptureFpsSPECIAL SIGNEDJAVAcaptureLoopingSPECIAL" }, Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/script/T.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -1027,7 +1027,7 @@ public final static int drawpicking = booleanparam | 58; public final static int dsspcalchydrogen = booleanparam | 59; public final static int dynamicmeasurements = booleanparam | 60; //DEPRECATED; not implemented; leave here to avoid SET error - public final static int elementkeys = booleanparam | 62; + public final static int elementkey = booleanparam | 62; public final static int ellipsoidarcs = booleanparam | 63; public final static int ellipsoidarrows = booleanparam | 64; public final static int ellipsoidaxes = booleanparam | 65; @@ -2627,7 +2627,6 @@ "drawHover", "drawPicking", "dsspCalculateHydrogenAlways", - "elementKeys", "elementKey", "ellipsoidArcs", "ellipsoidArrows", @@ -3709,8 +3708,7 @@ drawhover, // "drawHover" drawpicking, // "drawPicking" dsspcalchydrogen, // "dsspCalculateHydrogenAlways" - elementkeys, - -1, + elementkey, ellipsoidarcs, // "ellipsoidArcs" ellipsoidarrows, // "ellipsoidArrows" ellipsoidaxes, // "ellipsoidAxes" Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -3793,6 +3793,7 @@ float foffset = 0; String id = null; boolean ok = false; + boolean modifyOnly = false; int[][] faces = null; P3[] points = null; if (slen == 2 && tokAt(1) == T.list) { @@ -3978,6 +3979,7 @@ case T.collapsed: // assume regenerating - but not actually recommended Jmol 16.2.13/14 needsGenerating = true; + modifyOnly = (i == 1); // COLLAPSED // COLLAPSED [faceCenterOffset] if (typeSeen) @@ -4060,7 +4062,7 @@ if (needsGenerating) { if (!typeSeen && haveBonds) setShapeProperty(JC.SHAPE_POLYHEDRA, "bonds", null); - setShapeProperty(JC.SHAPE_POLYHEDRA, "generate", null); + setShapeProperty(JC.SHAPE_POLYHEDRA, "generate", Boolean.valueOf(modifyOnly)); } else if (!ok) {// && lighting == T.nada) error(ScriptError.ERROR_insufficientArguments); } @@ -4497,7 +4499,12 @@ eparams.put("fullPath", fullPath); eparams.put("width", Integer.valueOf(width)); eparams.put("height", Integer.valueOf(height)); + try { data = vwr.generateOutputForExport(eparams); + } catch (Exception e) { + data = e.toString();// failed to write -- could be complex OBJ/MTL file + return data; + } if (data == null || data.length() == 0) return ""; if (showOnly) Modified: trunk/Jmol/src/org/jmol/shape/Frank.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Frank.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/shape/Frank.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -41,7 +41,7 @@ final static int defaultFontSize = 16; public final static int frankMargin = 4; - public String frankString = "Jmol"; + public static String frankString = "Jmol"; Font currentMetricsFont3d; public Font baseFont3d; public int frankWidth; @@ -57,6 +57,10 @@ public void initShape() { myType = "frank"; baseFont3d = font3d = vwr.gdata.getFont3DFSS(defaultFontName, defaultFontStyle, defaultFontSize); + if (Viewer.isJS || Viewer.isSwingJS) + frankString = "JSmol"; + else if (Viewer.isDoublePrecision) + frankString = "JmolD"; calcMetrics(); } @@ -91,10 +95,6 @@ } void calcMetrics() { - if (Viewer.isJS) - frankString = "JSmol"; - else if (vwr.isSignedApplet) - frankString = "Jmol_S"; if (font3d == currentMetricsFont3d) return; currentMetricsFont3d = font3d; Modified: trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java =================================================================== --- trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/shapespecial/Polyhedra.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -158,6 +158,9 @@ centers = bs; iHaveCenterBitSet = true; } + boolean modifyOnly = (value == Boolean.TRUE); + if (modifyOnly) + bs.and(vwr.getAtomBitSet("polyhedra")); Map<String, Object> info = this.info; deletePolyhedra(); this.info = info; Modified: trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/viewer/GlobalSettings.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -256,7 +256,7 @@ setF("drawFontSize", drawFontSize); setB("drawPicking", drawPicking); setB("dsspCalculateHydrogenAlways", dsspCalcHydrogen); - setB("elementkeys", elementKeys); + setB("elementkey", elementKey); // setO("edsUrlFormat", edsUrlFormat); // setO("edsUrlFormatDiff", edsUrlFormatDiff); // //setParameterValue("edsUrlOptions", edsUrlOptions); @@ -631,7 +631,7 @@ boolean drawHover = false; boolean drawPicking = false; boolean dsspCalcHydrogen = true; - boolean elementKeys = false; + boolean elementKey = false; public String energyUnits = "kJ"; float exportScale = 0f; String helpPath = JC.DEFAULT_HELP_PATH; @@ -1003,7 +1003,7 @@ + ";selecthetero;selecthydrogen" // removed in Jmol 14.32.68 + ";pointgrouplineartolerance;pointgroupdistancetolerance"//;pointgroupmmaxatoms" - + ";minimizationreportsteps;elementkeys;elementkey;symmetryhermannmauguin;") + + ";minimizationreportsteps;elementkey;symmetryhermannmauguin;") .toLowerCase(); Object getAllVariables() { Modified: trunk/Jmol/src/org/jmol/viewer/JC.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JC.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/viewer/JC.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -961,10 +961,9 @@ public static final String MODELKIT_ELEMENT_KEY_ID = THIS_MODEL_ONLY + "elkey_"; - public static final String MODELKIT_SET_ELEMENT_KEYS = "setelementkeys"; + public static final String MODELKIT_SET_ELEMENT_KEY = "setelementkey"; + public static final String MODELKIT_ELEMENT_KEY = "elementkey"; public static final String MODELKIT_KEY = "key"; - public static final String MODELKIT_ELEMENT_KEY = "elementkey"; - public static final String MODELKIT_ELEMENT_KEYS = "elementkeys"; public static final String MODELKIT_NEW_MODEL_ATOM_KEYS = "newmodelatomkeys"; public static final String MODELKIT_FRAME_RESIZED = "frameresized"; public static final String MODELKIT_UDPATE_KEY_STATE = "updatekeysfromstate"; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-05-02 18:36:04 UTC (rev 22623) @@ -57,11 +57,38 @@ Jmol.___JmolVersion="16.2.13" // (legacy) also 16.2.14 (swingJS) -bug fix: select UNITCELL should be inclusive, [0,1] - -- not the same as within(unitcell), which is [0,1) exclusive +bug fix: select UNITCELL should be inclusive, [0,1] (broken in 14.32.17) + -- not the same as within(unitcell), which is [0,1) exclusive -bug fix: polyhedra COLLAPSED EDGES does not just act on current polyhedra +bug fix: polyhedra COLLAPSED EDGES does not just act on current polyhedra (never worked) +bug fix: MODELKIT SET KEY not working correctly (broken in 16.2.1) + -- had been changed to "ELEMENTKEY" without documentation + -- now just an alias for MODELKIT SET ELEMENTKEY + -- not supposed to persist through ZAP + +new feature: SET ELEMENTKEY ON/OFF (actually introduced in 16.2.1) + -- adds or removes an element key in the upper right for ALL models + -- key is a list of a colored DRAW point and a b/w ECHO with ids "_!_elkey_<modelIndex>_*" + -- overrides current settings from MODELKIT SET ELEMENTKEY + -- only visible when just a single model is visible + -- recognizes different isotope colors + -- does not appear if atoms of the same element or isotope have different colors + -- setting itself is not explicitly saved in the state + -- presence of DRAW objects in a state sets MODELKIT SET ELEMENTKEY ON + for associated models when restored, preserving the key for those + models that had them when saved + -- setting persists through ZAP and LOAD + +new feature: MODELKIT SET ELEMENTKEY ON/OFF + -- adds or removes an element key as per SET ELEMENTKEY ON/OFF, + but only for the CURRENT model only + -- indirectly saved in state as the presence of the associated DRAW objects + -- setting does NOT persist through ZAP or LOAD + +new feature: frank (bottom right corner "Jmol") displays "JmolD" for JmolD.jar and JmolDataD.jar + + JmolVersion="16.2.11" // (legacy) also 16.2.12 (swingJS) bug fix: various minor issues with DRAW SPACEGROUP ALL @@ -902,8 +929,6 @@ bug fix: (legacy JavaScript only) secondary structure reading broken in 16.1.59 -bug fix: MODELKIT SET KEY ON loses colored dot upon frame resizing - bug fix (legacy JavaScript only) script fails when referencing undeclared variable bug fix: PDB file with all UNK residues considered "not PDB" and skips reading sequence number Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2024-05-01 21:09:46 UTC (rev 22622) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2024-05-02 18:36:04 UTC (rev 22623) @@ -3684,6 +3684,7 @@ am.initializePointers(1); return; } + // this is a ZAP reset(true); selectAll(); setModelkitPropertySafely(JC.MODELKIT_INITIALIZE_MODEL, null); @@ -5900,8 +5901,8 @@ return g.doublePrecision; case T.drawpicking: return g.drawPicking; - case T.elementkeys: - return g.elementKeys; + case T.elementkey: + return g.elementKey; case T.fontcaching: return g.fontCaching; case T.fontscaling: @@ -6870,13 +6871,13 @@ public void setBooleanPropertyTok(String key, int tok, boolean value) { boolean doRepaint = true; switch (tok) { - case T.elementkeys: + case T.elementkey: // 16.2.1 - g.elementKeys = value; - getModelkit(false).setProperty(JC.MODELKIT_SET_ELEMENT_KEYS, Boolean.valueOf(value)); + g.elementKey = value; + getModelkit(false).setProperty(JC.MODELKIT_SET_ELEMENT_KEY, Boolean.valueOf(value)); break; case T.symmetryhermannmauguin: - // 16.1.66 + // 16.1.65 g.symmetryHermannMauguin = value; break; case T.doubleprecision: @@ -10663,7 +10664,7 @@ } /** - * Get a ModelKit property. + * Get a ModelKit property, but only if the modelkit exists already. * * @param name * @return value @@ -10672,11 +10673,32 @@ return (modelkit == null ? null : modelkit.getProperty(name)); } + /** + * Set a ModelKit property, but only if the modelkit exists already. + * + * @param key + * @param value + * @return varies, quite possibly null + */ public Object setModelkitPropertySafely(String key, Object value) { return (modelkit == null ? null : modelkit.setProperty(key, value)); } /** + * Check for an option type 'M' 'S' 'U' 'B'. + * + * @param type + * @param value + * @return true or false, but true only if the modelkit already exists + */ + public boolean isModelKitOption(char type, String value) { + // only from MODELKIT command + return modelkit != null && modelkit.checkOption(type, value); + } + + + + /** * A general method for retrieving symmetry information with full capability * of the symop() scripting function. * @@ -11084,12 +11106,9 @@ sm.setStatusAtomMoved(bs); } - public boolean isModelKitOption(char type, String value) { - return modelkit != null && modelkit.checkOption(type, value); - } - /** * Get formula -- MF or CELLFORMULA, possibly empirical + * * @param bs * @param type * @param isEmpirical This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-05-01 21:09:49
|
Revision: 22622 http://sourceforge.net/p/jmol/code/22622 Author: hansonr Date: 2024-05-01 21:09:46 +0000 (Wed, 01 May 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.13" // (legacy) also 16.2.14 (swingJS) bug fix: select UNITCELL should be inclusive, [0,1] -- not the same as within(unitcell), which is [0,1) exclusive bug fix: polyhedra COLLAPSED EDGES does not just act on current polyhedra Modified Paths: -------------- trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/j2s/timestamp trunk/Jmol/site-resources/jsmol/iucrdemo/index.htm trunk/Jmol/src/org/jmol/modelset/ModelSet.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2024-04-28 17:20:54 UTC (rev 22621) +++ trunk/Jmol/j2s/timestamp 2024-05-01 21:09:46 UTC (rev 22622) @@ -1 +1 @@ -20240425232942 +20240430165520 Modified: trunk/Jmol/site-resources/jsmol/iucrdemo/index.htm =================================================================== --- trunk/Jmol/site-resources/jsmol/iucrdemo/index.htm 2024-04-28 17:20:54 UTC (rev 22621) +++ trunk/Jmol/site-resources/jsmol/iucrdemo/index.htm 2024-05-01 21:09:46 UTC (rev 22622) @@ -40,7 +40,7 @@ height : 600, debug : false, color : "0xFFFFFF", - addSelectionOptions : true, + addSelectionOptions : false, use : "HTML5", // JAVA HTML5 WEBGL are all options j2sPath : "../j2s", // this needs to point to where the j2s directory is. jarPath : "../java",// this needs to point to where the java directory is. @@ -79,76 +79,8 @@ </tr> <tr> <td valign="top"> - <div id="appdiv"></div> <br> <a - href="javascript:Jmol.loadFileFromDialog(jmolApplet0)">open...</a> <a - href="javascript:Jmol.script(jmolApplet0,'console')">console</a> <a - href="javascript:Jmol.script(jmolApplet0,'image')">image</a> display - <a - href="javascript:Jmol.script(jmolApplet0,'set antialiasDisplay false')">faster</a> - <a - href="javascript:Jmol.script(jmolApplet0,'set antialiasDisplay true')">sharper</a> - <a href="javascript:Jmol.script(jmolApplet0,'set window 610 450')">large</a> - <a href="javascript:Jmol.script(jmolApplet0,'set window 420 300')">small</a> - <br> platformSpeed: <a - href="javascript:Jmol.script(jmolApplet0,'set platformSpeed 8')" - title='all features'>8</a> <a - href="javascript:Jmol.script(jmolApplet0,'set platformSpeed 7')" - title='no antialiasing'>7</a> <a - href="javascript:Jmol.script(jmolApplet0,'set platformSpeed 6')" - title='no translucency'>6</a> <a - href="javascript:Jmol.script(jmolApplet0,'set platformSpeed 5')" - title='surfaces dotted'>5</a> <a - href="javascript:Jmol.script(jmolApplet0,'set platformSpeed 4')" - title='cartoons as trace'>4</a> <a - href="javascript:Jmol.script(jmolApplet0,'set platformSpeed 3')" - title='geosurfaces as dots'>3</a> <a - href="javascript:Jmol.script(jmolApplet0,'set platformSpeed 2')" - title='ellipsoids as dots'>2</a> <a - href="javascript:Jmol.script(jmolApplet0,'set platformSpeed 1')" - title='wireframe only'>1</a> <br> info <a - href="javascript:Jmol.showInfo(jmolApplet0, true)">show</a> <a - href="javascript:Jmol.clearConsole(jmolApplet0)">clear</a> <a - href="javascript:Jmol.showInfo(jmolApplet0, false)">hide</a> <br> - <a - href="javascript:Jmol.script(jmolApplet0,'select *;cartoons off;spacefill only')">spacefill</a> - <a - href="javascript:Jmol.script(jmolApplet0,'select *;cartoons off;wireframe -0.1')">wire</a> - <a - href="javascript:Jmol.script(jmolApplet0,'select *;cartoons off;spacefill 23%;wireframe 0.15')">ball&stick</a> - <a - href="javascript:Jmol.script(jmolApplet0,'select protein or nucleic;cartoons only')">cartoons</a> - <a - href="javascript:Jmol.script(jmolApplet0,'set cartoonFancy true')">fancy</a> - <a - href="javascript:Jmol.script(jmolApplet0,'set cartoonFancy false')">not</a> - <a - href="javascript:Jmol.script(jmolApplet0,'set cartoonFancy false;set hermitelevel 0')">flat</a> + <div id="appdiv"></div> - <br> - <a href="javascript:Jmol.script(jmolApplet0,'color property atomno')">color - atomno</a> <a href="javascript:Jmol.script(jmolApplet0,'color cpk')">color - cpk</a> <a href="javascript:Jmol.script(jmolApplet0,'color structure')">color - structure</a> <br> <a - href="javascript:Jmol.script(jmolApplet0,'select *;isosurface vdw')">isosurface - vdw</a> <a - href="javascript:Jmol.script(jmolApplet0,'isosurface delete')">off</a> - <a - href="javascript:Jmol.script(jmolApplet0,'if ({atomno < 10}.partialcharge == 0){calculate partialcharge};isosurface vdw map mep')">mep</a> - <a - href="javascript:Jmol.script(jmolApplet0,'isosurface translucent')">translucent</a> - <a href="javascript:Jmol.script(jmolApplet0,'isosurface opaque')">opaque</a> - - - <br> labels <a - href="javascript:Jmol.script(jmolApplet0,'if (_fileType == "Pdb"){select *.CA;label %n%r}else{select *;label %a};select *;')">on</a> - <a href="javascript:Jmol.script(jmolApplet0,'select *;labels off')">off</a> - <a - href="javascript:Jmol.script(jmolApplet0,'font echo 20 serif;fsize=20;set echo top center;echo echo test')">echo</a> - <a - href="javascript:Jmol.script(jmolApplet0,'if (!fsize){fsize=20};fsize += 4;font echo @fsize serif;')">larger</a> - <a - href="javascript:Jmol.script(jmolApplet0,'if (!fsize){fsize=20};fsize -= 4;if (fsize < 10){fsize = 10};font echo @fsize serif')">smaller</a> - </td> <td valign=top><div id=demodiv style="background:beige;width:600px;height:500px;overflow:auto"> Modified: trunk/Jmol/src/org/jmol/modelset/ModelSet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2024-04-28 17:20:54 UTC (rev 22621) +++ trunk/Jmol/src/org/jmol/modelset/ModelSet.java 2024-05-01 21:09:46 UTC (rev 22622) @@ -2243,6 +2243,32 @@ case T.symmetry: return BSUtil .copy(bsSymmetry == null ? bsSymmetry = BS.newN(ac) : bsSymmetry); + case T.unitcell: + // select UNITCELL (a relative quantity) + boolean isSelectUC = ("unitcell".equals(specInfo)); + if (isSelectUC) { + // SELECT UNITCELL is [0, 1] + specInfo = P3.new3(1, 1, 1); + } else { + // this one is [0, 1) + bs = new BS(); + SymmetryInterface uc1 = (specInfo instanceof SymmetryInterface + ? (SymmetryInterface) specInfo + : vwr.getCurrentUnitCell()); + if (uc1 == null) + return bs; + uc1 = uc1.getUnitCellMultiplied(); + for (int i = ac; --i >= 0;) { + if (at[i] != null) { + ptTemp1.setT(at[i]); + uc1.toFractional(ptTemp1, false); + if (uc1.checkPeriodic(ptTemp1)) + bs.set(i); + } + } + return bs; + } + //$FALL-THROUGH$ case T.cell: // select cell=555 (NO NOT an absolute quantity) // select cell=1505050 @@ -2266,25 +2292,6 @@ bs.set(i); } return bs; - case T.unitcell: - // select UNITCELL (a relative quantity) - // this one is [0, 1) - bs = new BS(); - SymmetryInterface uc1 = (specInfo instanceof SymmetryInterface - ? (SymmetryInterface) specInfo - : vwr.getCurrentUnitCell()); - if (uc1 == null) - return bs; - uc1 = uc1.getUnitCellMultiplied(); - for (int i = ac; --i >= 0;) { - if (at[i] != null) { - ptTemp1.setT(at[i]); - uc1.toFractional(ptTemp1, false); - if (uc1.checkPeriodic(ptTemp1)) - bs.set(i); - } - } - return bs; } } Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-04-28 17:20:54 UTC (rev 22621) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-05-01 21:09:46 UTC (rev 22622) @@ -555,6 +555,7 @@ * Process FILL and PACKED and all their variants. * * @param i + * @param tok * @param htParams * @param sOptions * @return new token position @@ -3787,7 +3788,7 @@ float radius = -1; int[] colorArgb = new int[] { Integer.MIN_VALUE }; int noToParam = -1; - int atomPt = 0; + int atomPt = -1; P3 offset = null; float foffset = 0; String id = null; @@ -3970,21 +3971,12 @@ eval.bad(); } propertyValue = atomExpressionAt(i); - i = eval.iToken; - atomPt = i; + atomPt = i = eval.iToken; needsGenerating |= (i + 1 == slen); break; - case T.color: - case T.translucent: - case T.opaque: - if (atomPt == i - 1) - needsGenerating = true; - translucentLevel = getColorTrans(eval, i, true, colorArgb); - i = eval.iToken; - continue; case T.flat: // removed in Jmol 14.4 -- never documented; restored in Jmol 14.29.21 case T.collapsed: - if (atomPt == i - 1) + // assume regenerating - but not actually recommended Jmol 16.2.13/14 needsGenerating = true; // COLLAPSED // COLLAPSED [faceCenterOffset] @@ -3992,10 +3984,19 @@ error(ScriptError.ERROR_incompatibleArguments); typeSeen = true; propertyName = (e.theTok == T.collapsed ? "collapsed" : null); - if (needsGenerating && isFloatParameter(i + 1)) + if (isFloatParameter(i + 1)) setShapeProperty(JC.SHAPE_POLYHEDRA, "faceCenterOffset", Float.valueOf(floatParameter(++i))); break; + case T.color: + case T.translucent: + case T.opaque: + if (atomPt == i - 1) + needsGenerating = true; + translucentLevel = getColorTrans(eval, i, true, colorArgb); + ok = true; + i = eval.iToken; + continue; case T.noedges: case T.edges: case T.frontedges: @@ -4013,7 +4014,7 @@ case T.backlit: case T.frontlit: case T.fullylit: - // never implemented or + // never implemented // lighting = eval.theTok; continue; case T.id: @@ -5345,7 +5346,6 @@ if (data == null) { msg = "no data"; } else if (data instanceof Lst) { - @SuppressWarnings("unchecked") Lst<String> list = (Lst<String>) data; data = list.toArray(new String[list.size()]); } else if (!isAll) { @@ -6467,6 +6467,7 @@ /** * Though a command, not documented. Use the MODELKIT command instead + * @param isModelkit * * @throws ScriptException */ Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-04-28 17:20:54 UTC (rev 22621) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-05-01 21:09:46 UTC (rev 22622) @@ -55,8 +55,15 @@ # TODO: allow FIXED to work with MODELKIT MINIMIZE -Jmol.___JmolVersion="16.2.11" // (legacy) also 16.2.12 (swingJS) +Jmol.___JmolVersion="16.2.13" // (legacy) also 16.2.14 (swingJS) +bug fix: select UNITCELL should be inclusive, [0,1] + -- not the same as within(unitcell), which is [0,1) exclusive + +bug fix: polyhedra COLLAPSED EDGES does not just act on current polyhedra + +JmolVersion="16.2.11" // (legacy) also 16.2.12 (swingJS) + bug fix: various minor issues with DRAW SPACEGROUP ALL NOTE: Introducing here the idea of a "3D interactive space group symmetry model". This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-04-28 17:20:57
|
Revision: 22621 http://sourceforge.net/p/jmol/code/22621 Author: hansonr Date: 2024-04-28 17:20:54 +0000 (Sun, 28 Apr 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.11" // (legacy) also 16.2.12 (swingJS) bug fix: various minor issues with DRAW SPACEGROUP ALL NOTE: Introducing here the idea of a "3D interactive space group symmetry model". Something like a space group diagram or a general position diagram, but in 3D. Symmetry elements can be filtered out to reveal patterns in the remaining subset; aspects of group-subgroup relationships can be depicted, either from a purely symmetry-related perspective or in the context of an actual structure or a set of related structures. Specific atom-atom symmetry relationships can be explored. new feature: MODELKIT DRAW SPACEGROUP [name or number] [packed] -- clears the model with ZAP, then creates the space group symmetry model -- draws the full set of symmetry elements -- optionally (if PACKED), adds a nitrogen atom in the default general position -- shortcut for zap; modelkit spacegroup ... ; draw spacegroup ALL; modelkit add N; -- coding example: function showAllSpaceGroups() { for (var i = 1; i <= 230; i++) { modelkit draw spacegroup @i packed; set echo top right; echo @i; refresh; } } showAllSpaceGroups; // note that some cubics take quite a bit of time function makeSpaceGroupMovie() { zap; background white; capture "spaceGroupMovie.gif"; for (var i = 1; i <= 230; i++) { modelkit draw spacegroup @i packed; set echo top right; echo @i; refresh; } capture end; } makeSpaceGroupMovie() new feature: SHOW SPACEGROUP TABLE <group> -- displays space group tables from Bilbao Crystallographic Server the user's browser -- https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-getgen?gnum=110&what=gp&list=Standard%2FDefault+Setting -- adds to SHOW SPACEGROUP DIAGRAM (see 16.2.9 release, below) -- optional <group> may be a space group name or number -- default is to use the current space group -- example: show spacegroup table show spacegroup table 13 show spacegroup table P2/c new feature: syncCallback for mouse-following -- allows actions to take place set syncmouse sync on set synccallback "jmolscript:color atoms property sz" Modified Paths: -------------- trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/site-resources/jsmol/iucrdemo/code.js Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/site-resources/jsmol/iucrdemo/code.js =================================================================== --- trunk/Jmol/site-resources/jsmol/iucrdemo/code.js 2024-04-28 16:34:10 UTC (rev 22620) +++ trunk/Jmol/site-resources/jsmol/iucrdemo/code.js 2024-04-28 17:20:54 UTC (rev 22621) @@ -157,7 +157,7 @@ || ]] -[[Figure figure17.png +[[Figure figure14.png || <hr> >> @@ -164,13 +164,13 @@ load "=aflowlib/62.77" packed select all; label %[Wyckoff]; set labeloffset 0 0 background white; font labels 20; color labels black - write "figure17.png" as PNGJ + write "figure14.png" as PNGJ << | Creating a model, showing symmetry operations, and moving atoms || ]] -[[Figure figure18.c.png +[[Figure figure15.c2.png || <hr> >> @@ -186,7 +186,7 @@ ]] -[[Figure figure19.b.png +[[Figure figure16.b2.png || <hr> >> @@ -199,7 +199,7 @@ | 3D interactive general position diagram || ]] -[[Figure figure19.c.png +[[Figure figure16.c2.png || <hr> >> @@ -219,7 +219,7 @@ | Illustrating a general position (Wyckoff 4c) orbit || ]] -[[Figure figure19.d.png +[[Figure figure16.d2.png || <hr> >> @@ -242,7 +242,7 @@ | Illustrating the loss of symmetry and the<br>splitting of the general position going<br> from P 21 21 1 (No. 18) to P 1 21 1 (No. 4) || ]] -[[Figure figure19.e.png +[[Figure figure16.e2.png || <hr> >> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-04-28 16:34:16
|
Revision: 22620 http://sourceforge.net/p/jmol/code/22620 Author: hansonr Date: 2024-04-28 16:34:10 +0000 (Sun, 28 Apr 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.11" // (legacy) also 16.2.12 (swingJS) bug fix: various minor issues with DRAW SPACEGROUP ALL NOTE: Introducing here the idea of a "3D interactive space group symmetry model". Something like a space group diagram or a general position diagram, but in 3D. Symmetry elements can be filtered out to reveal patterns in the remaining subset; aspects of group-subgroup relationships can be depicted, either from a purely symmetry-related perspective or in the context of an actual structure or a set of related structures. Specific atom-atom symmetry relationships can be explored. new feature: MODELKIT DRAW SPACEGROUP [name or number] [packed] -- clears the model with ZAP, then creates the space group symmetry model -- draws the full set of symmetry elements -- optionally (if PACKED), adds a nitrogen atom in the default general position -- shortcut for zap; modelkit spacegroup ... ; draw spacegroup ALL; modelkit add N; -- coding example: function showAllSpaceGroups() { for (var i = 1; i <= 230; i++) { modelkit draw spacegroup @i packed; set echo top right; echo @i; refresh; } } showAllSpaceGroups; // note that some cubics take quite a bit of time function makeSpaceGroupMovie() { zap; background white; capture "spaceGroupMovie.gif"; for (var i = 1; i <= 230; i++) { modelkit draw spacegroup @i packed; set echo top right; echo @i; refresh; } capture end; } makeSpaceGroupMovie() new feature: SHOW SPACEGROUP TABLE <group> -- displays space group tables from Bilbao Crystallographic Server the user's browser -- https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-getgen?gnum=110&what=gp&list=Standard%2FDefault+Setting -- adds to SHOW SPACEGROUP DIAGRAM (see 16.2.9 release, below) -- optional <group> may be a space group name or number -- default is to use the current space group -- example: show spacegroup table show spacegroup table 13 show spacegroup table P2/c new feature: syncCallback for mouse-following -- allows actions to take place set syncmouse sync on set synccallback "jmolscript:color atoms property sz" Modified Paths: -------------- trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/build-4-Jmol.jar-and-release.xml trunk/Jmol/j2s/timestamp trunk/Jmol/src/org/jmol/modelkit/ModelKit.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/scriptext/IsoExt.java trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java trunk/Jmol/src/org/jmol/viewer/JC.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/StatusManager.java Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/build-4-Jmol.jar-and-release.xml =================================================================== --- trunk/Jmol/build-4-Jmol.jar-and-release.xml 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/build-4-Jmol.jar-and-release.xml 2024-04-28 16:34:10 UTC (rev 22620) @@ -557,6 +557,9 @@ <tarfileset dir="build/dist/jmol-${version}" mode="755" includes="jmol,jmol.sh" /> + <tarfileset dir="." + includes="j2s*/**,site-resources*/**" /> + </tar> <!-- Copy other files to have a complete distribution --> Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/j2s/timestamp 2024-04-28 16:34:10 UTC (rev 22620) @@ -1 +1 @@ -20240422084657 +20240425232942 Modified: trunk/Jmol/src/org/jmol/modelkit/ModelKit.java =================================================================== --- trunk/Jmol/src/org/jmol/modelkit/ModelKit.java 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/src/org/jmol/modelkit/ModelKit.java 2024-04-28 16:34:10 UTC (rev 22620) @@ -314,6 +314,9 @@ case "": case "sub": case "r": + case "h": + case "!r": + case "!h": break; default: if (transform.indexOf(",") >= 0) { @@ -1273,7 +1276,7 @@ * @param cmd * @return new name or "" or error message */ - public String cmdAssignSpaceGroup(BS bs, String name, Object paramsOrUC, boolean isPacked, String cmd) { + public String cmdAssignSpaceGroup(BS bs, String name, Object paramsOrUC, boolean isPacked, boolean doDraw, String cmd) { SymmetryInterface sym0 = vwr.getCurrentUnitCell(); SymmetryInterface sym = vwr.getOperativeSymmetry(); if (sym0 != null && sym != sym0) @@ -1283,12 +1286,24 @@ if (ret.endsWith("!")) return ret; if (isPacked) { + int n; + if (doDraw) { + n = cmdAssignAddAtoms("N:G", null, null, "packed", cmd); + } else { String transform = ret; BS bsModelAtoms = vwr.getThisModelAtoms(); - int n = cmdAssignSpaceGroupPacked(bsModelAtoms, transform, cmd); + n = cmdAssignSpaceGroupPacked(bsModelAtoms, transform, cmd); + } sb.append("\n").append(GT.i(GT.$("{0} atoms added"), n)); } - return sb.toString(); + String msg = sb.toString(); + boolean isError = msg.endsWith("!"); + if (doDraw && !isError) { + String s = drawSymmetry("sym", false, -1, null, Integer.MAX_VALUE, null, + null, null, 0, -2, 0, null); + appRunScript(s); + } + return msg; } /** @@ -3476,7 +3491,9 @@ int pt = token.lastIndexOf(":"); // could be "154:_2" or "R 3 2 :" or 5:a,b,c boolean haveUnitCell = (sym00 != null); boolean isUnknown = false; - boolean haveTransform = (token.length() == 0 || token.indexOf(',') > 0); + boolean haveTransform = (token.length() == 0 + || token.indexOf(',') > 0 + || "!r!h".indexOf(token) >= 0); // r !r h !h boolean haveJmolSetting = (!haveTransform && pt > 0 && pt < token.length() - 1); boolean isTransformOnly = (haveTransform && pt < 0); @@ -3485,7 +3502,6 @@ M4 trTemp = new M4(); boolean restarted = false; SymmetryInterface sym = vwr.getSymTemp(); - System.out.println("MK " + token + " " + prevNode); if (prevNode == null) { if (!ClegNode.checkSyntax(tokens, sym)) return "invalid CLEG expression!"; @@ -4812,4 +4828,30 @@ return s; } + public String drawSymmetry(String thisId, boolean isSymop, int iatom, String xyz, int iSym, + P3 trans, P3 center, P3 target, int intScale, int nth, + int options, int[] opList) { + + String s = null; + if (options != 0) { + // options is T.offset, and target is an {i j k} offset from cell 555 + Object o = vwr.getSymmetryInfo(iatom, xyz, iSym, trans, center, + target, T.point, null, intScale / 100f, nth, options, opList); + if (o instanceof P3) + target = (P3) o; + else + s = ""; + } + if (thisId == null) + thisId = (isSymop ? "sym" : "sg"); + if (s == null) + s = (String) vwr.getSymmetryInfo(iatom, xyz, iSym, trans, center, + target, T.draw, thisId, intScale / 100, nth, options, opList); + if (s != null) { + s = "draw ID " + (isSymop ? "sg" : "sym") + "* delete;" + s; + s = "draw ID " + thisId + "* delete;" + s; + } + return s; + } + } Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-04-28 16:34:10 UTC (rev 22620) @@ -128,7 +128,7 @@ st[0].value = prepareBinaryOutput((SV) st[0]); return null; case T.assign: - assign(); + assign(false); break; case T.cache: cache(); @@ -4799,6 +4799,7 @@ return msg; } + @SuppressWarnings("unchecked") private void show() throws ScriptException { ScriptEval eval = e; String value = null; @@ -5017,10 +5018,11 @@ case T.spacegroup: String sdiag = eval.optParameterAsString(2); SymmetryInterface sym = vwr.getOperativeSymmetry(); - if (sdiag.toLowerCase().startsWith("diagram")) { + boolean isDiagram = sdiag.toLowerCase().startsWith("diagram"); + if (isDiagram || sdiag.toLowerCase().startsWith("table")) { if (chk) break; - sdiag = PT.trim(sdiag.substring(7).trim(), "\""); + sdiag = PT.trim(sdiag.substring(isDiagram ? 7 : 5).trim(), "\""); if (sdiag.length() == 0) { if (sym == null) { msg = "Include a space group name or number to view its diagram"; @@ -5045,7 +5047,7 @@ } ita = ((Integer) ((Map<String, Object>) info.get("spaceGroupInfo")).get("ita")).intValue(); } - String href = JC.resolveDataBase("imageita", PT.formatS("" + ita, 3, 0, false, true), null); + String href = JC.resolveDataBase(isDiagram ? "itadiagram" : "itatable", PT.formatS("" + ita, 3, 0, false, true), null); msg = href; vwr.showUrl(href); len = slen; @@ -5969,7 +5971,7 @@ } else if (newUC != null) { if (!chk && isModelkit) { if (sym == null) { - vwr.getModelkit(false).cmdAssignSpaceGroup(null, "P1", newUC, false, "unitcell"); + vwr.getModelkit(false).cmdAssignSpaceGroup(null, "P1", newUC, false, false, "unitcell"); } else if (sym.fixUnitCell((float[]) newUC)) { eval.invArgStr( "Unit cell is incompatible with current space group"); @@ -6300,7 +6302,8 @@ case T.moveto: case T.packed: case T.zap: - assign(); + case T.draw: + assign(true); return; case T.mutate: ++e.iToken; @@ -6467,7 +6470,7 @@ * * @throws ScriptException */ - private void assign() throws ScriptException { + private void assign(boolean isModelkit) throws ScriptException { // [modelkit] assign... // modelkit connect /** @@ -6480,8 +6483,21 @@ invArg(); BS bsModelAtoms = vwr.getThisModelAtoms(); int i = ++e.iToken; - int mode = tokAt(i); // ATOMS, BONDS, or CONNECT; defaults to ATOMS + boolean doDraw = false; + int mode = tokAt(i); + if (mode == T.draw) { + // MODELKIT DRAW SPACEGROUP [name or number] + // different from DRAW SPACEGROUP in that it + // does a ZAP and allows for specifying the space grroup + // modelkit draw spacegroup -- this will ZAP + if (tokAt(2) != T.spacegroup) + invArg(); + doDraw = true; + mode = T.zap; + } if (mode == T.zap) { + if (!isModelkit) + invArg(); if (!e.chk) vwr.zap(false, false, false); mode = tokAt(++i); @@ -6488,17 +6504,20 @@ if (mode == T.nada) return; } - int index = -1, index2 = -1; + // mode might be reassigned; these next assignments are just for sanity. boolean isAtom = (mode == T.atoms); boolean isBond = (mode == T.bonds); + boolean isAdd = (mode == T.add); boolean isConnect = (mode == T.connect); boolean isDelete = (mode == T.delete); - boolean isAdd = (mode == T.add); boolean isMove = (mode == T.moveto); boolean isSpacegroup = (mode == T.spacegroup); boolean isPacked = (mode == T.packed); - Object paramsOrUC = null; - P3[] pts = null; + // default is ATOM + if ((isPacked || isSpacegroup) && !isModelkit) { + // only options for ASSIGH are ATOMS, BONDS, ADD, CONNECT, DELETE, MOVE + invArg(); + } if (isAtom || isBond || isConnect || isSpacegroup || isDelete || isMove || isAdd || isPacked) { i++; @@ -6506,6 +6525,8 @@ isAtom = true; mode = T.atoms; } + // initialize some modes + int index = -1, index2 = -1; BS bs = null; if (isBond) { if (tokAt(i) == T.integer) { @@ -6542,7 +6563,7 @@ } } i = ++e.iToken; - } else if (mode == T.packed) { + } else if (isPacked) { // new Jmol 14.32.73 bs = bsModelAtoms; } else if (isAtom && tokAt(i) == T.string || mode == T.add) { @@ -6561,9 +6582,12 @@ } i = ++e.iToken; } + // parse easch mode in full String type = null; P3 pt = null; String wyckoff = null; + Object paramsOrUC = null; + P3[] pts = null; if (isAdd) { if (e.isAtomExpression(i)) { bs = expFor(++e.iToken, bsModelAtoms); @@ -6623,7 +6647,8 @@ invArg(); type = sym.getClegId(); isPacked = true; - } else if (type.indexOf(":") < 0 && type.indexOf(",") > 0 && type.indexOf(">") < 0) { + } else if (type.indexOf(":") < 0 && type.indexOf(">") < 0 && + (type.indexOf(",") > 0 || "rh".indexOf(type) >= 0)) { // allow for MODELKIT SPACEGROUP "a,b,2c" if (sym == null) invArg(); @@ -6642,22 +6667,28 @@ isPacked = true; ++e.iToken; } - } else if (!isConnect) { + } else if (isConnect) { + // could be from assign BOND + if (index2 < 0) { + // NOT assign BOND @3 @4 ... + // assign CONNECT @3 @4 + bs = expFor(i, bsModelAtoms); + index2 = bs.nextSetBit(0); + type = e.optParameterAsString(++e.iToken); + } + } else { + // assign atom ... + // assign delete ... + // more? type = e.optParameterAsString(i); if (isAtom) pt = (++e.iToken < slen ? centerParameter(e.iToken) : null); - } else if (isDelete) { - // N/A - } else if (index2 < 0) { - // assign CONNECT @3 @4 - bs = expFor(i, bsModelAtoms); - index2 = bs.nextSetBit(0); - type = e.optParameterAsString(++e.iToken); } if (chk) return; + // finally, preserve the state and carry out the process vwr.pushState(); switch (mode) { case T.atoms: @@ -6709,7 +6740,7 @@ e.report(GT.i(GT.$("{0} atoms moved"), nm), false); break; case T.spacegroup: - String s = vwr.getModelkit(false).cmdAssignSpaceGroup(bs, type, paramsOrUC, isPacked, e.fullCommand); + String s = vwr.getModelkit(false).cmdAssignSpaceGroup(bs, type, paramsOrUC, isPacked, doDraw, e.fullCommand); boolean isError = s.endsWith("!"); if (isError) e.invArgStr(s); Modified: trunk/Jmol/src/org/jmol/scriptext/IsoExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/IsoExt.java 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/src/org/jmol/scriptext/IsoExt.java 2024-04-28 16:34:10 UTC (rev 22620) @@ -887,25 +887,9 @@ if (bsAtoms == null && vwr.am.cmi >= 0) bsAtoms = vwr.getModelUndeletedAtomsBitSet(vwr.am.cmi); if (bsAtoms != null) { - s = null; - if (options != 0) { - // options is T.offset, and target is an {i j k} offset from cell 555 - Object o = vwr.getSymmetryInfo(iatom, xyz, iSym, trans, center, - target, T.point, null, intScale / 100f, nth, options, opList); - if (o instanceof P3) - target = (P3) o; - else - s = ""; - } - if (thisId == null) - thisId = (isSymop ? "sym" : "sg"); + s = vwr.getModelkit(false).drawSymmetry(thisId, isSymop, iatom, xyz, iSym, trans, center, target, intScale, nth, options, opList); if (s == null) - s = (String) vwr.getSymmetryInfo(iatom, xyz, iSym, trans, center, - target, T.draw, thisId, intScale / 100f, nth, options, opList); - if (s == null) return; - s = "draw ID " + (isSymop ? "sg" : "sym")+ "* delete;" + s; - s = "draw ID " + thisId + "* delete;" + s; if (isSymop && target instanceof Atom && center instanceof Atom) { if (eval.fullCommand.indexOf(JC.SCRIPT_QUIET)>=0) s = PT.rep(s, "print", "#print"); @@ -915,7 +899,8 @@ + "|" + eval.fullCommand) + ";"; } } - eval.runBufferedSafely( + if (s != null) + eval.runBufferedSafely( s.length() > 0 ? s : "draw ID \"" + thisId + "*\" delete", eval.outputBuffer); return; Modified: trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/src/org/jmol/symmetry/SymmetryDesc.java 2024-04-28 16:34:10 UTC (rev 22620) @@ -113,7 +113,7 @@ "_type", "id", "cif2", "xyzCanonical", "xyzNormalized" }; private static final String PLANE_COLOR_MIRROR = "magenta"; - private static final String PLANE_COLOR_A_GLIDE = "[x08CCF9]"; // azure + private static final String PLANE_COLOR_A_GLIDE = "[x4080ff]"; // azure (light blue) private static final String PLANE_COLOR_B_GLIDE = "blue"; private static final String PLANE_COLOR_C_GLIDE = "cyan"; private static final String PLANE_COLOR_D_GLIDE = "grey"; @@ -999,7 +999,7 @@ if (!isSpaceGroup) { if (ang > 180) { - // Mois? OK? -- "(+)" is CCW, (-) is CW + // "(+)" is CCW, (-) is CW ang = 180 - ang; } ptemp.add2(ptr, vtemp); @@ -1157,7 +1157,6 @@ // faint inverted frame if mirror trans is not null opType = "plane"; - P4 p = P4.newPt(plane); if (trans == null) { color = PLANE_COLOR_MIRROR; } else { @@ -1183,8 +1182,6 @@ color = PLANE_COLOR_G_GLIDE; break; } - // offset ever so slightly so that we can show both in #40 - p.w += 0.01d; if (!isSpaceGroup) { drawFrameLine("X", ptref, vt1, 0.15f, ptemp, drawSB, opType, "red"); @@ -1203,21 +1200,25 @@ // returns triangles and lines P3[] points = uc.getCanonicalCopy(margin, true); - Lst<Object> v = modelSet.vwr.getTriangulator().intersectPlane(p, + Lst<Object> v = modelSet.vwr.getTriangulator().intersectPlane(plane, points, 3); if (v != null) { int iCoincident = (isSpaceGroup ? op.iCoincident : 0); planeCenter = new P3(); - for (int i = v.size(); --i >= 0;) { + for (int i = 0, iv = 0, n = v.size(); i < n; i++) { P3[] pts = (P3[]) v.get(i); // these lines provide a rendering when side-on drawSB.append(getDrawID((trans == null ? "mirror_" : glideType + "_g") + "planep" + i)).append(Escape.eP(pts[0])).append(Escape.eP(pts[1])); if (pts.length == 3) { - if (iCoincident == 0 || (i % 2 == 0) != (iCoincident == 1)) { + // 110 has <---d---> double-ended arrow OK this is due to a z+3/4 and a matching z-1/4 which is the same in this case + // 122 has <---d---> same deal + // 166 crossed diag fixed sg183 2/3 -2/3 1/3 sg133 mrror + if (iCoincident == 0 || (iv % 2 == 0) != (iCoincident == 1)) { drawSB.append(Escape.eP(pts[2])); } + iv++; } else { planeCenter.add(pts[0]); planeCenter.add(pts[1]); @@ -1515,13 +1516,14 @@ } private static float fixGlideX(float x) { - switch ((int) Math.round(x * 12.001)) { - case 9: + int n48 = (int) Math.round(x * 48.001); + switch (n48) { + case 36: return -1/4f; - case -9: + case -36: return 1/4f; default: - return x; + return x;//n48/48d; } } Modified: trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/src/org/jmol/symmetry/SymmetryOperation.java 2024-04-28 16:34:10 UTC (rev 22620) @@ -1786,13 +1786,15 @@ */ private static void addCoincidentMap(Map<String, Lst<SymmetryOperation>> mapCoincident, SymmetryOperation op, int opType) { + if (op.isIrrelevant) + return; String s = op.getOpName(OP_MODE_POSITION_ONLY); Lst<SymmetryOperation> l = mapCoincident.get(s); op.iCoincident = 0; + boolean isRotation = (opType == TYPE_SCREW_ROTATION); if (l == null) { mapCoincident.put(s, l = new Lst<SymmetryOperation>()); - } else { - if (opType == TYPE_SCREW_ROTATION) { + } else if (isRotation) { // we are getting rid of 3-screw in favor of 6-screw if (op.opOrder == 6) { for (int i = l.size(); --i >= 0;) { @@ -1811,15 +1813,21 @@ op.iCoincident = 1; } else { SymmetryOperation op0 = l.get(0); - if (op0.iCoincident == 0) { - op.iCoincident = 1; - for (int i = l.size(); --i >= 0;) { - l.get(i).iCoincident = -1; + if (op.opTrans != null && op0.opTrans != null) { + V3 v = V3.newV(op.opTrans); + v.add(op0.opTrans); + if (v.lengthSquared() < 1e-6) { + // space groups 218, 225, 227 will fire this + op.isIrrelevant = true; + return; } - } else { - op.iCoincident = -op0.iCoincident; - } } + if (op0.iCoincident == 0) { + op.iCoincident = 1; + op0.iCoincident = -1; + } else { + op.iCoincident = -op0.iCoincident; + } } l.addLast(op); } @@ -1961,12 +1969,12 @@ case 12: P3 n = P3.newP(ax1); n.normalize(); - // #230 - // making sure here that this is truly a diagonal in the plane, not just - // a glide parallel to a face on a diagonal plane! Mois Aroyo 2018 +//not sure what this was about -- no n-glides in #230 +// // #230 +// // making sure here that this is truly a diagonal in the plane, not just +// // a glide parallel to a face on a diagonal plane! Mois Aroyo 2018 if (approx(n.x + n.y + n.z) == 1) return 'n'; - break; } // 'g' break; @@ -1983,7 +1991,6 @@ return 'g'; } - static void rotateAndTranslatePoint(M4 m, P3 src, int ta, int tb, int tc, P3 dest) { m.rotTrans2(src, dest); dest.add3(ta, tb, tc); Modified: trunk/Jmol/src/org/jmol/viewer/JC.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/JC.java 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/src/org/jmol/viewer/JC.java 2024-04-28 16:34:10 UTC (rev 22620) @@ -47,14 +47,13 @@ public final class JC { public final static int AXIS_A = 6; - public final static String[] axisLabels = { "+X", "+Y", "+Z", null, null, null, - "a", "b", "c", - "X", "Y", "Z", null, null, null, - "X", null, "Z", null, "(Y)", null}; + public final static String[] axisLabels = { "+X", "+Y", "+Z", null, null, + null, "a", "b", "c", "X", "Y", "Z", null, null, null, "X", null, "Z", + null, "(Y)", null }; - public final static String[] axesTypes = {"a", "b", "c", "x", "y", "z"}; + public final static String[] axesTypes = { "a", "b", "c", "x", "y", "z" }; - public static final String NBO_TYPES = ";" + "AO;;;;" // 31 + public static final String NBO_TYPES = ";" + "AO;;;;" // 31 + "PNAO;;" // 32 + "NAO;;;" // 33 + "PNHO;;" // 34 @@ -195,14 +194,14 @@ public static final String defaultMacroDirectory = "https://chemapps.stolaf.edu/jmol/macros"; private final static String[] databaseArray = { - // still http: - "imageita", + "itatable", + "https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-getgen?gnum=$FILE&what=gp&list=Standard%2FDefault+Setting", + "itadiagram", "https://onlinelibrary.wiley.com/iucr/itc/Ac/ch2o3v0001/sgtable2o3o%FILE", "aflowbin", "http://aflowlib.mems.duke.edu/users/jmolers/binary_new/%FILE.aflow_binary", - "aflowlib", - "https://www.aflowlib.org/prototype-encyclopedia/%FILE/findsym.cif", // updated 2024.04.16 - "aflowpro","$aflowlib", + "aflowlib", "https://aflow.org/p/%FILE.cif", // updated 2024.04.22 + "aflowpro", "$aflowlib", // _#DOCACHE_ flag indicates that the loaded file should be saved in any state in full // ' at start indicates a Jmol script evaluation "ams", @@ -226,39 +225,43 @@ "https://www.ebi.ac.uk/chebi/saveStructure.do?defaultImage=true&chebiId=%file%2D%", "ligand", "https://files.rcsb.org/ligands/download/%FILE.cif", "mp", "https://www.materialsproject.org/materials/mp-%FILE/cif#_DOCACHE_", // e.g. https://materialsproject.org/rest/v1/materials/mp-24972/cif - "nci", "https://cactus.nci.nih.gov/chemical/structure/", - "pdb", "https://files.rcsb.org/download/%FILE.pdb", // new Jmol 14.4.4 3/2016 + "nci", "https://cactus.nci.nih.gov/chemical/structure/", "pdb", + "https://files.rcsb.org/download/%FILE.pdb", // new Jmol 14.4.4 3/2016 "pdb0", "https://files.rcsb.org/download/%FILE.pdb", // used in JSmol "pdbe", "https://www.ebi.ac.uk/pdbe/entry-files/download/%FILE.cif", "pdbe2", "https://www.ebi.ac.uk/pdbe/static/entry/%FILE_updated.cif", - "pubchem", "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/%FILE/SDF?record_type=3d", - "map", "https://www.ebi.ac.uk/pdbe/api/%TYPE/%FILE?pretty=false&metadata=true", + "pubchem", + "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/%FILE/SDF?record_type=3d", + "map", + "https://www.ebi.ac.uk/pdbe/api/%TYPE/%FILE?pretty=false&metadata=true", "pdbemap", "https://www.ebi.ac.uk/pdbe/coordinates/files/%file.ccp4", - "pdbemapdiff", "https://www.ebi.ac.uk/pdbe/coordinates/files/%file_diff.ccp4", - "pdbemapserver", "https://www.ebi.ac.uk/pdbe/densities/x-ray/%file/box/0,0,0/0,0,0?detail=6&space=cartesian&encoding=bcif", - "pdbemapdiffserver", "https://www.ebi.ac.uk/pdbe/densities/x-ray/%file/box/0,0,0/0,0,0?detail=6&space=cartesian&encoding=bcif&diff=1", // last bit is just mine + "pdbemapdiff", + "https://www.ebi.ac.uk/pdbe/coordinates/files/%file_diff.ccp4", + "pdbemapserver", + "https://www.ebi.ac.uk/pdbe/densities/x-ray/%file/box/0,0,0/0,0,0?detail=6&space=cartesian&encoding=bcif", + "pdbemapdiffserver", + "https://www.ebi.ac.uk/pdbe/densities/x-ray/%file/box/0,0,0/0,0,0?detail=6&space=cartesian&encoding=bcif&diff=1", // last bit is just mine //"emdbmap", "https://ftp.ebi.ac.uk/pub/databases/emdb/structures/EMD-%file/map/emd_%file.map.gz", // https did not work in Java due to certificate issues // was considerably slower - "emdbmap", "https://www.ebi.ac.uk/pdbe/densities/emd/emd-%file/cell?detail=6&space=cartesian&encoding=bcif", - "emdbquery", "https://www.ebi.ac.uk/emdb/api/search/fitted_pdbs:%file?fl=emdb_id,map_contour_level_value&wt=csv", // to get the EMDB id from the PDB id - "emdbmapserver", "https://www.ebi.ac.uk/pdbe/densities/emd/emd-%file/box/0,0,0/0,0,0?detail=6&space=cartesian&encoding=bcif", - "xxxresolverResolver", "https://chemapps.stolaf.edu/resolver", - "smiles2d", "https://cirx.chemicalcreatures.com/chemical/structure/%FILE/file?format=sdf&get3d=false", - "smiles3d", "https://cirx.chemicalcreatures.com/chemical/structure/%FILE/file?format=sdf&get3d=true", - }; + "emdbmap", + "https://www.ebi.ac.uk/pdbe/densities/emd/emd-%file/cell?detail=6&space=cartesian&encoding=bcif", + "emdbquery", + "https://www.ebi.ac.uk/emdb/api/search/fitted_pdbs:%file?fl=emdb_id,map_contour_level_value&wt=csv", // to get the EMDB id from the PDB id + "emdbmapserver", + "https://www.ebi.ac.uk/pdbe/densities/emd/emd-%file/box/0,0,0/0,0,0?detail=6&space=cartesian&encoding=bcif", + "xxxresolverResolver", "https://chemapps.stolaf.edu/resolver", "smiles2d", + "https://cirx.chemicalcreatures.com/chemical/structure/%FILE/file?format=sdf&get3d=false", + "smiles3d", + "https://cirx.chemicalcreatures.com/chemical/structure/%FILE/file?format=sdf&get3d=true", }; - private final static String defaultOptimadeFieldsStr = - ",chemical_formula_descriptive" - + ",dimension_types" - + ",lattice_vectors" - + ",cartesian_site_positions" - + ",species_at_sites" - + ",species,"; - + private final static String defaultOptimadeFieldsStr = ",chemical_formula_descriptive" + + ",dimension_types" + ",lattice_vectors" + ",cartesian_site_positions" + + ",species_at_sites" + ",species,"; + /** - * Get all necessary response fields if an optimade call. - * Note that the only conditions we have here is that this is http - * and "optimade" is in the URL. Obviously not exactly correct. + * Get all necessary response fields if an optimade call. Note that the only + * conditions we have here is that this is http and "optimade" is in the URL. + * Obviously not exactly correct. * * @param url * @return optimade query @@ -265,14 +268,14 @@ */ static String fixOptimadeCall(String url) { int pt = url.indexOf("response_fields=") + 16; - String a = defaultOptimadeFieldsStr; + String a = defaultOptimadeFieldsStr; if (pt < 16) { int ptQ = url.indexOf("?"); url += (ptQ < 0 ? "?" : "&") + "response_fields=" + a.substring(1, a.length() - 1); } else { - String fields = "," - + url.substring(pt, (url + "&").indexOf('&', pt)) + ","; + String fields = "," + url.substring(pt, (url + "&").indexOf('&', pt)) + + ","; int flen = fields.length(); for (int i = 0, b = 0; i >= 0; i = b) { b = a.indexOf(',', i + 1); @@ -284,21 +287,21 @@ } } url = url.substring(0, pt) + fields.substring(1, fields.length() - 1) - + url.substring(pt + flen - 2); + + url.substring(pt + flen - 2); } return url; } -// static { -//System.out.println(fixOptimadeCall("test?filter&response_fields=lkadfs")); -//System.out.println(fixOptimadeCall("test?response_fields=species")); -//System.out.println(fixOptimadeCall("test?response_fields=lkadfs,species")); -//System.out.println(fixOptimadeCall("test?response_fields=lkadfs,species_at_sites,species&more")); -//System.out.println(fixOptimadeCall("test?filter&response_fields=species,lkadfs&more")); -//System.out.println(fixOptimadeCall("test?response_fields=species,lkadfs&more")); -// -// -// } + // static { + //System.out.println(fixOptimadeCall("test?filter&response_fields=lkadfs")); + //System.out.println(fixOptimadeCall("test?response_fields=species")); + //System.out.println(fixOptimadeCall("test?response_fields=lkadfs,species")); + //System.out.println(fixOptimadeCall("test?response_fields=lkadfs,species_at_sites,species&more")); + //System.out.println(fixOptimadeCall("test?filter&response_fields=species,lkadfs&more")); + //System.out.println(fixOptimadeCall("test?response_fields=species,lkadfs&more")); + // + // + // } final static String legacyResolver = "cactus.nci.nih.gov/chemical/structure"; @@ -309,13 +312,14 @@ String target = databaseArray[i + 1]; if (target.charAt(0) == '$') { // alias - target = databases.get(target.substring(1)); + target = databases.get(target.substring(1)); } databases.put(databaseArray[i].toLowerCase(), target); } } - public static String resolveDataBase(String database, String id, String format) { + public static String resolveDataBase(String database, String id, + String format) { if (format == null) { if ((format = databases.get(database.toLowerCase())) == null) return null; @@ -369,8 +373,8 @@ || name.indexOf("http://cactus") == 0 || name.indexOf("http://www.materialsproject") == 0 ? "https://" + name.substring(7) - : name.indexOf("optimade") > 0 ? JC.fixOptimadeCall(name) - : name); + : name.indexOf("optimade") > 0 ? JC.fixOptimadeCall(name) + : name); if (newname != name) Logger.info("JC.fixProtocol " + name + " --> " + newname); return newname; @@ -528,9 +532,11 @@ public static final String SCRIPT_START = SCRIPT_EXT + "SCRIPT_START"; public static final String SCRIPT_NOENDCHECK = SCRIPT_EXT + "NOENDCHECK"; public final static String SCRIPT_ISEDITOR = SCRIPT_EXT + " ISEDITOR"; - public final static String SCRIPT_EDITOR_IGNORE = SCRIPT_EXT + " EDITOR_IGNORE ##"; - public final static String SCRIPT_CONSOLE = SCRIPT_GUI + SCRIPT_EDITOR_IGNORE + SCRIPT_GUI; - + public final static String SCRIPT_EDITOR_IGNORE = SCRIPT_EXT + + " EDITOR_IGNORE ##"; + public final static String SCRIPT_CONSOLE = SCRIPT_GUI + SCRIPT_EDITOR_IGNORE + + SCRIPT_GUI; + public final static String REPAINT_IGNORE = SCRIPT_EXT + " REPAINT_IGNORE ##"; public static final int SG_AS_STRING = 1; @@ -537,8 +543,7 @@ public static final int SG_IS_ASSIGN = 2; public static final int SG_FROM_SCRATCH = 4; public static final int SG_CHECK_SUPERCELL = 8; - - + public final static String LOAD_ATOM_DATA_TYPES = ";xyz;vxyz;vibration;temperature;occupancy;partialcharge;"; public final static double radiansPerDegree = Math.PI / 180; @@ -610,7 +615,7 @@ public final static int FORMAL_CHARGE_COLIX_RED = Elements.elementSymbols.length + altArgbsCpk.length; - + // hmmm ... what is shapely backbone? seems interesting //public final static int argbShapelyBackbone = 0xFFB8B8B8; //public final static int argbShapelySpecial = 0xFF5E005E; @@ -933,8 +938,7 @@ //periodic table "@nonmetal _H,_He,_B,_C,_N,_O,_F,_Ne,_Si,_P,_S,_Cl,_Ar,_As,_Se,_Br,_Kr,_Te,_I,_Xe,_At,_Rn", - "@metal !nonmetal && !_Xx", - "@alkaliMetal _Li,_Na,_K,_Rb,_Cs,_Fr", + "@metal !nonmetal && !_Xx", "@alkaliMetal _Li,_Na,_K,_Rb,_Cs,_Fr", "@alkalineEarth _Be,_Mg,_Ca,_Sr,_Ba,_Ra", "@nobleGas _He,_Ne,_Ar,_Kr,_Xe,_Rn", "@metalloid _B,_Si,_Ge,_As,_Sb,_Te", // added La, Ac as per Frank Weinhold - these two are not f-block @@ -949,13 +953,14 @@ }; /** - * specifically for ECHO and DRAW to have these specific for a given model - * and only appearing when there is only one model showing (see MODELKIT SET KEY ON) + * specifically for ECHO and DRAW to have these specific for a given model and + * only appearing when there is only one model showing (see MODELKIT SET KEY + * ON) */ public static final String THIS_MODEL_ONLY = "_!_"; - public static final String MODELKIT_ELEMENT_KEY_ID = THIS_MODEL_ONLY + "elkey_"; + public static final String MODELKIT_ELEMENT_KEY_ID = THIS_MODEL_ONLY + + "elkey_"; - public static final String MODELKIT_SET_ELEMENT_KEYS = "setelementkeys"; public static final String MODELKIT_KEY = "key"; public static final String MODELKIT_ELEMENT_KEY = "elementkey"; @@ -969,7 +974,7 @@ public static final String MODELKIT_ROTATE_BOND_ATOM_INDEX = "rotateBond"; public static final String MODELKIT_BRANCH_ATOM_PICKED = "branchatomclicked"; public static final String MODELKIT_BRANCH_ATOM_DRAGGED = "branchatomdragged"; - + public static final String MODELKIT_CENTER = "center"; public static final String MODELKIT_HIDEMENU = "hidemenu"; public static final String MODELKIT_CONSTRAINT = "constraint"; @@ -1317,7 +1322,7 @@ public final static int LABEL_ZPOS_GROUP = 0x010; public final static int LABEL_ZPOS_FRONT = 0x020; - public final static int LABEL_EXPLICIT = 0x040; + public final static int LABEL_EXPLICIT = 0x040; private final static int LABEL_CENTERED = 0x100; @@ -1495,7 +1500,7 @@ public static final int SMILES_GEN_ALL_COMPONENTS = 0x00008000; // SmilesExt -> generator public static final int SMILES_GEN_POLYHEDRAL = 0x00010000; // polyhedron -> generator public static final int SMILES_GEN_ATOM_COMMENT = 0x00020000; // polyhedron,Viewer -> generator - public static final int SMILES_GEN_NO_BRANCHES = 0x00040000; // MathExt -> Generator + public static final int SMILES_GEN_NO_BRANCHES = 0x00040000; // MathExt -> Generator public static final int SMILES_GEN_BIO = 0x00100000; // MathExt -> generator public static final int SMILES_GEN_BIO_ALLOW_UNMATCHED_RINGS = 0x00300000; // MathExt -> generator @@ -1540,7 +1545,7 @@ public final static int UNITID_TRIM = 16; public static final String DEFAULT_DRAG_DROP_SCRIPT = "zap; load SYNC \"%FILE\";if (%ALLOWCARTOONS && _loadScript == '' && defaultLoadScript == '' && _filetype == 'Pdb') {if ({(protein or nucleic)&*/1.1} && {*/1.1}[1].groupindex != {*/1.1}[0].groupindex){select protein or nucleic;cartoons only;}if ({visible && cartoons > 0}){color structure}else{wireframe -0.1};if (!{visible}){spacefill 23%};select *}"; - public static final float UC_TOLERANCE2 = 0.0014f*0.0014f; // always use check for LT this, not LTE + public static final float UC_TOLERANCE2 = 0.0014f * 0.0014f; // always use check for LT this, not LTE /** * Get a unitID type @@ -1565,18 +1570,11 @@ } public final static String[] globalBooleans = { - "someModelsHaveFractionalCoordinates", - "someModelsHaveSymmetry", - "someModelsHaveUnitcells", - "someModelsHaveCONECT", - "isPDB", - "someModelsHaveDomains", - "someModelsHaveValidations", - "isSupercell", - "someModelsHaveAromaticBonds", - "someModelsAreModulated" - }; - + "someModelsHaveFractionalCoordinates", "someModelsHaveSymmetry", + "someModelsHaveUnitcells", "someModelsHaveCONECT", "isPDB", + "someModelsHaveDomains", "someModelsHaveValidations", "isSupercell", + "someModelsHaveAromaticBonds", "someModelsAreModulated" }; + public final static int GLOBAL_FRACTCOORD = 0; public final static int GLOBAL_SYMMETRY = 1; public final static int GLOBAL_UNITCELLS = 2; @@ -1592,9 +1590,9 @@ return globalBooleans[g]; } - public final static float FLOAT_MIN_SAFE = 2E-45f; + public final static float FLOAT_MIN_SAFE = 2E-45f; // Float.MIN_VALUE (1.45E-45) is not reliable with JavaScript because of the float/double difference there - + public static final String INFO_SPACE_GROUP = "spaceGroup"; public static final String INFO_SPACE_GROUP_ASSIGNED = "spaceGroupAssigned"; public static final String INFO_SPACE_GROUP_INFO = "spaceGroupInfo"; @@ -1606,15 +1604,16 @@ public static final String INFO_UNIT_CELL_OFFSET = "unitCellOffset"; public static final String INFO_UNIT_CELL_CONVENTIONAL = "unitcell_conventional"; /** - * used to set atom symmetry 555 556 etc. + * used to set atom symmetry 555 556 etc. */ public static final String INFO_UNIT_CELL_RANGE = "ML_unitCellRange"; -// public static final String INFO_UNIT_CELL_TRANSLATIONS = "unitCellTranslations"; + // public static final String INFO_UNIT_CELL_TRANSLATIONS = "unitCellTranslations"; public static final String INFO_UNIT_CELLS = "unitCells"; public static final String INFO_UNIT_CELL = "unitcell"; - + /** - * When UNITCELL NONE is given, clear out all space group and unit cell keys from model info. + * When UNITCELL NONE is given, clear out all space group and unit cell keys + * from model info. * * @param key * @return true to delete @@ -1622,30 +1621,30 @@ public static boolean isSpaceGroupInfoKey(String key) { return (key.indexOf("nitCell") >= 0 || key.equals("coordinatesAreFractional") - || key.startsWith("spaceGroup") - || key.indexOf("ymmet") >= 0 - || key.startsWith("lattice") - || key.startsWith("intlTable")); + || key.startsWith("spaceGroup") || key.indexOf("ymmet") >= 0 + || key.startsWith("lattice") || key.startsWith("intlTable")); } - + public static final String PROP_DELETE_MODEL_ATOMS = "deleteModelAtoms"; public static final String PROP_ATOMS_DELETED = "atomsDeleted"; public static final String PROP_ATOMS_MOVED = "atomsMoved"; + public static String getMenuScript(String type) { - if (type == "openPDB") { - return "var x__id__ = _modelTitle; if (x__id__.length != 4) { x__id__ = '1crn'};x__id__ = prompt('" - + GT.$("Enter a four-digit PDB model ID or \"=\" and a three-digit ligand ID") - + "',x__id__);if (!x__id__) { quit }; load @{'=' + x__id__}"; + if (type == "openPDB") { + return "var x__id__ = _modelTitle; if (x__id__.length != 4) { x__id__ = '1crn'};x__id__ = prompt('" + + GT.$( + "Enter a four-digit PDB model ID or \"=\" and a three-digit ligand ID") + + "',x__id__);if (!x__id__) { quit }; load @{'=' + x__id__}"; - } - if (type == "openMOL") { - return "var x__id__ = _smilesString; if (!x__id__) { x__id__ = 'tylenol'};x__id__ = prompt('" - + GT.$("Enter the name or identifier (SMILES, InChI, CAS) of a compound. Preface with \":\" to load from PubChem; otherwise Jmol will use the NCI/NIH Resolver.") - + "',x__id__);if (!x__id__) { quit }; load @{(x__id__[1]==':' ? x__id__ : '$' + x__id__)}"; + } + if (type == "openMOL") { + return "var x__id__ = _smilesString; if (!x__id__) { x__id__ = 'tylenol'};x__id__ = prompt('" + + GT.$( + "Enter the name or identifier (SMILES, InChI, CAS) of a compound. Preface with \":\" to load from PubChem; otherwise Jmol will use the NCI/NIH Resolver.") + + "',x__id__);if (!x__id__) { quit }; load @{(x__id__[1]==':' ? x__id__ : '$' + x__id__)}"; - } - return null; } + return null; + } - } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-04-28 16:34:10 UTC (rev 22620) @@ -55,8 +55,79 @@ # TODO: allow FIXED to work with MODELKIT MINIMIZE -Jmol.___JmolVersion="16.2.9" // (legacy) also 16.2.10 (swingJS) +Jmol.___JmolVersion="16.2.11" // (legacy) also 16.2.12 (swingJS) +bug fix: various minor issues with DRAW SPACEGROUP ALL + +NOTE: Introducing here the idea of a "3D interactive space group symmetry model". + Something like a space group diagram or a general position + diagram, but in 3D. Symmetry elements can be filtered out + to reveal patterns in the remaining subset; aspects of + group-subgroup relationships can be depicted, either from a + purely symmetry-related perspective or in the context of an + actual structure or a set of related structures. Specific atom-atom + symmetry relationships can be explored. + +new feature: MODELKIT DRAW SPACEGROUP [name or number] [packed] + -- clears the model with ZAP, then creates the space group symmetry model + -- draws the full set of symmetry elements + -- optionally (if PACKED), adds a nitrogen atom in the default general position + -- shortcut for + + zap; + modelkit spacegroup ... ; + draw spacegroup ALL; + modelkit add N; + + -- coding example: + + function showAllSpaceGroups() { + for (var i = 1; i <= 230; i++) { + modelkit draw spacegroup @i packed; + set echo top right; + echo @i; + refresh; + } + } + + showAllSpaceGroups; // note that some cubics take quite a bit of time + + function makeSpaceGroupMovie() { + \xA0 \xA0 zap; + \xA0 \xA0 background white; + \xA0 \xA0 capture "spaceGroupMovie.gif"; + \xA0 \xA0 for (var i = 1; i <= 230; i++) { + \xA0 \xA0 \xA0 \xA0 \xA0modelkit draw spacegroup @i packed; + \xA0 \xA0 \xA0 \xA0 \xA0set echo top right; + \xA0 \xA0 \xA0 \xA0 \xA0echo @i; + \xA0 \xA0 \xA0 \xA0 \xA0refresh; + \xA0 \xA0 } + \xA0 \xA0 capture end; + } + + makeSpaceGroupMovie() + + +new feature: SHOW SPACEGROUP TABLE <group> + -- displays space group tables from Bilbao Crystallographic Server the user's browser + -- https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-getgen?gnum=110&what=gp&list=Standard%2FDefault+Setting + -- adds to SHOW SPACEGROUP DIAGRAM (see 16.2.9 release, below) + -- optional <group> may be a space group name or number + -- default is to use the current space group + -- example: + + show spacegroup table + show spacegroup table 13 + show spacegroup table P2/c + +new feature: syncCallback for mouse-following + -- allows actions to take place + set syncmouse + sync on + set synccallback "jmolscript:color atoms property sz" + +JmolVersion="16.2.9" // (legacy) also 16.2.10 (swingJS) + bug fix: fixes a miscalculation of glide 'g' vs. 'n' in SHOW SYMOP and in colors for DRAW SPACEGROUP bug fix: DRAW SPACEGROUP failing after SHOW SYMOP @@ -120,6 +191,7 @@ -- note that a six-fold axis will contain three arrows: 2-fold, 3-fold, and 6-fold -- likewise for 6-bar/3-fold and 4-fold-2-fold, 4-bar/2-fold + new feature: MODELKIT ZAP... -- same as ZAP; MODELKIT ... Modified: trunk/Jmol/src/org/jmol/viewer/StatusManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2024-04-26 04:00:39 UTC (rev 22619) +++ trunk/Jmol/src/org/jmol/viewer/StatusManager.java 2024-04-28 16:34:10 UTC (rev 22620) @@ -665,10 +665,16 @@ synchronized void setSync(String mouseCommand) { if (syncingMouse) { - if (mouseCommand != null) + if (mouseCommand != null) { + String sJmol = getJmolScriptCallback(CBK.SYNC); + if (sJmol != null) + fireJmolScriptCallback(false, CBK.SYNC, + new Object[] { sJmol, mouseCommand, "sending mouseSync" }, true); syncSend(mouseCommand, "*", 0); + } } else if (!syncingScripts) - syncSend("!" + vwr.tm.getMoveToText(minSyncRepeatMs / 1000f, false), "*", 0); + syncSend("!" + vwr.tm.getMoveToText(minSyncRepeatMs / 1000f, false), "*", + 0); } private boolean drivingSync; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-04-17 19:04:25
|
Revision: 22614 http://sourceforge.net/p/jmol/code/22614 Author: hansonr Date: 2024-04-17 19:04:22 +0000 (Wed, 17 Apr 2024) Log Message: ----------- Jmol.___JmolVersion="16.2.5" // (legacy) also 16.2.6 (swingJS) bug fix: Some SHELX files not reading -- not clear why some and not others. But it is fixed. bug fix: "standard" PNG and JPG files created by Jmol not readable back into Jmol -- embedded state scripts were not being checked -- note: Jmol automatically saves its state within standard JPG and PNG files unlike PNGJ files, where the state and all necessary files are saved Generally not recommended, since any loaded files still must be retrieved again. But with MODELKIT SPACEGROUP, there is no model file to read; so these standard PNG and JPG files should be readable. bug fix: JPG file drop improperly resolved as MMTF -- JPG should be read for its embedded script file, not as MMTF bug fix: load =aflowlib/62.3 spacegroup "x,y,z;x,-y,z" does not set display name correctly in upper left information bug fix: unit cell not read from state after use of MODELKIT SPACEGROUP specifcally when atoms are present bug fix: x = spacegroup("Pnma") failing -- specifically for Hermann-Mauguin names, Hall names, and AFLOW/n.m bug fix: AFLOWLIB database changed -- now "https://www.aflowlib.org/prototype-encyclopedia/%AFLOWID%/findsym.cif" -- no problem for saved PNGJ files -- load =AFLOWLIB/n.m requires this fix new feature: load =aflowlib/<AFLOWID> -- allows reading of specific AFLOW Encyclopedia of Crystallographic Prototypes by ID -- for example: load =aflowlib/A3BC_tP5_99_ac_b_a-002 packed new feature: x = spacegroup("AFLOW/A3B14C2D3*") -- note that the ID starts with the empirical cell formula ending with "_" -- returns an array of "=aflowlib/n.m<tab>AFLOWID" entries which can be split to give either the load string or the AFLOW iD -- for example: $ print spacegroup("AFLOW/A7B2_*") =aflowlib/63.34 A7B2_oC36_63_cgh_f-001 =aflowlib/164.13 A7B2_hP9_164_ac2d_d-001 =aflowlib/164.14 A7B2_hP9_164_ai_d-001 =aflowlib/166.44 A7B2_hR18_166_a2cdh_2c-001 =aflowlib/227.18 A7B2_cF144_227_2ef_e-001 $ print spacegroup("AFLOW/A7B2_*").split("\t",true).col(1) =aflowlib/63.34 =aflowlib/164.13 =aflowlib/164.14 =aflowlib/166.44 =aflowlib/227.18 $ print spacegroup("AFLOW/A7B2_*").split("\t",true).col(2) A7B2_oC36_63_cgh_f-001 A7B2_hP9_164_ac2d_d-001 A7B2_hP9_164_ai_d-001 A7B2_hR18_166_a2cdh_2c-001 A7B2_cF144_227_2ef_e-001 -- check of empirical cell formula: $ load =aflowlib/63.34 packed $ print {cell=555}.find("CELLFORMULA", true) Ca 2 Ag 7 $ print {cell=555}.find("CELLFORMULA") Ca 8 Ag 28 new feature: x = spacegroup("AFLOW/all") -- returns array of arrays of information maintained in org/jmol/symmetry/sg/json/aflow_structures.json -- note that whenever there is an AFLOW Encyclopedia update, this information could go stale and "=aflow/3.10" might change. However, it is unlikely that the AFLOW ID will change. new feature: load ... centroid 0.5 -- expands the centroid limit in fractions of a unit direction -- same as load ... packed 0.5 centroid, but more intuitive Modified Paths: -------------- trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/j2s/timestamp trunk/Jmol/site-resources/jsmol/iucrdemo/code.js trunk/Jmol/site-resources/jsmol/iucrdemo/index.htm trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java Added Paths: ----------- trunk/Jmol/site-resources/jsmol/iucrdemo/figure17.png Removed Paths: ------------- trunk/Jmol/site-resources/jsmol/.htaccess trunk/Jmol/site-resources/jsmol/iucrdemo/sg10.c.png trunk/Jmol/site-resources/jsmol/iucrdemo/sg18-symops.png trunk/Jmol/site-resources/jsmol/iucrdemo/super-62.all.png Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2024-04-17 02:43:34 UTC (rev 22613) +++ trunk/Jmol/j2s/timestamp 2024-04-17 19:04:22 UTC (rev 22614) @@ -1 +1 @@ -20240414232459 +20240417111032 Deleted: trunk/Jmol/site-resources/jsmol/.htaccess =================================================================== --- trunk/Jmol/site-resources/jsmol/.htaccess 2024-04-17 02:43:34 UTC (rev 22613) +++ trunk/Jmol/site-resources/jsmol/.htaccess 2024-04-17 19:04:22 UTC (rev 22614) @@ -1 +0,0 @@ -Header set Access-Control-Allow-Origin "*" \ No newline at end of file Modified: trunk/Jmol/site-resources/jsmol/iucrdemo/code.js =================================================================== --- trunk/Jmol/site-resources/jsmol/iucrdemo/code.js 2024-04-17 02:43:34 UTC (rev 22613) +++ trunk/Jmol/site-resources/jsmol/iucrdemo/code.js 2024-04-17 19:04:22 UTC (rev 22614) @@ -22,12 +22,15 @@ << ->> load =ams/quartz packed; prompt( getProperty("fileInfo.models").select("(_journal_year)").pivot.format("JSON")); << +>> load =ams/quartz packed; prompt( getProperty("fileInfo.models").select("(_journal_year)").pivot.format("json") ); << || AFLOW | >> - load =aflowlib/62.77 packed + load =aflowlib/62.51 packed + select all; label %[Wyckoff]; set labeloffset 0 0 + background white; font labels 20; color labels black + write aflow-62.51.png as PNGJ << || ]] @@ -53,7 +56,7 @@ | >> load =aflowlib/12.5 SUPERCELL {2 2 1} - Load =ams/quartz 1 supercell "2a, a + 2b, c" + load =ams/quartz 1 supercell "2a, a + 2b, c" << || Fill an x by x by x Angstrom block of space with atoms, regardless of the unit cell @@ -127,7 +130,7 @@ modelkit delete {site=2} modelkit add N wyckoff G modelkit add O {1/4,1/2,1/4} packed - modelkit delete {fz > 0.9} + modelkit delete {fy > 0.9} << | Delete the specified atom or set of atoms and all of their equivalent atoms. @@ -144,7 +147,8 @@ >> draw symop 3 draw symop @2 @4 - draw symop @3 @5 + set picking dragatom # prompt "Go ahead and drag one of the atoms." + draw symop @3 @1 draw symop {0 1/4 0} {0 3/4 0} set picking symop #; prompt "Now pick pairs of atoms." << @@ -157,16 +161,15 @@ || <hr> >> - load "AFLOW/62.77" packed + load "=aflowlib/62.77" packed select all; label %[Wyckoff]; set labeloffset 0 0 background white; font labels 20; color labels black - write figure17.png as PNGJ + write "figure17.png" as PNGJ << | Creating a model, showing symmetry operations, and moving atoms || ]] - [[Figure figure18.c.png || <hr> @@ -236,7 +239,7 @@ draw s41 symop @4 @1 set frank off;set showunitcellinfo false << -| Illustrating the loss of symmetry <br>and the splitting of the general position <br>going from P 21 21 1 (No. 18) to P 1 21 1 (No. 4) +| Illustrating the loss of symmetry and the<br>splitting of the general position going<br> from P 21 21 1 (No. 18) to P 1 21 1 (No. 4) || ]] [[Figure figure19.e.png @@ -285,19 +288,28 @@ >> load =aflowlib/20.1 packed color property site - set picking dragAtom + set picking dragatom # prompt "Now drag various atoms. Notice that some of them are contrained. How are they constrained?" + display none draw uc1 unitcell color red draw sg1 spacegroup all - prompt spacegroup(20, "subgroups") - prompt spacegroup(20,4, "subgroups") modelkit spacegroup "20>sub>4" packed draw uc2 unitcell draw sg2 spacegroup all color property site + draw sg1* off + draw sg1* on + draw sg2* off + draw sg2* on + display all + set picking dragatom # prompt "Now drag an atom. Notice that there is a lot more freedom now that some symmetry has been lost. Which symmetry has been lost? How did that result in more freedom for certain atoms?" << | A comparison of C 2 2 21 (No. 20) <br>and its maximal subgroup P 21 (No. 4) - +<br><br> +>> + prompt spacegroup(20, "subgroups") + prompt spacegroup(20,4, "subgroups") +<< ]] @@ -341,7 +353,7 @@ | >> load =aflowlib/220.3 packed; connect {_Cu} {_Cu} none - prompt {_Cu}.wyckoffm.pivot.format("json") + prompt {_Cu}.wyckoffm.pivot .format("JSON") color property site << @@ -429,6 +441,7 @@ var ret = a[0]; for (var j = 1; j < a.length; j++) { var lines = a[j].split('\n'); + var isList = false; for (var i = 0; i < lines.length; i++) { var cmd = lines[i].trim(); if (!cmd) continue; @@ -436,10 +449,22 @@ var text = cmd.split("#")[0]; cmd = cmd.replace("#",";"); var s = Jmol.jmolLink("jmolApplet0",cmd,text); - if (isLoad) { s = "<b>" + s + "</b>" } + if (isLoad) { + if (isList) { + ret += "</ul>"; + } + isList = true; + s = "<b>" + s + "</b><ul>"; + } else if (isList) { + s = "<li>" + s + "</li>"; + } ret += s; - ret += "<br>"; + ret += (isList ? "": "<br>"); } + if (isList) { + ret += "</ul>"; + isList = false; + } ret += a[++j]; } return ret; Added: trunk/Jmol/site-resources/jsmol/iucrdemo/figure17.png =================================================================== (Binary files differ) Index: trunk/Jmol/site-resources/jsmol/iucrdemo/figure17.png =================================================================== --- trunk/Jmol/site-resources/jsmol/iucrdemo/figure17.png 2024-04-17 02:43:34 UTC (rev 22613) +++ trunk/Jmol/site-resources/jsmol/iucrdemo/figure17.png 2024-04-17 19:04:22 UTC (rev 22614) Property changes on: trunk/Jmol/site-resources/jsmol/iucrdemo/figure17.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Modified: trunk/Jmol/site-resources/jsmol/iucrdemo/index.htm =================================================================== --- trunk/Jmol/site-resources/jsmol/iucrdemo/index.htm 2024-04-17 02:43:34 UTC (rev 22613) +++ trunk/Jmol/site-resources/jsmol/iucrdemo/index.htm 2024-04-17 19:04:22 UTC (rev 22614) @@ -36,8 +36,8 @@ } var Info = { - width : 420, - height : 300, + width : 600, + height : 600, debug : false, color : "0xFFFFFF", addSelectionOptions : true, @@ -63,7 +63,7 @@ </script> </head> <body> - <table width=1000 cellpadding=10> + <table width=1100 cellpadding=10> <tr> <td colspan=2 style="font-size: 12pt"><b><a href="http://jsmol.sourceforge.net">JSmol</a> is an @@ -150,12 +150,12 @@ href="javascript:Jmol.script(jmolApplet0,'if (!fsize){fsize=20};fsize -= 4;if (fsize < 10){fsize = 10};font echo @fsize serif')">smaller</a> </td> - <td valign=top><div id=demodiv style="background:beige;width:800px;height:500px;overflow:auto"> + <td valign=top><div id=demodiv style="background:beige;width:600px;height:500px;overflow:auto"> - </div></td> + </div> + <div id=cmddiv></div> + </td> </tr> -<tr><td></td><td><div id=cmddiv></div> -</td></tr> </table> </body> Deleted: trunk/Jmol/site-resources/jsmol/iucrdemo/sg10.c.png =================================================================== (Binary files differ) Deleted: trunk/Jmol/site-resources/jsmol/iucrdemo/sg18-symops.png =================================================================== (Binary files differ) Deleted: trunk/Jmol/site-resources/jsmol/iucrdemo/super-62.all.png =================================================================== (Binary files differ) Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-04-17 02:43:34 UTC (rev 22613) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2024-04-17 19:04:22 UTC (rev 22614) @@ -568,7 +568,7 @@ case T.fill: htParams.put("packed", Boolean.TRUE); T3[] oabc = null; - int tok = tokAt(++i); + tok = tokAt(++i); switch (tok) { case T.boundbox: case T.unitcell: Modified: trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java 2024-04-17 02:43:34 UTC (rev 22613) +++ trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java 2024-04-17 19:04:22 UTC (rev 22614) @@ -821,9 +821,9 @@ } } if (hmSymbol == null) - System.out.println("SG ??"); + hmSymbol = SG_NONE; if (hmSymbol.equals(SG_NONE)) { - hallSymbol = hallInfo.hallSymbol; + hallSymbol = h.hallSymbol; nHallOperators = Integer.valueOf(operationCount); } if (nHallOperators != null && operationCount != nHallOperators.intValue()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-03-04 20:40:50
|
Revision: 22609 http://sourceforge.net/p/jmol/code/22609 Author: hansonr Date: 2024-03-04 20:40:47 +0000 (Mon, 04 Mar 2024) Log Message: ----------- Jmol.___JmolVersion="16.1.63" // (legacy) also 16.1.64 (swingJS) bug fix: (legacy JavaScript only) secondary structure reading broken in 16.1.59 bug fix: MODELKIT SET KEY ON loses colored dot upon frame resizing bug fix (legacy JavaScript only) script fails when referencing undeclared variable bug fix: PDB file with all UNK residues considered "not PDB" and skips reading sequence number -- logic changed to also check for only one residue number Modified Paths: -------------- trunk/Jmol/j2s/timestamp trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/CarbohydratePolymer.java trunk/Jmol/src/org/jmol/modelsetbio/Helix.java trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/PhosphorusPolymer.java trunk/Jmol/src/org/jmol/modelsetbio/Sheet.java trunk/Jmol/src/org/jmol/modelsetbio/Turn.java trunk/Jmol/src/org/jmol/render/CageRenderer.java trunk/Jmol/src/org/jmol/script/T.java trunk/Jmol/src/org/jmol/symmetry/WyckoffFinder.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/j2s/timestamp 2024-03-04 20:40:47 UTC (rev 22609) @@ -1 +1 @@ -20240301123437 +20240303143226 Modified: trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/AlphaPolymer.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -39,28 +39,15 @@ public int pt0; /** - * @j2sIgnore * * @param monomers * @param pt0 */ AlphaPolymer(Monomer[] monomers, int pt0) { - setPoly(monomers, pt0); + super(monomers, true); + this.pt0 = pt0; } - /** - * @j2sIgnore - */ - public AlphaPolymer() { - } - - protected void setPoly(Monomer[] monomers, int pt0) { - this.pt0 = pt0; - set(monomers); - hasStructure = true; - } - - @Override public ProteinStructure getProteinStructure(int monomerIndex) { return (ProteinStructure) monomers[monomerIndex].getStructure(); Modified: trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/AminoPolymer.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -58,7 +58,6 @@ */ /** - * @j2sIgnoreSuperConstructor * * @param monomers * @param pt0 @@ -65,7 +64,6 @@ */ AminoPolymer(Monomer[] monomers, int pt0) { super(monomers, pt0); - setPoly(monomers, pt0); type = TYPE_AMINO; for (int i = 0; i < monomerCount; ++i) if (!((AminoMonomer) monomers[i]).hasOAtom()) Modified: trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/BioPolymer.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -52,7 +52,7 @@ * */ public abstract class BioPolymer implements Structure { - + public Model model; public Monomer[] monomers; @@ -80,9 +80,10 @@ protected final static int TYPE_CARBOHYDRATE = 3; public int cyclicFlag; - - protected void set(Monomer[] monomers) { + + protected BioPolymer(Monomer[] monomers, boolean hasStructure) { this.monomers = monomers; + this.hasStructure = hasStructure; monomerCount = monomers.length; for (int i = monomerCount; --i >= 0;) monomers[i].setBioPolymer(this, i); Modified: trunk/Jmol/src/org/jmol/modelsetbio/CarbohydratePolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/CarbohydratePolymer.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/CarbohydratePolymer.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -26,12 +26,10 @@ public class CarbohydratePolymer extends BioPolymer { /** - * @j2sIgnoreSuperConstructor - * * @param monomers */ CarbohydratePolymer(Monomer[] monomers) { - set(monomers); + super(monomers, false); type = TYPE_CARBOHYDRATE; } Modified: trunk/Jmol/src/org/jmol/modelsetbio/Helix.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/Helix.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/Helix.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -37,8 +37,6 @@ * @param monomerIndex * @param monomerCount * @param subtype - * @j2sIgnoreSuperConstructor - * @j2sOverride * */ Helix(AlphaPolymer apolymer, int monomerIndex, int monomerCount, STR subtype) { Modified: trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/NucleicPolymer.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -47,14 +47,11 @@ public static Map<String, String> htGroup1; /** - * @j2sIgnoreSuperConstructor * * @param monomers */ NucleicPolymer(Monomer[] monomers) { - super(); - set(monomers); - hasStructure = true; + super(monomers); type = TYPE_NUCLEIC; hasWingPoints = true; } Modified: trunk/Jmol/src/org/jmol/modelsetbio/PhosphorusPolymer.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/PhosphorusPolymer.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/PhosphorusPolymer.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -26,20 +26,10 @@ public class PhosphorusPolymer extends BioPolymer { /** - * @j2sIgnore - * * @param monomers */ PhosphorusPolymer(Monomer[] monomers) { - set(monomers); - hasStructure = true; + super(monomers, true); } - /** - * @j2sIgnore - */ - public PhosphorusPolymer() { - // TODO - } - } Modified: trunk/Jmol/src/org/jmol/modelsetbio/Sheet.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/Sheet.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/Sheet.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -37,8 +37,6 @@ * @param monomerIndex * @param monomerCount * @param subtype - * @j2sIgnoreSuperConstructor - * @j2sOverride * */ Sheet(AlphaPolymer apolymer, int monomerIndex, int monomerCount, STR subtype) { Modified: trunk/Jmol/src/org/jmol/modelsetbio/Turn.java =================================================================== --- trunk/Jmol/src/org/jmol/modelsetbio/Turn.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/modelsetbio/Turn.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -31,8 +31,6 @@ * @param apolymer * @param monomerIndex * @param monomerCount - * @j2sIgnoreSuperConstructor - * @j2sOverride * */ Turn(AlphaPolymer apolymer, int monomerIndex, int monomerCount) { Modified: trunk/Jmol/src/org/jmol/render/CageRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/CageRenderer.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/render/CageRenderer.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -61,7 +61,7 @@ font3d = vwr.gdata.getFont3DScaled(fls.font3d, imageFontScaling); float zSum = 0; - for (int i = 8; --i >= 0;) { + for (int i = 8; --i >= 0;) { pt.setT(vertices[i]); if (scale != 1) { pt.sub(vertices[0]); Modified: trunk/Jmol/src/org/jmol/script/T.java =================================================================== --- trunk/Jmol/src/org/jmol/script/T.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/script/T.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -2662,8 +2662,8 @@ "messageStyleChime", "minimizationRefresh", "minimizationSilent", + "modelkit", "modelkitMode", - "modelkit", "modulateOccupancy", "monitorEnergy", "multiplebondbananas", Modified: trunk/Jmol/src/org/jmol/symmetry/WyckoffFinder.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/WyckoffFinder.java 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/symmetry/WyckoffFinder.java 2024-03-04 20:40:47 UTC (rev 22609) @@ -211,8 +211,11 @@ boolean isGeneral = (returnType == WYCKOFF_RET_GENERAL); for (int i = isGeneral ? 1 : npos; --i >= 0;) { Map<String, Object> map = (Map<String, Object>) positions.get(i); - if (isGeneral || map.get("label").equals(letter)) { + String label = (String) map.get("label"); + if (isGeneral || label.equals(letter)) { SB sbc = new SB(); + if (isGeneral) + sbc.append(label).appendC(' '); Lst<Object> coords = (i == 0 ? gpos : (Lst<Object>) map.get("coord")); getList(coords, letter, sbc, 0); if (i > 0 && ncent > 0) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-03-03 20:20:47 UTC (rev 22608) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-03-04 20:40:47 UTC (rev 22609) @@ -57,6 +57,8 @@ Jmol.___JmolVersion="16.1.63" // (legacy) also 16.1.64 (swingJS) +bug fix: (legacy JavaScript only) secondary structure reading broken in 16.1.59 + bug fix: MODELKIT SET KEY ON loses colored dot upon frame resizing bug fix (legacy JavaScript only) script fails when referencing undeclared variable This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2024-02-26 12:47:28
|
Revision: 22607 http://sourceforge.net/p/jmol/code/22607 Author: hansonr Date: 2024-02-26 12:47:25 +0000 (Mon, 26 Feb 2024) Log Message: ----------- Jmol.___JmolVersion="16.1.59" // (legacy) also 16.1. (swingJS) bug fix: set echo ID "X" {0 0 0} does not place the echo at {0 0 0} bug fix: set echo ID "X" offset {0 0 0} results in a very tiny font with SET FONTSCALING TRUE bug fix: echo @x with trailing space gives "@x" bug fix: echo "\\@{...}" loses "\\" when saved in state bug fix: POLYHEDRA command should allow keywords following center specification: POLYHEDRA @6 COLLAPSED bug fix: (legacy only) dragging a molecule around to rotate it should continue after the mouse leaves the applet space (Fix was in JSmolCore.js, part of JSmol.min.js) bug fix: print symop("wyckoff") only prints the {x,y,z} general coordinate; should print all feature change: (legacy only) now using jQuery 3.7.1 - previous version of jQuery (jQuery 1.11.0) is still there is needed Modified Paths: -------------- trunk/Jmol/src/org/jmol/symmetry/WyckoffFinder.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/src/org/jmol/symmetry/WyckoffFinder.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/WyckoffFinder.java 2024-02-26 11:21:36 UTC (rev 22606) +++ trunk/Jmol/src/org/jmol/symmetry/WyckoffFinder.java 2024-02-26 12:47:25 UTC (rev 22607) @@ -35,6 +35,7 @@ private int npos, ncent; protected P3[] centerings; protected String[] centeringStr; + private Lst<Object> gpos; public WyckoffFinder() { // only used for dynamic instantiation from Symmetry.java @@ -149,12 +150,7 @@ Map<String, Object> map = (Map<String, Object>) positions.get(i); String label = (String) map.get("label"); sb.appendC('\n').append(label); - if (i == 0) { - // general - sb.append(" (x,y,z)"); - } else { - getList((Lst<Object>) map.get("coord"), label, sb); - } + getList(i == 0 ? gpos : (Lst<Object>) map.get("coord"), label, sb); } return sb.toString(); case WYCKOFF_RET_LABEL: @@ -242,6 +238,7 @@ @SuppressWarnings("unchecked") private WyckoffFinder(Map<String, Object> map) { if (map != null) { + gpos = (Lst<Object>) map.get("gp"); Map<String, Object> wpos = (Map<String, Object>) map.get("wpos"); positions = (Lst<Object>) wpos.get("pos"); npos = positions.size(); Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-02-26 11:21:36 UTC (rev 22606) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2024-02-26 12:47:25 UTC (rev 22607) @@ -69,6 +69,8 @@ bug fix: (legacy only) dragging a molecule around to rotate it should continue after the mouse leaves the applet space (Fix was in JSmolCore.js, part of JSmol.min.js) +bug fix: print symop("wyckoff") only prints the {x,y,z} general coordinate; should print all + feature change: (legacy only) now using jQuery 3.7.1 - previous version of jQuery (jQuery 1.11.0) is still there is needed This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ahe...@us...> - 2023-12-29 11:48:42
|
Revision: 22602 http://sourceforge.net/p/jmol/code/22602 Author: aherraez Date: 2023-12-29 11:48:39 +0000 (Fri, 29 Dec 2023) Log Message: ----------- copyright notice in splash panel updated to 2024 Modified Paths: -------------- trunk/Jmol/src/org/openscience/jmol/app/images/Jmol_splash.jpg trunk/Jmol/src/org/openscience/jmol/app/images/Jmol_splash_double.png Modified: trunk/Jmol/src/org/openscience/jmol/app/images/Jmol_splash.jpg =================================================================== (Binary files differ) Modified: trunk/Jmol/src/org/openscience/jmol/app/images/Jmol_splash_double.png =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-12-01 13:05:01
|
Revision: 22601 http://sourceforge.net/p/jmol/code/22601 Author: hansonr Date: 2023-12-01 13:04:48 +0000 (Fri, 01 Dec 2023) Log Message: ----------- Quat.div to Quat.arrayDiv; remove single reference to Arrays.copyOf Modified Paths: -------------- trunk/Jmol/src/org/jmol/scriptext/MathExt.java trunk/Jmol/src/org/jmol/symmetry/CIPChirality.java Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2023-12-01 13:00:00 UTC (rev 22600) +++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2023-12-01 13:04:48 UTC (rev 22601) @@ -3282,7 +3282,7 @@ if (args[0].tok == T.varray && args[1].tok == T.varray) { Quat[] data1 = e.getQuaternionArray(args[0].getList(), T.list); Quat[] data2 = e.getQuaternionArray(args[1].getList(), T.list); - qs = Quat.div(data2, data1, nMax, isRelative); + qs = Quat.arrayDiv(data2, data1, nMax, isRelative); break; } if (args[0].tok == T.varray && args[1].tok == T.on) { @@ -3296,7 +3296,7 @@ Integer.MAX_VALUE); Quat[] data2 = vwr.getAtomGroupQuaternions((BS) args[1].value, Integer.MAX_VALUE); - qs = Quat.div(data2, data1, nMax, isRelative); + qs = Quat.arrayDiv(data2, data1, nMax, isRelative); break; } } Modified: trunk/Jmol/src/org/jmol/symmetry/CIPChirality.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/CIPChirality.java 2023-12-01 13:00:00 UTC (rev 22600) +++ trunk/Jmol/src/org/jmol/symmetry/CIPChirality.java 2023-12-01 13:04:48 UTC (rev 22601) @@ -1710,7 +1710,7 @@ priorities = oldPriorities; nPriorities = oldNPriorities; } else { - oldPriorities = Arrays.copyOf(priorities, 4); + oldPriorities = new int[] { priorities[0], priorities[1], priorities[2], priorities[3] }; oldNPriorities = nPriorities; } for (int i = 0; i < nAtoms; i++) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-12-01 13:00:06
|
Revision: 22600 http://sourceforge.net/p/jmol/code/22600 Author: hansonr Date: 2023-12-01 13:00:00 +0000 (Fri, 01 Dec 2023) Log Message: ----------- allow JSpecView to read nonstandard DX files with non-ASCII characters. (as "?"); handle errors better during startup Modified Paths: -------------- trunk/Jmol/src/jspecview/application/DisplaySchemesProcessor.java trunk/Jmol/src/jspecview/common/JSVFileManager.java trunk/Jmol/src/jspecview/source/JDXReader.java Modified: trunk/Jmol/src/jspecview/application/DisplaySchemesProcessor.java =================================================================== --- trunk/Jmol/src/jspecview/application/DisplaySchemesProcessor.java 2023-12-01 12:58:28 UTC (rev 22599) +++ trunk/Jmol/src/jspecview/application/DisplaySchemesProcessor.java 2023-12-01 13:00:00 UTC (rev 22600) @@ -118,6 +118,7 @@ try { return load(JSVFileManager.getBufferedReaderForInputStream(stream)); } catch (Exception e) { + System.out.println("DisplaySchemeProcessor ignored: " + e.getMessage()); return false; } } @@ -134,6 +135,7 @@ return load(br); } catch(Exception e){ + System.out.println("DisplaySchemeProcessor ignored: " + e.getMessage()); return false; } Modified: trunk/Jmol/src/jspecview/common/JSVFileManager.java =================================================================== --- trunk/Jmol/src/jspecview/common/JSVFileManager.java 2023-12-01 12:58:28 UTC (rev 22599) +++ trunk/Jmol/src/jspecview/common/JSVFileManager.java 2023-12-01 13:00:00 UTC (rev 22600) @@ -100,7 +100,7 @@ } public static BufferedReader getBufferedReaderFromName(String name, - String startCode) throws JSVException { + String startCode) throws Exception { if (name == null) throw new JSVException("Cannot find " + name); Logger.info("JSVFileManager getBufferedReaderFromName " + name); @@ -172,7 +172,7 @@ } private static BufferedReader getUnzippedBufferedReaderFromName(String name, - String startCode) throws JSVException { + String startCode) throws Exception { String[] subFileList = null; if (name.indexOf("|") >= 0) { subFileList = PT.split(name, "|"); @@ -199,7 +199,7 @@ .getInterface("jspecview.common.JSVZipUtil")).newGZIPInputStream(in); return new BufferedReader(new InputStreamReader(in, "UTF-8")); } catch (Exception e) { - throw new JSVException("Cannot read file " + name + " " + e); + throw e; } } Modified: trunk/Jmol/src/jspecview/source/JDXReader.java =================================================================== --- trunk/Jmol/src/jspecview/source/JDXReader.java 2023-12-01 12:58:28 UTC (rev 22599) +++ trunk/Jmol/src/jspecview/source/JDXReader.java 2023-12-01 13:00:00 UTC (rev 22600) @@ -224,7 +224,7 @@ br.close(); return readBrukerFileZip(null, file.getFullPath()); } - if (header.indexOf('\0') >= 0 || header.indexOf('\uFFFD') >= 0 + if (header.indexOf('\0') >= 0 || header.indexOf("##TITLE= Parameter file") == 0 || header.indexOf("##TITLE= Audit trail") == 0 ) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-12-01 12:58:30
|
Revision: 22599 http://sourceforge.net/p/jmol/code/22599 Author: hansonr Date: 2023-12-01 12:58:28 +0000 (Fri, 01 Dec 2023) Log Message: ----------- disambiguation with Quat.div (2 versions) Modified Paths: -------------- trunk/Jmol/src/javajs/util/Quat.java Modified: trunk/Jmol/src/javajs/util/Quat.java =================================================================== --- trunk/Jmol/src/javajs/util/Quat.java 2023-12-01 12:56:53 UTC (rev 22598) +++ trunk/Jmol/src/javajs/util/Quat.java 2023-12-01 12:58:28 UTC (rev 22599) @@ -438,11 +438,6 @@ q0 * p.q0 - q1 * p.q1 - q2 * p.q2 - q3 * p.q3); } - public Quat div(Quat p) { - // unit quaternions assumed -- otherwise would scale by 1/p.dot(p) - return mulQ(p.inv()); - } - public Quat divLeft(Quat p) { // unit quaternions assumed -- otherwise would scale by 1/p.dot(p) return this.inv().mulQ(p); @@ -637,6 +632,11 @@ return "{" + q1 + " " + q2 + " " + q3 + " " + q0 + "}"; } + public Quat div(Quat p) { + // unit quaternions assumed -- otherwise would scale by 1/p.dot(p) + return mulQ(p.inv()); + } + /** * * @param data1 @@ -646,7 +646,7 @@ * * @return pairwise array of data1 / data2 or data1 \ data2 */ - public static Quat[] div(Quat[] data1, Quat[] data2, int nMax, boolean isRelative) { + public static Quat[] arrayDiv(Quat[] data1, Quat[] data2, int nMax, boolean isRelative) { int n; if (data1 == null || data2 == null || (n = Math.min(data1.length, data2.length)) == 0) return null; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-12-01 12:56:57
|
Revision: 22598 http://sourceforge.net/p/jmol/code/22598 Author: hansonr Date: 2023-12-01 12:56:53 +0000 (Fri, 01 Dec 2023) Log Message: ----------- Transpiler update for efficiencies in empty constructors, HashMap, and Hashtable Modified Paths: -------------- trunk/Jmol/j2s/j2s.core_5.0.1.jar trunk/Jmol/j2s/timestamp trunk/Jmol/site-resources-zip/Jmol-j2s-site.zip Modified: trunk/Jmol/j2s/j2s.core_5.0.1.jar =================================================================== (Binary files differ) Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2023-12-01 12:50:02 UTC (rev 22597) +++ trunk/Jmol/j2s/timestamp 2023-12-01 12:56:53 UTC (rev 22598) @@ -1 +1 @@ -20231125175756 +20231201065220 Modified: trunk/Jmol/site-resources-zip/Jmol-j2s-site.zip =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-12-01 12:50:12
|
Revision: 22597 http://sourceforge.net/p/jmol/code/22597 Author: hansonr Date: 2023-12-01 12:50:02 +0000 (Fri, 01 Dec 2023) Log Message: ----------- missing spt folder (has die for jsmol.htm guesture test) Added Paths: ----------- trunk/Jmol/site-resources/jsmol/spt/ Removed Paths: ------------- trunk/Jmol/spt/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-11-29 03:51:42
|
Revision: 22596 http://sourceforge.net/p/jmol/code/22596 Author: hansonr Date: 2023-11-29 03:51:29 +0000 (Wed, 29 Nov 2023) Log Message: ----------- Jmol.___JmolVersion="16.1.49" // (legacy) also 16.1.50 (swingJS) bug fix: echo ID xx {x y z} does not default to LEFT, instead a 2-angstrom shift to the right. JavaScript: refactoring of Hashtable to use JavaScript Map in legacy transpiler - should be considerably faster Modified Paths: -------------- trunk/Jmol/.j2sjmol trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/build-1-just-unzip-to-site.xml trunk/Jmol/build-2-jsmol-zip.xml trunk/Jmol/site-resources/jsmol/js/core/corebottom2.js trunk/Jmol/site-resources/jsmol/js/core/coretop2.js trunk/Jmol/site-resources-zip/Jmol-j2s-site.zip trunk/Jmol/src/com/jcraft/jzlib/ZStreamException.java trunk/Jmol/src/jspecview/appletjs/JSVApplet.java trunk/Jmol/src/org/jmol/i18n/GT.java trunk/Jmol/src/org/jmol/modelset/Text.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/shape/Echo.java trunk/Jmol/src/org/jmol/util/GenericApplet.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties Modified: trunk/Jmol/.j2sjmol =================================================================== --- trunk/Jmol/.j2sjmol 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/.j2sjmol 2023-11-29 03:51:29 UTC (rev 22596) @@ -1,6 +1,6 @@ #Java2Script Configuration #Wed Nov 08 16:22:00 CST 2023 -j2s.excluded.paths=AWT,JNI,application,Test,multitouch,molecularplayground,openscience,awt/,translation/Jmol/,/java/,org/jmol/BasicDnD,org/jmol/Export,org/jmol/Integration,org/jmol/JmolTable,org/jmol/util/JUnitLogger,org/jmol/util/PerformanceMeasure,org/jmol/util/Profiling,console/App,console/Img,console/Jmol,console/Key,console/Script +j2s.excluded.paths=AWT,JNI,application,Test,multitouch,sparshui,molecularplayground,openscience,awt/,translation/Jmol/,/java/,org/jmol/BasicDnD,org/jmol/Export,org/jmol/Integration,org/jmol/JmolTable,org/jmol/util/JUnitLogger,org/jmol/util/PerformanceMeasure,org/jmol/util/Profiling,console/App,console/Img,console/Jmol,console/Key,console/Script j2s.site.directory=site j2s.string.fixes=jspecview,JSV,org.jmol.minimize.forcefield,JM.FF,org.jmol.minimize,JM,org.jmol.modelsetbio,JM,org.jmol.modelset,JM,org.jmol.awtjs.swing,JS,org.jmol.scriptext,JS,org.jmol.script,JS,org.jmol.smiles,JS,org.jmol.symmetry,JS,javajs.util,JU,com.jcraft.jzlib,JU,javajs.util,JU,org.jmol.util,JU,org.jmol.viewer,JV,org.jmol,J,org/jmol/minimize/forcefield,JM/FF,org/jmol/symmetry,JS,org/jmol/util,JU,org/jmol/,J/ j2s.package.fixes=org/jmol/minimize/forcefield,JM/FF,org/jmol/minimize,JM,org/jmol/modelsetbio,JM,org/jmol/modelset,JM,org/jmol/awtjs/swing,JS,org/jmol/scriptext,JS,org/jmol/script,JS,org/jmol/smiles,JS,org/jmol/symmetry,JS,org/jmol/util,JU,javajs/util,JU,com/jcraft/jzlib,JU,org/jmol/viewer,JV,jspecview,JSV,org/jmol,J Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/build-1-just-unzip-to-site.xml =================================================================== --- trunk/Jmol/build-1-just-unzip-to-site.xml 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/build-1-just-unzip-to-site.xml 2023-11-29 03:51:29 UTC (rev 22596) @@ -93,7 +93,18 @@ <move file="${site.jsmol.path}/JSmol.min.js" tofile="${site.jsmol.path}/JSmol.min0.js"/> <copy file="${site.jsmol.path}/js/JSmol.full.js" tofile="${site.jsmol.path}/JSmol.min.js"/> + + <echo>...creating ${site.jsmol.path}/js/JSmolMin2.js for Wikipedia and jmol.php</echo> + <concat destfile="${site.jsmol.path}/js/JSmolMin2.js"> + <filelist dir="${site.jsmol.path}" files=" + JSmol.min0.js + js/Jmol2.js + j2s/Jmol.properties + " /> + </concat> + + <echo>...creating ${site.jsmol.path}/j2s/core/corejmoldebug.js</echo> <!-- JSmolJavaExt.js is from the java2script 4.2 transplier code, in site-resources-zip/Jmol-j2s-size.zip --> <concat destfile="${site.jsmol.path}/j2s/core/corejmoldebug.js"> Modified: trunk/Jmol/build-2-jsmol-zip.xml =================================================================== --- trunk/Jmol/build-2-jsmol-zip.xml 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/build-2-jsmol-zip.xml 2023-11-29 03:51:29 UTC (rev 22596) @@ -989,6 +989,8 @@ </antcall> <delete file="temp.js" /> + <delete quiet="true" dir="${site.jsmol.j2s.path}/test"/> + <echo>creating distribution zip file jsmol.zip and copying it to Jmol</echo> <zip zipfile="appletweb/jsmol.zip" basedir="site" includes="**" /> <!-- copy file="README-DOWNLOAD.TXT" tofile="dist/README.TXT" / --> Modified: trunk/Jmol/site-resources/jsmol/js/core/corebottom2.js =================================================================== --- trunk/Jmol/site-resources/jsmol/js/core/corebottom2.js 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/site-resources/jsmol/js/core/corebottom2.js 2023-11-29 03:51:29 UTC (rev 22596) @@ -15,7 +15,6 @@ ,Clazz.defineEnumConstant ,Clazz.exceptionOf ,Clazz.newIntArray -,Clazz.defineStatics ,Clazz.newFloatArray ,Clazz.declareType ,Clazz.prepareFields @@ -22,8 +21,6 @@ ,Clazz.superConstructor ,Clazz.newByteArray ,Clazz.declareInterface -,Clazz.p0p -,Clazz.pu$h ,Clazz.newShortArray ,Clazz.innerTypeInstance ,Clazz.isClassDefined Modified: trunk/Jmol/site-resources/jsmol/js/core/coretop2.js =================================================================== --- trunk/Jmol/site-resources/jsmol/js/core/coretop2.js 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/site-resources/jsmol/js/core/coretop2.js 2023-11-29 03:51:29 UTC (rev 22596) @@ -15,7 +15,6 @@ ,Clazz_defineEnumConstant ,Clazz_exceptionOf ,Clazz_newIntArray -,Clazz_defineStatics ,Clazz_newFloatArray ,Clazz_declareType ,Clazz_prepareFields @@ -22,8 +21,6 @@ ,Clazz_superConstructor ,Clazz_newByteArray ,Clazz_declareInterface -,Clazz_p0p -,Clazz_pu$h ,Clazz_newShortArray ,Clazz_innerTypeInstance ,Clazz_isClassDefined Modified: trunk/Jmol/site-resources-zip/Jmol-j2s-site.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/src/com/jcraft/jzlib/ZStreamException.java =================================================================== --- trunk/Jmol/src/com/jcraft/jzlib/ZStreamException.java 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/src/com/jcraft/jzlib/ZStreamException.java 2023-11-29 03:51:29 UTC (rev 22596) @@ -1,44 +1,44 @@ -/* -*-mode:java; c-basic-offset:2; -*- */ -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - - 3. The names of the authors may not be used to endorse or promote products - derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, -OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ -/* - * This program is based on zlib-1.1.3, so all credit should go authors - * Jean-loup Gailly(jl...@gz...) and Mark Adler(ma...@al...) - * and contributors of zlib. - */ - -package com.jcraft.jzlib; - -public class ZStreamException extends java.io.IOException { - public ZStreamException() { - super(); - } - public ZStreamException(String s) { - super(s); - } -} +/* -*-mode:java; c-basic-offset:2; -*- */ +/* +Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the distribution. + + 3. The names of the authors may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT, +INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +/* + * This program is based on zlib-1.1.3, so all credit should go authors + * Jean-loup Gailly(jl...@gz...) and Mark Adler(ma...@al...) + * and contributors of zlib. + */ + +package com.jcraft.jzlib; + +public class ZStreamException extends java.io.IOException { + public ZStreamException() { + super(); + } + public ZStreamException(String s) { + super(s); + } +} Modified: trunk/Jmol/src/jspecview/appletjs/JSVApplet.java =================================================================== --- trunk/Jmol/src/jspecview/appletjs/JSVApplet.java 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/src/jspecview/appletjs/JSVApplet.java 2023-11-29 03:51:29 UTC (rev 22596) @@ -146,7 +146,7 @@ @Override public String getParameter(String paramName) { Object o = htParams.get(paramName.toLowerCase()); - return (o == null ? null : new String(o.toString())); + return (o == null ? null : o.toString()); } private boolean getBooleanValue(String propertyName, boolean defaultValue) { Modified: trunk/Jmol/src/org/jmol/i18n/GT.java =================================================================== --- trunk/Jmol/src/org/jmol/i18n/GT.java 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/src/org/jmol/i18n/GT.java 2023-11-29 03:51:29 UTC (rev 22596) @@ -24,7 +24,6 @@ package org.jmol.i18n; import java.text.MessageFormat; -//import java.util.HashMap; import java.util.Hashtable; import java.util.Map; Modified: trunk/Jmol/src/org/jmol/modelset/Text.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/Text.java 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/src/org/jmol/modelset/Text.java 2023-11-29 03:51:29 UTC (rev 22596) @@ -210,6 +210,23 @@ boxHeight = textHeight + (fontScale >= 2 ? 16 : 8); } + private float getPymolXYOffset(float x, int width, float ppa) { + float f = (x < -1 ? -1 : x > 1 ? 0 : (x - 1) / 2); + // x f/width offset/ppa + // -3 -1 -2 + // -2 -1 -1 + // -1 0 0 + //-0.5 -3/4 0 + // 0 -1/2 0 + // 0.5 -1/4 0 + // 1 0 0 + // 2 1 1 + // 3 1 2 + + float offset = (x < -1 || x > 1 ? x + (x < 0 ? 1 : -1) : 0); + return f * width + offset * ppa; + } + public void setPosition(float scalePixelsPerMicron, float imageFontScaling, boolean isAbsolute, float[] boxXY) { if (boxXY == null) @@ -238,6 +255,7 @@ xAdj = (fontScale >= 2 ? 8 : 4); yAdj = ascent - lineHeight + xAdj; if (!isEcho || pymolOffset != null) { + boxXY[0] = movableX; boxXY[1] = movableY; if (pymolOffset != null && pymolOffset[0] != 2 && pymolOffset[0] != 3) { @@ -249,6 +267,19 @@ z -= (int) dz; pixelsPerAngstrom = vwr.tm.scaleToScreen(z, 1000); + // dx and dy are the overall object offset, with text + dx = (xyz != null && barPixels > 0 ? 0 : getPymolXYOffset(pymolOffset[1], textWidth, pixelsPerAngstrom)); + int dh = ascent - descent; + dy = -getPymolXYOffset(-pymolOffset[2], dh, pixelsPerAngstrom) + - (textHeight + dh) / 2; + + //dy: added -lineHeight (for one line) + if (pymolOffset[0] == 1) { + // from PyMOL - back to original plan + dy -= descent; + } + + /* for whatever reason, Java returns an * ascent that is considerably higher than a capital X * forget leading! @@ -269,18 +300,6 @@ * * */ - // dx and dy are the overall object offset, with text - dx = (xyz != null && barPixels > 0 ? 0 : getPymolXYOffset(pymolOffset[1], textWidth, pixelsPerAngstrom)); - int dh = ascent - descent; - dy = -getPymolXYOffset(-pymolOffset[2], dh, pixelsPerAngstrom) - - (textHeight + dh) / 2; - - //dy: added -lineHeight (for one line) - if (pymolOffset[0] == 1) { - // from PyMOL - back to original plan - dy -= descent; - } - // xAdj and yAdj are the adjustments for the box itself relative to the text xAdj = (fontScale >= 2 ? 8 : 4); yAdj = -descent; @@ -323,22 +342,6 @@ y0 += ascent + (lines.length - 1)/2f * lineHeight; } - private float getPymolXYOffset(float off, int width, float ppa) { - float f = (off < -1 ? -1 : off > 1 ? 0 : (off - 1) / 2); - // offset - // -3 -2 - // -2 -1 - // -1 0 absolute, -1 width - //-0.5 -3/4 width - // 0 -1/2 width - // 0.5 -1/4 width - // 1 0 - // 2 1 - // 3 2 - off = (off < -1 || off > 1 ? off + (off < 0 ? 1 : -1) : 0); - return f * width + off * ppa; - } - private void setPos(float scale) { float xLeft, xCenter, xRight; boolean is3dEcho = (xyz != null); Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2023-11-29 03:51:29 UTC (rev 22596) @@ -7741,6 +7741,8 @@ // PyMOL offsets -- [1, scrx, scry, scrz, molx, moly, molz] in angstroms propertyValue = floatParameterSet(pt, 7, 7); pt = iToken + 1; + } else if (tokAt(pt) == T.none) { + pt++; } break; case T.off: Modified: trunk/Jmol/src/org/jmol/shape/Echo.java =================================================================== --- trunk/Jmol/src/org/jmol/shape/Echo.java 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/src/org/jmol/shape/Echo.java 2023-11-29 03:51:29 UTC (rev 22596) @@ -195,10 +195,11 @@ } if ("xyz" == propertyName) { - if (currentObject != null && vwr.getBoolean(T.fontscaling)) + if (currentObject != null && vwr.getBoolean(T.fontscaling)) { currentObject.setScalePixelsPerMicron( - vwr.getScalePixelsPerAngstrom(false) * 10000f); - // continue on to Object2d setting + vwr.getScalePixelsPerAngstrom(false) * 10000); + currentObject.setXYZ((P3) value, true); + } } if ("scale" == propertyName) { @@ -294,20 +295,19 @@ return; } - if ("xyz" == propertyName) { + if ("offset" == propertyName) { if (currentObject != null) { - currentObject.setXYZ((P3) value, true); - if (currentObject.pymolOffset == null) - currentObject.pymolOffset = new float[] { -1, 2, 0, 0, 0, 0, 0 }; + currentObject.pymolOffset = (float[]) value; } return; } - if ("offset" == propertyName) { + + if ("align" == propertyName) { if (currentObject != null) { - currentObject.pymolOffset = (float[]) value; + currentObject.pymolOffset = null; } - return; + // pass through } setPropTS(propertyName, value, null); Modified: trunk/Jmol/src/org/jmol/util/GenericApplet.java =================================================================== --- trunk/Jmol/src/org/jmol/util/GenericApplet.java 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/src/org/jmol/util/GenericApplet.java 2023-11-29 03:51:29 UTC (rev 22596) @@ -127,7 +127,7 @@ @Override public void setScreenDimension(int width, int height) { - viewer.setScreenDimension(width, height); + viewer.setScreenDimension(width, height); } void resizeDisplay(int width, int height) { Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2023-11-26 00:37:23 UTC (rev 22595) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2023-11-29 03:51:29 UTC (rev 22596) @@ -55,8 +55,16 @@ # TODO: allow FIXED to work with MODELKIT MINIMIZE -Jmol.___JmolVersion="16.1.47" // (legacy) also 16.1.48 (swingJS) +Jmol.___JmolVersion="16.1.49" // (legacy) also 16.1.50 (swingJS) +bug fix: echo ID xx {x y z} does not default to LEFT, instead a 2-angstrom shift to the right. + +JavaScript: refactoring of Hashtable to use JavaScript Map in legacy transpiler + - should be considerably faster + + +JmolVersion="16.1.47" // (legacy) also 16.1.48 (swingJS) + bug fix: MODELKIT SPACEGROUP ... for no-atom structure does not properly set unit cell lengths bug fix: LOAD ==HEM (PDB ligand) loading broken in 16.1.45 (2023.11.06) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-11-26 00:37:28
|
Revision: 22595 http://sourceforge.net/p/jmol/code/22595 Author: hansonr Date: 2023-11-26 00:37:23 +0000 (Sun, 26 Nov 2023) Log Message: ----------- Jmol.___JmolVersion="16.1.47" // (legacy) also 16.1.48 (swingJS) bug fix: MODELKIT SPACEGROUP ... for no-atom structure does not properly set unit cell lengths bug fix: LOAD ==HEM (PDB ligand) loading broken in 16.1.45 (2023.11.06) bug fix: LOAD =ams/quartz broken in 16.1.45 bug fix: CIFReader may misread incommensurately modulated files that have multiple structures bug fix: SCALE maximum length 1/2 what it should be with set antialiasDisplay off bug fix: fixes DRAW SPACEGROUP ALL for unit glide in #88, missing planes in #156 bug fix: fixes DRAW SPACEGROUP (ALL) diamond glides of +/-3/4 listed as "g" instead of "d" bug fix: fixes DRAW SPACEGROUP (ALL) diamond glides of +/-3/4 instead of -/+1/4 new feature: LOAD .... fill unitcell rhombohedral - fills a rhombohedral unit cell for a structure that is trigonal in file - ignored unless the symmetry is trigonal - does NOT transform operators -- for that, follow this with MODELKIT SPACEGROUP "..." new feature: LOAD .... fill unitcell trigonal - fills a trigonal unit cell for a structure that is rhombohedral in file - ignored unless the symmetry is trigonal - does NOT transform operators -- for that, follow this with MODELKIT SPACEGROUP "..." new feature: LOAD ... fill unitcell "2a,a-b,..." - allows generic fill of specified unit cell - can be used with any space group - will accept packing lattice such as {2 2 2} just before FILL - does not transform operators -- for that, follow this with MODELKIT SPACEGROUP "..." - for example: load =aflowproto/148.1 fill unitcell "2/3a+1/3b+1/3c,-1/3a+1/3b+1/3c,-1/3a-2/3b+1/3c" modelkit spacegroup "148:r" draw spacegroup all new feature: LOAD =aflowlib/155.2 - loads the second AFLOW prototype in spacegroup 155 at https://www.aflowlib.org/prototype-encyclopedia - full listing of thes AFLOW codes codes employed is in - https://github.com/BobHanson/Jmol-SwingJS/tree/master/src/org/jmol/symmetry/sg/json/aflow_structures.json JmolVersion="16.1.45" // (legacy) also 16.1.46 (swingJS) bug fix: GaussianReader misreading high-level spherical MO data (9G, 11H, 13I) new feature: x = spacegroup("ITA/155.1") - provides detailed information about general positions, generators, and Wyckoff positions for all space groups and their additional ITA settings as found using https://www.cryst.ehu.es/cgi-bin/cryst/programs/nph-getgen - retrieves the first JSON structure in org/jmol/symmetry/sg/json/ita_155.json new feature: UNITCELL RHOMBOHEDRAL and UNITCELL TRIGONAL (or HEXAGONAL - same) - allows switching back and forth between rhombohedral and hexagonal unit cells. - does not change the space group (assumes currently rhombohedral if trigonal or hexangonal is chosen and vice versa) - does not check to see that this is reasonable - applies for rhombohedral: UNITCELL "2/3a+1/3b+1/3c,-1/3a+1/3b+1/3c,-1/3a-2/3b+1/3c" - applies for trigonal: UNITCELL "a-b,b-c,a+b+c" new feature: MODELKIT ADD <elem> WYCKOFF <Aa-z> - adds an atom in a representative position for the given Wyckoff position. - generates all symmetry-equivalent atoms. - for example: modelkit add C wyckoff d - the "seed" position is at the relatively arbitrary position of (2.3/5, 2.3/7, 2.3/9). - this point is projected onto the specified Wyckoff position element (point, line, or plane). - after generation, this point can be moved within the confines of the Wyckoff position constraint using SET PICKING DRAGATOM Modified Paths: -------------- trunk/Jmol/.settings/org.eclipse.jdt.core.prefs trunk/Jmol/appletweb/jsmol.zip trunk/Jmol/examples/basic/org/jmol/Export.java trunk/Jmol/j2s/j2s.core_5.0.1.jar trunk/Jmol/j2s/timestamp trunk/Jmol/jsv/build_info.properties trunk/Jmol/site-resources-zip/Jmol-j2s-site.zip trunk/Jmol/src/com/jcraft/jzlib/Adler32.java trunk/Jmol/src/com/jcraft/jzlib/CRC32.java trunk/Jmol/src/javajs/util/CifDataParser.java trunk/Jmol/src/javajs/util/Lst.java trunk/Jmol/src/jme/AtomDisplayLabel.java trunk/Jmol/src/jspecview/api/JSVTreeNode.java trunk/Jmol/src/jspecview/app/JSVAppPro.java trunk/Jmol/src/jspecview/application/JSpecView.java trunk/Jmol/src/jspecview/application/MainFrame.java trunk/Jmol/src/jspecview/common/JSViewer.java trunk/Jmol/src/jspecview/dialog/ViewsDialog.java trunk/Jmol/src/jspecview/tree/SimpleTreeEnumeration.java trunk/Jmol/src/jspecview/tree/SimpleTreeNode.java trunk/Jmol/src/org/jmol/api/Interface.java trunk/Jmol/src/org/jmol/modelkit/ModelKit.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/scriptext/CmdExt.java trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java trunk/Jmol/src/org/jmol/symmetry/SpaceGroupFinder.java trunk/Jmol/src/org/jmol/symmetry/Symmetry.java trunk/Jmol/src/org/jmol/util/JSONWriter.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/test/jmol-jar/Jmol.jar Added Paths: ----------- trunk/Jmol/site-resources/jsmol/j2s/img/ trunk/Jmol/site-resources/jsmol/j2s/img/cursor_wait.gif trunk/Jmol/site-resources/jsmol/j2s/img/play_make_live.jpg trunk/Jmol/unused/Jmol-j2s-site2.zip Removed Paths: ------------- trunk/Jmol/site-resources/jsmol/img/cursor_wait.gif trunk/Jmol/site-resources/jsmol/img/play_make_live.jpg Modified: trunk/Jmol/.settings/org.eclipse.jdt.core.prefs =================================================================== --- trunk/Jmol/.settings/org.eclipse.jdt.core.prefs 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/.settings/org.eclipse.jdt.core.prefs 2023-11-26 00:37:23 UTC (rev 22595) @@ -8,21 +8,26 @@ org.eclipse.jdt.core.classpath.exclusionPatterns=enabled org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled org.eclipse.jdt.core.classpath.outputOverlappingAnotherSource=error +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnull.secondary= org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary= org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullable.secondary= org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=do not generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.doc.comment.support=enabled org.eclipse.jdt.core.compiler.maxProblemPerUnit=100 +org.eclipse.jdt.core.compiler.problem.APILeak=warning org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.autoboxing=warning @@ -45,7 +50,7 @@ org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning -org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled @@ -72,6 +77,8 @@ org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error org.eclipse.jdt.core.compiler.problem.nullReference=warning org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error @@ -78,6 +85,7 @@ org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore @@ -89,10 +97,12 @@ org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled -org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning @@ -99,6 +109,9 @@ org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning +org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled +org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore @@ -106,6 +119,7 @@ org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled +org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedImport=warning org.eclipse.jdt.core.compiler.problem.unusedLabel=warning org.eclipse.jdt.core.compiler.problem.unusedLocal=warning @@ -115,10 +129,11 @@ org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.release=disabled -org.eclipse.jdt.core.compiler.source=1.6 +org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 Modified: trunk/Jmol/appletweb/jsmol.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/examples/basic/org/jmol/Export.java =================================================================== --- trunk/Jmol/examples/basic/org/jmol/Export.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/examples/basic/org/jmol/Export.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -81,6 +81,7 @@ case ANIMFRAME: case APPLETREADY: case ATOMMOVED: + case AUDIO: case ERROR: case HOVER: case IMAGE: Modified: trunk/Jmol/j2s/j2s.core_5.0.1.jar =================================================================== (Binary files differ) Modified: trunk/Jmol/j2s/timestamp =================================================================== --- trunk/Jmol/j2s/timestamp 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/j2s/timestamp 2023-11-26 00:37:23 UTC (rev 22595) @@ -1 +1 @@ -20231113043956 +20231125175756 Modified: trunk/Jmol/jsv/build_info.properties =================================================================== --- trunk/Jmol/jsv/build_info.properties 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/jsv/build_info.properties 2023-11-26 00:37:23 UTC (rev 22595) @@ -1,4 +1,4 @@ -#Thu, 16 Nov 2023 11:13:33 -0600 +#Sat, 25 Nov 2023 18:33:32 -0600 build.major.number=2 -build.revision.number=11968 +build.revision.number=11969 build.minor.number=0 Deleted: trunk/Jmol/site-resources/jsmol/img/cursor_wait.gif =================================================================== (Binary files differ) Deleted: trunk/Jmol/site-resources/jsmol/img/play_make_live.jpg =================================================================== (Binary files differ) Added: trunk/Jmol/site-resources/jsmol/j2s/img/cursor_wait.gif =================================================================== (Binary files differ) Index: trunk/Jmol/site-resources/jsmol/j2s/img/cursor_wait.gif =================================================================== --- trunk/Jmol/site-resources/jsmol/j2s/img/cursor_wait.gif 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/site-resources/jsmol/j2s/img/cursor_wait.gif 2023-11-26 00:37:23 UTC (rev 22595) Property changes on: trunk/Jmol/site-resources/jsmol/j2s/img/cursor_wait.gif ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Added: trunk/Jmol/site-resources/jsmol/j2s/img/play_make_live.jpg =================================================================== (Binary files differ) Index: trunk/Jmol/site-resources/jsmol/j2s/img/play_make_live.jpg =================================================================== --- trunk/Jmol/site-resources/jsmol/j2s/img/play_make_live.jpg 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/site-resources/jsmol/j2s/img/play_make_live.jpg 2023-11-26 00:37:23 UTC (rev 22595) Property changes on: trunk/Jmol/site-resources/jsmol/j2s/img/play_make_live.jpg ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Modified: trunk/Jmol/site-resources-zip/Jmol-j2s-site.zip =================================================================== (Binary files differ) Modified: trunk/Jmol/src/com/jcraft/jzlib/Adler32.java =================================================================== --- trunk/Jmol/src/com/jcraft/jzlib/Adler32.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/com/jcraft/jzlib/Adler32.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -44,20 +44,24 @@ private long s1=1L; private long s2=0L; + @Override public void resetLong(long init){ s1=init&0xffff; s2=(init>>16)&0xffff; } + @Override public void reset(){ s1=1L; s2=0L; } + @Override public long getValue(){ return ((s2<<16)|s1); } + @Override public void update(byte[] buf, int index, int len){ if(len==1){ @@ -116,6 +120,7 @@ // } private byte[] b1 = new byte[1]; + @Override public void updateByteAsInt(int b) { b1[0] = (byte) b; update(b1, 0, 1); Modified: trunk/Jmol/src/com/jcraft/jzlib/CRC32.java =================================================================== --- trunk/Jmol/src/com/jcraft/jzlib/CRC32.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/com/jcraft/jzlib/CRC32.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -98,6 +98,7 @@ //} //} + @Override public void update(byte[] buf, int index, int len) { int c = ~crc; while (--len >= 0) @@ -105,14 +106,17 @@ crc = ~c; } + @Override public void reset() { crc = 0; } + @Override public void resetLong(long vv) { crc = (int) (vv & 0xffffffffL); } + @Override public long getValue() { return crc & 0xffffffffL; } @@ -119,6 +123,7 @@ private byte[] b1 = new byte[1]; + @Override public void updateByteAsInt(int b) { b1[0] = (byte) b; update(b1, 0, 1); Modified: trunk/Jmol/src/javajs/util/CifDataParser.java =================================================================== --- trunk/Jmol/src/javajs/util/CifDataParser.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/javajs/util/CifDataParser.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -892,6 +892,7 @@ } catch (Exception e) { System.out.println("exception in CifDataParser ; " + e); } + return "["; case ']': ich++; return "]"; Modified: trunk/Jmol/src/javajs/util/Lst.java =================================================================== --- trunk/Jmol/src/javajs/util/Lst.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/javajs/util/Lst.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -66,7 +66,7 @@ * @j2sIgnore * */ -// @Override +// @Override DON'T ADD THIS // @Deprecated public V remove(int location) { throw new NullPointerException("use Lst.removeItemAt(location), not Lst.remove(location)"); Modified: trunk/Jmol/src/jme/AtomDisplayLabel.java =================================================================== --- trunk/Jmol/src/jme/AtomDisplayLabel.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jme/AtomDisplayLabel.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -6,7 +6,6 @@ import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.geom.Rectangle2D; -import java.awt.geom.Rectangle2D.Double; /** * @author bruno Modified: trunk/Jmol/src/jspecview/api/JSVTreeNode.java =================================================================== --- trunk/Jmol/src/jspecview/api/JSVTreeNode.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jspecview/api/JSVTreeNode.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -5,8 +5,6 @@ import java.util.Enumeration; -import javax.swing.tree.TreeNode; - import jspecview.common.PanelNode; public interface JSVTreeNode { @@ -19,7 +17,7 @@ PanelNode getPanelNode(); - Enumeration<TreeNode> children(); + Enumeration<JSVTreeNode> children(); int getIndex(); Modified: trunk/Jmol/src/jspecview/app/JSVAppPro.java =================================================================== --- trunk/Jmol/src/jspecview/app/JSVAppPro.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jspecview/app/JSVAppPro.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -41,17 +41,16 @@ import java.util.Properties; +import org.jmol.api.JSVInterface; + import jspecview.api.AppletFrame; -import jspecview.api.ScriptInterface; -import org.jmol.api.JSVInterface; - /** * @author Bob Hanson */ public class JSVAppPro extends JSVApp implements - JSVInterface, ScriptInterface { + JSVInterface { public JSVAppPro(AppletFrame appletFrame, boolean isJS) { super(appletFrame, isJS); Modified: trunk/Jmol/src/jspecview/application/JSpecView.java =================================================================== --- trunk/Jmol/src/jspecview/application/JSpecView.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jspecview/application/JSpecView.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -449,6 +449,7 @@ mainFrame.repaint(); } + @SuppressWarnings("deprecation") @Override public void setCursor(int id) { if (mainFrame != null) Modified: trunk/Jmol/src/jspecview/application/MainFrame.java =================================================================== --- trunk/Jmol/src/jspecview/application/MainFrame.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jspecview/application/MainFrame.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -88,14 +88,11 @@ import jspecview.common.JSVFileManager; import jspecview.common.JSViewer; import jspecview.common.PanelNode; -import jspecview.common.Parameters; import jspecview.common.PeakPickEvent; import jspecview.common.ScriptToken; import jspecview.common.SubSpecChangeEvent; import jspecview.common.ZoomEvent; import jspecview.export.Exporter; -import jspecview.java.AwtFileHelper; -import jspecview.java.AwtMainPanel; import jspecview.source.JDXSource; // BH 1/14/17 moves command checking to JSViewer @@ -806,6 +803,8 @@ case GRIDON: toolBar.gridToggleButton.setSelected(tf); break; + default: + break; } } Modified: trunk/Jmol/src/jspecview/common/JSViewer.java =================================================================== --- trunk/Jmol/src/jspecview/common/JSViewer.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jspecview/common/JSViewer.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -1509,14 +1509,14 @@ JSVTreeNode rootNode = spectraTree.getRootNode(); String fileName = (source == null ? null : source.getFilePath()); Lst<JSVTreeNode> toDelete = new Lst<JSVTreeNode>(); - Enumeration<?> enume = rootNode.children(); + Enumeration<JSVTreeNode> enume = rootNode.children(); while (enume.hasMoreElements()) { - JSVTreeNode node = (JSVTreeNode) enume.nextElement(); + JSVTreeNode node = enume.nextElement(); if (fileName == null || node.getPanelNode().source.matchesFilePath(fileName)) { Logger.info("Closing " + node.getPanelNode().source.getFilePath()); - for (Enumeration<?> e = node.children(); e.hasMoreElements();) { - JSVTreeNode childNode = (JSVTreeNode) e.nextElement(); + for (Enumeration<JSVTreeNode> e = node.children(); e.hasMoreElements();) { + JSVTreeNode childNode = e.nextElement(); toDelete.addLast(childNode); panelNodes.removeObj(childNode.getPanelNode()); } Modified: trunk/Jmol/src/jspecview/dialog/ViewsDialog.java =================================================================== --- trunk/Jmol/src/jspecview/dialog/ViewsDialog.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jspecview/dialog/ViewsDialog.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -74,9 +74,9 @@ } private void addCheckBoxes(JSVTreeNode rootNode, int level, boolean isViews) { - Enumeration enume = rootNode.children(); + Enumeration<JSVTreeNode> enume = rootNode.children(); while (enume.hasMoreElements()) { - JSVTreeNode treeNode = (JSVTreeNode) enume.nextElement(); + JSVTreeNode treeNode = enume.nextElement(); PanelNode node = treeNode.getPanelNode(); if (node.isView != isViews) continue; @@ -122,9 +122,9 @@ node.getPanelNode().isSelected = true; checking = false; } - Enumeration enume = node.children(); + Enumeration<JSVTreeNode> enume = node.children(); while (enume.hasMoreElements()) { - JSVTreeNode treeNode = (JSVTreeNode) enume.nextElement(); + JSVTreeNode treeNode = enume.nextElement(); dialog.setSelected(checkBoxes.get(treeNode.getIndex()), isSelected); treeNode.getPanelNode().isSelected = isSelected; node.getPanelNode().isSelected = isSelected; Modified: trunk/Jmol/src/jspecview/tree/SimpleTreeEnumeration.java =================================================================== --- trunk/Jmol/src/jspecview/tree/SimpleTreeEnumeration.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jspecview/tree/SimpleTreeEnumeration.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -4,7 +4,7 @@ import jspecview.api.JSVTreeNode; -public class SimpleTreeEnumeration implements Enumeration { +public class SimpleTreeEnumeration implements Enumeration<JSVTreeNode> { SimpleTreeNode node; int pt; Modified: trunk/Jmol/src/jspecview/tree/SimpleTreeNode.java =================================================================== --- trunk/Jmol/src/jspecview/tree/SimpleTreeNode.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/jspecview/tree/SimpleTreeNode.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -3,8 +3,6 @@ import java.util.Enumeration; import javajs.util.Lst; - - import jspecview.api.JSVTreeNode; import jspecview.common.PanelNode; @@ -40,7 +38,8 @@ this.index = index; } - public Enumeration children() { + @Override + public Enumeration<JSVTreeNode> children() { return new SimpleTreeEnumeration(this); } Modified: trunk/Jmol/src/org/jmol/api/Interface.java =================================================================== --- trunk/Jmol/src/org/jmol/api/Interface.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/api/Interface.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -38,17 +38,7 @@ */ public static Object getInterface(String name, Viewer vwr, String state) { try { - Class<?> x = null; -// if (vwr.isJSApplet) { -// /** -// * @j2sNative -// * -// * x = Clazz._4Name (name, vwr && vwr.html5Applet, state); -// * -// */ -// } else { - x = Class.forName(name); -// } + Class<?> x = Class.forName(name); return (x == null ? null : x.newInstance()); } catch (Exception e) { Logger.error("Interface.java Error creating instance for " + name Modified: trunk/Jmol/src/org/jmol/modelkit/ModelKit.java =================================================================== --- trunk/Jmol/src/org/jmol/modelkit/ModelKit.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/modelkit/ModelKit.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -1304,7 +1304,7 @@ name = name.substring(4); } boolean isP1 = (name.equalsIgnoreCase("P1") || name.equals("1")); - boolean isDefined = (!isP1 && name.length() > 0); + boolean isDefined = (name.length() > 0); clearAtomConstraints(); try { if (bs != null && bs.isEmpty()) @@ -1338,7 +1338,7 @@ BS basis; Object sg = null; @SuppressWarnings("unchecked") - Map<String, Object> sgInfo = (noAtoms && !isDefined || isP1 ? null + Map<String, Object> sgInfo = (noAtoms && !isDefined ? null : (Map<String, Object>) vwr.findSpaceGroup(isDefined ? null : bsAtoms, isDefined ? (isITA ? "ITA/" + name : name) : null, sym.getUnitCellParams(), false, true)); if (sgInfo == null) { Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -2906,7 +2906,7 @@ public Lst<P3> generateCrystalClass(int atomIndex, P3 pt) { - SymmetryInterface sym = (atomIndex < 0 || atomIndex >= ac ? null + SymmetryInterface sym = (atomIndex < 0 || atomIndex >= ac ? vwr.getOperativeSymmetry() : at[atomIndex].getUnitCell()); boolean isRandom = (pt != null && Float.isNaN(pt.x)); return (sym == null ? new Lst<P3>() : sym Modified: trunk/Jmol/src/org/jmol/scriptext/CmdExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/scriptext/CmdExt.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -6480,9 +6480,8 @@ String s = vwr.assignSpaceGroup(bs, type, -1); if (e.doReport()) e.showString(s); - if (isPacked) { - int n = vwr.getModelkit(false).cmdAssignAddAtoms(null, null, - bsModelAtoms, "packed", e.fullCommand, false); + if (isPacked && !s.endsWith("!")) { + int n = vwr.getModelkit(false).cmdAssignAddAtoms(null, null, bsModelAtoms, "packed", e.fullCommand, false); if (e.doReport()) e.report(GT.i(GT.$("{0} atoms added"), n), false); } Modified: trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/symmetry/SpaceGroup.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -28,7 +28,6 @@ import java.util.Arrays; import java.util.Hashtable; import java.util.Map; -import java.util.Set; import org.jmol.api.SymmetryInterface; import org.jmol.util.Logger; @@ -71,8 +70,25 @@ * */ -class SpaceGroup { +class SpaceGroup implements Cloneable { + SpaceGroup cloneInfoTo(SpaceGroup sg0) { + try { + SpaceGroup sg = (SpaceGroup) clone(); + sg.operations = sg0.operations; + sg.finalOperations = sg0.finalOperations; + sg.xyzList = sg0.xyzList; + return sg; + } catch (CloneNotSupportedException e) { + return null; + } + } + + SymmetryOperation[] operations; + SymmetryOperation[] finalOperations; + SymmetryOperation[] allOperations; + Map<String, Integer> xyzList; + int index; boolean isSSG; @@ -96,14 +112,8 @@ String intlTableNumberExt; HallInfo hallInfo; int latticeParameter; - //char latticeCode = '\0'; - SymmetryOperation[] operations; - SymmetryOperation[] finalOperations; - SymmetryOperation[] allOperations; int operationCount; int latticeOp = -1; - Map<String, Integer> xyzList; - private int modDim; boolean doNormalize = true; @@ -935,7 +945,36 @@ return -1; } - private final static char determineUniqueAxis(float a, float b, float c, float alpha, float beta, float gamma) { + public void setIntlTableNumberFull(String name) { + intlTableNumberFull = name; + String[] parts = PT.split(name, ":"); + intlTableNumber = parts[0]; + intlTableNumberExt = (parts.length == 1 ? "" : parts[1]); + ambiguityType = '\0'; + if (intlTableNumberExt.length() > 0) { + char c = intlTableNumberExt.charAt(0); + if (intlTableNumberExt.equals("h") || intlTableNumberExt.equals("r")) { + ambiguityType = 't'; + axisChoice = intlTableNumberExt.charAt(0); + } else if (c == '1' || c == '2') { + ambiguityType = 'o'; + // originChoice = intlTableNumberExt.charAt(0); + } else if (intlTableNumberExt.length() <= 2 + || intlTableNumberExt.length() == 3 && c == '-' ) { // :a or :b3 + ambiguityType = 'a'; + uniqueAxis = intlTableNumberExt.charAt(c == '-' ? 1 : 0); + // Q: should we include :-a1 here? + // if (intlTableNumberExt.length() == 2) + // cellChoice = intlTableNumberExt.charAt(1); + } else if (intlTableNumberExt.contains("-")) { + ambiguityType = '-'; + // skip when searching for a group by name + // added 9/28/14 Jmol 14.3.7 + } + } + } + + private final static char determineUniqueAxis(float a, float b, float c, float alpha, float beta, float gamma) { if (a == b) return (b == c ? '\0' : 'c'); if (b == c) Modified: trunk/Jmol/src/org/jmol/symmetry/SpaceGroupFinder.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/SpaceGroupFinder.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/symmetry/SpaceGroupFinder.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -112,18 +112,38 @@ String name; BS basis; - if (setNew) { if (xyzList.toUpperCase().startsWith("ITA/")) { - xyzList = xyzList.substring(4); - if (xyzList.indexOf(".") < 0) + xyzList = PT.rep(xyzList.substring(4)," ",""); + boolean isJmolCode = (xyzList.indexOf(":") > 0); + int pt = xyzList.indexOf("."); + if (!isJmolCode && pt < 0 && PT.parseInt(xyzList) != Integer.MIN_VALUE) xyzList += ".1"; - @SuppressWarnings("unchecked") - Map<String, Object> sgdata = (Map<String, Object>) uc.getSpaceGroupJSON(vwr, "ITA", xyzList, 0); + Map<String, Object> sgdata = null; + Object o = uc + .getSpaceGroupJSON(vwr, "ITA", xyzList, 0); + if (o == null || o instanceof String) { + return null; + } + sgdata = (Map<String, Object>) o; + if (isJmolCode) { + name = xyzList; + Lst<Object> its = (Lst<Object>) sgdata.get("its"); + sgdata = null; + if (its == null) + return null; + for (int i = 0, c = its.size(); i < c; i++) { + Map<String, Object> setting = (Map<String, Object>) its.get(i); + if (name.equals(setting.get("itaFull"))) { + sgdata = setting; + break; + } + } if (sgdata == null) return null; + } else { name = (String) sgdata.get("itaFull"); + } boolean isKnown = (name.indexOf("?") < 0); - @SuppressWarnings("unchecked") Lst<Object> genPos = (Lst<Object>) sgdata.get("gp"); xyzList = ""; for (int i = 0, c = genPos.size(); i < c; i++) @@ -131,13 +151,20 @@ xyzList = xyzList.substring(1); sg = SpaceGroup.createSpaceGroupN(xyzList); sg.intlTableNumber = name; + SpaceGroup sgjmol = null; if (isKnown) { - SpaceGroup sgjmol = SpaceGroup.determineSpaceGroupNA(xyzList, null); - sg.intlTableNumberFull = (sgjmol == null ? name : sgjmol.intlTableNumberFull); + sgjmol = SpaceGroup.determineSpaceGroupNA(name, null); + if (sgjmol != null) { + sg = sgjmol.cloneInfoTo(sg); + } else { + sg.setIntlTableNumberFull(name); } + } + if (sgjmol == null) { String u =(String) sgdata.get("u"); - String tr = (String) sgdata.get("tr"); - sg.intlTableNumberExt = PT.rep(u, " ", "") + ";" + sgdata.get("sg") + "(" + tr + ")"; + String tr = (String) sgdata.get("tm"); + sg.intlTableNumberExt = PT.rep(u, " ", "") + ";" + sgdata.get("sg") + + "(" + tr + ")"; char axis = u.toLowerCase().charAt(0); if (isHexagonal(PT.parseInt(sg.intlTableNumber), null) && axis != 'r') axis = 'h'; @@ -151,7 +178,11 @@ break; } } - if (sg == null && (sg = SpaceGroup.determineSpaceGroupNA(xyzList, unitCellParams)) == null + } + if (setNew) { + if (sg == null + && (sg = SpaceGroup.determineSpaceGroupNA(xyzList, + unitCellParams)) == null && (sg = SpaceGroup.createSpaceGroupN(xyzList)) == null) return null; uc = createCompatibleUnitCell(sg, unitCellParams); @@ -164,7 +195,7 @@ loadData(vwr, this); if (xyzList != null) { Object ret = getGroupsWithOps(xyzList, unitCellParams, isAssign); - if (!isAssign) + if (!isAssign || ret == null) return ret; sg = (SpaceGroup) ret; uc.setUnitCell(unitCellParams, false); @@ -444,42 +475,103 @@ float[] params) { SymmetryInterface sym; int n = PT.parseInt(sg.intlTableNumber); - boolean isHexGroup = isHexagonal(n, null); - if (n <= 2 || - isHexGroup && (sg.axisChoice == 'r' ? SimpleUnitCell.isRhombohedral(params) : isHexagonal(-1, params))) { - // all set - } else if (isHexGroup) { - if (sg.axisChoice == 'r') - params = new float[] { params[0], params[0], params[0], 100, 100, 100 }; - else - params = new float[] { params[0], params[0], params[2], 90, 90, 120 }; - } else if (n >= 195){ - params = new float[] { params[0], params[0], params[0], 90, 90, 90 }; + + // make a, b, and c all distinct + + float a = params[0]; + float b = params[1]; + if (a > b) { + float d = a; + a = b; + b = d; + } + float c = params[2]; + boolean bcsame = approx0(b - c); + if (bcsame) + c = b * 1.5f; + boolean absame = approx0(a - b); + if (absame) + b = a * 1.2f; + boolean acsame = approx0(c - a); + if (acsame) + c = a * 1.1f; + + // make alpha, beta, and gamma all distinct + + float alpha = params[3]; + float beta = params[4]; + float gamma = params[5]; + if (approx0(alpha - 90)) { + alpha = 80; + } + if (approx0(beta - 90)) { + beta = 100; + } + if (approx0(gamma - 90)) { + gamma = 110; + } + if (alpha > beta) { + float d = alpha; + alpha = beta; + beta = d; + } + boolean albesame = approx0(alpha - beta); + boolean begasame = approx0(beta - gamma); + boolean algasame = approx0(gamma - alpha); + if (albesame) { + beta = alpha * 1.2f; + } + if (begasame) { + gamma = beta * 1.3f; + } + if (algasame) { + gamma = alpha * 1.4f; + } + if (isHexagonal(n, null)) { + b = a; + if (sg.axisChoice == 'r' ? SimpleUnitCell.isRhombohedral(params) + : isHexagonal(-1, params)) { + // nothing to do + } else if (sg.axisChoice == 'r') { + c = b = a; + if (alpha > 85 && alpha < 95) + alpha = 80; + gamma = beta = alpha; + } else { + alpha = beta = 90; + gamma = 120; + } + } else if (n >= 195) { // cubic - } else if (n >= 75){ + c = b = a; + alpha = beta = gamma = 90; + } else if (n >= 75) { // tetragonal - params = new float[] { params[0], params[0], params[2], 90, 90, 90 }; - } else if (n >= 16){ + b = a; + if (acsame) + c = a * 1.5f; + alpha = beta = gamma = 90; + } else if (n >= 16) { // orthorhombic - params = new float[] { params[0], params[1], params[2], 90, 90, 90 }; - } else { + alpha = beta = gamma = 90; + } else if (n >= 3) { // monoclinic switch (sg.uniqueAxis) { case 'a': - params = new float[] { params[0], params[1], params[1], 90, params[4], params[5] }; + c = b; + beta = gamma = 90; break; case 'b': - params = new float[] { params[0], params[1], params[0], params[3], 90, params[5] }; + c = a; + alpha = gamma = 90; break; case 'c': - params = new float[] { params[0], params[0], params[0],params[3], params[4], 90 }; + b = a; + alpha = beta = 90; break; - default: - // nothing to do - break; } } - sym = new Symmetry().setUnitCell(params, false); + sym = new Symmetry().setUnitCell(new float[] { a, b, c, alpha, beta, gamma }, false); sym.setSpaceGroupTo(sg); return sym; } Modified: trunk/Jmol/src/org/jmol/symmetry/Symmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/symmetry/Symmetry.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -905,8 +905,12 @@ } } } - for (int j = lst.size(); --j >= 0;) - unitCell.toCartesian(lst.get(j), true); // ignoreOffset + for (int j = lst.size(); --j >= 0;) { + pt = lst.get(j); + if (isRandom) + pt.scale(0.5f); + unitCell.toCartesian(pt, true); // ignoreOffset + } } return lst; } @@ -1192,6 +1196,9 @@ private static Map<String, Object> aflowStructures; private static Map<String, Object>[] itaData; + private static Lst<Object> allDataITA; + private static Lst<Object> listDataITA; + @SuppressWarnings("unchecked") @Override public Object getSpaceGroupJSON(Viewer vwr, String name, String sgname, @@ -1217,13 +1224,21 @@ throw new ArrayIndexOutOfBoundsException(itno); if (name.equalsIgnoreCase("ITA")) { if (itno == 0) { - return getResource(vwr, "sg/json/ita_all.json"); + if (allDataITA == null) + allDataITA = (Lst<Object>) getResource(vwr, "sg/json/ita_all.json"); + return allDataITA; } + if (itno == Integer.MIN_VALUE) { + if (listDataITA == null) + listDataITA = (Lst<Object>) getResource(vwr, "sg/json/ita_list.json"); + if (itno == 0) + return allDataITA; + } if (itaData == null) itaData = new Map[230]; Map<String, Object> resource = itaData[itno - 1]; if (resource == null) - itaData[itno - 1] = resource = getResource(vwr, + itaData[itno - 1] = resource = (Map<String, Object>) getResource(vwr, "sg/json/ita_" + itno + ".json"); if (resource != null) { if (index == 0) @@ -1244,7 +1259,7 @@ } } else if (name.equalsIgnoreCase("AFLOW") && tm == null) { if (aflowStructures == null) - aflowStructures = getResource(vwr, "sg/json/aflow_structures.json"); + aflowStructures = (Map<String, Object>) getResource(vwr, "sg/json/aflow_structures.json"); if (itno == 0) return aflowStructures; System.out.println(sgname + " ? " + index); @@ -1260,13 +1275,13 @@ } @SuppressWarnings("unchecked") - private Map<String, Object> getResource(Viewer vwr, String resource) { + private Object getResource(Viewer vwr, String resource) { try { BufferedReader r = FileManager.getBufferedReaderForResource(vwr, this, "org/jmol/symmetry/", resource); String[] data = new String[1]; if (Rdr.readAllAsString(r, Integer.MAX_VALUE, false, data, 0)) { - return (Map<String, Object>) new JSJSONParser().parse(data[0], true); + return new JSJSONParser().parse(data[0], true); } } catch (Throwable e) { System.err.println(e.getMessage()); Modified: trunk/Jmol/src/org/jmol/util/JSONWriter.java =================================================================== --- trunk/Jmol/src/org/jmol/util/JSONWriter.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/util/JSONWriter.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -76,12 +76,14 @@ writeBoolean((Boolean) o); } else if (o instanceof Number) { writeNumber((Number) o); - } else if (o.getClass().isArray()) { - writeArray(o); } else if (o instanceof SV) { append(((SV) o).toJSON()); } else { - writeString(o.toString()); +// if (o.getClass().isArray()) { +// writeArray(o); +// } else { + writeString(o.toString()); + // } } } Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2023-11-26 00:37:23 UTC (rev 22595) @@ -57,8 +57,12 @@ Jmol.___JmolVersion="16.1.47" // (legacy) also 16.1.48 (swingJS) +bug fix: MODELKIT SPACEGROUP ... for no-atom structure does not properly set unit cell lengths + bug fix: LOAD ==HEM (PDB ligand) loading broken in 16.1.45 (2023.11.06) +bug fix: LOAD =ams/quartz broken in 16.1.45 + bug fix: CIFReader may misread incommensurately modulated files that have multiple structures bug fix: SCALE maximum length 1/2 what it should be with set antialiasDisplay off Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2023-11-26 00:37:23 UTC (rev 22595) @@ -4926,8 +4926,8 @@ try { int pt = id.indexOf("/"); String database = id.substring(0, pt); + id = id.substring(pt + 1); if (database.equalsIgnoreCase("aflowlib")) { - id = id.substring(pt + 1); int index = 1; pt = id.indexOf('.'); if (pt >= 0) { Modified: trunk/Jmol/test/jmol-jar/Jmol.jar =================================================================== (Binary files differ) Added: trunk/Jmol/unused/Jmol-j2s-site2.zip =================================================================== (Binary files differ) Index: trunk/Jmol/unused/Jmol-j2s-site2.zip =================================================================== --- trunk/Jmol/unused/Jmol-j2s-site2.zip 2023-11-23 06:01:40 UTC (rev 22594) +++ trunk/Jmol/unused/Jmol-j2s-site2.zip 2023-11-26 00:37:23 UTC (rev 22595) Property changes on: trunk/Jmol/unused/Jmol-j2s-site2.zip ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-11-23 06:01:42
|
Revision: 22594 http://sourceforge.net/p/jmol/code/22594 Author: hansonr Date: 2023-11-23 06:01:40 +0000 (Thu, 23 Nov 2023) Log Message: ----------- IMPORTANT!!! New transpiler for legacy 4.2 transpiling of Jmol/SourceForge See j2s/README.TXT for details To build, just run the build-n-xxx.xml ANT tasks in order. The first has an option to not delete the site/ directory for making changes in the JavaScript side of things -- site-resources or site-resources-zip -- AFTER compiling Jmol. Note that .js files are compiled straight to the site/jsmol/j2s directory, so it should be possible to change Jmol and immediately test in JavaScript. Modified Paths: -------------- trunk/Jmol/j2s/j2s.core.jar trunk/Jmol/j2s/j2s.core_5.0.1.jar Modified: trunk/Jmol/j2s/j2s.core.jar =================================================================== (Binary files differ) Modified: trunk/Jmol/j2s/j2s.core_5.0.1.jar =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-11-20 04:29:13
|
Revision: 22592 http://sourceforge.net/p/jmol/code/22592 Author: hansonr Date: 2023-11-20 04:29:10 +0000 (Mon, 20 Nov 2023) Log Message: ----------- New transpiler -- allows Java8 syntax - switch(String) and try(resource) Modified Paths: -------------- trunk/Jmol/j2s/j2s.core_5.0.1.jar Added Paths: ----------- trunk/Jmol/j2s/j2s.core.jar trunk/Jmol/unused/j2s.core_5.0.1.jar Added: trunk/Jmol/j2s/j2s.core.jar =================================================================== (Binary files differ) Index: trunk/Jmol/j2s/j2s.core.jar =================================================================== --- trunk/Jmol/j2s/j2s.core.jar 2023-11-20 04:26:07 UTC (rev 22591) +++ trunk/Jmol/j2s/j2s.core.jar 2023-11-20 04:29:10 UTC (rev 22592) Property changes on: trunk/Jmol/j2s/j2s.core.jar ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Modified: trunk/Jmol/j2s/j2s.core_5.0.1.jar =================================================================== (Binary files differ) Copied: trunk/Jmol/unused/j2s.core_5.0.1.jar (from rev 22585, trunk/Jmol/j2s/j2s.core_5.0.1.jar) =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-11-20 04:26:10
|
Revision: 22591 http://sourceforge.net/p/jmol/code/22591 Author: hansonr Date: 2023-11-20 04:26:07 +0000 (Mon, 20 Nov 2023) Log Message: ----------- New transpiler -- allows Java8 syntax - switch(String) and try(resource) Modified Paths: -------------- trunk/Jmol/.j2sjmol trunk/Jmol/site-resources-zip/Jmol-j2s-site.zip Modified: trunk/Jmol/.j2sjmol =================================================================== --- trunk/Jmol/.j2sjmol 2023-11-17 19:05:45 UTC (rev 22590) +++ trunk/Jmol/.j2sjmol 2023-11-20 04:26:07 UTC (rev 22591) @@ -1,6 +1,6 @@ #Java2Script Configuration #Wed Nov 08 16:22:00 CST 2023 -j2s.excluded.paths=AWT,JNI,application,Test,multitouch,molecularplayground,openscience,awt/,translation/Jmol/,java/,org/jmol/BasicDnD,org/jmol/Export,org/jmol/Integration,org/jmol/JmolTable,org/jmol/util/JUnitLogger,org/jmol/util/PerformanceMeasure,org/jmol/util/Profiling,console/App,console/Img,console/Jmol,console/Key,console/Script +j2s.excluded.paths=AWT,JNI,application,Test,multitouch,molecularplayground,openscience,awt/,translation/Jmol/,/java/,org/jmol/BasicDnD,org/jmol/Export,org/jmol/Integration,org/jmol/JmolTable,org/jmol/util/JUnitLogger,org/jmol/util/PerformanceMeasure,org/jmol/util/Profiling,console/App,console/Img,console/Jmol,console/Key,console/Script j2s.site.directory=site j2s.string.fixes=jspecview,JSV,org.jmol.minimize.forcefield,JM.FF,org.jmol.minimize,JM,org.jmol.modelsetbio,JM,org.jmol.modelset,JM,org.jmol.awtjs.swing,JS,org.jmol.scriptext,JS,org.jmol.script,JS,org.jmol.smiles,JS,org.jmol.symmetry,JS,javajs.util,JU,com.jcraft.jzlib,JU,javajs.util,JU,org.jmol.util,JU,org.jmol.viewer,JV,org.jmol,J,org/jmol/minimize/forcefield,JM/FF,org/jmol/symmetry,JS,org/jmol/util,JU,org/jmol/,J/ j2s.package.fixes=org/jmol/minimize/forcefield,JM/FF,org/jmol/minimize,JM,org/jmol/modelsetbio,JM,org/jmol/modelset,JM,org/jmol/awtjs/swing,JS,org/jmol/scriptext,JS,org/jmol/script,JS,org/jmol/smiles,JS,org/jmol/symmetry,JS,org/jmol/util,JU,javajs/util,JU,com/jcraft/jzlib,JU,org/jmol/viewer,JV,jspecview,JSV,org/jmol,J Modified: trunk/Jmol/site-resources-zip/Jmol-j2s-site.zip =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ha...@us...> - 2023-11-14 20:11:09
|
Revision: 22588 http://sourceforge.net/p/jmol/code/22588 Author: hansonr Date: 2023-11-14 20:11:07 +0000 (Tue, 14 Nov 2023) Log Message: ----------- updated build for java2script 5.0.1 .j2sjmol transpiler Modified Paths: -------------- trunk/Jmol/build-1-unzip-jsmol-to-site.xml trunk/Jmol/site-resources-zip/jsmol_dev.zip Modified: trunk/Jmol/build-1-unzip-jsmol-to-site.xml =================================================================== --- trunk/Jmol/build-1-unzip-jsmol-to-site.xml 2023-11-14 19:36:21 UTC (rev 22587) +++ trunk/Jmol/build-1-unzip-jsmol-to-site.xml 2023-11-14 20:11:07 UTC (rev 22588) @@ -9,6 +9,9 @@ <target name="jsmol-to-site" id="jsmol-to-site"> + <echo>Deleting the site directory.</echo> + <delete quiet="true" dir="${site.dir}" /> + <!-- <for ...> construct needs ant-contrib.jar --> <taskdef resource="net/sf/antcontrib/antlib.xml"> Modified: trunk/Jmol/site-resources-zip/jsmol_dev.zip =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |