jui.define("chart.brush.pyramid", [ "util.base" ], function(_) { /** * @class chart.brush.pie * @extends chart.brush.core */ var PyramidBrush = function() { function getCalculatedData(obj, targets) { var total = 0, list = []; for(var key in obj) { var index = _.inArray(key, targets); if(index == -1) continue; total += obj[key]; list.push({ key: key, value: obj[key], rate: 0, index: index }); } for(var i = 0; i < list.length; i++) { list[i].rate = list[i].value / total; } list.sort(function(a, b) { return b.value - a.value; }); return list; } this.createText = function(text, cx, cy, dist) { var l_size = this.chart.theme("pyramidTextLineSize"), f_size = this.chart.theme("pyramidTextFontSize"), x = cx + l_size, y = cy + ((dist > 0 && dist < l_size) ? cy - dist/2 : 0); var g = this.svg.group(); var l = this.svg.line({ stroke: this.chart.theme("pyramidTextLineColor"), "stroke-width": this.chart.theme("pyramidTextLineWidth"), x1: cx, y1: cy, x2: x, y2: y }); var t = this.chart.text({ "font-size": this.chart.theme("pyramidTextFontSize"), fill: this.chart.theme("pyramidTextFontColor"), x: x, y: y, dx: 3, dy: f_size / 3 }).text(text) g.append(l); g.append(t); return g; } this.draw = function() { var g = this.svg.group(), obj = (this.axis.data.length > 0) ? this.axis.data[0] : {}, data = getCalculatedData(obj, this.brush.target), area = this.axis.area(), dx = area.width / 2, dy = area.height; var startX = 0, endX = dx * 2, startRad = Math.atan2(dy, dx), distance = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2)), textY = 0, isReverse = this.brush.reverse; if(isReverse) dy = 0; for(var i = 0; i < data.length; i++) { var d = data[i], dist = d.rate * distance, sx = startX + (dist * Math.cos(startRad)), ex = endX - (dist * Math.cos(-startRad)), ty = dist * Math.sin(startRad), y = (isReverse) ? dy + ty : dy - ty; var poly = this.svg.polygon({ fill: this.color(i), "stroke-width": 0 }); this.addEvent(poly, 0, d.index); g.append(poly); // 라인 그리기 if(i > 0) { var width = this.chart.theme("pyramidLineWidth"); var line = this.svg.line({ stroke: this.chart.theme("pyramidLineColor"), "stroke-width": width, x1: startX - width/2, y1: dy, x2: endX + width/2, y2: dy }); line.translate(area.x, area.y); g.append(line); } // 텍스트 그리기 if(this.brush.showText) { var tx = (ex + endX) / 2, ty = (y + dy) / 2; var text = this.createText( _.typeCheck("function", this.brush.format) ? this.format(d.key, d.value, d.rate) : d.value, tx, ty, textY - ty); text.translate(area.x, area.y); g.append(text); textY = ty; } poly.point(startX, dy); poly.point(sx, y); poly.point(ex, y); poly.point(endX, dy); poly.translate(area.x, area.y); startX = sx; endX = ex; dy = y; } return g; } } PyramidBrush.setup = function() { return { /** @cfg {Boolean} [clip=false] If the brush is drawn outside of the chart, cut the area. */ clip: false, /** @cfg {Boolean} [showText=false] Set the text appear. */ showText: false, /** @cfg {Function} [format=null] Returns a value from the format callback function of a defined option. */ format: null, /** @cfg {Boolean} [reverse=false] */ reverse: false } } return PyramidBrush; }, "chart.brush.core");