|  | /* | 
|  | * 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 * as zrUtil from 'zrender/src/core/util'; | 
|  | import AxisBuilder from './AxisBuilder'; | 
|  | import * as graphic from '../../util/graphic'; | 
|  | import * as singleAxisHelper from '../../coord/single/singleAxisHelper'; | 
|  | import AxisView from './AxisView'; | 
|  | import {rectCoordAxisBuildSplitArea, rectCoordAxisHandleRemove} from './axisSplitHelper'; | 
|  | import SingleAxisModel from '../../coord/single/AxisModel'; | 
|  | import GlobalModel from '../../model/Global'; | 
|  | import ExtensionAPI from '../../core/ExtensionAPI'; | 
|  | import { Payload } from '../../util/types'; | 
|  |  | 
|  | const axisBuilderAttrs = [ | 
|  | 'axisLine', 'axisTickLabel', 'axisName' | 
|  | ] as const; | 
|  |  | 
|  | const selfBuilderAttrs = ['splitArea', 'splitLine'] as const; | 
|  |  | 
|  | class SingleAxisView extends AxisView { | 
|  |  | 
|  | static readonly type = 'singleAxis'; | 
|  | readonly type = SingleAxisView.type; | 
|  |  | 
|  | private _axisGroup: graphic.Group; | 
|  |  | 
|  | axisPointerClass = 'SingleAxisPointer'; | 
|  |  | 
|  | render(axisModel: SingleAxisModel, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload) { | 
|  |  | 
|  | const group = this.group; | 
|  |  | 
|  | group.removeAll(); | 
|  |  | 
|  | const oldAxisGroup = this._axisGroup; | 
|  | this._axisGroup = new graphic.Group(); | 
|  |  | 
|  | const layout = singleAxisHelper.layout(axisModel); | 
|  |  | 
|  | const axisBuilder = new AxisBuilder(axisModel, layout); | 
|  |  | 
|  | zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder); | 
|  |  | 
|  | group.add(this._axisGroup); | 
|  | group.add(axisBuilder.getGroup()); | 
|  |  | 
|  | zrUtil.each(selfBuilderAttrs, function (name) { | 
|  | if (axisModel.get([name, 'show'])) { | 
|  | axisElementBuilders[name](this, this.group, this._axisGroup, axisModel); | 
|  | } | 
|  | }, this); | 
|  |  | 
|  | graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel); | 
|  |  | 
|  | super.render(axisModel, ecModel, api, payload); | 
|  | } | 
|  |  | 
|  | remove() { | 
|  | rectCoordAxisHandleRemove(this); | 
|  | } | 
|  | } | 
|  |  | 
|  | interface AxisElementBuilder { | 
|  | (axisView: SingleAxisView, group: graphic.Group, axisGroup: graphic.Group, axisModel: SingleAxisModel): void | 
|  | } | 
|  |  | 
|  | const axisElementBuilders: Record<typeof selfBuilderAttrs[number], AxisElementBuilder> = { | 
|  |  | 
|  | splitLine(axisView, group, axisGroup, axisModel) { | 
|  | const axis = axisModel.axis; | 
|  |  | 
|  | if (axis.scale.isBlank()) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | const splitLineModel = axisModel.getModel('splitLine'); | 
|  | const lineStyleModel = splitLineModel.getModel('lineStyle'); | 
|  | let lineColors = lineStyleModel.get('color'); | 
|  | lineColors = lineColors instanceof Array ? lineColors : [lineColors]; | 
|  | const lineWidth = lineStyleModel.get('width'); | 
|  |  | 
|  | const gridRect = axisModel.coordinateSystem.getRect(); | 
|  | const isHorizontal = axis.isHorizontal(); | 
|  |  | 
|  | const splitLines: graphic.Line[][] = []; | 
|  | let lineCount = 0; | 
|  |  | 
|  | const ticksCoords = axis.getTicksCoords({ | 
|  | tickModel: splitLineModel | 
|  | }); | 
|  |  | 
|  | const p1 = []; | 
|  | const p2 = []; | 
|  |  | 
|  | for (let i = 0; i < ticksCoords.length; ++i) { | 
|  | const tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); | 
|  | if (isHorizontal) { | 
|  | p1[0] = tickCoord; | 
|  | p1[1] = gridRect.y; | 
|  | p2[0] = tickCoord; | 
|  | p2[1] = gridRect.y + gridRect.height; | 
|  | } | 
|  | else { | 
|  | p1[0] = gridRect.x; | 
|  | p1[1] = tickCoord; | 
|  | p2[0] = gridRect.x + gridRect.width; | 
|  | p2[1] = tickCoord; | 
|  | } | 
|  |  | 
|  | const line = new graphic.Line({ | 
|  | shape: { | 
|  | x1: p1[0], | 
|  | y1: p1[1], | 
|  | x2: p2[0], | 
|  | y2: p2[1] | 
|  | }, | 
|  | silent: true | 
|  | }); | 
|  | graphic.subPixelOptimizeLine(line.shape, lineWidth); | 
|  |  | 
|  | const colorIndex = (lineCount++) % lineColors.length; | 
|  | splitLines[colorIndex] = splitLines[colorIndex] || []; | 
|  | splitLines[colorIndex].push(line); | 
|  | } | 
|  |  | 
|  | const lineStyle = lineStyleModel.getLineStyle(['color']); | 
|  | for (let i = 0; i < splitLines.length; ++i) { | 
|  | group.add(graphic.mergePath(splitLines[i], { | 
|  | style: zrUtil.defaults({ | 
|  | stroke: lineColors[i % lineColors.length] | 
|  | }, lineStyle), | 
|  | silent: true | 
|  | })); | 
|  | } | 
|  | }, | 
|  |  | 
|  | splitArea(axisView, group, axisGroup, axisModel) { | 
|  | rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel); | 
|  | } | 
|  | }; | 
|  |  | 
|  | export default SingleAxisView; |