/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ /** * AUTO-GENERATED FILE. DO NOT MODIFY. */ /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import { __extends } from "tslib"; // TODO Optimize on polar import * as colorUtil from 'zrender/lib/tool/color.js'; import SeriesData from '../../data/SeriesData.js'; import * as numberUtil from '../../util/number.js'; import * as graphic from '../../util/graphic.js'; import { toggleHoverEmphasis, setStatesStylesFromModel } from '../../util/states.js'; import * as markerHelper from './markerHelper.js'; import MarkerView from './MarkerView.js'; import { retrieve, mergeAll, map, curry, filter, extend, isString } from 'zrender/lib/core/util.js'; import { isCoordinateSystemType } from '../../coord/CoordinateSystem.js'; import MarkerModel from './MarkerModel.js'; import { makeInner } from '../../util/model.js'; import { getVisualFromData } from '../../visual/helper.js'; import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js'; import { getECData } from '../../util/innerStore.js'; import { parseDataValue } from '../../data/helper/dataValueHelper.js'; var inner = makeInner(); var markAreaTransform = function (seriesModel, coordSys, maModel, item) { // item may be null var item0 = item[0]; var item1 = item[1]; if (!item0 || !item1) { return; } var lt = markerHelper.dataTransform(seriesModel, item0); var rb = markerHelper.dataTransform(seriesModel, item1); // FIXME make sure lt is less than rb var ltCoord = lt.coord; var rbCoord = rb.coord; ltCoord[0] = retrieve(ltCoord[0], -Infinity); ltCoord[1] = retrieve(ltCoord[1], -Infinity); rbCoord[0] = retrieve(rbCoord[0], Infinity); rbCoord[1] = retrieve(rbCoord[1], Infinity); // Merge option into one var result = mergeAll([{}, lt, rb]); result.coord = [lt.coord, rb.coord]; result.x0 = lt.x; result.y0 = lt.y; result.x1 = rb.x; result.y1 = rb.y; return result; }; function isInfinity(val) { return !isNaN(val) && !isFinite(val); } // If a markArea has one dim function ifMarkAreaHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { var otherDimIndex = 1 - dimIndex; return isInfinity(fromCoord[otherDimIndex]) && isInfinity(toCoord[otherDimIndex]); } function markAreaFilter(coordSys, item) { var fromCoord = item.coord[0]; var toCoord = item.coord[1]; var item0 = { coord: fromCoord, x: item.x0, y: item.y0 }; var item1 = { coord: toCoord, x: item.x1, y: item.y1 }; if (isCoordinateSystemType(coordSys, 'cartesian2d')) { // In case // { // markArea: { // data: [{ yAxis: 2 }] // } // } if (fromCoord && toCoord && (ifMarkAreaHasOnlyDim(1, fromCoord, toCoord, coordSys) || ifMarkAreaHasOnlyDim(0, fromCoord, toCoord, coordSys))) { return true; } // Directly returning true may also do the work, // because markArea will not be shown automatically // when it's not included in coordinate system. // But filtering ahead can avoid keeping rendering markArea // when there are too many of them. return markerHelper.zoneFilter(coordSys, item0, item1); } return markerHelper.dataFilter(coordSys, item0) || markerHelper.dataFilter(coordSys, item1); } // dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0'] function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) { var coordSys = seriesModel.coordinateSystem; var itemModel = data.getItemModel(idx); var point; var xPx = numberUtil.parsePercent(itemModel.get(dims[0]), api.getWidth()); var yPx = numberUtil.parsePercent(itemModel.get(dims[1]), api.getHeight()); if (!isNaN(xPx) && !isNaN(yPx)) { point = [xPx, yPx]; } else { // Chart like bar may have there own marker positioning logic if (seriesModel.getMarkerPosition) { // Consider the case that user input the right-bottom point first // Pick the larger x and y as 'x1' and 'y1' var pointValue0 = data.getValues(['x0', 'y0'], idx); var pointValue1 = data.getValues(['x1', 'y1'], idx); var clampPointValue0 = coordSys.clampData(pointValue0); var clampPointValue1 = coordSys.clampData(pointValue1); var pointValue = []; if (dims[0] === 'x0') { pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue1[0] : pointValue0[0]; } else { pointValue[0] = clampPointValue0[0] > clampPointValue1[0] ? pointValue0[0] : pointValue1[0]; } if (dims[1] === 'y0') { pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue1[1] : pointValue0[1]; } else { pointValue[1] = clampPointValue0[1] > clampPointValue1[1] ? pointValue0[1] : pointValue1[1]; } // Use the getMarkerPosition point = seriesModel.getMarkerPosition(pointValue, dims, true); } else { var x = data.get(dims[0], idx); var y = data.get(dims[1], idx); var pt = [x, y]; coordSys.clampData && coordSys.clampData(pt, pt); point = coordSys.dataToPoint(pt, true); } if (isCoordinateSystemType(coordSys, 'cartesian2d')) { // TODO: TYPE ts@4.1 may still infer it as Axis instead of Axis2D. Not sure if it's a bug var xAxis = coordSys.getAxis('x'); var yAxis = coordSys.getAxis('y'); var x = data.get(dims[0], idx); var y = data.get(dims[1], idx); if (isInfinity(x)) { point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]); } else if (isInfinity(y)) { point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]); } } // Use x, y if has any if (!isNaN(xPx)) { point[0] = xPx; } if (!isNaN(yPx)) { point[1] = yPx; } } return point; } export var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']]; var MarkAreaView = /** @class */function (_super) { __extends(MarkAreaView, _super); function MarkAreaView() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.type = MarkAreaView.type; return _this; } MarkAreaView.prototype.updateTransform = function (markAreaModel, ecModel, api) { ecModel.eachSeries(function (seriesModel) { var maModel = MarkerModel.getMarkerModelFromSeries(seriesModel, 'markArea'); if (maModel) { var areaData_1 = maModel.getData(); areaData_1.each(function (idx) { var points = map(dimPermutations, function (dim) { return getSingleMarkerEndPoint(areaData_1, idx, dim, seriesModel, api); }); // Layout areaData_1.setItemLayout(idx, points); var el = areaData_1.getItemGraphicEl(idx); el.setShape('points', points); }); } }, this); }; MarkAreaView.prototype.renderSeries = function (seriesModel, maModel, ecModel, api) { var coordSys = seriesModel.coordinateSystem; var seriesId = seriesModel.id; var seriesData = seriesModel.getData(); var areaGroupMap = this.markerGroupMap; var polygonGroup = areaGroupMap.get(seriesId) || areaGroupMap.set(seriesId, { group: new graphic.Group() }); this.group.add(polygonGroup.group); this.markKeep(polygonGroup); var areaData = createList(coordSys, seriesModel, maModel); // Line data for tooltip and formatter maModel.setData(areaData); // Update visual and layout of line areaData.each(function (idx) { // Layout var points = map(dimPermutations, function (dim) { return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); }); var xAxisScale = coordSys.getAxis('x').scale; var yAxisScale = coordSys.getAxis('y').scale; var xAxisExtent = xAxisScale.getExtent(); var yAxisExtent = yAxisScale.getExtent(); var xPointExtent = [xAxisScale.parse(areaData.get('x0', idx)), xAxisScale.parse(areaData.get('x1', idx))]; var yPointExtent = [yAxisScale.parse(areaData.get('y0', idx)), yAxisScale.parse(areaData.get('y1', idx))]; numberUtil.asc(xPointExtent); numberUtil.asc(yPointExtent); var overlapped = !(xAxisExtent[0] > xPointExtent[1] || xAxisExtent[1] < xPointExtent[0] || yAxisExtent[0] > yPointExtent[1] || yAxisExtent[1] < yPointExtent[0]); // If none of the area is inside coordSys, allClipped is set to be true // in layout so that label will not be displayed. See #12591 var allClipped = !overlapped; areaData.setItemLayout(idx, { points: points, allClipped: allClipped }); var style = areaData.getItemModel(idx).getModel('itemStyle').getItemStyle(); var color = getVisualFromData(seriesData, 'color'); if (!style.fill) { style.fill = color; if (isString(style.fill)) { style.fill = colorUtil.modifyAlpha(style.fill, 0.4); } } if (!style.stroke) { style.stroke = color; } // Visual areaData.setItemVisual(idx, 'style', style); }); areaData.diff(inner(polygonGroup).data).add(function (idx) { var layout = areaData.getItemLayout(idx); if (!layout.allClipped) { var polygon = new graphic.Polygon({ shape: { points: layout.points } }); areaData.setItemGraphicEl(idx, polygon); polygonGroup.group.add(polygon); } }).update(function (newIdx, oldIdx) { var polygon = inner(polygonGroup).data.getItemGraphicEl(oldIdx); var layout = areaData.getItemLayout(newIdx); if (!layout.allClipped) { if (polygon) { graphic.updateProps(polygon, { shape: { points: layout.points } }, maModel, newIdx); } else { polygon = new graphic.Polygon({ shape: { points: layout.points } }); } areaData.setItemGraphicEl(newIdx, polygon); polygonGroup.group.add(polygon); } else if (polygon) { polygonGroup.group.remove(polygon); } }).remove(function (idx) { var polygon = inner(polygonGroup).data.getItemGraphicEl(idx); polygonGroup.group.remove(polygon); }).execute(); areaData.eachItemGraphicEl(function (polygon, idx) { var itemModel = areaData.getItemModel(idx); var style = areaData.getItemVisual(idx, 'style'); polygon.useStyle(areaData.getItemVisual(idx, 'style')); setLabelStyle(polygon, getLabelStatesModels(itemModel), { labelFetcher: maModel, labelDataIndex: idx, defaultText: areaData.getName(idx) || '', inheritColor: isString(style.fill) ? colorUtil.modifyAlpha(style.fill, 1) : '#000' }); setStatesStylesFromModel(polygon, itemModel); toggleHoverEmphasis(polygon, null, null, itemModel.get(['emphasis', 'disabled'])); getECData(polygon).dataModel = maModel; }); inner(polygonGroup).data = areaData; polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent'); }; MarkAreaView.type = 'markArea'; return MarkAreaView; }(MarkerView); function createList(coordSys, seriesModel, maModel) { var areaData; var dataDims; var dims = ['x0', 'y0', 'x1', 'y1']; if (coordSys) { var coordDimsInfos_1 = map(coordSys && coordSys.dimensions, function (coordDim) { var data = seriesModel.getData(); var info = data.getDimensionInfo(data.mapDimension(coordDim)) || {}; // In map series data don't have lng and lat dimension. Fallback to same with coordSys return extend(extend({}, info), { name: coordDim, // DON'T use ordinalMeta to parse and collect ordinal. ordinalMeta: null }); }); dataDims = map(dims, function (dim, idx) { return { name: dim, type: coordDimsInfos_1[idx % 2].type }; }); areaData = new SeriesData(dataDims, maModel); } else { dataDims = [{ name: 'value', type: 'float' }]; areaData = new SeriesData(dataDims, maModel); } var optData = map(maModel.get('data'), curry(markAreaTransform, seriesModel, coordSys, maModel)); if (coordSys) { optData = filter(optData, curry(markAreaFilter, coordSys)); } var dimValueGetter = coordSys ? function (item, dimName, dataIndex, dimIndex) { // TODO should convert to ParsedValue? var rawVal = item.coord[Math.floor(dimIndex / 2)][dimIndex % 2]; return parseDataValue(rawVal, dataDims[dimIndex]); } : function (item, dimName, dataIndex, dimIndex) { return parseDataValue(item.value, dataDims[dimIndex]); }; areaData.initData(optData, null, dimValueGetter); areaData.hasItemOption = true; return areaData; } export default MarkAreaView;