Revision: 20963 http://sourceforge.net/p/jmol/code/20963 Author: hansonr Date: 2016-02-18 04:29:30 +0000 (Thu, 18 Feb 2016) Log Message: ----------- Jmol.___JmolVersion="14.4.3_2016.02.17"
bug fix: slab/depth SET do not behave properly bug fix: select VISIBLE is not properly set based on slab/depth SET bug fix: _GEOM_BOND reading in CIF files nonfunctional. -- broken in 13.3.4_dev_2013.08.21 -- result is that between 8/21/2013 and 2/15/2016 the CIF reader would not recognize _GEOM_BOND and so also not create whole molecules as it was designed to do when those are present. -- no impact on states created within this version range -- no impact on mmCIF reader -- only impact is upon Materials Studio-generated files such as http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt (supplemental mat. for http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h) See Jmol list discussion: https://sourceforge.net/p/jmol/mailman/message/31308577/ Modified Paths: -------------- branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java branches/v14_4/Jmol/src/org/jmol/export/__RayTracerExporter.java branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java branches/v14_4/Jmol/src/org/jmol/render/RepaintManager.java branches/v14_4/Jmol/src/org/jmol/render/SticksRenderer.java branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java branches/v14_4/Jmol/src/org/jmol/scriptext/IsoExt.java branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties branches/v14_4/Jmol/src/org/jmol/viewer/ShapeManager.java branches/v14_4/Jmol/src/org/jmol/viewer/StateCreator.java branches/v14_4/Jmol/src/org/jmol/viewer/TransformManager.java branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java trunk/Jmol/src/org/jmol/export/__RayTracerExporter.java trunk/Jmol/src/org/jmol/modelset/AtomCollection.java trunk/Jmol/src/org/jmol/render/RepaintManager.java trunk/Jmol/src/org/jmol/render/SticksRenderer.java trunk/Jmol/src/org/jmol/script/ScriptEval.java trunk/Jmol/src/org/jmol/scriptext/IsoExt.java trunk/Jmol/src/org/jmol/viewer/Jmol.properties trunk/Jmol/src/org/jmol/viewer/ShapeManager.java trunk/Jmol/src/org/jmol/viewer/StateCreator.java trunk/Jmol/src/org/jmol/viewer/TransformManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java Modified: branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -51,8 +51,8 @@ * A true line-free CIF file reader for CIF files. * * Subclasses of CIF -- mmCIF/PDBx (pre-initialized) and msCIF (initialized - * here). - * + * here) + * * Note that a file can be a PDB file without being * * Added nonstandard mCIF (magnetic_ tags) 5/2/2014 note that PRELIM keys can be @@ -84,7 +84,6 @@ GenericCifDataParser parser; - private boolean isMolecular; private boolean filterAssembly; private boolean allowRotations = true; private boolean readIdeal = true; @@ -181,6 +180,8 @@ private boolean readAllData() throws Exception { if (key.startsWith("data_")) { isLigand = false; + if (asc.atomSetCount == 0) + iHaveDesiredModel = false; if (iHaveDesiredModel) return false; if (desiredModelNumber != Integer.MIN_VALUE) @@ -222,7 +223,7 @@ * tokenizer.getTokenPeeked(); continue; } */ if (key.indexOf("_") != 0) { - Logger.warn("CIF ERROR ? should be an underscore: " + key); + Logger.warn("CIF ERROR ? should be an underscore: " + key); parser.getTokenPeeked(); } else if (!getData()) { return true; @@ -243,22 +244,26 @@ processCellParameter(); } else if (key.startsWith("_atom_sites_fract_tran")) { processUnitCellTransformMatrix(); - } else if (key.equals("_audit_block_code")) { - auditBlockCode = parser.fullTrim(data).toUpperCase(); - appendLoadNote(auditBlockCode); - if (htAudit != null && auditBlockCode.contains("_MOD_")) { - String key = PT.rep(auditBlockCode, "_MOD_", "_REFRNCE_"); - if (asc.setSymmetry((SymmetryInterface) htAudit.get(key)) != null) { - unitCellParams = asc.getSymmetry().getUnitCellParams(); - iHaveUnitCell = true; + } else if (key.startsWith("_audit")) { + if (key.equals("_audit_block_code")) { + auditBlockCode = parser.fullTrim(data).toUpperCase(); + appendLoadNote(auditBlockCode); + if (htAudit != null && auditBlockCode.contains("_MOD_")) { + String key = PT.rep(auditBlockCode, "_MOD_", "_REFRNCE_"); + if (asc.setSymmetry((SymmetryInterface) htAudit.get(key)) != null) { + unitCellParams = asc.getSymmetry().getUnitCellParams(); + iHaveUnitCell = true; + } + } else if (htAudit != null) { + if (symops != null) + for (int i = 0; i < symops.size(); i++) + setSymmetryOperator(symops.get(i)); } - } else if (htAudit != null) { - if (symops != null) - for (int i = 0; i < symops.size(); i++) - setSymmetryOperator(symops.get(i)); + if (lastSpaceGroupName != null) + setSpaceGroupName(lastSpaceGroupName); + } else if (key.equals("_audit_creation_date")) { + symmetry = null; } - if (lastSpaceGroupName != null) - setSpaceGroupName(lastSpaceGroupName); } else if (key.equals(singleAtomID)) { readSingleAtom(); } else if (key.startsWith("_symmetry_space_group_name_h-m") @@ -847,7 +852,7 @@ */ private void processAtomTypeLoopBlock() throws Exception { parseLoopParameters(atomTypeFields); - if (!checkAllFieldsPresent(atomTypeFields, false)) { + if (!checkAllFieldsPresent(atomTypeFields, -1, false)) { parser.skipLoop(false); return; } @@ -1519,8 +1524,12 @@ * @throws Exception */ private void processGeomBondLoopBlock() throws Exception { + // broken in 13.3.4_dev_2013.08.20c + // fixed in 14.4.3_2016.02.16 + boolean bondLoopBug = (stateScriptVersionInt >= 130304 && stateScriptVersionInt < 140403 + || stateScriptVersionInt >= 150000 && stateScriptVersionInt < 150403); parseLoopParameters(geomBondFields); - if (!checkAllFieldsPresent(geomBondFields, true)) { + if (bondLoopBug || !checkAllFieldsPresent(geomBondFields, 2, true)) { parser.skipLoop(false); return; } @@ -1556,6 +1565,12 @@ dx = 0.015f; } int order = getBondOrder(getField(CCDC_GEOM_BOND_TYPE)); + // This field is from Materials Studio. See supplemental material for + // http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h + // http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt + // Jmol list discussion: https://sourceforge.net/p/jmol/mailman/message/31308577/ + // this 5-model file can be read using one model at a time: load "c2cc34714h.txt" 3 + // but it is far from perfect, and still the best way is load "c2cc34714h.txt" 3 packed bondCount++; bondTypes.addLast(new Object[] { name1, name2, Float.valueOf(distance), Float.valueOf(dx), Integer.valueOf(order) }); @@ -1594,12 +1609,12 @@ * (g) set all coordinates as Cartesians (h) remove all unit cell information */ private void setBondingAndMolecules() { - Logger.info("CIF creating molecule " - + (bondTypes.size() > 0 ? " using GEOM_BOND records" : "")); atoms = asc.atoms; firstAtom = asc.getLastAtomSetAtomIndex(); int nat = asc.getLastAtomSetAtomCount(); ac = firstAtom + nat; + Logger.info("CIF creating molecule for " + nat + " atoms " + + (bondTypes.size() > 0 ? " using GEOM_BOND records" : "")); // get list of sites based on atom names @@ -1836,8 +1851,8 @@ return doCheckUnitCell; } - protected boolean checkAllFieldsPresent(String[] keys, boolean critical) { - for (int i = keys.length; --i >= 0;) + protected boolean checkAllFieldsPresent(String[] keys, int lastKey, boolean critical) { + for (int i = (lastKey < 0 ? keys.length : lastKey); --i >= 0;) if (key2col[i] == NONE) { if (critical) Logger.warn("CIF reader missing property: " + keys[i]); Modified: branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -688,7 +688,7 @@ */ private boolean processStructConfLoopBlock() throws Exception { parseLoopParametersFor(FAMILY_STRUCTCONF, structConfFields); - if (!checkAllFieldsPresent(structConfFields, true)) { + if (!checkAllFieldsPresent(structConfFields, -1, true)) { parser.skipLoop(true); return false; } @@ -772,7 +772,7 @@ */ private boolean processStructSheetRangeLoopBlock() throws Exception { parseLoopParametersFor(FAMILY_SHEET, structSheetRangeFields); - if (!checkAllFieldsPresent(structSheetRangeFields, true)) { + if (!checkAllFieldsPresent(structSheetRangeFields, -1, true)) { parser.skipLoop(true); return false; } Modified: branches/v14_4/Jmol/src/org/jmol/export/__RayTracerExporter.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/export/__RayTracerExporter.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/export/__RayTracerExporter.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -61,7 +61,7 @@ if (super.initOutput(vwr, privateKey, g3d, params)) { vwr.tm.perspectiveDepth = false; if (wasPerspective) - vwr.shm.finalizeAtoms(false, false); + vwr.shm.finalizeAtoms(null, false); return true; } return false; Modified: branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/modelset/AtomCollection.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -2466,14 +2466,16 @@ public BS getVisibleSet(boolean forceNew) { if (forceNew) { vwr.setModelVisibility(); - vwr.shm.finalizeAtoms(false, true); + vwr.shm.finalizeAtoms(null, true); + } else if (haveBSVisible) { + return bsVisible; } - else if (haveBSVisible) - return bsVisible; bsVisible.clearAll(); for (int i = ac; --i >= 0;) if (at[i].checkVisible()) bsVisible.set(i); + if (vwr.shm.bsSlabbedInternal != null) + bsVisible.andNot(vwr.shm.bsSlabbedInternal); haveBSVisible = true; return bsVisible; } Modified: branches/v14_4/Jmol/src/org/jmol/render/RepaintManager.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/render/RepaintManager.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/render/RepaintManager.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -243,7 +243,7 @@ public String renderExport(GData gdata, ModelSet modelSet, Map<String, Object> params) { boolean isOK; - shapeManager.finalizeAtoms(false, true); + shapeManager.finalizeAtoms(null, true); JmolRendererInterface exporter3D = vwr.initializeExporter(params); isOK = (exporter3D != null); if (!isOK) { Modified: branches/v14_4/Jmol/src/org/jmol/render/SticksRenderer.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/render/SticksRenderer.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/render/SticksRenderer.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -169,9 +169,9 @@ return false; if (slabbing) { - if (vwr.gdata.isClippedZ(a.sZ) && vwr.gdata.isClippedZ(b.sZ) - || slabByAtom - && (vwr.gdata.isClippedZ(a.sZ) || vwr.gdata.isClippedZ(b.sZ))) + boolean ba = vwr.gdata.isClippedZ(a.sZ); + if (ba && vwr.gdata.isClippedZ(b.sZ) || slabByAtom + && (ba || vwr.gdata.isClippedZ(b.sZ))) return false; } zA = a.sZ; @@ -182,14 +182,12 @@ colixB = atomB0.colixAtom; if (((colix = bond.colix) & C.OPAQUE_MASK) == C.USE_PALETTE) { colix = (short) (colix & ~C.OPAQUE_MASK); - colixA = C - .getColixInherited( - (short) (colix | vwr.cm.getColixAtomPalette(atomA0, PAL.CPK.id)), - colixA); - colixB = C - .getColixInherited( - (short) (colix | vwr.cm.getColixAtomPalette(atomB0, PAL.CPK.id)), - colixB); + colixA = C.getColixInherited( + (short) (colix | vwr.cm.getColixAtomPalette(atomA0, PAL.CPK.id)), + colixA); + colixB = C.getColixInherited( + (short) (colix | vwr.cm.getColixAtomPalette(atomB0, PAL.CPK.id)), + colixB); } else { colixA = C.getColixInherited(colix, colixA); colixB = C.getColixInherited(colix, colixB); @@ -258,7 +256,6 @@ } } - // set the diameter xA = a.sX; Modified: branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -7508,10 +7508,8 @@ return; case T.set: checkLength(2); - if (chk) - return; - vwr.tm.setSlabDepthInternal(isDepth); - setBooleanProperty("slabEnabled", true); + if (!chk) + vwr.tm.setSlabDepthInternal(isDepth); return; case T.minus: str = paramAsStr(2); Modified: branches/v14_4/Jmol/src/org/jmol/scriptext/IsoExt.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/scriptext/IsoExt.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/scriptext/IsoExt.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -1132,7 +1132,7 @@ boolean isPmesh = (iShape == JC.SHAPE_PMESH); boolean isPlot3d = (iShape == JC.SHAPE_PLOT3D); boolean isLcaoCartoon = (iShape == JC.SHAPE_LCAOCARTOON); - boolean isSilent = (isLcaoCartoon || tokAt(1) == T.delete); + boolean isSilent = (isLcaoCartoon || tokAt(1) == T.delete || eval.isStateScript); boolean surfaceObjectSeen = false; boolean planeSeen = false; boolean isMapped = false; Modified: branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/viewer/Jmol.properties 2016-02-18 04:29:30 UTC (rev 20963) @@ -7,11 +7,22 @@ # see also http://chemapps.stolaf.edu/jmol/zip for daily updates -Jmol.___JmolVersion="14.4.2_2016.02.15" +Jmol.___JmolVersion="14.4.3_2016.02.17" +bug fix: slab/depth SET do not behave properly +bug fix: select VISIBLE is not properly set based on slab/depth SET + bug fix: _GEOM_BOND reading in CIF files nonfunctional. - -- broken in 14.3.16_2015.08.11 - -- only affects CCDC file reading, as it requires presence of _ccdc_geom_bond_type + -- broken in 13.3.4_dev_2013.08.21 + -- result is that between 8/21/2013 and 2/15/2016 the CIF reader + would not recognize _GEOM_BOND and so also not create whole molecules + as it was designed to do when those are present. + -- no impact on states created within this version range + -- no impact on mmCIF reader + -- only impact is upon Materials Studio-generated files such as + http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt + (supplemental mat. for http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h) + See Jmol list discussion: https://sourceforge.net/p/jmol/mailman/message/31308577/ JmolVersion="14.4.2_2016.02.14" Modified: branches/v14_4/Jmol/src/org/jmol/viewer/ShapeManager.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/ShapeManager.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/viewer/ShapeManager.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -57,6 +57,7 @@ public ShapeManager(Viewer vwr) { this.vwr = vwr; bsRenderableAtoms = new BS(); + bsSlabbedInternal = new BS(); } /** @@ -308,10 +309,11 @@ Object getProperty(Object paramInfo) { if (paramInfo.equals("getShapes")) return shapes; + // could be more here... return null; } - public final BS bsRenderableAtoms; + public final BS bsRenderableAtoms, bsSlabbedInternal; public Shape getShape(int i) { //RepaintManager @@ -401,39 +403,43 @@ private final int[] navMinMax = new int[4]; - public int[] finalizeAtoms(boolean checkAtoms, boolean finalizeParams) { + public int[] finalizeAtoms(BS bsTranslateSelected, boolean finalizeParams) { Viewer vwr = this.vwr; + TransformManager tm = vwr.tm; if (finalizeParams) vwr.finalizeTransformParameters(); - TransformManager tm = vwr.tm; - BS bs = bsRenderableAtoms; - BS bsAtoms = (checkAtoms ? tm.bsSelectedAtoms : null); - if (bsAtoms != null) { + if (bsTranslateSelected != null) { // translateSelected operation - P3 ptCenter = ms.getAtomSetCenter(bsAtoms); + P3 ptCenter = ms.getAtomSetCenter(bsTranslateSelected); P3 pt = new P3(); tm.transformPt3f(ptCenter, pt); pt.add(tm.ptOffset); tm.unTransformPoint(pt, pt); pt.sub(ptCenter); - vwr.setAtomCoordsRelative(pt, bsAtoms); + vwr.setAtomCoordsRelative(pt, bsTranslateSelected); tm.ptOffset.set(0, 0, 0); tm.bsSelectedAtoms = null; } - ms.getAtomsInFrame(bs); + BS bsOK = bsRenderableAtoms; + ms.getAtomsInFrame(bsOK); Vibration[] vibrationVectors = ms.vibrations; boolean vibs = (vibrationVectors != null && tm.vibrationOn); boolean checkOccupancy = (ms.bsModulated != null && ms.occupancies != null); Atom[] atoms = ms.at; int occ; boolean haveMods = false; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + BS bsSlabbed = bsSlabbedInternal; + bsSlabbed.clearAll(); + for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) { // note that this vibration business is not compatible with // PDB objects such as cartoons and traces, which // use Cartesian coordinates, not screen coordinates Atom atom = atoms[i]; P3i screen = (vibs && atom.hasVibration() ? tm.transformPtVib(atom, vibrationVectors[i]) : tm.transformPt(atom)); + if (screen.z == 1 && tm.internalSlab && tm.xyzIsSlabbedInternal(atom)) { + bsSlabbed.set(i); + } atom.sX = screen.x; atom.sY = screen.y; atom.sZ = screen.z; @@ -471,7 +477,7 @@ JmolMolecule m = molecules[i]; int j = 0; int pt = m.firstAtomIndex; - if (!bs.get(pt)) + if (!bsOK.get(pt)) continue; for (; j < m.ac; j++, pt++) if (gdata.isClippedZ(atoms[pt].sZ - (atoms[pt].sD >> 1))) @@ -479,13 +485,13 @@ if (j != m.ac) { pt = m.firstAtomIndex; for (int k = 0; k < m.ac; k++) { - bs.clear(pt); + bsOK.clear(pt); atoms[pt++].sZ = 0; } } } } - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) { Atom atom = atoms[i]; if (gdata.isClippedZ(atom.sZ - (slabByAtom ? atoms[i].sD >> 1 : 0))) { atom.setClickable(0); @@ -494,7 +500,7 @@ int r = (slabByAtom ? -1 : 1) * atom.sD / 2; if (atom.sZ + r < minZ || atom.sZ - r > maxZ || !gdata.isInDisplayRange(atom.sX, atom.sY)) { - bs.clear(i); + bsOK.clear(i); } } } @@ -506,7 +512,7 @@ int maxX = Integer.MIN_VALUE; int minY = Integer.MAX_VALUE; int maxY = Integer.MIN_VALUE; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) { Atom atom = atoms[i]; if (atom.sX < minX) minX = atom.sX; Modified: branches/v14_4/Jmol/src/org/jmol/viewer/StateCreator.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/StateCreator.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/viewer/StateCreator.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -233,8 +233,7 @@ } @Override - String getModelState(SB sfunc, boolean isAll, - boolean withProteinStructure) { + String getModelState(SB sfunc, boolean isAll, boolean withProteinStructure) { SB commands = new SB(); if (isAll && sfunc != null) { sfunc.append(" _setModelState;\n"); @@ -262,22 +261,21 @@ SB sb = new SB(); for (int i = 0; i < ms.bondCount; i++) if (!models[bonds[i].atom1.mi].isModelKit) - if (bonds[i].isHydrogen() - || (bonds[i].order & Edge.BOND_NEW) != 0) { + if (bonds[i].isHydrogen() || (bonds[i].order & Edge.BOND_NEW) != 0) { Bond bond = bonds[i]; int index = bond.atom1.i; if (bond.atom1.group.isAdded(index)) index = -1 - index; - sb.appendI(index).appendC('\t').appendI(bond.atom2.i).appendC( - '\t').appendI(bond.order & ~Edge.BOND_NEW).appendC('\t') - .appendF(bond.mad / 1000f).appendC('\t').appendF( - bond.getEnergy()).appendC('\t').append( - Edge.getBondOrderNameFromOrder(bond.order)).append( - ";\n"); + sb.appendI(index).appendC('\t').appendI(bond.atom2.i).appendC('\t') + .appendI(bond.order & ~Edge.BOND_NEW).appendC('\t') + .appendF(bond.mad / 1000f).appendC('\t') + .appendF(bond.getEnergy()).appendC('\t') + .append(Edge.getBondOrderNameFromOrder(bond.order)) + .append(";\n"); } if (sb.length() > 0) - commands.append("data \"connect_atoms\"\n").appendSB(sb).append( - "end \"connect_atoms\";\n"); + commands.append("data \"connect_atoms\"\n").appendSB(sb) + .append("end \"connect_atoms\";\n"); commands.append("\n"); } @@ -302,12 +300,14 @@ // unnecessary. Removed in 11.5.35 -- oops! if (withProteinStructure) - commands.append(ms.getProteinStructureState(null, isAll ? T.all : T.state)); + commands.append(ms + .getProteinStructureState(null, isAll ? T.all : T.state)); // introduced in 14.4.2 for (int i = 0; i < modelCount; i++) if (models[i].mat4 != null) - commands.append(" frame orientation " + ms.getModelNumberDotted(i) + Escape.matrixToScript(models[i].mat4) + ";\n"); + commands.append(" frame orientation " + ms.getModelNumberDotted(i) + + Escape.matrixToScript(models[i].mat4) + ";\n"); getShapeState(commands, isAll, Integer.MAX_VALUE); @@ -319,33 +319,31 @@ break; } SB sb = new SB(); - for (int i = 0; i < modelCount; i++) { + for (int i = 0; i < modelCount; i++) { Model m = models[i]; sb.setLength(0); String s = (String) ms.getInfo(i, "modelID"); - if (s != null - && !s.equals(ms.getInfo(i, "modelID0"))) - sb.append(" frame ID ").append(PT.esc(s)) - .append(";\n"); + if (s != null && !s.equals(ms.getInfo(i, "modelID0"))) + sb.append(" frame ID ").append(PT.esc(s)).append(";\n"); String t = ms.frameTitles[i]; if (t != null && t.length() > 0) - sb.append(" frame title ").append(PT.esc(t)) - .append(";\n"); + sb.append(" frame title ").append(PT.esc(t)).append(";\n"); if (needOrientations && m.orientation != null && !ms.isTrajectorySubFrame(i)) - sb.append(" ").append( - m.orientation.getMoveToText(false)).append(";\n"); + sb.append(" ").append(m.orientation.getMoveToText(false)) + .append(";\n"); if (m.frameDelay != 0 && !ms.isTrajectorySubFrame(i)) - sb.append(" frame delay ").appendF( - m.frameDelay / 1000f).append(";\n"); + sb.append(" frame delay ").appendF(m.frameDelay / 1000f) + .append(";\n"); if (m.simpleCage != null) { - sb.append(" unitcell ").append( - Escape.eAP(m.simpleCage.getUnitCellVectors())).append( - ";\n"); + sb.append(" unitcell ") + .append(Escape.eAP(m.simpleCage.getUnitCellVectors())) + .append(";\n"); getShapeState(sb, isAll, JC.SHAPE_UCCAGE); } if (sb.length() > 0) - commands.append(" frame " + ms.getModelNumberDotted(i) + ";\n").appendSB(sb); + commands.append(" frame " + ms.getModelNumberDotted(i) + ";\n") + .appendSB(sb); } boolean loadUC = false; @@ -358,9 +356,8 @@ sb.setLength(0); if (symmetry.getState(sb)) { loadUC = true; - commands.append(" frame ") - .append(ms.getModelNumberDotted(i)) - .appendSB(sb).append(";\n"); + commands.append(" frame ").append(ms.getModelNumberDotted(i)) + .appendSB(sb).append(";\n"); } haveModulation |= (vwr.ms.getLastVibrationVector(i, T.modulation) >= 0); } @@ -383,8 +380,8 @@ } commands.append(" set fontScaling " + vwr.getBoolean(T.fontscaling) + ";\n"); -// if (vwr.getBoolean(T.modelkitmode)) - // commands.append(" set modelKitMode true;\n"); + // if (vwr.getBoolean(T.modelkitmode)) + // commands.append(" set modelKitMode true;\n"); } if (sfunc != null) commands.append("\n}\n\n"); @@ -811,11 +808,12 @@ if (vwr.ms.modelSetHasVibrationVectors() && tm.vibrationOn) app(commands, "set vibrationPeriod " + tm.vibrationPeriod + ";vibration on"); + boolean slabInternal = (tm.depthPlane != null || tm.slabPlane != null); if (navigating) { commands.append(tm.getNavigationState()); - if (tm.depthPlane != null || tm.slabPlane != null) - commands.append(" slab on;\n"); - } + } + if (!tm.slabEnabled && slabInternal) + commands.append(" slab off;\n"); if (sfunc != null) commands.append("}\n\n"); return commands.toString(); Modified: branches/v14_4/Jmol/src/org/jmol/viewer/TransformManager.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/TransformManager.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/viewer/TransformManager.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -831,7 +831,7 @@ public boolean slabEnabled; public boolean zShadeEnabled; - boolean internalSlab; + public boolean internalSlab; int slabPercentSetting; int depthPercentSetting; @@ -851,8 +851,7 @@ } void setSlabEnabled(boolean slabEnabled) { - this.slabEnabled = slabEnabled; - vwr.g.setB("slabEnabled", slabEnabled); + vwr.g.setB("slabEnabled", this.slabEnabled = slabEnabled); } void setZShadeEnabled(boolean zShadeEnabled) { @@ -922,15 +921,16 @@ } public void slabToPercent(int percentSlab) { + slabPlane = null; vwr.setFloatProperty("slabRange", 0); slabPercentSetting = percentSlab; - slabPlane = null; if (depthPercentSetting >= slabPercentSetting) depthPercentSetting = slabPercentSetting - 1; slabDepthChanged(); } public void depthToPercent(int percentDepth) { + depthPlane = null; vwr.g.setI("depth", percentDepth); depthPercentSetting = percentDepth; if (slabPercentSetting <= depthPercentSetting) @@ -972,23 +972,24 @@ depthPlane = null; else slabPlane = null; + finalizeTransformParameters(); slabInternal(getSlabDepthPlane(isDepth), isDepth); } private P4 getSlabDepthPlane(boolean isDepth) { // the third row of the matrix defines the Z coordinate, which is all we need // and, in fact, it defines the plane. How convenient! - // eval "slab set" + // eval "slab set" if (isDepth) { if (depthPlane != null) return depthPlane; - } else { - if (slabPlane != null) + } else if (slabPlane != null) { return slabPlane; } M4 m = matrixTransform; - return P4.new4(-m.m20, -m.m21, -m.m22, -m.m23 + P4 plane = P4.new4(-m.m20, -m.m21, -m.m22, -m.m23 + (isDepth ? depthValue : slabValue)); + return plane; } /* *************************************************************** @@ -1446,7 +1447,6 @@ // don't care } } - vwr.g.setO("_slabPlane", Escape.eP4(getSlabDepthPlane(false))); vwr.g.setO("_depthPlane", Escape.eP4(getSlabDepthPlane(true))); if (slabEnabled) @@ -1508,9 +1508,16 @@ public void transformPtScrT3(T3 ptXYZ, T3 pointScreen) { transformPt(ptXYZ); + // note that this point may be returned as z=1 if the point is + // past the camera or slabbed internally pointScreen.setT(fScrPt); } + public void transformPt3f(T3 ptXYZ, P3 screen) { + applyPerspective(ptXYZ, ptXYZ); + screen.setT(fScrPt); + } + public void transformPtNoClip(T3 ptXYZ, T3 pointScreen) { applyPerspective(ptXYZ, null); pointScreen.setT(fScrPt); @@ -1548,11 +1555,6 @@ (Float.isNaN(scale) ? vibrationScale : scale), vwr.g.modulationScale); } - public void transformPt3f(T3 ptXYZ, P3 screen) { - applyPerspective(ptXYZ, ptXYZ); - screen.setT(fScrPt); - } - public synchronized P3i transformPt2D(T3 ptXyp) { // axes position [50 50] // just does the processing for [x y] and [x y %] @@ -1650,16 +1652,19 @@ iScrPt.set((int) fScrPt.x, (int) fScrPt.y, (int) fScrPt.z); - if (ptRef != null - && (slabPlane != null - && ptRef.x * slabPlane.x + ptRef.y * slabPlane.y + ptRef.z - * slabPlane.z + slabPlane.w > 0 || depthPlane != null - && ptRef.x * depthPlane.x + ptRef.y * depthPlane.y + ptRef.z - * depthPlane.z + depthPlane.w < 0)) + if (ptRef != null && xyzIsSlabbedInternal(ptRef)) fScrPt.z = iScrPt.z = 1; return iScrPt; } + public boolean xyzIsSlabbedInternal(T3 ptRef) { + return (slabPlane != null + && ptRef.x * slabPlane.x + ptRef.y * slabPlane.y + ptRef.z + * slabPlane.z + slabPlane.w > 0 || depthPlane != null + && ptRef.x * depthPlane.x + ptRef.y * depthPlane.y + ptRef.z + * depthPlane.z + depthPlane.w < 0); + } + final protected P3 untransformedPoint = new P3(); /* *************************************************************** Modified: branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-15 20:33:16 UTC (rev 20962) +++ branches/v14_4/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -3346,7 +3346,7 @@ return; if (!haveDisplay) { setModelVisibility(); - shm.finalizeAtoms(false, true); + shm.finalizeAtoms(null, true); return; } rm.requestRepaintAndWait(why); @@ -3630,7 +3630,7 @@ || rm == null) return; boolean antialias2 = antialiased && g.antialiasTranslucent; - int[] navMinMax = shm.finalizeAtoms(true, true); + int[] navMinMax = shm.finalizeAtoms(tm.bsSelectedAtoms, true); if (isWebGL) { rm.renderExport(gdata, ms, jsParams); notifyViewerRepaintDone(); Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/CifReader.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -51,8 +51,8 @@ * A true line-free CIF file reader for CIF files. * * Subclasses of CIF -- mmCIF/PDBx (pre-initialized) and msCIF (initialized - * here). - * + * here) + * * Note that a file can be a PDB file without being * * Added nonstandard mCIF (magnetic_ tags) 5/2/2014 note that PRELIM keys can be @@ -84,7 +84,6 @@ GenericCifDataParser parser; - private boolean isMolecular; private boolean filterAssembly; private boolean allowRotations = true; private boolean readIdeal = true; @@ -181,6 +180,8 @@ private boolean readAllData() throws Exception { if (key.startsWith("data_")) { isLigand = false; + if (asc.atomSetCount == 0) + iHaveDesiredModel = false; if (iHaveDesiredModel) return false; if (desiredModelNumber != Integer.MIN_VALUE) @@ -222,7 +223,7 @@ * tokenizer.getTokenPeeked(); continue; } */ if (key.indexOf("_") != 0) { - Logger.warn("CIF ERROR ? should be an underscore: " + key); + Logger.warn("CIF ERROR ? should be an underscore: " + key); parser.getTokenPeeked(); } else if (!getData()) { return true; @@ -243,22 +244,26 @@ processCellParameter(); } else if (key.startsWith("_atom_sites_fract_tran")) { processUnitCellTransformMatrix(); - } else if (key.equals("_audit_block_code")) { - auditBlockCode = parser.fullTrim(data).toUpperCase(); - appendLoadNote(auditBlockCode); - if (htAudit != null && auditBlockCode.contains("_MOD_")) { - String key = PT.rep(auditBlockCode, "_MOD_", "_REFRNCE_"); - if (asc.setSymmetry((SymmetryInterface) htAudit.get(key)) != null) { - unitCellParams = asc.getSymmetry().getUnitCellParams(); - iHaveUnitCell = true; + } else if (key.startsWith("_audit")) { + if (key.equals("_audit_block_code")) { + auditBlockCode = parser.fullTrim(data).toUpperCase(); + appendLoadNote(auditBlockCode); + if (htAudit != null && auditBlockCode.contains("_MOD_")) { + String key = PT.rep(auditBlockCode, "_MOD_", "_REFRNCE_"); + if (asc.setSymmetry((SymmetryInterface) htAudit.get(key)) != null) { + unitCellParams = asc.getSymmetry().getUnitCellParams(); + iHaveUnitCell = true; + } + } else if (htAudit != null) { + if (symops != null) + for (int i = 0; i < symops.size(); i++) + setSymmetryOperator(symops.get(i)); } - } else if (htAudit != null) { - if (symops != null) - for (int i = 0; i < symops.size(); i++) - setSymmetryOperator(symops.get(i)); + if (lastSpaceGroupName != null) + setSpaceGroupName(lastSpaceGroupName); + } else if (key.equals("_audit_creation_date")) { + symmetry = null; } - if (lastSpaceGroupName != null) - setSpaceGroupName(lastSpaceGroupName); } else if (key.equals(singleAtomID)) { readSingleAtom(); } else if (key.startsWith("_symmetry_space_group_name_h-m") @@ -847,7 +852,7 @@ */ private void processAtomTypeLoopBlock() throws Exception { parseLoopParameters(atomTypeFields); - if (!checkAllFieldsPresent(atomTypeFields, false)) { + if (!checkAllFieldsPresent(atomTypeFields, -1, false)) { parser.skipLoop(false); return; } @@ -1519,8 +1524,12 @@ * @throws Exception */ private void processGeomBondLoopBlock() throws Exception { + // broken in 13.3.4_dev_2013.08.20c + // fixed in 14.4.3_2016.02.16 + boolean bondLoopBug = (stateScriptVersionInt >= 130304 && stateScriptVersionInt < 140403 + || stateScriptVersionInt >= 150000 && stateScriptVersionInt < 150403); parseLoopParameters(geomBondFields); - if (!checkAllFieldsPresent(geomBondFields, true)) { + if (bondLoopBug || !checkAllFieldsPresent(geomBondFields, 2, true)) { parser.skipLoop(false); return; } @@ -1556,6 +1565,12 @@ dx = 0.015f; } int order = getBondOrder(getField(CCDC_GEOM_BOND_TYPE)); + // This field is from Materials Studio. See supplemental material for + // http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h + // http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt + // Jmol list discussion: https://sourceforge.net/p/jmol/mailman/message/31308577/ + // this 5-model file can be read using one model at a time: load "c2cc34714h.txt" 3 + // but it is far from perfect, and still the best way is load "c2cc34714h.txt" 3 packed bondCount++; bondTypes.addLast(new Object[] { name1, name2, Float.valueOf(distance), Float.valueOf(dx), Integer.valueOf(order) }); @@ -1594,12 +1609,12 @@ * (g) set all coordinates as Cartesians (h) remove all unit cell information */ private void setBondingAndMolecules() { - Logger.info("CIF creating molecule " - + (bondTypes.size() > 0 ? " using GEOM_BOND records" : "")); atoms = asc.atoms; firstAtom = asc.getLastAtomSetAtomIndex(); int nat = asc.getLastAtomSetAtomCount(); ac = firstAtom + nat; + Logger.info("CIF creating molecule for " + nat + " atoms " + + (bondTypes.size() > 0 ? " using GEOM_BOND records" : "")); // get list of sites based on atom names @@ -1836,8 +1851,8 @@ return doCheckUnitCell; } - protected boolean checkAllFieldsPresent(String[] keys, boolean critical) { - for (int i = keys.length; --i >= 0;) + protected boolean checkAllFieldsPresent(String[] keys, int lastKey, boolean critical) { + for (int i = (lastKey < 0 ? keys.length : lastKey); --i >= 0;) if (key2col[i] == NONE) { if (critical) Logger.warn("CIF reader missing property: " + keys[i]); Modified: trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/adapter/readers/cif/MMCifReader.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -688,7 +688,7 @@ */ private boolean processStructConfLoopBlock() throws Exception { parseLoopParametersFor(FAMILY_STRUCTCONF, structConfFields); - if (!checkAllFieldsPresent(structConfFields, true)) { + if (!checkAllFieldsPresent(structConfFields, -1, true)) { parser.skipLoop(true); return false; } @@ -772,7 +772,7 @@ */ private boolean processStructSheetRangeLoopBlock() throws Exception { parseLoopParametersFor(FAMILY_SHEET, structSheetRangeFields); - if (!checkAllFieldsPresent(structSheetRangeFields, true)) { + if (!checkAllFieldsPresent(structSheetRangeFields, -1, true)) { parser.skipLoop(true); return false; } Modified: trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/adapter/smarter/AtomSetCollectionReader.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -173,6 +173,7 @@ protected boolean doCheckUnitCell; protected boolean getHeader; protected boolean isSequential; + public boolean isMolecular; // only for CIF so that it can read multiple unit cells protected int templateAtomCount; public int modelNumber; protected int vibrationNumber; Modified: trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java =================================================================== --- trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/adapter/smarter/XtalSymmetry.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -779,7 +779,7 @@ boolean checkSymmetryRange = (checkRangeNoSymmetry || checkRange111); boolean checkDistances = (checkSpecial || checkSymmetryRange); boolean addCartesian = (checkSpecial || checkSymmetryMinMax); - + BS bsAtoms = (acr.isMolecular ? null : asc.bsAtoms); SymmetryInterface symmetry = this.symmetry; if (checkRangeNoSymmetry) baseCount = noSymmetryCount; @@ -809,7 +809,7 @@ Atom a = asc.atoms[i]; if (a.ignoreSymmetry) continue; - if (asc.bsAtoms != null && !asc.bsAtoms.get(i)) + if (bsAtoms != null && !bsAtoms.get(i)) continue; if (ms == null) { Modified: trunk/Jmol/src/org/jmol/export/__RayTracerExporter.java =================================================================== --- trunk/Jmol/src/org/jmol/export/__RayTracerExporter.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/export/__RayTracerExporter.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -61,7 +61,7 @@ if (super.initOutput(vwr, privateKey, g3d, params)) { vwr.tm.perspectiveDepth = false; if (wasPerspective) - vwr.shm.finalizeAtoms(false, false); + vwr.shm.finalizeAtoms(null, false); return true; } return false; Modified: trunk/Jmol/src/org/jmol/modelset/AtomCollection.java =================================================================== --- trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/modelset/AtomCollection.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -2466,14 +2466,16 @@ public BS getVisibleSet(boolean forceNew) { if (forceNew) { vwr.setModelVisibility(); - vwr.shm.finalizeAtoms(false, true); + vwr.shm.finalizeAtoms(null, true); + } else if (haveBSVisible) { + return bsVisible; } - else if (haveBSVisible) - return bsVisible; bsVisible.clearAll(); for (int i = ac; --i >= 0;) if (at[i].checkVisible()) bsVisible.set(i); + if (vwr.shm.bsSlabbedInternal != null) + bsVisible.andNot(vwr.shm.bsSlabbedInternal); haveBSVisible = true; return bsVisible; } Modified: trunk/Jmol/src/org/jmol/render/RepaintManager.java =================================================================== --- trunk/Jmol/src/org/jmol/render/RepaintManager.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/render/RepaintManager.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -243,7 +243,7 @@ public String renderExport(GData gdata, ModelSet modelSet, Map<String, Object> params) { boolean isOK; - shapeManager.finalizeAtoms(false, true); + shapeManager.finalizeAtoms(null, true); JmolRendererInterface exporter3D = vwr.initializeExporter(params); isOK = (exporter3D != null); if (!isOK) { Modified: trunk/Jmol/src/org/jmol/render/SticksRenderer.java =================================================================== --- trunk/Jmol/src/org/jmol/render/SticksRenderer.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/render/SticksRenderer.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -169,9 +169,9 @@ return false; if (slabbing) { - if (vwr.gdata.isClippedZ(a.sZ) && vwr.gdata.isClippedZ(b.sZ) - || slabByAtom - && (vwr.gdata.isClippedZ(a.sZ) || vwr.gdata.isClippedZ(b.sZ))) + boolean ba = vwr.gdata.isClippedZ(a.sZ); + if (ba && vwr.gdata.isClippedZ(b.sZ) || slabByAtom + && (ba || vwr.gdata.isClippedZ(b.sZ))) return false; } zA = a.sZ; @@ -182,14 +182,12 @@ colixB = atomB0.colixAtom; if (((colix = bond.colix) & C.OPAQUE_MASK) == C.USE_PALETTE) { colix = (short) (colix & ~C.OPAQUE_MASK); - colixA = C - .getColixInherited( - (short) (colix | vwr.cm.getColixAtomPalette(atomA0, PAL.CPK.id)), - colixA); - colixB = C - .getColixInherited( - (short) (colix | vwr.cm.getColixAtomPalette(atomB0, PAL.CPK.id)), - colixB); + colixA = C.getColixInherited( + (short) (colix | vwr.cm.getColixAtomPalette(atomA0, PAL.CPK.id)), + colixA); + colixB = C.getColixInherited( + (short) (colix | vwr.cm.getColixAtomPalette(atomB0, PAL.CPK.id)), + colixB); } else { colixA = C.getColixInherited(colix, colixA); colixB = C.getColixInherited(colix, colixB); @@ -258,7 +256,6 @@ } } - // set the diameter xA = a.sX; Modified: trunk/Jmol/src/org/jmol/script/ScriptEval.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/script/ScriptEval.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -7492,8 +7492,7 @@ vwr.tm.slabToPercent(percent); return; case T.on: - checkLength(2); - TF = true; + TF = true; //$FALL-THROUGH$ case T.off: checkLength(2); @@ -7508,10 +7507,8 @@ return; case T.set: checkLength(2); - if (chk) - return; - vwr.tm.setSlabDepthInternal(isDepth); - setBooleanProperty("slabEnabled", true); + if (!chk) + vwr.tm.setSlabDepthInternal(isDepth); return; case T.minus: str = paramAsStr(2); Modified: trunk/Jmol/src/org/jmol/scriptext/IsoExt.java =================================================================== --- trunk/Jmol/src/org/jmol/scriptext/IsoExt.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/scriptext/IsoExt.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -78,7 +78,7 @@ @Override public String dispatch(int iTok, boolean b, T[] st) throws ScriptException { - chk = e.chk; + chk = e.chk; slen = e.slen; this.st = st; @@ -1132,7 +1132,7 @@ boolean isPmesh = (iShape == JC.SHAPE_PMESH); boolean isPlot3d = (iShape == JC.SHAPE_PLOT3D); boolean isLcaoCartoon = (iShape == JC.SHAPE_LCAOCARTOON); - boolean isSilent = (isLcaoCartoon || tokAt(1) == T.delete); + boolean isSilent = (isLcaoCartoon || tokAt(1) == T.delete || eval.isStateScript); boolean surfaceObjectSeen = false; boolean planeSeen = false; boolean isMapped = false; Modified: trunk/Jmol/src/org/jmol/viewer/Jmol.properties =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/viewer/Jmol.properties 2016-02-18 04:29:30 UTC (rev 20963) @@ -63,12 +63,25 @@ TODO: consider if models with no atoms will cause issues in relation to model.firstAtomIndex TODO: isosurface molecular has an issue with 2gb1 +TODO: slab SET will not be rendered correctly when exported because tm.transformPoint -Jmol.___JmolVersion="14.5.2_2016.02.15" +Jmol.___JmolVersion="14.5.3_2016.02.17" +bug fix: slab/depth SET do not behave properly +bug fix: select VISIBLE is not properly set based on slab/depth SET + bug fix: _GEOM_BOND reading in CIF files nonfunctional. - -- broken in 14.3.16_2015.08.11 - -- only affects CCDC file reading, as it requires presence of _ccdc_geom_bond_type + -- broken in 13.3.4_dev_2013.08.21 + -- result is that between 8/21/2013 and 2/15/2016 the CIF reader + would not recognize _GEOM_BOND and so also not create whole molecules + as it was designed to do when those are present. + -- no impact on states created within this version range + -- no impact on mmCIF reader + -- only impact is upon Materials Studio-generated files such as + http://www.rsc.org/suppdata/cc/c2/c2cc34714h/c2cc34714h.txt + (supplemental mat. for http://pubs.rsc.org/en/Content/ArticleLanding/2012/CC/c2cc34714h) + See Jmol list discussion: https://sourceforge.net/p/jmol/mailman/message/31308577/ + JmolVersion="14.5.2_2016.02.14" Modified: trunk/Jmol/src/org/jmol/viewer/ShapeManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ShapeManager.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/viewer/ShapeManager.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -57,6 +57,7 @@ public ShapeManager(Viewer vwr) { this.vwr = vwr; bsRenderableAtoms = new BS(); + bsSlabbedInternal = new BS(); } /** @@ -308,10 +309,11 @@ Object getProperty(Object paramInfo) { if (paramInfo.equals("getShapes")) return shapes; + // could be more here... return null; } - public final BS bsRenderableAtoms; + public final BS bsRenderableAtoms, bsSlabbedInternal; public Shape getShape(int i) { //RepaintManager @@ -401,39 +403,43 @@ private final int[] navMinMax = new int[4]; - public int[] finalizeAtoms(boolean checkAtoms, boolean finalizeParams) { + public int[] finalizeAtoms(BS bsTranslateSelected, boolean finalizeParams) { Viewer vwr = this.vwr; + TransformManager tm = vwr.tm; if (finalizeParams) vwr.finalizeTransformParameters(); - TransformManager tm = vwr.tm; - BS bs = bsRenderableAtoms; - BS bsAtoms = (checkAtoms ? tm.bsSelectedAtoms : null); - if (bsAtoms != null) { + if (bsTranslateSelected != null) { // translateSelected operation - P3 ptCenter = ms.getAtomSetCenter(bsAtoms); + P3 ptCenter = ms.getAtomSetCenter(bsTranslateSelected); P3 pt = new P3(); tm.transformPt3f(ptCenter, pt); pt.add(tm.ptOffset); tm.unTransformPoint(pt, pt); pt.sub(ptCenter); - vwr.setAtomCoordsRelative(pt, bsAtoms); + vwr.setAtomCoordsRelative(pt, bsTranslateSelected); tm.ptOffset.set(0, 0, 0); tm.bsSelectedAtoms = null; } - ms.getAtomsInFrame(bs); + BS bsOK = bsRenderableAtoms; + ms.getAtomsInFrame(bsOK); Vibration[] vibrationVectors = ms.vibrations; boolean vibs = (vibrationVectors != null && tm.vibrationOn); boolean checkOccupancy = (ms.bsModulated != null && ms.occupancies != null); Atom[] atoms = ms.at; int occ; boolean haveMods = false; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + BS bsSlabbed = bsSlabbedInternal; + bsSlabbed.clearAll(); + for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) { // note that this vibration business is not compatible with // PDB objects such as cartoons and traces, which // use Cartesian coordinates, not screen coordinates Atom atom = atoms[i]; P3i screen = (vibs && atom.hasVibration() ? tm.transformPtVib(atom, vibrationVectors[i]) : tm.transformPt(atom)); + if (screen.z == 1 && tm.internalSlab && tm.xyzIsSlabbedInternal(atom)) { + bsSlabbed.set(i); + } atom.sX = screen.x; atom.sY = screen.y; atom.sZ = screen.z; @@ -471,7 +477,7 @@ JmolMolecule m = molecules[i]; int j = 0; int pt = m.firstAtomIndex; - if (!bs.get(pt)) + if (!bsOK.get(pt)) continue; for (; j < m.ac; j++, pt++) if (gdata.isClippedZ(atoms[pt].sZ - (atoms[pt].sD >> 1))) @@ -479,13 +485,13 @@ if (j != m.ac) { pt = m.firstAtomIndex; for (int k = 0; k < m.ac; k++) { - bs.clear(pt); + bsOK.clear(pt); atoms[pt++].sZ = 0; } } } } - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) { Atom atom = atoms[i]; if (gdata.isClippedZ(atom.sZ - (slabByAtom ? atoms[i].sD >> 1 : 0))) { atom.setClickable(0); @@ -494,7 +500,7 @@ int r = (slabByAtom ? -1 : 1) * atom.sD / 2; if (atom.sZ + r < minZ || atom.sZ - r > maxZ || !gdata.isInDisplayRange(atom.sX, atom.sY)) { - bs.clear(i); + bsOK.clear(i); } } } @@ -506,7 +512,7 @@ int maxX = Integer.MIN_VALUE; int minY = Integer.MAX_VALUE; int maxY = Integer.MIN_VALUE; - for (int i = bs.nextSetBit(0); i >= 0; i = bs.nextSetBit(i + 1)) { + for (int i = bsOK.nextSetBit(0); i >= 0; i = bsOK.nextSetBit(i + 1)) { Atom atom = atoms[i]; if (atom.sX < minX) minX = atom.sX; Modified: trunk/Jmol/src/org/jmol/viewer/StateCreator.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/viewer/StateCreator.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -808,11 +808,12 @@ if (vwr.ms.modelSetHasVibrationVectors() && tm.vibrationOn) app(commands, "set vibrationPeriod " + tm.vibrationPeriod + ";vibration on"); + boolean slabInternal = (tm.depthPlane != null || tm.slabPlane != null); if (navigating) { commands.append(tm.getNavigationState()); - if (tm.depthPlane != null || tm.slabPlane != null) - commands.append(" slab on;\n"); - } + } + if (!tm.slabEnabled && slabInternal) + commands.append(" slab off;\n"); if (sfunc != null) commands.append("}\n\n"); return commands.toString(); Modified: trunk/Jmol/src/org/jmol/viewer/TransformManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/viewer/TransformManager.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -831,7 +831,7 @@ public boolean slabEnabled; public boolean zShadeEnabled; - boolean internalSlab; + public boolean internalSlab; int slabPercentSetting; int depthPercentSetting; @@ -851,8 +851,7 @@ } void setSlabEnabled(boolean slabEnabled) { - this.slabEnabled = slabEnabled; - vwr.g.setB("slabEnabled", slabEnabled); + vwr.g.setB("slabEnabled", this.slabEnabled = slabEnabled); } void setZShadeEnabled(boolean zShadeEnabled) { @@ -922,15 +921,16 @@ } public void slabToPercent(int percentSlab) { + slabPlane = null; vwr.setFloatProperty("slabRange", 0); slabPercentSetting = percentSlab; - slabPlane = null; if (depthPercentSetting >= slabPercentSetting) depthPercentSetting = slabPercentSetting - 1; slabDepthChanged(); } public void depthToPercent(int percentDepth) { + depthPlane = null; vwr.g.setI("depth", percentDepth); depthPercentSetting = percentDepth; if (slabPercentSetting <= depthPercentSetting) @@ -972,23 +972,24 @@ depthPlane = null; else slabPlane = null; + finalizeTransformParameters(); slabInternal(getSlabDepthPlane(isDepth), isDepth); } private P4 getSlabDepthPlane(boolean isDepth) { // the third row of the matrix defines the Z coordinate, which is all we need // and, in fact, it defines the plane. How convenient! - // eval "slab set" + // eval "slab set" if (isDepth) { if (depthPlane != null) return depthPlane; - } else { - if (slabPlane != null) + } else if (slabPlane != null) { return slabPlane; } M4 m = matrixTransform; - return P4.new4(-m.m20, -m.m21, -m.m22, -m.m23 + P4 plane = P4.new4(-m.m20, -m.m21, -m.m22, -m.m23 + (isDepth ? depthValue : slabValue)); + return plane; } /* *************************************************************** @@ -1446,7 +1447,6 @@ // don't care } } - vwr.g.setO("_slabPlane", Escape.eP4(getSlabDepthPlane(false))); vwr.g.setO("_depthPlane", Escape.eP4(getSlabDepthPlane(true))); if (slabEnabled) @@ -1508,9 +1508,16 @@ public void transformPtScrT3(T3 ptXYZ, T3 pointScreen) { transformPt(ptXYZ); + // note that this point may be returned as z=1 if the point is + // past the camera or slabbed internally pointScreen.setT(fScrPt); } + public void transformPt3f(T3 ptXYZ, P3 screen) { + applyPerspective(ptXYZ, ptXYZ); + screen.setT(fScrPt); + } + public void transformPtNoClip(T3 ptXYZ, T3 pointScreen) { applyPerspective(ptXYZ, null); pointScreen.setT(fScrPt); @@ -1548,11 +1555,6 @@ (Float.isNaN(scale) ? vibrationScale : scale), vwr.g.modulationScale); } - public void transformPt3f(T3 ptXYZ, P3 screen) { - applyPerspective(ptXYZ, ptXYZ); - screen.setT(fScrPt); - } - public synchronized P3i transformPt2D(T3 ptXyp) { // axes position [50 50] // just does the processing for [x y] and [x y %] @@ -1650,16 +1652,19 @@ iScrPt.set((int) fScrPt.x, (int) fScrPt.y, (int) fScrPt.z); - if (ptRef != null - && (slabPlane != null - && ptRef.x * slabPlane.x + ptRef.y * slabPlane.y + ptRef.z - * slabPlane.z + slabPlane.w > 0 || depthPlane != null - && ptRef.x * depthPlane.x + ptRef.y * depthPlane.y + ptRef.z - * depthPlane.z + depthPlane.w < 0)) + if (ptRef != null && xyzIsSlabbedInternal(ptRef)) fScrPt.z = iScrPt.z = 1; return iScrPt; } + public boolean xyzIsSlabbedInternal(T3 ptRef) { + return (slabPlane != null + && ptRef.x * slabPlane.x + ptRef.y * slabPlane.y + ptRef.z + * slabPlane.z + slabPlane.w > 0 || depthPlane != null + && ptRef.x * depthPlane.x + ptRef.y * depthPlane.y + ptRef.z + * depthPlane.z + depthPlane.w < 0); + } + final protected P3 untransformedPoint = new P3(); /* *************************************************************** Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-15 20:33:16 UTC (rev 20962) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2016-02-18 04:29:30 UTC (rev 20963) @@ -3346,7 +3346,7 @@ return; if (!haveDisplay) { setModelVisibility(); - shm.finalizeAtoms(false, true); + shm.finalizeAtoms(null, true); return; } rm.requestRepaintAndWait(why); @@ -3630,7 +3630,7 @@ || rm == null) return; boolean antialias2 = antialiased && g.antialiasTranslucent; - int[] navMinMax = shm.finalizeAtoms(true, true); + int[] navMinMax = shm.finalizeAtoms(tm.bsSelectedAtoms, true); if (isWebGL) { rm.renderExport(gdata, ms, jsParams); notifyViewerRepaintDone(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Site24x7 APM Insight: Get Deep Visibility into Application Performance APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month Monitor end-to-end web transactions and take corrective actions now Troubleshoot faster and improve end-user experience. Signup Now! http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140 _______________________________________________ Jmol-commits mailing list Jmol-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jmol-commits