155 lines
4.4 KiB
Java
155 lines
4.4 KiB
Java
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
|
|
|
|
/**
|
|
* @fileOverview Venn Diagram
|
|
* @author leungwensen@gmail.com
|
|
*/
|
|
var GeomBase = require('./base');
|
|
|
|
var Util = require('../util');
|
|
|
|
var _require = require('venn.js'),
|
|
venn = _require.venn,
|
|
scaleSolution = _require.scaleSolution,
|
|
circlePath = _require.circlePath,
|
|
intersectionAreaPath = _require.intersectionAreaPath,
|
|
computeTextCentres = _require.computeTextCentres;
|
|
|
|
require('./shape/venn');
|
|
|
|
var Venn = /*#__PURE__*/function (_GeomBase) {
|
|
_inheritsLoose(Venn, _GeomBase);
|
|
|
|
function Venn() {
|
|
return _GeomBase.apply(this, arguments) || this;
|
|
}
|
|
|
|
var _proto = Venn.prototype;
|
|
|
|
/**
|
|
* get default configuration
|
|
* @protected
|
|
* @return {Object} configuration
|
|
*/
|
|
_proto.getDefaultCfg = function getDefaultCfg() {
|
|
var cfg = _GeomBase.prototype.getDefaultCfg.call(this);
|
|
|
|
cfg.type = 'venn';
|
|
cfg.shapeType = 'venn';
|
|
cfg.generatePoints = false; // super.draw(data, container, shapeFactory, index);
|
|
|
|
return cfg;
|
|
};
|
|
|
|
_proto._getAttrValues = function _getAttrValues(attr, record) {
|
|
if (attr.type === 'position') {
|
|
return [record.x, record.y];
|
|
}
|
|
|
|
return _GeomBase.prototype._getAttrValues.call(this, attr, record);
|
|
};
|
|
|
|
_proto.sets = function sets(field) {
|
|
this.set('setsField', field);
|
|
return this;
|
|
};
|
|
|
|
_proto._initAttrs = function _initAttrs() {
|
|
var self = this;
|
|
|
|
_GeomBase.prototype._initAttrs.call(this);
|
|
|
|
var attrOptions = self.get('attrOptions');
|
|
var setsField = self.get('setsField') || 'sets';
|
|
var data = self.get('data');
|
|
var sizeField = attrOptions.size ? attrOptions.size.field : 'size'; // prepare data
|
|
|
|
data.forEach(function (row) {
|
|
row.sets = row[setsField];
|
|
row._sets = row[setsField].join('&');
|
|
row.size = row[sizeField];
|
|
});
|
|
var solution = venn(data); // scaling
|
|
|
|
var coord = self.get('coord');
|
|
var xRange = [Math.min(coord.x.end, coord.x.start), Math.max(coord.x.end, coord.x.start)];
|
|
var yRange = [Math.min(coord.y.end, coord.y.start), Math.max(coord.y.end, coord.y.start)];
|
|
var width = xRange[1] - xRange[0];
|
|
var height = yRange[1] - yRange[0];
|
|
var styleOptions = self.get('styleOptions');
|
|
var padding = styleOptions && Util.isObject(styleOptions.style) ? styleOptions.style.padding : 0;
|
|
|
|
if (!Util.isFinite(padding)) {
|
|
padding = 0;
|
|
}
|
|
|
|
var circles = scaleSolution(solution, width, height, padding);
|
|
var textCenters = computeTextCentres(circles, data);
|
|
data.forEach(function (row) {
|
|
var sets = row.sets;
|
|
var id = sets.join(',');
|
|
row.id = id;
|
|
|
|
if (sets.length === 1) {
|
|
var circle = circles[id];
|
|
row.path = circlePath(circle.x, circle.y, circle.radius);
|
|
Util.assign(row, circle);
|
|
} else {
|
|
var setCircles = sets.map(function (set) {
|
|
return circles[set];
|
|
});
|
|
var path = intersectionAreaPath(setCircles);
|
|
|
|
if (!/[zZ]$/.test(path)) {
|
|
path += 'Z';
|
|
}
|
|
|
|
row.path = path;
|
|
var center = textCenters[id] || {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
Util.assign(row, center);
|
|
}
|
|
}); // x, y scales
|
|
// self.position('x*y');
|
|
// self.scale('x', { type: 'identity' });
|
|
// self.scale('y', { type: 'identity' });
|
|
} // createShapePointsCfg(obj) {
|
|
// const xScale = this.getXScale();
|
|
// const yScale = this.getYScale();
|
|
// return {
|
|
// x: obj[xScale.field],
|
|
// y: obj[yScale.field],
|
|
// y0: yScale ? yScale.scale(this.getYMinValue()) : undefined
|
|
// };
|
|
// }
|
|
// paint() {
|
|
// super.paint();
|
|
// const self = this;
|
|
// const dataArray = self.get('dataArray');
|
|
// const shapeContainer = self.get('shapeContainer');
|
|
// // add labels
|
|
// dataArray.forEach(row => {
|
|
// const cfg = self.getDrawCfg(row[0]);
|
|
// const origin = cfg.origin._origin;
|
|
// shapeContainer.addShape('text', {
|
|
// attrs: Util.mix({}, {
|
|
// x: origin.x,
|
|
// y: origin.y,
|
|
// text: origin.label || '',
|
|
// fontSize: 18,
|
|
// fill: cfg.shape === 'hollow' ? cfg.color : '#666',
|
|
// textAlign: 'center',
|
|
// textBaseline: 'middle'
|
|
// }, cfg.style ? cfg.style.textStyle : {})
|
|
// });
|
|
// });
|
|
// }
|
|
;
|
|
|
|
return Venn;
|
|
}(GeomBase);
|
|
|
|
GeomBase.Venn = Venn;
|
|
module.exports = Venn; |