UNPKG

9.92 kBJavaScriptView Raw
1import { each, isArray } from '@antv/util';
2import { catmullRom2bezier, getLinePath } from '../../geometry/shape/util/path';
3import { toPoints } from '../../util/bbox';
4import { isPolygonsIntersect } from '@antv/path-util';
5function getMaskBBox(context, tolerance) {
6 var event = context.event;
7 var maskShape = event.target;
8 var maskBBox = maskShape.getCanvasBBox();
9 // 如果 bbox 过小则不返回
10 if (!(maskBBox.width >= tolerance || maskBBox.height >= tolerance)) {
11 return null;
12 }
13 return maskBBox;
14}
15function getMaskPath(context, tolerance) {
16 var event = context.event;
17 var maskShape = event.target;
18 var maskBBox = maskShape.getCanvasBBox();
19 // 如果 bbox 过小则不返回
20 if (!(maskBBox.width >= tolerance || maskBBox.height >= tolerance)) {
21 return null;
22 }
23 return maskShape.attr('path');
24}
25/**
26 * 获取当前事件相关的图表元素
27 * @param context 交互的上下文
28 * @ignore
29 */
30export function getCurrentElement(context) {
31 var event = context.event;
32 var element;
33 var target = event.target;
34 if (target) {
35 element = target.get('element');
36 }
37 return element;
38}
39/**
40 * 获取委托对象
41 * @param context 上下文
42 * @ignore
43 */
44export function getDelegationObject(context) {
45 var event = context.event;
46 var target = event.target;
47 var delegateObject;
48 if (target) {
49 delegateObject = target.get('delegateObject');
50 }
51 return delegateObject;
52}
53export function isElementChange(context) {
54 var event = context.event.gEvent;
55 // 在同一个 element 内部移动,label 和 shape 之间
56 if (event && event.fromShape && event.toShape && event.fromShape.get('element') === event.toShape.get('element')) {
57 return false;
58 }
59 return true;
60}
61/**
62 * 是否是列表组件
63 * @param delegateObject 委托对象
64 * @ignore
65 */
66export function isList(delegateObject) {
67 return delegateObject && delegateObject.component && delegateObject.component.isList();
68}
69/**
70 * 是否是滑块组件
71 * @param delegateObject 委托对象
72 * @ignore
73 */
74export function isSlider(delegateObject) {
75 return delegateObject && delegateObject.component && delegateObject.component.isSlider();
76}
77/**
78 * 是否由 mask 触发
79 * @param context 上下文
80 * @ignore
81 */
82export function isMask(context) {
83 var event = context.event;
84 var target = event.target;
85 return target && target.get('name') === 'mask';
86}
87/**
88 * 获取被遮挡的 elements
89 * @param context 上下文
90 * @ignore
91 */
92export function getMaskedElements(context, tolerance) {
93 var target = context.event.target;
94 if (target.get('type') === 'path') {
95 var maskPath = getMaskPath(context, tolerance);
96 if (!maskPath) {
97 return;
98 }
99 return getElementsByPath(context.view, maskPath);
100 }
101 var maskBBox = getMaskBBox(context, tolerance);
102 // 如果 bbox 过小则不返回
103 if (!maskBBox) {
104 return null;
105 }
106 return getIntersectElements(context.view, maskBBox);
107}
108/**
109 * @ignore
110 */
111export function getSiblingMaskElements(context, sibling, tolerance) {
112 var maskBBox = getMaskBBox(context, tolerance);
113 // 如果 bbox 过小则不返回
114 if (!maskBBox) {
115 return null;
116 }
117 var view = context.view;
118 var start = getSiblingPoint(view, sibling, { x: maskBBox.x, y: maskBBox.y });
119 var end = getSiblingPoint(view, sibling, { x: maskBBox.maxX, y: maskBBox.maxY });
120 var box = {
121 minX: start.x,
122 minY: start.y,
123 maxX: end.x,
124 maxY: end.y,
125 };
126 return getIntersectElements(sibling, box);
127}
128/**
129 * 获取所有的图表元素
130 * @param view View/Chart
131 * @ignore
132 */
133export function getElements(view) {
134 var geometries = view.geometries;
135 var rst = [];
136 each(geometries, function (geom) {
137 var elements = geom.elements;
138 rst = rst.concat(elements);
139 });
140 if (view.views && view.views.length) {
141 each(view.views, function (subView) {
142 rst = rst.concat(getElements(subView));
143 });
144 }
145 return rst;
146}
147/**
148 * 获取所有的图表元素
149 * @param view View/Chart
150 * @param field 字段名
151 * @param value 字段值
152 * @ignore
153 */
154export function getElementsByField(view, field, value) {
155 var elements = getElements(view);
156 return elements.filter(function (el) {
157 return getElementValue(el, field) === value;
158 });
159}
160/**
161 * 根据状态名获取图表元素
162 * @param view View/Chart
163 * @param stateName 状态名
164 * @ignore
165 */
166export function getElementsByState(view, stateName) {
167 var geometries = view.geometries;
168 var rst = [];
169 each(geometries, function (geom) {
170 var elements = geom.getElementsBy(function (el) { return el.hasState(stateName); });
171 rst = rst.concat(elements);
172 });
173 return rst;
174}
175/**
176 * 获取图表元素对应字段的值
177 * @param element 图表元素
178 * @param field 字段名
179 * @ignore
180 */
181export function getElementValue(element, field) {
182 var model = element.getModel();
183 var record = model.data;
184 var value;
185 if (isArray(record)) {
186 value = record[0][field];
187 }
188 else {
189 value = record[field];
190 }
191 return value;
192}
193/**
194 * 两个包围盒是否相交
195 * @param box1 包围盒1
196 * @param box2 包围盒2
197 * @ignore
198 */
199export function intersectRect(box1, box2) {
200 return !(box2.minX > box1.maxX || box2.maxX < box1.minX || box2.minY > box1.maxY || box2.maxY < box1.minY);
201}
202/**
203 * 获取包围盒内的图表元素
204 * @param view View/Chart
205 * @param box 包围盒
206 * @ignore
207 */
208export function getIntersectElements(view, box) {
209 var elements = getElements(view);
210 var rst = [];
211 each(elements, function (el) {
212 var shape = el.shape;
213 var shapeBBox = shape.getCanvasBBox();
214 if (intersectRect(box, shapeBBox)) {
215 rst.push(el);
216 }
217 });
218 return rst;
219}
220function pathToPoints(path) {
221 var points = [];
222 each(path, function (seg) {
223 var command = seg[0];
224 if (command !== 'A') {
225 for (var i = 1; i < seg.length; i = i + 2) {
226 points.push([seg[i], seg[i + 1]]);
227 }
228 }
229 else {
230 var length_1 = seg.length;
231 points.push([seg[length_1 - 2], seg[length_1 - 1]]);
232 }
233 });
234 return points;
235}
236/**
237 * 获取包围盒内的图表元素
238 * @param view View/Chart
239 * @param path 路径
240 * @ignore
241 */
242export function getElementsByPath(view, path) {
243 var elements = getElements(view);
244 var points = pathToPoints(path);
245 var rst = elements.filter(function (el) {
246 var shape = el.shape;
247 var shapePoints;
248 if (shape.get('type') === 'path') {
249 shapePoints = pathToPoints(shape.attr('path'));
250 }
251 else {
252 var shapeBBox = shape.getCanvasBBox();
253 shapePoints = toPoints(shapeBBox);
254 }
255 return isPolygonsIntersect(points, shapePoints);
256 });
257 return rst;
258}
259/**
260 * 获取当前 View 的所有组件
261 * @param view View/Chart
262 * @ignore
263 */
264export function getComponents(view) {
265 return view.getComponents().map(function (co) { return co.component; });
266}
267/** @ignore */
268export function distance(p1, p2) {
269 var dx = p2.x - p1.x;
270 var dy = p2.y - p1.y;
271 return Math.sqrt(dx * dx + dy * dy);
272}
273/** @ignore */
274export function getSpline(points, z) {
275 if (points.length <= 2) {
276 return getLinePath(points, false);
277 }
278 var first = points[0];
279 var arr = [];
280 each(points, function (point) {
281 arr.push(point.x);
282 arr.push(point.y);
283 });
284 var path = catmullRom2bezier(arr, z, null);
285 path.unshift(['M', first.x, first.y]);
286 return path;
287}
288/**
289 * 检测点是否在包围盒内
290 * @param box 包围盒
291 * @param point 点
292 * @ignore
293 */
294export function isInBox(box, point) {
295 return box.x <= point.x && box.maxX >= point.x && box.y <= point.y && box.maxY > point.y;
296}
297/**
298 * 获取同 view 同一级的 views
299 * @param view 当前 view
300 * @returns 同一级的 views
301 * @ignore
302 */
303export function getSilbings(view) {
304 var parent = view.parent;
305 var siblings = null;
306 if (parent) {
307 siblings = parent.views.filter(function (sub) { return sub !== view; });
308 }
309 return siblings;
310}
311function point2Normalize(view, point) {
312 var coord = view.getCoordinate();
313 return coord.invert(point);
314}
315/**
316 * 将 view 上的一点转换成另一个 view 的点
317 * @param view 当前的 view
318 * @param sibling 同一层级的 view
319 * @param point 指定点
320 * @ignore
321 */
322export function getSiblingPoint(view, sibling, point) {
323 var normalPoint = point2Normalize(view, point);
324 return sibling.getCoordinate().convert(normalPoint);
325}
326/**
327 * 是否在记录中,临时因为所有的 view 中的数据不是引用,而使用的方法
328 * 不同 view 上对数据的引用不相等,导致无法直接用 includes
329 * 假设 x, y 值相等时是同一条数据,这个假设不完全正确,而改成 isEqual 则成本太高
330 * 后面改成同一个引用时可以修改回来
331 * @param records
332 * @param record
333 * @param xFiled
334 * @param yField
335 * @returns
336 * @ignore
337 */
338export function isInRecords(records, record, xFiled, yField) {
339 var isIn = false;
340 each(records, function (r) {
341 if (r[xFiled] === record[xFiled] && r[yField] === record[yField]) {
342 isIn = true;
343 return false;
344 }
345 });
346 return isIn;
347}
348// 级联获取 field 对应的 scale,如果 view 上没有,遍历子 view
349export function getScaleByField(view, field) {
350 var scale = view.getScaleByField(field);
351 if (!scale && view.views) {
352 each(view.views, function (subView) {
353 scale = getScaleByField(subView, field);
354 if (scale) {
355 return false; // 终止循环
356 }
357 });
358 }
359 return scale;
360}
361//# sourceMappingURL=util.js.map
\No newline at end of file