scichart
Version:
Fast WebGL JavaScript Charting Library and Framework
310 lines (309 loc) • 14.5 kB
TypeScript
import { TDataSeriesDefinition } from "../../Builder/buildDataSeries";
import { DeletableEntity } from "../../Core/DeletableEntity";
import { EventHandler } from "../../Core/EventHandler";
import { NumberRange } from "../../Core/NumberRange";
import { NumberArray } from "../../types/NumberArray";
import { ESearchMode } from "../../types/SearchMode";
import { SCRTDoubleVector, TSciChart } from "../../types/TSciChart";
import { EYRangeMode } from "../../types/YRangeMode";
import { SeriesAnimation } from "../Visuals/RenderableSeries/Animations/SeriesAnimation";
import { IDataDistributionCalculator } from "./DataDistributionCalculator/IDataDistributionCalculator";
import { IDoubleVectorProvider } from "./DoubleVectorProvider";
import { EDataChangeType, EDataSeriesType, EDataSeriesValueType, IDataChangeArgs, IDataSeries } from "./IDataSeries";
import { IMetadataGenerator, IPointMetadata } from "./IPointMetadata";
/**
* Options to pass to the {@link BaseDataSeries} constructor
*/
export interface IBaseDataSeriesOptions {
/**
* A unique Id for the {@link IDataSeries}
*/
id?: string;
/**
* The DataSeries name, used in legends, tooltips to identify the chart series
*/
dataSeriesName?: string;
/**
* When true, the Data is sorted in X. Same as isSorted.
* @remarks The user must specify this parameter if the data is not sorted in X
* in order to have correct rendering. This parameter is used to choose the correct
* algorithms for zooming, panning and ranging and ensure best performance.
*/
dataIsSortedInX?: boolean;
/**
* When true, the Data is sorted in X. Same as dataIsSortedInX.
* @remarks The user must specify this parameter if the data is not sorted in X
* in order to have correct rendering. This parameter is used to choose the correct
* algorithms for zooming, panning and ranging and ensure best performance.
*/
isSorted?: boolean;
/**
* When true, the Data is evenly spaced in X.
* @remarks
* The user must specify this flag (defaults to true) in order to choose the correct, and
* fastest algorithms for drawing, indexing and ranging. If you experience glitches or
* strange drawing, it may be because you have set data with uneven spacing in X but not set this flag.
*/
dataEvenlySpacedInX?: boolean;
/**
* Gets or sets whether the Y data contains NaN values.
*/
containsNaN?: boolean;
/**
* Set the maximum size of the dataSeries in FIFO (First In First Out) mode. This can only be set in the constructor options.
* If set, the dataSeries does not support insert/insertRange or remove/removeRange. Any data that is appended once the dataSeries has reached fifoCapacity will cause
* the oldest data to be discarded. This is much more efficient than appending and removing for achieving scrolling data.
* Spline series and Stacked series currently do not support fifo mode.
* To get the scrolling effect, you need to consider the behaviour of your X Axis. You can either
* Use a {@link CategoryAxis}
* Use a {@link NumericAxis} with increasing x values, and update the visibleRange (or use zoomExtents)
*/
fifoCapacity?: number;
/**
* If true, data in fifo mode will not be "unwrapped" before drawing, giving ecg style sweeping mode.
* To get the sweeping effect, you need to consider the behaviour of your X Axis. You can either
* Use a {@link CategoryAxis}
* Use a {@link NumericAxis} and make your x values an offset from the first value, eg by doing x % fifoCapcity
*/
fifoSweeping?: boolean;
/** In fifo sweeping mode, the number of earliest points to skip to create a gap between the latest and earliest data */
fifoSweepingGap?: number;
/** Sets the starting index of data for fifo mode. */
fifoStartIndex?: number;
/**
* Gets or sets the capacity of the data series. This is the amount of memory reserved for the data. For a normal dataSeries this will grow as data is appended.
* You can avoid memory fragmentation by creating your series with a larger capacity if you know it will grow to that.
*/
capacity?: number;
/**
* The X-values array to pre-populate the {@link XyDataSeries}
*/
xValues?: NumberArray;
/**
* The Y-values array to pre-populate the {@link XyDataSeries}
*/
yValues?: NumberArray;
/**
* The Metadata values of type {@link IPointMetadata} to pre-populate the {@link XyDataSeries}
* If a single metadata value is supplied, this will be used as a template for all data values.
* If type is specified, it should refer to a registered metadataGenerator {@link IMetadataGenerator},
* which can provide all metadata, based on the data provided, or a single object that will be used when adding data if no metadata is provided.
*/
metadata?: IPointMetadata[] | IPointMetadata | {
type: string;
data?: any;
};
}
/**
* The base class for DataSeries in SciChart's
* {@link https://www.scichart.com/javascript-chart-features | JavaScript Charts}
* @remarks
* A DataSeries stores the data to render. This is independent from the {@link IRenderableSeries | RenderableSeries}
* which defines how that data should be rendered.
*
* See derived types of {@link BaseDataSeries} to find out what data-series are available.
* See derived types of {@link IRenderableSeries} to find out what 2D JavaScript Chart types are available.
*/
export declare abstract class BaseDataSeries extends DeletableEntity implements IDataSeries {
/** @inheritDoc */
abstract readonly type: EDataSeriesType;
/** @inheritDoc */
readonly dataChanged: EventHandler<IDataChangeArgs>;
/** @inheritDoc */
readonly id: string;
/** @inheritDoc */
readonly dataDistributionCalculator: IDataDistributionCalculator;
minXSpacing: number;
/**
* If set, these will be included in the serialised definition, so that it can be used with sharedData
*/
dataIds: Record<number | string, number[]>;
/**
* The {@link TSciChart | SciChart WebAssembly Context} containing native methods and access to our WebGL2 Engine
*/
readonly webAssemblyContext: TSciChart;
/**
* X vector with initial animation values
*/
xInitialAnimationValues: SCRTDoubleVector;
/**
* Y vector with initial animation values
*/
yInitialAnimationValues: SCRTDoubleVector;
/**
* X vector with final animation values
*/
xFinalAnimationValues: SCRTDoubleVector;
/**
* Y vector with final animation values
*/
yFinalAnimationValues: SCRTDoubleVector;
protected xValues: SCRTDoubleVector;
protected yValues: SCRTDoubleVector;
protected indexes: SCRTDoubleVector;
protected isDeleted: boolean;
protected doubleVectorProvider: IDoubleVectorProvider;
private dataSeriesNameProperty;
private isSortedProperty;
private containsNaNProperty;
private isEvenlySpacedProperty;
private metadataProperty;
private metadataGeneratorProperty;
private changeCountProperty;
private fifoCapacityProperty;
private fifoSweepingProperty;
private fifoSweepingGapProperty;
/**
* Creates an instance of {@link BaseDataSeries}
* @param webAssemblyContext the {@link TSciChart | SciChart WebAssembly Context} containing native methods
* and access to our underlying WebGL2 rendering engine
* @param options the {@link IBaseDataSeriesOptions} which can be passed to config the DataSeries at construct time
*/
protected constructor(webAssemblyContext: TSciChart, options?: IBaseDataSeriesOptions);
/** @inheritDoc */
clear(): void;
/**
* Gets or sets the capacity of data-points in the DataSeries
*/
get capacity(): number;
/**
* Gets or sets the capacity of data-points in the DataSeries
*/
set capacity(value: number);
/** @inheritDoc */
get containsNaN(): boolean;
/** @inheritDoc */
set containsNaN(containsNaN: boolean);
/** @inheritDoc */
get isSorted(): boolean;
/** @inheritDoc */
set isSorted(isSorted: boolean);
/** @inheritDoc */
get isEvenlySpaced(): boolean;
/** @inheritDoc */
set isEvenlySpaced(isSorted: boolean);
/** @inheritDoc */
get dataSeriesName(): string;
/** @inheritDoc */
set dataSeriesName(dataSeriesName: string);
/** @inheritDoc */
count(): number;
/** @inheritDoc */
getIsDeleted(): boolean;
/** @inheritDoc */
get fifoCapacity(): number;
/** @inheritDoc */
get fifoStartIndex(): number;
/** @inheritDoc */
get fifoSweeping(): boolean;
/** @inheritDoc */
set fifoSweeping(enabled: boolean);
/** @inheritDoc */
get fifoSweepingGap(): number;
/** @inheritDoc */
set fifoSweepingGap(fifoSweepingGap: number);
/** @inheritDoc */
getNativeIndexes(): SCRTDoubleVector;
/** @inheritDoc */
getNativeXValues(): SCRTDoubleVector;
/** @inheritDoc */
getNativeValue(values: SCRTDoubleVector, index: number): number;
/** @inheritDoc */
getNativeYValues(): SCRTDoubleVector;
/** @inheritDoc */
delete(): void;
/**
* Call to notify subscribers of {@link dataChanged} that the data has changed and {@link SciChartSurface} needs redrawing
*/
notifyDataChanged(changeType: EDataChangeType, index: number, count: number, name?: string): void;
/** @inheritDoc */
get xRange(): NumberRange;
/** @inheritDoc */
getXRange(dataSeriesValueType?: EDataSeriesValueType): NumberRange;
/** @inheritDoc */
getWindowedYRange(xRange: NumberRange, getPositiveRange: boolean, isXCategoryAxis?: boolean, dataSeriesValueType?: EDataSeriesValueType, yRangeMode?: EYRangeMode): NumberRange;
/** @inheritDoc */
getIndicesRange(xRange: NumberRange, isCategoryData?: boolean, downSearchMode?: ESearchMode, upSearchMode?: ESearchMode): NumberRange;
/** @inheritDoc */
get hasValues(): boolean;
/**
* Check if the series has an existing metadataGenerator
*/
hasMetadataGenerator(): boolean;
/**
* Sets a function that will be used to generate metadata for values when they are appended/inserted, if no explicit metadata is supplied.
* @param generator
*/
setMetadataGenerator(generator: IMetadataGenerator): void;
/**
* Gets the metadata by index
* @param index The X index
*/
getMetadataAt(index: number, ignoreFifo?: boolean): IPointMetadata;
/**
* Gets the metadata array length
*/
getMetadataLength(): number;
/**
* Check if the series has an existing metadata
*/
get hasMetadata(): boolean;
createAnimationVectors(): void;
/**
* Sets initial values for the data animation
* @param dataSeries The {@link BaseDataSeries} to be used for initial values
*/
setInitialAnimationVectors(dataSeries?: BaseDataSeries): void;
/**
* Sets final values for the data animation
* @param dataSeries The {@link BaseDataSeries} to be used for final values
*/
setFinalAnimationVectors(dataSeries?: BaseDataSeries): void;
/**
* Puts the animation values back into the dataSeries after a reverse animation
* @param dataSeries The {@link BaseDataSeries} to be used for target values
*/
revertAnimationVectors(dataSeries?: BaseDataSeries): void;
/**
* Validates the length of the animation vectors
*/
validateAnimationVectors(): void;
/**
* Updates the {@link BaseDataSeries} values for the animation
* @param progress The animation progress from 0 to 1
* @param animation The animation
*/
updateAnimationProperties(progress: number, animation: SeriesAnimation): void;
/** @inheritDoc */
toJSON(excludeData?: boolean): TDataSeriesDefinition;
/** @inheritDoc */
get changeCount(): number;
protected getOptions(excludeData?: boolean): IBaseDataSeriesOptions;
/**
* Finds the nearest index of the xValue passed in by performing binary or linear search on the X-Values array.
* Returns -1 for index not found. Other negative numbers indicate an error condition
* @param xValue the X-value to find
* @param findMode the {@link ESearchMode} to use when searching. Defaults to {@link ESearchMode.Nearest}.
* Mode {@link ESearchMode.Exact} will result in a slower search, other modes will result in fast binary search.
* @return The index, or -1 if not found
*/
findIndex(xValue: number, searchMode?: ESearchMode): number;
protected validateIndex(index: number, message?: string): void;
protected setMetadataAt(index: number, metadata: IPointMetadata): void;
protected appendMetadata(metadata: IPointMetadata): void;
protected appendMetadataRange(metadata: IPointMetadata[], length: number): void;
protected insertMetadata(startIndex: number, metadata: IPointMetadata): void;
protected insertMetadataRange(startIndex: number, metadata: IPointMetadata[]): void;
protected removeMetadataAt(index: number): void;
protected removeMetadataRange(startIndex: number, count: number): void;
protected setMetadata(value: IPointMetadata[]): void;
getXValues(dataSeriesValueType: EDataSeriesValueType): SCRTDoubleVector;
protected throwIfFifo(operation: string): void;
protected reserve(size: number): void;
protected calculateInitialCapacity(options: IBaseDataSeriesOptions): number;
private fillMetadataIfUndefined;
getYValues(dataSeriesValueType: EDataSeriesValueType): SCRTDoubleVector;
}
/** @ignore */
export declare const getIndicesRange: (webAssemblyContext: TSciChart, xValues: SCRTDoubleVector, xRange: NumberRange, isSorted: boolean, downSearchMode?: ESearchMode, upSearchMode?: ESearchMode) => NumberRange;
export declare const getWindowedYRange: (webAssemblyContext: TSciChart, xValues: SCRTDoubleVector, yValues: SCRTDoubleVector, xRange: NumberRange, getPositiveRange: boolean, isXCategoryAxis: boolean, isSorted: boolean, minSearchMode?: ESearchMode, maxSearchMode?: ESearchMode) => NumberRange;