|
|
var query = null;
|
|
|
|
|
|
function load() {
|
|
selectDataType();
|
|
|
|
loadCsvExample();
|
|
loadJsonExample();
|
|
loadJavascriptExample();
|
|
loadGooglespreadsheetExample();
|
|
loadDatasourceExample();
|
|
|
|
draw();
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Upate the UI based on the currently selected datatype
|
|
*/
|
|
function selectDataType() {
|
|
}
|
|
|
|
|
|
function round(value, decimals) {
|
|
return parseFloat(value.toFixed(decimals));
|
|
}
|
|
|
|
function loadCsvExample() {
|
|
var csv = "";
|
|
|
|
// headers
|
|
csv += '"x", "y", "value"\n';
|
|
|
|
// create some nice looking data with sin/cos
|
|
var steps = 30;
|
|
var axisMax = 314;
|
|
var axisStep = axisMax / steps;
|
|
for (var x = 0; x < axisMax; x+=axisStep) {
|
|
for (var y = 0; y < axisMax; y+=axisStep) {
|
|
var value = Math.sin(x/50) * Math.cos(y/50) * 50 + 50;
|
|
|
|
csv += round(x, 2) + ', ' + round(y, 2) + ', ' + round(value, 2) + '\n';
|
|
}
|
|
}
|
|
|
|
document.getElementById("csvTextarea").innerHTML = csv;
|
|
|
|
// also adjust some settings
|
|
document.getElementById("style").value = "surface";
|
|
document.getElementById("verticalRatio").value = "0.5";
|
|
|
|
document.getElementById("xLabel").value = "x";
|
|
document.getElementById("yLabel").value = "y";
|
|
document.getElementById("zLabel").value = "value";
|
|
document.getElementById("filterLabel").value = "";
|
|
document.getElementById("legendLabel").value = "";
|
|
drawCsv();
|
|
}
|
|
|
|
|
|
function loadCsvAnimationExample() {
|
|
var csv = "";
|
|
|
|
// headers
|
|
csv += '"x", "y", "value", "time"\n';
|
|
|
|
// create some nice looking data with sin/cos
|
|
var steps = 20;
|
|
var axisMax = 314;
|
|
var tMax = 31;
|
|
var axisStep = axisMax / steps;
|
|
for (var t = 0; t < tMax; t++) {
|
|
for (var x = 0; x < axisMax; x+=axisStep) {
|
|
for (var y = 0; y < axisMax; y+=axisStep) {
|
|
var value = Math.sin(x/50 + t/10) * Math.cos(y/50 + t/10) * 50 + 50;
|
|
csv += round(x, 2) + ', ' + round(y, 2) + ', ' + round(value, 2) + ', ' + t + '\n';
|
|
}
|
|
}
|
|
}
|
|
|
|
document.getElementById("csvTextarea").innerHTML = csv;
|
|
|
|
// also adjust some settings
|
|
document.getElementById("style").value = "surface";
|
|
document.getElementById("verticalRatio").value = "0.5";
|
|
document.getElementById("animationInterval").value = 100;
|
|
|
|
document.getElementById("xLabel").value = "x";
|
|
document.getElementById("yLabel").value = "y";
|
|
document.getElementById("zLabel").value = "value";
|
|
document.getElementById("filterLabel").value = "time";
|
|
document.getElementById("legendLabel").value = "";
|
|
|
|
drawCsv();
|
|
}
|
|
|
|
|
|
function loadCsvLineExample() {
|
|
var csv = "";
|
|
|
|
// headers
|
|
csv += '"sin(t)", "cos(t)", "t"\n';
|
|
|
|
// create some nice looking data with sin/cos
|
|
var steps = 100;
|
|
var axisMax = 314;
|
|
var tmax = 4 * 2 * Math.PI;
|
|
var axisStep = axisMax / steps;
|
|
for (t = 0; t < tmax; t += tmax / steps) {
|
|
var r = 1;
|
|
var x = r * Math.sin(t);
|
|
var y = r * Math.cos(t);
|
|
var z = t;
|
|
csv += round(x, 2) + ', ' + round(y, 2) + ', ' + round(z, 2) + '\n';
|
|
}
|
|
|
|
document.getElementById("csvTextarea").innerHTML = csv;
|
|
|
|
// also adjust some settings
|
|
document.getElementById("style").value = "line";
|
|
document.getElementById("verticalRatio").value = "1.0";
|
|
document.getElementById("showPerspective").checked = false;
|
|
|
|
document.getElementById("xLabel").value = "sin(t)";
|
|
document.getElementById("yLabel").value = "cos(t)";
|
|
document.getElementById("zLabel").value = "t";
|
|
document.getElementById("filterLabel").value = "";
|
|
document.getElementById("legendLabel").value = "";
|
|
|
|
drawCsv();
|
|
}
|
|
|
|
function loadCsvMovingDotsExample() {
|
|
var csv = "";
|
|
|
|
// headers
|
|
csv += '"x", "y", "z", "color value", "time"\n';
|
|
|
|
// create some shortcuts to math functions
|
|
var sin = Math.sin;
|
|
var cos = Math.cos;
|
|
var pi = Math.PI;
|
|
|
|
// create the animation data
|
|
var tmax = 2.0 * pi;
|
|
var tstep = tmax / 75;
|
|
var dotCount = 1; // set this to 1, 2, 3, 4, ...
|
|
for (var t = 0; t < tmax; t += tstep) {
|
|
var tgroup = parseFloat(t.toFixed(2));
|
|
var value = t;
|
|
|
|
// a dot in the center
|
|
var x = 0;
|
|
var y = 0;
|
|
var z = 0;
|
|
csv += round(x, 2) + ', ' + round(y, 2) + ', ' + round(z, 2) + ', ' + round(value, 2)+ ', ' + round(tgroup, 2) + '\n';
|
|
|
|
// one or multiple dots moving around the center
|
|
for (var dot = 0; dot < dotCount; dot++) {
|
|
var tdot = t + 2*pi * dot / dotCount;
|
|
//data.addRow([sin(tdot), cos(tdot), sin(tdot), value, tgroup]);
|
|
//data.addRow([sin(tdot), -cos(tdot), sin(tdot + tmax*1/2), value, tgroup]);
|
|
|
|
var x = sin(tdot);
|
|
var y = cos(tdot);
|
|
var z = sin(tdot);
|
|
csv += round(x, 2) + ', ' + round(y, 2) + ', ' + round(z, 2) + ', ' + round(value, 2)+ ', ' + round(tgroup, 2) + '\n';
|
|
|
|
var x = sin(tdot);
|
|
var y = -cos(tdot);
|
|
var z = sin(tdot + tmax*1/2);
|
|
csv += round(x, 2) + ', ' + round(y, 2) + ', ' + round(z, 2) + ', ' + round(value, 2)+ ', ' + round(tgroup, 2) + '\n';
|
|
|
|
}
|
|
}
|
|
|
|
document.getElementById("csvTextarea").innerHTML = csv;
|
|
|
|
// also adjust some settings
|
|
document.getElementById("style").value = "dot-color";
|
|
document.getElementById("verticalRatio").value = "1.0";
|
|
document.getElementById("animationInterval").value = "35";
|
|
document.getElementById("animationAutoStart").checked = true;
|
|
document.getElementById("showPerspective").checked = true;
|
|
|
|
document.getElementById("xLabel").value = "x";
|
|
document.getElementById("yLabel").value = "y";
|
|
document.getElementById("zLabel").value = "z";
|
|
document.getElementById("filterLabel").value = "time";
|
|
document.getElementById("legendLabel").value = "color value";
|
|
|
|
drawCsv();
|
|
}
|
|
|
|
function loadCsvColoredDotsExample() {
|
|
var csv = "";
|
|
|
|
// headers
|
|
csv += '"x", "y", "z", "distance"\n';
|
|
|
|
// create some shortcuts to math functions
|
|
var sqrt = Math.sqrt;
|
|
var pow = Math.pow;
|
|
var random = Math.random;
|
|
|
|
// create the animation data
|
|
var imax = 200;
|
|
for (var i = 0; i < imax; i++) {
|
|
var x = pow(random(), 2);
|
|
var y = pow(random(), 2);
|
|
var z = pow(random(), 2);
|
|
var dist = sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
|
|
|
|
csv += round(x, 2) + ', ' + round(y, 2) + ', ' + round(z, 2) + ', ' + round(dist, 2)+ '\n';
|
|
}
|
|
|
|
document.getElementById("csvTextarea").innerHTML = csv;
|
|
|
|
// also adjust some settings
|
|
document.getElementById("style").value = "dot-color";
|
|
document.getElementById("verticalRatio").value = "1.0";
|
|
document.getElementById("showPerspective").checked = true;
|
|
|
|
document.getElementById("xLabel").value = "x";
|
|
document.getElementById("yLabel").value = "y";
|
|
document.getElementById("zLabel").value = "value";
|
|
document.getElementById("legendLabel").value = "distance"
|
|
document.getElementById("filterLabel").value = "";
|
|
|
|
drawCsv();
|
|
}
|
|
|
|
function loadCsvSizedDotsExample() {
|
|
var csv = "";
|
|
|
|
// headers
|
|
csv += '"x", "y", "z", "range"\n';
|
|
|
|
// create some shortcuts to math functions
|
|
var sqrt = Math.sqrt;
|
|
var pow = Math.pow;
|
|
var random = Math.random;
|
|
|
|
// create the animation data
|
|
var imax = 200;
|
|
for (var i = 0; i < imax; i++) {
|
|
var x = pow(random(), 2);
|
|
var y = pow(random(), 2);
|
|
var z = pow(random(), 2);
|
|
var dist = sqrt(pow(x, 2) + pow(y, 2) + pow(z, 2));
|
|
var range = sqrt(2) - dist;
|
|
|
|
csv += round(x, 2) + ', ' + round(y, 2) + ', ' + round(z, 2) + ', ' + round(range, 2)+ '\n';
|
|
}
|
|
|
|
document.getElementById("csvTextarea").innerHTML = csv;
|
|
|
|
// also adjust some settings
|
|
document.getElementById("style").value = "dot-size";
|
|
document.getElementById("verticalRatio").value = "1.0";
|
|
document.getElementById("showPerspective").checked = true;
|
|
|
|
document.getElementById("xLabel").value = "x";
|
|
document.getElementById("yLabel").value = "y";
|
|
document.getElementById("zLabel").value = "z";
|
|
document.getElementById("legendLabel").value = "range";
|
|
document.getElementById("filterLabel").value = "";
|
|
|
|
drawCsv();
|
|
}
|
|
|
|
|
|
function loadJsonExample() {
|
|
}
|
|
|
|
|
|
function loadJavascriptExample() {
|
|
}
|
|
|
|
function loadJavascriptFunctionExample() {
|
|
}
|
|
|
|
function loadGooglespreadsheetExample() {
|
|
|
|
}
|
|
|
|
|
|
function loadDatasourceExample() {
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Retrieve teh currently selected datatype
|
|
* @return {string} datatype
|
|
*/
|
|
function getDataType() {
|
|
return "csv";
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieve the datatable from the entered contents of the csv text
|
|
* @param {boolean} [skipValue] | if true, the 4th element is a filter value
|
|
* @return {vis DataSet}
|
|
*/
|
|
function getDataCsv() {
|
|
var csv = document.getElementById("csvTextarea").value;
|
|
|
|
// parse the csv content
|
|
var csvArray = csv2array(csv);
|
|
|
|
var data = new vis.DataSet();
|
|
|
|
var skipValue = false;
|
|
if (document.getElementById("filterLabel").value != "" && document.getElementById("legendLabel").value == "") {
|
|
skipValue = true;
|
|
}
|
|
|
|
// read all data
|
|
for (var row = 1; row < csvArray.length; row++) {
|
|
if (csvArray[row].length == 4 && skipValue == false) {
|
|
data.add({x:parseFloat(csvArray[row][0]),
|
|
y:parseFloat(csvArray[row][1]),
|
|
z:parseFloat(csvArray[row][2]),
|
|
style:parseFloat(csvArray[row][3])});
|
|
}
|
|
else if (csvArray[row].length == 4 && skipValue == true) {
|
|
data.add({x:parseFloat(csvArray[row][0]),
|
|
y:parseFloat(csvArray[row][1]),
|
|
z:parseFloat(csvArray[row][2]),
|
|
filter:parseFloat(csvArray[row][3])});
|
|
}
|
|
else if (csvArray[row].length == 5) {
|
|
data.add({x:parseFloat(csvArray[row][0]),
|
|
y:parseFloat(csvArray[row][1]),
|
|
z:parseFloat(csvArray[row][2]),
|
|
style:parseFloat(csvArray[row][3]),
|
|
filter:parseFloat(csvArray[row][4])});
|
|
}
|
|
else {
|
|
data.add({x:parseFloat(csvArray[row][0]),
|
|
y:parseFloat(csvArray[row][1]),
|
|
z:parseFloat(csvArray[row][2]),
|
|
style:parseFloat(csvArray[row][2])});
|
|
}
|
|
}
|
|
|
|
return data;
|
|
}
|
|
|
|
/**
|
|
* remove leading and trailing spaces
|
|
*/
|
|
function trim(text) {
|
|
while (text.length && text.charAt(0) == ' ')
|
|
text = text.substr(1);
|
|
|
|
while (text.length && text.charAt(text.length-1) == ' ')
|
|
text = text.substr(0, text.length-1);
|
|
|
|
return text;
|
|
}
|
|
|
|
/**
|
|
* Retrieve the datatable from the entered contents of the javascript text
|
|
* @return {vis Dataset}
|
|
*/
|
|
function getDataJson() {
|
|
var json = document.getElementById("jsonTextarea").value;
|
|
var data = new google.visualization.DataTable(json);
|
|
|
|
return data;
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieve the datatable from the entered contents of the javascript text
|
|
* @return {vis Dataset}
|
|
*/
|
|
function getDataJavascript() {
|
|
var js = document.getElementById("javascriptTextarea").value;
|
|
|
|
eval(js);
|
|
|
|
return data;
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieve the datatable from the entered contents of the datasource text
|
|
* @return {vis Dataset}
|
|
*/
|
|
function getDataDatasource() {
|
|
}
|
|
|
|
/**
|
|
* Retrieve a JSON object with all options
|
|
*/
|
|
function getOptions() {
|
|
return {
|
|
width: document.getElementById("width").value,
|
|
height: document.getElementById("height").value,
|
|
style: document.getElementById("style").value,
|
|
showAnimationControls: (document.getElementById("showAnimationControls").checked != false),
|
|
showGrid: (document.getElementById("showGrid").checked != false),
|
|
showPerspective: (document.getElementById("showPerspective").checked != false),
|
|
showShadow: (document.getElementById("showShadow").checked != false),
|
|
keepAspectRatio: (document.getElementById("keepAspectRatio").checked != false),
|
|
verticalRatio: document.getElementById("verticalRatio").value,
|
|
animationInterval: document.getElementById("animationInterval").value,
|
|
xLabel: document.getElementById("xLabel").value,
|
|
yLabel: document.getElementById("yLabel").value,
|
|
zLabel: document.getElementById("zLabel").value,
|
|
filterLabel: document.getElementById("filterLabel").value,
|
|
legendLabel: document.getElementById("legendLabel").value,
|
|
animationPreload: (document.getElementById("animationPreload").checked != false),
|
|
animationAutoStart:(document.getElementById("animationAutoStart").checked != false),
|
|
|
|
xCenter: Number(document.getElementById("xCenter").value) || undefined,
|
|
yCenter: Number(document.getElementById("yCenter").value) || undefined,
|
|
|
|
xMin: Number(document.getElementById("xMin").value) || undefined,
|
|
xMax: Number(document.getElementById("xMax").value) || undefined,
|
|
xStep: Number(document.getElementById("xStep").value) || undefined,
|
|
yMin: Number(document.getElementById("yMin").value) || undefined,
|
|
yMax: Number(document.getElementById("yMax").value) || undefined,
|
|
yStep: Number(document.getElementById("yStep").value) || undefined,
|
|
zMin: Number(document.getElementById("zMin").value) || undefined,
|
|
zMax: Number(document.getElementById("zMax").value) || undefined,
|
|
zStep: Number(document.getElementById("zStep").value) || undefined,
|
|
|
|
valueMin: Number(document.getElementById("valueMin").value) || undefined,
|
|
valueMax: Number(document.getElementById("valueMax").value) || undefined,
|
|
|
|
xBarWidth: Number(document.getElementById("xBarWidth").value) || undefined,
|
|
yBarWidth: Number(document.getElementById("yBarWidth").value) || undefined
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Redraw the graph with the entered data and options
|
|
*/
|
|
function draw() {
|
|
return drawCsv();
|
|
}
|
|
|
|
|
|
function drawCsv() {
|
|
// retrieve data and options
|
|
var data = getDataCsv();
|
|
var options = getOptions();
|
|
|
|
// Creat a graph
|
|
var graph = new vis.Graph3d(document.getElementById('graph'), data, options);
|
|
}
|
|
|
|
function drawJson() {
|
|
// retrieve data and options
|
|
var data = getDataJson();
|
|
var options = getOptions();
|
|
|
|
// Creat a graph
|
|
var graph = new vis.Graph3d(document.getElementById('graph'), data, options);
|
|
}
|
|
|
|
function drawJavascript() {
|
|
// retrieve data and options
|
|
var data = getDataJavascript();
|
|
var options = getOptions();
|
|
|
|
// Creat a graph
|
|
var graph = new vis.Graph3d(document.getElementById('graph'), data, options);
|
|
}
|
|
|
|
|
|
function drawGooglespreadsheet() {
|
|
// Instantiate our graph object.
|
|
drawGraph = function(response) {
|
|
document.getElementById("draw").disabled = "";
|
|
|
|
if (response.isError()) {
|
|
error = 'Error: ' + response.getMessage();
|
|
document.getElementById('graph').innerHTML =
|
|
"<span style='color: red; font-weight: bold;'>" + error + "</span>"; ;
|
|
}
|
|
|
|
// retrieve the data from the query response
|
|
data = response.getDataTable();
|
|
|
|
// specify options
|
|
options = getOptions();
|
|
|
|
// Instantiate our graph object.
|
|
var graph = new vis.Graph3d(document.getElementById('graph'), data, options);
|
|
}
|
|
|
|
url = document.getElementById("googlespreadsheetText").value;
|
|
document.getElementById("draw").disabled = "disabled";
|
|
|
|
// send the request
|
|
query && query.abort();
|
|
query = new google.visualization.Query(url);
|
|
query.send(drawGraph);
|
|
}
|
|
|
|
|
|
function drawDatasource() {
|
|
// Instantiate our graph object.
|
|
drawGraph = function(response) {
|
|
document.getElementById("draw").disabled = "";
|
|
|
|
if (response.isError()) {
|
|
error = 'Error: ' + response.getMessage();
|
|
document.getElementById('graph').innerHTML =
|
|
"<span style='color: red; font-weight: bold;'>" + error + "</span>"; ;
|
|
}
|
|
|
|
// retrieve the data from the query response
|
|
data = response.getDataTable();
|
|
|
|
// specify options
|
|
options = getOptions();
|
|
|
|
// Instantiate our graph object.
|
|
var graph = new vis.Graph3d(document.getElementById('graph'), data, options);
|
|
};
|
|
|
|
url = document.getElementById("datasourceText").value;
|
|
document.getElementById("draw").disabled = "disabled";
|
|
|
|
// if the entered url is a google spreadsheet url, replace the part
|
|
// "/ccc?" with "/tq?" in order to retrieve a neat data query result
|
|
if (url.indexOf("/ccc?")) {
|
|
url.replace("/ccc?", "/tq?");
|
|
}
|
|
|
|
// send the request
|
|
query && query.abort();
|
|
query = new google.visualization.Query(url);
|
|
query.send(drawGraph);
|
|
}
|