Isosurface
Date: 2019-10-22

org.jmol.shapesurface

## Class Isosurface

- java.lang.Object
- - org.jmol.shape.Shape
  - - org.jmol.shape.MeshCollection
    - - org.jmol.shapesurface.Isosurface

- All Implemented Interfaces:
    MeshDataServer, VertexDataServer
  Direct Known Subclasses:
    Contact, LcaoCartoon, MolecularOrbital, Pmesh

      public class Isosurface
      extends MeshCollection
      implements MeshDataServer

- - ### Field Summary

    Fields
    Modifier and Type | Field and Description
    --- | ---
    `private java.lang.String` | `actualID`
    `(package private) boolean` | `allowMesh`
    `private boolean` | `associateNormals`
    `private int` | `atomIndex`
    `private javajs.util.P3` | `center`
    `private int` | `colorType`
    `private float[]` | `cutoffRange`
    `private short` | `defaultColix`
    `private boolean` | `explicitContours`
    `protected boolean` | `iHaveBitSets`
    `private boolean` | `iHaveModelIndex`
    `private boolean` | `isColorExplicit`
    `protected IsosurfaceMesh[]` | `isomeshes`
    `private boolean` | `isPhaseColored`
    `private boolean` | `isWithinNot`
    `protected JvxlData` | `jvxlData`
    `int[]` | `keyXy`
    `private javajs.util.P4` | `lcaoDir`
    `private static int` | `MAX_OBJECT_CLICK_DISTANCE_SQUARED`
    `private short` | `meshColix`
    `private float[]` | `moLinearCombination`
    `private int` | `moNumber`
    `private java.lang.String` | `newFileName`
    `private int` | `nLCAO`
    `private java.lang.String` | `oldFileName`
    `private javajs.util.P3i` | `ptXY`
    `private float` | `scale3d`
    `private java.lang.String` | `script`
    `private java.lang.String` | `scriptAppendix`
    `protected SurfaceGenerator` | `sg`
    `protected IsosurfaceMesh` | `thisMesh`
    `private float` | `withinDistance2`
    `private javajs.util.Lst<javajs.util.P3>` | `withinPoints`

    - ### Fields inherited from class org.jmol.shape.MeshCollection

      `bsDisplay, colix, color, connections, currentMesh, displayWithinDistance2, displayWithinPoints, explicitID, htObjects, isDisplayWithinNot, isFixed, linkedMesh, meshCount, meshes, modelIndex, nUnnamed, pickedMesh, pickedModel, pickedPt, pickedVertex, PREVIOUS_MESH_ID, previousMeshID, title`

    - ### Fields inherited from class org.jmol.shape.Shape

      `bsColixSet, bsSizeSet, isBioShape, ms, myType, RADIUS_MAX, shapeID, translucentAllowed, translucentLevel, vf, vwr`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `Isosurface()`

  - ### Method Summary

    All Methods Static Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected void` | `addMeshInfo(IsosurfaceMesh mesh, java.util.Map<java.lang.String,java.lang.Object> info)`
    `void` | `addRequiredFile(java.lang.String fileName)`
    `int` | `addTriangleCheck(int iA, int iB, int iC, int check, int iContour, boolean isAbsolute, int color)` addTriangleCheck adds a triangle along with a 3-bit check indicating which edges to draw in mesh mode: 1 (iA-iB) + 2 (iB-iC) + 4 (iC-iA)
    `int` | `addVertexCopy(javajs.util.T3 vertexXYZ, float value, int assocVertex, boolean asCopy)` addVertexCopy is used by the Marching Squares algorithm to uniquely identify a new vertex when an edge is crossed in the 2D plane.
    `void` | `allocMesh(java.lang.String thisID, Mesh m)`
    `javajs.util.P3[]` | `calculateGeodesicSurface(javajs.util.BS bsSelected, float envelopeRadius)`
    `private java.lang.Object` | `calculateVolumeOrArea(IsosurfaceMesh mesh, boolean isArea)`
    `java.util.Map<java.lang.String,java.lang.Object>` | `checkObjectClicked(int x, int y, int action, javajs.util.BS bsVisible, boolean drawPicking)`
    `boolean` | `checkObjectHovered(int x, int y, javajs.util.BS bsVisible)`
    `protected void` | `clearSg()`
    `private void` | `createLcaoLobe(javajs.util.V3 lobeAxis, float factor, int nElectrons)`
    `protected void` | `discardTempData(boolean discardAll)`
    `private void` | `drawLcaoCartoon(javajs.util.V3 z, javajs.util.V3 x, javajs.util.V3 rotAxis, int nElectrons)`
    `private void` | `ensureMeshSource()`
    `void` | `fillMeshData(MeshData meshData, int mode, IsosurfaceMesh mesh)`
    `private java.lang.String` | `findValue(int x, int y, boolean isPicking, javajs.util.BS bsVisible)`
    `protected void` | `getCapSlabInfo(java.lang.String script)`
    `private java.lang.Object[]` | `getCapSlabObject(java.lang.String s, boolean isCap)` legacy -- for some scripts with early isosurface slabbing
    `java.lang.String` | `getCmd(int index)`
    `private float[]` | `getDataRange(IsosurfaceMesh mesh)`
    `private short` | `getDefaultColix()`
    `private java.lang.Object` | `getFileReader(java.lang.String fileName)`
    `private void` | `getMeshCommand(javajs.util.SB sb, int i)`
    `float[]` | `getPlane(int x)`
    `static java.lang.String` | `getPolygonColorData(int ccount, short[] colixes, int[][] polygons, javajs.util.BS bsSlabDisplay)`
    `java.lang.Object` | `getProperty(java.lang.String property, int index)`
    `boolean` | `getPropertyData(java.lang.String property, java.lang.Object[] data)`
    `protected java.lang.Object` | `getPropI(java.lang.String property, int index)`
    `private boolean` | `getScriptBitSets(java.lang.String script, javajs.util.BS[] bsCmd)`
    `java.lang.Object` | `getShapeDetail()`
    `java.lang.String` | `getShapeState()`
    `int` | `getSurfacePointIndexAndFraction(float cutoff, boolean isCutoffAbsolute, int x, int y, int z, javajs.util.P3i offset, int vA, int vB, float valueA, float valueB, javajs.util.T3 pointA, javajs.util.V3 edgeVector, boolean isContourType, float[] fReturn)` getSurfacePointIndex is used by the Marching Cubes algorithm and must return a unique integer identifier for a vertex created by the Marching Cube algorithm when it finds an edge.
    `float` | `getValue(int x, int y, int z, int ptyz)` for readers only
    `private void` | `hoverKey(int x, int y)`
    `private void` | `initializeIsosurface()`
    `void` | `initShape()`
    `private void` | `initState()`
    `void` | `invalidateTriangles()`
    `private boolean` | `isPickable(IsosurfaceMesh m, javajs.util.BS bsVisible)`
    `protected void` | `newSg()`
    `boolean` | `notifySurfaceGenerationCompleted()`
    `void` | `notifySurfaceMappingCompleted()`
    `private void` | `setBsVdw()`
    `private void` | `setColorPhase(IsosurfaceMesh m, short colix0, short colix1)`
    `private void` | `setIsoMeshColor(IsosurfaceMesh m, java.lang.String color)`
    `private void` | `setJvxlInfo()`
    `private void` | `setMeshI()`
    `void` | `setOutputChannel(javajs.api.GenericBinaryDocument binaryDoc, javajs.util.OC out)`
    `void` | `setProperty(java.lang.String propertyName, java.lang.Object value, javajs.util.BS bs)`
    `private void` | `setPropertySuper(java.lang.String propertyName, java.lang.Object value, javajs.util.BS bs)`
    `protected void` | `setPropI(java.lang.String propertyName, java.lang.Object value, javajs.util.BS bs)`
    `void` | `setRequiredFile(java.lang.String oldName, java.lang.String fileName)`
    `protected void` | `setScriptInfo(java.lang.String strCommand)`
    `protected void` | `slabPolygons(java.lang.Object[] slabInfo)`

    - ### Methods inherited from class org.jmol.shape.MeshCollection

      `checkExplicit, clean, deleteMeshI, deleteMeshKey, getIndexFromName, getMesh, getMeshList, getPickedPoint, getPropDataMC, getPropMC, merge, resetObjects, setModelVisibilityFlags, setPropMC, setStatusPicked, setTokenProperty`

    - ### Methods inherited from class org.jmol.shape.Shape

      `appendCmd, checkBoundsMinMax, checkObjectDragged, coordinateInRange, encodeColor, findNearestAtomIndex, getColix, getColixA, getColixB, getColixI, getColorCommand, getColorCommandUnk, getFontCommand, getPropShape, getSize, getSizeG, getTranslucentLabel, initializeShape, initModelSet, replaceGroup, setAtomClickability, setModelSet, setPropS, setShapeSizeRD, setSize, setSizeRD, wasClicked`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### isomeshes

          protected IsosurfaceMesh[] isomeshes

    - #### thisMesh

          protected IsosurfaceMesh thisMesh

    - #### actualID

          private java.lang.String actualID

    - #### iHaveBitSets

          protected boolean iHaveBitSets

    - #### explicitContours

          private boolean explicitContours

    - #### atomIndex

          private int atomIndex

    - #### moNumber

          private int moNumber

    - #### moLinearCombination

          private float[] moLinearCombination

    - #### colorType

          private int colorType

    - #### defaultColix

          private short defaultColix

    - #### meshColix

          private short meshColix

    - #### center

          private javajs.util.P3 center

    - #### scale3d

          private float scale3d

    - #### isPhaseColored

          private boolean isPhaseColored

    - #### isColorExplicit

          private boolean isColorExplicit

    - #### scriptAppendix

          private java.lang.String scriptAppendix

    - #### sg

          protected SurfaceGenerator sg

    - #### jvxlData

          protected JvxlData jvxlData

    - #### withinDistance2

          private float withinDistance2

    - #### isWithinNot

          private boolean isWithinNot

    - #### withinPoints

          private javajs.util.Lst<javajs.util.P3> withinPoints

    - #### cutoffRange

          private float[] cutoffRange

    - #### allowMesh

          boolean allowMesh

    - #### script

          private java.lang.String script

    - #### iHaveModelIndex

          private boolean iHaveModelIndex

    - #### nLCAO

          private int nLCAO

    - #### lcaoDir

          private javajs.util.P4 lcaoDir

    - #### associateNormals

          private boolean associateNormals

    - #### oldFileName

          private java.lang.String oldFileName

    - #### newFileName

          private java.lang.String newFileName

    - #### MAX_OBJECT_CLICK_DISTANCE_SQUARED

          private static final int MAX_OBJECT_CLICK_DISTANCE_SQUARED

      See Also:
        Constant Field Values

    - #### ptXY

          private final javajs.util.P3i ptXY

    - #### keyXy

          public int[] keyXy

  - ### Constructor Detail

    - #### Isosurface

          public Isosurface()

  - ### Method Detail

    - #### allocMesh

          public void allocMesh(java.lang.String thisID,
                                Mesh m)

      Overrides:
        `allocMesh` in class `MeshCollection`

    - #### initShape

          public void initShape()

      Overrides:
        `initShape` in class `MeshCollection`

    - #### newSg

          protected void newSg()

    - #### clearSg

          protected void clearSg()

    - #### setProperty

          public void setProperty(java.lang.String propertyName,
                                  java.lang.Object value,
                                  javajs.util.BS bs)

      Specified by:
        `setProperty` in class `Shape`

    - #### setPropI

          protected void setPropI(java.lang.String propertyName,
                                  java.lang.Object value,
                                  javajs.util.BS bs)

    - #### getFileReader

          private java.lang.Object getFileReader(java.lang.String fileName)

    - #### setIsoMeshColor

          private void setIsoMeshColor(IsosurfaceMesh m,
                                       java.lang.String color)

    - #### setColorPhase

          private void setColorPhase(IsosurfaceMesh m,
                                     short colix0,
                                     short colix1)

    - #### ensureMeshSource

          private void ensureMeshSource()

    - #### slabPolygons

          protected void slabPolygons(java.lang.Object[] slabInfo)

    - #### setPropertySuper

          private void setPropertySuper(java.lang.String propertyName,
                                        java.lang.Object value,
                                        javajs.util.BS bs)

    - #### getPropertyData

          public boolean getPropertyData(java.lang.String property,
                                         java.lang.Object[] data)

      Overrides:
        `getPropertyData` in class `Shape`
      Returns:
        true if serviced

    - #### getProperty

          public java.lang.Object getProperty(java.lang.String property,
                                              int index)

      Overrides:
        `getProperty` in class `Shape`
      Returns:
        true if serviced

    - #### getPropI

          protected java.lang.Object getPropI(java.lang.String property,
                                              int index)

    - #### getDataRange

          private float[] getDataRange(IsosurfaceMesh mesh)

    - #### calculateVolumeOrArea

          private java.lang.Object calculateVolumeOrArea(IsosurfaceMesh mesh,
                                                         boolean isArea)

    - #### getPolygonColorData

          public static java.lang.String getPolygonColorData(int ccount,
                                                             short[] colixes,
                                                             int[][] polygons,
                                                             javajs.util.BS bsSlabDisplay)

    - #### getShapeState

          public java.lang.String getShapeState()

      Specified by:
        `getShapeState` in class `Shape`

    - #### getMeshCommand

          private void getMeshCommand(javajs.util.SB sb,
                                      int i)

    - #### getScriptBitSets

          private boolean getScriptBitSets(java.lang.String script,
                                           javajs.util.BS[] bsCmd)

    - #### getCapSlabInfo

          protected void getCapSlabInfo(java.lang.String script)

    - #### getCapSlabObject

          private java.lang.Object[] getCapSlabObject(java.lang.String s,
                                                      boolean isCap)

      legacy -- for some scripts with early isosurface slabbing
      Parameters:
        `s` -
        `isCap` -
      Returns:
        slabInfo object

    - #### initializeIsosurface

          private void initializeIsosurface()

    - #### initState

          private void initState()

    - #### setMeshI

          private void setMeshI()

    - #### discardTempData

          protected void discardTempData(boolean discardAll)

    - #### getDefaultColix

          private short getDefaultColix()

    - #### drawLcaoCartoon

          private void drawLcaoCartoon(javajs.util.V3 z,
                                       javajs.util.V3 x,
                                       javajs.util.V3 rotAxis,
                                       int nElectrons)

    - #### createLcaoLobe

          private void createLcaoLobe(javajs.util.V3 lobeAxis,
                                      float factor,
                                      int nElectrons)

    - #### invalidateTriangles

          public void invalidateTriangles()

      Specified by:
        `invalidateTriangles` in interface `MeshDataServer`

    - #### setOutputChannel

          public void setOutputChannel(javajs.api.GenericBinaryDocument binaryDoc,
                                       javajs.util.OC out)

      Specified by:
        `setOutputChannel` in interface `MeshDataServer`

    - #### fillMeshData

          public void fillMeshData(MeshData meshData,
                                   int mode,
                                   IsosurfaceMesh mesh)

      Specified by:
        `fillMeshData` in interface `MeshDataServer`

    - #### notifySurfaceGenerationCompleted

          public boolean notifySurfaceGenerationCompleted()

      Specified by:
        `notifySurfaceGenerationCompleted` in interface `MeshDataServer`

    - #### notifySurfaceMappingCompleted

          public void notifySurfaceMappingCompleted()

      Specified by:
        `notifySurfaceMappingCompleted` in interface `MeshDataServer`

    - #### setBsVdw

          private void setBsVdw()

    - #### calculateGeodesicSurface

          public javajs.util.P3[] calculateGeodesicSurface(javajs.util.BS bsSelected,
                                                           float envelopeRadius)

      Specified by:
        `calculateGeodesicSurface` in interface `MeshDataServer`

    - #### getSurfacePointIndexAndFraction

          public int getSurfacePointIndexAndFraction(float cutoff,
                                                     boolean isCutoffAbsolute,
                                                     int x,
                                                     int y,
                                                     int z,
                                                     javajs.util.P3i offset,
                                                     int vA,
                                                     int vB,
                                                     float valueA,
                                                     float valueB,
                                                     javajs.util.T3 pointA,
                                                     javajs.util.V3 edgeVector,
                                                     boolean isContourType,
                                                     float[] fReturn)

      Description copied from interface: `VertexDataServer`
      getSurfacePointIndex is used by the Marching Cubes algorithm and must return a unique integer identifier for a vertex created by the Marching Cube algorithm when it finds an edge. If a vertex is discarded, then Integer.MAX_VALUE should be returned. the 3D coordinate of the point can be calculated using surfacePoint.scaleAdd(fraction, edgeVector, pointA); where fraction is generally calculated as: fraction = (cutoff - valueA) / (valueB - valueA); if (isCutoffAbsolute && (fraction < 0 || fraction > 1)) fraction = (-cutoff - valueA) / (valueB - valueA); This method is also used by MarchingCubes to deliver the appropriate oblique planar coordinate to MarchingSquares for later contouring.
      Specified by:
        `getSurfacePointIndexAndFraction` in interface `VertexDataServer`
        `vA` - [0:7]
        `vB` - [0:7]
        `edgeVector` - vector from A to B
      Returns:
        new vertex index or Integer.MAX_VALUE

    - #### addVertexCopy

          public int addVertexCopy(javajs.util.T3 vertexXYZ,
                                   float value,
                                   int assocVertex,
                                   boolean asCopy)

      Description copied from interface: `VertexDataServer`
      addVertexCopy is used by the Marching Squares algorithm to uniquely identify a new vertex when an edge is crossed in the 2D plane. The implementing method should COPY the Point3f using Point3f.set(). The data consumer can use the association key to group this vertex with others near the same gridpoint.
      Specified by:
        `addVertexCopy` in interface `VertexDataServer`
        `assocVertex` - unique association vertex or -1
      Returns:
        new vertex index

    - #### addTriangleCheck

          public int addTriangleCheck(int iA,
                                      int iB,
                                      int iC,
                                      int check,
                                      int iContour,
                                      boolean isAbsolute,
                                      int color)

      Description copied from interface: `VertexDataServer`
      addTriangleCheck adds a triangle along with a 3-bit check indicating which edges to draw in mesh mode: 1 (iA-iB) + 2 (iB-iC) + 4 (iC-iA)
      Specified by:
        `addTriangleCheck` in interface `VertexDataServer`
        `iContour` - TODO
      Returns:
        polygon index or -1

    - #### setScriptInfo

          protected void setScriptInfo(java.lang.String strCommand)

    - #### addRequiredFile

          public void addRequiredFile(java.lang.String fileName)

      Specified by:
        `addRequiredFile` in interface `MeshDataServer`

    - #### setRequiredFile

          public void setRequiredFile(java.lang.String oldName,
                                      java.lang.String fileName)

      Specified by:
        `setRequiredFile` in interface `MeshDataServer`

    - #### setJvxlInfo

          private void setJvxlInfo()

    - #### getShapeDetail

          public java.lang.Object getShapeDetail()

      Overrides:
        `getShapeDetail` in class `Shape`

    - #### addMeshInfo

          protected void addMeshInfo(IsosurfaceMesh mesh,
                                     java.util.Map<java.lang.String,java.lang.Object> info)

    - #### getPlane

          public float[] getPlane(int x)

      Specified by:
        `getPlane` in interface `VertexDataServer`

    - #### getValue

          public float getValue(int x,
                                int y,
                                int z,
                                int ptyz)

      Description copied from interface: `VertexDataServer`
      for readers only
      Specified by:
        `getValue` in interface `VertexDataServer`
      Returns:
        value[x][y][z]

    - #### checkObjectHovered

          public boolean checkObjectHovered(int x,
                                            int y,
                                            javajs.util.BS bsVisible)

      Overrides:
        `checkObjectHovered` in class `Shape`
      Returns:
        T/F

    - #### hoverKey

          private void hoverKey(int x,
                                int y)

    - #### checkObjectClicked

          public java.util.Map<java.lang.String,java.lang.Object> checkObjectClicked(int x,
                                                                                     int y,
                                                                                     int action,
                                                                                     javajs.util.BS bsVisible,
                                                                                     boolean drawPicking)

      Overrides:
        `checkObjectClicked` in class `Shape`
        `drawPicking` - TODO
      Returns:
        Hashtable containing information about pt clicked

    - #### isPickable

          private boolean isPickable(IsosurfaceMesh m,
                                     javajs.util.BS bsVisible)

    - #### findValue

          private java.lang.String findValue(int x,
                                             int y,
                                             boolean isPicking,
                                             javajs.util.BS bsVisible)

      Parameters:
        `x` -
        `y` -
        `isPicking` - IGNORED
        `bsVisible` -
      Returns:
        value found

    - #### getCmd

          public java.lang.String getCmd(int index)