chartx
Version:
Data Visualization Chart Library
864 lines (843 loc) • 25.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _canvax = _interopRequireDefault(require("canvax"));
var _index = _interopRequireDefault(require("../index"));
var _group = _interopRequireDefault(require("./group"));
var _dataSection = _interopRequireDefault(require("../../../core/dataSection"));
var _tools = require("../../../utils/tools");
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
var _ = _canvax.default._,
event = _canvax.default.event;
var Text = _canvax.default.Display.Text;
var Circle = _canvax.default.Shapes.Circle;
var Line = _canvax.default.Shapes.Line;
var Rect = _canvax.default.Shapes.Rect;
var Sector = _canvax.default.Shapes.Sector;
var PlanetGraphs = /*#__PURE__*/function (_GraphsBase) {
function PlanetGraphs(opt, app) {
var _this;
(0, _classCallCheck2.default)(this, PlanetGraphs);
_this = _callSuper(this, PlanetGraphs, [opt, app]);
_this.type = "planet";
_this.groupDataFrames = [];
_this.groupField = null;
_this._ringGroups = []; //groupField对应的 group 对象
//planet自己得grid,不用polar的grid
_this.grid = {
rings: {
_section: []
}
};
_.extend(true, _this, (0, _tools.getDefaultProps)(PlanetGraphs.defaultProps()), opt);
if (_this.center.radius == 0 || !_this.center.enabled) {
_this.center.radius = 0;
_this.center.margin = 0;
_this.center.enabled = false;
}
;
_this.__scanIngCurOration = 0;
_this.init();
return _this;
}
(0, _inherits2.default)(PlanetGraphs, _GraphsBase);
return (0, _createClass2.default)(PlanetGraphs, [{
key: "init",
value: function init() {
this.gridSp = new _canvax.default.Display.Sprite({
id: "gridSp"
});
this.groupSp = new _canvax.default.Display.Sprite({
id: "groupSp"
});
this.scanSp = new _canvax.default.Display.Sprite({
id: "scanSp"
});
this.centerSp = new _canvax.default.Display.Sprite({
id: "centerSp"
});
this.sprite.addChild(this.gridSp);
this.sprite.addChild(this.groupSp);
this.sprite.addChild(this.scanSp);
this.sprite.addChild(this.centerSp);
}
}, {
key: "draw",
value: function draw(opt) {
!opt && (opt = {});
_.extend(true, this, opt);
this._dataGroupHandle();
this._drawGroups();
this._drawBack();
this._drawBewrite();
this._drawCenter();
this._drawScan();
this.fire("complete");
}
}, {
key: "_getMaxR",
value: function _getMaxR() {
var _circleMaxR;
if (this.graphs && this.graphs.group && this.graphs.group.circle) {
_circleMaxR = this.graphs.group.circle.maxRadius;
}
if (_circleMaxR == undefined) {
_circleMaxR = 30;
}
;
return _circleMaxR;
}
}, {
key: "_drawGroups",
value: function _drawGroups() {
var me = this;
var groupRStart = this.center.radius + this.center.margin;
var maxRadius = me.app.getComponent({
name: 'coord'
}).getMaxDisToViewOfOrigin() - me.center.radius - me.center.margin;
var _circleMaxR = this._getMaxR();
_.each(this.groupDataFrames, function (df, i) {
var toR = groupRStart + maxRadius * (df.length / me.dataFrame.length);
var _g = new _group.default(_.extend(true, {
iGroup: i,
groupLen: me.groupDataFrames.length,
rRange: {
start: groupRStart,
to: toR
},
width: me.width - _circleMaxR * 2,
height: me.height - _circleMaxR * 2,
selectInds: me.selectInds
}, me._opt), df, me);
groupRStart = _g.rRange.to;
me._ringGroups.push(_g);
me.grid.rings._section.push({
radius: _g.rRange.to
});
});
_.each(me._ringGroups, function (_g) {
me.sprite.addChild(_g.sprite);
});
}
}, {
key: "_drawCenter",
value: function _drawCenter() {
var me = this;
if (this.center.enabled) {
//绘制中心实心圆
this._center = new Circle({
hoverClone: false,
context: {
x: this.origin.x,
y: this.origin.y,
fillStyle: this.center.fillStyle,
r: this.center.radius,
cursor: this.center.cursor
}
});
//绘制实心圆上面的文案
this._centerTxt = new Text(this.center.text, {
context: {
x: this.origin.x,
y: this.origin.y,
fontSize: this.center.fontSize,
textAlign: "center",
textBaseline: "middle",
fillStyle: this.center.fontColor
}
});
//给圆点添加事件
this._center.on(event.types.get(), function (e) {
e.eventInfo = {
title: me.center.text,
trigger: 'this.center',
//me.center,
nodes: [me.center]
};
if (me.center['onclick']) {
if (e.type == 'mousedown') {
me._center.context.r += 2;
}
if (e.type == 'mouseup') {
me._center.context.r -= 2;
}
}
;
me.app.fire(e.type, e);
});
this.centerSp.addChild(this._center);
this.centerSp.addChild(this._centerTxt);
}
}
}, {
key: "_drawBack",
value: function _drawBack() {
var me = this;
var _coord = this.app.getComponent({
name: 'coord'
});
if (me.grid.rings._section.length == 1) {
//如果只有一个,那么就强制添加到3个
var _diffR = (me.grid.rings._section[0].radius - me.center.radius) / me.grid.rings.count;
me.grid.rings._section = [];
for (var i = 0; i < me.grid.rings.count; i++) {
me.grid.rings._section.push({
radius: me.center.radius + _diffR * (i + 1)
});
}
} else {
me.grid.rings.count = me.grid.rings._section.length;
}
;
for (var _i = me.grid.rings._section.length - 1; _i >= 0; _i--) {
var _scale = me.grid.rings._section[_i];
me.gridSp.addChild(new Circle({
context: {
x: _coord.origin.x,
y: _coord.origin.y,
r: _scale.radius,
lineWidth: me._getBackProp(me.grid.rings.lineWidth, _i),
strokeStyle: me._getBackProp(me.grid.rings.strokeStyle, _i),
fillStyle: me._getBackProp(me.grid.rings.fillStyle, _i)
}
}));
}
;
//如果back.rays.count非0, 则绘制从圆心出发的射线
if (me.grid.rays.count > 1) {
var cx = _coord.origin.x;
var cy = _coord.origin.y;
var itemAng = 360 / me.grid.rays.count;
var _r = _coord.getMaxDisToViewOfOrigin(); //Math.max( me.w, me.h );
if (me.grid.rings._section.length) {
_r = me.grid.rings._section.slice(-1)[0].radius;
}
for (var _i2 = 0, l = me.grid.rays.count; _i2 < l; _i2++) {
var radian = itemAng * _i2 / 180 * Math.PI;
var tx = cx + _r * Math.cos(radian);
var ty = cy + _r * Math.sin(radian);
me.gridSp.addChild(new Line({
context: {
start: {
x: cx,
y: cy
},
end: {
x: tx,
y: ty
},
lineWidth: me._getBackProp(me.grid.rays.lineWidth, _i2),
strokeStyle: me._getBackProp(me.grid.rays.strokeStyle, _i2),
globalAlpha: me.grid.rays.globalAlpha
}
}));
}
;
}
;
var _clipRect = new Rect({
name: "clipRect",
context: {
x: _coord.origin.x - me.app.width / 2,
y: _coord.origin.y - me.height / 2,
width: me.app.width,
height: me.height
}
});
me.gridSp.clipTo(_clipRect);
//TODO:理论上下面这句应该可以神略了才行
me.sprite.addChild(_clipRect);
}
}, {
key: "_getBackProp",
value: function _getBackProp(p, i) {
//let iGroup = i;
var res = null;
if (_.isFunction(p)) {
res = p.apply(this, [{
//iGroup : iGroup,
scaleInd: i,
count: this.grid.rings._section.length,
groups: this._ringGroups,
graphs: this
}]);
}
;
if (_.isString(p) || _.isNumber(p)) {
res = p;
}
;
if (_.isArray(p)) {
res = p[i];
}
;
return res;
}
}, {
key: "_drawBewrite",
value: function _drawBewrite() {
var me = this;
//如果开启了描述中线
if (me.bewrite.enabled) {
var _draw = function _draw(direction, _txt, _powerTxt, _weakTxt) {
//先绘制右边的
_powerTxt.context.x = direction * me.center.radius + direction * 20;
_bewriteSp.addChild(_powerTxt);
_bewriteSp.addChild(new Line({
context: {
lineType: 'dashed',
start: {
x: _powerTxt.context.x,
y: 0
},
end: {
x: direction * (_txt ? _graphR / 2 - _txtWidth / 2 : _graphR),
y: 0
},
lineWidth: 1,
strokeStyle: "#ccc"
}
}));
if (_txt) {
_txt.context.x = direction * (_graphR / 2);
_bewriteSp.addChild(_txt);
_bewriteSp.addChild(new Line({
context: {
lineType: 'dashed',
start: {
x: direction * (_graphR / 2 + _txtWidth / 2),
y: 0
},
end: {
x: direction * _graphR,
y: 0
},
lineWidth: 1,
strokeStyle: "#ccc"
}
}));
}
;
_weakTxt.context.x = direction * _graphR;
_bewriteSp.addChild(_weakTxt);
};
var _txt, _txtWidth, _powerTxt, _weakTxt;
if (me.bewrite.text) {
_txt = new _canvax.default.Display.Text(me.bewrite.text, {
context: {
fillStyle: me.bewrite.fontColor,
fontSize: me.bewrite.fontSize,
textBaseline: "middle",
textAlign: "center"
}
});
_txtWidth = _txt.getTextWidth();
}
;
_powerTxt = new _canvax.default.Display.Text("强", {
context: {
fillStyle: me.bewrite.fontColor,
fontSize: me.bewrite.fontSize,
textBaseline: "middle",
textAlign: "center"
}
});
_weakTxt = new _canvax.default.Display.Text("弱", {
context: {
fillStyle: me.bewrite.fontColor,
fontSize: me.bewrite.fontSize,
textBaseline: "middle",
textAlign: "center"
}
});
var _bewriteSp = new _canvax.default.Display.Sprite({
context: {
x: this.origin.x,
y: this.origin.y
}
});
me.sprite.addChild(_bewriteSp);
var _graphR = me.width / 2;
_draw(1, _txt.clone(), _powerTxt.clone(), _weakTxt.clone());
_draw(-1, _txt.clone(), _powerTxt.clone(), _weakTxt.clone());
}
;
}
}, {
key: "scan",
value: function scan() {
var me = this;
this._scanAnim && this._scanAnim.stop();
var _scanSp = me._getScanSp();
//开始动画
if (me.__scanIngCurOration == 360) {
_scanSp.context.rotation = 0;
}
;
me._scanAnim = _scanSp.animate({
rotation: 360,
globalAlpha: 1
}, {
duration: 1000 * ((360 - me.__scanIngCurOration) / 360),
onUpdate: function onUpdate(e) {
me.__scanIngCurOration = e.rotation;
},
onComplete: function onComplete() {
_scanSp.context.rotation = 0;
me._scanAnim = _scanSp.animate({
rotation: 360
}, {
duration: 1000,
repeat: 1000,
//一般repeat不到1000
onUpdate: function onUpdate(e) {
me.__scanIngCurOration = e.rotation;
}
});
}
});
}
}, {
key: "_drawScan",
value: function _drawScan(callback) {
var me = this;
if (me.scan.enabled) {
var _scanSp = me._getScanSp();
//开始动画
if (me.__scanIngCurOration == 360) {
_scanSp.context.rotation = 0;
}
;
me._scanAnim && me._scanAnim.stop();
me._scanAnim = _scanSp.animate({
rotation: 360,
globalAlpha: 1
}, {
duration: 1000 * ((360 - me.__scanIngCurOration) / 360),
onUpdate: function onUpdate(e) {
me.__scanIngCurOration = e.rotation;
},
onComplete: function onComplete() {
_scanSp.context.rotation = 0;
me._scanAnim = _scanSp.animate({
rotation: 360
}, {
duration: 1000,
repeat: me.scan.repeat - 2,
onUpdate: function onUpdate(e) {
me.__scanIngCurOration = e.rotation;
},
onComplete: function onComplete() {
_scanSp.context.rotation = 0;
me._scanAnim = _scanSp.animate({
rotation: 360,
globalAlpha: 0
}, {
duration: 1000,
onUpdate: function onUpdate(e) {
me.__scanIngCurOration = e.rotation;
},
onComplete: function onComplete() {
_scanSp.destroy();
me.__scanSp = null;
delete me.__scanSp;
me.__scanIngCurOration = 0;
callback && callback();
}
});
}
});
}
});
}
;
}
}, {
key: "_getScanSp",
value: function _getScanSp() {
var me = this;
//先准备scan元素
var _scanSp = me.__scanSp;
if (!_scanSp) {
_scanSp = new _canvax.default.Display.Sprite({
context: {
x: this.origin.x,
y: this.origin.y,
globalAlpha: 0,
rotation: me.__scanIngCurOration
}
});
me.scanSp.addChild(_scanSp);
me.__scanSp = _scanSp;
var r = me.scan.r || me.height / 2 - 10;
var fillStyle = me.scan.fillStyle || me.center.fillStyle;
//如果开启了扫描效果
var count = me.scan.angle;
for (var i = 0, l = count; i < l; i++) {
var node = new Sector({
context: {
r: r,
fillStyle: fillStyle,
clockwise: true,
startAngle: 360 - i,
endAngle: 359 - i,
globalAlpha: me.scan.alpha - me.scan.alpha / count * i
}
});
_scanSp.addChild(node);
}
;
var _line = new Line({
context: {
end: {
x: r,
y: 0
},
lineWidth: 1,
strokeStyle: fillStyle
}
});
_scanSp.addChild(_line);
}
;
//准备scan元素完毕
return _scanSp;
}
}, {
key: "_dataGroupHandle",
value: function _dataGroupHandle() {
var groupFieldInd = _.indexOf(this.dataFrame.fields, this.groupField);
if (groupFieldInd >= 0) {
//有分组字段,就还要对dataFrame中的数据分下组,然后给到 groupDataFrames
var titles = this.dataFrame.org[0];
var _dmap = {}; //以分组的字段值做为key
_.each(this.dataFrame.org, function (row, i) {
if (i) {
//从i==1 行开始,因为第一行是titles
if (!_dmap[row[groupFieldInd]]) {
//如果没有记录,先创建
_dmap[row[groupFieldInd]] = [_.clone(titles)];
}
;
_dmap[row[groupFieldInd]].push(row);
}
});
for (var r in _dmap) {
this.groupDataFrames.push((0, _dataSection.default)(_dmap[r]));
}
;
} else {
//如果分组字段不存在,则认为数据不需要分组,直接全部作为 group 的一个子集合
this.groupDataFrames.push(this.dataFrame);
}
;
}
//graphs方法
}, {
key: "show",
value: function show(field, trigger) {
this.getAgreeNodeData(trigger, function (data) {
data.nodeElement && (data.nodeElement.context.visible = true);
data.labelElement && (data.labelElement.context.visible = true);
});
}
}, {
key: "hide",
value: function hide(field, trigger) {
this.getAgreeNodeData(trigger, function (data) {
data.nodeElement && (data.nodeElement.context.visible = false);
data.labelElement && (data.labelElement.context.visible = false);
});
}
}, {
key: "getAgreeNodeData",
value: function getAgreeNodeData(trigger, callback) {
_.each(this._ringGroups, function (_g) {
_.each(_g._rings, function (ring) {
_.each(ring.planets, function (data) {
var rowData = data.rowData;
if (trigger.params.name == rowData[trigger.params.field]) {
//这个数据符合
//data.nodeElement.context.visible = false;
//data.labelElement.context.visible = false;
callback && callback(data);
}
;
});
});
});
}
//获取所有有效的在布局中的nodeData
}, {
key: "getLayoutNodes",
value: function getLayoutNodes() {
var nodes = [];
_.each(this._ringGroups, function (rg) {
_.each(rg.planets, function (node) {
if (node.pit) {
nodes.push(node);
}
;
});
});
return nodes;
}
//获取所有无效的在不在布局的nodeData
}, {
key: "getInvalidNodes",
value: function getInvalidNodes() {
var nodes = [];
_.each(this._ringGroups, function (rg) {
_.each(rg.planets, function (node) {
if (!node.pit) {
nodes.push(node);
}
;
});
});
return nodes;
}
//ind 对应源数据中的index
}, {
key: "selectAt",
value: function selectAt(ind) {
var me = this;
_.each(me._ringGroups, function (_g) {
_g.selectAt(ind);
});
}
//selectAll
}, {
key: "selectAll",
value: function selectAll() {
var me = this;
_.each(me.dataFrame.getFieldData("__index__"), function (_ind) {
me.selectAt(_ind);
});
}
//ind 对应源数据中的index
}, {
key: "unselectAt",
value: function unselectAt(ind) {
var me = this;
_.each(me._ringGroups, function (_g) {
_g.unselectAt(ind);
});
}
//unselectAll
}, {
key: "unselectAll",
value: function unselectAll() {
var me = this;
_.each(me.dataFrame.getFieldData("__index__"), function (_ind) {
me.unselectAt(_ind);
});
}
//获取所有的节点数据
}, {
key: "getSelectedNodes",
value: function getSelectedNodes() {
var arr = [];
_.each(this._ringGroups, function (_g) {
arr = arr.concat(_g.getSelectedNodes());
});
return arr;
}
//获取所有的节点数据对应的原始数据行
}, {
key: "getSelectedRowList",
value: function getSelectedRowList() {
var arr = [];
_.each(this._ringGroups, function (_g) {
var rows = [];
_.each(_g.getSelectedNodes(), function (nodeData) {
rows.push(nodeData.rowData);
});
arr = arr.concat(rows);
});
return arr;
}
}, {
key: "getNodesAt",
value: function getNodesAt() {}
}, {
key: "resetData",
value: function resetData(dataFrame) {
this.clean();
this.dataFrame = dataFrame;
this._dataGroupHandle();
this._drawGroups();
this._drawScan();
}
}, {
key: "clean",
value: function clean() {
var me = this;
me.groupDataFrames = [];
_.each(me._ringGroups, function (_g) {
_g.sprite.destroy();
});
me._ringGroups = [];
}
}], [{
key: "defaultProps",
value: function defaultProps() {
return {
field: {
detail: '字段设置',
default: null
},
center: {
detail: '中心点设置',
propertys: {
enabled: {
detail: '是否显示中心',
default: true
},
text: {
detail: '中心区域文本',
default: 'center'
},
radius: {
detail: '中心圆半径',
default: 30
},
fillStyle: {
detail: '中心背景色',
default: '#70629e'
},
fontSize: {
detail: '中心字体大小',
default: 15
},
fontColor: {
detail: '中心字体颜色',
default: '#ffffff'
},
margin: {
detail: '中区区域和外围可绘图区域距离',
default: 20
},
cursor: {
detail: '中心节点的鼠标手势',
default: 'default'
}
}
},
selectInds: {
detail: '选中的数据索引',
default: []
},
grid: {
detail: '星系图自己的grid',
propertys: {
rings: {
detail: '环配置',
propertys: {
fillStyle: {
detail: '背景色',
default: null
},
strokeStyle: {
detail: '环线色',
default: null
},
lineWidth: {
detail: '环线宽',
default: 1
},
count: {
detail: '分几环',
default: 3
}
}
},
rays: {
detail: '射线配置',
propertys: {
count: {
detail: '射线数量',
default: 0
},
globalAlpha: {
detail: '线透明度',
default: 0.4
},
strokeStyle: {
detail: '线色',
default: '#10519D'
},
lineWidth: {
detail: '线宽',
default: 1
}
}
}
}
},
bewrite: {
detail: 'planet的趋势描述',
propertys: {
enabled: {
detail: '是否开启趋势描述',
default: false
},
text: {
detail: '描述文本',
default: null
},
fontColor: {
detail: 'fontColor',
default: '#999'
},
fontSize: {
detail: 'fontSize',
default: 12
}
}
},
scan: {
detail: '扫描效果',
propertys: {
enabled: {
detail: '是否开启扫描效果',
default: false
},
fillStyle: {
detail: '扫描效果颜色',
default: null //默认取 me._graphs.center.fillStyle
},
alpha: {
detail: '起始透明度',
default: 0.6
},
angle: {
detail: '扫描效果的覆盖角度',
default: 90
},
r: {
detail: '扫描效果覆盖的半径',
default: null
},
repeat: {
detail: '扫描次数',
default: 3
}
}
},
_props: [_group.default]
};
}
}]);
}(_index.default);
_index.default.registerComponent(PlanetGraphs, 'graphs', 'planet');
var _default = exports.default = PlanetGraphs;