ASCU_ALL/Site/js/AnalogChart.js

313 lines
12 KiB
JavaScript
Raw Normal View History

2021-11-12 15:00:41 +05:00
class AnalogChart {
constructor(vdp, tstart, tend) {
function ValueDateFormatter(e) {
var hours = 1000 * 60 * 60;
if (e.trigger === "reset") {
e.chart.options.axisX.valueFormatString = "MM.DD HH";
}
else if (e.trigger === "zoom") {
//Hour (Comparing Hours)
if ((((e.axisX[0].viewportMaximum - e.axisX[0].viewportMinimum) / (hours)) < 24)) {
e.chart.options.axisX.valueFormatString = "HH:mm:ss";
}
//Day (Comparing Days)
else if (((e.axisX.viewportMaximum - e.axisX.viewportMinimum) / (hours)) < 48) {
e.chart.options.axisX.valueFormatString = "HH:mm";
}
//Year (Comparing Years)
else if (((e.axisX[0].viewportMaximum - e.axisX[0].viewportMinimum) / (hours * 24)) < 2) {
e.chart.options.axisX.valueFormatString = "MM.DD HH";
}
else {
e.chart.options.axisX.valueFormatString = "MM.DD";
}
}
}
this._vdp = vdp;
this._tstart = tstart;
this._tend = tend;
this._chart_global = $("#AnalogChart_Global");
this._chart_checkbox = $("#AnalogChart_Checkbox");
this._chart_label = $("#AnalogChart_label");
this._chart_buttonUpdate = $("#AnalogChart_Update");
var self = this;
this._chart_buttonUpdate.unbind("click");
this._chart_buttonUpdate.click(function () {
self.Update();
});
this._chart_conteiner = $("#AnalogChart");
this._data = [];
this._axisYList = [
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "кА", logarithmic: false
},
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "кПа", logarithmic: false
},
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "А", logarithmic: false
},
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "В", logarithmic: false
},
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "гр.С", logarithmic: false
},
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "гр", logarithmic: false
},
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "мм", logarithmic: false
},
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "мкм.рт.с", logarithmic: true
},
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "м^3/ч", logarithmic: false
},
{
labelFontSize: 12, labelAngle: -80,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "кгс/см^2", logarithmic: false
}
];
this._chart = new CanvasJS.Chart("AnalogChart", {
toolTip: {
fontSize: 12,
shared: true,
contentFormatter: function (e) {
var str = "";
if (e.entries.length < 1)
return str;
var lastdate = e.entries[0].dataPoint.x;
var data = e.chart._dataInRenderedOrder;
for (var i = 0; i < data.length; i++) {
var y = null;
for (var j = 0; j < data[i].dataPoints.length; j++) {
var t = data[i].dataPoints[j].x - lastdate;
if (t <= 0)
y = data[i].dataPoints[j].y;
else
break;
t = data[i].dataPoints[(data[i].dataPoints.length - 1) - j].x - lastdate;
if (t <= 0) {
y = data[i].dataPoints[(data[i].dataPoints.length - 1) - j].y;
break;
}
}
var temp =
data[i].name + ': <strong style="color:' +
data[i].color + ';">' +
y + ' </strong>' + data[i].axisY.suffix + "<br/>";
str = str.concat(temp);
}
return (str);
}
},
animationEnabled: true,
animationDuration: 1000,
exportFileName: "Analog Signals",
exportEnabled: true,
zoomEnabled: true,
theme: "light1",
backgroundColor: "#FFFFFF",
colorSet: "colorSet1",
culture: "ru",
title: {},
legend: {},
rangeChanging: ValueDateFormatter,
axisX: {
labelFontSize: 12,
margin: 1,
tickLength: 3,
tickThickness: 1,
lineThickness: 1,
gridThickness: 0.3,
valueFormatString: "MM.DD HH"
},
axisY: [
{
labelFontSize: 12, labelAngle: -90,
margin: 1, tickLength: 3, tickThickness: 1, lineThickness: 1, gridThickness: 0.1,
suffix: "", logarithmic: false
}
],
data: []
});
var self = this;
}
LoadData() {
this.Clear();
$("#AnalogChart_Load_Element").show();
var self = this;
$.ajax({
type: "POST",
url: 'http://' + document.URL.split("/")[2] + '/api/listanalog',
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify({
"vdp": self._vdp
}),
success: function (date) {
self.AddList(date);
self.Update();
self.Show();
},
complete: function () {
$("#AnalogChart_Load_Element").hide();
}
})
}
AddList(d) {
if (d == undefined || d.length <= 0)
return;
for (var i = 0; i < d.length; i++) {
var data = {
type: "line",
markerType: "none",
name: d[i].sn == undefined ? "" : d[i].sn,
suffix: d[i].s,
axisYIndex: 0,
}
this._data.push(data);
var vischk = d[i].v ? 'checked' : '';
this._chart_checkbox.append('<label class="form-check-label">' +
'<input type = "checkbox" class= "form-check-input"' + vischk + '>' +
d[i].fn + '</label><br />');
}
}
Update() {
this._chart_buttonUpdate.attr('disabled', true);
while (this._chart.options.axisY.length > 1)
this._chart.options.axisY.pop();
while (this._chart.options.data.length > 0)
this._chart.options.data.pop();
var chkList = this._chart_checkbox.find('input');
var sendmass = [];
for (var i = 0; i < chkList.length; i++) {
if (chkList[i].checked)
sendmass.push(i);
}
var self = this;
$.ajax({
type: "POST",
url: 'http://' + document.URL.split("/")[2] + '/api/analog',
contentType: "application/json; charset=utf-8",
dataType: "json",
data: JSON.stringify({
"vdp": self._vdp,
"timeStart": self._tstart,
"timeEnd": self._tend,
"signals": sendmass
}),
success: function (date) {
for (var i = 0; i < date.length; i++) {
date[i] = self.Hunpack(date[i]);
}
var caret = 0;
var chkList = self._chart_checkbox.find('input');
for (var i = 0; i < chkList.length; i++) {
if (!chkList[i].checked)
continue;
var d = self._data[i];
d.dataPoints = [];
for (var j = 0; j < date[caret].length; j++)
d.dataPoints.push({
x: new Date(date[caret][j].x),
y: date[caret][j].y
});
caret++;
var idx = -1;
for (var j = 0; j < self._chart.options.axisY.length; j++)
if (self._chart.options.axisY[j].suffix == d.suffix)
idx = j;
if (idx != -1) {
d.axisYIndex = idx;
self._chart.options.data.push(d);
continue;
}
for (var j = 0; j < self._axisYList.length; j++) {
if (self._axisYList[j].suffix == d.suffix)
idx = j;
}
if (idx != -1) {
self._chart.options.axisY.push(self._axisYList[idx]);
d.axisYIndex = self._chart.options.axisY.length - 1;
self._chart.options.data.push(d);
continue;
}
d.axisYIndex = 0;
self._chart.options.data.push(d);
}
self._chart.render();
},
complete: function () {
self._chart_buttonUpdate.removeAttr('disabled');
//$("#AnalogChart_Load_Element").hide();
}
})
}
Show() {
//this.Update();
this._chart_global.removeAttr('hidden');
this._chart_label.removeAttr('hidden');
this._chart.render();
}
Clear() {
this._data = [];
this._chart_global.attr('hidden', true);
this._chart_label.attr('hidden', true);
this._chart_checkbox.empty();
this._chart.options.data = [];
}
Hunpack(hlist) {
for (var
length = hlist.length,
klength = hlist[0],
result = Array(((length - klength - 1) / klength) || 0),
i = 1 + klength,
j = 0,
ki, o;
i < length;
) {
for (
result[j++] = (o = {}), ki = 0;
ki < klength;
o[hlist[++ki]] = hlist[i++]
);
}
return result;
}
}