2025-05-03 23:48:15 +08:00

1356 lines
45 KiB
TypeScript
Generated
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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 { createChart, getGraphicElements, getECModel } from '../../../core/utHelper';
// import { imageURI } from './setOptionImageURI';
import { EChartsType } from '../../../../../src/echarts';
import Element from 'zrender/src/Element';
import { EChartsOption } from '../../../../../src/export/option';
import {
GraphicComponentOption,
GraphicComponentImageOption
} from '../../../../../src/component/graphic/GraphicModel';
import Group from 'zrender/src/graphic/Group';
import { Dictionary } from 'zrender/src/core/types';
// eslint-disable-next-line max-len
const imageURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAADcCAYAAAAbWs+BAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4gIUARQAHY8+4wAAApBJREFUeNrt3cFqAjEUhlEjvv8rXzciiiBGk/He5JxdN2U649dY+KmnEwAAAAAv2uMXEeGOwERntwAEB4IDBAeCAwQHggPBAYIDwQGCA8GB4ADBgeAAwYHgAMGB4EBwgOCgpkuKq2it/r8Li2hbvGKqP6s/PycnHHv9YvSWEgQHCA4EBwgOBAeCAwQHggMEByXM+QRUE6D3suwuPafDn5MTDg50KXnVPSdxa54y/oYDwQGCA8EBggPBAYIDwYHggBE+X5rY3Y3Tey97Nn2eU+rnlGfaZa6Ft5SA4EBwgOBAcCA4QHAgOEBwIDjgZu60y1xrDPtIJxwgOBAcIDgQHAgOEBwIDhAcCA4EBwgOBAcIDgQHCA4EB4IDBAeCAwQHggPBAYIDwQGCA8GB4ADBgeAAwYHgAMGB4GADcz9y2McIgxMOBAeCAwQHggMEB4IDwQGCA8EBggPBATdP6+KIGPRdW7i1LCFi6ALfCQfeUoLgAMGB4ADBgeBAcIDgQHCA4CCdOVvK7quwveQgg7eRTjjwlhIQHAgOBAcIDgQHCA4EB4IDBAfl5dhSdl+17SX3F22rdLlOOBAcCA4QHAgOEBwIDgQHCA4EBwgO0qm5pez6Ce0uSym2jXTCgeAAwYHgQHCA4EBwgOBAcCA4QHBQ3vpbyu47Yns51OLbSCccCA4QHAgOBAcIDgQHCA4EB4ID5jDt+vkObjgFM9dywoHgAMGB4EBwgOBAcIDgQHAgOEBwsA5bysPveMLtpW2kEw4EBwgOBAcIDgQHggMEB4IDBAeCg33ZUqZ/Ql9sL20jnXCA4EBwIDhAcCA4QHAgOBAcIDgQHNOZai3DlhKccCA4QHAgOEBwIDgQHCA4AAAAAGA1VyxaWIohrgXFAAAAAElFTkSuQmCC';
// function loadImage(onload: (img: HTMLImageElement) => void) {
// const img = new window.Image();
// img.onload = function () {
// onload(img);
// };
// img.src = imageURI;
// }
// FIXME: TMEP use rect, would have used image.
// node-canvas will throw error when using data URI to zrender directly.
// Havn't dig it out why yet.
function tmpConvertImageOption(opt: GraphicComponentImageOption): object {
const outOpt = opt as Dictionary<unknown>;
outOpt.type = 'rect';
const style = opt.style || {};
delete style.image;
outOpt.shape = {
x: style.x || 0,
y: style.y || 0,
width: style.width || 0,
height: style.height || 0
};
return outOpt;
}
describe('graphic_setOption', function () {
const NUMBER_PRECISION = 6;
function propHasAll(els: Element[], propsObjList: object[]) {
for (let i = 0; i < propsObjList.length; i++) {
propHas(els[i], propsObjList[i]);
}
}
function propHas(target: object, propsObj: object): void {
if (target == null || propsObj == null) {
expect(false).toEqual(true);
}
expect(typeof target === 'object' && typeof propsObj === 'object').toEqual(true);
// propsObj can be array
if (propsObj instanceof Array) {
expect(target instanceof Array).toEqual(true);
for (let i = 0; i < propsObj.length; i++) {
each((target as Element[])[i], propsObj[i], i);
}
}
else {
for (const name in propsObj) {
if (propsObj.hasOwnProperty(name)) {
each((target as any)[name], (propsObj as any)[name], name);
}
}
}
function each(targetVal: unknown, propVal: unknown, keyInfo: string | number): void {
// console.log(targetVal, propVal, keyInfo);
if (propVal == null) {
expect(targetVal == null).toEqual(true);
}
// object or array
else if (typeof propVal === 'object') {
propHas(targetVal as object, propVal);
}
else if (typeof propVal === 'number') {
expect(typeof targetVal).toEqual('number');
expect((targetVal as number).toFixed(NUMBER_PRECISION)).toEqual(propVal.toFixed(NUMBER_PRECISION));
}
else {
expect(targetVal).toStrictEqual(propVal);
}
}
}
let chart: EChartsType;
beforeEach(function () {
chart = createChart();
});
afterEach(function () {
chart.dispose();
});
describe('option', function () {
it('optionFlatten', function () {
chart.setOption({
graphic: [
tmpConvertImageOption({
id: 'uriimg',
type: 'image',
name: 'nameuriimg',
originX: 20,
originY: 20,
left: 10,
top: 10,
style: {
image: imageURI,
width: 80,
height: 80,
opacity: 0.5
}
}),
{
type: 'group',
id: 'gr',
width: 230,
height: 110,
x: 70,
y: 90,
children: [
{
type: 'rect',
name: 'rectxx',
shape: {
width: 230,
height: 80
},
style: {
stroke: 'red',
fill: 'transparent',
lineWidth: 2
},
z: 100
},
{
id: 'grouptext',
type: 'text',
bottom: 0,
right: 0,
rotation: 0.5,
style: {
text: 'aaa'
},
z: 100
}
]
},
{
type: 'text',
bottom: 0,
left: 'center',
style: {
text: 'bbb'
},
z: 100
}
]
});
// Set option using getOption
const option = chart.getOption();
const graphicOptionList = option.graphic as GraphicComponentOption[];
expect(graphicOptionList.length === 1).toEqual(true);
const optionElements = graphicOptionList[0].elements;
expect(optionElements && optionElements.length === 5).toEqual(true);
expect(optionElements[0].id === 'uriimg' && optionElements[0].parentId == null).toEqual(true);
expect(optionElements[1].id === 'gr' && optionElements[1].parentId == null).toEqual(true);
expect(optionElements[2].name === 'rectxx' && optionElements[2].parentId === 'gr').toEqual(true);
expect((optionElements[3] as any).style.text === 'aaa' && optionElements[3].parentId === 'gr')
.toEqual(true);
expect((optionElements[4] as any).style.text === 'bbb' && optionElements[4].parentId == null)
.toEqual(true);
});
it('groupSetOptionGetOption', function () {
chart.setOption({
graphic: [
tmpConvertImageOption({
id: 'uriimg',
type: 'image',
name: 'nameuriimg',
originX: 20,
originY: 20,
left: 10,
top: 10,
style: {
image: imageURI,
width: 80,
height: 80,
opacity: 0.5
}
}),
{
type: 'group',
id: 'gr',
width: 230,
height: 110,
x: 70,
y: 90,
children: [
{
type: 'rect',
name: 'rectxx',
shape: {
width: 230,
height: 80
},
style: {
stroke: 'red',
fill: 'transparent',
lineWidth: 2
},
z: 100
},
{
id: 'grouptext',
type: 'text',
bottom: 0,
right: 0,
rotation: 0.5,
style: {
text: 'aaa'
},
z: 100
}
]
},
{
type: 'text',
bottom: 0,
left: 'center',
style: {
text: 'bbb'
},
z: 100
}
]
});
checkExistsAndRelations();
// Set option using getOption
chart.setOption(chart.getOption());
// Check again, should be the same as before.
checkExistsAndRelations();
function checkExistsAndRelations() {
const els = getGraphicElements(chart, 'graphic');
expect(els.length === 6).toEqual(true);
expect(els[0].type === 'group').toEqual(true);
expect(els[1].name === 'nameuriimg').toEqual(true);
expect(els[2].type === 'group').toEqual(true);
const groupEls = getGraphicElements(els[2] as Group, 'graphic');
expect(groupEls.length === 2).toEqual(true);
expect(groupEls[0] === els[3]).toEqual(true);
expect(groupEls[1] === els[4]).toEqual(true);
expect(els[3].name === 'rectxx').toEqual(true);
expect((els[4] as any).style.text === 'aaa').toEqual(true);
expect((els[5] as any).style.text === 'bbb').toEqual(true);
}
});
it('onlyOneGraphicComponentAvailable', function () {
chart.setOption({
graphic: [
{
elements: [
{
type: 'circle',
shape: {
cx: 50,
cy: 50,
r: 20
}
},
{
type: 'circle',
shape: {
cx: 150,
cy: 150,
r: 20
}
}
]
},
{
elements: [
{
type: 'circle',
shape: {
cx: 100,
cy: 100,
r: 20
}
}
]
}
]
});
expect(!!getECModel(chart).getComponent('graphic')).toEqual(true);
expect(getECModel(chart).getComponent('graphic', 1) == null).toEqual(true);
});
it('replace', function () {
chart.setOption({
graphic: {
type: 'circle',
name: 'a',
shape: {
cx: 50,
cy: 50,
r: 20
},
style: {
fill: 'green',
stroke: 'pink',
lineWidth: 3
}
}
});
let els: Element[];
els = getGraphicElements(chart, 'graphic');
expect(els.length === 2).toEqual(true);
expect(els[0].type === 'group').toEqual(true);
expect(els[1].name === 'a' && els[1].type === 'circle').toEqual(true);
chart.setOption({
graphic: {
type: 'rect',
$action: 'replace',
name: 'b',
shape: {
x: 50,
y: 50,
width: 20,
height: 60
},
style: {
fill: 'green',
stroke: 'pink',
lineWidth: 3
}
}
});
els = getGraphicElements(chart, 'graphic');
expect(els.length === 2).toEqual(true);
expect(els[0].type === 'group').toEqual(true);
expect(els[1].name === 'b' && els[1].type === 'rect').toEqual(true);
expect((els[1] as any).shape && (els[1] as any).shape.width === 20).toEqual(true);
});
function getDeleteSourceOption() {
return {
graphic: [
{
type: 'text',
name: 'textname',
style: {
text: 'asdf哈呵',
font: '40px sans-serif',
x: 100,
y: 40
}
},
{
id: 'rrr',
name: 'ringname',
type: 'ring',
shape: {
cx: 50,
cy: 150,
r: 20,
r0: 5
}
},
{
id: 'xxx',
name: 'rectname',
type: 'rect',
shape: {
x: 250,
y: 50,
width: 20,
height: 80
}
}
]
};
}
function checkDeteteSource(chart: EChartsType) {
const els = getGraphicElements(chart, 'graphic');
expect(els.length === 4);
expect(els[1].type === 'text' && els[1].name === 'textname').toEqual(true);
expect(els[2].type === 'ring' && els[2].name === 'ringname').toEqual(true);
expect(els[3].type === 'rect' && els[3].name === 'rectname').toEqual(true);
}
it('deleteBy$action', function () {
chart.setOption(getDeleteSourceOption());
checkDeteteSource(chart);
chart.setOption({
graphic: {
id: 'rrr',
$action: 'remove'
}
});
const els = getGraphicElements(chart, 'graphic');
expect(els.length === 3);
expect(els[1].type === 'text' && els[1].name === 'textname').toEqual(true);
expect(els[2].type === 'rect' && els[2].name === 'rectname').toEqual(true);
});
it('deleteBySetOptionNotMerge', function () {
chart.setOption(getDeleteSourceOption());
checkDeteteSource(chart);
chart.setOption({
graphic: {
type: 'rect',
name: 'rectname2',
shape: {
y: 100,
x: 250,
width: 40,
height: 140
},
style: {
fill: 'blue'
}
}
}, true);
const els = getGraphicElements(chart, 'graphic');
expect(els.length === 2);
expect(els[1].type === 'rect' && els[1].name === 'rectname2').toEqual(true);
});
it('deleteByClear', function () {
chart.setOption(getDeleteSourceOption());
checkDeteteSource(chart);
chart.clear();
const els = getGraphicElements(chart, 'graphic');
expect(els.length === 0);
});
function checkMergeElements(chart: EChartsType, merged: boolean): void {
const makeIdentityTransformProps = () => ({
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: 0
});
propHasAll(getGraphicElements(chart, 'graphic'), [
{
...makeIdentityTransformProps()
},
{
...makeIdentityTransformProps(),
style: {},
shape: {
x: !merged ? 250 : 350,
y: 50,
width: 20,
height: 80
// r: 0
}
},
{
...makeIdentityTransformProps()
},
{
...makeIdentityTransformProps(),
style: {
fill: !merged ? 'yellow' : 'pink'
},
shape: {
x: 30,
y: 30,
width: 10,
height: 20
// r: 0
}
},
{
...makeIdentityTransformProps(),
style: !merged
? {}
: {
fill: 'green'
},
shape: {
cx: !merged ? 50 : 150,
cy: 150,
r: 20,
r0: 5
}
}
]);
}
it('mergeTroughFlatForamt', function () {
chart.setOption({
graphic: [
{
type: 'rect',
shape: {
x: 250,
y: 50,
width: 20,
height: 80
}
},
{
type: 'group',
children: [
{
id: 'ing',
type: 'rect',
shape: {
x: 30,
y: 30,
width: 10,
height: 20
},
style: {
fill: 'yellow'
}
}
]
},
{
id: 'rrr',
type: 'ring',
shape: {
cx: 50,
cy: 150,
r: 20,
r0: 5
}
}
]
});
checkMergeElements(chart, false);
chart.setOption({
graphic: [
{
shape: {
x: 350
}
},
{
id: 'rrr',
shape: {
cx: 150
},
style: {
fill: 'green'
}
},
// flat mode
{
id: 'ing',
style: {
fill: 'pink'
}
}
]
});
checkMergeElements(chart, true);
});
});
describe('groupLRTB', function () {
function getOption() {
return {
graphic: [
{
type: 'text',
bottom: 0,
right: 0,
rotation: Math.PI / 4,
style: {
font: '24px Microsoft YaHei',
text: '全屏右下角'
},
z: 100
},
tmpConvertImageOption({
id: 'uriimg',
type: 'image',
originX: 20,
originY: 20,
left: 10,
top: 10,
style: {
image: imageURI,
width: 80,
height: 80,
opacity: 0.5
}
}),
{
type: 'group',
id: 'gr',
width: 230,
height: 110,
x: 70,
y: 90,
children: [
{
type: 'rect',
shape: {
width: 230,
height: 80
},
style: {
stroke: 'red',
fill: 'transparent',
lineWidth: 2
},
z: 100
},
{
type: 'rect',
shape: {
width: 60,
height: 110
},
style: {
stroke: 'red',
fill: 'transparent',
lineWidth: 2
},
z: 100
},
{
id: 'grouptext',
type: 'text',
bottom: 0,
right: 0,
rotation: 0.5,
style: {
font: '14px Microsoft YaHei',
text: 'group最右下角'
},
z: 100
}
]
},
{
type: 'text',
bottom: 0,
left: 'center',
style: {
font: '18px sans-serif',
text: '全屏最下中间\n这是多行文字\n这是第三行'
},
z: 100
}
]
};
}
function checkLocations(chart: EChartsType, uriimgChanged?: boolean) {
propHasAll(getGraphicElements(chart, 'graphic'), [
{
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: 0
},
{/* FIXME: node-canvas measure issue casue behavior different from browser. comment out it temporarily.
x: 98.17662350913716,
y: 133.02943725152284,
scaleX: 1,
scaleY: 1,
rotation: 0.7853981633974483,
style: {
font: '24px Microsoft YaHei',
text: '全屏右下角',
textVerticalAlign: null,
verticalAlign: null
}
*/},
!uriimgChanged
? tmpConvertImageOption({
x: 10,
y: 10,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
height: 80,
opacity: 0.5,
width: 80,
image: imageURI
}
})
: tmpConvertImageOption({
x: 61,
y: 45,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
height: 60,
opacity: 0.5,
width: 78,
image: imageURI
}
}),
{
x: 70,
y: 90,
scaleX: 1,
scaleY: 1,
rotation: 0
},
{
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
stroke: 'red',
fill: 'transparent',
lineWidth: 2
},
shape: {
width: 230,
height: 80,
x: 0,
y: 0
// r: 0,
}
},
{
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
stroke: 'red',
fill: 'transparent',
lineWidth: 2
},
shape: {
width: 60,
height: 110,
x: 0,
y: 0
// r: 0,
}
},
{/* FIXME: node-canvas measure issue casue behavior different from browser. comment out it temporarily.
x: 145.47972137162424,
y: 97.71384413353478,
scaleX: 1,
scaleY: 1,
rotation: 0.5,
style: {
font: '14px Microsoft YaHei',
text: 'group最右下角',
textVerticalAlign: null,
verticalAlign: null
}
*/},
{/* FIXME: node-canvas measure issue casue behavior different from browser. comment out it temporarily.
x: 46,
y: 96,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
font: '18px sans-serif',
text: '全屏最下中间\n这是多行文字\n这是第三行',
textVerticalAlign: null,
verticalAlign: null
}
*/}
]);
}
function checkResizedLocations(chart: EChartsType) {
propHasAll(getGraphicElements(chart, 'graphic'), [
{
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: 0
},
{/* FIXME: node-canvas measure issue casue behavior different from browser. comment out it temporarily.
x: 98.17662350913716,
y: 133.02943725152286,
scaleX: 1,
scaleY: 1,
rotation: 0.7853981633974483,
style: {
font: '24px Microsoft YaHei',
text: '全屏右下角',
textVerticalAlign: null,
verticalAlign: null
}
*/},
tmpConvertImageOption({
x: 10,
y: 10,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
image: imageURI,
width: 80,
height: 80,
opacity: 0.5
}
}),
{
x: 70,
y: 90,
scaleX: 1,
scaleY: 1,
rotation: 0
},
{
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
stroke: 'red',
fill: 'transparent',
lineWidth: 2
},
shape: {
width: 230,
height: 80,
x: 0,
y: 0
// r: 0,
}
},
{
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
stroke: 'red',
fill: 'transparent',
lineWidth: 2
},
shape: {
width: 60,
height: 110,
x: 0,
y: 0
// r: 0,
}
},
{/* FIXME: node-canvas measure issue casue behavior different from browser. comment out it temporarily.
x: 145.47972137162424,
y: 97.71384413353478,
scaleX: 1,
scaleY: 1,
rotation: 0.5,
style: {
font: '14px Microsoft YaHei',
text: 'group最右下角',
textVerticalAlign: null,
verticalAlign: null
}
*/},
{/* FIXME: node-canvas measure issue casue behavior different from browser. comment out it temporarily.
x: 46,
y: 96,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
font: '18px sans-serif',
text: '全屏最下中间\n这是多行文字\n这是第三行',
textVerticalAlign: null,
verticalAlign: null
}
*/}
]);
}
it('getAndGet', function () {
const myChart = createChart({
width: 200,
height: 150
});
myChart.setOption(getOption());
checkLocations(myChart);
// Set option using getOption
chart.setOption(myChart.getOption());
// Check again, should be the same as before.
checkLocations(myChart);
myChart.dispose();
});
// Test modify location by setOption.
// And test center and middle.
it('modifyAndCenter', function () {
const myChart = createChart({
width: 200,
height: 150
});
myChart.setOption(getOption());
checkLocations(myChart);
myChart.setOption({
graphic: [tmpConvertImageOption({
id: 'uriimg',
left: 'center',
top: 'middle',
style: {
width: 78,
height: 60
}
})]
});
checkLocations(myChart, true);
myChart.dispose();
});
it('resize', function () {
const myChart = createChart({
width: 200,
height: 150
});
myChart.setOption(getOption());
checkLocations(myChart);
myChart.resize({
width: 220,
height: 300
});
checkResizedLocations(myChart);
myChart.dispose();
});
});
describe('boundingAndRotation', function () {
function getOption(): EChartsOption {
return {
legend: {
data: ['高度(km)与气温(°C)变化关系']
},
xAxis: {
},
yAxis: {
type: 'category',
data: ['0', '10', '20', '30', '40', '50', '60', '70', '80']
},
graphic: [
tmpConvertImageOption({
type: 'image',
id: 'img',
z: -10,
right: 0,
top: 0,
bounding: 'raw',
originX: 75,
originY: 75,
style: {
fill: '#000',
image: imageURI,
width: 150,
height: 150,
opacity: 0.4
} as any
}),
{
type: 'group',
id: 'rectgroup1',
bottom: 0,
right: 0,
bounding: 'raw',
children: [
{
type: 'rect',
left: 'center',
top: 'center',
shape: {
width: 20,
height: 80
},
style: {
stroke: 'green',
fill: 'transparent'
}
},
{
type: 'rect',
left: 'center',
top: 'center',
shape: {
width: 80,
height: 20
},
style: {
stroke: 'green',
fill: 'transparent'
}
}
]
},
{
type: 'rect',
id: 'rect2',
bottom: 0,
right: 'center',
shape: {
width: 50,
height: 80
},
style: {
stroke: 'green',
fill: 'transparent'
}
},
{
type: 'group',
id: 'textGroup1',
left: '10%',
top: 'center',
scaleX: 1,
scaleY: 0.5,
children: [
{
type: 'rect',
z: 100,
left: 'center',
top: 'center',
shape: {
width: 170,
height: 70
},
style: {
fill: '#fff',
stroke: '#999',
lineWidth: 2,
shadowBlur: 8,
shadowOffsetX: 3,
shadowOffsetY: 3,
shadowColor: 'rgba(0,0,0,0.3)'
}
},
{
type: 'text',
z: 100,
top: 'middle',
left: 'center',
style: {
text: [
'横轴表示温度单位是°C',
'纵轴表示高度单位是km',
'右上角有一个图片做的水印'
].join('\n'),
font: '12px Microsoft YaHei'
}
}
]
}
],
series: [
{
name: '高度(km)与气温(°C)变化关系',
type: 'line',
data: [15, -50, -56.5, -46.5, -22.1, -2.5, -27.7, -55.7, -76.5]
}
]
};
}
function checkLocations(chart: EChartsType, rotated?: boolean) {
propHasAll(getGraphicElements(chart, 'graphic'), [
{
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: 0
},
tmpConvertImageOption({
x: 350,
y: 0,
scaleX: 1,
scaleY: 1,
rotation: !rotated ? 0 : 0.6283185307179586,
style: {
// fill: '#000',
image: imageURI,
width: 150,
height: 150,
opacity: 0.4
}
}),
{
x: 500,
y: 400,
scaleX: 1,
scaleY: 1,
rotation: !rotated ? 0 : 0.6283185307179586
},
{
x: -10,
y: -40,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
stroke: 'green',
fill: 'transparent'
},
shape: {
width: 20,
height: 80,
x: 0,
y: 0
// r: 0,
}
},
{
x: -40,
y: -10,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
stroke: 'green',
fill: 'transparent'
},
shape: {
width: 80,
height: 20,
x: 0,
y: 0
// r: 0,
}
},
{
x: !rotated ? 225 : 206.2631650489274,
y: !rotated ? 319.5 : 334.5802393266705,
scaleX: 1,
scaleY: 1,
rotation: !rotated ? 0 : 0.6283185307179586,
style: {
stroke: 'green',
fill: 'transparent'
},
shape: {
width: 50,
height: 80,
x: 0,
y: 0
// r: 0,
}
},
{
x: !rotated ? 136 : 130.15559605751,
y: 200,
scaleX: 1,
scaleY: 0.5,
rotation: !rotated ? 0 : 0.6283185307179586
},
{
x: -85,
y: -35,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
fill: '#fff',
stroke: '#999',
lineWidth: 2,
shadowBlur: 8,
shadowOffsetX: 3,
shadowOffsetY: 3,
shadowColor: 'rgba(0,0,0,0.3)'
},
shape: {
width: 170,
height: 70,
x: 0,
y: 0
// r: 0,
}
},
{/* FIXME: node-canvas measure issue casue behavior different from browser. comment out it temporarily.
x: -72,
y: -18,
scaleX: 1,
scaleY: 1,
rotation: 0,
style: {
text: '横轴表示温度单位是°C\n纵轴表示高度单位是km\n右上角有一个图片做的水印',
font: '12px Microsoft YaHei',
textVerticalAlign: null,
verticalAlign: null
}
*/}
]);
}
it('bounding', function () {
chart.setOption(getOption());
checkLocations(chart);
// Set option using getOption
chart.setOption(chart.getOption());
// Check again, should be the same as before.
checkLocations(chart);
const rotation = Math.PI / 5;
chart.setOption({
graphic: [{
id: 'img',
bounding: 'raw',
originX: 75,
originY: 75,
rotation: rotation
} as any, {
id: 'rectgroup1',
rotation: rotation
}, {
id: 'rect2',
rotation: rotation
}, {
id: 'textGroup1',
rotation: rotation
}]
});
checkLocations(chart, true);
});
});
});