@dfsj/echarts
Version:
专业的水文曲线组件或构造函数以及通用的echart二次封装图表
217 lines (213 loc) • 7.95 kB
JavaScript
/**
*
* @dfsj/echarts: 专业的水文曲线组件或构造函数以及通用的echart二次封装图表
* 版本: v3.7.0-alpha.5
* 作者:yangbo <1747837358@qq.com>
* 日期:2025-11-21 13:30:34
*
*
*/
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
import def from './default.js';
import { min, max, to, numeralFormat, simpleMinMaxIndex, minimum, maximum } from '../../utils/tools.js';
import { renderAltitudeMark, toIndex } from '../../utils/render.js';
import config, { TYPE_SYMBOL } from '../../config.js';
import { createLinearInterpolator } from 'commons-math-interpolation/Linear';
import assign from '../../utils/assign.js';
import units from '../../utils/units.js';
import { ref } from 'vue';
import get from 'lodash-es/get';
import { useECharts } from '../../hooks/useECharts.js';
import { useToolTip } from '../../view/useToolTip.js';
import { useTable } from '../../view/useTable.js';
function useCapacity(chartRef) {
var _useECharts = useECharts(chartRef),
setOptions = _useECharts.setOptions,
echarts = _useECharts.echarts,
getInstance = _useECharts.getInstance,
container = _useECharts.container;
var visible = ref(false);
var _useToolTip = useToolTip(container),
offset = _useToolTip.offset,
content = _useToolTip.content,
openToolTip = _useToolTip.open,
closeToolTip = _useToolTip.close;
var _useTable = useTable(),
openTable = _useTable.open,
closeTable = _useTable.close,
props = _useTable.props,
toggleTable = _useTable.toggleTable;
props.container = container;
var assemble = function assemble(value, options) {
var optioned = assign({}, def, options);
var chart = getInstance();
console.log('chart', chart);
if (value != null) {
var _value$points, _value$indices, _optioned$series;
props.value = value;
props.chart = chart;
optioned.dataset.source = value.source;
optioned.xAxis[1].show = value.dimensions.length > 2;
optioned.xAxis[0].name = value.dimensions[1];
optioned.series = value.dimensions.filter(function (e, i) {
return i > 0;
}).map(function (e, i) {
return assign({
name: e
}, optioned.series[i]);
});
if ((_value$points = value.points) !== null && _value$points !== void 0 && _value$points.length) {
var lft = min(value.source, 1);
var rgt = max(value.source, 1);
var top = max(value.source, 0);
var bom = min(value.source, 0);
var sv = (top - bom) / 1000;
var sh = (rgt - lft) / 1000;
var start = (top - bom) / 3 * 2;
var counter = 0;
var current = value.points.find(function (e) {
return e.type === 'current';
});
optioned.series.push(assign({
renderItem: function renderItem(params, api) {
return renderAltitudeMark(params, api, current && current.altitude);
},
data: value.points.slice().sort(function (a, b) {
return b.altitude - a.altitude;
}).map(function (e) {
var symbol = e.symbol || TYPE_SYMBOL[e.type];
var x1 = symbol ? lft : rgt;
var y1 = e.altitude;
var x2 = x1 - sh * 60;
var y2 = bom + (start - counter * sv * 70);
var x3 = x2 - sh * 20;
var y3 = y2;
if (symbol == null) counter++;
return {
value: [x1, y1, x2, y2, x3, y3, e.label || e.name, symbol, e.level]
};
})
}, optioned.$mark));
}
var indices = (_value$indices = value.indices) === null || _value$indices === void 0 ? void 0 : _value$indices.map(function (e) {
return toIndex(e);
});
if (indices !== null && indices !== void 0 && indices.length) (_optioned$series = optioned.series).push.apply(_optioned$series, _toConsumableArray(indices));
optioned.legend.data = optioned.series.map(function (e) {
return {
name: e.name,
nameStyle: {
color: e.color
}
};
});
optioned.legend.selected = optioned.series.reduce(function (p, v) {
return p[v.name] = v.selected != null ? v.selected : true, p;
}, {});
optioned.toolbox.feature.myTabulation = {
onclick: function onclick() {
props.visible = !props.visible;
console.log('打开', props);
props.visible ? openTable() : closeTable();
},
icon: config.icon.tabulation,
title: '表格'
};
console.log('container', container);
try {
var grid = optioned.grid;
var stage = value.source.map(function (d) {
return d[0];
});
var lines = value.dimensions.map(function (e, i) {
return !i ? function (v) {
return v;
} : createLinearInterpolator(stage, value.source.map(function (d) {
return d[i];
}));
});
if (!container.value) return;
var el = container.value;
console.log({
el: el
});
el.onclick = function () {
console.log('---');
};
el.onmouseout = function () {
visible.value = false;
closeToolTip();
};
el.onmousemove = function (_ref) {
var offsetY = _ref.offsetY,
offsetX = _ref.offsetX;
var width = chart.getWidth();
var height = chart.getHeight();
visible.value = offsetX >= grid.left && offsetX <= width - grid.right && offsetY >= grid.top && offsetY <= height - grid.bottom;
if (visible.value) {
openToolTip();
offset.x = offsetX + 10;
offset.y = offsetY + 10;
if (offset.x > width - 180) offset.x -= 180;
if (offset.y > height - 80) offset.y -= 80;
var coords = chart.convertFromPixel({
seriesIndex: 0
}, [0, offsetY]);
var fields = value.dimensions.map(function (e, i) {
var color = i && get(optioned.series[i - 1], 'lineStyle.color');
return "<li>\n <span class=\"mark\" style=\"background: ".concat(color, "\"></span>\n <i>").concat(e, "</i>\n <i>").concat(to(lines[i](+coords[1]), '0.000'), "</i>\n </li>");
}).join('');
content.value = "<fieldset>".concat(fields, "</fieldset>");
} else {
closeToolTip();
}
};
} catch (e) {}
}
console.log('container', container);
return optioned;
};
var transform = function transform(data) {
if (data != null) {
var _maximum = data.source.reduce(function (p, v) {
return v[1] > p ? v[1] : p;
}, 0);
var unit = units.find(function (e) {
return _maximum >= e.value;
});
if ((unit === null || unit === void 0 ? void 0 : unit.value) !== 0) {
data.source.forEach(function (e) {
return e[1] = numeralFormat(e[1] / unit.value, '0.000');
});
data.unit = unit;
data.dimensions = ['水位(m)', "\u6C34\u4F4D-\u5E93\u5BB9\uFF08".concat(unit.symbol, "\uFF09"), '水位-面积(km²)'];
}
}
};
var createOptions = function createOptions(data) {
if (data != null) {
var cap = simpleMinMaxIndex(data);
return {
yAxis: [{
min: function min(v) {
return minimum(v, cap);
},
max: function max(v) {
return maximum(v, cap);
}
}]
};
}
};
return {
setOptions: setOptions,
echarts: echarts,
getInstance: getInstance,
container: container,
assemble: assemble,
transform: transform,
createOptions: createOptions,
toggleTable: toggleTable
};
}
export { useCapacity };