UNPKG

@dfsj/echarts

Version:

专业的水文曲线组件或构造函数以及通用的echart二次封装图表

180 lines (176 loc) 6.94 kB
/** * * @dfsj/echarts: 专业的水文曲线组件或构造函数以及通用的echart二次封装图表 * 版本: v3.7.0-alpha.5 * 作者:yangbo <1747837358@qq.com> * 日期:2025-11-21 13:30:34 * * */ import { createLinearInterpolator } from 'commons-math-interpolation'; import get from 'lodash-es/get'; import { ref } from 'vue'; import assign from '../../utils/assign.js'; import { toIndex, renderAltitudeMark } from '../../utils/render.js'; import { min, max, to } from '../../utils/tools.js'; import config, { TYPE_SYMBOL } from '../../config.js'; import def from './default.js'; import { useECharts } from '../../hooks/useECharts.js'; import { useToolTip } from '../../view/useToolTip.js'; import { useTable } from '../../view/useTable.js'; function useStageflow(chartRef) { var _this = this; 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(), props = _useTable.props, toggleTable = _useTable.toggleTable; props.container = container; var assemble = function assemble(value, options) { var optioned = assign({}, def, options); var chart = getInstance(); if (value != null) { var _value$indices; props.value = value; props.chart = chart; optioned.dataset.source = value.source; var indices = (_value$indices = value.indices) === null || _value$indices === void 0 ? void 0 : _value$indices.map(function (e) { return toIndex(e); }); if (indices && indices.length) { indices.forEach(function (e) { return optioned.series.push(e); }); } 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; }, {}); if (value.points) { 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; console.log([x1, y1, x2, y2, x3, y3, e.label || e.name, symbol, e.level]); if (symbol == null) counter++; return { value: [x1, y1, x2, y2, x3, y3, e.label || e.name, symbol, e.level] }; }) }, optioned.$mark)); } optioned.toolbox.feature.myTabulation = { onclick: function onclick() { return _this.tools.tabulation = !_this.tools.tabulation; }, icon: config.icon.tabulation, title: '表格' }; try { var grid = optioned.grid; var dimensions = value.dimensions || ['水位(m)', '流量(m³/s)']; var stage = value.source.map(function (d) { return d[0]; }); var lines = 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; 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])), "</i>\n </li>"); }).join(''); content.value = "<fieldset>".concat(fields, "</fieldset>"); } else { closeToolTip(); } }; optioned.tooltip.formatter = function (p) { var _p$value, _p$value2; var symbol = p === null || p === void 0 || (_p$value = p.value) === null || _p$value === void 0 ? void 0 : _p$value[7]; var name = p === null || p === void 0 || (_p$value2 = p.value) === null || _p$value2 === void 0 ? void 0 : _p$value2[6]; if (symbol !== 'exception') return; return "<article class=\"tooltip\">\n <fieldset>\n <legend style=\"color: ".concat(config.markColor["4"], "\">").concat(name, "</legend> \n </fieldset>\n </article>"); }; } catch (e) {} } return optioned; }; var createOptions = function createOptions(data) { return {}; }; return { setOptions: setOptions, createOptions: createOptions, echarts: echarts, getInstance: getInstance, container: container, assemble: assemble, toggleTable: toggleTable }; } export { useStageflow };