When you work with numbers, you often need to know the unit of the quantity expressed. INTViewer has a simple unit system to retrieve units and convert numbers expressed in different units.
If a dataset (implementing com.interactive.intviewerapi.data.IData) has time or depth unit information, this dataset implements the com.interactive.intviewerapi.units.IZUnitProvider interface. The only method of that interface is getZUnit().
At this time, only com.interactive.intviewerapi.data.seismic.ISeismicData and com.interactive.intviewerapi.data.well.IWellData implement the IZUnitProvider interface.
ISeismicData seismicData = ...IUnit unit = seismicData.getZUnit();System.out.println(unit.getSymbol()); // example: "s"System.out.println(unit.getName()); // example: "Seconds"ISeismicData seismicData = ...IUnit unit = seismicData.getZUnit();if (unit.getSIUnit().getSymbol().equals(IUnit.SECONDS_SYMBOL)) { System.out.println("Dataset is in time");} else if (unit.getSIUnit().getSymbol().equals(IUnit.METERS_SYMBOL)) { System.out.println("Dataset is in depth");}ISeismicData seismicData = ...IUnit fromUnit = seismicData.getZUnit();double sampleRate = seismicData.getDataStatistics().getSampleRate();IUnit millisecondsUnit = IUnit.Factory.getUnit(IUnit.MILLISECONDS_SYMBOL);double sampleRateInMilliseconds = fromUnit.convert(quantity, millisecondsUnit);You can convert multiple quantities at a time using the convert(double[] quantities, IUnit unit) method.
To create your own unit, create a class extending com.interactive.intviewerapi.units.AbstractUnit.
TIMEINMILLISECONDSUNIT.JAVA
package com.interactive.intviewer.units;import com.interactive.intviewerapi.units.AbstractUnit;import com.interactive.intviewerapi.units.IUnit;public class TimeInMillisecondsUnit extends AbstractUnit { public TimeInMillisecondsUnit() { super("Milliseconds", IUnit.MILLISECONDS_SYMBOL); } @Override public double convertToSIUnit(double timeInMilliseconds) { return timeInMilliseconds / 1000; } @Override public double convertFromSIUnit(double timeInSeconds) { return timeInSeconds * 1000; } @Override public IUnit getSIUnit() { return IUnit.Factory.getUnit(IUnit.SECONDS_SYMBOL); }}Then register that class in the layer.xml file:
LAYER.XML
<folder name="Units"> <file name="com-interactive-intviewer-units-TimeInMillisecondsUnit.instance"/> </folder>