UNPKG

@kitware/vtk.js

Version:

Visualization Toolkit for the Web

760 lines (696 loc) 23 kB
import { vtkSubscription, vtkDebouncedFunction, vtkProperty, vtkPropertyDomain, vtkObject, } from './interfaces'; /** * Allow user to redefine vtkXXXMacro method call. * @param name of the macro type [Log, Info, Debug, Error, Warning] * @param fn function to use when vtkXXXMacro is called. */ export function setLoggerFunction( name: string, fn: (...args: any) => void ): void; /** * Logging function used for level: Log * @param args arguments to print */ export function vtkLogMacro(...args: any): void; /** * Logging function used for level: Info * @param args arguments to print */ export function vtkInfoMacro(...args: any): void; /** * Logging function used for level: Debug * @param args arguments to print */ export function vtkDebugMacro(...args: any): void; /** * Logging function used for level: Error * @param args arguments to print */ export function vtkErrorMacro(...args: any): void; /** * Logging function used for level: Warning * @param args arguments to print */ export function vtkWarningMacro(...args: any): void; /** * Output error only once * This is convenient when the error happen in a loop. * This allow you to catch the issue while not overloading your output console. */ export function vtkOnceErrorMacro(str: string): void; /** * A way to create typed array based on its name without using the window namespace */ export enum TYPED_ARRAYS { Float32Array, Float64Array, Uint8Array, Int8Array, Uint16Array, Int16Array, Uint32Array, Int32Array, } /** * Capitalize provided string. * This is typically used to convert the name of a field into its method name. * * ``` * const set = `set${capitalize(fieldName)}`; * ``` * @param str String to capitalize */ export function capitalize(str: string): string; /** * Capitalize provided string. * This is typically used to convert the name of a field into its method name. * Ignore the first letter if it starts with underscore (i.e. _). * * ``` * const set = `set${capitalize(fieldName)}`; * ``` */ export function _capitalize(str: string): string; /** * Lowercase the first letter of the provided string. */ export function uncapitalize(str: string): string; /** * Convert byte size into a well formatted string. * * @param size number of bytes * @param precision (default: 2) how many digit you want behind the unit * @param chunkSize (default: 1000) base 1000 or 1024 */ export function formatBytesToProperUnit( size: number, precision?: number, chunkSize?: number ): string; // ---------------------------------------------------------------------------- // Convert thousand number with proper separator // ---------------------------------------------------------------------------- /** * * @param n number to format * @param separator (default: ' ') */ export function formatNumbersWithThousandSeparator( n: number, separator?: string ): string; // ---------------------------------------------------------------------------- // Array helper // ---------------------------------------------------------------------------- /** * Replace internal arrays with new reference but with same content * * @param model */ declare function safeArrays(model: object): void; /** * Extract the key of an object where the given value match the given one * * @param e enum object to search key/value from * @param value to look for inside object */ declare function enumToString(e: object, value: any): string; /** * If item is a VtkObject, return its getState() otherwise return itself. * * @param item object to extract its state from */ declare function getStateArrayMapFunc(item: any): any; /** * Call provided function on the next EDT pass * * @param fn function to execute */ export function setImmediateVTK(fn: () => void): void; /** * Measures the time it takes for a promise to finish from the time this function is invoked. * * The callback receives the time it took for the promise to resolve or reject. * * @param promise promise to measure * @param callback called with the elapsed time for the promise */ export function measurePromiseExecution( promise: Promise<any>, callback: (elapsed: number) => void ): void; /** * Turns the provided publicAPI into a VtkObject * * @param publicAPI (default: {}) object on which public methods get attached to * @param model (default: {}) object on which protected fields are stored * @returns publicAPI */ export function obj(publicAPI?: object, model?: object): object; /** * Add getter methods to the provided publicAPI * * @param publicAPI object on which public methods get attached to * @param model object on which protected fields are stored * @param fieldNames list of fields available in model that we want to expose as get{FieldName} methods on the publicAPI */ export function get( publicAPI: object, model: object, fieldNames: Array<string> ): void; /** * Add setter methods to the provided publicAPI * * @param publicAPI object on which public methods get attached to * @param model object on which protected fields are stored * @param fieldNames list of fields available in model that we want to expose as set{FieldName} methods on the publicAPI * * Can be a string (the name of the field to expose) or an object (e.g. {type:enum, name: {FieldName}, enum: FieldEnum}). */ export function set( publicAPI: object, model: object, fields: Array<string | object> ): void; /** * Add setter+getter methods to the provided publicAPI * * @param publicAPI object on which public methods get attached to * @param model object on which protected fields are stored * @param fieldNames list of fields available in model that we want to expose as set{FieldName}+get{FieldName} methods on the publicAPI. * Can be a string (the name of the field to expose) or an object (e.g. {type:enum, name: {FieldName}, enum: FieldEnum}). */ export function setGet( publicAPI: object, model: object, fields: Array<string | object> ): void; /** * Add getter methods to the provided publicAPI for arrays. * A new array is used as returned value with get{FieldName}() method * unless get{FieldName}ByReference() is used. * * ``` * get{FieldName}() // add getters for object of type array with copy to be safe * get{FieldName}ByReference() // add getters for object of type array without copy * ``` * * @param publicAPI object on which public methods get attached to * @param model object on which protected fields are stored * @param fieldNames list of fields available in model that we want to expose as get{FieldName}+get{FieldName}ByReference methods on the publicAPI */ export function getArray( publicAPI: object, model: object, fields: Array<string> ): void; /** * Add setter methods to the provided publicAPI for arrays. * if 'defaultVal' is supplied, shorter arrays will be padded to 'size' with * 'defaultVal'. * set{FieldName}From(abc) will copy the content of abc into current field * without calling modified. * * ``` * set{FieldName}(a, b, c) / set{FieldName}([a, b, c]) / set{FieldName}(new Uint8Array(...)) / set{FieldName}(null) * set{FieldName}From([a, b, c]) * ``` * * @param publicAPI * @param model * @param fieldNames * @param size * @param defaultVal */ export function setArray( publicAPI: object, model: object, fieldNames: Array<string>, size: Number, defaultVal?: any ): void; /** * set/get XXX: add setter and getter for object of type array * @param publicAPI * @param model * @param fieldNames * @param size * @param defaultVal */ export function setGetArray( publicAPI: object, model: object, fieldNames: Array<string>, size: Number, defaultVal?: any ): void; /** * Convert model and publicAPI references to _fieldName into fieldName. * It renames: * - model.fieldName into model._fieldName * - publicAPI.set_fieldName and publicAPI.set_fieldNameFrom into publicAPI.setFieldName and publicAPI.setFieldNameFrom * - publicAPI.get_fieldName and publicAPI.get_fieldNameByReference into publicAPI.getFieldName and publicAPI.getFieldNameByReference * @param publicAPI * @param model * @param fieldNames List of field names to move to protected, e.g. ['interactor', 'renderWindow'] * @see get * @see set */ export function moveToProtected( publicAPI: object, model: object, fieldNames: Array<string> ): void; /** * Add algorithm methods onto the provided publicAPI * * @param publicAPI object on which methods will be bounds (public) * @param model object on which data structure will be bounds (protected) * @param numberOfInputs * @param numberOfOutputs */ export function algo( publicAPI: object, model: object, numberOfInputs: number, numberOfOutputs: number ): void; /** * Symbols used as return value for callback */ export const VOID: Symbol; /** * Symbols used as return value for callback when you want to stop * any further callback calls after yours. */ export const EVENT_ABORT: Symbol; export function event( publicAPI: object, model: object, eventName: string ): void; /** * Event callback * @param args * @returns symbol to either keep going or interrupt existing callback call stack */ export function VtkCallback(...args: any): void | symbol; // Example of event(,, 'change') export interface VtkChangeEvent { /** * Call any registered callbacks with the given arguments * @param args */ invokeChange(...args: any): void; /** * Execute higher priority callback first * negative priority use setTimeout(cb, -priority) for later callback * * @param VtkCallback * @param priority (default 0.0) */ onChange( VtkCallback: (...args: any) => void | symbol, priority?: number ): vtkSubscription; } // ---------------------------------------------------------------------------- // newInstance // ---------------------------------------------------------------------------- export type VtkExtend = ( publicAPI: object, model: object, initialValues: object ) => void; export function newInstance(extend: VtkExtend, className: string): any; // ---------------------------------------------------------------------------- // Chain function calls // ---------------------------------------------------------------------------- /** * Create a new closure that will chain the call of any provided methods * @param fn list of function to call */ export function chain(...fn: Array<Function>): Function; /** * Test if provided object is an actual vtkObject or not * @param instance */ export function isVtkObject(instance: any): boolean; /** * Traverse an instance tree of vtkObjects * * @param instance root of the tree to traverse * @param extractFunction function used to decorate vtkObject * @param accumulator (default []) array use to capture decorated by the extractFunction * @param visitedInstances (default []) array use to capture visitedInstances * @returns the accumulator is actually returned */ export function traverseInstanceTree( instance: any, extractFunction: any, accumulator?: Array<any>, visitedInstances?: Array<any> ): Array<any>; /** * Returns a function, that, as long as it continues to be invoked, will not * be triggered. The function will be called after it stops being called for * N milliseconds. If `immediate` is passed, trigger the function on the * leading edge, instead of the trailing. * * @param func * @param wait * @param immediate (default false) * @returns vtkDebouncedFunction A debounced function that can be called. * Use .cancel() to clear any pending debounced call. */ export function debounce( func: (...args: any) => any, wait: number, immediate?: boolean ): vtkDebouncedFunction; /** * Creates a throttled function that only invokes `func` at most once per * every `wait` milliseconds. * * @param callback * @param delay */ export function throttle( callback: (...args: any) => any, delay: number ): (...args: any) => any; /** * keystore(publicAPI, model, initialKeystore) * * - initialKeystore: Initial keystore. This can be either a Map or an * object. * * Generated API * setKey(key, value) : mixed (returns value) * getKey(key) : mixed * getAllKeys() : [mixed] * deleteKey(key) : Boolean */ export interface VtkKeyStore { setKey: (key: string, value: any) => void; getKey: (key: string) => any; getAllKeys: () => Array<string>; deleteKey: (key: string) => void; clearKeystore: () => void; } /** * * @param publicAPI * @param model * @param initialKeystore (default {}) */ export function keystore( publicAPI: object, model: object, initialKeystore?: object ): void; // ---------------------------------------------------------------------------- // proxy(publicAPI, model, sectionName, propertyUI) // // - sectionName: Name of the section for UI // - propertyUI: List of props with their UI description // // Generated API // getProxyId() : String // listProxyProperties() : [string] // updateProxyProperty(name, prop) // getProxySection() => List of properties for UI generation // ---------------------------------------------------------------------------- export interface VtkProxyManager {} export interface VtkProxySection { id: string; name: string; ui: object; properties: Array<any>; } export interface VtkLink { /** * * @param instance * @param propertyName * @param updateMe (default: false) */ bind(instance: VtkProxy, propertyName: string, updateMe?: boolean): void; unbind: (instance: VtkProxy, propertyName: string) => void; unsubscribe: () => void; persistent: boolean; } export interface VtkProxy extends VtkKeyStore, vtkObject { getProxyId(): string; getProxyGroup(): string; getProxyName: () => string; setProxyManager: (pxm: VtkProxyManager) => boolean; getProxyManager: () => VtkProxyManager; updateUI: (ui: object) => void; listProxyProperties: (groupName: string) => Array<vtkProperty>; updateProxyProperty: (propertyName: string, propUI: object) => void; activate: () => void; registerPropertyLinkForGC: (otherLink: VtkLink, type: string) => void; gcPropertyLinks(type: string): void; /** * * @param id * @param persistent (default: false) */ getPropertyLink(id: string, persistent?: boolean): VtkLink; /** * * @param groupName (default: ROOT_GROUP_NAME) */ getProperties(groupName?: string): Array<any>; listPropertyNames: () => Array<string>; getPropertyByName: (name: string) => vtkProperty; getPropertyDomainByName: (name: string) => vtkPropertyDomain; getProxySection: () => VtkProxySection; } export function proxy(publicAPI: object, model: object): void; /** * proxyPropertyMapping(publicAPI, model, map) * * ``` * map = { * opacity: { modelKey: 'property', property: 'opacity' }, * } * ``` * * Generated API: * Elevate set/get methods from internal object stored in the model to current one * * @param publicAPI * @param model * @param map */ export function proxyPropertyMapping( publicAPI: object, model: object, map: object ): void; /** * proxyPropertyState(publicAPI, model, state, defaults) * * ``` * state = { * representation: { * 'Surface with edges': { property: { edgeVisibility: true, representation: 2 } }, * Surface: { property: { edgeVisibility: false, representation: 2 } }, * Wireframe: { property: { edgeVisibility: false, representation: 1 } }, * Points: { property: { edgeVisibility: false, representation: 0 } }, * }, * } * * defaults = { * representation: 'Surface', * } * ``` * * Generated API * get / set Representation ( string ) => push state to various internal objects * * @param publicAPI * @param model * @param state (default: {}) * @param defaults (default: {}) */ export function proxyPropertyState( publicAPI: object, model: object, state?: object, defaults?: object ): void; // ---------------------------------------------------------------------------- // From : https://github.com/facebookarchive/fixed-data-table/blob/master/src/vendor_upstream/dom/normalizeWheel.js // // // Copyright (c) 2015, Facebook, Inc. // All rights reserved. // // This source code is licensed under the BSD-style license found in the // LICENSE file in the root directory of this source tree. An additional grant // of patent rights can be found in the PATENTS file in the same directory. // // // Mouse wheel (and 2-finger trackpad) support on the web sucks. It is // complicated, thus this doc is long and (hopefully) detailed enough to answer // your questions. // // If you need to react to the mouse wheel in a predictable way, this code is // like your bestest friend.// hugs// // // As of today, there are 4 DOM event types you can listen to: // // 'wheel' -- Chrome(31+), FF(17+), IE(9+) // 'mousewheel' -- Chrome, IE(6+), Opera, Safari // 'MozMousePixelScroll' -- FF(3.5 only!) (2010-2013) -- don't bother! // 'DOMMouseScroll' -- FF(0.9.7+) since 2003 // // So what to do? The is the best: // // normalizeWheel.getEventType(); // // In your event callback, use this code to get sane interpretation of the // deltas. This code will return an object with properties: // // spinX -- normalized spin speed (use for zoom) - x plane // spinY -- " - y plane // pixelX -- normalized distance (to pixels) - x plane // pixelY -- " - y plane // // Wheel values are provided by the browser assuming you are using the wheel to // scroll a web page by a number of lines or pixels (or pages). Values can vary // significantly on different platforms and browsers, forgetting that you can // scroll at different speeds. Some devices (like trackpads) emit more events // at smaller increments with fine granularity, and some emit massive jumps with // linear speed or acceleration. // // This code does its best to normalize the deltas for you: // // - spin is trying to normalize how far the wheel was spun (or trackpad // dragged). This is super useful for zoom support where you want to // throw away the chunky scroll steps on the PC and make those equal to // the slow and smooth tiny steps on the Mac. Key data: This code tries to // resolve a single slow step on a wheel to 1. // // - pixel is normalizing the desired scroll delta in pixel units. You'll // get the crazy differences between browsers, but at least it'll be in // pixels! // // - positive value indicates scrolling DOWN/RIGHT, negative UP/LEFT. This // should translate to positive value zooming IN, negative zooming OUT. // This matches the newer 'wheel' event. // // Why are there spinX, spinY (or pixels)? // // - spinX is a 2-finger side drag on the trackpad, and a shift + wheel turn // with a mouse. It results in side-scrolling in the browser by default. // // - spinY is what you expect -- it's the classic axis of a mouse wheel. // // - I dropped spinZ/pixelZ. It is supported by the DOM 3 'wheel' event and // probably is by browsers in conjunction with fancy 3D controllers .. but // you know. // // Implementation info: // // Examples of 'wheel' event if you scroll slowly (down) by one step with an // average mouse: // // OS X + Chrome (mouse) - 4 pixel delta (wheelDelta -120) // OS X + Safari (mouse) - N/A pixel delta (wheelDelta -12) // OS X + Firefox (mouse) - 0.1 line delta (wheelDelta N/A) // Win8 + Chrome (mouse) - 100 pixel delta (wheelDelta -120) // Win8 + Firefox (mouse) - 3 line delta (wheelDelta -120) // // On the trackpad: // // OS X + Chrome (trackpad) - 2 pixel delta (wheelDelta -6) // OS X + Firefox (trackpad) - 1 pixel delta (wheelDelta N/A) // // On other/older browsers.. it's more complicated as there can be multiple and // also missing delta values. // // The 'wheel' event is more standard: // // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents // // The basics is that it includes a unit, deltaMode (pixels, lines, pages), and // deltaX, deltaY and deltaZ. Some browsers provide other values to maintain // backward compatibility with older events. Those other values help us // better normalize spin speed. Example of what the browsers provide: // // | event.wheelDelta | event.detail // ------------------+------------------+-------------- // Safari v5/OS X | -120 | 0 // Safari v5/Win7 | -120 | 0 // Chrome v17/OS X | -120 | 0 // Chrome v17/Win7 | -120 | 0 // IE9/Win7 | -120 | undefined // Firefox v4/OS X | undefined | 1 // Firefox v4/Win7 | undefined | 3 // // ---------------------------------------------------------------------------- export interface VtkNormalizedWheelEvent { spinX: number; spinY: number; pixelX: number; pixelY: number; } export function normalizeWheel(wheelEvent: object): VtkNormalizedWheelEvent; // ---------------------------------------------------------------------------- // Default export // ---------------------------------------------------------------------------- declare const Macro: { algo: typeof algo; capitalize: typeof capitalize; chain: typeof chain; debounce: typeof debounce; enumToString: typeof enumToString; event: typeof event; EVENT_ABORT: typeof EVENT_ABORT; formatBytesToProperUnit: typeof formatBytesToProperUnit; formatNumbersWithThousandSeparator: typeof formatNumbersWithThousandSeparator; get: typeof get; getArray: typeof getArray; getCurrentGlobalMTime(): Number; getStateArrayMapFunc: typeof getStateArrayMapFunc; isVtkObject: typeof isVtkObject; keystore: typeof keystore; measurePromiseExecution: typeof measurePromiseExecution; moveToProtected: typeof moveToProtected; newInstance: typeof newInstance; normalizeWheel: typeof normalizeWheel; obj: typeof obj; proxy: typeof proxy; proxyPropertyMapping: typeof proxyPropertyMapping; proxyPropertyState: typeof proxyPropertyState; safeArrays: typeof safeArrays; set: typeof set; setArray: typeof setArray; setGet: typeof setGet; setGetArray: typeof setGetArray; setImmediate: typeof setImmediateVTK; setLoggerFunction: typeof setLoggerFunction; throttle: typeof throttle; traverseInstanceTree: typeof traverseInstanceTree; TYPED_ARRAYS: typeof TYPED_ARRAYS; uncapitalize: typeof uncapitalize; VOID: typeof VOID; vtkDebugMacro: typeof vtkDebugMacro; vtkErrorMacro: typeof vtkErrorMacro; vtkInfoMacro: typeof vtkInfoMacro; vtkLogMacro: typeof vtkLogMacro; vtkOnceErrorMacro: typeof vtkOnceErrorMacro; vtkWarningMacro: typeof vtkWarningMacro; }; export default Macro;