mirror of
https://github.com/OpenFOAM/ThirdParty-6.git
synced 2025-12-08 06:57:43 +00:00
355 lines
13 KiB
JavaScript
355 lines
13 KiB
JavaScript
(function ($, GLOBAL) {
|
|
var SLIDER_TEMPLATE = 'PRIORITY<div class="label"><span class="flag vtk-icon-flag"/>LABEL<span class="NAME-value">DEFAULT</span></div><input type="range" min="0" max="SIZE" value="INDEX" name="NAME" data-values="VALUES"/>',
|
|
SELECT_TEMPLATE = 'PRIORITY<div class="label select"><span class="flag vtk-icon-flag"/>LABEL<select name="NAME">VALUES</select></div>',
|
|
OPTION_TEMPLATE = '<option SELECTED>VALUE</option>',
|
|
EXCLUDE_ARGS = { "theta": true };
|
|
|
|
// ========================================================================
|
|
// Listeners
|
|
// ========================================================================
|
|
|
|
function initializeListeners(container) {
|
|
var play = $('.play', container),
|
|
stop = $('.stop', container),
|
|
activeArgName = null,
|
|
activeValues = [],
|
|
activeValueIndex = 0,
|
|
keepAnimation = false;
|
|
|
|
function animate_callback() {
|
|
if(keepAnimation) {
|
|
setTimeout(animate, 150);
|
|
}
|
|
}
|
|
|
|
function animate() {
|
|
if(activeArgName !== null) {
|
|
activeValueIndex++;
|
|
activeValueIndex = activeValueIndex % activeValues.length;
|
|
updateActiveArgument(container, activeArgName, activeValues[activeValueIndex], animate_callback);
|
|
}
|
|
}
|
|
|
|
// Attach slider listener
|
|
$('input[type="range"]', container).bind('change keyup',function(){
|
|
var slider = $(this),
|
|
name = slider.attr('name'),
|
|
values = slider.attr('data-values').split(":"),
|
|
idx = slider.val();
|
|
|
|
updateActiveArgument(container, name, values[idx]);
|
|
});
|
|
|
|
// Attach select listener
|
|
$('select', container).change(function(){
|
|
var select = $(this),
|
|
name = select.attr('name'),
|
|
value = select.val();
|
|
|
|
updateActiveArgument(container, name, value);
|
|
});
|
|
|
|
$('.toggle', container).click(function(){
|
|
container.toggleClass('small');
|
|
});
|
|
|
|
$('.reset', container).click(function(){
|
|
container.data('viewport').resetCamera();
|
|
});
|
|
|
|
$('.label', container).click(function(){
|
|
var me = $(this),
|
|
all = $('.label', container),
|
|
selectObj = $('select', me.parent()),
|
|
sliderObj = $('input', me.parent());
|
|
|
|
// Handle flag visibility
|
|
all.removeClass('active');
|
|
me.addClass('active');
|
|
|
|
// Extract active parameter
|
|
if(selectObj.length) {
|
|
activeArgName = selectObj.attr('name');
|
|
activeValueIndex = 0;
|
|
activeValues = [];
|
|
$('option', selectObj).each(function(idx, elm) {
|
|
activeValues.push($(this).text());
|
|
});
|
|
}
|
|
if(sliderObj.length) {
|
|
activeArgName = sliderObj.attr('name');
|
|
activeValueIndex = sliderObj.val();
|
|
activeValues = sliderObj.attr('data-values').split(':');
|
|
}
|
|
});
|
|
|
|
play.click(function(){
|
|
play.hide();
|
|
stop.show();
|
|
keepAnimation = true;
|
|
animate();
|
|
});
|
|
stop.click(function(){
|
|
stop.hide();
|
|
play.show();
|
|
keepAnimation = false;
|
|
});
|
|
}
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
function updateActiveArgument(container, name, value, callback) {
|
|
if(container.data('active-args')[name] !== value) {
|
|
info = container.data('info');
|
|
container.data('active-args')[name] = value;
|
|
$('span.'+name+'-value', container).html(value);
|
|
|
|
container.data('session').call("catalyst.active.argument.update", [name, value]).then(function(){
|
|
container.data('viewport').render(callback);
|
|
});
|
|
}
|
|
}
|
|
|
|
// ========================================================================
|
|
// UI
|
|
// ========================================================================
|
|
|
|
var WidgetFactory = {
|
|
"range": function(name, label, values, defaultValue, priority) {
|
|
return templateReplace(SLIDER_TEMPLATE, name, label, values, defaultValue, priority);
|
|
},
|
|
"list": function(name, label, values, defaultValue, priority) {
|
|
var options = [];
|
|
for(var idx in values) {
|
|
var selected = (values[idx] === defaultValue) ? 'selected="selected"' : '';
|
|
options.push(OPTION_TEMPLATE.replace('VALUE', values[idx]).replace('SELECTED', selected));
|
|
}
|
|
return templateReplace(SELECT_TEMPLATE, name, label, [ options.join('') ], defaultValue, priority);
|
|
}
|
|
};
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
function templateReplace( templateString, name, label, values, defaultValue, priority) {
|
|
return templateString.replace(/NAME/g, name).replace(/LABEL/g, label).replace(/VALUES/g, values.join(':')).replace(/SIZE/g, values.length - 1).replace(/DEFAULT/g, defaultValue).replace(/INDEX/g, values.indexOf(defaultValue)).replace(/PRIORITY/g, " ".substring(0,priority));
|
|
}
|
|
|
|
// ------------------------------------------------------------------------
|
|
|
|
function createControlPanel(container, args) {
|
|
var htmlBuffer = [],
|
|
controlContainer = $('<div/>', {
|
|
class: 'control',
|
|
html: '<div class="header"><span class="vtk-icon-tools toggle"/><span class="vtk-icon-resize-full-2 reset"/><span class="vtk-icon-play play"/><span class="vtk-icon-stop stop"/></div><div class="parameters"></div>'
|
|
});
|
|
|
|
// Loop over each option
|
|
for (key in args) {
|
|
var name = key,
|
|
type = args[key].type,
|
|
label = args[key].label,
|
|
values = args[key].values,
|
|
priority = args[key].priority,
|
|
defaultValue = args[key]['default'];
|
|
|
|
// Update default value
|
|
updateActiveArgument(container, name, defaultValue);
|
|
|
|
// Filter out from UI some pre-defined args
|
|
if(EXCLUDE_ARGS.hasOwnProperty(key)) {
|
|
continue;
|
|
}
|
|
|
|
// Build widget if needed
|
|
if(values.length > 1) {
|
|
htmlBuffer.push(WidgetFactory[type](name, label, values, defaultValue, priority));
|
|
}
|
|
}
|
|
|
|
// Add control panel to UI
|
|
htmlBuffer.sort();
|
|
$('<ul/>', {
|
|
html: '<li>' + htmlBuffer.join('</li><li>') + '</li>'
|
|
}).appendTo($('.parameters', controlContainer));
|
|
controlContainer.appendTo(container);
|
|
|
|
// Attache listeners
|
|
initializeListeners(container);
|
|
}
|
|
|
|
// ========================================================================
|
|
// JQuery
|
|
// ========================================================================
|
|
|
|
/**
|
|
* jQuery catalyst view constructor.
|
|
*
|
|
* @member fn.vtkCatalystPVWeb
|
|
* @param basePath
|
|
* Root directory for data to visualize
|
|
*/
|
|
|
|
$.fn.vtkCatalystPVWeb = function(dataBasePath) {
|
|
return this.each(function() {
|
|
var me = $(this).empty().addClass('vtk-catalyst-pvweb small'); //.unbind();
|
|
|
|
// Get meta-data
|
|
$.ajax({
|
|
url: dataBasePath + '/info.json',
|
|
dataType: 'json',
|
|
success: function( data ) {
|
|
// Store metadata
|
|
me.data('info', data);
|
|
me.data('active-args', {});
|
|
|
|
var config = {
|
|
sessionManagerURL: vtkWeb.properties.sessionManagerURL,
|
|
application: data['apps'],
|
|
dataDir: data["working_dir"],
|
|
type: data['pipeline-type']
|
|
},
|
|
stop = vtkWeb.NoOp,
|
|
start = function(connection) {
|
|
// Create viewport
|
|
var viewport = vtkWeb.createViewport({session:connection.session}),
|
|
session = connection.session;
|
|
me.data('viewport', viewport);
|
|
me.data('session', session);
|
|
|
|
viewport.bind(me[0]);
|
|
|
|
// Init pipeline
|
|
if(data.hasOwnProperty('configuration')) {
|
|
session.call("catalyst.pipeline.initialize", [data["configuration"]]).then(function(){
|
|
viewport.render();
|
|
},function(e){
|
|
console.log(e);
|
|
});
|
|
}
|
|
|
|
// Load files
|
|
if(data.hasOwnProperty('files')) {
|
|
session.call("catalyst.file.open", [data["files"]]).then(function(){
|
|
viewport.render();
|
|
},function(e){
|
|
console.log(e);
|
|
});
|
|
}
|
|
|
|
// Create Control UI
|
|
session.call("catalyst.arguments.get").then(function(args){
|
|
createControlPanel(me, args);
|
|
});
|
|
|
|
// Update stop method to use the connection
|
|
stop = function() {
|
|
session.call('application.exit.later', [5]).then(function() {
|
|
try {
|
|
connection.connection.close();
|
|
} catch (closeError) {
|
|
console.log(closeError);
|
|
}
|
|
}, function(err) {
|
|
console.log(err);
|
|
});
|
|
}
|
|
|
|
$('.close',me.parent()).click(stop);
|
|
};
|
|
|
|
// Try to launch the Viz process
|
|
vtkWeb.smartConnect(config, start, function(code,reason){
|
|
alert(reason);
|
|
});
|
|
},
|
|
error: function(error) {
|
|
console.log("error");
|
|
console.log(error);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Alternate jQuery catalyst view constructor.
|
|
*
|
|
* @member fn.vtkCatalystPVWeb
|
|
* @param basePath
|
|
* Root directory for data to visualize
|
|
*/
|
|
|
|
$.fn.vtkCatalystPVWebDirect = function(data) {
|
|
// FIXME: This function and the above function should be refactored
|
|
// FIXME: together to avoid duplicated code.
|
|
return this.each(function() {
|
|
var me = $(this).empty().addClass('vtk-catalyst-pvweb small'); //.unbind();
|
|
|
|
// Store metadata
|
|
me.data('info', data);
|
|
me.data('active-args', {});
|
|
|
|
var stop = vtkWeb.NoOp,
|
|
start = function(connection) {
|
|
// Create viewport
|
|
var viewport = vtkWeb.createViewport({session:connection.session}),
|
|
session = connection.session;
|
|
me.data('viewport', viewport);
|
|
me.data('session', session);
|
|
|
|
viewport.bind(me[0]);
|
|
|
|
// Init pipeline
|
|
if(data.hasOwnProperty('configuration')) {
|
|
session.call("catalyst.pipeline.initialize", [data["configuration"]]).then(function(){
|
|
viewport.render();
|
|
},function(e){
|
|
console.log("There was an error calling 'catalyst.pipeline.initialize':");
|
|
console.log(e);
|
|
});
|
|
}
|
|
|
|
// Load files
|
|
if(data.hasOwnProperty('files')) {
|
|
session.call("catalyst.file.open", [data["files"]]).then(function(){
|
|
viewport.render();
|
|
},function(e){
|
|
console.log("There was an error calling 'catalyst.file.open':");
|
|
console.log(e);
|
|
});
|
|
}
|
|
|
|
// Create Control UI
|
|
session.call("catalyst.arguments.get").then(function(args) {
|
|
createControlPanel(me, args);
|
|
}, function(err) {
|
|
console.log("There was an error calling 'catalyst.arguments.get':");
|
|
console.log(err);
|
|
});
|
|
|
|
// Update stop method to use the connection
|
|
stop = function() {
|
|
session.call('application.exit.later', [5]).then(function() {
|
|
try {
|
|
connection.connection.close();
|
|
} catch (closeError) {
|
|
console.log("Caught exception calling connection.close():");
|
|
console.log(closeError);
|
|
}
|
|
}, function(err) {
|
|
console.log("There was an error calling 'application.exit.later':");
|
|
console.log(err);
|
|
});
|
|
}
|
|
|
|
me.bind('stop-vtk-connection', stop);
|
|
};
|
|
|
|
// Try to launch the Viz process
|
|
vtkWeb.connect(data, start, function(code,reason){
|
|
console.log(reason);
|
|
});
|
|
});
|
|
}
|
|
|
|
}(jQuery, window));
|