@thewtex/vtk.js-esm
Version:
Visualization Toolkit for the Web
145 lines (110 loc) • 4.99 kB
JavaScript
import macro from '../../macro.js';
import createMethods from './ImageStream/DefaultProtocol.js';
import ViewStream from './ImageStream/ViewStream.js';
function vtkImageStream(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkImageStream'); // --------------------------------------------------------------------------
// Internal private method
// --------------------------------------------------------------------------
function onImage(data) {
var message = data[0];
if (!message || !message.image) {
return;
}
for (var i = 0; i < model.viewStreams.length; i++) {
model.viewStreams[i].processMessage(message);
}
} // --------------------------------------------------------------------------
// PublicAPI
// --------------------------------------------------------------------------
publicAPI.setServerAnimationFPS = function () {
var maxFPS = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 30;
var changeDetected = false;
if (model.serverAnimationFPS !== maxFPS) {
model.serverAnimationFPS = maxFPS;
changeDetected = true;
}
if (!model.protocol) {
return Promise.resolve(true);
}
if (changeDetected) {
publicAPI.modified();
}
return model.protocol.setServerAnimationFPS(maxFPS);
}; // --------------------------------------------------------------------------
publicAPI.connect = function (session) {
var protocol = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : createMethods;
if (model.connected || !session || !protocol) {
return;
}
model.protocol = protocol(session);
model.protocol.subscribeToImageStream(onImage).then(function (subscription) {
model.renderTopicSubscription = subscription;
model.connected = true;
}).catch(function (e) {
model.connected = false;
console.error(e);
});
}; // --------------------------------------------------------------------------
publicAPI.disconnect = function () {
if (model.protocol && model.connected && model.renderTopicSubscription) {
model.protocol.unsubscribeToImageStream(model.renderTopicSubscription);
model.renderTopicSubscription = null;
}
model.connected = false;
}; // --------------------------------------------------------------------------
publicAPI.registerViewStream = function (view) {
model.viewStreams.push(view);
}; // --------------------------------------------------------------------------
publicAPI.unregisterViewStream = function (view) {
model.viewStreams = model.viewStreams.filter(function (v) {
return v !== view;
});
}; // --------------------------------------------------------------------------
publicAPI.createViewStream = function () {
var viewId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '-1';
var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [400, 400];
var setServerAnimationFPS = publicAPI.setServerAnimationFPS,
getServerAnimationFPS = publicAPI.getServerAnimationFPS,
unregisterViewStream = publicAPI.unregisterViewStream;
var viewStream = ViewStream.newInstance({
protocol: model.protocol,
unregisterViewStream: unregisterViewStream,
sharedAPI: {
setServerAnimationFPS: setServerAnimationFPS,
getServerAnimationFPS: getServerAnimationFPS
}
});
viewStream.setViewId(viewId);
viewStream.setSize(size[0], size[1]);
publicAPI.registerViewStream(viewStream);
return viewStream;
}; // --------------------------------------------------------------------------
publicAPI.delete = macro.chain(function () {
while (model.viewStreams.length) {
model.viewStreams.pop().delete();
}
publicAPI.disconnect();
}, publicAPI.delete);
} // ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
var DEFAULT_VALUES = {
// protocol: null,
viewStreams: [],
serverAnimationFPS: -1
}; // ----------------------------------------------------------------------------
function extend(publicAPI, model) {
var initialValues = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
Object.assign(model, DEFAULT_VALUES, initialValues); // Object methods
macro.obj(publicAPI, model);
macro.get(publicAPI, model, ['serverAnimationFPS', 'protocol']); // Object specific methods
vtkImageStream(publicAPI, model);
} // ----------------------------------------------------------------------------
var newInstance = macro.newInstance(extend, 'vtkImageStream'); // ----------------------------------------------------------------------------
var vtkImageStream$1 = {
newInstance: newInstance,
extend: extend
};
export default vtkImageStream$1;
export { extend, newInstance };