📄 chart.js
字号:
/*
Copyright (c) 2004-2006, The Dojo Foundation
All Rights Reserved.
Licensed under the Academic Free License version 2.1 or above OR the
modified BSD license. For more information on Dojo licensing, see:
http://dojotoolkit.org/community/licensing.shtml
*/
dojo.provide("dojo.widget.svg.Chart");
dojo.require("dojo.widget.HtmlWidget");
dojo.require("dojo.widget.Chart");
dojo.require("dojo.html.layout");
dojo.require("dojo.math");
dojo.require("dojo.svg");
dojo.require("dojo.gfx.color");
dojo.require("dojo.json");
dojo.widget.defineWidget("dojo.widget.svg.Chart", [dojo.widget.HtmlWidget, dojo.widget.Chart], function () {
this.templatePath = null;
this.templateCssPath = null;
this._isInitialize = false;
this.hasData = false;
this.vectorNode = null;
this.plotArea = null;
this.dataGroup = null;
this.axisGroup = null;
this.properties = {height:0, width:0, defaultWidth:600, defaultHeight:400, plotType:null, padding:{top:10, bottom:2, left:60, right:30}, axes:{x:{plotAt:0, label:"", unitLabel:"", unitType:Number, nUnitsToShow:10, range:{min:0, max:200}}, y:{plotAt:0, label:"", unitLabel:"", unitType:Number, nUnitsToShow:10, range:{min:0, max:200}}}};
}, {parseProperties:function (node) {
var bRangeX = false;
var bRangeY = false;
if (node.getAttribute("width")) {
this.properties.width = node.getAttribute("width");
}
if (node.getAttribute("height")) {
this.properties.height = node.getAttribute("height");
}
if (node.getAttribute("plotType")) {
this.properties.plotType = node.getAttribute("plotType");
}
if (node.getAttribute("padding")) {
if (node.getAttribute("padding").indexOf(",") > -1) {
var p = node.getAttribute("padding").split(",");
} else {
var p = node.getAttribute("padding").split(" ");
}
if (p.length == 1) {
var pad = parseFloat(p[0]);
this.properties.padding.top = pad;
this.properties.padding.right = pad;
this.properties.padding.bottom = pad;
this.properties.padding.left = pad;
} else {
if (p.length == 2) {
var padV = parseFloat(p[0]);
var padH = parseFloat(p[1]);
this.properties.padding.top = padV;
this.properties.padding.right = padH;
this.properties.padding.bottom = padV;
this.properties.padding.left = padH;
} else {
if (p.length == 4) {
this.properties.padding.top = parseFloat(p[0]);
this.properties.padding.right = parseFloat(p[1]);
this.properties.padding.bottom = parseFloat(p[2]);
this.properties.padding.left = parseFloat(p[3]);
}
}
}
}
if (node.getAttribute("rangeX")) {
var p = node.getAttribute("rangeX");
if (p.indexOf(",") > -1) {
p = p.split(",");
} else {
p = p.split(" ");
}
this.properties.axes.x.range.min = parseFloat(p[0]);
this.properties.axes.x.range.max = parseFloat(p[1]);
bRangeX = true;
}
if (node.getAttribute("rangeY")) {
var p = node.getAttribute("rangeY");
if (p.indexOf(",") > -1) {
p = p.split(",");
} else {
p = p.split(" ");
}
this.properties.axes.y.range.min = parseFloat(p[0]);
this.properties.axes.y.range.max = parseFloat(p[1]);
bRangeY = true;
}
return {rangeX:bRangeX, rangeY:bRangeY};
}, setAxesPlot:function (table) {
if (table.getAttribute("axisAt")) {
var p = table.getAttribute("axisAt");
if (p.indexOf(",") > -1) {
p = p.split(",");
} else {
p = p.split(" ");
}
if (!isNaN(parseFloat(p[0]))) {
this.properties.axes.x.plotAt = parseFloat(p[0]);
} else {
if (p[0].toLowerCase() == "ymin") {
this.properties.axes.x.plotAt = this.properties.axes.y.range.min;
} else {
if (p[0].toLowerCase() == "ymax") {
this.properties.axes.x.plotAt = this.properties.axes.y.range.max;
}
}
}
if (!isNaN(parseFloat(p[1]))) {
this.properties.axes.y.plotAt = parseFloat(p[1]);
} else {
if (p[1].toLowerCase() == "xmin") {
this.properties.axes.y.plotAt = this.properties.axes.x.range.min;
} else {
if (p[1].toLowerCase() == "xmax") {
this.properties.axes.y.plotAt = this.properties.axes.x.range.max;
}
}
}
} else {
this.properties.axes.x.plotAt = this.properties.axes.y.range.min;
this.properties.axes.y.plotAt = this.properties.axes.x.range.min;
}
}, drawVectorNode:function () {
dojo.svg.g.suspend();
if (this.vectorNode) {
this.destroy();
}
this.vectorNode = document.createElementNS(dojo.svg.xmlns.svg, "svg");
this.vectorNode.setAttribute("width", this.properties.width);
this.vectorNode.setAttribute("height", this.properties.height);
dojo.svg.g.resume();
}, drawPlotArea:function () {
dojo.svg.g.suspend();
if (this.plotArea) {
this.plotArea.parentNode.removeChild(this.plotArea);
this.plotArea = null;
}
var defs = document.createElementNS(dojo.svg.xmlns.svg, "defs");
var clip = document.createElementNS(dojo.svg.xmlns.svg, "clipPath");
clip.setAttribute("id", "plotClip" + this.widgetId);
var rect = document.createElementNS(dojo.svg.xmlns.svg, "rect");
rect.setAttribute("x", this.properties.padding.left);
rect.setAttribute("y", this.properties.padding.top);
rect.setAttribute("width", this.properties.width - this.properties.padding.left - this.properties.padding.right);
rect.setAttribute("height", this.properties.height - this.properties.padding.top - this.properties.padding.bottom);
clip.appendChild(rect);
defs.appendChild(clip);
this.vectorNode.appendChild(defs);
this.plotArea = document.createElementNS(dojo.svg.xmlns.svg, "g");
this.vectorNode.appendChild(this.plotArea);
var rect = document.createElementNS(dojo.svg.xmlns.svg, "rect");
rect.setAttribute("x", this.properties.padding.left);
rect.setAttribute("y", this.properties.padding.top);
rect.setAttribute("width", this.properties.width - this.properties.padding.left - this.properties.padding.right);
rect.setAttribute("height", this.properties.height - this.properties.padding.top - this.properties.padding.bottom);
rect.setAttribute("fill", "#fff");
this.plotArea.appendChild(rect);
dojo.svg.g.resume();
}, drawDataGroup:function () {
dojo.svg.g.suspend();
if (this.dataGroup) {
this.dataGroup.parentNode.removeChild(this.dataGroup);
this.dataGroup = null;
}
this.dataGroup = document.createElementNS(dojo.svg.xmlns.svg, "g");
this.dataGroup.setAttribute("style", "clip-path:url(#plotClip" + this.widgetId + ");");
this.plotArea.appendChild(this.dataGroup);
dojo.svg.g.resume();
}, drawAxes:function () {
dojo.svg.g.suspend();
if (this.axisGroup) {
this.axisGroup.parentNode.removeChild(this.axisGroup);
this.axisGroup = null;
}
this.axisGroup = document.createElementNS(dojo.svg.xmlns.svg, "g");
this.plotArea.appendChild(this.axisGroup);
var stroke = 1;
var line = document.createElementNS(dojo.svg.xmlns.svg, "line");
var y = dojo.widget.svg.Chart.Plotter.getY(this.properties.axes.x.plotAt, this);
line.setAttribute("y1", y);
line.setAttribute("y2", y);
line.setAttribute("x1", this.properties.padding.left - stroke);
line.setAttribute("x2", this.properties.width - this.properties.padding.right);
line.setAttribute("style", "stroke:#000;stroke-width:" + stroke + ";");
this.axisGroup.appendChild(line);
var textSize = 10;
var text = document.createElementNS(dojo.svg.xmlns.svg, "text");
text.setAttribute("x", this.properties.padding.left);
text.setAttribute("y", this.properties.height - this.properties.padding.bottom + textSize + 2);
text.setAttribute("style", "text-anchor:middle;font-size:" + textSize + "px;fill:#000;");
text.appendChild(document.createTextNode(dojo.math.round(parseFloat(this.properties.axes.x.range.min), 2)));
this.axisGroup.appendChild(text);
var text = document.createElementNS(dojo.svg.xmlns.svg, "text");
text.setAttribute("x", this.properties.width - this.properties.padding.right - (textSize / 2));
text.setAttribute("y", this.properties.height - this.properties.padding.bottom + textSize + 2);
text.setAttribute("style", "text-anchor:middle;font-size:" + textSize + "px;fill:#000;");
text.appendChild(document.createTextNode(dojo.math.round(parseFloat(this.properties.axes.x.range.max), 2)));
this.axisGroup.appendChild(text);
var line = document.createElementNS(dojo.svg.xmlns.svg, "line");
var x = dojo.widget.svg.Chart.Plotter.getX(this.properties.axes.y.plotAt, this);
line.setAttribute("x1", x);
line.setAttribute("x2", x);
line.setAttribute("y1", this.properties.padding.top);
line.setAttribute("y2", this.properties.height - this.properties.padding.bottom);
line.setAttribute("style", "stroke:#000;stroke-width:" + stroke + ";");
this.axisGroup.appendChild(line);
var text = document.createElementNS(dojo.svg.xmlns.svg, "text");
text.setAttribute("x", this.properties.padding.left - 4);
text.setAttribute("y", this.properties.height - this.properties.padding.bottom);
text.setAttribute("style", "text-anchor:end;font-size:" + textSize + "px;fill:#000;");
text.appendChild(document.createTextNode(dojo.math.round(parseFloat(this.properties.axes.y.range.min), 2)));
this.axisGroup.appendChild(text);
var text = document.createElementNS(dojo.svg.xmlns.svg, "text");
text.setAttribute("x", this.properties.padding.left - 4);
text.setAttribute("y", this.properties.padding.top + (textSize / 2));
text.setAttribute("style", "text-anchor:end;font-size:" + textSize + "px;fill:#000;");
text.appendChild(document.createTextNode(dojo.math.round(parseFloat(this.properties.axes.y.range.max), 2)));
this.axisGroup.appendChild(text);
dojo.svg.g.resume();
}, init:function () {
if (!this.properties.width || !this.properties.height) {
var box = dojo.html.getContentBox(this.domNode);
if (!this.properties.width) {
this.properties.width = (box.width < 32) ? this.properties.defaultWidth : box.width;
}
if (!this.properties.height) {
this.properties.height = (box.height < 32) ? this.properties.defaultHeight : box.height;
}
}
this.drawVectorNode();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -