@Override
  protected boolean gotoAndReadVoxelData(boolean isMapData) {
    initializeVolumetricData();
    if (nPointsX < 0 || nPointsY < 0 || nPointsZ < 0) return true;
    try {
      gotoData(params.fileIndex - 1, nPointsX * nPointsY * nPointsZ);
      if (vertexDataOnly) return true;
      volumeData.setMappingPlane(params.thePlane);
      readSurfaceData(isMapData);
      volumeData.setMappingPlane(null);

      if (edgeDataCount > 0) jvxlEdgeDataRead = jvxlReadFractionData("edge", edgeDataCount);
      params.bsExcluded = jvxlData.jvxlExcluded = new BS[4];
      hasColorData = (colorDataCount > 0); // for nonXML version of JVXL
      if (hasColorData) jvxlColorDataRead = jvxlReadFractionData("color", colorDataCount);
      if (excludedVertexCount > 0) {
        jvxlData.jvxlExcluded[0] =
            JvxlCoder.jvxlDecodeBitSet(xr.getXmlData("jvxlExcludedVertexData", null, false, false));
        if (xr.isNext("jvxlExcludedPlaneData"))
          jvxlData.jvxlExcluded[2] =
              JvxlCoder.jvxlDecodeBitSet(
                  xr.getXmlData("jvxlExcludedPlaneData", null, false, false));
      }
      if (excludedTriangleCount > 0)
        jvxlData.jvxlExcluded[3] =
            JvxlCoder.jvxlDecodeBitSet(
                xr.getXmlData("jvxlExcludedTriangleData", null, false, false));
      if (invalidatedVertexCount > 0)
        jvxlData.jvxlExcluded[1] =
            JvxlCoder.jvxlDecodeBitSet(
                xr.getXmlData("jvxlInvalidatedVertexData", null, false, false));
      if (haveContourData)
        jvxlDecodeContourData(jvxlData, xr.getXmlData("jvxlContourData", null, false, false));
      if (jvxlDataIsColorMapped && jvxlData.nVertexColors > 0) {
        jvxlData.vertexColorMap = new Hashtable<String, BS>();
        String vdata = xr.getXmlData("jvxlVertexColorData", null, true, false);
        String baseColor = XmlReader.getXmlAttrib(vdata, "baseColor");
        jvxlData.baseColor = (baseColor.length() > 0 ? baseColor : null);
        for (int i = 0; i < jvxlData.nVertexColors; i++) {
          String s = xr.getXmlData("jvxlColorMap", vdata, true, false);
          String color = XmlReader.getXmlAttrib(s, "color");
          BS bs = JvxlCoder.jvxlDecodeBitSet(xr.getXmlData("jvxlColorMap", s, false, false));
          jvxlData.vertexColorMap.put(color, bs);
        }
      }

    } catch (Exception e) {
      Logger.error(e.toString());
      return false;
    }
    return true;
  }
 /**
  * decode vertex data found within <jvxlVertexData> element as created by jvxlEncodeVertexData
  * (see above)
  *
  * @param data tag and contents
  * @param asArray or just addVertexCopy
  * @return Point3f[] if desired
  * @throws Exception
  */
 public P3[] jvxlDecodeVertexData(String data, boolean asArray) throws Exception {
   int vertexCount = parseIntStr(XmlReader.getXmlAttrib(data, "count"));
   if (!asArray) Logger.info("Reading " + vertexCount + " vertices");
   int ptCount = vertexCount * 3;
   P3[] vertices = (asArray ? new P3[vertexCount] : null);
   P3 p = (asArray ? null : new P3());
   float fraction;
   String vData = XmlReader.getXmlAttrib(data, "data");
   String encoding = getEncoding(data);
   if ("none".equals(encoding)) {
     if (vData.length() == 0) vData = xr.getXmlData("jvxlVertexData", data, false, false);
     float[] fdata = PT.parseFloatArray(vData);
     // first point is count -- ignored.
     if (fdata[0] != vertexCount * 3)
       Logger.info(
           "JvxlXmlReader: vertexData count="
               + ((int) fdata[0])
               + "; expected "
               + (vertexCount * 3));
     for (int i = 0, pt = 1; i < vertexCount; i++) {
       p = P3.new3(fdata[pt++], fdata[pt++], fdata[pt++]);
       if (asArray) vertices[i] = p;
       else addVertexCopy(p, 0, i);
     }
   } else {
     P3 min = xr.getXmlPoint(data, "min");
     P3 range = xr.getXmlPoint(data, "max");
     range.sub(min);
     int colorFractionBase = jvxlData.colorFractionBase;
     int colorFractionRange = jvxlData.colorFractionRange;
     String s = JvxlCoder.jvxlDecompressString(vData);
     if (s.length() == 0) s = xr.getXmlData("jvxlVertexData", data, false, false);
     for (int i = 0, pt = -1; i < vertexCount; i++) {
       if (asArray) p = vertices[i] = new P3();
       fraction =
           JvxlCoder.jvxlFractionFromCharacter2(
               s.charAt(++pt), s.charAt(pt + ptCount), colorFractionBase, colorFractionRange);
       p.x = min.x + fraction * range.x;
       fraction =
           JvxlCoder.jvxlFractionFromCharacter2(
               s.charAt(++pt), s.charAt(pt + ptCount), colorFractionBase, colorFractionRange);
       p.y = min.y + fraction * range.y;
       fraction =
           JvxlCoder.jvxlFractionFromCharacter2(
               s.charAt(++pt), s.charAt(pt + ptCount), colorFractionBase, colorFractionRange);
       p.z = min.z + fraction * range.z;
       if (!asArray) addVertexCopy(p, 0, i);
     }
   }
   return vertices;
 }
 /**
  * "edge" data includes two parts -- a compressed bitset indicating exactly which edges, in order
  * or processing by Jmol, are crossed by the surface, and a set of fractions indicating how far
  * along that edge (good to 1 part in 8100) that surface crosses that edge. We are just reading he
  * fractions here.
  *
  * <p>"color" data comprises the corresponding sequence of data mapping values, again stored to a
  * precision of 1 part in 8100, relative to a range of values.
  *
  * @param type
  * @param nPoints
  * @return data
  */
 protected String jvxlReadFractionData(String type, int nPoints) {
   String str;
   try {
     if (type.equals("edge")) {
       str = JvxlCoder.jvxlDecompressString(XmlReader.getXmlAttrib(tempDataXml, "data"));
     } else {
       String data = xr.getXmlData("jvxlColorData", null, true, false);
       jvxlData.isJvxlPrecisionColor = getEncoding(data).endsWith("2");
       str = JvxlCoder.jvxlDecompressString(XmlReader.getXmlAttrib(data, "data"));
     }
   } catch (Exception e) {
     Logger.error("Error reading " + type + " data " + e);
     throw new NullPointerException();
   }
   return str;
 }
 protected void readVector(int voxelVectorIndex) throws Exception {
   String data = xr.getXmlData("jvxlVolumeVector", tempDataXml, true, true);
   tempDataXml = tempDataXml.substring(tempDataXml.indexOf(data) + data.length());
   int n = parseIntStr(XmlReader.getXmlAttrib(data, "count"));
   if (n == Integer.MIN_VALUE) vertexDataOnly = true;
   voxelCounts[voxelVectorIndex] = (n < 0 ? 0 : n);
   volumetricVectors[voxelVectorIndex].setT(xr.getXmlPoint(data, "vector"));
   if (isAnisotropic) setVectorAnisotropy(volumetricVectors[voxelVectorIndex]);
 }
 protected void jvxlDecodeContourData(JvxlData jvxlData, String data) throws Exception {
   List<List<Object>> vs = new List<List<Object>>();
   SB values = new SB();
   SB colors = new SB();
   int pt = -1;
   jvxlData.vContours = null;
   if (data == null) return;
   while ((pt = data.indexOf("<jvxlContour", pt + 1)) >= 0) {
     List<Object> v = new List<Object>();
     String s = xr.getXmlData("jvxlContour", data.substring(pt), true, false);
     float value = parseFloatStr(XmlReader.getXmlAttrib(s, "value"));
     values.append(" ").appendF(value);
     int color = getColor(XmlReader.getXmlAttrib(s, "color"));
     short colix = C.getColix(color);
     colors.append(" ").append(Escape.escapeColor(color));
     String fData = JvxlCoder.jvxlDecompressString(XmlReader.getXmlAttrib(s, "data"));
     BS bs = JvxlCoder.jvxlDecodeBitSet(xr.getXmlData("jvxlContour", s, false, false));
     int n = bs.length();
     IsosurfaceMesh.setContourVector(v, n, bs, value, colix, color, SB.newS(fData));
     vs.addLast(v);
   }
   int n = vs.size();
   if (n > 0) {
     jvxlData.vContours = AU.createArrayOfArrayList(n);
     // 3D contour values and colors
     jvxlData.contourColixes = params.contourColixes = new short[n];
     jvxlData.contourValues = params.contoursDiscrete = new float[n];
     for (int i = 0; i < n; i++) {
       jvxlData.vContours[i] = vs.get(i);
       jvxlData.contourValues[i] = ((Float) jvxlData.vContours[i].get(2)).floatValue();
       jvxlData.contourColixes[i] = ((short[]) jvxlData.vContours[i].get(3))[0];
     }
     jvxlData.contourColors = C.getHexCodes(jvxlData.contourColixes);
     Logger.info("JVXL read: " + n + " discrete contours");
     Logger.info("JVXL read: contour values: " + values);
     Logger.info("JVXL read: contour colors: " + colors);
   }
 }
 @Override
 protected void readParameters() throws Exception {
   String s = xr.getXmlData("jvxlFileTitle", null, false, false);
   jvxlFileHeaderBuffer = SB.newS(s);
   xr.toTag("jvxlVolumeData");
   String data = tempDataXml = xr.getXmlData("jvxlVolumeData", null, true, false);
   volumetricOrigin.setT(xr.getXmlPoint(data, "origin"));
   isAngstroms = true;
   readVector(0);
   readVector(1);
   readVector(2);
   line = xr.toTag("jvxlSurfaceSet");
   nSurfaces = parseIntStr(XmlReader.getXmlAttrib(line, "count"));
   Logger.info("jvxl file surfaces: " + nSurfaces);
   Logger.info("using default edge fraction base and range");
   Logger.info("using default color fraction base and range");
   cJvxlEdgeNaN = (char) (edgeFractionBase + edgeFractionRange);
 }
 /**
  * decode triangle data found within <jvxlTriangleData> element as created with
  * jvxlEncodeTriangleData (see above)
  *
  * @param tdata tag and contents
  * @param edgeData
  * @param colorData
  * @throws Exception
  */
 void jvxlDecodeTriangleData(String tdata, String edgeData, String colorData) throws Exception {
   int nTriangles = parseIntStr(XmlReader.getXmlAttrib(tdata, "count"));
   if (nTriangles < 0) return;
   int[] nextc = new int[1];
   int nColors = (colorData == null ? -1 : PT.parseIntNext(colorData, nextc));
   int color = 0;
   Logger.info("Reading " + nTriangles + " triangles");
   String encoding = getEncoding(tdata);
   tdata = getData(tdata, "jvxlTriangleData");
   String edata = getData(edgeData, "jvxlTriangleEdgeData");
   int[] vertex = new int[3];
   int[] nextp = new int[1];
   int[] nexte = null;
   int edgeMask = 7;
   boolean haveEdgeInfo;
   boolean haveEncoding = !"none".equals(encoding);
   if (haveEncoding) {
     tdata = JvxlCoder.jvxlDecompressString(tdata);
     edata = JvxlCoder.jvxlDecompressString(edata).trim();
     haveEdgeInfo = (edata.length() == nTriangles);
   } else {
     int n = PT.parseIntNext(tdata, nextp);
     haveEdgeInfo = (edata.length() > 0);
     if (haveEdgeInfo) {
       nexte = new int[1];
       PT.parseIntNext(edata, nexte); // throw away count
     } else if (n > 0) {
       Logger.info("JvxlXmlReader: jvxlTriangleEdgeData count=" + n + "; expected " + nTriangles);
     }
   }
   for (int i = 0, v = 0, p = 0, pt = -1; i < nTriangles; ) {
     if (haveEncoding) {
       char ch = tdata.charAt(++pt);
       int diff;
       switch (ch) {
         case '!':
           diff = 0;
           break;
         case '+':
         case '.':
         case ' ':
         case '\n':
         case '\r':
         case '\t':
         case ',':
           continue;
         case '-':
         case '0':
         case '1':
         case '2':
         case '3':
         case '4':
         case '5':
         case '6':
         case '7':
         case '8':
         case '9':
           nextp[0] = pt;
           diff = PT.parseIntNext(tdata, nextp);
           pt = nextp[0] - 1;
           break;
         default:
           diff = ch - 92; // '\' character
       }
       v += diff;
     } else {
       v = PT.parseIntNext(tdata, nextp) - 1;
     }
     vertex[p] = v;
     if (++p == 3) {
       p = 0;
       if (haveEdgeInfo) {
         edgeMask =
             (nexte == null ? edata.charAt(i) - '0' : javajs.util.PT.parseIntNext(edata, nexte));
         if (edgeMask < 0 || edgeMask > 7) edgeMask = 7;
       }
       if (nColors > 0) {
         int c = PT.parseIntNext(colorData, nextc);
         if (c == Integer.MIN_VALUE) nColors = 0;
         else color = c;
         nColors--;
       }
       addTriangleCheck(vertex[0], vertex[1], vertex[2], edgeMask, 0, false, color);
       i++;
     }
   }
 }
 private static String getEncoding(String data) {
   // original JVXL does not include "encoding"
   if (XmlReader.getXmlAttrib(data, "len").length() > 0) return "";
   String s = XmlReader.getXmlAttrib(data, "encoding");
   return (s.length() == 0 ? "none" : s);
 }
 private String getData(String sdata, String name) throws Exception {
   String data = XmlReader.getXmlAttrib(sdata, "data");
   if (data.length() == 0) data = xr.getXmlData(name, sdata, false, false);
   return data;
 }
示例#10
0
  protected void jvxlReadSurfaceInfo() throws Exception {
    String s;
    String data = xr.getXmlData("jvxlSurfaceInfo", null, true, true);
    isXLowToHigh = XmlReader.getXmlAttrib(data, "isXLowToHigh").equals("true");
    jvxlCutoff = parseFloatStr(XmlReader.getXmlAttrib(data, "cutoff"));
    if (!Float.isNaN(jvxlCutoff)) Logger.info("JVXL read: cutoff " + jvxlCutoff);
    int nContourData = parseIntStr(XmlReader.getXmlAttrib(data, "nContourData"));
    haveContourData = (nContourData > 0);
    params.isContoured = XmlReader.getXmlAttrib(data, "contoured").equals("true");
    if (params.isContoured) {
      int nContoursRead = parseIntStr(XmlReader.getXmlAttrib(data, "nContours"));
      if (nContoursRead <= 0) {
        nContoursRead = 0;
      } else {
        s = XmlReader.getXmlAttrib(data, "contourValues");
        if (s.length() > 0) {
          jvxlData.contourValues = params.contoursDiscrete = parseFloatArrayStr(s);
          Logger.info("JVXL read: contourValues " + Escape.eAF(jvxlData.contourValues));
        }
        s = XmlReader.getXmlAttrib(data, "contourColors");
        if (s.length() > 0) {
          jvxlData.contourColixes = params.contourColixes = C.getColixArray(s);
          jvxlData.contourColors = C.getHexCodes(jvxlData.contourColixes);
          Logger.info("JVXL read: contourColixes " + C.getHexCodes(jvxlData.contourColixes));
        }
        params.contourFromZero = XmlReader.getXmlAttrib(data, "contourFromZero").equals("true");
      }
      params.nContours = (haveContourData ? nContourData : nContoursRead);
      // TODO ? params.contourFromZero = false; // MEP data to complete the plane
    }
    jvxlData.nVertexColors = parseIntStr(XmlReader.getXmlAttrib(data, "nVertexColors"));
    params.isBicolorMap = XmlReader.getXmlAttrib(data, "bicolorMap").equals("true");
    if (params.isBicolorMap) {
      // TODO -- not quite right, because
      s = XmlReader.getXmlAttrib(data, "colorPositive");
      if (s.length() > 0
          && params.colorRgb == Integer.MIN_VALUE
          && params.colorPos == Parameters.defaultColorPositive)
        params.colorPos = CU.getArgbFromString(s);
      s = XmlReader.getXmlAttrib(data, "colorNegative");
      if (s.length() > 0
          && params.colorRgb == Integer.MIN_VALUE
          && params.colorNeg == Parameters.defaultColorNegative)
        params.colorNeg = CU.getArgbFromString(s);
    }
    if (params.isBicolorMap || params.colorBySign) jvxlCutoff = 0;
    jvxlDataIsColorMapped =
        ((params.colorRgb == Integer.MIN_VALUE || params.colorRgb == Integer.MAX_VALUE)
            && (params.isBicolorMap || XmlReader.getXmlAttrib(data, "colorMapped").equals("true")));
    // isJvxlPrecisionColor is for information only -- will be superceded by encoding attribute of
    // jvxlColorData
    jvxlData.isJvxlPrecisionColor = XmlReader.getXmlAttrib(data, "precisionColor").equals("true");
    jvxlData.jvxlDataIsColorDensity =
        params.colorDensity =
            (params.colorRgb == Integer.MIN_VALUE
                && XmlReader.getXmlAttrib(data, "colorDensity").equals("true"));
    if (jvxlData.jvxlDataIsColorDensity && Float.isNaN(params.pointSize)) {
      s = XmlReader.getXmlAttrib(data, "pointSize");
      if (s.length() > 0) jvxlData.pointSize = params.pointSize = parseFloatStr(s);
    }
    s = XmlReader.getXmlAttrib(data, "allowVolumeRender");
    jvxlData.allowVolumeRender =
        params.allowVolumeRender = (s.length() == 0 || s.equalsIgnoreCase("true"));
    s = XmlReader.getXmlAttrib(data, "plane");
    if (s.indexOf("{") >= 0) {
      params.thePlane = null;
      params.mapLattice = null;
      try {
        params.thePlane = (P4) Escape.uP(s);
        s = XmlReader.getXmlAttrib(data, "maplattice");
        Logger.info("JVXL read: plane " + params.thePlane);
        if (s.indexOf("{") >= 0) {
          params.mapLattice = (P3) Escape.uP(s);
          Logger.info("JVXL read: mapLattice " + params.mapLattice);
        }
        if (params.scale3d == 0)
          params.scale3d = parseFloatStr(XmlReader.getXmlAttrib(data, "scale3d"));
        if (Float.isNaN(params.scale3d)) params.scale3d = 0;
      } catch (Exception e) {
        if (params.thePlane == null) {
          Logger.error("JVXL Error reading plane definition -- setting to 0 0 1 0  (z=0)");
          params.thePlane = P4.new4(0, 0, 1, 0);
        } else {
          Logger.error("JVXL Error reading mapLattice definition -- ignored");
        }
      }
      surfaceDataCount = 0;
      edgeDataCount = 0;
    } else {
      params.thePlane = null;
      surfaceDataCount = parseIntStr(XmlReader.getXmlAttrib(data, "nSurfaceInts"));
      edgeDataCount = parseIntStr(XmlReader.getXmlAttrib(data, "nBytesUncompressedEdgeData"));
    }
    excludedVertexCount = parseIntStr(XmlReader.getXmlAttrib(data, "nExcludedVertexes"));
    excludedTriangleCount = parseIntStr(XmlReader.getXmlAttrib(data, "nExcludedTriangles"));
    invalidatedVertexCount = parseIntStr(XmlReader.getXmlAttrib(data, "nInvalidatedVertexes"));
    s = XmlReader.getXmlAttrib(data, "slabInfo");
    if (s.length() > 0) jvxlData.slabInfo = s;
    colorDataCount =
        Math.max(0, parseIntStr(XmlReader.getXmlAttrib(data, "nBytesUncompressedColorData")));
    jvxlDataIs2dContour = (params.thePlane != null && jvxlDataIsColorMapped);

    // new Jmol 12.1.50
    jvxlData.color = XmlReader.getXmlAttrib(data, "color");
    if (jvxlData.color.length() == 0 || jvxlData.color.indexOf("null") >= 0)
      jvxlData.color = "orange";
    jvxlData.translucency = parseFloatStr(XmlReader.getXmlAttrib(data, "translucency"));
    if (Float.isNaN(jvxlData.translucency)) jvxlData.translucency = 0;
    s = XmlReader.getXmlAttrib(data, "meshColor");
    if (s.length() > 0) jvxlData.meshColor = s;
    s = XmlReader.getXmlAttrib(data, "rendering");
    if (s.length() > 0) jvxlData.rendering = s;
    jvxlData.colorScheme = XmlReader.getXmlAttrib(data, "colorScheme");
    if (jvxlData.colorScheme.length() == 0) jvxlData.colorScheme = null;
    if (jvxlData.thisSet < 0) {
      int n = parseIntStr(XmlReader.getXmlAttrib(data, "set"));
      if (n > 0) jvxlData.thisSet = n - 1;
    }
    jvxlData.slabValue = parseIntStr(XmlReader.getXmlAttrib(data, "slabValue"));
    jvxlData.isSlabbable = (XmlReader.getXmlAttrib(data, "slabbable").equalsIgnoreCase("true"));
    jvxlData.diameter = parseIntStr(XmlReader.getXmlAttrib(data, "diameter"));
    if (jvxlData.diameter == Integer.MIN_VALUE) jvxlData.diameter = 0;

    if (jvxlDataIs2dContour) params.isContoured = true;

    if (params.colorBySign) params.isBicolorMap = true;
    boolean insideOut = XmlReader.getXmlAttrib(data, "insideOut").equals("true");
    float dataMin = Float.NaN;
    float dataMax = Float.NaN;
    float red = Float.NaN;
    float blue = Float.NaN;
    if (jvxlDataIsColorMapped) {
      dataMin = parseFloatStr(XmlReader.getXmlAttrib(data, "dataMinimum"));
      dataMax = parseFloatStr(XmlReader.getXmlAttrib(data, "dataMaximum"));
      red = parseFloatStr(XmlReader.getXmlAttrib(data, "valueMappedToRed"));
      blue = parseFloatStr(XmlReader.getXmlAttrib(data, "valueMappedToBlue"));
      if (Float.isNaN(dataMin)) {
        dataMin = red = -1f;
        dataMax = blue = 1f;
      }
    }
    jvxlSetColorRanges(dataMin, dataMax, red, blue, insideOut);
  }