|
From: <ha...@us...> - 2025-08-08 09:46:53
|
Revision: 22675
http://sourceforge.net/p/jmol/code/22675
Author: hansonr
Date: 2025-08-08 09:46:51 +0000 (Fri, 08 Aug 2025)
Log Message:
-----------
Jmol.___JmolVersion="16.3.33" // (legacy) also 16.3.34 (swingJS)
bug fix (legacy only): PyMOL putty rendering broken in 16.3.15 (2025.04.10)
bug fix (JSpecView, for IUPAC FAIRSpec only): JDX header delivery incomplete
new feature: format("STRING", ";base64,MSwyLWJpcygzLWNobG9yby00LDUtZGltZXRob3h5cGhlbnlsKWV0aGFuZS56aXA=")
-- decodes base64 string
-- in this case, giving "1,2-bis(3-chloro-4,5-dimethoxyphenyl)ethane.zip"
Modified Paths:
--------------
trunk/Jmol/j2s/timestamp
trunk/Jmol/src/jspecview/source/BrukerReader.java
trunk/Jmol/src/jspecview/source/JDXHeader.java
trunk/Jmol/src/jspecview/source/JDXReader.java
trunk/Jmol/src/jspecview/source/JDXSource.java
trunk/Jmol/src/jspecview/source/JDXSourceStreamTokenizer.java
trunk/Jmol/src/jspecview/source/XMLReader.java
trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.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/script/SV.java
trunk/Jmol/src/org/jmol/scriptext/MathExt.java
trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java
trunk/Jmol/src/org/jmol/viewer/Jmol.properties
Modified: trunk/Jmol/j2s/timestamp
===================================================================
--- trunk/Jmol/j2s/timestamp 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/j2s/timestamp 2025-08-08 09:46:51 UTC (rev 22675)
@@ -1 +1 @@
-20250721085807
+20250724191407
Modified: trunk/Jmol/src/jspecview/source/BrukerReader.java
===================================================================
--- trunk/Jmol/src/jspecview/source/BrukerReader.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/jspecview/source/BrukerReader.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -14,10 +14,10 @@
import javajs.J2SIgnoreImport;
import javajs.util.BinaryDocument;
-import javajs.util.Lst;
import javajs.util.Rdr;
import jspecview.common.Coordinate;
import jspecview.common.Spectrum;
+import jspecview.source.JDXHeader.DataLDRTable;
/**
* A class to read Bruker ZIP files and directories. The first acqus file found
@@ -82,7 +82,6 @@
String title = null;
out: while ((ze = zis.getNextEntry()) != null) {
String zeName = ze.getName();
- System.out.println(zeName);
int pt = zeName.lastIndexOf('/');
String zeShortName = zeName.substring(pt + 1);
if (root == null) {
@@ -107,7 +106,7 @@
data2rr = getBytes(zis, (int) ze.getSize(), false);
} else if (zeShortName.equals("proc2s") || zeShortName.equals("acqu2s")) {
JDXReader.getHeaderMapS(new ByteArrayInputStream(
- getBytes(zis, (int) ze.getSize(), false)), map, "_2");
+ getBytes(zis, (int) ze.getSize(), false)), map, 0, "_2");
} else if (zeShortName.equals("procs")
|| (isacq = zeShortName.equals("acqus"))) {
if (isacq) {
@@ -172,7 +171,7 @@
if (!f.exists())
return;
InputStream is = new FileInputStream(f);
- JDXReader.getHeaderMapS(is, map, suffix);
+ JDXReader.getHeaderMapS(is, map, 0, suffix);
is.close();
}
@@ -233,7 +232,7 @@
private void setSource(double[] datar, double[] datai,
Map<String, String> map, JDXSource source,
boolean is2D) {
- Lst<String[]> LDRTable = new Lst<String[]>();
+ DataLDRTable myLDRTable = new DataLDRTable();
Spectrum spectrum0 = new Spectrum();
spectrum0.setTitle(map.get("##TITLE"));
@@ -260,13 +259,13 @@
double shift = ref - sw;
String solvent = cleanJDXValue(map.get("##$SOLVENT"));
String shiftType = "INTERNAL";
- JDXReader.addHeader(LDRTable, "##.SHIFTREFERENCE",
+ myLDRTable.addHeader("##.SHIFTREFERENCE",
shiftType + ", " + solvent + ", 1, " + ref);
- JDXReader.addHeader(LDRTable, "##.OBSERVEFREQUENCY", "" + freq);
- JDXReader.addHeader(LDRTable, "##.OBSERVENUCLEUS", nuc1);
- JDXReader.addHeader(LDRTable, "##SPECTROMETER/DATA SYSTEM",
+ myLDRTable.addHeader("##.OBSERVEFREQUENCY", "" + freq);
+ myLDRTable.addHeader("##.OBSERVENUCLEUS", nuc1);
+ myLDRTable.addHeader("##SPECTROMETER/DATA SYSTEM",
cleanJDXValue(map.get("##$INSTRUM")));
- spectrum0.setHeaderTable(LDRTable);
+ spectrum0.setHeaderTable(myLDRTable.table);
spectrum0.setObservedNucleus(nuc1);
spectrum0.setObservedFreq(freq);
@@ -432,7 +431,10 @@
private byte[] getBytes(InputStream in, int len, boolean andClose) {
try {
- return Rdr.getLimitedStreamBytes(in, len);
+ byte[] bytes = Rdr.getLimitedStreamBytes(in, len);
+ if (andClose)
+ in.close();
+ return bytes;
} catch (Exception e) {
}
return new byte[0];
Modified: trunk/Jmol/src/jspecview/source/JDXHeader.java
===================================================================
--- trunk/Jmol/src/jspecview/source/JDXHeader.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/jspecview/source/JDXHeader.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -1,5 +1,8 @@
package jspecview.source;
+import java.util.Hashtable;
+import java.util.Map;
+
import javajs.util.Lst;
/**
@@ -220,6 +223,33 @@
// Table of header variables specific to the jdx source or spectrum
protected Lst<String[]> headerTable = new Lst<String[]>();
+ public static class DataLDRTable {
+ Lst<String[]> table;
+ Map<String, Integer> map;
+
+
+ public DataLDRTable() {
+ table = new Lst<String[]>();
+ map = new Hashtable<String, Integer>();
+ }
+
+ public void addHeader(String label, String value) {
+ Integer pt = map.get(label);
+ if (pt == null) {
+ pt = Integer.valueOf(table.size());
+ table.addLast(new String[] { label, value, JDXSourceStreamTokenizer.cleanLabel(label) });
+ map.put(label, pt);
+ } else {
+ String[] entry = table.get(pt.intValue());
+ entry[1] = value;
+ }
+ }
+
+
+
+ }
+
+
/**
* Sets the headerTable for this Source or spectrum
*
Modified: trunk/Jmol/src/jspecview/source/JDXReader.java
===================================================================
--- trunk/Jmol/src/jspecview/source/JDXReader.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/jspecview/source/JDXReader.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -48,6 +48,7 @@
import jspecview.common.PeakInfo;
import jspecview.common.Spectrum;
import jspecview.exception.JSVException;
+import jspecview.source.JDXHeader.DataLDRTable;
/**
* <code>JDXFileReader</code> reads JDX data, including complex BLOCK files that
@@ -74,6 +75,8 @@
"PEAKTABLE XYDATA XYPOINTS",
" (XY..XY) (X++(Y..Y)) (XY..XY) " };
+ private String mnovaParamValue;
+
public static String getVarList(String dataClass) {
int index = VAR_LIST_TABLE[0].indexOf(dataClass);
return VAR_LIST_TABLE[1].substring(index + 1, index+12).trim();
@@ -144,13 +147,23 @@
}
public static Map<String, String> getHeaderMap(InputStream in, Map<String, String> map) throws Exception {
- return getHeaderMapS(in, map, null);
+ return getHeaderMapS(in, map, -1, null);
}
- public static Map<String, String> getHeaderMapS(InputStream in, Map<String, String> map, String suffix) throws Exception {
+ /**
+ *
+ * @param in
+ * @param map may be null
+ * @param index >= 0 for nth block; -1 for "last block"
+ * @param suffix
+ * @return map
+ * @throws Exception
+ */
+ public static Map<String, String> getHeaderMapS(InputStream in, Map<String, String> map, int index, String suffix) throws Exception {
+ Spectrum source = createJDXSource(null, in, null, false, false, 0, -1, 0).getJDXSpectrum(index);
+ Lst<String[]> hlist = source.headerTable;
if (map == null)
map = new LinkedHashMap<String, String>();
- Lst<String[]> hlist = createJDXSource(null, in, null, false, false, 0, -1, 0).getJDXSpectrum(0).headerTable;
for (int i = 0, n = hlist.size(); i < n; i++) {
String[] h = hlist.get(i);
// element [2] is the cleaned LABEL
@@ -314,21 +327,21 @@
logError(
"Warning - file is a concatenation without LINK record -- does not conform to JCAMP-DX standard 6.1.3!");
Spectrum spectrum = new Spectrum();
- Lst<String[]> dataLDRTable = new Lst<String[]>();
+ DataLDRTable dataLDRTable = new DataLDRTable();
if (isHeaderOnly)
- spectrum.setHeaderTable(dataLDRTable);
+ spectrum.setHeaderTable(dataLDRTable.table);
while (!done && (label = t.getLabel()) != null
&& (value = getValue(label)) != null) {
if (isTabularData) {
+ if (isHeaderOnly) {
+ dataLDRTable.addHeader(t.rawLabel, "<data>");
+ break;
+ }
processTabularData(spectrum, dataLDRTable, label, isHeaderOnly);
addSpectrum(spectrum, false);
if (isSimulation && spectrum.getXUnits().equals("PPM"))
spectrum.setHZtoPPM(true);
spectrum = null;
- if (isHeaderOnly) {
- addHeader(dataLDRTable, t.rawLabel, "<data>");
- break;
- }
continue;
}
if (!isHeaderOnly) {
@@ -361,7 +374,7 @@
return source;
}
- private void processLabel(Spectrum spectrum, Lst<String[]> dataLDRTable,
+ private void processLabel(Spectrum spectrum, DataLDRTable dataLDRTable,
String label, String value, boolean isHeaderOnly)
throws JSVException {
// when reading the header only (for example, as a plugin for
@@ -370,7 +383,21 @@
if (!readDataLabel(spectrum, label, value, errorLog, obscure, isHeaderOnly)
&& !isHeaderOnly)
return;
- addHeader(dataLDRTable, t.rawLabel, value);
+ if (mnovaParamValue != null) {
+ // ##$PARAMETER FILE= (uxnmr.par, ASCII, /private/var/folders/f6/rjf_tdyn2v98c5c0wvkgn4s80000gn/T/ICmhQgkvR4K3GNzOG$oINA/41/uxnmr.par, 0)
+ int pt;
+ if (value.startsWith("(") && (pt = value.indexOf(',')) >= 0) {
+ String key = value.substring(1, pt).trim();
+ pt = value.indexOf(')', pt + 1);
+ if (pt > 0) {
+ value = value.substring(pt + 1).trim();
+ }
+ dataLDRTable.addHeader(key, value);
+ }
+ mnovaParamValue = null;
+ } else {
+ dataLDRTable.addHeader(t.rawLabel, value);
+ }
if (!isHeaderOnly)
checkCustomTags(spectrum, label, value);
}
@@ -468,7 +495,7 @@
* @return source
* @throws JSVException
*/
- private JDXSource getBlockSpectra(Lst<String[]> sourceLDRTable)
+ private JDXSource getBlockSpectra(DataLDRTable sourceLDRTable)
throws JSVException {
Logger.debug("--JDX block start--");
@@ -479,7 +506,7 @@
while ((label = t.getLabel()) != null && !label.equals("##TITLE")) {
value = getValue(label);
if (isNew && !readHeaderLabel(source, label, value, errorLog, obscure))
- addHeader(sourceLDRTable, t.rawLabel, value);
+ sourceLDRTable.addHeader(t.rawLabel, value);
if (label.equals("##BLOCKS")) {
int nBlocks = PT.parseInt(value);
if (nBlocks > 100 && firstSpec <= 0)
@@ -491,12 +518,11 @@
if (!"##TITLE".equals(label))
throw new JSVException("Unable to read block source");
if (isNew)
- source.setHeaderTable(sourceLDRTable);
+ source.setHeaderTable(sourceLDRTable.table);
source.type = JDXSource.TYPE_BLOCK;
source.isCompoundSource = true;
- Lst<String[]> dataLDRTable;
Spectrum spectrum = new Spectrum();
- dataLDRTable = new Lst<String[]>();
+ DataLDRTable dataLDRTable = new DataLDRTable();
readDataLabel(spectrum, label, value, errorLog, obscure, false);
try {
String tmp;
@@ -532,7 +558,7 @@
break;
if (spectrum == null) {
spectrum = new Spectrum();
- dataLDRTable = new Lst<String[]>();
+ dataLDRTable = new DataLDRTable();
if (label == "")
continue;
if (label == null) {
@@ -547,7 +573,7 @@
&& !addSpectrum(spectrum, forceSub))
return source;
spectrum = new Spectrum();
- dataLDRTable = new Lst<String[]>();
+ dataLDRTable = new DataLDRTable();
continue;
}
processLabel(spectrum, dataLDRTable, label, value, false);
@@ -594,7 +620,7 @@
* @return source
*/
@SuppressWarnings("null")
- private JDXSource getNTupleSpectra(Lst<String[]> sourceLDRTable,
+ private JDXSource getNTupleSpectra(DataLDRTable sourceLDRTable,
JDXDataObject spectrum0, String label)
throws JSVException {
double[] minMaxY = new double[] { Double.MAX_VALUE, Double.MIN_VALUE };
@@ -614,7 +640,7 @@
if (isNew) {
source.type = JDXSource.TYPE_NTUPLE;
source.isCompoundSource = true;
- source.setHeaderTable(sourceLDRTable);
+ source.setHeaderTable(sourceLDRTable.table);
}
// Read NTuple Table
@@ -676,11 +702,11 @@
}
}
- Lst<String[]> dataLDRTable = new Lst<String[]>();
- spectrum.setHeaderTable(dataLDRTable);
+ DataLDRTable dataLDRTable = new DataLDRTable();
+ spectrum.setHeaderTable(dataLDRTable.table);
while (!label.equals("##DATATABLE")) {
- addHeader(dataLDRTable, t.rawLabel, t.getValue());
+ dataLDRTable.addHeader(t.rawLabel, t.getValue());
label = t.getLabel();
}
@@ -714,12 +740,12 @@
spectrum0.freq2dX = spectrum.freq2dX;
spectrum0.freq2dY = spectrum.freq2dY;
spectrum0.y2DUnits = spectrum.y2DUnits;
- for (int i = 0; i < sourceLDRTable.size(); i++) {
- String[] entry = sourceLDRTable.get(i);
+ for (int i = 0, n = sourceLDRTable.table.size(); i < n; i++) {
+ String[] entry = sourceLDRTable.table.get(i);
String key = JDXSourceStreamTokenizer.cleanLabel(entry[0]);
if (!key.equals("##TITLE") && !key.equals("##DATACLASS")
&& !key.equals("##NTUPLES"))
- dataLDRTable.addLast(entry);
+ dataLDRTable.table.addLast(entry);
}
if (isOK)
addSpectrum(spectrum, !isFirst);
@@ -833,6 +859,7 @@
try {
srt.nextToken();
srt.nextToken();
+ // np-nmr JDX has a float here
int pt = (int) Float.parseFloat(srt.nextToken().trim());
double shift = parseAFFN(label, srt.nextToken().trim());
spectrum.setShiftReference(shift, pt,
@@ -845,22 +872,15 @@
}
}
- private static boolean readHeaderLabel(JDXHeader jdxHeader, String label,
+ private boolean readHeaderLabel(JDXHeader jdxHeader, String label,
String value, SB errorLog,
boolean obscure) {
- switch (("##TITLE###" +
- "##JCAMPDX#" +
- "##ORIGIN##" +
- "##OWNER###" +
- "##DATATYPE" +
- "##LONGDATE" +
- "##DATE####" +
- "##TIME####").indexOf(label + "#")) {
- case 0:
+ switch (label) {
+ case "##TITLE":
jdxHeader.setTitle(obscure || value == null || value.equals("") ? "Unknown"
: value);
return false;
- case 10:
+ case "##JCAMPDX":
jdxHeader.jcampdx = value;
float version = PT.parseFloat(value);
if (version >= 6 || Float.isNaN(version)) {
@@ -867,28 +887,31 @@
if (errorLog != null)
errorLog
.append("Warning: JCAMP-DX version may not be fully supported: "
- + value);
+ + value + "\n");
}
return false;
- case 20:
+ case "##ORIGIN":
jdxHeader.origin = (value != null && !value.equals("") ? value
: "Unknown");
return false;
- case 30:
+ case "##OWNER":
jdxHeader.owner = (value != null && !value.equals("") ? value : "Unknown");
return false;
- case 40:
+ case "##DATATYPE":
jdxHeader.dataType = value;
return false;
- case 50:
+ case "##LONGDATE":
jdxHeader.longDate = value;
return false;
- case 60:
+ case "##DATE":
jdxHeader.date = value;
return false;
- case 70:
+ case "##TIME":
jdxHeader.time = value;
return false;
+ case "##$PARAMETERFILE":
+ mnovaParamValue = value;
+ return false;
}
return true;
}
@@ -909,10 +932,10 @@
// }
}
- private void processTabularData(JDXDataObject spec, Lst<String[]> table, String label, boolean isHeaderOnly)
+ private void processTabularData(JDXDataObject spec, DataLDRTable table, String label, boolean isHeaderOnly)
throws JSVException {
setTabularDataType(spec, label);
- spec.setHeaderTable(table);
+ spec.setHeaderTable(table.table);
if (spec.dataClass.equals("XYDATA")) {
spec.checkJDXRequiredTokens();
if (!isHeaderOnly)
@@ -1090,17 +1113,6 @@
}
- public static void addHeader(Lst<String[]> table, String label, String value) {
- String[] entry = null;
- for (int i = 0; i < table.size(); i++)
- if ((entry = table.get(i))[0].equals(label)) {
- entry[1] = value;
- return;
- }
- table.addLast(new String[] { label, value, JDXSourceStreamTokenizer.cleanLabel(label) });
- }
-
-
////// JCAMP-DX/MOL reading //////
private boolean checkCustomTags(Spectrum spectrum, String label,
Modified: trunk/Jmol/src/jspecview/source/JDXSource.java
===================================================================
--- trunk/Jmol/src/jspecview/source/JDXSource.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/jspecview/source/JDXSource.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -76,7 +76,9 @@
* @return the Spectrum at a given index in the list
*/
public Spectrum getJDXSpectrum(int index) {
- return (jdxSpectra.size() <= index ? null : jdxSpectra.get(index));
+ if (index < 0)
+ index += jdxSpectra.size();
+ return (jdxSpectra.size() <= index ? null : jdxSpectra.get(index));
}
/**
Modified: trunk/Jmol/src/jspecview/source/JDXSourceStreamTokenizer.java
===================================================================
--- trunk/Jmol/src/jspecview/source/JDXSourceStreamTokenizer.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/jspecview/source/JDXSourceStreamTokenizer.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -116,6 +116,8 @@
public static String cleanLabel(String label) {
if (label == null)
return null;
+ if (!label.startsWith("#"))
+ return label;
int i;
SB str = new SB();
Modified: trunk/Jmol/src/jspecview/source/XMLReader.java
===================================================================
--- trunk/Jmol/src/jspecview/source/XMLReader.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/jspecview/source/XMLReader.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -22,16 +22,13 @@
import java.io.BufferedReader;
import java.io.IOException;
-import javajs.util.Lst;
-import javajs.util.SB;
-
-
-
import org.jmol.util.Logger;
+import javajs.util.SB;
import jspecview.api.SourceReader;
import jspecview.common.Coordinate;
import jspecview.common.Spectrum;
+import jspecview.source.JDXHeader.DataLDRTable;
/**
* Representation of a XML Source.
@@ -105,7 +102,7 @@
// end of import of CML document
// now populate all the JSpecView spectrum variables.....
- Lst<String[]> LDRTable = new Lst<String[]>();
+ DataLDRTable myLDRTable = new DataLDRTable();
Spectrum spectrum = new Spectrum();
spectrum.setTitle(title);
@@ -127,22 +124,22 @@
// syntax is:
// JDXFileReader.addHeader(LDRTable, )
// Key kk = new Key;
- JDXReader.addHeader(LDRTable, "##PATHLENGTH", pathlength);
- JDXReader.addHeader(LDRTable, "##RESOLUTION", resolution);
+ myLDRTable.addHeader("##PATHLENGTH", pathlength);
+ myLDRTable.addHeader("##RESOLUTION", resolution);
if (!strObFreq.equals(""))
- JDXReader.addHeader(LDRTable, "##.OBSERVEFREQUENCY", strObFreq);
+ myLDRTable.addHeader("##.OBSERVEFREQUENCY", strObFreq);
if (!obNucleus.equals(""))
- JDXReader.addHeader(LDRTable, "##.OBSERVENUCLEUS", obNucleus);
- JDXReader.addHeader(LDRTable, "##$MANUFACTURER", vendor);
+ myLDRTable.addHeader("##.OBSERVENUCLEUS", obNucleus);
+ myLDRTable.addHeader("##$MANUFACTURER", vendor);
if (!casRN.equals(""))
- JDXReader.addHeader(LDRTable, "##CASREGISTRYNO", casRN);
+ myLDRTable.addHeader("##CASREGISTRYNO", casRN);
if (!molForm.equals(""))
- JDXReader.addHeader(LDRTable, "##MOLFORM", molForm);
+ myLDRTable.addHeader("##MOLFORM", molForm);
if (!modelType.equals(""))
- JDXReader.addHeader(LDRTable, "##SPECTROMETER/DATA SYSTEM", modelType);
+ myLDRTable.addHeader("##SPECTROMETER/DATA SYSTEM", modelType);
//etc etc.
- spectrum.setHeaderTable(LDRTable);
+ spectrum.setHeaderTable(myLDRTable.table);
double xScale = 1; // NMR data stored internally as ppm
if (obFreq != JDXDataObject.ERROR) {
@@ -281,6 +278,7 @@
/**
* Process the audit XML events
+ *
* @param tagId
* @param requiresEndTag
*/
@@ -312,7 +310,8 @@
return;
}
} catch (Exception e) {
- String msg = "error reading " + tagName + " section: " + e + "\n" + e.getStackTrace();
+ String msg = "error reading " + tagName + " section: " + e + "\n"
+ + e.getStackTrace();
Logger.error(msg);
errorLog.append(msg + "\n");
}
Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/JmolObject.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -235,7 +235,7 @@
switch (shape) {
case JC.SHAPE_CGO:
Map<String, Object> map = new Hashtable<>();
- map.put("mesh_width", Double.valueOf(pymolScene.getDefaultFloat(PyMOL.mesh_width)));
+ map.put("mesh_width", Double.valueOf(pymolScene.getDefaultDouble(PyMOL.mesh_width)));
map.put("info", info);
sm.vwr.setCGO(map);
break;
Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLReader.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -1272,7 +1272,7 @@
if (a.size() > 46)
anisou = floatsAt(a, 41, new float[8], 6);
}
- double v = pymolScene.getUniqueFloatDef(uniqueID, PyMOL.valence);
+ double v = pymolScene.getUniqueDoubleDef(uniqueID, PyMOL.valence);
if (forceValence || v == 1) {
bsValence.set(apt);
}
@@ -1335,7 +1335,7 @@
if (anisou != null && anisou[0] != 0)
asc.setAnisoBorU(atom, anisou, 12);
pymolScene.setAtomColor(atomColor);
- if (pymolScene.getUniqueFloatDef(uniqueID, PyMOL.valence) == 1) {
+ if (pymolScene.getUniqueDoubleDef(uniqueID, PyMOL.valence) == 1) {
bsValence.set(apt);
}
Modified: trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java
===================================================================
--- trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/org/jmol/adapter/readers/pymol/PyMOLScene.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -304,16 +304,16 @@
private double[] sceneSettings;
- double getDefaultFloat(int key) {
- return floatSetting(key);
+ double getDefaultDouble(int key) {
+ return doubleSetting(key);
}
int getDefaultInt(int key) {
- return (int) getDefaultFloat(key);
+ return (int) getDefaultDouble(key);
}
boolean getDefaultBoolean(int key) {
- return getDefaultFloat(key) != 0;
+ return getDefaultDouble(key) != 0;
}
private void getObjectSettings() {
@@ -497,7 +497,7 @@
int icolor = PyMOL.getRGB(color);
Lst<Object> molecules = (Lst<Object>) item[1];
BS bs = getSelectionAtoms(molecules, thisState, new BS());
- addJmolObject(T.atoms, bs, null).argb = icolor;
+ addJmolObjectNoInfo(T.atoms, bs).argb = icolor;
}
}
@@ -560,7 +560,7 @@
if (vis == null)
return;
BS bs = new BS();
- addJmolObject(T.hide, null, null);
+ addJmolObjectNoInfo(T.hide, null);
for (Entry<String, PyMOLGroup> e : groups.entrySet())
e.getValue().visible = true;
for (Entry<String, Object> e : vis.entrySet()) {
@@ -628,7 +628,7 @@
private void generateShapes(Object[] reps) {
if (reps == null)
return;
- addJmolObject(T.restrict, null, null).argb = thisState - 1;
+ addJmolObjectNoInfo(T.restrict, null).argb = thisState - 1;
// through all molecules...
// for (int m = moleculeNames.size(); --m >= 0;) {
for (int m = 0; m < moleculeNames.size(); m++) {
@@ -700,6 +700,10 @@
return new JmolObject(shape, objectStateName, bsAtoms, info);
}
+ private JmolObject addJmolObjectNoInfo(int shape, BS bsAtoms) {
+ return addObject(getJmolObject(shape, bsAtoms, null));
+ }
+
private JmolObject addJmolObject(int shape, BS bsAtoms, Object info) {
return addObject(getJmolObject(shape, bsAtoms, info));
}
@@ -715,7 +719,7 @@
double[] pymolView = new double[21];
boolean depthCue = getDefaultBoolean(PyMOL.depth_cue); // 84
boolean fog = getDefaultBoolean(PyMOL.fog); // 88
- double fog_start = getDefaultFloat(PyMOL.fog_start); // 192
+ double fog_start = getDefaultDouble(PyMOL.fog_start); // 192
int pt = 0;
int i = 0;
@@ -739,7 +743,7 @@
pymolView[pt++] = PyMOLReader.floatAt(view, i++);
boolean isOrtho = getDefaultBoolean(PyMOL.orthoscopic); // 23
- double fov = getDefaultFloat(PyMOL.field_of_view); // 152
+ double fov = getDefaultDouble(PyMOL.field_of_view); // 152
pymolView[pt++] = (isOrtho ? fov : -fov);
pymolView[pt++] = (depthCue ? 1 : 0);
@@ -807,7 +811,7 @@
obj.visible = false;
}
if (!bsHidden.isEmpty())
- addJmolObject(T.hidden, bsHidden, null);
+ addJmolObjectNoInfo(T.hidden, bsHidden);
}
void setCarveSets(Map<String, Lst<Object>> htObjNames) {
@@ -854,13 +858,13 @@
bsAtoms = BSUtil.newBitSet2(ac0, ac);
JmolObject jo;
// from reader
- jo = addJmolObject(T.atoms, bsAtoms, null);
+ jo = addJmolObjectNoInfo(T.atoms, bsAtoms);
colixes = AU.ensureLengthShort(colixes, ac);
for (int i = ac; --i >= ac0;)
colixes[i] = (short) atomColorList.get(i).intValue();
jo.setColors(colixes, 0);
jo.setSize(0);
- jo = addJmolObject(JC.SHAPE_STICKS, bsAtoms, null);
+ jo = addJmolObjectNoInfo(JC.SHAPE_STICKS, bsAtoms);
jo.setSize(0);
}
createShapeObject(PyMOL.REP_LINES, reps[PyMOL.REP_LINES]);
@@ -906,7 +910,7 @@
void addLabel(int atomIndex, int uniqueID, int atomColor, float[] labelPos,
String label) {
- int icolor = (int) getUniqueFloatDef(uniqueID, PyMOL.label_color);
+ int icolor = (int) getUniqueDoubleDef(uniqueID, PyMOL.label_color);
if (icolor == PyMOL.COLOR_BACK || icolor == PyMOL.COLOR_FRONT) {
// deal with this later
} else if (icolor < 0) {
@@ -970,7 +974,7 @@
* @param key
* @return setting value as a double
*/
- double getUniqueFloatDef(int id, int key) {
+ double getUniqueDoubleDef(int id, int key) {
return getUniqueFloatDefVal(id, key, Double.NaN);
}
@@ -987,7 +991,7 @@
double getUniqueFloatDefVal(int id, int key, double defValue) {
Lst<Object> setting = getUniqueSetting(id, key);
if (setting == null)
- return (Double.isNaN(defValue) ? getDefaultFloat(key) : defValue);
+ return (Double.isNaN(defValue) ? getDefaultDouble(key) : defValue);
double v = ((Number) setting.get(2)).doubleValue();
if (Logger.debugging)
Logger.debug("Pymol unique setting for " + id + ": [" + key + "] = " + v);
@@ -1031,7 +1035,7 @@
return (setting == null || setting.size() != 3);
}
- double floatSetting(int i) {
+ double doubleSetting(int i) {
Lst<Object> setting = getSetting(i);
if (setting != null && setting.size() == 3)
return ((Number) setting.get(2)).doubleValue();
@@ -1091,7 +1095,7 @@
data.addLast(objectName);
JmolObject jo = addJmolObject(JC.SHAPE_CGO, null, data);
jo.argb = color;
- jo.translucency = getDefaultFloat(PyMOL.cgo_transparency);
+ jo.translucency = getDefaultDouble(PyMOL.cgo_transparency);
return fixName(objectName);
}
@@ -1104,7 +1108,7 @@
return false;
boolean drawLabel = haveLabels && (bsReps == null || bsReps.get(PyMOL.REP_LABELS));
boolean drawDashes = (bsReps == null || bsReps.get(PyMOL.REP_DASHES));
- double rad = getDefaultFloat(PyMOL.dash_width);
+ double rad = getDefaultDouble(PyMOL.dash_width);
rad /= 400; // I don't know what these units are!
if (rad == 0)
rad = 0.05;
@@ -1308,7 +1312,7 @@
// 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)
- double fontSize = getDefaultFloat(PyMOL.label_size);
+ double fontSize = getDefaultDouble(PyMOL.label_size);
if (fontSize > 0)
fontSize *= PYMOL_FONT_SIZE_FACTOR;
// PyMOL is using the front of the viewing box; Jmol uses the center,
@@ -1367,7 +1371,7 @@
: reader.getUniqueID(iAtom));
double rad = 0;
if (reps[PyMOL.REP_SPHERES].get(iAtom)) {
- double scale = getUniqueFloatDef(atomUID, PyMOL.sphere_scale);
+ double scale = getUniqueDoubleDef(atomUID, PyMOL.sphere_scale);
rad = (reader == null ? radii[iAtom] : reader.getVDW(iAtom)) * scale;
} else {
boolean isRepNB = reps[PyMOL.REP_NBSPHERES].get(iAtom);
@@ -1375,12 +1379,12 @@
if (rad > 0 && bsHydrogen.get(iAtom) //
&& !bsNonbonded.get(iAtom) // untested
) {
- rad *= getUniqueFloatDef(atomUID, PyMOL.stick_h_scale);
+ rad *= getUniqueDoubleDef(atomUID, PyMOL.stick_h_scale);
}
if (rad == 0 && isRepNB) {
if (bsNonbonded.get(iAtom)) {
// Penta_vs_mutants calcium
- rad = getUniqueFloatDef(atomUID, PyMOL.nonbonded_size);
+ rad = getUniqueDoubleDef(atomUID, PyMOL.nonbonded_size);
}
}
}
@@ -1507,8 +1511,8 @@
if (bs.isEmpty())
return;
setUniqueObjects(JC.SHAPE_STARS, bs, 0, 0, PyMOL.nonbonded_transparency,
- getDefaultFloat(PyMOL.nonbonded_transparency), 0,
- getDefaultFloat(PyMOL.nonbonded_size), 0.5d);
+ getDefaultDouble(PyMOL.nonbonded_transparency), 0,
+ getDefaultDouble(PyMOL.nonbonded_size), 0.5d);
break;
case PyMOL.REP_NBSPHERES:
break;
@@ -1515,13 +1519,13 @@
case PyMOL.REP_SPHERES:
setUniqueObjects(JC.SHAPE_BALLS, bs, PyMOL.sphere_color,
getDefaultInt(PyMOL.sphere_color), PyMOL.sphere_transparency,
- getDefaultFloat(PyMOL.sphere_transparency), PyMOL.sphere_scale,
+ getDefaultDouble(PyMOL.sphere_transparency), PyMOL.sphere_scale,
getDefaultInt(PyMOL.sphere_scale), 1);
break;
case PyMOL.REP_ELLIPSOID:
- double ellipsoidTranslucency = getDefaultFloat(PyMOL.ellipsoid_transparency);
+ double ellipsoidTranslucency = getDefaultDouble(PyMOL.ellipsoid_transparency);
int ellipsoidColor = getDefaultInt(PyMOL.ellipsoid_color);
- double ellipsoidScale = getDefaultFloat(PyMOL.ellipsoid_scale);
+ double ellipsoidScale = getDefaultDouble(PyMOL.ellipsoid_scale);
setUniqueObjects(JC.SHAPE_ELLIPSOIDS, bs, PyMOL.ellipsoid_color,
ellipsoidColor, PyMOL.ellipsoid_transparency, ellipsoidTranslucency,
PyMOL.ellipsoid_scale, ellipsoidScale, 50);
@@ -1529,21 +1533,21 @@
case PyMOL.REP_DOTS:
setUniqueObjects(JC.SHAPE_DOTS, bs, PyMOL.dot_color,
getDefaultInt(PyMOL.dot_color), 0, 0, PyMOL.sphere_scale,
- getDefaultFloat(PyMOL.sphere_scale), 1);
+ getDefaultDouble(PyMOL.sphere_scale), 1);
break;
case PyMOL.REP_SURFACE: {// = 2;
// unique translucency here involves creating ghost surfaces
- double withinDistance = getDefaultFloat(PyMOL.surface_carve_cutoff);
+ double withinDistance = getDefaultDouble(PyMOL.surface_carve_cutoff);
int surfaceMode = getDefaultInt(PyMOL.sphere_mode);
jo = addJmolObject(T.isosurface, bs,
new Object[] {
getDefaultBoolean(PyMOL.two_sided_lighting) ? "FULLYLIT"
: "FRONTLIT",
- (surfaceMode == 3 || surfaceMode == 4) ? " only" : "", bsCarve,
+ (surfaceMode == 3 || surfaceMode == 4 ? " only" : ""), bsCarve,
Double.valueOf(withinDistance) });
- jo.setSize(getDefaultFloat(PyMOL.solvent_radius)
+ jo.setSize(getDefaultDouble(PyMOL.solvent_radius)
* (getDefaultBoolean(PyMOL.surface_solvent) ? -1 : 1));
- jo.translucency = getDefaultFloat(PyMOL.transparency);
+ jo.translucency = getDefaultDouble(PyMOL.transparency);
int surfaceColor = getDefaultInt(PyMOL.surface_color);
if (surfaceColor >= 0)
jo.argb = PyMOL.getRGB(surfaceColor);
@@ -1554,9 +1558,9 @@
break;
}
case PyMOL.REP_MESH: { // = 8;
- jo = addJmolObject(T.isosurface, bs, null);
- jo.setSize(getDefaultFloat(PyMOL.solvent_radius));
- jo.translucency = getDefaultFloat(PyMOL.transparency);
+ jo = addJmolObjectNoInfo(T.isosurface, bs);
+ jo.setSize(getDefaultDouble(PyMOL.solvent_radius));
+ jo.translucency = getDefaultDouble(PyMOL.transparency);
int surfaceColor = getDefaultInt(PyMOL.surface_color);
setUniqueObjects(JC.SHAPE_ISOSURFACE, bs, PyMOL.surface_color,
surfaceColor, PyMOL.transparency, jo.translucency, 0, 0, 0);
@@ -1571,8 +1575,8 @@
case PyMOL.REP_DASHES:
// TODO
case PyMOL.REP_LINES:
- jo = addJmolObject(T.wireframe, bs, null);
- jo.setSize(getDefaultFloat(PyMOL.line_width) / 15);
+ jo = addJmolObjectNoInfo(T.wireframe, bs);
+ jo.setSize(getDefaultDouble(PyMOL.line_width) / 15);
int color = getDefaultInt(PyMOL.line_color);
if (color >= 0)
jo.argb = PyMOL.getRGB(color);
@@ -1583,11 +1587,11 @@
BS bsH = BSUtil.copy(bs);
bsH.and(bsHydrogen);
info = new Object[] { bsH,
- Double.valueOf(getUniqueFloatDef(repType, PyMOL.stick_h_scale)) };
+ Double.valueOf(getUniqueDoubleDef(repType, PyMOL.stick_h_scale)) };
}
jo = addJmolObject(JC.SHAPE_STICKS, bs, info);
- jo.setSize(getDefaultFloat(PyMOL.stick_radius) * 2);
- jo.translucency = getDefaultFloat(PyMOL.stick_transparency);
+ jo.setSize(getDefaultDouble(PyMOL.stick_radius) * 2);
+ jo.translucency = getDefaultDouble(PyMOL.stick_transparency);
int col = getDefaultInt(PyMOL.stick_color);
if (col >= 0)
jo.argb = PyMOL.getRGB(col);
@@ -1661,7 +1665,7 @@
for (Map.Entry<Double, BS> e : htSpacefill.entrySet()) {
float r = e.getKey().floatValue();
BS bs = e.getValue();
- addJmolObject(T.atoms, bs, null).rd = new RadiusData(null, r,
+ addJmolObjectNoInfo(T.atoms, bs).rd = new RadiusData(null, r,
RadiusData.EnumType.ABSOLUTE, VDW.AUTO);
}
htSpacefill.clear();
@@ -1676,11 +1680,11 @@
checkNucleicObject(bs, true);
if (bs.isEmpty())
return;
- double r = floatSetting(PyMOL.cartoon_tube_radius);
+ double r = doubleSetting(PyMOL.cartoon_tube_radius);
JmolObject jo = setUniqueObjects(JC.SHAPE_TRACE, bs,
PyMOL.cartoon_color, getDefaultInt(PyMOL.cartoon_color), 0, 0, 0, 0, 0);
jo.setSize(r * 2);
- jo.translucency = getDefaultFloat(PyMOL.cartoon_transparency);
+ jo.translucency = getDefaultDouble(PyMOL.cartoon_transparency);
}
private void checkNucleicObject(BS bs, boolean isTrace) {
@@ -1691,9 +1695,9 @@
if (isTrace && getDefaultBoolean(PyMOL.cartoon_ladder_mode))
haveNucleicLadder = true;
// we will just use cartoons for ladder mode
- jo = addJmolObject(JC.SHAPE_CARTOON, bsNuc, null);
- jo.translucency = getDefaultFloat(PyMOL.cartoon_transparency);
- jo.setSize(floatSetting(PyMOL.cartoon_tube_radius) * 2);
+ jo = addJmolObjectNoInfo(JC.SHAPE_CARTOON, bsNuc);
+ jo.translucency = getDefaultDouble(PyMOL.cartoon_transparency);
+ jo.setSize(doubleSetting(PyMOL.cartoon_tube_radius) * 2);
bs.andNot(bsNuc);
}
}
@@ -1704,14 +1708,14 @@
* @param bs
*/
private void createPuttyObject(BS bs) {
- double[] info = new double[] { floatSetting(PyMOL.cartoon_putty_quality),
- floatSetting(PyMOL.cartoon_putty_radius),
- floatSetting(PyMOL.cartoon_putty_range),
- floatSetting(PyMOL.cartoon_putty_scale_min),
- floatSetting(PyMOL.cartoon_putty_scale_max),
- floatSetting(PyMOL.cartoon_putty_scale_power),
- floatSetting(PyMOL.cartoon_putty_transform) };
- addJmolObject(T.trace, bs, info).translucency = getDefaultFloat(PyMOL.cartoon_transparency);
+ float[] info = new float[] { (float) doubleSetting(PyMOL.cartoon_putty_quality),
+ (float) doubleSetting(PyMOL.cartoon_putty_radius),
+ (float) doubleSetting(PyMOL.cartoon_putty_range),
+ (float) doubleSetting(PyMOL.cartoon_putty_scale_min),
+ (float) doubleSetting(PyMOL.cartoon_putty_scale_max),
+ (float) doubleSetting(PyMOL.cartoon_putty_scale_power),
+ (float) doubleSetting(PyMOL.cartoon_putty_transform) };
+ addJmolObject(T.trace, bs, info).translucency = getDefaultDouble(PyMOL.cartoon_transparency);
}
/**
@@ -1734,16 +1738,16 @@
// 476Rainbow_New: 10, 8 ==> trace
//double smoothing = getFloatSetting(PyMOL.ribbon_smooth);
- boolean isTrace = (floatSetting(PyMOL.ribbon_sampling) > 1);
- double r = floatSetting(PyMOL.ribbon_radius) * 2;
- double rayScale = floatSetting(PyMOL.ray_pixel_scale);
+ boolean isTrace = (doubleSetting(PyMOL.ribbon_sampling) > 1);
+ double r = doubleSetting(PyMOL.ribbon_radius) * 2;
+ double rayScale = doubleSetting(PyMOL.ray_pixel_scale);
if (r == 0)
- r = floatSetting(PyMOL.ribbon_width)
+ r = doubleSetting(PyMOL.ribbon_width)
* (isTrace ? 1 : (rayScale <= 1 ? 0.5d : rayScale)) * 0.1d;
JmolObject jo = setUniqueObjects((isTrace ? JC.SHAPE_TRACE : JC.SHAPE_BACKBONE), bs,
PyMOL.ribbon_color, getDefaultInt(PyMOL.ribbon_color), 0, 0, 0, 0, 0);
jo.setSize(r);
- jo.translucency = getDefaultFloat(PyMOL.ribbon_transparency);
+ jo.translucency = getDefaultDouble(PyMOL.ribbon_transparency);
}
private void createCartoonObject(String key, int sizeID) {
@@ -1760,8 +1764,8 @@
}
JmolObject jo = setUniqueObjects(JC.SHAPE_CARTOON, bs, PyMOL.cartoon_color, getDefaultInt(PyMOL.cartoon_color),
0, 0, 0, 0, 0);
- jo.setSize(floatSetting(sizeID) * 2);
- jo.translucency = getDefaultFloat(PyMOL.cartoon_transparency);
+ jo.setSize(doubleSetting(sizeID) * 2);
+ jo.translucency = getDefaultDouble(PyMOL.cartoon_transparency);
}
private JmolObject addObject(JmolObject obj) {
@@ -1840,7 +1844,7 @@
int id = uniqueList.get(Integer.valueOf(i)).intValue();
boolean isStickBond = bsStickBonds.get(i);
if (bsLineBonds.get(i)) {
- rad = getUniqueFloatDef(id, PyMOL.line_width) / 30;
+ rad = getUniqueDoubleDef(id, PyMOL.line_width) / 30;
} else if (bsStickBonds.get(i)) {
rad = getRadiusForBond(id, b.atom1.i, b.atom2.i);
}
@@ -1847,9 +1851,9 @@
int c = (int) getUniqueFloatDefVal(id, PyMOL.stick_color, Integer.MAX_VALUE);
if (c != Integer.MAX_VALUE)
c = PyMOL.getRGB(c);
- double v = getUniqueFloatDef(id, PyMOL.valence);
- double t = getUniqueFloatDef(id, PyMOL.stick_transparency);
- int scalex50 = (int) (v == 1 ? getUniqueFloatDef(id, PyMOL.stick_valence_scale) * 50 : 0)&0x3F;
+ double v = getUniqueDoubleDef(id, PyMOL.valence);
+ double t = getUniqueDoubleDef(id, PyMOL.stick_transparency);
+ int scalex50 = (int) (v == 1 ? getUniqueDoubleDef(id, PyMOL.stick_valence_scale) * 50 : 0)&0x3F;
setUniqueBondParameters(b, thisState - 1, rad, v, c, t, scalex50, isStickBond);
}
}
@@ -1903,10 +1907,10 @@
if (meshColor < 0)
meshColor = PyMOLReader.intAt(PyMOLReader.listAt(obj, 0), 2);
if (!isMep) {
- jo.setSize(getDefaultFloat(PyMOL.mesh_width));
+ jo.setSize(getDefaultDouble(PyMOL.mesh_width));
jo.argb = PyMOL.getRGB(meshColor);
}
- jo.translucency = getDefaultFloat(PyMOL.transparency);
+ jo.translucency = getDefaultDouble(PyMOL.transparency);
jo.cacheID = surfaceInfoName;
}
@@ -1917,24 +1921,24 @@
}
private boolean isStickBall(int id) {
- return (getUniqueFloatDef(id, PyMOL.stick_ball) == 1);
+ return (getUniqueDoubleDef(id, PyMOL.stick_ball) == 1);
}
public double getStickBallRadius(int id) {
return (isStickBall(id)
- ? getUniqueFloatDef(id, PyMOL.stick_radius)
- * getUniqueFloatDef(id, PyMOL.stick_ball_ratio)
+ ? getUniqueDoubleDef(id, PyMOL.stick_radius)
+ * getUniqueDoubleDef(id, PyMOL.stick_ball_ratio)
: 0);
}
public int encodeMultipleBond(int uid, boolean isSpecial) {
- int scalex50 = (int) (isSpecial ? getUniqueFloatDef(uid, PyMOL.stick_valence_scale) * 50 : 0) & 0x3F;
+ int scalex50 = (int) (isSpecial ? getUniqueDoubleDef(uid, PyMOL.stick_valence_scale) * 50 : 0) & 0x3F;
return (scalex50 << 2) | JmolAdapter.ORDER_PYMOL_MULT;
}
public float getRadiusForBond(int id, int a1, int a2) {
- double rad = getUniqueFloatDef(id, PyMOL.stick_radius);
+ double rad = getUniqueDoubleDef(id, PyMOL.stick_radius);
if (bsHydrogen.get(a1) || bsHydrogen.get(a2)) {
- rad *= getUniqueFloatDef(id, PyMOL.stick_h_scale);
+ rad *= getUniqueDoubleDef(id, PyMOL.stick_h_scale);
}
return (float) rad;
}
Modified: trunk/Jmol/src/org/jmol/script/SV.java
===================================================================
--- trunk/Jmol/src/org/jmol/script/SV.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/org/jmol/script/SV.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -1349,16 +1349,17 @@
public final static int FORMAT_XYZ = 28;
public final static int FORMAT_ABC = 32;
public final static int FORMAT_UVW = 36;
+ public final static int FORMAT_STRING = 40;
/**
*
* @param format
- * @return 0: JSON, 5: base64, 12: bytearray, 22: array, 28:xyz, 32:abc, 36:uvw
+ * @return 0: JSON, 5: base64, 12: bytearray, 22: array, 28:xyz, 32:abc, 36:uvw, 40:string
*/
public static int getFormatType(String format) {
return (format.indexOf(";") >= 0 ? -1 :
- ";json;base64;bytearray;array;xyz;abc;uvw;"
- // 0 5 12 22 28 32 36
+ ";json;base64;bytearray;array;xyz;abc;uvw;string;"
+ // 0 5 12 22 28 32 36 40
.indexOf(";" + format.toLowerCase() + ";"));
}
@@ -1415,6 +1416,7 @@
case FORMAT_BASE64:
case FORMAT_BYTEARRAY:
case FORMAT_ARRAY:
+ case FORMAT_STRING:
byte[] bytes;
switch (sv.tok) {
case barray:
@@ -1449,6 +1451,8 @@
return JC.BASE64_TAG + javajs.util.Base64.getBase64(bytes).toString();
case FORMAT_ARRAY:
return getVariable(bytes);
+ case FORMAT_STRING:
+ return new String(bytes);
}
}
return null;
Modified: trunk/Jmol/src/org/jmol/scriptext/MathExt.java
===================================================================
--- trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/org/jmol/scriptext/MathExt.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -2835,12 +2835,17 @@
case 2:
if (args[0].tok == T.string) {
format = SV.sValue(args[0]);
+ // format("base64","afdsadkjfaldkjfsfdl=") base64 decoding
x = args[1];
+ if (x.tok == T.string && !"string".equals(format)) {
+ x = args[0];
+ format = "string";
+ }
// format("xxx%s","testing");
- // format("base64", x)
- // format("JSON", x)
- // format("byteArray", x)
- // format("array", x)
+ // format("base64", x)
+ // format("JSON", x)
+ // format("byteArray", x)
+ // format("array", x)
} else {
// format(x, "base64")
// format(x, "JSON")
Modified: trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java
===================================================================
--- trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/org/jmol/shapesurface/Isosurface.java 2025-08-08 09:46:51 UTC (rev 22675)
@@ -264,6 +264,7 @@
}
if ("params" == propertyName) {
+ // PyMOL only
if (thisMesh != null) {
ensureMeshSource();
thisMesh.checkAllocColixes();
Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties
===================================================================
--- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2025-07-21 19:08:33 UTC (rev 22674)
+++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2025-08-08 09:46:51 UTC (rev 22675)
@@ -53,8 +53,18 @@
# FEATURE REQUEST: dock/undock consoles to main window.
# TODO: allow FIXED to work with MODELKIT MINIMIZE
-Jmol.___JmolVersion="16.3.31" // (legacy) also 16.3.32 (swingJS)
+Jmol.___JmolVersion="16.3.33" // (legacy) also 16.3.34 (swingJS)
+bug fix (legacy only): PyMOL putty rendering broken in 16.3.15 (2025.04.10)
+
+bug fix (JSpecView, for IUPAC FAIRSpec only): JDX header delivery incomplete
+
+new feature: format("STRING", ";base64,MSwyLWJpcygzLWNobG9yby00LDUtZGltZXRob3h5cGhlbnlsKWV0aGFuZS56aXA=")
+ -- decodes base64 string
+ -- in this case, giving "1,2-bis(3-chloro-4,5-dimethoxyphenyl)ethane.zip"
+
+JmolVersion="16.3.31" // (legacy) also 16.3.32 (swingJS)
+
bug fix: incommensurately modulated magnetic CIF file reading issues
bug fix: COMPARE failing
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|