juijs-chart
Version:
SVG-based JUI chart that can be used in the browser and Node.js. Support many types of charts. (Dashboard, Map, Topology, Full 3D)
139 lines (111 loc) • 5.26 kB
JavaScript
import jui from '../main.js';
import DonutBrush from './donut.js';
jui.use(DonutBrush);
export default {
name: 'chart.brush.fullgauge',
extend: 'chart.brush.donut',
component: function () {
const math = jui.include('util.math');
const FullGaugeBrush = function() {
var group, w, centerX, centerY, outerRadius, innerRadius, textScale;
this.createText = function(value, index, centerX, centerY, textScale) {
var g = this.svg.group().translate(centerX, centerY),
size = this.chart.theme('gaugeFontSize');
g.append(this.chart.text({
'text-anchor' : 'middle',
'font-size' : size,
'font-weight' : this.chart.theme('gaugeFontWeight'),
'fill' : this.color(index),
y: size / 3
}, this.format(value, index)).scale(textScale));
return g;
}
this.createTitle = function(title, index, centerX, centerY, dx, dy, textScale) {
var g = this.svg.group().translate(centerX + dx, centerY + dy),
anchor = (dx == 0) ? 'middle' : ((dx < 0) ? 'end' : 'start'),
size = this.chart.theme('gaugeTitleFontSize');
g.append(this.chart.text({
'text-anchor' : anchor,
'font-size' : size,
'font-weight' : this.chart.theme('gaugeTitleFontWeight'),
fill : this.chart.theme('gaugeTitleFontColor'),
y: size / 3
}, title).scale(textScale));
return g;
}
this.drawUnit = function(index, data) {
var obj = this.axis.c(index),
value = this.getValue(data, 'value', 0),
title = this.getValue(data, 'title'),
max = this.getValue(data, 'max', 100),
min = this.getValue(data, 'min', 0);
var startAngle = this.brush.startAngle;
var endAngle = this.brush.endAngle;
if (endAngle >= 360) {
endAngle = 359.99999;
}
var rate = (value - min) / (max - min),
currentAngle = endAngle * rate;
if (currentAngle > endAngle) {
currentAngle = endAngle;
}
var width = obj.width,
height = obj.height,
x = obj.x,
y = obj.y;
// center
w = Math.min(width, height) / 2;
centerX = width / 2 + x;
centerY = height / 2 + y;
outerRadius = w - this.brush.size;
innerRadius = outerRadius - this.brush.size;
textScale = math.scaleValue(w, 40, 400, 1, 1.5);
// 심볼 타입에 따라 여백 각도 설정
var paddingAngle = (this.brush.symbol == 'butt') ? this.chart.theme('gaugePaddingAngle') : 0;
group.append(this.drawDonut(centerX, centerY, innerRadius, outerRadius, startAngle + currentAngle + paddingAngle, endAngle - currentAngle - paddingAngle*2, {
stroke: this.chart.theme('gaugeBackgroundColor'),
fill: 'transparent'
}));
group.append(this.drawDonut(centerX, centerY, innerRadius, outerRadius, startAngle, currentAngle, {
stroke: this.color(index),
'stroke-linecap': this.brush.symbol,
fill: 'transparent'
}));
if(this.brush.showText) {
group.append(this.createText(value, index, centerX, centerY - (outerRadius * 0.1), textScale));
}
if(title != '') {
group.append(this.createTitle(title, index, centerX, centerY - (outerRadius * 0.1), this.brush.titleX, this.brush.titleY, textScale));
}
return group;
}
this.draw = function() {
group = this.chart.svg.group();
this.eachData(function(data, i) {
this.drawUnit(i, data);
});
return group;
}
}
FullGaugeBrush.setup = function() {
return {
symbol: 'butt',
/** @cfg {Number} [size=30] Determines the stroke width of a gauge. */
size: 60,
/** @cfg {Number} [startAngle=0] Determines the start angle(as start point) of a gauge. */
startAngle: 0,
/** @cfg {Number} [endAngle=360] Determines the end angle(as draw point) of a gauge. */
endAngle: 360,
/** @cfg {Boolean} [showText=true] */
showText: true,
/** @cfg {Number} [titleX=0] */
titleX: 0,
/** @cfg {Number} [titleY=0] */
titleY: 0,
/** @cfg {Function} [format=null] */
format: null
};
}
return FullGaugeBrush;
}
}